From d1e938130f52d93573466dec9b6583449e95b28a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 5 Jun 2014 18:25:29 -0400 Subject: [PATCH] getWritableStructPointer --- compiler/src/main/cpp/capnpc-java.c++ | 3 ++- .../test/scala/org/capnproto/TestUtil.scala | 2 +- .../java/org/capnproto/PointerBuilder.java | 5 ++-- .../main/java/org/capnproto/WireHelpers.java | 23 ++++++++++++++++++- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 982dabd..8b96305 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -929,7 +929,8 @@ private: spaces(indent), " }\n", spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n", spaces(indent), " return ", type, - ".Builder.factory.fromStructBuilder(_builder.getPointerField(", offset, ").getStruct());\n", + ".Builder.factory.fromStructBuilder(_builder.getPointerField(", offset, ").getStruct(", + type, ".STRUCT_SIZE", "));\n", spaces(indent), " }\n", spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n", unionDiscrim.set, diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala index 9b126e5..577d755 100644 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -56,7 +56,7 @@ object TestUtil { //assert(builder.getTextField().toString() == "foo"); { -// val subBuilder = builder.getStructField(); + val subBuilder = builder.getStructField(); } } diff --git a/runtime/src/main/java/org/capnproto/PointerBuilder.java b/runtime/src/main/java/org/capnproto/PointerBuilder.java index c71e34f..187e380 100644 --- a/runtime/src/main/java/org/capnproto/PointerBuilder.java +++ b/runtime/src/main/java/org/capnproto/PointerBuilder.java @@ -17,9 +17,8 @@ public final class PointerBuilder { return this.segment.buffer.getLong(this.pointer) == 0; } - public final StructBuilder getStruct() { - throw new Error(); -// return WireHelpers.getWritableStructPointer(); + public final StructBuilder getStruct(StructSize size) { + return WireHelpers.getWritableStructPointer(this.pointer, this.segment, size); } public final StructBuilder initStruct(StructSize size) { diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 3882454..cf0812b 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -37,7 +37,28 @@ final class WireHelpers { public static StructBuilder getWritableStructPointer(int refOffset, SegmentBuilder segment, StructSize size) { - throw new Error("unimplemented"); + long ref = WirePointer.get(segment.buffer, refOffset); + int target = WirePointer.target(refOffset, ref); + if (WirePointer.isNull(ref)) { + return initStructPointer(refOffset, segment, size); + } + long oldRef = ref; + SegmentBuilder oldSegment = segment; + // TODO follow fars. + int oldPtrOffset = target; + + short oldDataSize = StructPointer.dataSize(WirePointer.structPointer(oldRef)); + short oldPointerCount = StructPointer.ptrCount(WirePointer.structPointer(oldRef)); + int oldPointerSectionOffset = oldPtrOffset + oldDataSize; + + if (oldDataSize < size.data || oldPointerCount < size.pointers) { + throw new Error("unimplemented"); + } else { + return new StructBuilder(oldSegment, oldPtrOffset * 8, + oldPointerSectionOffset, oldDataSize * 64, + oldPointerCount, (byte)0); + } + } public static ListBuilder initListPointer(int refOffset,