fixed crash bug in relexing
parent
a6033b8418
commit
8ea91269cd
16
4ed.cpp
16
4ed.cpp
|
@ -1689,6 +1689,9 @@ App_Step_Sig(app_step){
|
|||
Partition *part = &models->mem.part;
|
||||
Temp_Memory temp = begin_temp_memory(part);
|
||||
char *buffer = push_array(part, char, buffer_size);
|
||||
i32 unmark_top = 0;
|
||||
i32 unmark_max = (8 << 10);
|
||||
Editing_File **unmark = (Editing_File**)push_array(part, Editing_File*, unmark_max);
|
||||
|
||||
Working_Set *working_set = &models->working_set;
|
||||
|
||||
|
@ -1702,13 +1705,22 @@ App_Step_Sig(app_step){
|
|||
if (file->state.ignore_behind_os == 0){
|
||||
file_mark_behind_os(file);
|
||||
}
|
||||
else{
|
||||
file->state.ignore_behind_os = 0;
|
||||
else if (file->state.ignore_behind_os == 1){
|
||||
// TODO(allen): I need the ability to put a file back on the list
|
||||
if (unmark_top == unmark_max){
|
||||
break;
|
||||
}
|
||||
file->state.ignore_behind_os = 2;
|
||||
unmark[unmark_top++] = file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i32 i = 0; i < unmark_top; ++i){
|
||||
unmark[i]->state.ignore_behind_os = 0;
|
||||
}
|
||||
|
||||
end_temp_memory(temp);
|
||||
}
|
||||
|
||||
|
|
|
@ -1118,6 +1118,7 @@ struct Shift_Information{
|
|||
i32 start, end, amount;
|
||||
};
|
||||
|
||||
// TODO(allen): I want this code audited soon
|
||||
internal
|
||||
Job_Callback_Sig(job_full_lex){
|
||||
Editing_File *file = (Editing_File*)data[0];
|
||||
|
@ -1129,7 +1130,6 @@ Job_Callback_Sig(job_full_lex){
|
|||
i32 buffer_size = file->state.buffer.size;
|
||||
buffer_size = (buffer_size + 3)&(~3);
|
||||
|
||||
#if USE_NEW_LEXER
|
||||
while (memory->size < buffer_size*2){
|
||||
system->grow_thread_memory(memory);
|
||||
}
|
||||
|
@ -1174,48 +1174,6 @@ Job_Callback_Sig(job_full_lex){
|
|||
}
|
||||
} while (still_lexing);
|
||||
|
||||
#else
|
||||
|
||||
while (memory->size < buffer_size){
|
||||
system->grow_thread_memory(memory);
|
||||
}
|
||||
|
||||
Cpp_Token_Stack tokens;
|
||||
tokens.tokens = (Cpp_Token*)(char*)memory->data;
|
||||
tokens.max_count = (memory->size) / sizeof(Cpp_Token);
|
||||
tokens.count = 0;
|
||||
|
||||
Cpp_Lex_Data status = {};
|
||||
|
||||
do{
|
||||
for (i32 r = 2048; r > 0 && status.pos < text_size; --r){
|
||||
Cpp_Lex_Data prev_lex = status;
|
||||
Cpp_Read_Result step_result = cpp_lex_step(text_data, text_size, &status);
|
||||
|
||||
if (step_result.has_result){
|
||||
if (!cpp_push_token_nonalloc(&tokens, step_result.token)){
|
||||
status = prev_lex;
|
||||
system->grow_thread_memory(memory);
|
||||
tokens.tokens = (Cpp_Token*)memory->data;
|
||||
tokens.max_count = memory->size / sizeof(Cpp_Token);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (status.pos >= text_size){
|
||||
status.complete = 1;
|
||||
}
|
||||
else{
|
||||
if (system->check_cancel(thread)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
} while(!status.complete);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
i32 new_max = LargeRoundUp(tokens.count+1, Kbytes(1));
|
||||
|
||||
system->acquire_lock(FRAME_LOCK);
|
||||
|
@ -1322,12 +1280,8 @@ file_relex_parallel(System_Functions *system,
|
|||
relex_space.max_count = state.space_request;
|
||||
relex_space.tokens = push_array(part, Cpp_Token, relex_space.max_count);
|
||||
|
||||
#if USE_NEW_LEXER
|
||||
char *spare = push_array(part, char, size+1);
|
||||
if (cpp_relex_nonalloc_main(&state, &relex_space, &relex_end, spare)){
|
||||
#else
|
||||
if (cpp_relex_nonalloc_main(&state, &relex_space, &relex_end)){
|
||||
#endif
|
||||
inline_lex = 0;
|
||||
}
|
||||
else{
|
||||
|
@ -3318,7 +3272,9 @@ kill_file(System_Functions *system, Models *models, Editing_File *file){
|
|||
|
||||
if (file && !file->settings.never_kill){
|
||||
buffer_unbind_name(working_set, file);
|
||||
if (file->canon.name.size != 0){
|
||||
buffer_unbind_file(system, working_set, file);
|
||||
}
|
||||
file_close(system, &models->mem.general, file);
|
||||
working_set_free_file(working_set, file);
|
||||
|
||||
|
|
|
@ -447,6 +447,7 @@ cpp_lex_nonalloc(Lex_Data *S_ptr,
|
|||
if (S.fsm.state >= LS_count) S.fsm.state -= LS_count;
|
||||
pos_update_rule = PUR_none;
|
||||
if (S.pp_state == LSPP_include){
|
||||
if (c == 0) S.fsm.emit_token = 0;
|
||||
switch (S.fsm.state){
|
||||
case LSINC_default:break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue