diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala index 7df4a75..48a31aa 100644 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -161,13 +161,11 @@ object TestUtil { assert(textList.get(1).toString() == "xyzzy"); assert(textList.get(2).toString() == "thud"); - /* val structList = builder.getStructList(); - assert(3 == structList.size()); - assert(structList.get(0).getTextField().toString() == "structlist 1") - assert(structList.get(1).getTextField().toString() == "structlist 2") - assert(structList.get(2).getTextField().toString() == "structlist 3") - */ + //assert(3 == structList.size()); + //assert(structList.get(0).getTextField().toString() == "structlist 1") + //assert(structList.get(1).getTextField().toString() == "structlist 2") + //assert(structList.get(2).getTextField().toString() == "structlist 3") val enumList = builder.getEnumList(); (enumList.get(0)) should equal (TestEnum.FOO); diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index c164edd..5ae5db2 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -339,12 +339,29 @@ final class WireHelpers { if (oldSize == ElementSize.INLINE_COMPOSITE) { //# Existing list is INLINE_COMPOSITE, but we need to verify that the sizes match. long oldTag = resolved.segment.get(resolved.ptr); + int oldPtr = resolved.ptr + Constants.POINTER_SIZE_IN_WORDS; + if (WirePointer.kind(oldTag) != WirePointer.STRUCT) { + throw new DecodeException("INLINE_COMPOSITE list with non-STRUCT elements not supported."); + } + int oldDataSize = StructPointer.dataSize(oldTag); + int oldPointerCount = StructPointer.ptrCount(oldTag); + int oldStep = (oldDataSize + oldPointerCount * Constants.POINTER_SIZE_IN_WORDS); + int elementCount = WirePointer.inlineCompositeListElementCount(oldTag); + if (oldDataSize >= elementSize.data && oldPointerCount >= elementSize.pointers) { + //# Old size is at least as large as we need. Ship it. + return factory.constructBuilder(resolved.segment, resolved.ptr * Constants.BYTES_PER_WORD, + elementCount, oldDataSize * Constants.BITS_PER_WORD, oldPointerCount, + ElementSize.INLINE_COMPOSITE); + } + + //# The structs in this list are smaller than expected, probably written using an older + //# version of the protocol. We need to make a copy and expand them. + throw new Error("unimplemented"); } else { - // ... + //# We're upgrading from a non-struct list. + throw new Error("unimplemented"); } - - throw new Error("getWritableStructListPointer is unimplemented"); } // size is in bytes