From 8f912e2e8fa2690743292be57eb56b0b49e6f851 Mon Sep 17 00:00:00 2001 From: jnthn Date: Sat, 20 Jul 2013 12:53:23 +0200 Subject: [PATCH] VMArray should serialize its type. This fixes the issue with the utf8/utf16/utf32 types in the new Buf implementation. --- .../nqp/sixmodel/SerializationReader.java | 2 +- .../nqp/sixmodel/SerializationWriter.java | 2 +- .../org/perl6/nqp/sixmodel/reprs/VMArray.java | 45 ++++++++++++++++--- .../nqp/sixmodel/reprs/VMArrayREPRData.java | 9 ++++ 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArrayREPRData.java diff --git a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationReader.java b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationReader.java index 7e6431a713..33a8bbbbe6 100644 --- a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationReader.java +++ b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationReader.java @@ -11,7 +11,7 @@ public class SerializationReader { /* The current version of the serialization format. */ - private final int CURRENT_VERSION = 6; + private final int CURRENT_VERSION = 7; /* The minimum version of the serialization format. */ private final int MIN_VERSION = 4; diff --git a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationWriter.java b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationWriter.java index ff0b5c19fd..9ac4eaef9f 100644 --- a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationWriter.java +++ b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/SerializationWriter.java @@ -18,7 +18,7 @@ public class SerializationWriter { /* The current version of the serialization format. */ - private final int CURRENT_VERSION = 6; + private final int CURRENT_VERSION = 7; /* Various sizes (in bytes). */ private final int HEADER_SIZE = 4 * 16; diff --git a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArray.java b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArray.java index 76bb29122a..d7343cf562 100644 --- a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArray.java +++ b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArray.java @@ -25,7 +25,7 @@ public SixModelObject allocate(ThreadContext tc, STable st) { obj = new VMArrayInstance(); } else { - switch (((StorageSpec)st.REPRData).boxed_primitive) { + switch (((VMArrayREPRData)st.REPRData).ss.boxed_primitive) { case StorageSpec.BP_INT: obj = new VMArrayInstance_i(); break; @@ -52,7 +52,10 @@ public void compose(ThreadContext tc, STable st, SixModelObject repr_info) { case StorageSpec.BP_INT: case StorageSpec.BP_NUM: case StorageSpec.BP_STR: - st.REPRData = ss; + VMArrayREPRData reprData = new VMArrayREPRData(); + reprData.type = type; + reprData.ss = ss; + st.REPRData = reprData; break; default: if (ss.inlineable != StorageSpec.REFERENCE) @@ -67,7 +70,7 @@ public SixModelObject deserialize_stub(ThreadContext tc, STable st) { obj = new VMArrayInstance(); } else { - switch (((StorageSpec)st.REPRData).boxed_primitive) { + switch (((VMArrayREPRData)st.REPRData).ss.boxed_primitive) { case StorageSpec.BP_INT: obj = new VMArrayInstance_i(); break; @@ -93,8 +96,9 @@ public void deserialize_finish(ThreadContext tc, STable st, obj.bind_pos_boxed(tc, i, reader.readRef()); } else { + short boxPrim = ((VMArrayREPRData)st.REPRData).ss.boxed_primitive; for (long i = 0; i < elems; i++) { - switch (((StorageSpec)obj.st.REPRData).boxed_primitive) { + switch (boxPrim) { case StorageSpec.BP_INT: tc.native_i = reader.readLong(); break; @@ -120,9 +124,10 @@ public void serialize(ThreadContext tc, SerializationWriter writer, SixModelObje writer.writeRef(obj.at_pos_boxed(tc, i)); } else { + short boxPrim = ((VMArrayREPRData)obj.st.REPRData).ss.boxed_primitive; for (long i = 0; i < elems; i++) { obj.at_pos_native(tc, i); - switch (((StorageSpec)obj.st.REPRData).boxed_primitive) { + switch (boxPrim) { case StorageSpec.BP_INT: writer.writeInt(tc.native_i); break; @@ -140,6 +145,34 @@ public void serialize(ThreadContext tc, SerializationWriter writer, SixModelObje } public StorageSpec get_value_storage_spec(ThreadContext tc, STable st) { - return st.REPRData == null ? StorageSpec.BOXED : (StorageSpec)st.REPRData; + return st.REPRData == null ? StorageSpec.BOXED : ((VMArrayREPRData)st.REPRData).ss; + } + + /** + * REPR data serialization. Serializes the per-type representation data that + * is attached to the supplied STable. + */ + public void serialize_repr_data(ThreadContext tc, STable st, SerializationWriter writer) + { + writer.writeRef(st.REPRData == null + ? null + : ((VMArrayREPRData)st.REPRData).type); + } + + /** + * REPR data deserialization. Deserializes the per-type representation data and + * attaches it to the supplied STable. + */ + public void deserialize_repr_data(ThreadContext tc, STable st, SerializationReader reader) + { + if (reader.version >= 7) { + SixModelObject type = reader.readRef(); + if (type != null) { + VMArrayREPRData reprData = new VMArrayREPRData(); + reprData.type = type; + reprData.ss = type.st.REPR.get_storage_spec(tc, type.st); + st.REPRData = reprData; + } + } } } diff --git a/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArrayREPRData.java b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArrayREPRData.java new file mode 100644 index 0000000000..c042f99ef0 --- /dev/null +++ b/src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArrayREPRData.java @@ -0,0 +1,9 @@ +package org.perl6.nqp.sixmodel.reprs; + +import org.perl6.nqp.sixmodel.SixModelObject; +import org.perl6.nqp.sixmodel.StorageSpec; + +public class VMArrayREPRData { + public StorageSpec ss; + public SixModelObject type; +}