JL_DLLEXPORT void jl_method_init_properties(jl_method_t *m) { jl_lambda_info_t *li = m->lambda_template; jl_value_t *body1 = skip_meta((jl_array_t*)li->code); if (jl_is_linenode(body1)) { m->line = jl_linenode_line(body1); } else if (jl_is_expr(body1) && ((jl_expr_t*)body1)->head == line_sym) { m->file = (jl_sym_t*)jl_exprarg(body1, 1); m->line = jl_unbox_long(jl_exprarg(body1, 0)); } int i; uint8_t called=0; for(i=1; i < li->nargs && i <= 8; i++) { jl_value_t *ai = jl_array_ptr_ref(li->slotnames,i); if (ai == (jl_value_t*)unused_sym) continue; if (jl_array_uint8_ref(li->slotflags,i)&64) called |= (1<<(i-1)); } m->called = called; }
DLLEXPORT jl_lambda_info_t *jl_new_lambda_info(jl_value_t *ast, jl_svec_t *sparams) { jl_lambda_info_t *li = (jl_lambda_info_t*)newobj((jl_value_t*)jl_lambda_info_type, NWORDS(sizeof(jl_lambda_info_t))); li->ast = ast; li->file = null_sym; li->line = 0; if (ast != NULL && jl_is_expr(ast)) { jl_value_t *body1 = skip_meta(jl_lam_body((jl_expr_t*)ast)->args); if (jl_is_expr(body1) && ((jl_expr_t*)body1)->head == line_sym) { li->file = (jl_sym_t*)jl_exprarg(body1, 1); li->line = jl_unbox_long(jl_exprarg(body1, 0)); } } li->module = jl_current_module; li->sparams = sparams; li->tfunc = jl_nothing; li->fptr = &jl_trampoline; li->roots = NULL; li->functionObject = NULL; li->specFunctionObject = NULL; li->cFunctionList = NULL; li->functionID = 0; li->specFunctionID = 0; li->specTypes = NULL; li->inferred = 0; li->inInference = 0; li->inCompile = 0; li->unspecialized = NULL; li->specializations = NULL; li->name = anonymous_sym; li->def = li; li->capt = NULL; return li; }
JL_DLLEXPORT jl_lambda_info_t *jl_new_lambda_info(jl_value_t *ast, jl_svec_t *tvars, jl_svec_t *sparams, jl_module_t *ctx) { jl_lambda_info_t *li = (jl_lambda_info_t*)newobj((jl_value_t*)jl_lambda_info_type, NWORDS(sizeof(jl_lambda_info_t))); li->ast = ast; li->rettype = (jl_value_t*)jl_any_type; li->file = null_sym; li->module = ctx; li->sparam_syms = tvars; li->sparam_vals = sparams; li->tfunc = jl_nothing; li->fptr = NULL; li->jlcall_api = 0; li->roots = NULL; li->functionObjects.functionObject = NULL; li->functionObjects.specFunctionObject = NULL; li->functionObjects.cFunctionList = NULL; li->functionID = 0; li->specFunctionID = 0; li->specTypes = NULL; li->inferred = 0; li->inInference = 0; li->inCompile = 0; li->unspecialized = NULL; li->specializations = NULL; li->name = anonymous_sym; li->def = li; li->line = 0; li->pure = 0; li->called = 0xff; li->needs_sparam_vals_ducttape = 0; if (ast && jl_is_expr(ast)) { jl_array_t *body = jl_lam_body((jl_expr_t*)ast)->args; if (has_meta(body, pure_sym)) li->pure = 1; jl_value_t *body1 = skip_meta(body); if (jl_is_linenode(body1)) { li->file = jl_linenode_file(body1); li->line = jl_linenode_line(body1); } else if (jl_is_expr(body1) && ((jl_expr_t*)body1)->head == line_sym) { li->file = (jl_sym_t*)jl_exprarg(body1, 1); li->line = jl_unbox_long(jl_exprarg(body1, 0)); } jl_array_t *vis = jl_lam_vinfo((jl_expr_t*)li->ast); jl_array_t *args = jl_lam_args((jl_expr_t*)li->ast); size_t narg = jl_array_len(args); uint8_t called=0; int i, j=0; for(i=1; i < narg && i <= 8; i++) { jl_value_t *ai = jl_cellref(args,i); if (ai == (jl_value_t*)unused_sym || !jl_is_symbol(ai)) continue; jl_value_t *vj; do { vj = jl_cellref(vis, j++); } while (jl_cellref(vj,0) != ai); if (jl_unbox_long(jl_cellref(vj,2))&64) called |= (1<<(i-1)); } li->called = called; if (tvars != jl_emptysvec) if (jl_has_intrinsics(li, (jl_expr_t*)ast, ctx)) li->needs_sparam_vals_ducttape = 1; } return li; }