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