basic support for initGroup
This commit is contained in:
parent
4464f3f728
commit
a59a5c403e
5 changed files with 72 additions and 29 deletions
|
@ -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")
|
||||||
};
|
};
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue