Skip to content

Commit 855adc4

Browse files
committed
FEAT: struct reflection code reduction
related to: Oldes/Rebol-issues#2577
1 parent 68bf82e commit 855adc4

File tree

1 file changed

+22
-69
lines changed

1 file changed

+22
-69
lines changed

src/core/t-struct.c

+22-69
Original file line numberDiff line numberDiff line change
@@ -242,79 +242,37 @@ static REBFLG get_scalar(REBSTU *stu,
242242
return ser;
243243
}
244244

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) {
291246
REBVAL* val = NULL;
292247
REBVAL* type_blk = NULL;
293248
REBSER* out, * dim;
294249
struct Struct_Field* field = (struct Struct_Field*)SERIES_DATA(stu->fields);
295250
REBCNT i, n, cnt;
296251

297252
cnt = SERIES_TAIL(stu->fields);
298-
out = Make_Block(cnt*2);
253+
out = Make_Block(cnt * (type==SYM_BODY?2:1));
299254
Set_Block(ret, out);
300255

301256
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));
315261
}
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+
}
318276
}
319277
}
320278
}
@@ -1163,18 +1121,13 @@ static void init_fields(REBVAL *ret, REBVAL *spec)
11631121
REBINT n = VAL_WORD_CANON(arg); // zero on error
11641122
switch (n) {
11651123
case SYM_WORDS:
1166-
Get_Struct_Words(ret, &VAL_STRUCT(val));
1167-
break;
11681124
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);
11711127
break;
11721128
case SYM_SPEC:
11731129
Set_Block(ret, Clone_Block(VAL_STRUCT_SPEC(val)));
11741130
break;
1175-
case SYM_BODY:
1176-
Get_Struct_Body(ret, &VAL_STRUCT(val));
1177-
break;
11781131
case SYM_ADDR:
11791132
SET_INTEGER(ret, (REBUPT)SERIES_SKIP(VAL_STRUCT_DATA_BIN(val), VAL_STRUCT_OFFSET(val)));
11801133
break;

0 commit comments

Comments
 (0)