@@ -1789,7 +1789,7 @@ JL_DLLEXPORT jl_value_t *jl_get_nth_field_checked(jl_value_t *v, size_t i)
17891789 return r ;
17901790}
17911791
1792- void set_nth_field (jl_datatype_t * st , jl_value_t * v , size_t i , jl_value_t * rhs , int isatomic ) JL_NOTSAFEPOINT
1792+ inline void set_nth_field (jl_datatype_t * st , jl_value_t * v , size_t i , jl_value_t * rhs , int isatomic ) JL_NOTSAFEPOINT
17931793{
17941794 size_t offs = jl_field_offset (st , i );
17951795 if (rhs == NULL ) { // TODO: this should be invalid, but it happens frequently in ircode.c
@@ -1839,7 +1839,7 @@ void set_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_value_t *rhs,
18391839 }
18401840}
18411841
1842- jl_value_t * swap_bits (jl_value_t * ty , char * v , uint8_t * psel , jl_value_t * parent , jl_value_t * rhs , enum atomic_kind isatomic )
1842+ inline jl_value_t * swap_bits (jl_value_t * ty , char * v , uint8_t * psel , jl_value_t * parent , jl_value_t * rhs , enum atomic_kind isatomic )
18431843{
18441844 jl_value_t * rty = jl_typeof (rhs );
18451845 int hasptr ;
@@ -1913,20 +1913,26 @@ jl_value_t *swap_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_value_
19131913 }
19141914}
19151915
1916- jl_value_t * modify_value (jl_value_t * ty , _Atomic (jl_value_t * ) * p , jl_value_t * parent , jl_value_t * op , jl_value_t * rhs , int isatomic )
1916+ inline jl_value_t * modify_value (jl_value_t * ty , _Atomic (jl_value_t * ) * p , jl_value_t * parent , jl_value_t * op , jl_value_t * rhs , int isatomic , jl_module_t * mod , jl_sym_t * name )
19171917{
19181918 jl_value_t * r = isatomic ? jl_atomic_load (p ) : jl_atomic_load_relaxed (p );
1919- if (__unlikely (r == NULL ))
1919+ if (__unlikely (r == NULL )) {
1920+ if (mod && name )
1921+ jl_undefined_var_error (name , (jl_value_t * )mod );
19201922 jl_throw (jl_undefref_exception );
1923+ }
19211924 jl_value_t * * args ;
19221925 JL_GC_PUSHARGS (args , 2 );
19231926 args [0 ] = r ;
19241927 while (1 ) {
19251928 args [1 ] = rhs ;
19261929 jl_value_t * y = jl_apply_generic (op , args , 2 );
19271930 args [1 ] = y ;
1928- if (!jl_isa (y , ty ))
1929- jl_type_error ("modifyfield!" , ty , y );
1931+ if (!jl_isa (y , ty )) {
1932+ if (mod && name )
1933+ jl_errorf ("cannot assign an incompatible value to the global %s.%s." , jl_symbol_name (mod -> name ), jl_symbol_name (name ));
1934+ jl_type_error (jl_is_genericmemory (parent ) ? "memoryrefmodify!" : "modifyfield!" , ty , y );
1935+ }
19301936 if (isatomic ? jl_atomic_cmpswap (p , & r , y ) : jl_atomic_cmpswap_release (p , & r , y )) {
19311937 jl_gc_wb (parent , y );
19321938 break ;
@@ -1943,7 +1949,7 @@ jl_value_t *modify_value(jl_value_t *ty, _Atomic(jl_value_t*) *p, jl_value_t *pa
19431949 return args [0 ];
19441950}
19451951
1946- jl_value_t * modify_bits (jl_value_t * ty , char * p , uint8_t * psel , jl_value_t * parent , jl_value_t * op , jl_value_t * rhs , enum atomic_kind isatomic )
1952+ inline jl_value_t * modify_bits (jl_value_t * ty , char * p , uint8_t * psel , jl_value_t * parent , jl_value_t * op , jl_value_t * rhs , enum atomic_kind isatomic )
19471953{
19481954 int hasptr ;
19491955 int isunion = psel != NULL ;
@@ -1981,8 +1987,9 @@ jl_value_t *modify_bits(jl_value_t *ty, char *p, uint8_t *psel, jl_value_t *pare
19811987 args [1 ] = rhs ;
19821988 jl_value_t * y = jl_apply_generic (op , args , 2 );
19831989 args [1 ] = y ;
1984- if (!jl_isa (y , ty ))
1985- jl_type_error ("modifyfield!" , ty , y );
1990+ if (!jl_isa (y , ty )) {
1991+ jl_type_error (jl_is_genericmemory (parent ) ? "memoryrefmodify!" : "modifyfield!" , ty , y );
1992+ }
19861993 jl_value_t * yty = jl_typeof (y );
19871994 if (isatomic && !needlock ) {
19881995 assert (yty == rty );
@@ -2039,15 +2046,15 @@ jl_value_t *modify_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_valu
20392046 jl_value_t * ty = jl_field_type_concrete (st , i );
20402047 char * p = (char * )v + offs ;
20412048 if (jl_field_isptr (st , i )) {
2042- return modify_value (ty , (_Atomic (jl_value_t * )* )p , v , op , rhs , isatomic );
2049+ return modify_value (ty , (_Atomic (jl_value_t * )* )p , v , op , rhs , isatomic , NULL , NULL );
20432050 }
20442051 else {
20452052 uint8_t * psel = jl_is_uniontype (ty ) ? (uint8_t * )& p [jl_field_size (st , i ) - 1 ] : NULL ;
20462053 return modify_bits (ty , p , psel , v , op , rhs , isatomic ? isatomic_object : isatomic_none );
20472054 }
20482055}
20492056
2050- jl_value_t * replace_value (jl_value_t * ty , _Atomic (jl_value_t * ) * p , jl_value_t * parent , jl_value_t * expected , jl_value_t * rhs , int isatomic )
2057+ inline jl_value_t * replace_value (jl_value_t * ty , _Atomic (jl_value_t * ) * p , jl_value_t * parent , jl_value_t * expected , jl_value_t * rhs , int isatomic , jl_module_t * mod , jl_sym_t * name )
20512058{
20522059 jl_datatype_t * rettyp = jl_apply_cmpswap_type (ty );
20532060 JL_GC_PROMISE_ROOTED (rettyp ); // (JL_ALWAYS_LEAFTYPE)
@@ -2057,8 +2064,11 @@ jl_value_t *replace_value(jl_value_t *ty, _Atomic(jl_value_t*) *p, jl_value_t *p
20572064 success = isatomic ? jl_atomic_cmpswap (p , & r , rhs ) : jl_atomic_cmpswap_release (p , & r , rhs );
20582065 if (success )
20592066 jl_gc_wb (parent , rhs );
2060- if (__unlikely (r == NULL ))
2067+ if (__unlikely (r == NULL )) {
2068+ if (mod && name )
2069+ jl_undefined_var_error (name , (jl_value_t * )mod );
20612070 jl_throw (jl_undefref_exception );
2071+ }
20622072 if (success || !jl_egal (r , expected ))
20632073 break ;
20642074 }
@@ -2068,7 +2078,7 @@ jl_value_t *replace_value(jl_value_t *ty, _Atomic(jl_value_t*) *p, jl_value_t *p
20682078 return r ;
20692079}
20702080
2071- jl_value_t * replace_bits (jl_value_t * ty , char * p , uint8_t * psel , jl_value_t * parent , jl_value_t * expected , jl_value_t * rhs , enum atomic_kind isatomic )
2081+ inline jl_value_t * replace_bits (jl_value_t * ty , char * p , uint8_t * psel , jl_value_t * parent , jl_value_t * expected , jl_value_t * rhs , enum atomic_kind isatomic )
20722082{
20732083 jl_datatype_t * rettyp = jl_apply_cmpswap_type (ty );
20742084 JL_GC_PROMISE_ROOTED (rettyp ); // (JL_ALWAYS_LEAFTYPE)
@@ -2144,7 +2154,7 @@ jl_value_t *replace_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_val
21442154 size_t offs = jl_field_offset (st , i );
21452155 char * p = (char * )v + offs ;
21462156 if (jl_field_isptr (st , i )) {
2147- return replace_value (ty , (_Atomic (jl_value_t * )* )p , v , expected , rhs , isatomic );
2157+ return replace_value (ty , (_Atomic (jl_value_t * )* )p , v , expected , rhs , isatomic , NULL , NULL );
21482158 }
21492159 else {
21502160 size_t fsz = jl_field_size (st , i );
@@ -2154,7 +2164,7 @@ jl_value_t *replace_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_val
21542164 }
21552165}
21562166
2157- int setonce_bits (jl_datatype_t * rty , char * p , jl_value_t * parent , jl_value_t * rhs , enum atomic_kind isatomic )
2167+ inline int setonce_bits (jl_datatype_t * rty , char * p , jl_value_t * parent , jl_value_t * rhs , enum atomic_kind isatomic )
21582168{
21592169 size_t fsz = jl_datatype_size ((jl_datatype_t * )rty ); // need to shrink-wrap the final copy
21602170 assert (rty -> layout -> first_ptr >= 0 );
0 commit comments