@@ -1250,6 +1250,27 @@ JL_CALLABLE(jl_f__setsuper)
12501250
12511251void jl_reinstantiate_inner_types (jl_datatype_t * t );
12521252
1253+ static int equiv_field_types (jl_value_t * old , jl_value_t * ft )
1254+ {
1255+ size_t nf = jl_svec_len (ft );
1256+ if (jl_svec_len (old ) != nf )
1257+ return 0 ;
1258+ size_t i ;
1259+ for (i = 0 ; i < nf ; i ++ ) {
1260+ jl_value_t * ta = jl_svecref (old , i );
1261+ jl_value_t * tb = jl_svecref (ft , i );
1262+ if (jl_has_free_typevars (ta )) {
1263+ if (!jl_has_free_typevars (tb ) || !jl_egal (ta , tb ))
1264+ return 0 ;
1265+ }
1266+ else if (jl_has_free_typevars (tb ) || jl_typeof (ta ) != jl_typeof (tb ) ||
1267+ !jl_types_equal (ta , tb )) {
1268+ return 0 ;
1269+ }
1270+ }
1271+ return 1 ;
1272+ }
1273+
12531274JL_CALLABLE (jl_f__typebody )
12541275{
12551276 JL_NARGS (_typebody !, 1 , 2 );
@@ -1258,16 +1279,23 @@ JL_CALLABLE(jl_f__typebody)
12581279 if (nargs == 2 ) {
12591280 jl_value_t * ft = args [1 ];
12601281 JL_TYPECHK (_typebody !, simplevector , ft );
1261- dt -> types = (jl_svec_t * )ft ;
1262- jl_gc_wb (dt , ft );
1263- for (size_t i = 0 ; i < jl_svec_len (dt -> types ); i ++ ) {
1264- jl_value_t * elt = jl_svecref (dt -> types , i );
1282+ size_t nf = jl_svec_len (ft );
1283+ for (size_t i = 0 ; i < nf ; i ++ ) {
1284+ jl_value_t * elt = jl_svecref (ft , i );
12651285 if ((!jl_is_type (elt ) && !jl_is_typevar (elt )) || jl_is_vararg_type (elt )) {
12661286 jl_type_error_rt (jl_symbol_name (dt -> name -> name ),
12671287 "type definition" ,
12681288 (jl_value_t * )jl_type_type , elt );
12691289 }
12701290 }
1291+ if (dt -> types != NULL ) {
1292+ if (!equiv_field_types ((jl_value_t * )dt -> types , ft ))
1293+ jl_errorf ("invalid redefinition of type %s" , jl_symbol_name (dt -> name -> name ));
1294+ }
1295+ else {
1296+ dt -> types = (jl_svec_t * )ft ;
1297+ jl_gc_wb (dt , ft );
1298+ }
12711299 }
12721300
12731301 JL_TRY {
@@ -1294,15 +1322,13 @@ static int equiv_type(jl_value_t *ta, jl_value_t *tb)
12941322 dta -> name -> name == dtb -> name -> name &&
12951323 dta -> abstract == dtb -> abstract &&
12961324 dta -> mutabl == dtb -> mutabl &&
1297- dta -> size == dtb -> size &&
1325+ ( jl_svec_len ( jl_field_names ( dta )) != 0 || dta -> size == dtb -> size ) &&
12981326 dta -> ninitialized == dtb -> ninitialized &&
12991327 jl_egal ((jl_value_t * )jl_field_names (dta ), (jl_value_t * )jl_field_names (dtb )) &&
1300- jl_nparams (dta ) == jl_nparams (dtb ) &&
1301- jl_svec_len (dta -> types ) == jl_svec_len (dtb -> types )))
1328+ jl_nparams (dta ) == jl_nparams (dtb )))
13021329 return 0 ;
13031330 jl_value_t * a = NULL , * b = NULL ;
13041331 int ok = 1 ;
1305- size_t i , nf = jl_svec_len (dta -> types );
13061332 JL_GC_PUSH2 (& a , & b );
13071333 a = jl_rewrap_unionall ((jl_value_t * )dta -> super , dta -> name -> wrapper );
13081334 b = jl_rewrap_unionall ((jl_value_t * )dtb -> super , dtb -> name -> wrapper );
@@ -1328,21 +1354,6 @@ static int equiv_type(jl_value_t *ta, jl_value_t *tb)
13281354 a = jl_instantiate_unionall (ua , (jl_value_t * )ub -> var );
13291355 b = ub -> body ;
13301356 }
1331- assert (jl_is_datatype (a ) && jl_is_datatype (b ));
1332- a = (jl_value_t * )jl_get_fieldtypes ((jl_datatype_t * )a );
1333- b = (jl_value_t * )jl_get_fieldtypes ((jl_datatype_t * )b );
1334- for (i = 0 ; i < nf ; i ++ ) {
1335- jl_value_t * ta = jl_svecref (a , i );
1336- jl_value_t * tb = jl_svecref (b , i );
1337- if (jl_has_free_typevars (ta )) {
1338- if (!jl_has_free_typevars (tb ) || !jl_egal (ta , tb ))
1339- goto no ;
1340- }
1341- else if (jl_has_free_typevars (tb ) || jl_typeof (ta ) != jl_typeof (tb ) ||
1342- !jl_types_equal (ta , tb )) {
1343- goto no ;
1344- }
1345- }
13461357 JL_GC_POP ();
13471358 return 1 ;
13481359 no :
0 commit comments