@@ -901,20 +901,16 @@ JL_DLLEXPORT jl_value_t *jl_new_structv(jl_datatype_t *type, jl_value_t **args,
901
901
jl_type_error ("new" , (jl_value_t * )jl_datatype_type , (jl_value_t * )type );
902
902
if (type -> ninitialized > na || na > jl_datatype_nfields (type ))
903
903
jl_error ("invalid struct allocation" );
904
- if (type -> instance != NULL ) {
905
- for (size_t i = 0 ; i < na ; i ++ ) {
906
- jl_value_t * ft = jl_field_type (type , i );
907
- if (!jl_isa (args [i ], ft ))
908
- jl_type_error ("new" , ft , args [i ]);
909
- }
910
- return type -> instance ;
911
- }
912
- jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
913
- JL_GC_PUSH1 (& jv );
914
904
for (size_t i = 0 ; i < na ; i ++ ) {
915
905
jl_value_t * ft = jl_field_type (type , i );
916
906
if (!jl_isa (args [i ], ft ))
917
907
jl_type_error ("new" , ft , args [i ]);
908
+ }
909
+ if (type -> instance != NULL )
910
+ return type -> instance ;
911
+ jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
912
+ JL_GC_PUSH1 (& jv );
913
+ for (size_t i = 0 ; i < na ; i ++ ) {
918
914
set_nth_field (type , (void * )jv , i , args [i ]);
919
915
}
920
916
init_struct_tail (type , jv , na );
@@ -946,6 +942,12 @@ JL_DLLEXPORT jl_value_t *jl_new_structt(jl_datatype_t *type, jl_value_t *tup)
946
942
jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
947
943
jl_value_t * fi = NULL ;
948
944
JL_GC_PUSH2 (& jv , & fi );
945
+ if (type -> layout -> npointers > 0 ) {
946
+ // if there are references, zero the space first to prevent the GC
947
+ // from seeing uninitialized references during jl_get_nth_field and jl_isa,
948
+ // which can allocate.
949
+ memset (jl_data_ptr (jv ), 0 , jl_datatype_size (type ));
950
+ }
949
951
for (size_t i = 0 ; i < nargs ; i ++ ) {
950
952
jl_value_t * ft = jl_field_type (type , i );
951
953
fi = jl_get_nth_field (tup , i );
0 commit comments