basic support for struct constants. still broken

This commit is contained in:
David Renshaw 2014-10-06 09:35:26 -04:00
parent ed7a16e4dc
commit 95d0898c3f
6 changed files with 60 additions and 13 deletions

View file

@ -978,7 +978,7 @@ private:
uint64_t typeId = field.getContainingStruct().getProto().getId();
kj::String defaultParams = defaultOffset == 0 ? kj::str() : kj::str(
"Schemas.b_", kj::hex(typeId), ", ", defaultOffset * 8, ", ", defaultSize);
"Schemas.b_", kj::hex(typeId), ".buffer, ", defaultOffset * 8, ", ", defaultSize);
kj::String blobKind = typeBody.which() == schema::Type::TEXT ? kj::str("Text") : kj::str("Data");
kj::String setterInputType = typeBody.which() == schema::Type::TEXT ? kj::str("String") : kj::str("byte []");
@ -1343,7 +1343,7 @@ private:
kj::strTree(spaces(indent),
"public static final org.capnproto.Text.Reader ", upperCase,
" = new org.capnproto.Text.Reader(Schemas.b_",
kj::hex(proto.getId()), ", ", schema.getValueSchemaOffset(),
kj::hex(proto.getId()), ".buffer, ", schema.getValueSchemaOffset(),
", ", constProto.getValue().getText().size(), ");\n")
};
}
@ -1354,18 +1354,18 @@ private:
kj::strTree(spaces(indent),
"public static final org.capnproto.Data.Reader ", upperCase,
" = new org.capnproto.Data.Reader(Schemas.b_",
kj::hex(proto.getId()), ", ", schema.getValueSchemaOffset(),
kj::hex(proto.getId()), ".buffer, ", schema.getValueSchemaOffset(),
", ", constProto.getValue().getData().size(), ");\n")
};
}
case schema::Value::STRUCT: {
kj::String constType = kj::strTree(
"::capnp::_::ConstStruct<", typeName_, ">").flatten();
return ConstText {
true,
kj::strTree("const ", constType, ' ', scope, upperCase, "(::capnp::schemas::b_",
kj::hex(proto.getId()), ".words + ", schema.getValueSchemaOffset(), ");\n")
kj::strTree(spaces(indent),
"public static final ", typeName_, ".Reader ", upperCase, "=\n",
spaces(indent), " new ", typeName_, ".Reader((new org.capnproto.PointerReader(Schemas.b_",
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getStruct());\n")
};
}
@ -1490,7 +1490,7 @@ private:
// Java limits method code size to 64KB. Maybe we should use class.getResource()?
auto schemaDef = kj::strTree(
"public static final java.nio.ByteBuffer b_", hexId, " =\n",
"public static final org.capnproto.SegmentReader b_", hexId, " =\n",
" org.capnproto.GeneratedClassSupport.decodeRawBytes(\n",
" ", kj::mv(schemaLiteral), " \"\"",
");\n");

View file

@ -140,6 +140,11 @@ class EncodingSuite extends FunSuite {
(TestConstants.DATA_CONST.toArray()) should equal (TestUtil.data("bar"));
(TestConstants.ENUM_CONST) should equal (TestEnum.CORGE);
{
val subReader = TestConstants.STRUCT_CONST;
//subReader.getBoolField() should equal (true);
//subReader.getInt8Field() should equal (-12);
}
}

View file

@ -270,6 +270,48 @@ struct TestConstants {
const float64Const :Float64 = -123e45;
const textConst :Text = "foo";
const dataConst :Data = "bar";
const structConst :TestAllTypes = (
voidField = void,
boolField = true,
int8Field = -12,
int16Field = 3456,
int32Field = -78901234,
int64Field = 56789012345678,
uInt8Field = 90,
uInt16Field = 1234,
uInt32Field = 56789012,
uInt64Field = 345678901234567890,
float32Field = -1.25e-10,
float64Field = 345,
textField = "baz",
dataField = "qux",
structField = (
textField = "nested",
structField = (textField = "really nested")),
enumField = baz,
# interfaceField can't have a default
voidList = [void, void, void],
boolList = [false, true, false, true, true],
int8List = [12, -34, -0x80, 0x7f],
int16List = [1234, -5678, -0x8000, 0x7fff],
int32List = [12345678, -90123456, -0x80000000, 0x7fffffff],
int64List = [123456789012345, -678901234567890, -0x8000000000000000, 0x7fffffffffffffff],
uInt8List = [12, 34, 0, 0xff],
uInt16List = [1234, 5678, 0, 0xffff],
uInt32List = [12345678, 90123456, 0, 0xffffffff],
uInt64List = [123456789012345, 678901234567890, 0, 0xffffffffffffffff],
float32List = [0, 1234567, 1e37, -1e37, 1e-37, -1e-37],
float64List = [0, 123456789012345, 1e306, -1e306, 1e-306, -1e-306],
textList = ["quux", "corge", "grault"],
dataList = ["garply", "waldo", "fred"],
structList = [
(textField = "x structlist 1"),
(textField = "x structlist 2"),
(textField = "x structlist 3")],
enumList = [qux, bar, grault]
# interfaceList can't have a default
);
# ...
const enumConst :TestEnum = corge;
}

View file

@ -1,9 +1,9 @@
package org.capnproto;
public final class GeneratedClassSupport {
public static java.nio.ByteBuffer decodeRawBytes(String s) {
public static SegmentReader decodeRawBytes(String s) {
try {
return java.nio.ByteBuffer.wrap(s.getBytes("ISO_8859-1")).asReadOnlyBuffer();
return new SegmentReader(java.nio.ByteBuffer.wrap(s.getBytes("ISO_8859-1")).asReadOnlyBuffer(), null);
} catch (Exception e) {
throw new Error("could not decode raw bytes from String");
}

View file

@ -6,8 +6,8 @@ public final class PointerReader {
final int nestingLimit;
public PointerReader() {
this.segment = null;
this.pointer = 0; // XXX ?
this.segment = SegmentReader.EMPTY;
this.pointer = 0;
this.nestingLimit = 0x7fffffff;
}

View file

@ -4,7 +4,7 @@ import java.nio.ByteBuffer;
public class SegmentReader {
final ByteBuffer buffer;
public final ByteBuffer buffer;
final Arena arena;
public SegmentReader(ByteBuffer buffer, Arena arena) {