@@ -1655,6 +1655,44 @@ JL_CALLABLE(jl_f__equiv_typedef)
1655
1655
return equiv_type (args [0 ], args [1 ]) ? jl_true : jl_false ;
1656
1656
}
1657
1657
1658
+ JL_CALLABLE (jl_f_get_binding_type )
1659
+ {
1660
+ JL_NARGS (get_binding_type , 2 , 2 );
1661
+ JL_TYPECHK (get_binding_type , module , args [0 ]);
1662
+ JL_TYPECHK (get_binding_type , symbol , args [1 ]);
1663
+ jl_module_t * mod = (jl_module_t * )args [0 ];
1664
+ jl_sym_t * sym = (jl_sym_t * )args [1 ];
1665
+ jl_value_t * ty = jl_binding_type (mod , sym );
1666
+ if (ty == (jl_value_t * )jl_nothing ) {
1667
+ jl_binding_t * b = jl_get_binding_wr (mod , sym , 0 );
1668
+ if (b ) {
1669
+ jl_value_t * old_ty = NULL ;
1670
+ jl_atomic_cmpswap_relaxed (& b -> ty , & old_ty , (jl_value_t * )jl_any_type );
1671
+ return jl_atomic_load_relaxed (& b -> ty );
1672
+ }
1673
+ return (jl_value_t * )jl_any_type ;
1674
+ }
1675
+ return ty ;
1676
+ }
1677
+
1678
+ JL_CALLABLE (jl_f_set_binding_type )
1679
+ {
1680
+ JL_NARGS (set_binding_type !, 2 , 3 );
1681
+ JL_TYPECHK (set_binding_type !, module , args [0 ]);
1682
+ JL_TYPECHK (set_binding_type !, symbol , args [1 ]);
1683
+ jl_value_t * ty = nargs == 2 ? (jl_value_t * )jl_any_type : args [2 ];
1684
+ JL_TYPECHK (set_binding_type !, type , ty );
1685
+ jl_binding_t * b = jl_get_binding_wr ((jl_module_t * )args [0 ], (jl_sym_t * )args [1 ], 1 );
1686
+ jl_value_t * old_ty = NULL ;
1687
+ if (!jl_atomic_cmpswap_relaxed (& b -> ty , & old_ty , ty ) && ty != old_ty ) {
1688
+ if (nargs == 2 )
1689
+ return jl_nothing ;
1690
+ jl_errorf ("cannot set type for global %s. It already has a value or is already set to a different type." ,
1691
+ jl_symbol_name (b -> name ));
1692
+ }
1693
+ return jl_nothing ;
1694
+ }
1695
+
1658
1696
// IntrinsicFunctions ---------------------------------------------------------
1659
1697
1660
1698
static void (* runtime_fp [num_intrinsics ])(void );
@@ -1834,6 +1872,8 @@ void jl_init_primitives(void) JL_GC_DISABLED
1834
1872
add_builtin_func ("_setsuper!" , jl_f__setsuper );
1835
1873
jl_builtin__typebody = add_builtin_func ("_typebody!" , jl_f__typebody );
1836
1874
add_builtin_func ("_equiv_typedef" , jl_f__equiv_typedef );
1875
+ add_builtin_func ("get_binding_type" , jl_f_get_binding_type );
1876
+ add_builtin_func ("set_binding_type!" , jl_f_set_binding_type );
1837
1877
1838
1878
// builtin types
1839
1879
add_builtin ("Any" , (jl_value_t * )jl_any_type );
0 commit comments