@@ -224,18 +224,17 @@ static REBFLG get_scalar(REBSTU *stu,
224
224
}
225
225
226
226
/* optional initialization */
227
+ val = Append_Value (ser );
227
228
if (field -> dimension > 1 ) {
228
229
REBSER * dim = Make_Block (1 );
229
230
REBCNT n = 0 ;
230
- val = Append_Value (ser );
231
231
SET_TYPE (val , REB_BLOCK );
232
232
VAL_SERIES (val ) = dim ;
233
233
for (n = 0 ; n < field -> dimension ; n ++ ) {
234
234
REBVAL * dv = Append_Value (dim );
235
235
get_scalar (stu , field , n , dv );
236
236
}
237
237
} else {
238
- val = Append_Value (ser );
239
238
get_scalar (stu , field , 0 , val );
240
239
#ifdef ALLOW_CODE_EVALUATION_INSIDE_STRUCT_CONSTRUCTION_SPEC
241
240
if (IS_WORD (val )) SET_TYPE (val , REB_LIT_WORD );
@@ -245,6 +244,51 @@ static REBFLG get_scalar(REBSTU *stu,
245
244
return ser ;
246
245
}
247
246
247
+ static void Get_Struct_Words (REBVAL * ret , REBSTU * stu ) {
248
+ REBVAL * val = NULL ;
249
+ REBSER * out ;
250
+ struct Struct_Field * field = (struct Struct_Field * )SERIES_DATA (stu -> fields );
251
+ REBCNT i , cnt ;
252
+
253
+ cnt = SERIES_TAIL (stu -> fields );
254
+ out = Make_Block (cnt );
255
+ Set_Block (ret , out );
256
+
257
+ for (i = 0 ; i < cnt ; i ++ , field ++ ) {
258
+ val = Append_Value (out );
259
+ Init_Word (val , field -> sym );
260
+ SET_TYPE (val , REB_WORD );
261
+ }
262
+ }
263
+
264
+ static void Get_Struct_Values (REBVAL * ret , REBSTU * stu ) {
265
+ REBVAL * val = NULL ;
266
+ REBVAL * type_blk = NULL ;
267
+ REBSER * out , * dim ;
268
+ struct Struct_Field * field = (struct Struct_Field * )SERIES_DATA (stu -> fields );
269
+ REBCNT i , n , cnt ;
270
+
271
+ cnt = SERIES_TAIL (stu -> fields );
272
+ out = Make_Block (cnt );
273
+ Set_Block (ret , out );
274
+
275
+ for (i = 0 ; i < cnt ; i ++ , field ++ ) {
276
+ val = Append_Value (out );
277
+ if (field -> dimension > 1 ) {
278
+ dim = Make_Block (field -> dimension );
279
+ SET_TYPE (val , REB_BLOCK );
280
+ VAL_SERIES (val ) = dim ;
281
+ for (n = 0 ; n < field -> dimension ; n ++ ) {
282
+ REBVAL * dv = Append_Value (dim );
283
+ get_scalar (stu , field , n , dv );
284
+ }
285
+ }
286
+ else {
287
+ get_scalar (stu , field , 0 , val );
288
+ }
289
+ }
290
+ }
291
+
248
292
static REBOOL same_fields (REBSER * tgt , REBSER * src )
249
293
{
250
294
struct Struct_Field * tgt_fields = (struct Struct_Field * ) SERIES_DATA (tgt );
@@ -1088,12 +1132,17 @@ static void init_fields(REBVAL *ret, REBVAL *spec)
1088
1132
{
1089
1133
REBINT n = VAL_WORD_CANON (arg ); // zero on error
1090
1134
switch (n ) {
1135
+ case SYM_WORDS :
1136
+ Get_Struct_Words (ret , & VAL_STRUCT (val ));
1137
+ break ;
1091
1138
case SYM_VALUES :
1092
- SET_BINARY (ret , Copy_Series_Part (VAL_STRUCT_DATA_BIN (val ), VAL_STRUCT_OFFSET (val ), VAL_STRUCT_LEN (val )));
1139
+ //SET_BINARY(ret, Copy_Series_Part(VAL_STRUCT_DATA_BIN(val), VAL_STRUCT_OFFSET(val), VAL_STRUCT_LEN(val)));
1140
+ Get_Struct_Values (ret , & VAL_STRUCT (val ));
1093
1141
break ;
1094
1142
case SYM_SPEC :
1143
+ case SYM_BODY :
1095
1144
Set_Block (ret , Clone_Block (VAL_STRUCT_SPEC (val )));
1096
- Unbind_Block (VAL_BLK (val ), TRUE);
1145
+ // Unbind_Block(VAL_BLK(val), TRUE); //???
1097
1146
break ;
1098
1147
case SYM_ADDR :
1099
1148
SET_INTEGER (ret , (REBUPT )SERIES_SKIP (VAL_STRUCT_DATA_BIN (val ), VAL_STRUCT_OFFSET (val )));
0 commit comments