@@ -54,6 +54,7 @@ static const REBINT type_to_sym [STRUCT_TYPE_MAX] = {
54
54
55
55
SYM_POINTER ,
56
56
-1 , //SYM_STRUCT
57
+ SYM_WORD_TYPE ,
57
58
//SYM_REBVAL // unused
58
59
//STRUCT_TYPE_MAX
59
60
};
@@ -110,6 +111,9 @@ static get_scalar(REBSTU *stu,
110
111
VAL_STRUCT_LEN (val ) = field -> size ;
111
112
}
112
113
break ;
114
+ case STRUCT_TYPE_WORD :
115
+ Set_Word (val , * (REBINT * )data , NULL , 0 );
116
+ break ;
113
117
#ifdef unused
114
118
case STRUCT_TYPE_REBVAL :
115
119
memcpy (val , data , sizeof (REBVAL ));
@@ -232,6 +236,7 @@ static get_scalar(REBSTU *stu,
232
236
} else {
233
237
val = Append_Value (ser );
234
238
get_scalar (stu , field , 0 , val );
239
+ if (IS_WORD (val )) SET_TYPE (val , REB_LIT_WORD );
235
240
}
236
241
}
237
242
return ser ;
@@ -303,6 +308,12 @@ static REBOOL assign_scalar(REBSTU *stu,
303
308
Trap_Type (val );
304
309
}
305
310
break ;
311
+ case REB_WORD :
312
+ if (STRUCT_TYPE_WORD != field -> type ) {
313
+ Trap_Type (val );
314
+ }
315
+ i = (u64 )VAL_WORD_SYM (val );
316
+ break ;
306
317
default :
307
318
Trap_Type (val );
308
319
}
@@ -324,6 +335,7 @@ static REBOOL assign_scalar(REBSTU *stu,
324
335
* (i32 * )data = (i32 )i ;
325
336
break ;
326
337
case STRUCT_TYPE_UINT32 :
338
+ case STRUCT_TYPE_WORD :
327
339
* (u32 * )data = (u32 )i ;
328
340
break ;
329
341
case STRUCT_TYPE_INT64 :
@@ -581,6 +593,10 @@ static REBOOL parse_field_type(struct Struct_Field *field, REBVAL *spec, REBVAL
581
593
Trap_Types (RE_EXPECT_VAL , REB_BLOCK , VAL_TYPE (val ));
582
594
}
583
595
break ;
596
+ case SYM_WORD_TYPE :
597
+ field -> type = STRUCT_TYPE_WORD ;
598
+ field -> size = 4 ;
599
+ break ;
584
600
#ifdef unused
585
601
case SYM_REBVAL :
586
602
field -> type = STRUCT_TYPE_REBVAL ;
@@ -764,7 +780,17 @@ static REBOOL parse_field_type(struct Struct_Field *field, REBVAL *spec, REBVAL
764
780
for (n = 0 ; n < field -> dimension ; n ++ ) {
765
781
memcpy (SERIES_SKIP (VAL_STRUCT_DATA_BIN (out ), ((REBCNT )offset ) + n * field -> size ), SERIES_DATA (VAL_STRUCT_DATA_BIN (init )), field -> size );
766
782
}
767
- } else if (field -> type == STRUCT_TYPE_REBVAL ) {
783
+ }
784
+ else if (field -> type == STRUCT_TYPE_WORD ) {
785
+ // use word `none` as a default value
786
+ REBCNT n = 0 ;
787
+ REBCNT sym = SYM_NONE ;
788
+ for (n = 0 ; n < field -> dimension ; n ++ ) {
789
+ memcpy (SERIES_SKIP (VAL_STRUCT_DATA_BIN (out ), ((REBCNT )offset ) + n * field -> size ), & sym , field -> size );
790
+ }
791
+ }
792
+ else if (field -> type == STRUCT_TYPE_REBVAL ) {
793
+ #ifdef unused
768
794
REBVAL unset ;
769
795
REBCNT n = 0 ;
770
796
SET_UNSET (& unset );
@@ -774,6 +800,7 @@ static REBOOL parse_field_type(struct Struct_Field *field, REBVAL *spec, REBVAL
774
800
goto failed ;
775
801
}
776
802
}
803
+ #endif
777
804
} else {
778
805
memset (SERIES_SKIP (VAL_STRUCT_DATA_BIN (out ), (REBCNT )offset ), 0 , field -> size * field -> dimension );
779
806
}
0 commit comments