jl_value_t *jl_resolve_globals(jl_value_t *expr, jl_lambda_info_t *lam) { if (jl_is_symbol(expr)) { if (lam->def->module == NULL) return expr; return jl_module_globalref(lam->def->module, (jl_sym_t*)expr); } else if (jl_is_expr(expr)) { jl_expr_t *e = (jl_expr_t*)expr; if (jl_is_toplevel_only_expr(expr) || e->head == const_sym || e->head == copyast_sym || e->head == global_sym || e->head == quote_sym || e->head == inert_sym || e->head == line_sym || e->head == meta_sym || e->head == inbounds_sym || e->head == boundscheck_sym || e->head == simdloop_sym) { } else { if (e->head == call_sym && jl_expr_nargs(e) == 3 && jl_is_quotenode(jl_exprarg(e,2)) && lam->def->module != NULL) { // replace getfield(module_expr, :sym) with GlobalRef jl_value_t *s = jl_fieldref(jl_exprarg(e,2),0); jl_value_t *fe = jl_exprarg(e,0); if (jl_is_symbol(s) && jl_is_globalref(fe)) { jl_value_t *f = jl_static_eval(fe, NULL, lam->def->module, lam, 0, 0); if (f == jl_builtin_getfield) { jl_value_t *me = jl_exprarg(e,1); if (jl_is_globalref(me) || (jl_is_symbol(me) && jl_binding_resolved_p(lam->def->module, (jl_sym_t*)me))) { jl_value_t *m = jl_static_eval(me, NULL, lam->def->module, lam, 0, 0); if (m && jl_is_module(m)) return jl_module_globalref((jl_module_t*)m, (jl_sym_t*)s); } } } } size_t i = 0; if (e->head == method_sym || e->head == abstracttype_sym || e->head == compositetype_sym || e->head == bitstype_sym || e->head == module_sym) i++; for(; i < jl_array_len(e->args); i++) { jl_exprargset(e, i, jl_resolve_globals(jl_exprarg(e,i), lam)); } } } return expr; }
// TODO: eval decl types for arguments of non-generic functions static void eval_decl_types(jl_array_t *vi, jl_value_t *ast, jl_tuple_t *spenv) { size_t i, l = jl_array_len(vi); for(i=0; i < l; i++) { jl_array_t *v = (jl_array_t*)jl_cellref(vi, i); assert(jl_array_len(v) > 1); jl_value_t *ty = jl_static_eval(jl_cellref(v,1), NULL, jl_current_module, (jl_value_t*)spenv, (jl_expr_t*)ast, 1, 1); if (ty != NULL && (jl_is_type(ty) || jl_is_typevar(ty))) { jl_cellref(v, 1) = ty; } else { jl_cellref(v, 1) = (jl_value_t*)jl_any_type; } } }
int jl_has_intrinsics(jl_expr_t *ast, jl_expr_t *e, jl_module_t *m) { if (jl_array_len(e->args) == 0) return 0; if (e->head == static_typeof_sym) return 1; jl_value_t *e0 = jl_exprarg(e,0); if (e->head == call_sym) { jl_value_t *sv = jl_static_eval(e0, NULL, m, (jl_value_t*)jl_emptysvec, ast, 0, 0); if (sv && jl_typeis(sv, jl_intrinsic_type)) return 1; } int i; for(i=0; i < jl_array_len(e->args); i++) { jl_value_t *a = jl_exprarg(e,i); if (jl_is_expr(a) && jl_has_intrinsics(ast, (jl_expr_t*)a, m)) return 1; } return 0; }