From 195d688970785103c8f6607e325596814e95010a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 6 Oct 2014 14:54:15 -0400 Subject: [PATCH] list reader defaults --- compiler/src/main/cpp/capnpc-java.c++ | 88 +------------------ .../test/scala/org/capnproto/TestUtil.scala | 18 ++++ compiler/src/test/schema/test.capnp | 25 ++++++ .../main/java/org/capnproto/AnyPointer.java | 2 +- .../src/main/java/org/capnproto/DataList.java | 4 +- .../src/main/java/org/capnproto/EnumList.java | 4 +- .../java/org/capnproto/FromPointerReader.java | 2 +- .../src/main/java/org/capnproto/ListList.java | 6 +- .../java/org/capnproto/PointerReader.java | 11 +++ .../java/org/capnproto/PrimitiveList.java | 30 +++---- .../main/java/org/capnproto/StructList.java | 4 +- .../src/main/java/org/capnproto/TextList.java | 4 +- .../main/java/org/capnproto/WireHelpers.java | 10 ++- 13 files changed, 95 insertions(+), 113 deletions(-) diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 54b994f..35d6f09 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -1052,94 +1052,13 @@ private: } else if (kind == FieldKind::LIST) { uint64_t typeId = field.getContainingStruct().getProto().getId(); - kj::String defaultParam = defaultOffset == 0 ? kj::str() : kj::str( - ",\n ::capnp::schemas::s_", kj::hex(typeId), ".encodedNode + ", defaultOffset, - defaultSize == 0 ? kj::strTree() : kj::strTree(", ", defaultSize)); + kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str( + "Schemas.b_", kj::hex(typeId), ", ", defaultOffset); kj::String listFactory = makeListFactoryArg(typeBody); - kj::String fieldSize; kj::String readerClass = kj::str(typeName(typeBody, kj::str(".Reader"))); kj::String builderClass = kj::str(typeName(typeBody, kj::str(".Builder"))); - bool isStructOrCapList = false; - bool isStructList = false; - if (kind == FieldKind::LIST) { - bool primitiveElement = false; - bool interface = false; - switch (typeBody.getList().getElementType().which()) { - case schema::Type::VOID: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.VOID"); - break; - case schema::Type::BOOL: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.BIT"); - break; - - case schema::Type::INT8: - case schema::Type::UINT8: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.BYTE"); - break; - - - case schema::Type::INT16: - case schema::Type::UINT16: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES"); - break; - - case schema::Type::INT32: - case schema::Type::UINT32: - case schema::Type::FLOAT32: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.FOUR_BYTES"); - break; - - case schema::Type::INT64: - case schema::Type::UINT64: - case schema::Type::FLOAT64: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.EIGHT_BYTES"); - break; - - case schema::Type::ENUM: - primitiveElement = true; - fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES"); - break; - - case schema::Type::TEXT: - primitiveElement = false; - fieldSize = kj::str("org.capnproto.FieldSize.POINTER"); - break; - case schema::Type::DATA: - primitiveElement = false; - fieldSize = kj::str("org.capnproto.FieldSize.POINTER"); - break; - case schema::Type::LIST: - primitiveElement = false; - fieldSize = kj::str("org.capnproto.FieldSize.POINTER"); - break; - case schema::Type::ANY_POINTER: - primitiveElement = false; - break; - - case schema::Type::INTERFACE: - isStructOrCapList = true; - primitiveElement = false; - interface = true; - break; - - case schema::Type::STRUCT: - isStructList = true; - isStructOrCapList = true; - primitiveElement = false; - fieldSize = kj::str(typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding"); - break; - } - } - - return FieldText { kj::strTree( kj::mv(unionDiscrim.readerIsDecl), @@ -1149,7 +1068,8 @@ private: spaces(indent), " public final ", readerClass, " get", titleCase, "() {\n", - spaces(indent), " return (", listFactory, ").fromPointerReader(_reader.getPointerField(", offset, "));\n", + spaces(indent), " return (", listFactory, ").fromPointerReader(_reader.getPointerField(", offset, "),", + defaultParams, ");\n", spaces(indent), " }\n", "\n"), diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala index adcfeaa..65e2ce2 100644 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -272,6 +272,24 @@ object TestUtil { } } + + reader.getVoidList().size() should equal (6); + { + val listReader = reader.getBoolList(); + listReader.size() should equal (4); + listReader.get(0) should equal (true); + listReader.get(1) should equal (false); + listReader.get(2) should equal (false); + listReader.get(3) should equal (true); + } + + { + val listReader = reader.getInt8List(); + listReader.size() should equal (2); + listReader.get(0) should equal (111); + listReader.get(1) should equal (-111); + } + } } diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index d454598..fb3666e 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -114,6 +114,31 @@ struct TestDefaults { # interfaceList can't have a default ); + enumField @15 : TestEnum = corge; + interfaceField @16 : Void; # TODO + + voidList @17 : List(Void) = [void, void, void, void, void, void]; + boolList @18 : List(Bool) = [true, false, false, true]; + int8List @19 : List(Int8) = [111, -111]; + int16List @20 : List(Int16) = [11111, -11111]; + int32List @21 : List(Int32) = [111111111, -111111111]; + int64List @22 : List(Int64) = [1111111111111111111, -1111111111111111111]; + uInt8List @23 : List(UInt8) = [111, 222] ; + uInt16List @24 : List(UInt16) = [33333, 44444]; + uInt32List @25 : List(UInt32) = [3333333333]; + uInt64List @26 : List(UInt64) = [11111111111111111111]; + float32List @27 : List(Float32) = [5555.5, inf, -inf, nan]; + float64List @28 : List(Float64) = [7777.75, inf, -inf, nan]; + textList @29 : List(Text) = ["plugh", "xyzzy", "thud"]; + dataList @30 : List(Data) = ["oops", "exhausted", "rfc3092"]; + structList @31 : List(TestAllTypes) = [ + (textField = "structlist 1"), + (textField = "structlist 2"), + (textField = "structlist 3")]; + enumList @32 : List(TestEnum) = [foo, garply]; + interfaceList @33 : List(Void); # TODO + + } struct TestAnyPointer { diff --git a/runtime/src/main/java/org/capnproto/AnyPointer.java b/runtime/src/main/java/org/capnproto/AnyPointer.java index bd49017..628afc5 100644 --- a/runtime/src/main/java/org/capnproto/AnyPointer.java +++ b/runtime/src/main/java/org/capnproto/AnyPointer.java @@ -14,7 +14,7 @@ public final class AnyPointer { } public final T getAsList(FromPointerReader factory) { - return factory.fromPointerReader(this.reader); + return factory.fromPointerReader(this.reader, null, 0); } } diff --git a/runtime/src/main/java/org/capnproto/DataList.java b/runtime/src/main/java/org/capnproto/DataList.java index 08c6f1c..de1623b 100644 --- a/runtime/src/main/java/org/capnproto/DataList.java +++ b/runtime/src/main/java/org/capnproto/DataList.java @@ -2,8 +2,8 @@ package org.capnproto; public final class DataList { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.POINTER)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { diff --git a/runtime/src/main/java/org/capnproto/EnumList.java b/runtime/src/main/java/org/capnproto/EnumList.java index 7f2982a..28b0382 100644 --- a/runtime/src/main/java/org/capnproto/EnumList.java +++ b/runtime/src/main/java/org/capnproto/EnumList.java @@ -16,8 +16,8 @@ public class EnumList { this.values = values; } - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(values, reader.getList(FieldSize.TWO_BYTES)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(values, reader.getList(FieldSize.TWO_BYTES, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { diff --git a/runtime/src/main/java/org/capnproto/FromPointerReader.java b/runtime/src/main/java/org/capnproto/FromPointerReader.java index cb22e07..27cde66 100644 --- a/runtime/src/main/java/org/capnproto/FromPointerReader.java +++ b/runtime/src/main/java/org/capnproto/FromPointerReader.java @@ -1,5 +1,5 @@ package org.capnproto; public interface FromPointerReader { - T fromPointerReader(PointerReader reader); + T fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset); } diff --git a/runtime/src/main/java/org/capnproto/ListList.java b/runtime/src/main/java/org/capnproto/ListList.java index 9d32f5c..b63c4f2 100644 --- a/runtime/src/main/java/org/capnproto/ListList.java +++ b/runtime/src/main/java/org/capnproto/ListList.java @@ -10,8 +10,8 @@ public final class ListList { this.factory = factory; } - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(factory, reader.getList(FieldSize.POINTER)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(factory, reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -38,7 +38,7 @@ public final class ListList { } public T get(int index) { - return this.factory.fromPointerReader(this.reader.getPointerElement(index)); + return this.factory.fromPointerReader(this.reader.getPointerElement(index), null, 0); } } diff --git a/runtime/src/main/java/org/capnproto/PointerReader.java b/runtime/src/main/java/org/capnproto/PointerReader.java index d58216b..2c938b1 100644 --- a/runtime/src/main/java/org/capnproto/PointerReader.java +++ b/runtime/src/main/java/org/capnproto/PointerReader.java @@ -45,6 +45,17 @@ public final class PointerReader { public ListReader getList(byte expectedElementSize) { return WireHelpers.readListPointer(this.segment, this.pointer, + null, 0, + expectedElementSize, + this.nestingLimit); + } + + + public ListReader getList(byte expectedElementSize, SegmentReader defaultSegment, int defaultOffset) { + return WireHelpers.readListPointer(this.segment, + this.pointer, + defaultSegment, + defaultOffset, expectedElementSize, this.nestingLimit); } diff --git a/runtime/src/main/java/org/capnproto/PrimitiveList.java b/runtime/src/main/java/org/capnproto/PrimitiveList.java index eb52360..2b639e8 100644 --- a/runtime/src/main/java/org/capnproto/PrimitiveList.java +++ b/runtime/src/main/java/org/capnproto/PrimitiveList.java @@ -3,8 +3,8 @@ package org.capnproto; public class PrimitiveList { public static class Void { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.VOID)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.VOID, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -50,8 +50,8 @@ public class PrimitiveList { public static class Boolean { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.BIT)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.BIT, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -103,8 +103,8 @@ public class PrimitiveList { public static class Byte { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.BYTE)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.BYTE, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -157,8 +157,8 @@ public class PrimitiveList { public static class Short { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.TWO_BYTES)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.TWO_BYTES, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -211,8 +211,8 @@ public class PrimitiveList { public static class Int { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.FOUR_BYTES)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.FOUR_BYTES, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -264,8 +264,8 @@ public class PrimitiveList { public static class Float { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.FOUR_BYTES)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.FOUR_BYTES, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { @@ -318,7 +318,7 @@ public class PrimitiveList { public static class Long { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { return new Reader(reader.getList(FieldSize.EIGHT_BYTES)); } @@ -371,8 +371,8 @@ public class PrimitiveList { public static class Double { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.EIGHT_BYTES)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.EIGHT_BYTES, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { diff --git a/runtime/src/main/java/org/capnproto/StructList.java b/runtime/src/main/java/org/capnproto/StructList.java index 4c45d91..c6cd9d9 100644 --- a/runtime/src/main/java/org/capnproto/StructList.java +++ b/runtime/src/main/java/org/capnproto/StructList.java @@ -10,8 +10,8 @@ public final class StructList { this.factory = factory; } - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(factory, reader.getList(FieldSize.INLINE_COMPOSITE)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(factory, reader.getList(FieldSize.INLINE_COMPOSITE, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { diff --git a/runtime/src/main/java/org/capnproto/TextList.java b/runtime/src/main/java/org/capnproto/TextList.java index 158c54a..84e4e1e 100644 --- a/runtime/src/main/java/org/capnproto/TextList.java +++ b/runtime/src/main/java/org/capnproto/TextList.java @@ -2,8 +2,8 @@ package org.capnproto; public final class TextList { public static final class Factory implements ListFactory { - public final Reader fromPointerReader(PointerReader reader) { - return new Reader(reader.getList(FieldSize.POINTER)); + public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { + return new Reader(reader.getList(FieldSize.POINTER, defaultSegment, defaultOffset)); } public final Builder fromPointerBuilder(PointerBuilder builder) { diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 531a6b5..dd3e73d 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -464,13 +464,21 @@ final class WireHelpers { static ListReader readListPointer(SegmentReader segment, int refOffset, + SegmentReader defaultSegment, + int defaultOffset, byte expectedElementSize, int nestingLimit) { long ref = WirePointer.get(segment.buffer, refOffset); if (WirePointer.isNull(ref)) { - return new ListReader(); + if (defaultSegment == null) { + return new ListReader(); + } else { + segment = defaultSegment; + refOffset = defaultOffset; + ref = WirePointer.get(segment.buffer, refOffset); + } } if (nestingLimit <= 0) {