static DVM_Executable *do_compile(DKC_Compiler *compiler) { extern int yyparse(void); DVM_Executable *exe; dkc_set_current_compiler(compiler); if (yyparse()) { fprintf(stderr, "Error ! Error ! Error !\n"); exit(1); } dkc_fix_tree(compiler); exe = dkc_generate(compiler); /* dvm_disassemble(exe); */ return exe; }
static DVM_Executable * do_compile(DKC_Compiler *compiler, DVM_ExecutableList *list, char *path, DVM_Boolean is_required) { extern FILE *yyin; extern int yyparse(void); RequireList *req_pos; DKC_Compiler *req_comp; DVM_Executable *exe; DVM_Executable *req_exe; char found_path[FILENAME_MAX]; DKC_Compiler *compiler_backup; SourceInput source_input; compiler_backup = dkc_get_current_compiler(); dkc_set_current_compiler(compiler); if (yyparse()) { fprintf(stderr, "Error ! Error ! Error !\n"); exit(1); } for (req_pos = compiler->require_list; req_pos; req_pos = req_pos->next) { req_comp = search_compiler(st_compiler_list, req_pos->package_name); if (req_comp) { compiler->required_list = add_compiler_to_list(compiler->required_list, req_comp); continue; } req_comp = DKC_create_compiler(); /* BUGBUG req_comp references parent compiler's MEM_storage */ req_comp->package_name = req_pos->package_name; req_comp->source_suffix = DKH_SOURCE; compiler->required_list = add_compiler_to_list(compiler->required_list, req_comp); st_compiler_list = add_compiler_to_list(st_compiler_list, req_comp); get_require_input(req_pos, found_path, &source_input); set_path_to_compiler(req_comp, found_path); req_comp->input_mode = source_input.input_mode; if (source_input.input_mode == FILE_INPUT_MODE) { yyin = source_input.u.file.fp; } else { dkc_set_source_string(source_input.u.string.lines); } req_exe = do_compile(req_comp, list, found_path, DVM_TRUE); } dkc_fix_tree(compiler); exe = dkc_generate(compiler); if (path) { exe->path = MEM_strdup(path); } else { exe->path = NULL; } /* dvm_disassemble(exe);*/ exe->is_required = is_required; if (!add_exe_to_list(exe, list)) { dvm_dispose_executable(exe); } dkc_set_current_compiler(compiler_backup); return exe; }