@@ -233,6 +233,48 @@ static void write_array_var(PARROT_INTERP, SerializationWriter *writer, PMC *arr
233
233
write_ref_func (interp , writer , VTABLE_get_pmc_keyed_int (interp , arr , i ));
234
234
}
235
235
236
+ /* Writes an array where each item is an integer. */
237
+ static void write_array_int (PARROT_INTERP , SerializationWriter * writer , PMC * arr ) {
238
+ Parrot_Int4 elems = (Parrot_Int4 )VTABLE_elements (interp , arr );
239
+ Parrot_Int4 i ;
240
+
241
+ /* Write out element count. */
242
+ expand_storage_if_needed (interp , writer , 4 );
243
+ if (writer -> writing_object ) {
244
+ write_int32 (writer -> root .objects_data , writer -> objects_data_offset , elems );
245
+ writer -> objects_data_offset += 4 ;
246
+ }
247
+ else {
248
+ write_int32 (writer -> root .stables_data , writer -> stables_data_offset , elems );
249
+ writer -> stables_data_offset += 4 ;
250
+ }
251
+
252
+ /* Write elements. */
253
+ for (i = 0 ; i < elems ; i ++ )
254
+ write_int_func (interp , writer , VTABLE_get_integer_keyed_int (interp , arr , i ));
255
+ }
256
+
257
+ /* Writes an array where each item is a string. */
258
+ static void write_array_str (PARROT_INTERP , SerializationWriter * writer , PMC * arr ) {
259
+ Parrot_Int4 elems = (Parrot_Int4 )VTABLE_elements (interp , arr );
260
+ Parrot_Int4 i ;
261
+
262
+ /* Write out element count. */
263
+ expand_storage_if_needed (interp , writer , 4 );
264
+ if (writer -> writing_object ) {
265
+ write_int32 (writer -> root .objects_data , writer -> objects_data_offset , elems );
266
+ writer -> objects_data_offset += 4 ;
267
+ }
268
+ else {
269
+ write_int32 (writer -> root .stables_data , writer -> stables_data_offset , elems );
270
+ writer -> stables_data_offset += 4 ;
271
+ }
272
+
273
+ /* Write elements. */
274
+ for (i = 0 ; i < elems ; i ++ )
275
+ write_str_func (interp , writer , VTABLE_get_string_keyed_int (interp , arr , i ));
276
+ }
277
+
236
278
/* Writes a hash where each key is a string and each value a variant reference. */
237
279
void write_ref_func (PARROT_INTERP , SerializationWriter * writer , PMC * ref );
238
280
static void write_hash_str_var (PARROT_INTERP , SerializationWriter * writer , PMC * hash ) {
@@ -283,6 +325,12 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
283
325
else if (ref -> vtable -> base_type == enum_class_ResizablePMCArray ) {
284
326
discrim = REFVAR_VM_ARR_VAR ;
285
327
}
328
+ else if (ref -> vtable -> base_type == enum_class_ResizableIntegerArray ) {
329
+ discrim = REFVAR_VM_ARR_INT ;
330
+ }
331
+ else if (ref -> vtable -> base_type == enum_class_ResizableStringArray ) {
332
+ discrim = REFVAR_VM_ARR_STR ;
333
+ }
286
334
else if (ref -> vtable -> base_type == enum_class_Hash ) {
287
335
discrim = REFVAR_VM_HASH_STR_VAR ;
288
336
}
@@ -323,6 +371,12 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
323
371
case REFVAR_VM_ARR_VAR :
324
372
write_array_var (interp , writer , ref );
325
373
break ;
374
+ case REFVAR_VM_ARR_INT :
375
+ write_array_int (interp , writer , ref );
376
+ break ;
377
+ case REFVAR_VM_ARR_STR :
378
+ write_array_str (interp , writer , ref );
379
+ break ;
326
380
case REFVAR_VM_HASH_STR_VAR :
327
381
write_hash_str_var (interp , writer , ref );
328
382
break ;
@@ -703,6 +757,52 @@ static PMC * read_array_var(PARROT_INTERP, SerializationReader *reader) {
703
757
return result ;
704
758
}
705
759
760
+ /* Reads in an array of integers. */
761
+ static PMC * read_array_int (PARROT_INTERP , SerializationReader * reader ) {
762
+ PMC * result = Parrot_pmc_new (interp , enum_class_ResizableIntegerArray );
763
+ Parrot_Int4 elems , i ;
764
+
765
+ /* Read the element count. */
766
+ assert_can_read (interp , reader , 4 );
767
+ if (reader -> reading_object ) {
768
+ elems = read_int32 (reader -> root .objects_data , reader -> objects_data_offset );
769
+ reader -> objects_data_offset += 4 ;
770
+ }
771
+ else {
772
+ elems = read_int32 (reader -> root .stables_data , reader -> stables_data_offset );
773
+ reader -> stables_data_offset += 4 ;
774
+ }
775
+
776
+ /* Read in the elements. */
777
+ for (i = 0 ; i < elems ; i ++ )
778
+ VTABLE_set_integer_keyed_int (interp , result , i , read_int_func (interp , reader ));
779
+
780
+ return result ;
781
+ }
782
+
783
+ /* Reads in an array of strings. */
784
+ static PMC * read_array_str (PARROT_INTERP , SerializationReader * reader ) {
785
+ PMC * result = Parrot_pmc_new (interp , enum_class_ResizableStringArray );
786
+ Parrot_Int4 elems , i ;
787
+
788
+ /* Read the element count. */
789
+ assert_can_read (interp , reader , 4 );
790
+ if (reader -> reading_object ) {
791
+ elems = read_int32 (reader -> root .objects_data , reader -> objects_data_offset );
792
+ reader -> objects_data_offset += 4 ;
793
+ }
794
+ else {
795
+ elems = read_int32 (reader -> root .stables_data , reader -> stables_data_offset );
796
+ reader -> stables_data_offset += 4 ;
797
+ }
798
+
799
+ /* Read in the elements. */
800
+ for (i = 0 ; i < elems ; i ++ )
801
+ VTABLE_set_string_keyed_int (interp , result , i , read_str_func (interp , reader ));
802
+
803
+ return result ;
804
+ }
805
+
706
806
/* Reads in an hash with string keys and variant references. */
707
807
static PMC * read_hash_str_var (PARROT_INTERP , SerializationReader * reader ) {
708
808
PMC * result = Parrot_pmc_new (interp , enum_class_Hash );
@@ -766,6 +866,10 @@ PMC * read_ref_func(PARROT_INTERP, SerializationReader *reader) {
766
866
return result ;
767
867
case REFVAR_VM_ARR_VAR :
768
868
return read_array_var (interp , reader );
869
+ case REFVAR_VM_ARR_INT :
870
+ return read_array_int (interp , reader );
871
+ case REFVAR_VM_ARR_STR :
872
+ return read_array_str (interp , reader );
769
873
case REFVAR_VM_HASH_STR_VAR :
770
874
return read_hash_str_var (interp , reader );
771
875
default :
0 commit comments