diff --git a/compiler/src/test/java/org/capnproto/EncodingTest.java b/compiler/src/test/java/org/capnproto/EncodingTest.java index fde64a1..1f10853 100644 --- a/compiler/src/test/java/org/capnproto/EncodingTest.java +++ b/compiler/src/test/java/org/capnproto/EncodingTest.java @@ -844,6 +844,17 @@ public class EncodingTest { Assert.assertEquals(listReader.get(0).getInt8Field(), 11); TestUtil.checkTestMessage(listReader.get(1)); } + + @org.junit.Test + public void testCopyAnyPointer() { + MessageBuilder message1 = new MessageBuilder(); + Test.TestAllTypes.Builder root1 = message1.initRoot(Test.TestAllTypes.factory); + TestUtil.initTestMessage(root1); + + MessageBuilder message2 = new MessageBuilder(); + AnyPointer.Builder root2 = message2.initRoot(AnyPointer.factory); + root2.setAs(AnyPointer.factory, message1.getRoot(AnyPointer.factory).asReader()); + + TestUtil.checkTestMessage(root2.getAs(Test.TestAllTypes.factory)); + } } - - diff --git a/runtime/src/main/java/org/capnproto/AnyPointer.java b/runtime/src/main/java/org/capnproto/AnyPointer.java index 7123080..12c0e6c 100644 --- a/runtime/src/main/java/org/capnproto/AnyPointer.java +++ b/runtime/src/main/java/org/capnproto/AnyPointer.java @@ -22,7 +22,10 @@ package org.capnproto; public final class AnyPointer { - public static final class Factory implements PointerFactory { + public static final class Factory + implements PointerFactory, + SetPointerBuilder + { public final Reader fromPointerReader(SegmentReader segment, int pointer, int nestingLimit) { return new Reader(segment, pointer, nestingLimit); } @@ -34,6 +37,15 @@ public final class AnyPointer { result.clear(); return result; } + public void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) { + if (value.isNull()) { + WireHelpers.zeroObject(segment, pointer); + WireHelpers.zeroPointerAndFars(segment, pointer); + } + else { + WireHelpers.copyPointer(segment, pointer, value.segment, value.pointer, value.nestingLimit); + } + } } public static final Factory factory = new Factory();