void jl_init_frontend(void) { if (jl_ast_ctx_using || jl_ast_ctx_freed) return; jl_ast_main_ctx.ref = 1; jl_ast_main_ctx.task = jl_current_task; jl_ast_context_list_insert(&jl_ast_ctx_using, &jl_ast_main_ctx.list); jl_init_ast_ctx(&jl_ast_main_ctx); // To match the one in jl_ast_ctx_leave JL_SIGATOMIC_BEGIN(); jl_ast_ctx_leave(&jl_ast_main_ctx); }
static jl_ast_context_t *jl_ast_ctx_enter(void) { jl_ptls_t ptls = jl_get_ptls_states(); JL_SIGATOMIC_BEGIN(); JL_LOCK_NOGC(&flisp_lock); jl_ast_context_list_t *node; jl_ast_context_t *ctx; // First check if the current task is using one of the contexts for (node = jl_ast_ctx_using;node;(node = node->next)) { ctx = jl_ast_context_list_item(node); if (ctx->task == ptls->current_task) { ctx->ref++; JL_UNLOCK_NOGC(&flisp_lock); return ctx; } } // If not, grab one from the free list if ((node = jl_ast_ctx_freed)) { jl_ast_context_list_delete(node); jl_ast_context_list_insert(&jl_ast_ctx_using, node); ctx = jl_ast_context_list_item(node); ctx->ref = 1; ctx->task = ptls->current_task; ctx->module = NULL; JL_UNLOCK_NOGC(&flisp_lock); return ctx; } // Construct a new one if we can't find any ctx = (jl_ast_context_t*)calloc(1, sizeof(jl_ast_context_t)); ctx->ref = 1; ctx->task = ptls->current_task; node = &ctx->list; jl_ast_context_list_insert(&jl_ast_ctx_using, node); JL_UNLOCK_NOGC(&flisp_lock); jl_init_ast_ctx(ctx); return ctx; }
void jl_init_frontend(void) { jl_ptls_t ptls = jl_get_ptls_states(); if (jl_ast_ctx_using || jl_ast_ctx_freed) return; jl_ast_main_ctx.ref = 1; jl_ast_main_ctx.task = ptls->current_task; jl_ast_context_list_insert(&jl_ast_ctx_using, &jl_ast_main_ctx.list); jl_init_ast_ctx(&jl_ast_main_ctx); // To match the one in jl_ast_ctx_leave JL_SIGATOMIC_BEGIN(); jl_ast_ctx_leave(&jl_ast_main_ctx); empty_sym = jl_symbol(""); call_sym = jl_symbol("call"); invoke_sym = jl_symbol("invoke"); foreigncall_sym = jl_symbol("foreigncall"); cfunction_sym = jl_symbol("cfunction"); quote_sym = jl_symbol("quote"); inert_sym = jl_symbol("inert"); top_sym = jl_symbol("top"); core_sym = jl_symbol("core"); globalref_sym = jl_symbol("globalref"); line_sym = jl_symbol("line"); jl_incomplete_sym = jl_symbol("incomplete"); error_sym = jl_symbol("error"); goto_sym = jl_symbol("goto"); goto_ifnot_sym = jl_symbol("gotoifnot"); label_sym = jl_symbol("label"); return_sym = jl_symbol("return"); unreachable_sym = jl_symbol("unreachable"); tuple_sym = jl_symbol("tuple"); lambda_sym = jl_symbol("lambda"); module_sym = jl_symbol("module"); export_sym = jl_symbol("export"); import_sym = jl_symbol("import"); using_sym = jl_symbol("using"); importall_sym = jl_symbol("importall"); assign_sym = jl_symbol("="); body_sym = jl_symbol("body"); colons_sym = jl_symbol("::"); method_sym = jl_symbol("method"); exc_sym = jl_symbol("the_exception"); enter_sym = jl_symbol("enter"); leave_sym = jl_symbol("leave"); new_sym = jl_symbol("new"); const_sym = jl_symbol("const"); global_sym = jl_symbol("global"); thunk_sym = jl_symbol("thunk"); underscore_sym = jl_symbol("_"); amp_sym = jl_symbol("&"); abstracttype_sym = jl_symbol("abstract_type"); primtype_sym = jl_symbol("primitive_type"); structtype_sym = jl_symbol("struct_type"); toplevel_sym = jl_symbol("toplevel"); dot_sym = jl_symbol("."); colon_sym = jl_symbol(":"); boundscheck_sym = jl_symbol("boundscheck"); inbounds_sym = jl_symbol("inbounds"); fastmath_sym = jl_symbol("fastmath"); newvar_sym = jl_symbol("newvar"); copyast_sym = jl_symbol("copyast"); simdloop_sym = jl_symbol("simdloop"); pure_sym = jl_symbol("pure"); meta_sym = jl_symbol("meta"); dots_sym = jl_symbol("..."); list_sym = jl_symbol("list"); unused_sym = jl_symbol("#unused#"); slot_sym = jl_symbol("slot"); static_parameter_sym = jl_symbol("static_parameter"); compiler_temp_sym = jl_symbol("#temp#"); inline_sym = jl_symbol("inline"); noinline_sym = jl_symbol("noinline"); polly_sym = jl_symbol("polly"); propagate_inbounds_sym = jl_symbol("propagate_inbounds"); isdefined_sym = jl_symbol("isdefined"); nospecialize_sym = jl_symbol("nospecialize"); macrocall_sym = jl_symbol("macrocall"); escape_sym = jl_symbol("escape"); hygienicscope_sym = jl_symbol("hygienic-scope"); gc_preserve_begin_sym = jl_symbol("gc_preserve_begin"); gc_preserve_end_sym = jl_symbol("gc_preserve_end"); generated_sym = jl_symbol("generated"); generated_only_sym = jl_symbol("generated_only"); throw_undef_if_not_sym = jl_symbol("throw_undef_if_not"); }