@@ -1886,34 +1886,32 @@ void jl_binding_deprecation_warning(jl_binding_t *b)
18861886
18871887// For a generally writable binding (checked using jl_check_binding_currently_writable in this world age), check whether
18881888// we can actually write the value `rhs` to it.
1889- jl_value_t * jl_check_binding_assign_value (jl_binding_t * b JL_PROPAGATES_ROOT , jl_module_t * mod , jl_sym_t * var , jl_value_t * rhs JL_MAYBE_UNROOTED )
1889+ jl_value_t * jl_check_binding_assign_value (jl_binding_t * b JL_PROPAGATES_ROOT , jl_module_t * mod , jl_sym_t * var , jl_value_t * rhs JL_MAYBE_UNROOTED , const char * msg )
18901890{
18911891 JL_GC_PUSH1 (& rhs ); // callee-rooted
18921892 jl_binding_partition_t * bpart = jl_get_binding_partition (b , jl_current_task -> world_age );
18931893 enum jl_partition_kind kind = jl_binding_kind (bpart );
18941894 assert (kind == PARTITION_KIND_DECLARED || kind == PARTITION_KIND_GLOBAL );
18951895 jl_value_t * old_ty = kind == PARTITION_KIND_DECLARED ? (jl_value_t * )jl_any_type : bpart -> restriction ;
18961896 JL_GC_PROMISE_ROOTED (old_ty );
1897- if (old_ty != (jl_value_t * )jl_any_type && jl_typeof (rhs ) != old_ty ) {
1898- if (!jl_isa (rhs , old_ty ))
1899- jl_errorf ("cannot assign an incompatible value to the global %s.%s." ,
1900- jl_symbol_name (mod -> name ), jl_symbol_name (var ));
1897+ if (old_ty != (jl_value_t * )jl_any_type && jl_typeof (rhs ) != old_ty && !jl_isa (rhs , old_ty )) {
1898+ jl_type_error_global (msg , b , old_ty , rhs );
19011899 }
19021900 JL_GC_POP ();
19031901 return old_ty ;
19041902}
19051903
19061904JL_DLLEXPORT void jl_checked_assignment (jl_binding_t * b , jl_module_t * mod , jl_sym_t * var , jl_value_t * rhs )
19071905{
1908- if (jl_check_binding_assign_value (b , mod , var , rhs ) != NULL ) {
1906+ if (jl_check_binding_assign_value (b , mod , var , rhs , "setglobal!" ) != NULL ) {
19091907 jl_atomic_store_release (& b -> value , rhs );
19101908 jl_gc_wb (b , rhs );
19111909 }
19121910}
19131911
19141912JL_DLLEXPORT jl_value_t * jl_checked_swap (jl_binding_t * b , jl_module_t * mod , jl_sym_t * var , jl_value_t * rhs )
19151913{
1916- jl_check_binding_assign_value (b , mod , var , rhs );
1914+ jl_check_binding_assign_value (b , mod , var , rhs , "swapglobal!" );
19171915 jl_value_t * old = jl_atomic_exchange (& b -> value , rhs );
19181916 jl_gc_wb (b , rhs );
19191917 if (__unlikely (old == NULL ))
@@ -1923,7 +1921,7 @@ JL_DLLEXPORT jl_value_t *jl_checked_swap(jl_binding_t *b, jl_module_t *mod, jl_s
19231921
19241922JL_DLLEXPORT jl_value_t * jl_checked_replace (jl_binding_t * b , jl_module_t * mod , jl_sym_t * var , jl_value_t * expected , jl_value_t * rhs )
19251923{
1926- jl_value_t * ty = jl_check_binding_assign_value (b , mod , var , rhs );
1924+ jl_value_t * ty = jl_check_binding_assign_value (b , mod , var , rhs , "replaceglobal!" );
19271925 return replace_value (ty , & b -> value , (jl_value_t * )b , expected , rhs , 1 , mod , var );
19281926}
19291927
@@ -1937,12 +1935,12 @@ JL_DLLEXPORT jl_value_t *jl_checked_modify(jl_binding_t *b, jl_module_t *mod, jl
19371935 jl_symbol_name (mod -> name ), jl_symbol_name (var ));
19381936 jl_value_t * ty = bpart -> restriction ;
19391937 JL_GC_PROMISE_ROOTED (ty );
1940- return modify_value (ty , & b -> value , (jl_value_t * )b , op , rhs , 1 , mod , var );
1938+ return modify_value (ty , & b -> value , (jl_value_t * )b , op , rhs , 1 , b , mod , var );
19411939}
19421940
19431941JL_DLLEXPORT jl_value_t * jl_checked_assignonce (jl_binding_t * b , jl_module_t * mod , jl_sym_t * var , jl_value_t * rhs )
19441942{
1945- jl_check_binding_assign_value (b , mod , var , rhs );
1943+ jl_check_binding_assign_value (b , mod , var , rhs , "setglobalonce!" );
19461944 jl_value_t * old = NULL ;
19471945 if (jl_atomic_cmpswap (& b -> value , & old , rhs ))
19481946 jl_gc_wb (b , rhs );
0 commit comments