@@ -1219,8 +1219,8 @@ JL_DLLEXPORT jl_value_t *jl_box_bool(int8_t x)
12191219
12201220JL_DLLEXPORT jl_value_t * jl_new_struct (jl_datatype_t * type , ...)
12211221{
1222- jl_ptls_t ptls = jl_get_ptls_states ();
12231222 if (type -> instance != NULL ) return type -> instance ;
1223+ jl_ptls_t ptls = jl_get_ptls_states ();
12241224 va_list args ;
12251225 size_t nf = jl_datatype_nfields (type );
12261226 va_start (args , type );
@@ -1318,9 +1318,9 @@ JL_DLLEXPORT jl_value_t *jl_new_structt(jl_datatype_t *type, jl_value_t *tup)
13181318
13191319JL_DLLEXPORT jl_value_t * jl_new_struct_uninit (jl_datatype_t * type )
13201320{
1321- jl_ptls_t ptls = jl_get_ptls_states ();
13221321 if (type -> instance != NULL ) return type -> instance ;
13231322 size_t size = jl_datatype_size (type );
1323+ jl_ptls_t ptls = jl_get_ptls_states ();
13241324 jl_value_t * jv = jl_gc_alloc (ptls , size , type );
13251325 if (size > 0 )
13261326 memset (jl_data_ptr (jv ), 0 , size );
@@ -1389,16 +1389,20 @@ JL_DLLEXPORT jl_value_t *jl_get_nth_field(jl_value_t *v, size_t i)
13891389 return ((jl_datatype_t * )ty )-> instance ;
13901390 }
13911391 jl_value_t * r ;
1392- int needlock = (isatomic && jl_datatype_size (ty ) > MAX_ATOMIC_SIZE );
1392+ size_t fsz = jl_datatype_size (ty );
1393+ int needlock = (isatomic && fsz > MAX_ATOMIC_SIZE );
13931394 if (isatomic && !needlock ) {
13941395 r = jl_atomic_new_bits (ty , (char * )v + offs );
13951396 }
1397+ else if (needlock ) {
1398+ jl_ptls_t ptls = jl_get_ptls_states ();
1399+ r = jl_gc_alloc (ptls , fsz , ty );
1400+ jl_lock_value (v );
1401+ memcpy ((char * )r , (char * )v + offs , fsz );
1402+ jl_unlock_value (v );
1403+ }
13961404 else {
1397- if (needlock )
1398- jl_lock_value (v );
13991405 r = jl_new_bits (ty , (char * )v + offs );
1400- if (needlock )
1401- jl_unlock_value (v );
14021406 }
14031407 return undefref_check ((jl_datatype_t * )ty , r );
14041408}
@@ -1484,12 +1488,13 @@ void set_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_value_t *rhs,
14841488 if (hasptr )
14851489 jl_gc_multi_wb (v , rhs ); // rhs is immutable
14861490 }
1491+ else if (needlock ) {
1492+ jl_lock_value (v );
1493+ memcpy ((char * )v + offs , (char * )rhs , fsz );
1494+ jl_unlock_value (v );
1495+ }
14871496 else {
1488- if (needlock )
1489- jl_lock_value (v );
14901497 memassign_safe (hasptr , v , (char * )v + offs , rhs , fsz );
1491- if (needlock )
1492- jl_unlock_value (v );
14931498 }
14941499 }
14951500}
@@ -1536,13 +1541,21 @@ jl_value_t *swap_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_value_
15361541 jl_gc_multi_wb (v , rhs ); // rhs is immutable
15371542 }
15381543 else {
1539- if (needlock )
1544+ if (needlock ) {
1545+ jl_ptls_t ptls = jl_get_ptls_states ();
1546+ r = jl_gc_alloc (ptls , fsz , ty );
15401547 jl_lock_value (v );
1541- if (!isunion )
1542- r = undefref_check ((jl_datatype_t * )ty , jl_new_bits (ty , (char * )v + offs ));
1543- memassign_safe (hasptr , v , (char * )v + offs , rhs , fsz );
1544- if (needlock )
1548+ memcpy ((char * )r , (char * )v + offs , fsz );
1549+ memcpy ((char * )v + offs , (char * )rhs , fsz );
15451550 jl_unlock_value (v );
1551+ }
1552+ else {
1553+ if (!isunion )
1554+ r = jl_new_bits (ty , (char * )v + offs );
1555+ memassign_safe (hasptr , v , (char * )v + offs , rhs , fsz );
1556+ }
1557+ if (needlock || !isunion )
1558+ r = undefref_check ((jl_datatype_t * )ty , r );
15461559 }
15471560 }
15481561 if (__unlikely (r == NULL ))
@@ -1610,16 +1623,18 @@ jl_value_t *modify_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_valu
16101623 if (jl_is_datatype_singleton ((jl_datatype_t * )yty ))
16111624 break ;
16121625 }
1626+ fsz = jl_datatype_size ((jl_datatype_t * )yty ); // need to shrink-wrap the final copy
1627+ }
1628+ else {
1629+ assert (yty == ty && rty == ty );
16131630 }
1614- fsz = jl_datatype_size ((jl_datatype_t * )yty ); // need to shrink-wrap the final copy
16151631 memassign_safe (hasptr , v , (char * )v + offs , y , fsz );
16161632 }
1617- if (!success )
1618- r = jl_new_bits (ty , (char * )v + offs );
16191633 if (needlock )
16201634 jl_unlock_value (v );
16211635 if (success )
16221636 break ;
1637+ r = jl_get_nth_field (v , i );
16231638 }
16241639 }
16251640 args [0 ] = r ;
@@ -1658,18 +1673,20 @@ jl_value_t *cmpswap_nth_field(jl_datatype_t *st, jl_value_t *v, size_t i, jl_val
16581673 else {
16591674 int hasptr ;
16601675 int isunion = jl_is_uniontype (ty );
1676+ int needlock ;
1677+ jl_value_t * rty = ty ;
1678+ size_t fsz ;
16611679 if (isunion ) {
16621680 assert (!isatomic );
16631681 hasptr = 0 ;
1682+ needlock = 0 ;
1683+ isatomic = 0 ; // this makes GCC happy
16641684 }
16651685 else {
16661686 hasptr = ((jl_datatype_t * )ty )-> layout -> npointers > 0 ;
1667- }
1668- jl_value_t * rty = ty ;
1669- size_t fsz ;
1670- if (!isunion )
16711687 fsz = jl_datatype_size ((jl_datatype_t * )rty ); // need to shrink-wrap the final copy
1672- int needlock = (isatomic && fsz > MAX_ATOMIC_SIZE );
1688+ needlock = (isatomic && fsz > MAX_ATOMIC_SIZE );
1689+ }
16731690 if (isatomic && !needlock ) {
16741691 r = jl_atomic_cmpswap_bits ((jl_datatype_t * )rty , (char * )v + offs , r , rhs , fsz );
16751692 int success = * ((uint8_t * )r + fsz );
0 commit comments