30
30
extern "C" {
31
31
#endif
32
32
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
+
33
54
// egal and object_id ---------------------------------------------------------
34
55
35
56
static int bits_equal (const void * a , const void * b , int sz ) JL_NOTSAFEPOINT
@@ -647,7 +668,7 @@ JL_CALLABLE(jl_f__apply_iterate)
647
668
nargs -= 1 ;
648
669
if (nargs == 2 ) {
649
670
// some common simple cases
650
- if (f == jl_builtin_svec ) {
671
+ if (f == BUILTIN ( svec ) ) {
651
672
if (jl_is_svec (args [1 ]))
652
673
return args [1 ];
653
674
if (jl_is_genericmemory (args [1 ])) {
@@ -672,7 +693,7 @@ JL_CALLABLE(jl_f__apply_iterate)
672
693
return (jl_value_t * )t ;
673
694
}
674
695
}
675
- else if (f == jl_builtin_tuple && jl_is_tuple (args [1 ])) {
696
+ else if (f == BUILTIN ( tuple ) && jl_is_tuple (args [1 ])) {
676
697
return args [1 ];
677
698
}
678
699
}
@@ -1691,11 +1712,11 @@ JL_CALLABLE(jl_f_memorynew)
1691
1712
return (jl_value_t * )jl_alloc_genericmemory (args [0 ], nel );
1692
1713
}
1693
1714
1694
- JL_CALLABLE (jl_f_memoryref )
1715
+ JL_CALLABLE (jl_f_memoryrefnew )
1695
1716
{
1696
- JL_NARGS (memoryref , 1 , 3 );
1717
+ JL_NARGS (memoryrefnew , 1 , 3 );
1697
1718
if (nargs == 1 ) {
1698
- JL_TYPECHK (memoryref , genericmemory , args [0 ]);
1719
+ JL_TYPECHK (memoryrefnew , genericmemory , args [0 ]);
1699
1720
jl_genericmemory_t * m = (jl_genericmemory_t * )args [0 ];
1700
1721
jl_value_t * typ = jl_apply_type ((jl_value_t * )jl_genericmemoryref_type , jl_svec_data (((jl_datatype_t * )jl_typetagof (m ))-> parameters ), 3 );
1701
1722
JL_GC_PROMISE_ROOTED (typ ); // it is a concrete type
@@ -1705,10 +1726,10 @@ JL_CALLABLE(jl_f_memoryref)
1705
1726
return (jl_value_t * )jl_new_memoryref (typ , m , m -> ptr );
1706
1727
}
1707
1728
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 ]);
1710
1731
if (nargs == 3 )
1711
- JL_TYPECHK (memoryref , bool , args [2 ]);
1732
+ JL_TYPECHK (memoryrefnew , bool , args [2 ]);
1712
1733
jl_genericmemoryref_t * m = (jl_genericmemoryref_t * )args [0 ];
1713
1734
size_t i = jl_unbox_long (args [1 ]) - 1 ;
1714
1735
const jl_datatype_layout_t * layout = ((jl_datatype_t * )jl_typetagof (m -> mem ))-> layout ;
@@ -1735,7 +1756,7 @@ JL_CALLABLE(jl_f_memoryref)
1735
1756
JL_CALLABLE (jl_f_memoryrefoffset )
1736
1757
{
1737
1758
JL_NARGS (memoryrefoffset , 1 , 1 );
1738
- JL_TYPECHK (memoryref , genericmemoryref , args [0 ]);
1759
+ JL_TYPECHK (memoryrefoffest , genericmemoryref , args [0 ]);
1739
1760
jl_genericmemoryref_t m = * (jl_genericmemoryref_t * )args [0 ];
1740
1761
const jl_datatype_layout_t * layout = ((jl_datatype_t * )jl_typetagof (m .mem ))-> layout ;
1741
1762
size_t offset ;
@@ -2415,10 +2436,10 @@ void jl_init_intrinsic_functions(void) JL_GC_DISABLED
2415
2436
{
2416
2437
jl_module_t * inm = jl_new_module_ (jl_symbol ("Intrinsics" ), jl_core_module , 0 , 1 );
2417
2438
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 );
2419
2440
jl_mk_builtin_func (
2420
2441
(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 );
2422
2443
2423
2444
// Save a reference to the just created OpaqueClosure method, so we can provide special
2424
2445
// codegen for it later.
@@ -2439,93 +2460,21 @@ static void add_builtin(const char *name, jl_value_t *v)
2439
2460
jl_set_initial_const (jl_core_module , jl_symbol (name ), v , 0 );
2440
2461
}
2441
2462
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
-
2457
2463
void jl_init_primitives (void ) JL_GC_DISABLED
2458
2464
{
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 );
2529
2478
2530
2479
// builtin types
2531
2480
add_builtin ("Any" , (jl_value_t * )jl_any_type );
@@ -2558,14 +2507,12 @@ void jl_init_primitives(void) JL_GC_DISABLED
2558
2507
add_builtin ("PartialOpaque" , (jl_value_t * )jl_partial_opaque_type );
2559
2508
add_builtin ("InterConditional" , (jl_value_t * )jl_interconditional_type );
2560
2509
add_builtin ("MethodMatch" , (jl_value_t * )jl_method_match_type );
2561
- add_builtin ("IntrinsicFunction" , (jl_value_t * )jl_intrinsic_type );
2562
2510
add_builtin ("Function" , (jl_value_t * )jl_function_type );
2563
2511
add_builtin ("Builtin" , (jl_value_t * )jl_builtin_type );
2564
2512
add_builtin ("MethodInstance" , (jl_value_t * )jl_method_instance_type );
2565
2513
add_builtin ("CodeInfo" , (jl_value_t * )jl_code_info_type );
2566
2514
add_builtin ("LLVMPtr" , (jl_value_t * )jl_llvmpointer_type );
2567
2515
add_builtin ("Task" , (jl_value_t * )jl_task_type );
2568
- add_builtin ("OpaqueClosure" , (jl_value_t * )jl_opaque_closure_type );
2569
2516
2570
2517
add_builtin ("AddrSpace" , (jl_value_t * )jl_addrspace_type );
2571
2518
add_builtin ("Ref" , (jl_value_t * )jl_ref_type );
0 commit comments