Skip to content

Commit 907b201

Browse files
authored
reduce places where Builtins are listed (#58205)
DRY code somewhat by consolidating builtin declarations to use a table or macro definition to auto-generate the required reflection metadata. Mostly NFC, but does include a couple bugfixes caused by the consistency this enforces. Adding a new `Builtin` is now simply a matter of declaring it in `builtin_proto.h` and defining it in `builtins.c` and any relevant declarations are handled automatically.
1 parent 6498664 commit 907b201

14 files changed

+472
-636
lines changed

src/builtin_proto.h

+79-73
Original file line numberDiff line numberDiff line change
@@ -8,82 +8,88 @@ extern "C" {
88
#endif
99

1010
// declarations for julia-callable builtin functions
11+
#define JL_BUILTIN_FUNCTIONS(XX) \
12+
XX(_abstracttype,"_abstracttype") \
13+
XX(_apply_iterate,"_apply_iterate") \
14+
XX(_call_in_world_total,"_call_in_world_total") \
15+
XX(_compute_sparams,"_compute_sparams") \
16+
XX(_defaultctors,"_defaultctors") \
17+
XX(_equiv_typedef,"_equiv_typedef") \
18+
XX(_expr,"_expr") \
19+
XX(_primitivetype,"_primitivetype") \
20+
XX(_setsuper,"_setsuper!") \
21+
XX(_structtype,"_structtype") \
22+
XX(_svec_ref,"_svec_ref") \
23+
XX(_typebody,"_typebody!") \
24+
XX(_typevar,"_typevar") \
25+
XX(applicable,"applicable") \
26+
XX(apply_type,"apply_type") \
27+
XX(compilerbarrier,"compilerbarrier") \
28+
XX(current_scope,"current_scope") \
29+
XX(donotdelete,"donotdelete") \
30+
XX(fieldtype,"fieldtype") \
31+
XX(finalizer,"finalizer") \
32+
XX(get_binding_type,"get_binding_type") \
33+
XX(getfield,"getfield") \
34+
XX(getglobal,"getglobal") \
35+
XX(ifelse,"ifelse") \
36+
XX(intrinsic_call,"intrinsic_call") \
37+
XX(invoke,"invoke") \
38+
XX(invoke_in_world,"invoke_in_world") \
39+
XX(invokelatest,"invokelatest") \
40+
XX(is,"===") \
41+
XX(isa,"isa") \
42+
XX(isdefined,"isdefined") \
43+
XX(isdefinedglobal,"isdefinedglobal") \
44+
XX(issubtype,"<:") \
45+
XX(memorynew,"memorynew") \
46+
XX(memoryrefnew,"memoryrefnew") \
47+
XX(memoryref_isassigned,"memoryref_isassigned") \
48+
XX(memoryrefget,"memoryrefget") \
49+
XX(memoryrefmodify,"memoryrefmodify!") \
50+
XX(memoryrefoffset,"memoryrefoffset") \
51+
XX(memoryrefreplace,"memoryrefreplace!") \
52+
XX(memoryrefset,"memoryrefset!") \
53+
XX(memoryrefsetonce,"memoryrefsetonce!") \
54+
XX(memoryrefswap,"memoryrefswap!") \
55+
XX(modifyfield,"modifyfield!") \
56+
XX(modifyglobal,"modifyglobal!") \
57+
XX(nfields,"nfields") \
58+
XX(opaque_closure_call,"opaque_closure_call") \
59+
XX(replacefield,"replacefield!") \
60+
XX(replaceglobal,"replaceglobal!") \
61+
XX(setfield,"setfield!") \
62+
XX(setfieldonce,"setfieldonce!") \
63+
XX(setglobal,"setglobal!") \
64+
XX(setglobalonce,"setglobalonce!") \
65+
XX(sizeof,"sizeof") \
66+
XX(svec,"svec") \
67+
XX(swapfield,"swapfield!") \
68+
XX(swapglobal,"swapglobal!") \
69+
XX(throw,"throw") \
70+
XX(throw_methoderror,"throw_methoderror") \
71+
XX(tuple,"tuple") \
72+
XX(typeassert,"typeassert") \
73+
XX(typeof,"typeof") \
1174

12-
#ifdef DEFINE_BUILTIN_GLOBALS
13-
#define DECLARE_BUILTIN(name) \
14-
JL_CALLABLE(jl_f_##name); \
15-
JL_DLLEXPORT jl_value_t *jl_builtin_##name; \
16-
JL_DLLEXPORT jl_fptr_args_t jl_f_##name##_addr = &jl_f_##name
17-
#else
18-
#define DECLARE_BUILTIN(name) \
19-
JL_CALLABLE(jl_f_##name); \
20-
JL_DLLEXPORT extern jl_value_t *jl_builtin_##name; \
21-
JL_DLLEXPORT extern jl_fptr_args_t jl_f_##name##_addr
22-
#endif
75+
#define DECLARE_BUILTIN(cname,jlname) \
76+
JL_CALLABLE(jl_f_##cname);
77+
JL_BUILTIN_FUNCTIONS(DECLARE_BUILTIN)
78+
#undef DECLARE_BUILTIN
79+
80+
#define BUILTIN(cname) (jl_builtin_instances[jl_builtin_id_##cname])
81+
82+
enum jl_builtin_ids {
83+
#define BUILTIN_IDS(cname,jlname) jl_builtin_id_##cname,
84+
JL_BUILTIN_FUNCTIONS(BUILTIN_IDS)
85+
#undef BUILTIN_IDS
86+
jl_n_builtins
87+
};
2388

24-
DECLARE_BUILTIN(_apply_iterate);
25-
DECLARE_BUILTIN(invoke_in_world);
26-
DECLARE_BUILTIN(_call_in_world_total);
27-
DECLARE_BUILTIN(invokelatest);
28-
DECLARE_BUILTIN(_compute_sparams);
29-
DECLARE_BUILTIN(_expr);
30-
DECLARE_BUILTIN(_svec_ref);
31-
DECLARE_BUILTIN(_typebody);
32-
DECLARE_BUILTIN(_typevar);
33-
DECLARE_BUILTIN(applicable);
34-
DECLARE_BUILTIN(apply_type);
35-
DECLARE_BUILTIN(compilerbarrier);
36-
DECLARE_BUILTIN(current_scope);
37-
DECLARE_BUILTIN(donotdelete);
38-
DECLARE_BUILTIN(fieldtype);
39-
DECLARE_BUILTIN(finalizer);
40-
DECLARE_BUILTIN(getfield);
41-
DECLARE_BUILTIN(getglobal);
42-
DECLARE_BUILTIN(ifelse);
43-
DECLARE_BUILTIN(invoke);
44-
DECLARE_BUILTIN(is);
45-
DECLARE_BUILTIN(isa);
46-
DECLARE_BUILTIN(isdefined);
47-
DECLARE_BUILTIN(isdefinedglobal);
48-
DECLARE_BUILTIN(issubtype);
49-
DECLARE_BUILTIN(memorynew);
50-
DECLARE_BUILTIN(memoryref);
51-
DECLARE_BUILTIN(memoryref_isassigned);
52-
DECLARE_BUILTIN(memoryrefget);
53-
DECLARE_BUILTIN(memoryrefmodify);
54-
DECLARE_BUILTIN(memoryrefoffset);
55-
DECLARE_BUILTIN(memoryrefreplace);
56-
DECLARE_BUILTIN(memoryrefset);
57-
DECLARE_BUILTIN(memoryrefsetonce);
58-
DECLARE_BUILTIN(memoryrefswap);
59-
DECLARE_BUILTIN(modifyfield);
60-
DECLARE_BUILTIN(modifyglobal);
61-
DECLARE_BUILTIN(nfields);
62-
DECLARE_BUILTIN(replacefield);
63-
DECLARE_BUILTIN(replaceglobal);
64-
DECLARE_BUILTIN(setfield);
65-
DECLARE_BUILTIN(setfieldonce);
66-
DECLARE_BUILTIN(setglobal);
67-
DECLARE_BUILTIN(setglobalonce);
68-
DECLARE_BUILTIN(sizeof);
69-
DECLARE_BUILTIN(svec);
70-
DECLARE_BUILTIN(swapfield);
71-
DECLARE_BUILTIN(swapglobal);
72-
DECLARE_BUILTIN(throw);
73-
DECLARE_BUILTIN(throw_methoderror);
74-
DECLARE_BUILTIN(tuple);
75-
DECLARE_BUILTIN(typeassert);
76-
DECLARE_BUILTIN(typeof);
89+
JL_DLLEXPORT extern jl_fptr_args_t const jl_builtin_f_addrs[];
90+
JL_DLLEXPORT extern const char *const jl_builtin_f_names[];
91+
JL_DLLEXPORT extern jl_value_t *jl_builtin_instances[];
7792

78-
JL_CALLABLE(jl_f__structtype);
79-
JL_CALLABLE(jl_f__abstracttype);
80-
JL_CALLABLE(jl_f__primitivetype);
81-
JL_CALLABLE(jl_f__setsuper);
82-
JL_CALLABLE(jl_f__defaultctors);
83-
JL_CALLABLE(jl_f__equiv_typedef);
84-
JL_CALLABLE(jl_f_get_binding_type);
85-
JL_CALLABLE(jl_f__compute_sparams);
86-
JL_CALLABLE(jl_f__svec_ref);
8793
#ifdef __cplusplus
8894
}
8995
#endif

src/builtins.c

+45-98
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,27 @@
3030
extern "C" {
3131
#endif
3232

33+
jl_fptr_args_t const jl_builtin_f_addrs[jl_n_builtins] = {
34+
#define BUILTIN_ADDRS(cname,jlname) &jl_f_##cname,
35+
JL_BUILTIN_FUNCTIONS(BUILTIN_ADDRS)
36+
#undef BUILTIN_ADDRS
37+
};
38+
39+
const char *const jl_builtin_f_names[jl_n_builtins] = {
40+
#define BUILTIN_F_NAMES(cname,jlname) XSTR(jl_f_##cname),
41+
JL_BUILTIN_FUNCTIONS(BUILTIN_F_NAMES)
42+
#undef BUILTIN_F_NAMES
43+
};
44+
45+
jl_value_t *jl_builtin_instances[jl_n_builtins];
46+
47+
static const char *const jl_builtin_names[jl_n_builtins] = {
48+
#define BUILTIN_NAMES(cname,jlname) jlname,
49+
JL_BUILTIN_FUNCTIONS(BUILTIN_NAMES)
50+
#undef BUILTIN_NAMES
51+
};
52+
53+
3354
// egal and object_id ---------------------------------------------------------
3455

3556
static int bits_equal(const void *a, const void *b, int sz) JL_NOTSAFEPOINT
@@ -647,7 +668,7 @@ JL_CALLABLE(jl_f__apply_iterate)
647668
nargs -= 1;
648669
if (nargs == 2) {
649670
// some common simple cases
650-
if (f == jl_builtin_svec) {
671+
if (f == BUILTIN(svec)) {
651672
if (jl_is_svec(args[1]))
652673
return args[1];
653674
if (jl_is_genericmemory(args[1])) {
@@ -672,7 +693,7 @@ JL_CALLABLE(jl_f__apply_iterate)
672693
return (jl_value_t*)t;
673694
}
674695
}
675-
else if (f == jl_builtin_tuple && jl_is_tuple(args[1])) {
696+
else if (f == BUILTIN(tuple) && jl_is_tuple(args[1])) {
676697
return args[1];
677698
}
678699
}
@@ -1691,11 +1712,11 @@ JL_CALLABLE(jl_f_memorynew)
16911712
return (jl_value_t*)jl_alloc_genericmemory(args[0], nel);
16921713
}
16931714

1694-
JL_CALLABLE(jl_f_memoryref)
1715+
JL_CALLABLE(jl_f_memoryrefnew)
16951716
{
1696-
JL_NARGS(memoryref, 1, 3);
1717+
JL_NARGS(memoryrefnew, 1, 3);
16971718
if (nargs == 1) {
1698-
JL_TYPECHK(memoryref, genericmemory, args[0]);
1719+
JL_TYPECHK(memoryrefnew, genericmemory, args[0]);
16991720
jl_genericmemory_t *m = (jl_genericmemory_t*)args[0];
17001721
jl_value_t *typ = jl_apply_type((jl_value_t*)jl_genericmemoryref_type, jl_svec_data(((jl_datatype_t*)jl_typetagof(m))->parameters), 3);
17011722
JL_GC_PROMISE_ROOTED(typ); // it is a concrete type
@@ -1705,10 +1726,10 @@ JL_CALLABLE(jl_f_memoryref)
17051726
return (jl_value_t*)jl_new_memoryref(typ, m, m->ptr);
17061727
}
17071728
else {
1708-
JL_TYPECHK(memoryref, genericmemoryref, args[0]);
1709-
JL_TYPECHK(memoryref, long, args[1]);
1729+
JL_TYPECHK(memoryrefnew, genericmemoryref, args[0]);
1730+
JL_TYPECHK(memoryrefnew, long, args[1]);
17101731
if (nargs == 3)
1711-
JL_TYPECHK(memoryref, bool, args[2]);
1732+
JL_TYPECHK(memoryrefnew, bool, args[2]);
17121733
jl_genericmemoryref_t *m = (jl_genericmemoryref_t*)args[0];
17131734
size_t i = jl_unbox_long(args[1]) - 1;
17141735
const jl_datatype_layout_t *layout = ((jl_datatype_t*)jl_typetagof(m->mem))->layout;
@@ -1735,7 +1756,7 @@ JL_CALLABLE(jl_f_memoryref)
17351756
JL_CALLABLE(jl_f_memoryrefoffset)
17361757
{
17371758
JL_NARGS(memoryrefoffset, 1, 1);
1738-
JL_TYPECHK(memoryref, genericmemoryref, args[0]);
1759+
JL_TYPECHK(memoryrefoffest, genericmemoryref, args[0]);
17391760
jl_genericmemoryref_t m = *(jl_genericmemoryref_t*)args[0];
17401761
const jl_datatype_layout_t *layout = ((jl_datatype_t*)jl_typetagof(m.mem))->layout;
17411762
size_t offset;
@@ -2415,10 +2436,10 @@ void jl_init_intrinsic_functions(void) JL_GC_DISABLED
24152436
{
24162437
jl_module_t *inm = jl_new_module_(jl_symbol("Intrinsics"), jl_core_module, 0, 1);
24172438
jl_set_initial_const(jl_core_module, jl_symbol("Intrinsics"), (jl_value_t*)inm, 0);
2418-
jl_mk_builtin_func(jl_intrinsic_type, "IntrinsicFunction", jl_f_intrinsic_call);
2439+
jl_mk_builtin_func(jl_intrinsic_type, jl_symbol("IntrinsicFunction"), jl_f_intrinsic_call);
24192440
jl_mk_builtin_func(
24202441
(jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_opaque_closure_type),
2421-
"OpaqueClosure", jl_f_opaque_closure_call);
2442+
jl_symbol("OpaqueClosure"), jl_f_opaque_closure_call);
24222443

24232444
// Save a reference to the just created OpaqueClosure method, so we can provide special
24242445
// codegen for it later.
@@ -2439,93 +2460,21 @@ static void add_builtin(const char *name, jl_value_t *v)
24392460
jl_set_initial_const(jl_core_module, jl_symbol(name), v, 0);
24402461
}
24412462

2442-
jl_fptr_args_t jl_get_builtin_fptr(jl_datatype_t *dt)
2443-
{
2444-
assert(jl_subtype((jl_value_t*)dt, (jl_value_t*)jl_builtin_type));
2445-
jl_typemap_entry_t *entry = (jl_typemap_entry_t*)jl_atomic_load_relaxed(&dt->name->mt->defs);
2446-
jl_method_instance_t *mi = jl_atomic_load_relaxed(&entry->func.method->unspecialized);
2447-
jl_code_instance_t *ci = jl_atomic_load_relaxed(&mi->cache);
2448-
assert(ci->owner == jl_nothing);
2449-
return jl_atomic_load_relaxed(&ci->specptr.fptr1);
2450-
}
2451-
2452-
static jl_value_t *add_builtin_func(const char *name, jl_fptr_args_t fptr)
2453-
{
2454-
return jl_mk_builtin_func(NULL, name, fptr)->instance;
2455-
}
2456-
24572463
void jl_init_primitives(void) JL_GC_DISABLED
24582464
{
2459-
jl_builtin_is = add_builtin_func("===", jl_f_is);
2460-
jl_builtin_typeof = add_builtin_func("typeof", jl_f_typeof);
2461-
jl_builtin_sizeof = add_builtin_func("sizeof", jl_f_sizeof);
2462-
jl_builtin_issubtype = add_builtin_func("<:", jl_f_issubtype);
2463-
jl_builtin_isa = add_builtin_func("isa", jl_f_isa);
2464-
jl_builtin_typeassert = add_builtin_func("typeassert", jl_f_typeassert);
2465-
jl_builtin_throw = add_builtin_func("throw", jl_f_throw);
2466-
jl_builtin_tuple = add_builtin_func("tuple", jl_f_tuple);
2467-
jl_builtin_ifelse = add_builtin_func("ifelse", jl_f_ifelse);
2468-
2469-
// field access
2470-
jl_builtin_getfield = add_builtin_func("getfield", jl_f_getfield);
2471-
jl_builtin_setfield = add_builtin_func("setfield!", jl_f_setfield);
2472-
jl_builtin_setfieldonce = add_builtin_func("setfieldonce!", jl_f_setfieldonce);
2473-
jl_builtin_swapfield = add_builtin_func("swapfield!", jl_f_swapfield);
2474-
jl_builtin_modifyfield = add_builtin_func("modifyfield!", jl_f_modifyfield);
2475-
jl_builtin_replacefield = add_builtin_func("replacefield!", jl_f_replacefield);
2476-
jl_builtin_fieldtype = add_builtin_func("fieldtype", jl_f_fieldtype);
2477-
jl_builtin_nfields = add_builtin_func("nfields", jl_f_nfields);
2478-
jl_builtin_isdefined = add_builtin_func("isdefined", jl_f_isdefined);
2479-
2480-
// module bindings
2481-
jl_builtin_getglobal = add_builtin_func("getglobal", jl_f_getglobal);
2482-
jl_builtin_setglobal = add_builtin_func("setglobal!", jl_f_setglobal);
2483-
jl_builtin_isdefinedglobal = add_builtin_func("isdefinedglobal", jl_f_isdefinedglobal);
2484-
add_builtin_func("get_binding_type", jl_f_get_binding_type);
2485-
jl_builtin_swapglobal = add_builtin_func("swapglobal!", jl_f_swapglobal);
2486-
jl_builtin_replaceglobal = add_builtin_func("replaceglobal!", jl_f_replaceglobal);
2487-
jl_builtin_modifyglobal = add_builtin_func("modifyglobal!", jl_f_modifyglobal);
2488-
jl_builtin_setglobalonce = add_builtin_func("setglobalonce!", jl_f_setglobalonce);
2489-
2490-
// memory primitives
2491-
jl_builtin_memorynew = add_builtin_func("memorynew", jl_f_memorynew);
2492-
jl_builtin_memoryref = add_builtin_func("memoryrefnew", jl_f_memoryref);
2493-
jl_builtin_memoryrefoffset = add_builtin_func("memoryrefoffset", jl_f_memoryrefoffset);
2494-
jl_builtin_memoryrefget = add_builtin_func("memoryrefget", jl_f_memoryrefget);
2495-
jl_builtin_memoryrefset = add_builtin_func("memoryrefset!", jl_f_memoryrefset);
2496-
jl_builtin_memoryref_isassigned = add_builtin_func("memoryref_isassigned", jl_f_memoryref_isassigned);
2497-
jl_builtin_memoryrefswap = add_builtin_func("memoryrefswap!", jl_f_memoryrefswap);
2498-
jl_builtin_memoryrefreplace = add_builtin_func("memoryrefreplace!", jl_f_memoryrefreplace);
2499-
jl_builtin_memoryrefmodify = add_builtin_func("memoryrefmodify!", jl_f_memoryrefmodify);
2500-
jl_builtin_memoryrefsetonce = add_builtin_func("memoryrefsetonce!", jl_f_memoryrefsetonce);
2501-
2502-
// method table utils
2503-
jl_builtin_applicable = add_builtin_func("applicable", jl_f_applicable);
2504-
jl_builtin_invoke = add_builtin_func("invoke", jl_f_invoke);
2505-
2506-
// internal functions
2507-
jl_builtin_apply_type = add_builtin_func("apply_type", jl_f_apply_type);
2508-
jl_builtin__apply_iterate = add_builtin_func("_apply_iterate", jl_f__apply_iterate);
2509-
jl_builtin__expr = add_builtin_func("_expr", jl_f__expr);
2510-
jl_builtin_svec = add_builtin_func("svec", jl_f_svec);
2511-
add_builtin_func("invokelatest", jl_f_invokelatest);
2512-
add_builtin_func("invoke_in_world", jl_f_invoke_in_world);
2513-
add_builtin_func("_call_in_world_total", jl_f__call_in_world_total);
2514-
add_builtin_func("_typevar", jl_f__typevar);
2515-
add_builtin_func("_structtype", jl_f__structtype);
2516-
add_builtin_func("_abstracttype", jl_f__abstracttype);
2517-
add_builtin_func("_primitivetype", jl_f__primitivetype);
2518-
add_builtin_func("_setsuper!", jl_f__setsuper);
2519-
add_builtin_func("_defaultctors", jl_f__defaultctors);
2520-
jl_builtin__typebody = add_builtin_func("_typebody!", jl_f__typebody);
2521-
add_builtin_func("_equiv_typedef", jl_f__equiv_typedef);
2522-
jl_builtin_donotdelete = add_builtin_func("donotdelete", jl_f_donotdelete);
2523-
jl_builtin_compilerbarrier = add_builtin_func("compilerbarrier", jl_f_compilerbarrier);
2524-
add_builtin_func("finalizer", jl_f_finalizer);
2525-
add_builtin_func("_compute_sparams", jl_f__compute_sparams);
2526-
add_builtin_func("_svec_ref", jl_f__svec_ref);
2527-
jl_builtin_current_scope = add_builtin_func("current_scope", jl_f_current_scope);
2528-
add_builtin_func("throw_methoderror", jl_f_throw_methoderror);
2465+
// Builtins are specially considered available from world 0
2466+
for (int i = 0; i < jl_n_builtins; i++) {
2467+
if (i == jl_builtin_id_intrinsic_call ||
2468+
i == jl_builtin_id_opaque_closure_call)
2469+
continue;
2470+
jl_sym_t *sname = jl_symbol(jl_builtin_names[i]);
2471+
jl_value_t *builtin = jl_new_generic_function_with_supertype(sname, jl_core_module, jl_builtin_type, 0);
2472+
jl_set_initial_const(jl_core_module, sname, builtin, 0);
2473+
jl_mk_builtin_func((jl_datatype_t*)jl_typeof(builtin), sname, jl_builtin_f_addrs[i]);
2474+
jl_builtin_instances[i] = builtin;
2475+
}
2476+
add_builtin("OpaqueClosure", (jl_value_t*)jl_opaque_closure_type);
2477+
add_builtin("IntrinsicFunction", (jl_value_t*)jl_intrinsic_type);
25292478

25302479
// builtin types
25312480
add_builtin("Any", (jl_value_t*)jl_any_type);
@@ -2558,14 +2507,12 @@ void jl_init_primitives(void) JL_GC_DISABLED
25582507
add_builtin("PartialOpaque", (jl_value_t*)jl_partial_opaque_type);
25592508
add_builtin("InterConditional", (jl_value_t*)jl_interconditional_type);
25602509
add_builtin("MethodMatch", (jl_value_t*)jl_method_match_type);
2561-
add_builtin("IntrinsicFunction", (jl_value_t*)jl_intrinsic_type);
25622510
add_builtin("Function", (jl_value_t*)jl_function_type);
25632511
add_builtin("Builtin", (jl_value_t*)jl_builtin_type);
25642512
add_builtin("MethodInstance", (jl_value_t*)jl_method_instance_type);
25652513
add_builtin("CodeInfo", (jl_value_t*)jl_code_info_type);
25662514
add_builtin("LLVMPtr", (jl_value_t*)jl_llvmpointer_type);
25672515
add_builtin("Task", (jl_value_t*)jl_task_type);
2568-
add_builtin("OpaqueClosure", (jl_value_t*)jl_opaque_closure_type);
25692516

25702517
add_builtin("AddrSpace", (jl_value_t*)jl_addrspace_type);
25712518
add_builtin("Ref", (jl_value_t*)jl_ref_type);

src/cgutils.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -4662,7 +4662,7 @@ static Value *emit_memoryref_FCA(jl_codectx_t &ctx, const jl_cgval_t &ref, const
46624662
static jl_cgval_t emit_memoryref(jl_codectx_t &ctx, const jl_cgval_t &ref, jl_cgval_t idx, jl_value_t *inbounds, const jl_datatype_layout_t *layout)
46634663
{
46644664
++EmittedArrayNdIndex;
4665-
emit_typecheck(ctx, idx, (jl_value_t*)jl_long_type, "memoryref");
4665+
emit_typecheck(ctx, idx, (jl_value_t*)jl_long_type, "memoryrefnew");
46664666
idx = update_julia_type(ctx, idx, (jl_value_t*)jl_long_type);
46674667
if (idx.typ == jl_bottom_type)
46684668
return jl_cgval_t();

0 commit comments

Comments
 (0)