From f8cdfdea0902ec3e4776db024797cf6af143f498 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Mon, 9 Nov 2020 17:33:20 +0000 Subject: [PATCH] set AnyPointer from AnyPointer --- .../src/test/java/org/capnproto/EncodingTest.java | 13 +++++++++++++ runtime/src/main/java/org/capnproto/AnyPointer.java | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/compiler/src/test/java/org/capnproto/EncodingTest.java b/compiler/src/test/java/org/capnproto/EncodingTest.java index fde64a1..c0f2d64 100644 --- a/compiler/src/test/java/org/capnproto/EncodingTest.java +++ b/compiler/src/test/java/org/capnproto/EncodingTest.java @@ -844,6 +844,19 @@ 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.set(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..fe8ee04 100644 --- a/runtime/src/main/java/org/capnproto/AnyPointer.java +++ b/runtime/src/main/java/org/capnproto/AnyPointer.java @@ -86,6 +86,18 @@ public final class AnyPointer { factory.setPointerBuilder(this.segment, this.pointer, reader); } + public void set(AnyPointer.Reader reader) { + if (reader.isNull()) { + WireHelpers.zeroObject(this.segment, this.pointer); + WireHelpers.zeroPointerAndFars(this.segment, this.pointer); + } + else { + WireHelpers.copyPointer( + this.segment, this.pointer, + reader.segment, reader.pointer, reader.nestingLimit); + } + } + public final Reader asReader() { return new Reader(segment, pointer, java.lang.Integer.MAX_VALUE); }