diff options
author | Josh Haberman <jhaberman@gmail.com> | 2015-06-03 14:52:46 -0700 |
---|---|---|
committer | Josh Haberman <jhaberman@gmail.com> | 2015-06-03 14:52:46 -0700 |
commit | e5bcdc2a3fdc0c38bf09a596efd951d5aaab1148 (patch) | |
tree | 3cbc06765d77bba866efc7623c044491b48f31af /tools/dump_cinit.lua | |
parent | 6f30032183ccd20d7a7f031ebc9350f54179bba8 (diff) | |
parent | 97eeb570225bb2f1060f4eff18ba664e129767d2 (diff) |
Merge branch 'master' into google-internal
Diffstat (limited to 'tools/dump_cinit.lua')
-rw-r--r-- | tools/dump_cinit.lua | 154 |
1 files changed, 95 insertions, 59 deletions
diff --git a/tools/dump_cinit.lua b/tools/dump_cinit.lua index 13e1f52..048cb3a 100644 --- a/tools/dump_cinit.lua +++ b/tools/dump_cinit.lua @@ -10,7 +10,7 @@ --]] -local upbtable = require "upbtable" +local upbtable = require "upb.table" local upb = require "upb" local export = {} @@ -47,6 +47,20 @@ function handler_types(base) return ret end +function octchar(num) + assert(num < 8) + local idx = num + 1 -- 1-based index + return string.sub("01234567", idx, idx) +end + +function c_escape(num) + assert(num < 256) + return string.format("\\%s%s%s", + octchar(math.floor(num / 64)), + octchar(math.floor(num / 8) % 8), + octchar(num % 8)); +end + -- const(f, label) -> UPB_LABEL_REPEATED, where f:label() == upb.LABEL_REPEATED function const(obj, name, base) local val = obj[name] @@ -173,6 +187,10 @@ function LinkTable:objs(objtype) end end +function LinkTable:empty(objtype) + return #self.obj_arrays[objtype] == 0 +end + --[[ Dumper: an object that can dump C initializers for several constructs. @@ -187,25 +205,25 @@ function Dumper:new(linktab) return obj end --- Dumps a _upb_value, eg: --- UPB_VALUE_INIT_INT32(5) +-- Dumps a upb_tabval, eg: +-- UPB_TABVALUE_INIT(5) function Dumper:_value(val, upbtype) if type(val) == "nil" then - return "UPB__VALUE_INIT_NONE" + return "UPB_TABVALUE_EMPTY_INIT" elseif type(val) == "number" then -- Use upbtype to disambiguate what kind of number it is. if upbtype == upbtable.CTYPE_INT32 then - return string.format("UPB_VALUE_INIT_INT32(%d)", val) + return string.format("UPB_TABVALUE_INT_INIT(%d)", val) else -- TODO(haberman): add support for these so we can properly support -- default values. error("Unsupported number type " .. upbtype) end elseif type(val) == "string" then - return string.format('UPB_VALUE_INIT_CONSTPTR("%s")', val) + return string.format('UPB_TABVALUE_PTR_INIT("%s")', val) else -- We take this as an object reference that has an entry in the link table. - return string.format("UPB_VALUE_INIT_CONSTPTR(%s)", self.linktab:addr(val)) + return string.format("UPB_TABVALUE_PTR_INIT(%s)", self.linktab:addr(val)) end end @@ -214,7 +232,13 @@ function Dumper:tabkey(key) if type(key) == "nil" then return "UPB_TABKEY_NONE" elseif type(key) == "string" then - return string.format('UPB_TABKEY_STR("%s")', key) + local len = #key + local len1 = c_escape(len % 256) + local len2 = c_escape(math.floor(len / 256) % 256) + local len3 = c_escape(math.floor(len / (256 * 256)) % 256) + local len4 = c_escape(math.floor(len / (256 * 256 * 256)) % 256) + return string.format('UPB_TABKEY_STR("%s", "%s", "%s", "%s", "%s")', + len1, len2, len3, len4, key) else return string.format("UPB_TABKEY_NUM(%d)", key) end @@ -234,7 +258,7 @@ function Dumper:arrayval(val) if val.val then return string.format(" %s,\n", self:_value(val.val, val.valtype)) else - return " UPB_ARRAY_EMPTYENT,\n" + return " UPB_TABVALUE_EMPTY_INIT,\n" end end @@ -272,9 +296,9 @@ local function gettables(def) end local function emit_file_warning(append) - append('// This file was generated by upbc (the upb compiler).\n') - append('// Do not edit -- your changes will be discarded when the file is\n') - append('// regenerated.\n\n') + append('/* This file was generated by upbc (the upb compiler).\n') + append(' * Do not edit -- your changes will be discarded when the file is\n') + append(' * regenerated. */\n\n') end local function join(...) @@ -332,7 +356,7 @@ end local function end_namespace(package, append) local package_components = split(package) for i=#package_components,1,-1 do - append("} // namespace %s\n", package_components[i]) + append("} /* namespace %s */\n", package_components[i]) end end @@ -402,13 +426,18 @@ local function dump_defs_c(symtab, basename, namespace, append) -- Emit forward declarations. emit_file_warning(append) append('#include "upb/def.h"\n') + append('#include "upb/structdefs.int.h"\n') append('#include "upb/symtab.h"\n\n') append("static const upb_msgdef %s;\n", linktab:cdecl(upb.DEF_MSG)) append("static const upb_fielddef %s;\n", linktab:cdecl(upb.DEF_FIELD)) - append("static const upb_enumdef %s;\n", linktab:cdecl(upb.DEF_ENUM)) + if not linktab:empty(upb.DEF_ENUM) then + append("static const upb_enumdef %s;\n", linktab:cdecl(upb.DEF_ENUM)) + end append("static const upb_tabent %s;\n", linktab:cdecl("strentries")) - append("static const upb_tabent %s;\n", linktab:cdecl("intentries")) - append("static const _upb_value %s;\n", linktab:cdecl("arrays")) + if not linktab:empty("intentries") then + append("static const upb_tabent %s;\n", linktab:cdecl("intentries")) + end + append("static const upb_tabval %s;\n", linktab:cdecl("arrays")) append("\n") append("#ifdef UPB_DEBUG_REFS\n") append("static upb_inttable reftables[%d];\n", reftable_count) @@ -428,8 +457,8 @@ local function dump_defs_c(symtab, basename, namespace, append) append(' UPB_MSGDEF_INIT("%s", %d, %d, %s, %s,' .. '&reftables[%d], &reftables[%d]),\n', m:full_name(), - m:_selector_count(), - m:_submsg_field_count(), + upbtable.msgdef_selector_count(m), + upbtable.msgdef_submsg_field_count(m), dumper:inttable(tables.int), dumper:strtable(tables.str), reftable, reftable + 1) @@ -441,7 +470,7 @@ local function dump_defs_c(symtab, basename, namespace, append) for f in linktab:objs(upb.DEF_FIELD) do local subdef = "NULL" if f:has_subdef() then - subdef = string.format("UPB_UPCAST(%s)", linktab:addr(f:subdef())) + subdef = string.format("(const upb_def*)(%s)", linktab:addr(f:subdef())) end local intfmt if f:type() == upb.TYPE_UINT32 or @@ -462,28 +491,30 @@ local function dump_defs_c(symtab, basename, namespace, append) boolstr(f:istagdelim()), boolstr(f:is_extension()), boolstr(f:lazy()), boolstr(f:packed()), f:name(), f:number(), linktab:addr(f:containing_type()), subdef, - f:_selector_base(), f:index(), + upbtable.fielddef_selector_base(f), f:index(), reftable, reftable + 1 ) reftable = reftable + 2 end append("};\n\n") - append("static const upb_enumdef %s = {\n", linktab:cdecl(upb.DEF_ENUM)) - for e in linktab:objs(upb.DEF_ENUM) do - local tables = gettables(e) - -- UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval) - append(' UPB_ENUMDEF_INIT("%s", %s, %s, %d, ' .. - '&reftables[%d], &reftables[%d]),\n', - e:full_name(), - dumper:strtable(tables.str), - dumper:inttable(tables.int), - --e:default()) - 0, - reftable, reftable + 1) - reftable = reftable + 2 + if not linktab:empty(upb.DEF_ENUM) then + append("static const upb_enumdef %s = {\n", linktab:cdecl(upb.DEF_ENUM)) + for e in linktab:objs(upb.DEF_ENUM) do + local tables = gettables(e) + -- UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval) + append(' UPB_ENUMDEF_INIT("%s", %s, %s, %d, ' .. + '&reftables[%d], &reftables[%d]),\n', + e:full_name(), + dumper:strtable(tables.str), + dumper:inttable(tables.int), + --e:default()) + 0, + reftable, reftable + 1) + reftable = reftable + 2 + end + append("};\n\n") end - append("};\n\n") append("static const upb_tabent %s = {\n", linktab:cdecl("strentries")) for ent in linktab:objs("strentries") do @@ -491,13 +522,15 @@ local function dump_defs_c(symtab, basename, namespace, append) end append("};\n\n"); - append("static const upb_tabent %s = {\n", linktab:cdecl("intentries")) - for ent in linktab:objs("intentries") do - append(dumper:tabent(ent)) + if not linktab:empty("intentries") then + append("static const upb_tabent %s = {\n", linktab:cdecl("intentries")) + for ent in linktab:objs("intentries") do + append(dumper:tabent(ent)) + end + append("};\n\n"); end - append("};\n\n"); - append("static const _upb_value %s = {\n", linktab:cdecl("arrays")) + append("static const upb_tabval %s = {\n", linktab:cdecl("arrays")) for ent in linktab:objs("arrays") do append(dumper:arrayval(ent)) end @@ -570,9 +603,14 @@ local function dump_enum_vals(enumdef, append) -- -- (notice the duplicated "TYPE"). local cident = to_cident(getpackage(enumdef:full_name())) - for _, pair in ipairs(enum_vals) do + for i, pair in ipairs(enum_vals) do k, v = pair[1], pair[2] - append(' %s = %d,\n', to_preproc(cident, k), v) + append(' %s = %d', to_preproc(cident, k), v) + if i == #enum_vals then + append('\n') + else + append(',\n') + end end end @@ -612,7 +650,7 @@ local function dump_selectors(msgdef, append, base) -- -- // So instead we make the latter the very beautiful: -- SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 - append("// %s\n", msgdef:full_name()) + append("/* %s */\n", msgdef:full_name()) local cident = to_cident(msgdef:full_name()) for _, pair in ipairs(selectors) do k, v = pair[1], pair[2] @@ -623,19 +661,19 @@ end local function dump_defs_h(symtab, basename, namespace, append, linktab) local basename_preproc = to_preproc(basename) - append("// This file contains accessors for a set of compiled-in defs.\n") - append("// Note that unlike Google's protobuf, it does *not* define\n") - append("// generated classes or any other kind of data structure for\n") - append("// actually storing protobufs. It only contains *defs* which\n") - append("// let you reflect over a protobuf *schema*.\n") - append("//\n") + append("/* This file contains accessors for a set of compiled-in defs.\n") + append(" * Note that unlike Google's protobuf, it does *not* define\n") + append(" * generated classes or any other kind of data structure for\n") + append(" * actually storing protobufs. It only contains *defs* which\n") + append(" * let you reflect over a protobuf *schema*.\n") + append(" */\n") emit_file_warning(append) append('#ifndef %s_UPB_H_\n', basename_preproc) append('#define %s_UPB_H_\n\n', basename_preproc) append('#include "upb/def.h"\n') append('#include "upb/symtab.h"\n\n') append('#ifdef __cplusplus\n') - append('extern "C" {\n') + append('UPB_BEGIN_EXTERN_C\n') append('#endif\n\n') local packages = {} @@ -649,7 +687,7 @@ local function dump_defs_h(symtab, basename, namespace, append, linktab) -- Dump C enums for proto enums. - append("// Enums\n\n") + append("/* Enums */\n\n") for _, def in ipairs(sorted_defs(symtab:defs(upb.DEF_ENUM))) do local cident = to_cident(def:full_name()) append('typedef enum {\n') @@ -658,7 +696,7 @@ local function dump_defs_h(symtab, basename, namespace, append, linktab) end -- selectors - append("// Selectors\n\n") + append("/* Selectors */\n\n") for _, def in ipairs(sorted_defs(symtab:defs(upb.DEF_MSG))) do dump_selectors(def, append, upb) end @@ -666,7 +704,7 @@ local function dump_defs_h(symtab, basename, namespace, append, linktab) append("const upb_symtab *%s_%s(const void *owner);" .. "\n\n", namespace, to_cident(basename)) - append("// MessageDefs\n") + append("/* MessageDefs */\n") dump_defs_for_type( "UPB_INLINE const upb_msgdef *%s_%s(const upb_symtab *s) {\n" .. " const upb_msgdef *m = upb_symtab_lookupmsg(s, \"%s\");\n" .. @@ -678,7 +716,7 @@ local function dump_defs_h(symtab, basename, namespace, append, linktab) append("\n") - append("// EnumDefs\n") + append("/* EnumDefs */\n") dump_defs_for_type( "UPB_INLINE const upb_enumdef *%s_%s(const upb_symtab *s) {\n" .. " const upb_enumdef *e = upb_symtab_lookupenum(s, \"%s\");\n" .. @@ -707,9 +745,7 @@ local function dump_defs_h(symtab, basename, namespace, append, linktab) end append("\n") - append('#ifdef __cplusplus\n') - append('}; // extern "C"\n') - append('#endif\n\n') + append('UPB_END_EXTERN_C\n\n') append("#ifdef __cplusplus\n\n") append("namespace %s {\n", namespace) @@ -762,12 +798,12 @@ local function dump_defs_h(symtab, basename, namespace, append, linktab) append("\n") end - append("} // namespace %s\n\n\n", namespace) + append("} /* namespace %s */\n\n\n", namespace) append("#undef RETURN_REFFED\n") - append("#endif // __cplusplus\n\n") + append("#endif /* __cplusplus */\n\n") - append('#endif // %s_UPB_H_\n', basename_preproc) + append('#endif /* %s_UPB_H_ */\n', basename_preproc) end function export.dump_defs(symtab, basename, append_h, append_c) |