@@ -1120,23 +1120,29 @@ JL_DLLEXPORT jl_value_t *jl_new_bits(jl_value_t *dt, const void *data)
1120
1120
// but will always have the alignment required by the datatype
1121
1121
assert (jl_is_datatype (dt ));
1122
1122
jl_datatype_t * bt = (jl_datatype_t * )dt ;
1123
- size_t nb = jl_datatype_size (bt );
1124
1123
// some types have special pools to minimize allocations
1125
- if (nb == 0 ) return jl_new_struct_uninit (bt ); // returns bt->instance
1126
- if (bt == jl_bool_type ) return (1 & * (int8_t * )data ) ? jl_true : jl_false ;
1127
- if (bt == jl_uint8_type ) return jl_box_uint8 (* (uint8_t * )data );
1128
- if (bt == jl_int64_type ) return jl_box_int64 (* (int64_t * )data );
1129
- if (bt == jl_int32_type ) return jl_box_int32 (* (int32_t * )data );
1130
- if (bt == jl_int8_type ) return jl_box_int8 (* (int8_t * )data );
1131
- if (bt == jl_int16_type ) return jl_box_int16 (* (int16_t * )data );
1132
- if (bt == jl_uint64_type ) return jl_box_uint64 (* (uint64_t * )data );
1133
- if (bt == jl_uint32_type ) return jl_box_uint32 (* (uint32_t * )data );
1134
- if (bt == jl_uint16_type ) return jl_box_uint16 (* (uint16_t * )data );
1135
- if (bt == jl_char_type ) return jl_box_char (* (uint32_t * )data );
1136
-
1137
- assert (!bt -> smalltag );
1124
+ switch (bt -> smalltag ) {
1125
+ case jl_bool_tag : return (1 & * (int8_t * )data ) ? jl_true : jl_false ;
1126
+ case jl_uint8_tag : return jl_box_uint8 (* (uint8_t * )data );
1127
+ case jl_int64_tag : return jl_box_int64 (* (int64_t * )data );
1128
+ case jl_int32_tag : return jl_box_int32 (* (int32_t * )data );
1129
+ case jl_int8_tag : return jl_box_int8 (* (int8_t * )data );
1130
+ case jl_int16_tag : return jl_box_int16 (* (int16_t * )data );
1131
+ case jl_uint64_tag : return jl_box_uint64 (* (uint64_t * )data );
1132
+ case jl_uint32_tag : return jl_box_uint32 (* (uint32_t * )data );
1133
+ case jl_uint16_tag : return jl_box_uint16 (* (uint16_t * )data );
1134
+ case jl_char_tag : return jl_box_char (* (uint32_t * )data );
1135
+ case jl_ssavalue_tag : return jl_box_ssavalue (* (size_t * )data );
1136
+ case jl_slotnumber_tag : return jl_box_slotnumber (* (size_t * )data );
1137
+ }
1138
+
1139
+ size_t nb = jl_datatype_size (bt );
1140
+ if (nb == 0 )
1141
+ return jl_new_struct_uninit (bt ); // returns bt->instance
1138
1142
jl_task_t * ct = jl_current_task ;
1139
1143
jl_value_t * v = jl_gc_alloc (ct -> ptls , nb , bt );
1144
+ if (bt -> smalltag )
1145
+ jl_set_typetagof (v , bt -> smalltag , 0 );
1140
1146
// TODO: make this a memmove_refs if relevant
1141
1147
memcpy (jl_assume_aligned (v , sizeof (void * )), data , nb );
1142
1148
return v ;
@@ -1147,23 +1153,30 @@ JL_DLLEXPORT jl_value_t *jl_atomic_new_bits(jl_value_t *dt, const char *data)
1147
1153
// data must have the required alignment for an atomic of the given size
1148
1154
assert (jl_is_datatype (dt ));
1149
1155
jl_datatype_t * bt = (jl_datatype_t * )dt ;
1150
- size_t nb = jl_datatype_size (bt );
1151
1156
// some types have special pools to minimize allocations
1152
- if (nb == 0 ) return jl_new_struct_uninit (bt ); // returns bt->instance
1153
- if (bt == jl_bool_type ) return (1 & jl_atomic_load ((_Atomic (int8_t )* )data )) ? jl_true : jl_false ;
1154
- if (bt == jl_uint8_type ) return jl_box_uint8 (jl_atomic_load ((_Atomic (uint8_t )* )data ));
1155
- if (bt == jl_int64_type ) return jl_box_int64 (jl_atomic_load ((_Atomic (int64_t )* )data ));
1156
- if (bt == jl_int32_type ) return jl_box_int32 (jl_atomic_load ((_Atomic (int32_t )* )data ));
1157
- if (bt == jl_int8_type ) return jl_box_int8 (jl_atomic_load ((_Atomic (int8_t )* )data ));
1158
- if (bt == jl_int16_type ) return jl_box_int16 (jl_atomic_load ((_Atomic (int16_t )* )data ));
1159
- if (bt == jl_uint64_type ) return jl_box_uint64 (jl_atomic_load ((_Atomic (uint64_t )* )data ));
1160
- if (bt == jl_uint32_type ) return jl_box_uint32 (jl_atomic_load ((_Atomic (uint32_t )* )data ));
1161
- if (bt == jl_uint16_type ) return jl_box_uint16 (jl_atomic_load ((_Atomic (uint16_t )* )data ));
1162
- if (bt == jl_char_type ) return jl_box_char (jl_atomic_load ((_Atomic (uint32_t )* )data ));
1163
-
1164
- assert (!bt -> smalltag );
1157
+ switch (bt -> smalltag ) {
1158
+ case 0 : break ;
1159
+ case jl_bool_tag : return (1 & jl_atomic_load ((_Atomic (int8_t )* )data )) ? jl_true : jl_false ;
1160
+ case jl_uint8_tag : return jl_box_uint8 (jl_atomic_load ((_Atomic (uint8_t )* )data ));
1161
+ case jl_int64_tag : return jl_box_int64 (jl_atomic_load ((_Atomic (int64_t )* )data ));
1162
+ case jl_int32_tag : return jl_box_int32 (jl_atomic_load ((_Atomic (int32_t )* )data ));
1163
+ case jl_int8_tag : return jl_box_int8 (jl_atomic_load ((_Atomic (int8_t )* )data ));
1164
+ case jl_int16_tag : return jl_box_int16 (jl_atomic_load ((_Atomic (int16_t )* )data ));
1165
+ case jl_uint64_tag : return jl_box_uint64 (jl_atomic_load ((_Atomic (uint64_t )* )data ));
1166
+ case jl_uint32_tag : return jl_box_uint32 (jl_atomic_load ((_Atomic (uint32_t )* )data ));
1167
+ case jl_uint16_tag : return jl_box_uint16 (jl_atomic_load ((_Atomic (uint16_t )* )data ));
1168
+ case jl_char_tag : return jl_box_char (jl_atomic_load ((_Atomic (uint32_t )* )data ));
1169
+ case jl_ssavalue_tag : return jl_box_ssavalue (jl_atomic_load ((_Atomic (size_t )* )data ));
1170
+ case jl_slotnumber_tag : return jl_box_slotnumber (jl_atomic_load ((_Atomic (size_t )* )data ));
1171
+ }
1172
+
1173
+ size_t nb = jl_datatype_size (bt );
1174
+ if (nb == 0 )
1175
+ return jl_new_struct_uninit (bt ); // returns bt->instance
1165
1176
jl_task_t * ct = jl_current_task ;
1166
1177
jl_value_t * v = jl_gc_alloc (ct -> ptls , nb , bt );
1178
+ if (bt -> smalltag )
1179
+ jl_set_typetagof (v , bt -> smalltag , 0 );
1167
1180
// data is aligned to the power of two,
1168
1181
// we will write too much of v, but the padding should exist
1169
1182
if (nb == 1 )
@@ -1218,22 +1231,28 @@ JL_DLLEXPORT jl_value_t *jl_atomic_swap_bits(jl_value_t *dt, char *dst, const jl
1218
1231
// dst must have the required alignment for an atomic of the given size
1219
1232
assert (jl_is_datatype (dt ));
1220
1233
jl_datatype_t * bt = (jl_datatype_t * )dt ;
1234
+ if (nb == 0 )
1235
+ return jl_new_struct_uninit (bt ); // returns bt->instance
1221
1236
// some types have special pools to minimize allocations
1222
- if (nb == 0 ) return jl_new_struct_uninit (bt ); // returns bt->instance
1223
- if (bt == jl_bool_type ) return (1 & jl_atomic_exchange ((_Atomic (int8_t )* )dst , 1 & * (int8_t * )src )) ? jl_true : jl_false ;
1224
- if (bt == jl_uint8_type ) return jl_box_uint8 (jl_atomic_exchange ((_Atomic (uint8_t )* )dst , * (int8_t * )src ));
1225
- if (bt == jl_int64_type ) return jl_box_int64 (jl_atomic_exchange ((_Atomic (int64_t )* )dst , * (int64_t * )src ));
1226
- if (bt == jl_int32_type ) return jl_box_int32 (jl_atomic_exchange ((_Atomic (int32_t )* )dst , * (int32_t * )src ));
1227
- if (bt == jl_int8_type ) return jl_box_int8 (jl_atomic_exchange ((_Atomic (int8_t )* )dst , * (int8_t * )src ));
1228
- if (bt == jl_int16_type ) return jl_box_int16 (jl_atomic_exchange ((_Atomic (int16_t )* )dst , * (int16_t * )src ));
1229
- if (bt == jl_uint64_type ) return jl_box_uint64 (jl_atomic_exchange ((_Atomic (uint64_t )* )dst , * (uint64_t * )src ));
1230
- if (bt == jl_uint32_type ) return jl_box_uint32 (jl_atomic_exchange ((_Atomic (uint32_t )* )dst , * (uint32_t * )src ));
1231
- if (bt == jl_uint16_type ) return jl_box_uint16 (jl_atomic_exchange ((_Atomic (uint16_t )* )dst , * (uint16_t * )src ));
1232
- if (bt == jl_char_type ) return jl_box_char (jl_atomic_exchange ((_Atomic (uint32_t )* )dst , * (uint32_t * )src ));
1233
-
1234
- assert (!bt -> smalltag );
1237
+ switch (bt -> smalltag ) {
1238
+ case jl_bool_tag : return (1 & jl_atomic_exchange ((_Atomic (int8_t )* )dst , 1 & * (int8_t * )src )) ? jl_true : jl_false ;
1239
+ case jl_uint8_tag : return jl_box_uint8 (jl_atomic_exchange ((_Atomic (uint8_t )* )dst , * (int8_t * )src ));
1240
+ case jl_int64_tag : return jl_box_int64 (jl_atomic_exchange ((_Atomic (int64_t )* )dst , * (int64_t * )src ));
1241
+ case jl_int32_tag : return jl_box_int32 (jl_atomic_exchange ((_Atomic (int32_t )* )dst , * (int32_t * )src ));
1242
+ case jl_int8_tag : return jl_box_int8 (jl_atomic_exchange ((_Atomic (int8_t )* )dst , * (int8_t * )src ));
1243
+ case jl_int16_tag : return jl_box_int16 (jl_atomic_exchange ((_Atomic (int16_t )* )dst , * (int16_t * )src ));
1244
+ case jl_uint64_tag : return jl_box_uint64 (jl_atomic_exchange ((_Atomic (uint64_t )* )dst , * (uint64_t * )src ));
1245
+ case jl_uint32_tag : return jl_box_uint32 (jl_atomic_exchange ((_Atomic (uint32_t )* )dst , * (uint32_t * )src ));
1246
+ case jl_uint16_tag : return jl_box_uint16 (jl_atomic_exchange ((_Atomic (uint16_t )* )dst , * (uint16_t * )src ));
1247
+ case jl_char_tag : return jl_box_char (jl_atomic_exchange ((_Atomic (uint32_t )* )dst , * (uint32_t * )src ));
1248
+ case jl_ssavalue_tag : return jl_box_ssavalue (jl_atomic_exchange ((_Atomic (size_t )* )dst , * (size_t * )src ));
1249
+ case jl_slotnumber_tag : return jl_box_slotnumber (jl_atomic_exchange ((_Atomic (size_t )* )dst , * (size_t * )src ));
1250
+ }
1251
+
1235
1252
jl_task_t * ct = jl_current_task ;
1236
1253
jl_value_t * v = jl_gc_alloc (ct -> ptls , jl_datatype_size (bt ), bt );
1254
+ if (bt -> smalltag )
1255
+ jl_set_typetagof (v , bt -> smalltag , 0 );
1237
1256
if (nb == 1 )
1238
1257
* (uint8_t * )v = jl_atomic_exchange ((_Atomic (uint8_t )* )dst , * (uint8_t * )src );
1239
1258
else if (nb == 2 )
@@ -1438,10 +1457,11 @@ JL_DLLEXPORT int jl_atomic_storeonce_bits(jl_datatype_t *dt, char *dst, const jl
1438
1457
}
1439
1458
1440
1459
#define PERMBOXN_FUNC (nb ) \
1441
- jl_value_t *jl_permbox##nb(jl_datatype_t *t, uintptr_t tag, uint##nb##_t x) \
1460
+ jl_value_t *jl_permbox##nb(jl_datatype_t *t, uintptr_t tag, uint##nb##_t x) JL_NOTSAFEPOINT \
1442
1461
{ /* n.b. t must be a concrete isbits datatype of the right size */ \
1443
1462
jl_value_t * v = jl_gc_permobj (LLT_ALIGN (nb , sizeof (void * )), t , 0 ); \
1444
- if (tag ) jl_set_typetagof (v , tag , GC_OLD_MARKED ); \
1463
+ assert (tag ); \
1464
+ jl_set_typetagof (v , tag , GC_OLD_MARKED ); \
1445
1465
* (uint ##nb ##_t*)jl_data_ptr(v) = x; \
1446
1466
return v; \
1447
1467
}
@@ -1451,7 +1471,7 @@ PERMBOXN_FUNC(32)
1451
1471
PERMBOXN_FUNC (64 )
1452
1472
1453
1473
#define UNBOX_FUNC (j_type ,c_type ) \
1454
- JL_DLLEXPORT c_type jl_unbox_##j_type(jl_value_t *v) \
1474
+ JL_DLLEXPORT c_type jl_unbox_##j_type(jl_value_t *v) JL_NOTSAFEPOINT \
1455
1475
{ \
1456
1476
assert(jl_is_primitivetype(jl_typeof(v))); \
1457
1477
assert(jl_datatype_size(jl_typeof(v)) == sizeof(c_type)); \
@@ -1487,9 +1507,6 @@ BOX_FUNC(uint8pointer, uint8_t*, jl_box)
1487
1507
1488
1508
#define NBOX_C 1024
1489
1509
1490
- // some shims to support UIBOX_FUNC definition
1491
- #define jl_ssavalue_tag (((uintptr_t)jl_ssavalue_type) >> 4)
1492
- #define jl_slotnumber_tag (((uintptr_t)jl_slotnumber_type) >> 4)
1493
1510
1494
1511
#define SIBOX_FUNC (typ ,c_type ) \
1495
1512
static jl_value_t *boxed_##typ##_cache[NBOX_C]; \
@@ -1551,40 +1568,31 @@ JL_DLLEXPORT jl_value_t *jl_box_uint8(uint8_t x)
1551
1568
return jl_boxed_uint8_cache [x ];
1552
1569
}
1553
1570
1554
- void jl_init_int32_int64_cache (void )
1571
+ void jl_init_box_caches (void )
1555
1572
{
1556
1573
int64_t i ;
1557
- for ( i = 0 ; i < NBOX_C ; i ++ ) {
1574
+ for ( i = 0 ; i < NBOX_C ; i ++ ) {
1558
1575
boxed_int32_cache [i ] = jl_permbox32 (jl_int32_type , jl_int32_tag , i - NBOX_C /2 );
1559
1576
boxed_int64_cache [i ] = jl_permbox64 (jl_int64_type , jl_int64_tag , i - NBOX_C /2 );
1560
1577
boxed_uint16_cache [i ] = jl_permbox16 (jl_uint16_type , jl_uint16_tag , i );
1561
1578
boxed_uint64_cache [i ] = jl_permbox64 (jl_uint64_type , jl_uint64_tag , i );
1562
1579
boxed_uint32_cache [i ] = jl_permbox32 (jl_uint32_type , jl_uint32_tag , i );
1580
+ boxed_int16_cache [i ] = jl_permbox16 (jl_int16_type , jl_int16_tag , i - NBOX_C /2 );
1563
1581
#ifdef _P64
1564
- boxed_ssavalue_cache [i ] = jl_permbox64 (jl_ssavalue_type , 0 , i );
1565
- boxed_slotnumber_cache [i ] = jl_permbox64 (jl_slotnumber_type , 0 , i );
1582
+ boxed_ssavalue_cache [i ] = jl_permbox64 (jl_ssavalue_type , jl_ssavalue_tag , i );
1583
+ boxed_slotnumber_cache [i ] = jl_permbox64 (jl_slotnumber_type , jl_slotnumber_tag , i );
1566
1584
#else
1567
- boxed_ssavalue_cache [i ] = jl_permbox32 (jl_ssavalue_type , 0 , i );
1568
- boxed_slotnumber_cache [i ] = jl_permbox32 (jl_slotnumber_type , 0 , i );
1585
+ boxed_ssavalue_cache [i ] = jl_permbox32 (jl_ssavalue_type , jl_ssavalue_tag , i );
1586
+ boxed_slotnumber_cache [i ] = jl_permbox32 (jl_slotnumber_type , jl_slotnumber_tag , i );
1569
1587
#endif
1570
1588
}
1571
- for (i = 0 ; i < 256 ; i ++ ) {
1572
- jl_boxed_uint8_cache [i ] = jl_permbox8 (jl_uint8_type , jl_uint8_tag , i );
1573
- }
1574
- }
1575
-
1576
- void jl_init_box_caches (void )
1577
- {
1578
- uint32_t i ;
1579
1589
for (i = 0 ; i < 128 ; i ++ ) {
1580
1590
boxed_char_cache [i ] = jl_permbox32 (jl_char_type , jl_char_tag , i << 24 );
1581
1591
}
1582
1592
for (i = 0 ; i < 256 ; i ++ ) {
1593
+ jl_boxed_uint8_cache [i ] = jl_permbox8 (jl_uint8_type , jl_uint8_tag , i );
1583
1594
jl_boxed_int8_cache [i ] = jl_permbox8 (jl_int8_type , jl_int8_tag , i );
1584
1595
}
1585
- for (i = 0 ; i < NBOX_C ; i ++ ) {
1586
- boxed_int16_cache [i ] = jl_permbox16 (jl_int16_type , jl_int16_tag , i - NBOX_C /2 );
1587
- }
1588
1596
}
1589
1597
1590
1598
JL_DLLEXPORT jl_value_t * jl_box_bool (int8_t x )
0 commit comments