Skip to content

Commit d142652

Browse files
committed
Serialization of integer and string arrays. That should be all the primitives in place.
1 parent dc73db6 commit d142652

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

src/6model/serialization.c

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,48 @@ static void write_array_var(PARROT_INTERP, SerializationWriter *writer, PMC *arr
233233
write_ref_func(interp, writer, VTABLE_get_pmc_keyed_int(interp, arr, i));
234234
}
235235

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+
236278
/* Writes a hash where each key is a string and each value a variant reference. */
237279
void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref);
238280
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) {
283325
else if (ref->vtable->base_type == enum_class_ResizablePMCArray) {
284326
discrim = REFVAR_VM_ARR_VAR;
285327
}
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+
}
286334
else if (ref->vtable->base_type == enum_class_Hash) {
287335
discrim = REFVAR_VM_HASH_STR_VAR;
288336
}
@@ -323,6 +371,12 @@ void write_ref_func(PARROT_INTERP, SerializationWriter *writer, PMC *ref) {
323371
case REFVAR_VM_ARR_VAR:
324372
write_array_var(interp, writer, ref);
325373
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;
326380
case REFVAR_VM_HASH_STR_VAR:
327381
write_hash_str_var(interp, writer, ref);
328382
break;
@@ -703,6 +757,52 @@ static PMC * read_array_var(PARROT_INTERP, SerializationReader *reader) {
703757
return result;
704758
}
705759

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+
706806
/* Reads in an hash with string keys and variant references. */
707807
static PMC * read_hash_str_var(PARROT_INTERP, SerializationReader *reader) {
708808
PMC *result = Parrot_pmc_new(interp, enum_class_Hash);
@@ -766,6 +866,10 @@ PMC * read_ref_func(PARROT_INTERP, SerializationReader *reader) {
766866
return result;
767867
case REFVAR_VM_ARR_VAR:
768868
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);
769873
case REFVAR_VM_HASH_STR_VAR:
770874
return read_hash_str_var(interp, reader);
771875
default:

0 commit comments

Comments
 (0)