3030extern "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
3556static 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)
17351756JL_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-
24572463void 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 );
0 commit comments