@@ -897,7 +897,7 @@ JL_DLLEXPORT jl_value_t *jl_new_struct(jl_datatype_t *type, ...)
897897 va_start (args , type );
898898 jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
899899 for (size_t i = 0 ; i < nf ; i ++ ) {
900- jl_set_nth_field ( jv , i , va_arg (args , jl_value_t * ));
900+ set_nth_field ( type , ( void * ) jv , i , va_arg (args , jl_value_t * ));
901901 }
902902 va_end (args );
903903 return jv ;
@@ -906,14 +906,15 @@ JL_DLLEXPORT jl_value_t *jl_new_struct(jl_datatype_t *type, ...)
906906static void init_struct_tail (jl_datatype_t * type , jl_value_t * jv , size_t na )
907907{
908908 size_t nf = jl_datatype_nfields (type );
909- for (size_t i = na ; i < nf ; i ++ ) {
909+ char * data = (char * )jl_data_ptr (jv );
910+ for (size_t i = na ; i < nf ; i ++ ) {
910911 if (jl_field_isptr (type , i )) {
911- * (jl_value_t * * )(( char * ) jl_data_ptr ( jv ) + jl_field_offset (type ,i )) = NULL ;
912+ * (jl_value_t * * )(data + jl_field_offset (type , i )) = NULL ;
912913 }
913914 else {
914915 jl_value_t * ft = jl_field_type (type , i );
915916 if (jl_is_uniontype (ft )) {
916- uint8_t * psel = & ((uint8_t * )jv )[jl_field_offset (type , i ) + jl_field_size (type , i ) - 1 ];
917+ uint8_t * psel = & ((uint8_t * )data )[jl_field_offset (type , i ) + jl_field_size (type , i ) - 1 ];
917918 * psel = 0 ;
918919 }
919920 }
@@ -923,6 +924,10 @@ static void init_struct_tail(jl_datatype_t *type, jl_value_t *jv, size_t na)
923924JL_DLLEXPORT jl_value_t * jl_new_structv (jl_datatype_t * type , jl_value_t * * args , uint32_t na )
924925{
925926 jl_ptls_t ptls = jl_get_ptls_states ();
927+ if (!jl_is_datatype (type ) || type -> layout == NULL )
928+ jl_type_error ("new" , (jl_value_t * )jl_datatype_type , (jl_value_t * )type );
929+ if (type -> ninitialized > na || na > jl_datatype_nfields (type ))
930+ jl_error ("invalid struct allocation" );
926931 if (type -> instance != NULL ) {
927932 for (size_t i = 0 ; i < na ; i ++ ) {
928933 jl_value_t * ft = jl_field_type (type , i );
@@ -931,15 +936,13 @@ JL_DLLEXPORT jl_value_t *jl_new_structv(jl_datatype_t *type, jl_value_t **args,
931936 }
932937 return type -> instance ;
933938 }
934- if (type -> layout == NULL )
935- jl_type_error ("new" , (jl_value_t * )jl_datatype_type , (jl_value_t * )type );
936939 jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
937940 JL_GC_PUSH1 (& jv );
938941 for (size_t i = 0 ; i < na ; i ++ ) {
939942 jl_value_t * ft = jl_field_type (type , i );
940943 if (!jl_isa (args [i ], ft ))
941944 jl_type_error ("new" , ft , args [i ]);
942- jl_set_nth_field ( jv , i , args [i ]);
945+ set_nth_field ( type , ( void * ) jv , i , args [i ]);
943946 }
944947 init_struct_tail (type , jv , na );
945948 JL_GC_POP ();
@@ -951,7 +954,7 @@ JL_DLLEXPORT jl_value_t *jl_new_structt(jl_datatype_t *type, jl_value_t *tup)
951954 jl_ptls_t ptls = jl_get_ptls_states ();
952955 if (!jl_is_tuple (tup ))
953956 jl_type_error ("new" , (jl_value_t * )jl_tuple_type , tup );
954- if (type -> layout == NULL )
957+ if (! jl_is_datatype ( type ) || type -> layout == NULL )
955958 jl_type_error ("new" , (jl_value_t * )jl_datatype_type , (jl_value_t * )type );
956959 size_t nargs = jl_nfields (tup );
957960 size_t nf = jl_datatype_nfields (type );
@@ -975,7 +978,7 @@ JL_DLLEXPORT jl_value_t *jl_new_structt(jl_datatype_t *type, jl_value_t *tup)
975978 fi = jl_get_nth_field (tup , i );
976979 if (!jl_isa (fi , ft ))
977980 jl_type_error ("new" , ft , fi );
978- jl_set_nth_field ( jv , i , fi );
981+ set_nth_field ( type , ( void * ) jv , i , fi );
979982 }
980983 JL_GC_POP ();
981984 return jv ;
@@ -1074,9 +1077,8 @@ JL_DLLEXPORT jl_value_t *jl_get_nth_field_checked(jl_value_t *v, size_t i)
10741077 return undefref_check ((jl_datatype_t * )ty , jl_new_bits (ty , (char * )v + offs ));
10751078}
10761079
1077- JL_DLLEXPORT void jl_set_nth_field ( jl_value_t * v , size_t i , jl_value_t * rhs ) JL_NOTSAFEPOINT
1080+ void set_nth_field ( jl_datatype_t * st , void * v , size_t i , jl_value_t * rhs ) JL_NOTSAFEPOINT
10781081{
1079- jl_datatype_t * st = (jl_datatype_t * )jl_typeof (v );
10801082 size_t offs = jl_field_offset (st , i );
10811083 if (jl_field_isptr (st , i )) {
10821084 * (jl_value_t * * )((char * )v + offs ) = rhs ;
0 commit comments