diff --git a/runtime/src/main/java/org/capnproto/StructPointer.java b/runtime/src/main/java/org/capnproto/StructPointer.java index 582e6eb..75d9930 100644 --- a/runtime/src/main/java/org/capnproto/StructPointer.java +++ b/runtime/src/main/java/org/capnproto/StructPointer.java @@ -34,7 +34,7 @@ final class StructPointer{ } public static int wordSize(long ref) { - return (int)dataSize(ref) + (int)ptrCount(ref); + return Short.toUnsignedInt(dataSize(ref)) + Short.toUnsignedInt(ptrCount(ref)); } public static void setFromStructSize(ByteBuffer buffer, int offset, StructSize size) { diff --git a/runtime/src/test/java/org/capnproto/StructPointerTest.java b/runtime/src/test/java/org/capnproto/StructPointerTest.java new file mode 100644 index 0000000..d1a3af3 --- /dev/null +++ b/runtime/src/test/java/org/capnproto/StructPointerTest.java @@ -0,0 +1,21 @@ +package org.capnproto; + +import org.junit.Assert; +import org.junit.Test; + +public class StructPointerTest { + + @Test + public void testWordSize() { + Assert.assertEquals( + 3, + StructPointer.wordSize(0x0001000200000000L)); + } + + @Test + public void testWordSizeUnderflow() { + Assert.assertEquals( + 0x1fffe, + StructPointer.wordSize(0xffffffff00000000L)); + } +}