Commit 30ac512a authored by aardappel's avatar aardappel

Fixed Lobster implementation to work with latest language features

parent b04736f9
...@@ -12,32 +12,33 @@ ...@@ -12,32 +12,33 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
include "std.lobster" import std
namespace flatbuffers namespace flatbuffers
struct handle: class handle:
buf_:string buf_:string
pos_:int pos_:int
enum + sz_8 = 1, enum sizeof:
sz_16 = 2, sz_8 = 1
sz_32 = 4, sz_16 = 2
sz_64 = 8, sz_32 = 4
sz_voffset = 2, sz_64 = 8
sz_uoffset = 4, sz_voffset = 2
sz_soffset = 4, sz_uoffset = 4
sz_metadata_fields = 2 sz_soffset = 4
sz_metadata_fields = 2
struct builder:
buf:string = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" class builder:
buf = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
current_vtable:[int] = [] current_vtable:[int] = []
head:int = 0 head = 0
minalign:int = 1 minalign = 1
object_end:int = 0 object_end = 0
vtables:[int] = [] vtables:[int] = []
nested:int = false nested = false
finished:int = false finished = false
// Optionally call this right after creating the builder for a larger initial buffer. // Optionally call this right after creating the builder for a larger initial buffer.
def Initial(initial_size:int): def Initial(initial_size:int):
...@@ -75,11 +76,11 @@ struct builder: ...@@ -75,11 +76,11 @@ struct builder:
// Prepend a zero scalar to the object. Later in this function we'll // Prepend a zero scalar to the object. Later in this function we'll
// write an offset here that points to the object's vtable: // write an offset here that points to the object's vtable:
PrependInt32(0) PrependInt32(0)
object_offset := head let object_offset = head
// Write out new vtable speculatively. // Write out new vtable speculatively.
vtable_size := (current_vtable.length + sz_metadata_fields) * sz_voffset let vtable_size = (current_vtable.length + sz_metadata_fields) * sz_voffset
while current_vtable.length: while current_vtable.length:
o := current_vtable.pop() let o = current_vtable.pop()
PrependVOffsetT(if o: object_offset - o else: 0) PrependVOffsetT(if o: object_offset - o else: 0)
// The two metadata fields are written last. // The two metadata fields are written last.
// First, store the object bytesize: // First, store the object bytesize:
...@@ -91,17 +92,18 @@ struct builder: ...@@ -91,17 +92,18 @@ struct builder:
// BenchmarkVtableDeduplication for a case in which this heuristic // BenchmarkVtableDeduplication for a case in which this heuristic
// saves about 30% of the time used in writing objects with duplicate // saves about 30% of the time used in writing objects with duplicate
// tables. // tables.
existing_vtable := do(): def find_existing_table():
reverse(vtables) vt2_offset: reverse(vtables) vt2_offset:
// Find the other vtable: // Find the other vtable:
vt2_start := buf.length - vt2_offset let vt2_start = buf.length - vt2_offset
vt2_len := buf.read_int16_le(vt2_start) let vt2_len = buf.read_int16_le(vt2_start)
// Compare the other vtable to the one under consideration. // Compare the other vtable to the one under consideration.
// If they are equal, return the offset: // If they are equal, return the offset:
if vtable_size == vt2_len and if vtable_size == vt2_len and
not compare_substring(buf, Start(), buf, vt2_start, vtable_size): not compare_substring(buf, Start(), buf, vt2_start, vtable_size):
return vt2_offset from do return vt2_offset
0 return 0
let existing_vtable = find_existing_table()
if existing_vtable: if existing_vtable:
// Found a duplicate vtable, remove the one we wrote. // Found a duplicate vtable, remove the one we wrote.
head = object_offset head = object_offset
...@@ -119,7 +121,8 @@ struct builder: ...@@ -119,7 +121,8 @@ struct builder:
return object_offset return object_offset
def Pad(n): def Pad(n):
for(n): buf, head = buf.write_int8_le_back(head, 0) for(n):
buf, head = buf.write_int8_le_back(head, 0)
def Prep(size, additional_bytes): def Prep(size, additional_bytes):
// Track the biggest thing we've ever aligned to. // Track the biggest thing we've ever aligned to.
...@@ -127,7 +130,7 @@ struct builder: ...@@ -127,7 +130,7 @@ struct builder:
minalign = size minalign = size
// Find the amount of alignment needed such that `size` is properly // Find the amount of alignment needed such that `size` is properly
// aligned after `additionalBytes`: // aligned after `additionalBytes`:
align_size := ((~(head + additional_bytes)) + 1) & (size - 1) let align_size = ((~(head + additional_bytes)) + 1) & (size - 1)
Pad(align_size) Pad(align_size)
def PrependUOffsetTRelative(off): def PrependUOffsetTRelative(off):
...@@ -172,7 +175,7 @@ struct builder: ...@@ -172,7 +175,7 @@ struct builder:
// Finish finalizes a buffer, pointing to the given root_table // Finish finalizes a buffer, pointing to the given root_table
assert not finished assert not finished
assert not nested assert not nested
prep_size := sz_32 var prep_size = sz_32
if size_prefix: if size_prefix:
prep_size += sz_32 prep_size += sz_32
Prep(minalign, prep_size) Prep(minalign, prep_size)
......
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
import flatbuffers
include "flatbuffers.lobster"
namespace MyGame_Sample namespace MyGame_Sample
enum + enum Color:
Color_Red = 0, Color_Red = 0
Color_Green = 1, Color_Green = 1
Color_Blue = 2 Color_Blue = 2
enum + enum Equipment:
Equipment_NONE = 0, Equipment_NONE = 0
Equipment_Weapon = 1 Equipment_Weapon = 1
struct Vec3 class Vec3
struct Monster class Monster
struct Weapon class Weapon
struct Vec3 : flatbuffers_handle class Vec3 : flatbuffers_handle
def x(): def x():
buf_.read_float32_le(pos_ + 0) return buf_.read_float32_le(pos_ + 0)
def y(): def y():
buf_.read_float32_le(pos_ + 4) return buf_.read_float32_le(pos_ + 4)
def z(): def z():
buf_.read_float32_le(pos_ + 8) return buf_.read_float32_le(pos_ + 8)
def CreateVec3(b_:flatbuffers_builder, x:float, y:float, z:float): def CreateVec3(b_:flatbuffers_builder, x:float, y:float, z:float):
b_.Prep(4, 12) b_.Prep(4, 12)
...@@ -34,36 +33,36 @@ def CreateVec3(b_:flatbuffers_builder, x:float, y:float, z:float): ...@@ -34,36 +33,36 @@ def CreateVec3(b_:flatbuffers_builder, x:float, y:float, z:float):
b_.PrependFloat32(x) b_.PrependFloat32(x)
return b_.Offset() return b_.Offset()
struct Monster : flatbuffers_handle class Monster : flatbuffers_handle
def pos(): def pos():
o := buf_.flatbuffers_field_struct(pos_, 4) let o = buf_.flatbuffers_field_struct(pos_, 4)
if o: MyGame_Sample_Vec3 { buf_, o } else: nil return if o: MyGame_Sample_Vec3 { buf_, o } else: nil
def mana(): def mana():
buf_.flatbuffers_field_int16(pos_, 6, 150) return buf_.flatbuffers_field_int16(pos_, 6, 150)
def hp(): def hp():
buf_.flatbuffers_field_int16(pos_, 8, 100) return buf_.flatbuffers_field_int16(pos_, 8, 100)
def name(): def name():
buf_.flatbuffers_field_string(pos_, 10) return buf_.flatbuffers_field_string(pos_, 10)
def inventory(i:int): def inventory(i:int):
buf_.read_int8_le(buf_.flatbuffers_field_vector(pos_, 14) + i * 1) return buf_.read_int8_le(buf_.flatbuffers_field_vector(pos_, 14) + i * 1)
def inventory_length(): def inventory_length():
buf_.flatbuffers_field_vector_len(pos_, 14) return buf_.flatbuffers_field_vector_len(pos_, 14)
def color(): def color():
buf_.flatbuffers_field_int8(pos_, 16, 2) return buf_.flatbuffers_field_int8(pos_, 16, 2)
def weapons(i:int): def weapons(i:int):
MyGame_Sample_Weapon { buf_, buf_.flatbuffers_indirect(buf_.flatbuffers_field_vector(pos_, 18) + i * 4) } return MyGame_Sample_Weapon { buf_, buf_.flatbuffers_indirect(buf_.flatbuffers_field_vector(pos_, 18) + i * 4) }
def weapons_length(): def weapons_length():
buf_.flatbuffers_field_vector_len(pos_, 18) return buf_.flatbuffers_field_vector_len(pos_, 18)
def equipped_type(): def equipped_type():
buf_.flatbuffers_field_int8(pos_, 20, 0) return buf_.flatbuffers_field_int8(pos_, 20, 0)
def equipped_as_Weapon(): def equipped_as_Weapon():
MyGame_Sample_Weapon { buf_, buf_.flatbuffers_field_table(pos_, 22) } return MyGame_Sample_Weapon { buf_, buf_.flatbuffers_field_table(pos_, 22) }
def path(i:int): def path(i:int):
MyGame_Sample_Vec3 { buf_, buf_.flatbuffers_field_vector(pos_, 24) + i * 12 } return MyGame_Sample_Vec3 { buf_, buf_.flatbuffers_field_vector(pos_, 24) + i * 12 }
def path_length(): def path_length():
buf_.flatbuffers_field_vector_len(pos_, 24) return buf_.flatbuffers_field_vector_len(pos_, 24)
def GetRootAsMonster(buf:string): Monster { buf, buf.flatbuffers_indirect(0) } def GetRootAsMonster(buf:string): return Monster { buf, buf.flatbuffers_indirect(0) }
def MonsterStart(b_:flatbuffers_builder): def MonsterStart(b_:flatbuffers_builder):
b_.StartObject(11) b_.StartObject(11)
...@@ -82,7 +81,7 @@ def MonsterStartInventoryVector(b_:flatbuffers_builder, n_:int): ...@@ -82,7 +81,7 @@ def MonsterStartInventoryVector(b_:flatbuffers_builder, n_:int):
def MonsterCreateInventoryVector(b_:flatbuffers_builder, v_:[int]): def MonsterCreateInventoryVector(b_:flatbuffers_builder, v_:[int]):
b_.StartVector(1, v_.length, 1) b_.StartVector(1, v_.length, 1)
reverse(v_) e_: b_.PrependUint8(e_) reverse(v_) e_: b_.PrependUint8(e_)
b_.EndVector(v_.length) return b_.EndVector(v_.length)
def MonsterAddColor(b_:flatbuffers_builder, color:int): def MonsterAddColor(b_:flatbuffers_builder, color:int):
b_.PrependInt8Slot(6, color, 2) b_.PrependInt8Slot(6, color, 2)
def MonsterAddWeapons(b_:flatbuffers_builder, weapons:int): def MonsterAddWeapons(b_:flatbuffers_builder, weapons:int):
...@@ -92,7 +91,7 @@ def MonsterStartWeaponsVector(b_:flatbuffers_builder, n_:int): ...@@ -92,7 +91,7 @@ def MonsterStartWeaponsVector(b_:flatbuffers_builder, n_:int):
def MonsterCreateWeaponsVector(b_:flatbuffers_builder, v_:[int]): def MonsterCreateWeaponsVector(b_:flatbuffers_builder, v_:[int]):
b_.StartVector(4, v_.length, 4) b_.StartVector(4, v_.length, 4)
reverse(v_) e_: b_.PrependUOffsetTRelative(e_) reverse(v_) e_: b_.PrependUOffsetTRelative(e_)
b_.EndVector(v_.length) return b_.EndVector(v_.length)
def MonsterAddEquippedType(b_:flatbuffers_builder, equipped_type:int): def MonsterAddEquippedType(b_:flatbuffers_builder, equipped_type:int):
b_.PrependUint8Slot(8, equipped_type, 0) b_.PrependUint8Slot(8, equipped_type, 0)
def MonsterAddEquipped(b_:flatbuffers_builder, equipped:int): def MonsterAddEquipped(b_:flatbuffers_builder, equipped:int):
...@@ -102,15 +101,15 @@ def MonsterAddPath(b_:flatbuffers_builder, path:int): ...@@ -102,15 +101,15 @@ def MonsterAddPath(b_:flatbuffers_builder, path:int):
def MonsterStartPathVector(b_:flatbuffers_builder, n_:int): def MonsterStartPathVector(b_:flatbuffers_builder, n_:int):
b_.StartVector(12, n_, 4) b_.StartVector(12, n_, 4)
def MonsterEnd(b_:flatbuffers_builder): def MonsterEnd(b_:flatbuffers_builder):
b_.EndObject() return b_.EndObject()
struct Weapon : flatbuffers_handle class Weapon : flatbuffers_handle
def name(): def name():
buf_.flatbuffers_field_string(pos_, 4) return buf_.flatbuffers_field_string(pos_, 4)
def damage(): def damage():
buf_.flatbuffers_field_int16(pos_, 6, 0) return buf_.flatbuffers_field_int16(pos_, 6, 0)
def GetRootAsWeapon(buf:string): Weapon { buf, buf.flatbuffers_indirect(0) } def GetRootAsWeapon(buf:string): return Weapon { buf, buf.flatbuffers_indirect(0) }
def WeaponStart(b_:flatbuffers_builder): def WeaponStart(b_:flatbuffers_builder):
b_.StartObject(2) b_.StartObject(2)
...@@ -119,5 +118,5 @@ def WeaponAddName(b_:flatbuffers_builder, name:int): ...@@ -119,5 +118,5 @@ def WeaponAddName(b_:flatbuffers_builder, name:int):
def WeaponAddDamage(b_:flatbuffers_builder, damage:int): def WeaponAddDamage(b_:flatbuffers_builder, damage:int):
b_.PrependInt16Slot(1, damage, 0) b_.PrependInt16Slot(1, damage, 0)
def WeaponEnd(b_:flatbuffers_builder): def WeaponEnd(b_:flatbuffers_builder):
b_.EndObject() return b_.EndObject()
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
include from "../lobster/" import from "../lobster/"
include "monster_generated.lobster" import monster_generated
// Example of how to use FlatBuffers to create and read binary buffers. // Example of how to use FlatBuffers to create and read binary buffers.
...@@ -24,7 +24,7 @@ let b = flatbuffers_builder {} ...@@ -24,7 +24,7 @@ let b = flatbuffers_builder {}
let weapon_names = [ "Sword", "Axe" ] let weapon_names = [ "Sword", "Axe" ]
let weapon_damages = [ 3, 5 ] let weapon_damages = [ 3, 5 ]
weapon_offsets := map(weapon_names) name, i: let weapon_offsets = map(weapon_names) name, i:
let ns = b.CreateString(name) let ns = b.CreateString(name)
b.MyGame_Sample_WeaponStart() b.MyGame_Sample_WeaponStart()
b.MyGame_Sample_WeaponAddName(ns) b.MyGame_Sample_WeaponAddName(ns)
......
...@@ -12,20 +12,20 @@ ...@@ -12,20 +12,20 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
include from "../lobster/" import from "../lobster/"
include "monster_generated.lobster" import monster_generated
// Example how to interop with JSON. // Example how to interop with JSON.
// Test loading some JSON, converting it to a binary FlatBuffer and back again. // Test loading some JSON, converting it to a binary FlatBuffer and back again.
// First read the schema and JSON data. // First read the schema and JSON data.
schema := read_file("monster.fbs", true) let schema = read_file("monster.fbs", true)
json := read_file("monsterdata.json", true) let json = read_file("monsterdata.json", true)
assert schema and json assert schema and json
// Parse JSON to binary: // Parse JSON to binary:
fb, err1 := flatbuffers_json_to_binary(schema, json, []) let fb, err1 = flatbuffers_json_to_binary(schema, json, [])
assert not err1 assert not err1
// Access one field in it, just to check: // Access one field in it, just to check:
...@@ -33,7 +33,7 @@ let monster = MyGame_Sample_GetRootAsMonster(fb) ...@@ -33,7 +33,7 @@ let monster = MyGame_Sample_GetRootAsMonster(fb)
assert monster.name == "Orc" assert monster.name == "Orc"
// Convert binary back to JSON: // Convert binary back to JSON:
json2, err2 := flatbuffers_binary_to_json(schema, fb, []) let json2, err2 = flatbuffers_binary_to_json(schema, fb, [])
assert not err2 assert not err2
// The generated JSON should be exactly equal to the original! // The generated JSON should be exactly equal to the original!
......
...@@ -31,7 +31,7 @@ class LobsterGenerator : public BaseGenerator { ...@@ -31,7 +31,7 @@ class LobsterGenerator : public BaseGenerator {
const std::string &file_name) const std::string &file_name)
: BaseGenerator(parser, path, file_name, "" /* not used */, "_") { : BaseGenerator(parser, path, file_name, "" /* not used */, "_") {
static const char * const keywords[] = { static const char * const keywords[] = {
"nil", "true", "false", "return", "struct", "value", "include", "int", "nil", "true", "false", "return", "struct", "class", "import", "int",
"float", "string", "any", "def", "is", "from", "program", "private", "float", "string", "any", "def", "is", "from", "program", "private",
"coroutine", "resource", "enum", "typeof", "var", "let", "pakfile", "coroutine", "resource", "enum", "typeof", "var", "let", "pakfile",
"switch", "case", "default", "namespace", "not", "and", "or", "bool", "switch", "case", "default", "namespace", "not", "and", "or", "bool",
...@@ -99,11 +99,11 @@ class LobsterGenerator : public BaseGenerator { ...@@ -99,11 +99,11 @@ class LobsterGenerator : public BaseGenerator {
auto def = " def " + NormalizedName(field); auto def = " def " + NormalizedName(field);
if (IsScalar(field.value.type.base_type)) { if (IsScalar(field.value.type.base_type)) {
if (struct_def.fixed) { if (struct_def.fixed) {
code += def + "():\n buf_.read_" + code += def + "():\n return buf_.read_" +
GenTypeName(field.value.type) + "_le(pos_ + " + offsets + GenTypeName(field.value.type) + "_le(pos_ + " + offsets +
")\n"; ")\n";
} else { } else {
code += def + "():\n buf_.flatbuffers_field_" + code += def + "():\n return buf_.flatbuffers_field_" +
GenTypeName(field.value.type) + "(pos_, " + offsets + ", " + GenTypeName(field.value.type) + "(pos_, " + offsets + ", " +
field.value.constant + ")\n"; field.value.constant + ")\n";
} }
...@@ -114,22 +114,22 @@ class LobsterGenerator : public BaseGenerator { ...@@ -114,22 +114,22 @@ class LobsterGenerator : public BaseGenerator {
auto name = NamespacedName(*field.value.type.struct_def); auto name = NamespacedName(*field.value.type.struct_def);
code += def + "():\n "; code += def + "():\n ";
if (struct_def.fixed) { if (struct_def.fixed) {
code += name + "{ buf_, pos_ + " + offsets + " }\n"; code += "return " + name + "{ buf_, pos_ + " + offsets + " }\n";
} else { } else {
code += std::string("o := buf_.flatbuffers_field_") + code += std::string("let o = buf_.flatbuffers_field_") +
(field.value.type.struct_def->fixed ? "struct" : "table") + (field.value.type.struct_def->fixed ? "struct" : "table") +
"(pos_, " + offsets + ")\n if o: " + name + "(pos_, " + offsets + ")\n return if o: " + name +
" { buf_, o } else: nil\n"; " { buf_, o } else: nil\n";
} }
break; break;
} }
case BASE_TYPE_STRING: case BASE_TYPE_STRING:
code += def + "():\n buf_.flatbuffers_field_string(pos_, " + code += def + "():\n return buf_.flatbuffers_field_string(pos_, " +
offsets + ")\n"; offsets + ")\n";
break; break;
case BASE_TYPE_VECTOR: { case BASE_TYPE_VECTOR: {
auto vectortype = field.value.type.VectorType(); auto vectortype = field.value.type.VectorType();
code += def + "(i:int):\n "; code += def + "(i:int):\n return ";
if (vectortype.base_type == BASE_TYPE_STRUCT) { if (vectortype.base_type == BASE_TYPE_STRUCT) {
auto start = "buf_.flatbuffers_field_vector(pos_, " + offsets + auto start = "buf_.flatbuffers_field_vector(pos_, " + offsets +
") + i * " + NumToString(InlineSize(vectortype)); ") + i * " + NumToString(InlineSize(vectortype));
...@@ -153,7 +153,7 @@ class LobsterGenerator : public BaseGenerator { ...@@ -153,7 +153,7 @@ class LobsterGenerator : public BaseGenerator {
it != field.value.type.enum_def->Vals().end(); ++it) { it != field.value.type.enum_def->Vals().end(); ++it) {
auto &ev = **it; auto &ev = **it;
if (ev.IsNonZero()) { if (ev.IsNonZero()) {
code += def + "_as_" + ev.name + "():\n " + code += def + "_as_" + ev.name + "():\n return " +
NamespacedName(*ev.union_type.struct_def) + NamespacedName(*ev.union_type.struct_def) +
" { buf_, buf_.flatbuffers_field_table(pos_, " + offsets + " { buf_, buf_.flatbuffers_field_table(pos_, " + offsets +
") }\n"; ") }\n";
...@@ -165,7 +165,7 @@ class LobsterGenerator : public BaseGenerator { ...@@ -165,7 +165,7 @@ class LobsterGenerator : public BaseGenerator {
} }
if (field.value.type.base_type == BASE_TYPE_VECTOR) { if (field.value.type.base_type == BASE_TYPE_VECTOR) {
code += def + code += def +
"_length():\n buf_.flatbuffers_field_vector_len(pos_, " + "_length():\n return buf_.flatbuffers_field_vector_len(pos_, " +
offsets + ")\n"; offsets + ")\n";
} }
} }
...@@ -207,19 +207,19 @@ class LobsterGenerator : public BaseGenerator { ...@@ -207,19 +207,19 @@ class LobsterGenerator : public BaseGenerator {
NumToString(alignment) + NumToString(alignment) +
")\n reverse(v_) e_: b_.Prepend" + ")\n reverse(v_) e_: b_.Prepend" +
GenMethod(vector_type) + GenMethod(vector_type) +
"(e_)\n b_.EndVector(v_.length)\n"; "(e_)\n return b_.EndVector(v_.length)\n";
} }
} }
} }
code += "def " + NormalizedName(struct_def) + code += "def " + NormalizedName(struct_def) +
"End(b_:flatbuffers_builder):\n b_.EndObject()\n\n"; "End(b_:flatbuffers_builder):\n return b_.EndObject()\n\n";
} }
void GenStructPreDecl(const StructDef &struct_def, std::string *code_ptr) { void GenStructPreDecl(const StructDef &struct_def, std::string *code_ptr) {
if (struct_def.generated) return; if (struct_def.generated) return;
std::string &code = *code_ptr; std::string &code = *code_ptr;
CheckNameSpace(struct_def, &code); CheckNameSpace(struct_def, &code);
code += "struct " + NormalizedName(struct_def) + "\n\n"; code += "class " + NormalizedName(struct_def) + "\n\n";
} }
// Generate struct or table methods. // Generate struct or table methods.
...@@ -228,7 +228,7 @@ class LobsterGenerator : public BaseGenerator { ...@@ -228,7 +228,7 @@ class LobsterGenerator : public BaseGenerator {
std::string &code = *code_ptr; std::string &code = *code_ptr;
CheckNameSpace(struct_def, &code); CheckNameSpace(struct_def, &code);
GenComment(struct_def.doc_comment, code_ptr, nullptr, ""); GenComment(struct_def.doc_comment, code_ptr, nullptr, "");
code += "struct " + NormalizedName(struct_def) + " : flatbuffers_handle\n"; code += "class " + NormalizedName(struct_def) + " : flatbuffers_handle\n";
for (auto it = struct_def.fields.vec.begin(); for (auto it = struct_def.fields.vec.begin();
it != struct_def.fields.vec.end(); ++it) { it != struct_def.fields.vec.end(); ++it) {
auto &field = **it; auto &field = **it;
...@@ -239,7 +239,7 @@ class LobsterGenerator : public BaseGenerator { ...@@ -239,7 +239,7 @@ class LobsterGenerator : public BaseGenerator {
if (!struct_def.fixed) { if (!struct_def.fixed) {
// Generate a special accessor for the table that has been declared as // Generate a special accessor for the table that has been declared as
// the root type. // the root type.
code += "def GetRootAs" + NormalizedName(struct_def) + "(buf:string): " + code += "def GetRootAs" + NormalizedName(struct_def) + "(buf:string): return " +
NormalizedName(struct_def) + NormalizedName(struct_def) +
" { buf, buf.flatbuffers_indirect(0) }\n\n"; " { buf, buf.flatbuffers_indirect(0) }\n\n";
} }
...@@ -258,14 +258,12 @@ class LobsterGenerator : public BaseGenerator { ...@@ -258,14 +258,12 @@ class LobsterGenerator : public BaseGenerator {
std::string &code = *code_ptr; std::string &code = *code_ptr;
CheckNameSpace(enum_def, &code); CheckNameSpace(enum_def, &code);
GenComment(enum_def.doc_comment, code_ptr, nullptr, ""); GenComment(enum_def.doc_comment, code_ptr, nullptr, "");
code += "enum + \n"; code += "enum " + NormalizedName(enum_def) + ":\n";
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) { for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
auto &ev = **it; auto &ev = **it;
GenComment(ev.doc_comment, code_ptr, nullptr, " "); GenComment(ev.doc_comment, code_ptr, nullptr, " ");
code += " " + enum_def.name + "_" + NormalizedName(ev) + " = " + code += " " + enum_def.name + "_" + NormalizedName(ev) + " = " +
enum_def.ToString(ev); enum_def.ToString(ev) + "\n";
if (it + 1 != enum_def.Vals().end()) code += ",";
code += "\n";
} }
code += "\n"; code += "\n";
} }
...@@ -336,7 +334,7 @@ class LobsterGenerator : public BaseGenerator { ...@@ -336,7 +334,7 @@ class LobsterGenerator : public BaseGenerator {
bool generate() { bool generate() {
std::string code; std::string code;
code += std::string("// ") + FlatBuffersGeneratedWarning() + code += std::string("// ") + FlatBuffersGeneratedWarning() +
"\n\ninclude \"flatbuffers.lobster\"\n\n"; "\nimport flatbuffers\n\n";
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end(); for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
++it) { ++it) {
auto &enum_def = **it; auto &enum_def = **it;
......
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
include from "../lobster/" import from "../lobster/"
include "monster_test_generated.lobster" import monster_test_generated
def check_read_buffer(buf): def check_read_buffer(buf):
// CheckReadBuffer checks that the given buffer is evaluated correctly as the example Monster. // CheckReadBuffer checks that the given buffer is evaluated correctly as the example Monster.
...@@ -119,14 +119,14 @@ check_read_buffer(fb1) ...@@ -119,14 +119,14 @@ check_read_buffer(fb1)
write_file("monsterdata_lobster_wire.mon", fb1) write_file("monsterdata_lobster_wire.mon", fb1)
// Test converting the buffer to JSON and parsing the JSON back again. // Test converting the buffer to JSON and parsing the JSON back again.
schema := read_file("monster_test.fbs") let schema = read_file("monster_test.fbs")
assert schema assert schema
includedirs := [ "include_test" ] let includedirs = [ "include_test" ]
// Convert binary to JSON: // Convert binary to JSON:
json, err1 := flatbuffers_binary_to_json(schema, fb1, includedirs) let json, err1 = flatbuffers_binary_to_json(schema, fb1, includedirs)
assert not err1 assert not err1
// Parse JSON back to binary: // Parse JSON back to binary:
fb3, err2 := flatbuffers_json_to_binary(schema, json, includedirs) let fb3, err2 = flatbuffers_json_to_binary(schema, json, includedirs)
assert not err2 assert not err2
// Check the resulting binary again (full roundtrip test): // Check the resulting binary again (full roundtrip test):
check_read_buffer(fb3) check_read_buffer(fb3)
......
This diff is collapsed.
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
import flatbuffers
include "flatbuffers.lobster"
namespace NamespaceA_NamespaceB namespace NamespaceA_NamespaceB
enum + enum EnumInNestedNS:
EnumInNestedNS_A = 0, EnumInNestedNS_A = 0
EnumInNestedNS_B = 1, EnumInNestedNS_B = 1
EnumInNestedNS_C = 2 EnumInNestedNS_C = 2
struct TableInNestedNS class TableInNestedNS
struct StructInNestedNS class StructInNestedNS
struct TableInNestedNS : flatbuffers_handle class TableInNestedNS : flatbuffers_handle
def foo(): def foo():
buf_.flatbuffers_field_int32(pos_, 4, 0) return buf_.flatbuffers_field_int32(pos_, 4, 0)
def GetRootAsTableInNestedNS(buf:string): TableInNestedNS { buf, buf.flatbuffers_indirect(0) } def GetRootAsTableInNestedNS(buf:string): return TableInNestedNS { buf, buf.flatbuffers_indirect(0) }
def TableInNestedNSStart(b_:flatbuffers_builder): def TableInNestedNSStart(b_:flatbuffers_builder):
b_.StartObject(1) b_.StartObject(1)
def TableInNestedNSAddFoo(b_:flatbuffers_builder, foo:int): def TableInNestedNSAddFoo(b_:flatbuffers_builder, foo:int):
b_.PrependInt32Slot(0, foo, 0) b_.PrependInt32Slot(0, foo, 0)
def TableInNestedNSEnd(b_:flatbuffers_builder): def TableInNestedNSEnd(b_:flatbuffers_builder):
b_.EndObject() return b_.EndObject()
struct StructInNestedNS : flatbuffers_handle class StructInNestedNS : flatbuffers_handle
def a(): def a():
buf_.read_int32_le(pos_ + 0) return buf_.read_int32_le(pos_ + 0)
def b(): def b():
buf_.read_int32_le(pos_ + 4) return buf_.read_int32_le(pos_ + 4)
def CreateStructInNestedNS(b_:flatbuffers_builder, a:int, b:int): def CreateStructInNestedNS(b_:flatbuffers_builder, a:int, b:int):
b_.Prep(4, 8) b_.Prep(4, 8)
......
// automatically generated by the FlatBuffers compiler, do not modify // automatically generated by the FlatBuffers compiler, do not modify
import flatbuffers
include "flatbuffers.lobster"
namespace NamespaceA namespace NamespaceA
struct TableInFirstNS class TableInFirstNS
namespace NamespaceC namespace NamespaceC
struct TableInC class TableInC
namespace NamespaceA namespace NamespaceA
struct SecondTableInA class SecondTableInA
struct TableInFirstNS : flatbuffers_handle class TableInFirstNS : flatbuffers_handle
def foo_table(): def foo_table():
o := buf_.flatbuffers_field_table(pos_, 4) let o = buf_.flatbuffers_field_table(pos_, 4)
if o: NamespaceA_NamespaceB_TableInNestedNS { buf_, o } else: nil return if o: NamespaceA_NamespaceB_TableInNestedNS { buf_, o } else: nil
def foo_enum(): def foo_enum():
buf_.flatbuffers_field_int8(pos_, 6, 0) return buf_.flatbuffers_field_int8(pos_, 6, 0)
def foo_struct(): def foo_struct():
o := buf_.flatbuffers_field_struct(pos_, 8) let o = buf_.flatbuffers_field_struct(pos_, 8)
if o: NamespaceA_NamespaceB_StructInNestedNS { buf_, o } else: nil return if o: NamespaceA_NamespaceB_StructInNestedNS { buf_, o } else: nil
def GetRootAsTableInFirstNS(buf:string): TableInFirstNS { buf, buf.flatbuffers_indirect(0) } def GetRootAsTableInFirstNS(buf:string): return TableInFirstNS { buf, buf.flatbuffers_indirect(0) }
def TableInFirstNSStart(b_:flatbuffers_builder): def TableInFirstNSStart(b_:flatbuffers_builder):
b_.StartObject(3) b_.StartObject(3)
...@@ -35,19 +34,19 @@ def TableInFirstNSAddFooEnum(b_:flatbuffers_builder, foo_enum:int): ...@@ -35,19 +34,19 @@ def TableInFirstNSAddFooEnum(b_:flatbuffers_builder, foo_enum:int):
def TableInFirstNSAddFooStruct(b_:flatbuffers_builder, foo_struct:int): def TableInFirstNSAddFooStruct(b_:flatbuffers_builder, foo_struct:int):
b_.PrependStructSlot(2, foo_struct, 0) b_.PrependStructSlot(2, foo_struct, 0)
def TableInFirstNSEnd(b_:flatbuffers_builder): def TableInFirstNSEnd(b_:flatbuffers_builder):
b_.EndObject() return b_.EndObject()
namespace NamespaceC namespace NamespaceC
struct TableInC : flatbuffers_handle class TableInC : flatbuffers_handle
def refer_to_a1(): def refer_to_a1():
o := buf_.flatbuffers_field_table(pos_, 4) let o = buf_.flatbuffers_field_table(pos_, 4)
if o: NamespaceA_TableInFirstNS { buf_, o } else: nil return if o: NamespaceA_TableInFirstNS { buf_, o } else: nil
def refer_to_a2(): def refer_to_a2():
o := buf_.flatbuffers_field_table(pos_, 6) let o = buf_.flatbuffers_field_table(pos_, 6)
if o: NamespaceA_SecondTableInA { buf_, o } else: nil return if o: NamespaceA_SecondTableInA { buf_, o } else: nil
def GetRootAsTableInC(buf:string): TableInC { buf, buf.flatbuffers_indirect(0) } def GetRootAsTableInC(buf:string): return TableInC { buf, buf.flatbuffers_indirect(0) }
def TableInCStart(b_:flatbuffers_builder): def TableInCStart(b_:flatbuffers_builder):
b_.StartObject(2) b_.StartObject(2)
...@@ -56,21 +55,21 @@ def TableInCAddReferToA1(b_:flatbuffers_builder, refer_to_a1:int): ...@@ -56,21 +55,21 @@ def TableInCAddReferToA1(b_:flatbuffers_builder, refer_to_a1:int):
def TableInCAddReferToA2(b_:flatbuffers_builder, refer_to_a2:int): def TableInCAddReferToA2(b_:flatbuffers_builder, refer_to_a2:int):
b_.PrependUOffsetTRelativeSlot(1, refer_to_a2, 0) b_.PrependUOffsetTRelativeSlot(1, refer_to_a2, 0)
def TableInCEnd(b_:flatbuffers_builder): def TableInCEnd(b_:flatbuffers_builder):
b_.EndObject() return b_.EndObject()
namespace NamespaceA namespace NamespaceA
struct SecondTableInA : flatbuffers_handle class SecondTableInA : flatbuffers_handle
def refer_to_c(): def refer_to_c():
o := buf_.flatbuffers_field_table(pos_, 4) let o = buf_.flatbuffers_field_table(pos_, 4)
if o: NamespaceC_TableInC { buf_, o } else: nil return if o: NamespaceC_TableInC { buf_, o } else: nil
def GetRootAsSecondTableInA(buf:string): SecondTableInA { buf, buf.flatbuffers_indirect(0) } def GetRootAsSecondTableInA(buf:string): return SecondTableInA { buf, buf.flatbuffers_indirect(0) }
def SecondTableInAStart(b_:flatbuffers_builder): def SecondTableInAStart(b_:flatbuffers_builder):
b_.StartObject(1) b_.StartObject(1)
def SecondTableInAAddReferToC(b_:flatbuffers_builder, refer_to_c:int): def SecondTableInAAddReferToC(b_:flatbuffers_builder, refer_to_c:int):
b_.PrependUOffsetTRelativeSlot(0, refer_to_c, 0) b_.PrependUOffsetTRelativeSlot(0, refer_to_c, 0)
def SecondTableInAEnd(b_:flatbuffers_builder): def SecondTableInAEnd(b_:flatbuffers_builder):
b_.EndObject() return b_.EndObject()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment