basic support for initGroup

This commit is contained in:
David Renshaw 2014-09-24 12:18:52 -04:00
parent 4464f3f728
commit a59a5c403e
5 changed files with 72 additions and 29 deletions

View file

@ -415,18 +415,18 @@ private:
static kj::StringPtr maskType(schema::Type::Which whichType) { static kj::StringPtr maskType(schema::Type::Which whichType) {
switch (whichType) { switch (whichType) {
case schema::Type::BOOL: return "bool"; case schema::Type::BOOL: return "boolean";
case schema::Type::INT8: return " ::uint8_t"; case schema::Type::INT8: return "byte";
case schema::Type::INT16: return " ::uint16_t"; case schema::Type::INT16: return "short";
case schema::Type::INT32: return " ::uint32_t"; case schema::Type::INT32: return "int";
case schema::Type::INT64: return " ::uint64_t"; case schema::Type::INT64: return "long";
case schema::Type::UINT8: return " ::uint8_t"; case schema::Type::UINT8: return "byte";
case schema::Type::UINT16: return " ::uint16_t"; case schema::Type::UINT16: return "short";
case schema::Type::UINT32: return " ::uint32_t"; case schema::Type::UINT32: return "int";
case schema::Type::UINT64: return " ::uint64_t"; case schema::Type::UINT64: return "long";
case schema::Type::FLOAT32: return " ::uint32_t"; case schema::Type::FLOAT32: return "int";
case schema::Type::FLOAT64: return " ::uint64_t"; case schema::Type::FLOAT64: return "long";
case schema::Type::ENUM: return " ::uint16_t"; case schema::Type::ENUM: return "short";
case schema::Type::VOID: case schema::Type::VOID:
case schema::Type::TEXT: case schema::Type::TEXT:
@ -440,6 +440,34 @@ private:
KJ_UNREACHABLE; KJ_UNREACHABLE;
} }
static kj::StringPtr maskZeroLiteral(schema::Type::Which whichType) {
switch (whichType) {
case schema::Type::BOOL: return "false";
case schema::Type::INT8: return "(byte)0";
case schema::Type::INT16: return "(short)0";
case schema::Type::INT32: return "0";
case schema::Type::INT64: return "0L";
case schema::Type::UINT8: return "(byte)0";
case schema::Type::UINT16: return "(short)0";
case schema::Type::UINT32: return "0";
case schema::Type::UINT64: return "0L";
case schema::Type::FLOAT32: return "0";
case schema::Type::FLOAT64: return "0L";
case schema::Type::ENUM: return "(short)0";
case schema::Type::VOID:
case schema::Type::TEXT:
case schema::Type::DATA:
case schema::Type::LIST:
case schema::Type::STRUCT:
case schema::Type::INTERFACE:
case schema::Type::ANY_POINTER:
KJ_FAIL_REQUIRE("Should only be called for data types.");
}
KJ_UNREACHABLE;
}
struct Slot { struct Slot {
schema::Type::Which whichType; schema::Type::Which whichType;
uint offset; uint offset;
@ -647,7 +675,24 @@ private:
spaces(indent), " return new ", scope, titleCase, ".Builder(_builder);\n", spaces(indent), " return new ", scope, titleCase, ".Builder(_builder);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final ", titleCase, ".Builder init", titleCase, "() {\n", spaces(indent), " public final ", titleCase, ".Builder init", titleCase, "() {\n",
spaces(indent), " throw new Error();\n", unionDiscrim.set,
KJ_MAP(slot, slots) {
switch (sectionFor(slot.whichType)) {
case Section::NONE:
return kj::strTree();
case Section::DATA:
return kj::strTree(
spaces(indent),
" _builder.set", toTitleCase(maskType(slot.whichType)),
"Field(", slot.offset, ",", maskZeroLiteral(slot.whichType),
");\n");
case Section::POINTERS:
return kj::strTree(
spaces(indent), " _builder.getPointerField(", slot.offset, ").clear();\n");
}
KJ_UNREACHABLE;
},
" return new ", scope, titleCase, ".Builder(_builder);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
"\n"), "\n"),
@ -669,21 +714,6 @@ private:
"}\n"), "}\n"),
"inline ", scope, titleCase, "::Builder ", scope, "Builder::init", titleCase, "() {\n", "inline ", scope, titleCase, "::Builder ", scope, "Builder::init", titleCase, "() {\n",
unionDiscrim.set, unionDiscrim.set,
KJ_MAP(slot, slots) {
switch (sectionFor(slot.whichType)) {
case Section::NONE:
return kj::strTree();
case Section::DATA:
return kj::strTree(
" _builder.setDataField<", maskType(slot.whichType), ">(",
slot.offset, " * ::capnp::ELEMENTS, 0);\n");
case Section::POINTERS:
return kj::strTree(
" _builder.getPointerField(", slot.offset,
" * ::capnp::POINTERS).clear();\n");
}
KJ_UNREACHABLE;
},
" return ", scope, titleCase, "::Builder(_builder);\n" " return ", scope, titleCase, "::Builder(_builder);\n"
"}\n") "}\n")
}; };

View file

@ -35,7 +35,7 @@ class EncodingSuite extends FunSuite {
val builder = new MessageBuilder(); val builder = new MessageBuilder();
val root = builder.initRoot(TestGroups.factory); val root = builder.initRoot(TestGroups.factory);
//val foo = root.getGroups().initFoo(); val foo = root.getGroups().initFoo();
} }

View file

@ -168,6 +168,7 @@ struct TestGroups {
corge @0 :Int32; corge @0 :Int32;
grault @2 :Int64; grault @2 :Int64;
garply @8 :Text; garply @8 :Text;
quux @9 : Void;
} }
bar :group { bar :group {
corge @3 :Int32; corge @3 :Int32;

View file

@ -58,4 +58,8 @@ public final class PointerBuilder {
throw new Error("unimplemented"); throw new Error("unimplemented");
} }
public final void clear() {
WireHelpers.zeroObject(this.segment, this.pointer);
this.segment.buffer.putLong(this.pointer * 8, 0L);
}
} }

View file

@ -135,6 +135,14 @@ final class WireHelpers {
} }
} }
public static void zeroObject(SegmentBuilder segment, int refOffset) {
//# Zero out the pointed-to object. Use when the pointer is
//# about to be overwritten making the target object no longer
//# reachable.
// TODO
}
public static StructBuilder initStructPointer(int refOffset, public static StructBuilder initStructPointer(int refOffset,
SegmentBuilder segment, SegmentBuilder segment,
StructSize size) { StructSize size) {