@@ -797,8 +797,24 @@ JL_DLLEXPORT jl_value_t *jl_new_struct(jl_datatype_t *type, ...)
797
797
return jv ;
798
798
}
799
799
800
- JL_DLLEXPORT jl_value_t * jl_new_structv (jl_datatype_t * type , jl_value_t * * args ,
801
- uint32_t na )
800
+ static void init_struct_tail (jl_datatype_t * type , jl_value_t * jv , size_t na )
801
+ {
802
+ size_t nf = jl_datatype_nfields (type );
803
+ for (size_t i = na ; i < nf ; i ++ ) {
804
+ if (jl_field_isptr (type , i )) {
805
+ * (jl_value_t * * )((char * )jl_data_ptr (jv )+ jl_field_offset (type ,i )) = NULL ;
806
+ }
807
+ else {
808
+ jl_value_t * ft = jl_field_type (type , i );
809
+ if (jl_is_uniontype (ft )) {
810
+ uint8_t * psel = & ((uint8_t * )jv )[jl_field_offset (type , i ) + jl_field_size (type , i ) - 1 ];
811
+ * psel = 0 ;
812
+ }
813
+ }
814
+ }
815
+ }
816
+
817
+ JL_DLLEXPORT jl_value_t * jl_new_structv (jl_datatype_t * type , jl_value_t * * args , uint32_t na )
802
818
{
803
819
jl_ptls_t ptls = jl_get_ptls_states ();
804
820
if (type -> instance != NULL ) {
@@ -811,7 +827,6 @@ JL_DLLEXPORT jl_value_t *jl_new_structv(jl_datatype_t *type, jl_value_t **args,
811
827
}
812
828
if (type -> layout == NULL )
813
829
jl_type_error ("new" , (jl_value_t * )jl_datatype_type , (jl_value_t * )type );
814
- size_t nf = jl_datatype_nfields (type );
815
830
jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
816
831
JL_GC_PUSH1 (& jv );
817
832
for (size_t i = 0 ; i < na ; i ++ ) {
@@ -820,18 +835,41 @@ JL_DLLEXPORT jl_value_t *jl_new_structv(jl_datatype_t *type, jl_value_t **args,
820
835
jl_type_error ("new" , ft , args [i ]);
821
836
jl_set_nth_field (jv , i , args [i ]);
822
837
}
823
- for (size_t i = na ; i < nf ; i ++ ) {
824
- if (jl_field_isptr (type , i )) {
825
- * (jl_value_t * * )((char * )jl_data_ptr (jv )+ jl_field_offset (type ,i )) = NULL ;
826
- }
827
- else {
838
+ init_struct_tail (type , jv , na );
839
+ JL_GC_POP ();
840
+ return jv ;
841
+ }
842
+
843
+ JL_DLLEXPORT jl_value_t * jl_new_structt (jl_datatype_t * type , jl_value_t * tup )
844
+ {
845
+ jl_ptls_t ptls = jl_get_ptls_states ();
846
+ if (!jl_is_tuple (tup ))
847
+ jl_type_error ("new" , (jl_value_t * )jl_tuple_type , tup );
848
+ size_t na = jl_nfields (tup );
849
+ size_t nf = jl_datatype_nfields (type );
850
+ if (na > nf )
851
+ jl_too_many_args ("new" , nf );
852
+ if (type -> instance != NULL ) {
853
+ for (size_t i = 0 ; i < na ; i ++ ) {
828
854
jl_value_t * ft = jl_field_type (type , i );
829
- if (jl_is_uniontype (ft )) {
830
- uint8_t * psel = & ((uint8_t * )jv )[jl_field_offset (type , i ) + jl_field_size (type , i ) - 1 ];
831
- * psel = 0 ;
832
- }
855
+ jl_value_t * fi = jl_get_nth_field (tup , i );
856
+ if (!jl_isa (fi , ft ))
857
+ jl_type_error ("new" , ft , fi );
833
858
}
859
+ return type -> instance ;
860
+ }
861
+ if (type -> layout == NULL )
862
+ jl_type_error ("new" , (jl_value_t * )jl_datatype_type , (jl_value_t * )type );
863
+ jl_value_t * jv = jl_gc_alloc (ptls , jl_datatype_size (type ), type );
864
+ JL_GC_PUSH1 (& jv );
865
+ for (size_t i = 0 ; i < na ; i ++ ) {
866
+ jl_value_t * ft = jl_field_type (type , i );
867
+ jl_value_t * fi = jl_get_nth_field (tup , i );
868
+ if (!jl_isa (fi , ft ))
869
+ jl_type_error ("new" , ft , fi );
870
+ jl_set_nth_field (jv , i , fi );
834
871
}
872
+ init_struct_tail (type , jv , na );
835
873
JL_GC_POP ();
836
874
return jv ;
837
875
}
0 commit comments