@@ -242,79 +242,37 @@ static REBFLG get_scalar(REBSTU *stu,
242
242
return ser ;
243
243
}
244
244
245
- static void Get_Struct_Words (REBVAL * ret , REBSTU * stu ) {
246
- REBVAL * val = NULL ;
247
- REBSER * out ;
248
- struct Struct_Field * field = (struct Struct_Field * )SERIES_DATA (stu -> fields );
249
- REBCNT i , cnt ;
250
-
251
- cnt = SERIES_TAIL (stu -> fields );
252
- out = Make_Block (cnt );
253
- Set_Block (ret , out );
254
-
255
- for (i = 0 ; i < cnt ; i ++ , field ++ ) {
256
- val = Append_Value (out );
257
- Init_Word (val , field -> sym );
258
- SET_TYPE (val , REB_WORD );
259
- }
260
- }
261
-
262
- static void Get_Struct_Values (REBVAL * ret , REBSTU * stu ) {
263
- REBVAL * val = NULL ;
264
- REBVAL * type_blk = NULL ;
265
- REBSER * out , * dim ;
266
- struct Struct_Field * field = (struct Struct_Field * )SERIES_DATA (stu -> fields );
267
- REBCNT i , n , cnt ;
268
-
269
- cnt = SERIES_TAIL (stu -> fields );
270
- out = Make_Block (cnt );
271
- Set_Block (ret , out );
272
-
273
- for (i = 0 ; i < cnt ; i ++ , field ++ ) {
274
- val = Append_Value (out );
275
- if (field -> dimension > 1 ) {
276
- dim = Make_Block (field -> dimension );
277
- SET_TYPE (val , REB_BLOCK );
278
- VAL_SERIES (val ) = dim ;
279
- for (n = 0 ; n < field -> dimension ; n ++ ) {
280
- REBVAL * dv = Append_Value (dim );
281
- get_scalar (stu , field , n , dv );
282
- }
283
- }
284
- else {
285
- get_scalar (stu , field , 0 , val );
286
- }
287
- }
288
- }
289
-
290
- static void Get_Struct_Body (REBVAL * ret , REBSTU * stu ) {
245
+ static void Get_Struct_Reflect (REBVAL * ret , REBSTU * stu , REBCNT type ) {
291
246
REBVAL * val = NULL ;
292
247
REBVAL * type_blk = NULL ;
293
248
REBSER * out , * dim ;
294
249
struct Struct_Field * field = (struct Struct_Field * )SERIES_DATA (stu -> fields );
295
250
REBCNT i , n , cnt ;
296
251
297
252
cnt = SERIES_TAIL (stu -> fields );
298
- out = Make_Block (cnt * 2 );
253
+ out = Make_Block (cnt * ( type == SYM_BODY ? 2 : 1 ) );
299
254
Set_Block (ret , out );
300
255
301
256
for (i = 0 ; i < cnt ; i ++ , field ++ ) {
302
- val = Append_Value (out );
303
- Init_Word (val , field -> sym );
304
- SET_TYPE (val , REB_SET_WORD );
305
-
306
- val = Append_Value (out );
307
- if (field -> dimension > 1 ) {
308
- dim = Make_Block (field -> dimension );
309
- SET_TYPE (val , REB_BLOCK );
310
- VAL_SERIES (val ) = dim ;
311
- for (n = 0 ; n < field -> dimension ; n ++ ) {
312
- REBVAL * dv = Append_Value (dim );
313
- get_scalar (stu , field , n , dv );
314
- }
257
+ if (type != SYM_VALUES ) {
258
+ val = Append_Value (out );
259
+ Init_Word (val , field -> sym );
260
+ SET_TYPE (val , (type == SYM_WORDS ?REB_WORD :REB_SET_WORD ));
315
261
}
316
- else {
317
- get_scalar (stu , field , 0 , val );
262
+ if (type != SYM_WORDS ) {
263
+ val = Append_Value (out );
264
+ if (field -> dimension > 1 ) {
265
+ dim = Make_Block (field -> dimension );
266
+ SET_TYPE (val , REB_BLOCK );
267
+ VAL_SERIES (val ) = dim ;
268
+ for (n = 0 ; n < field -> dimension ; n ++ ) {
269
+ REBVAL * dv = Append_Value (dim );
270
+ get_scalar (stu , field , n , dv );
271
+ }
272
+ }
273
+ else {
274
+ get_scalar (stu , field , 0 , val );
275
+ }
318
276
}
319
277
}
320
278
}
@@ -1163,18 +1121,13 @@ static void init_fields(REBVAL *ret, REBVAL *spec)
1163
1121
REBINT n = VAL_WORD_CANON (arg ); // zero on error
1164
1122
switch (n ) {
1165
1123
case SYM_WORDS :
1166
- Get_Struct_Words (ret , & VAL_STRUCT (val ));
1167
- break ;
1168
1124
case SYM_VALUES :
1169
- //SET_BINARY(ret, Copy_Series_Part(VAL_STRUCT_DATA_BIN(val), VAL_STRUCT_OFFSET(val), VAL_STRUCT_LEN(val)));
1170
- Get_Struct_Values (ret , & VAL_STRUCT (val ));
1125
+ case SYM_BODY :
1126
+ Get_Struct_Reflect (ret , & VAL_STRUCT (val ), n );
1171
1127
break ;
1172
1128
case SYM_SPEC :
1173
1129
Set_Block (ret , Clone_Block (VAL_STRUCT_SPEC (val )));
1174
1130
break ;
1175
- case SYM_BODY :
1176
- Get_Struct_Body (ret , & VAL_STRUCT (val ));
1177
- break ;
1178
1131
case SYM_ADDR :
1179
1132
SET_INTEGER (ret , (REBUPT )SERIES_SKIP (VAL_STRUCT_DATA_BIN (val ), VAL_STRUCT_OFFSET (val )));
1180
1133
break ;
0 commit comments