summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2015-06-03 14:52:46 -0700
committerJosh Haberman <jhaberman@gmail.com>2015-06-03 14:52:46 -0700
commite5bcdc2a3fdc0c38bf09a596efd951d5aaab1148 (patch)
tree3cbc06765d77bba866efc7623c044491b48f31af /tools
parent6f30032183ccd20d7a7f031ebc9350f54179bba8 (diff)
parent97eeb570225bb2f1060f4eff18ba664e129767d2 (diff)
Merge branch 'master' into google-internal
Diffstat (limited to 'tools')
-rw-r--r--tools/dump_cinit.lua154
-rw-r--r--tools/upbc.lua6
2 files changed, 101 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)
diff --git a/tools/upbc.lua b/tools/upbc.lua
index f68d25f..955da57 100644
--- a/tools/upbc.lua
+++ b/tools/upbc.lua
@@ -19,6 +19,12 @@ local upb = require "upb"
local src = arg[1]
local outbase = arg[2]
local basename = arg[3]
+
+if not (src and outbase and basename) then
+ print("Usage: upbc <binary descriptor> <output filename base> <symbol prefix>")
+ return 1
+end
+
local hfilename = outbase .. ".upb.h"
local cfilename = outbase .. ".upb.c"
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback