@@ -1181,6 +1181,188 @@ JL_CALLABLE(jl_f_arrayset)
1181
1181
return args [1 ];
1182
1182
}
1183
1183
1184
+ // type definition ------------------------------------------------------------
1185
+
1186
+ JL_CALLABLE (jl_f__structtype )
1187
+ {
1188
+ JL_NARGS (_structtype , 6 , 6 );
1189
+ JL_TYPECHK (_structtype , module , args [0 ]);
1190
+ JL_TYPECHK (_structtype , symbol , args [1 ]);
1191
+ JL_TYPECHK (_structtype , simplevector , args [2 ]);
1192
+ JL_TYPECHK (_structtype , simplevector , args [3 ]);
1193
+ JL_TYPECHK (_structtype , bool , args [4 ]);
1194
+ JL_TYPECHK (_structtype , long , args [5 ]);
1195
+ jl_value_t * fieldnames = args [3 ];
1196
+ jl_datatype_t * dt = NULL ;
1197
+ dt = jl_new_datatype ((jl_sym_t * )args [1 ], (jl_module_t * )args [0 ], NULL , (jl_svec_t * )args [2 ],
1198
+ (jl_svec_t * )fieldnames , NULL ,
1199
+ 0 , args [4 ]== jl_true ? 1 : 0 , jl_unbox_long (args [5 ]));
1200
+ return dt -> name -> wrapper ;
1201
+ }
1202
+
1203
+ JL_CALLABLE (jl_f__abstracttype )
1204
+ {
1205
+ JL_NARGS (_abstracttype , 3 , 3 );
1206
+ JL_TYPECHK (_abstracttype , module , args [0 ]);
1207
+ JL_TYPECHK (_abstracttype , symbol , args [1 ]);
1208
+ JL_TYPECHK (_abstracttype , simplevector , args [2 ]);
1209
+ jl_datatype_t * dt = jl_new_abstracttype (args [1 ], (jl_module_t * )args [0 ], NULL , (jl_svec_t * )args [2 ]);
1210
+ return dt -> name -> wrapper ;
1211
+ }
1212
+
1213
+ JL_CALLABLE (jl_f__primitivetype )
1214
+ {
1215
+ JL_NARGS (_primitivetype , 4 , 4 );
1216
+ JL_TYPECHK (_primitivetype , module , args [0 ]);
1217
+ JL_TYPECHK (_primitivetype , symbol , args [1 ]);
1218
+ JL_TYPECHK (_primitivetype , simplevector , args [2 ]);
1219
+ jl_sym_t * name = (jl_sym_t * )args [1 ];
1220
+ jl_value_t * vnb = args [3 ];
1221
+ if (!jl_is_long (vnb ))
1222
+ jl_errorf ("invalid declaration of primitive type %s" ,
1223
+ jl_symbol_name ((jl_sym_t * )name ));
1224
+ ssize_t nb = jl_unbox_long (vnb );
1225
+ if (nb < 1 || nb >= (1 << 23 ) || (nb & 7 ) != 0 )
1226
+ jl_errorf ("invalid number of bits in primitive type %s" ,
1227
+ jl_symbol_name ((jl_sym_t * )name ));
1228
+ jl_datatype_t * dt = jl_new_primitivetype (args [1 ], (jl_module_t * )args [0 ], NULL , (jl_svec_t * )args [2 ], nb );
1229
+ return dt -> name -> wrapper ;
1230
+ }
1231
+
1232
+ void jl_set_datatype_super (jl_datatype_t * tt , jl_value_t * super )
1233
+ {
1234
+ if (!jl_is_datatype (super ) || !jl_is_abstracttype (super ) ||
1235
+ tt -> super != NULL ||
1236
+ tt -> name == ((jl_datatype_t * )super )-> name ||
1237
+ jl_subtype (super , (jl_value_t * )jl_vararg_type ) ||
1238
+ jl_is_tuple_type (super ) ||
1239
+ jl_is_namedtuple_type (super ) ||
1240
+ jl_subtype (super , (jl_value_t * )jl_type_type ) ||
1241
+ jl_subtype (super , (jl_value_t * )jl_builtin_type )) {
1242
+ jl_errorf ("invalid subtyping in definition of %s" ,
1243
+ jl_symbol_name (tt -> name -> name ));
1244
+ }
1245
+ tt -> super = (jl_datatype_t * )super ;
1246
+ jl_gc_wb (tt , tt -> super );
1247
+ }
1248
+
1249
+ JL_CALLABLE (jl_f__setsuper )
1250
+ {
1251
+ JL_NARGS (_setsuper !, 2 , 2 );
1252
+ jl_datatype_t * dt = (jl_datatype_t * )jl_unwrap_unionall (args [0 ]);
1253
+ JL_TYPECHK (_setsuper !, datatype , (jl_value_t * )dt );
1254
+ jl_set_datatype_super (dt , args [1 ]);
1255
+ return jl_nothing ;
1256
+ }
1257
+
1258
+ void jl_reinstantiate_inner_types (jl_datatype_t * t );
1259
+
1260
+ JL_CALLABLE (jl_f__typebody )
1261
+ {
1262
+ JL_NARGS (_typebody !, 1 , 2 );
1263
+ jl_datatype_t * dt = (jl_datatype_t * )jl_unwrap_unionall (args [0 ]);
1264
+ JL_TYPECHK (_typebody !, datatype , (jl_value_t * )dt );
1265
+ if (nargs == 2 ) {
1266
+ jl_value_t * ft = args [1 ];
1267
+ JL_TYPECHK (_typebody !, simplevector , ft );
1268
+ dt -> types = (jl_svec_t * )ft ;
1269
+ jl_gc_wb (dt , ft );
1270
+ for (size_t i = 0 ; i < jl_svec_len (dt -> types ); i ++ ) {
1271
+ jl_value_t * elt = jl_svecref (dt -> types , i );
1272
+ if ((!jl_is_type (elt ) && !jl_is_typevar (elt )) || jl_is_vararg_type (elt )) {
1273
+ jl_type_error_rt (jl_symbol_name (dt -> name -> name ),
1274
+ "type definition" ,
1275
+ (jl_value_t * )jl_type_type , elt );
1276
+ }
1277
+ }
1278
+ }
1279
+
1280
+ JL_TRY {
1281
+ jl_reinstantiate_inner_types (dt );
1282
+ }
1283
+ JL_CATCH {
1284
+ dt -> name -> partial = NULL ;
1285
+ jl_rethrow ();
1286
+ }
1287
+
1288
+ if (jl_is_structtype (dt ))
1289
+ jl_compute_field_offsets (dt );
1290
+ return jl_nothing ;
1291
+ }
1292
+
1293
+ // this is a heuristic for allowing "redefining" a type to something identical
1294
+ static int equiv_type (jl_value_t * ta , jl_value_t * tb )
1295
+ {
1296
+ jl_datatype_t * dta = (jl_datatype_t * )jl_unwrap_unionall (ta );
1297
+ if (!jl_is_datatype (dta ))
1298
+ return 0 ;
1299
+ jl_datatype_t * dtb = (jl_datatype_t * )jl_unwrap_unionall (tb );
1300
+ if (!(jl_typeof (dta ) == jl_typeof (dtb ) &&
1301
+ dta -> name -> name == dtb -> name -> name &&
1302
+ dta -> abstract == dtb -> abstract &&
1303
+ dta -> mutabl == dtb -> mutabl &&
1304
+ dta -> size == dtb -> size &&
1305
+ dta -> ninitialized == dtb -> ninitialized &&
1306
+ jl_egal ((jl_value_t * )jl_field_names (dta ), (jl_value_t * )jl_field_names (dtb )) &&
1307
+ jl_nparams (dta ) == jl_nparams (dtb ) &&
1308
+ jl_svec_len (dta -> types ) == jl_svec_len (dtb -> types )))
1309
+ return 0 ;
1310
+ jl_value_t * a = NULL , * b = NULL ;
1311
+ int ok = 1 ;
1312
+ size_t i , nf = jl_svec_len (dta -> types );
1313
+ JL_GC_PUSH2 (& a , & b );
1314
+ a = jl_rewrap_unionall ((jl_value_t * )dta -> super , dta -> name -> wrapper );
1315
+ b = jl_rewrap_unionall ((jl_value_t * )dtb -> super , dtb -> name -> wrapper );
1316
+ if (!jl_types_equal (a , b ))
1317
+ goto no ;
1318
+ JL_TRY {
1319
+ a = jl_apply_type (dtb -> name -> wrapper , jl_svec_data (dta -> parameters ), jl_nparams (dta ));
1320
+ }
1321
+ JL_CATCH {
1322
+ ok = 0 ;
1323
+ }
1324
+ if (!ok )
1325
+ goto no ;
1326
+ assert (jl_is_datatype (a ));
1327
+ a = dta -> name -> wrapper ;
1328
+ b = dtb -> name -> wrapper ;
1329
+ while (jl_is_unionall (a )) {
1330
+ jl_unionall_t * ua = (jl_unionall_t * )a ;
1331
+ jl_unionall_t * ub = (jl_unionall_t * )b ;
1332
+ if (!jl_egal (ua -> var -> lb , ub -> var -> lb ) || !jl_egal (ua -> var -> ub , ub -> var -> ub ) ||
1333
+ ua -> var -> name != ub -> var -> name )
1334
+ goto no ;
1335
+ a = jl_instantiate_unionall (ua , (jl_value_t * )ub -> var );
1336
+ b = ub -> body ;
1337
+ }
1338
+ assert (jl_is_datatype (a ) && jl_is_datatype (b ));
1339
+ a = (jl_value_t * )jl_get_fieldtypes ((jl_datatype_t * )a );
1340
+ b = (jl_value_t * )jl_get_fieldtypes ((jl_datatype_t * )b );
1341
+ for (i = 0 ; i < nf ; i ++ ) {
1342
+ jl_value_t * ta = jl_svecref (a , i );
1343
+ jl_value_t * tb = jl_svecref (b , i );
1344
+ if (jl_has_free_typevars (ta )) {
1345
+ if (!jl_has_free_typevars (tb ) || !jl_egal (ta , tb ))
1346
+ goto no ;
1347
+ }
1348
+ else if (jl_has_free_typevars (tb ) || jl_typeof (ta ) != jl_typeof (tb ) ||
1349
+ !jl_types_equal (ta , tb )) {
1350
+ goto no ;
1351
+ }
1352
+ }
1353
+ JL_GC_POP ();
1354
+ return 1 ;
1355
+ no :
1356
+ JL_GC_POP ();
1357
+ return 0 ;
1358
+ }
1359
+
1360
+ JL_CALLABLE (jl_f__equiv_typedef )
1361
+ {
1362
+ JL_NARGS (_equiv_typedef , 2 , 2 );
1363
+ return equiv_type (args [0 ], args [1 ]) ? jl_true : jl_false ;
1364
+ }
1365
+
1184
1366
// IntrinsicFunctions ---------------------------------------------------------
1185
1367
1186
1368
static void (* runtime_fp [num_intrinsics ])(void );
@@ -1343,6 +1525,12 @@ void jl_init_primitives(void) JL_GC_DISABLED
1343
1525
add_builtin_func ("_apply_pure" , jl_f__apply_pure );
1344
1526
add_builtin_func ("_apply_latest" , jl_f__apply_latest );
1345
1527
add_builtin_func ("_typevar" , jl_f__typevar );
1528
+ add_builtin_func ("_structtype" , jl_f__structtype );
1529
+ add_builtin_func ("_abstracttype" , jl_f__abstracttype );
1530
+ add_builtin_func ("_primitivetype" , jl_f__primitivetype );
1531
+ add_builtin_func ("_setsuper!" , jl_f__setsuper );
1532
+ jl_builtin__typebody = add_builtin_func ("_typebody!" , jl_f__typebody );
1533
+ add_builtin_func ("_equiv_typedef" , jl_f__equiv_typedef );
1346
1534
1347
1535
// builtin types
1348
1536
add_builtin ("Any" , (jl_value_t * )jl_any_type );
0 commit comments