From 1ab3601bf024703fbb5ac45aef7dd83ccfb23197 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 15 Oct 2014 18:34:05 -0400 Subject: [PATCH] a bit of work on copyPointer --- .../java/org/capnproto/StructPointer.java | 1 + .../main/java/org/capnproto/WireHelpers.java | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/runtime/src/main/java/org/capnproto/StructPointer.java b/runtime/src/main/java/org/capnproto/StructPointer.java index 87a9bb4..98c82f4 100644 --- a/runtime/src/main/java/org/capnproto/StructPointer.java +++ b/runtime/src/main/java/org/capnproto/StructPointer.java @@ -25,6 +25,7 @@ import java.nio.ByteBuffer; final class StructPointer{ public static short dataSize(long ref) { + // in words. return (short)(WirePointer.upper32Bits(ref) & 0xffff); } diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 875738f..0f1c8fb 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -551,8 +551,13 @@ final class WireHelpers { throw new DecodeException("Message is too deeply nested or contains cycles. See org.capnproto.ReaderOptions."); } resolved.segment.arena.checkReadLimit(StructPointer.wordSize(resolved.ref)); - // TODO - //return setStructPointer(dstSegment, dstOffset, ...); + return setStructPointer(dstSegment, dstOffset, + new StructReader(srcSegment, + resolved.ptr, + resolved.ptr + StructPointer.dataSize(resolved.ref), + StructPointer.dataSize(resolved.ref) * Constants.BITS_PER_WORD, + StructPointer.ptrCount(resolved.ref), + (byte) 0, nestingLimit - 1)); case WirePointer.LIST : byte elementSize = ListPointer.elementSize(resolved.ref); if (nestingLimit <= 0) { @@ -560,9 +565,19 @@ final class WireHelpers { } if (elementSize == ElementSize.INLINE_COMPOSITE) { int wordCount = ListPointer.inlineCompositeWordCount(resolved.ref); - //long tag = - } else { + long tag = WirePointer.get(resolved.segment.buffer, resolved.ptr); + int ptr = resolved.ptr + 1; + resolved.segment.arena.checkReadLimit(wordCount + 1); + + if (WirePointer.kind(tag) != WirePointer.STRUCT) { + throw new DecodeException("INLINE_COMPOSITE lists of non-STRUCT type are not supported."); + } + + int elementCount = WirePointer.inlineCompositeListElementCount(tag); + // ... + } else { + // ... } case WirePointer.FAR :