@@ -289,6 +289,38 @@ static void Get_Struct_Values(REBVAL* ret, REBSTU* stu) {
289
289
}
290
290
}
291
291
292
+ static void Get_Struct_Body (REBVAL * ret , REBSTU * stu ) {
293
+ REBVAL * val = NULL ;
294
+ REBVAL * type_blk = NULL ;
295
+ REBSER * out , * dim ;
296
+ struct Struct_Field * field = (struct Struct_Field * )SERIES_DATA (stu -> fields );
297
+ REBCNT i , n , cnt ;
298
+
299
+ cnt = SERIES_TAIL (stu -> fields );
300
+ out = Make_Block (cnt * 2 );
301
+ Set_Block (ret , out );
302
+
303
+ for (i = 0 ; i < cnt ; i ++ , field ++ ) {
304
+ val = Append_Value (out );
305
+ Init_Word (val , field -> sym );
306
+ SET_TYPE (val , REB_SET_WORD );
307
+
308
+ val = Append_Value (out );
309
+ if (field -> dimension > 1 ) {
310
+ dim = Make_Block (field -> dimension );
311
+ SET_TYPE (val , REB_BLOCK );
312
+ VAL_SERIES (val ) = dim ;
313
+ for (n = 0 ; n < field -> dimension ; n ++ ) {
314
+ REBVAL * dv = Append_Value (dim );
315
+ get_scalar (stu , field , n , dv );
316
+ }
317
+ }
318
+ else {
319
+ get_scalar (stu , field , 0 , val );
320
+ }
321
+ }
322
+ }
323
+
292
324
static REBOOL same_fields (REBSER * tgt , REBSER * src )
293
325
{
294
326
struct Struct_Field * tgt_fields = (struct Struct_Field * ) SERIES_DATA (tgt );
@@ -1140,9 +1172,10 @@ static void init_fields(REBVAL *ret, REBVAL *spec)
1140
1172
Get_Struct_Values (ret , & VAL_STRUCT (val ));
1141
1173
break ;
1142
1174
case SYM_SPEC :
1143
- case SYM_BODY :
1144
1175
Set_Block (ret , Clone_Block (VAL_STRUCT_SPEC (val )));
1145
- //Unbind_Block(VAL_BLK(val), TRUE); //???
1176
+ break ;
1177
+ case SYM_BODY :
1178
+ Get_Struct_Body (ret , & VAL_STRUCT (val ));
1146
1179
break ;
1147
1180
case SYM_ADDR :
1148
1181
SET_INTEGER (ret , (REBUPT )SERIES_SKIP (VAL_STRUCT_DATA_BIN (val ), VAL_STRUCT_OFFSET (val )));
0 commit comments