static int jl_typemap_array_visitor(struct jl_ordereddict_t *a, jl_typemap_visitor_fptr fptr, void *closure) { size_t i, l = jl_array_len(a->values); union jl_typemap_t *data = (union jl_typemap_t*)jl_array_data(a->values); for(i=0; i < l; i++) { if (!jl_typemap_visitor(data[i], fptr, closure)) return 0; } return 1; }
static int jl_typemap_array_visitor(jl_array_t *a, jl_typemap_visitor_fptr fptr, void *closure) { size_t i, l = jl_array_len(a); jl_value_t **data = (jl_value_t**)jl_array_data(a); for(i=0; i < l; i++) { if (data[i] != NULL) if (!jl_typemap_visitor(((union jl_typemap_t*)data)[i], fptr, closure)) return 0; } return 1; }
static int precompile_enq_all_specializations__(jl_typemap_entry_t *def, void *closure) { jl_method_t *m = def->func.method; if (m->name == jl_symbol("__init__") && jl_is_dispatch_tupletype(m->sig)) { // ensure `__init__()` gets strongly-hinted, specialized, and compiled jl_method_instance_t *mi = jl_specializations_get_linfo(m, m->sig, jl_emptysvec); jl_array_ptr_1d_push((jl_array_t*)closure, (jl_value_t*)mi); } else { jl_typemap_visitor(def->func.method->specializations, precompile_enq_specialization_, closure); } return 1; }
int jl_typemap_visitor(union jl_typemap_t cache, jl_typemap_visitor_fptr fptr, void *closure) { if (jl_typeof(cache.unknown) == (jl_value_t*)jl_typemap_level_type) { if (cache.node->targ.values != (void*)jl_nothing) if (!jl_typemap_array_visitor(&cache.node->targ, fptr, closure)) return 0; if (cache.node->arg1.values != (void*)jl_nothing) if (!jl_typemap_array_visitor(&cache.node->arg1, fptr, closure)) return 0; if (!jl_typemap_node_visitor(cache.node->linear, fptr, closure)) return 0; return jl_typemap_visitor(cache.node->any, fptr, closure); } else { return jl_typemap_node_visitor(cache.leaf, fptr, closure); } }
static void precompile_enq_all_specializations_(jl_methtable_t *mt, void *env) { jl_typemap_visitor(mt->defs, precompile_enq_all_specializations__, env); }
static int precompile_enq_all_specializations__(jl_typemap_entry_t *def, void *closure) { jl_typemap_visitor(def->func.method->specializations, precompile_enq_specialization_, closure); return 1; }
static void compile_all_enq_(jl_methtable_t *mt, void *env) { jl_typemap_visitor(mt->defs, compile_all_enq__, env); }