First version of a real C codegen for upb.

Also includes an implementation of the conformance tests
to display what the API usage will be like.

There is still a lot to do, and things that are broken (oneofs,
repeated fields, etc), but it's a good start.
pull/13171/head
Joshua Haberman 8 years ago
parent 76fcdd2ee9
commit 9cb10577fc
  1. 83
      DESIGN.md
  2. 4
      Makefile
  3. 162
      tests/conformance_upb.c
  4. 432
      tools/make_c_api.lua
  5. 55
      tools/upbc.lua
  6. 78
      upb/bindings/lua/def.c
  7. 4
      upb/bindings/lua/msg.c
  8. 1611
      upb/descriptor/descriptor.upb.c
  9. 527
      upb/descriptor/descriptor.upb.h
  10. 18
      upb/descriptor/reader.c
  11. 32
      upb/msg.c
  12. 53
      upb/msg.h

@ -0,0 +1,83 @@
μpb Design
----------
**NOTE:** the design described here is being implemented currently, but is not
yet complete. The repo is in heavy transition right now.
μpb has the following design goals:
- C89 compatible.
- small code size (both for the core library and generated messages).
- fast performance (hundreds of MB/s).
- idiomatic for C programs.
- easy to wrap in high-level languages (Python, Ruby, Lua, etc) with
good performance and all standard protobuf features.
- hands-off about memory management, allowing for easy integration
with existing VMs and/or garbage collectors.
- offers binary ABI compatibility between apps, generated messages, and
the core library (doesn't require re-generating messages or recompiling
your application when the core library changes).
- provides all features that users expect from a protobuf library
(generated messages in C, reflection, text format, etc.).
- layered, so the core is small and doesn't require descriptors.
- tidy about symbol references, so that any messages or features that
aren't used by a C program can have their code GC'd by the linker.
- possible to use protobuf binary format without leaking message/field
names into the binary.
μpb accomplishes these goals by keeping a very small core that does not contain
descriptors. We need some way of knowing what fields are in each message and
where they live, but instead of descriptors, we keep a small/lightweight summary
of the .proto file. We call this a `upb_msglayout`. It contains the bare
minimum of what we need to know to parse and serialize protobuf binary format
into our internal representation for messages, `upb_msg`.
The core then contains functions to parse/serialize a message, given a `upb_msg*`
and a `const upb_msglayout*`.
This approach is similar to [nanopb](https://github.com/nanopb/nanopb) which
also compiles message definitions to a compact, internal representation without
names. However nanopb does not aim to be a fully-featured library, and has no
support for text format, JSON, or descriptors. μpb is unique in that it has a
small core similar to nanopb (though not quite as small), but also offers a
full-featured protobuf library for applications that want reflection, text
format, JSON format, etc.
Without descriptors, the core doesn't have access to field names, so it cannot
parse/serialize to protobuf text format or JSON. Instead this functionality
lives in separate modules that depend on the module implementing descriptors.
With the descriptor module we can parse/serialize binary descriptors and
validate that they follow all the rules of protobuf schemas.
To provide binary compatibility, we version the structs that generated messages
use to create a `upb_msglayout*`. The current initializers are
`upb_msglayout_msginit_v1`, `upb_msglayout_fieldinit_v1`, etc. Then
`upb_msglayout*` uses these as its internal representation. If upb changes its
internal representation for a `upb_msglayout*`, it will also include code to
convert the old representation to the new representation. This will use some
more memory/CPU at runtime to convert between the two, but apps that statically
link μpb will never need to worry about this.
TODO
----
The current state of the repo is quite different than what is described above.
Here are the major items that need to be implemented.
1. implement the core generic protobuf binary encoder/decoder that uses a
`upb_msglayout*`.
2. remove all mention of handlers, sink, etc. from core into their own module.
All of the handlers stuff needs substantial revision, but moving it out of
core is the first priority.
3. move all of the def/refcounted stuff out of core. The defs also need
substantial revision, but moving them out of core is the first priority.
4. revise our generated code until it is in a state where we feel comfortable
committing to API/ABI stability for it. This may involve moving different
parts of the generated code into separate files, like keeping the serialized
descriptor in a separate file from the compact msglayout.
5. revise all of the existing encoders/decoders and handlers. We probably
will want to keep handlers, since they let us decouple encoders/decoders
from `upb_msg`, but we need to simplify all of that a LOT. Likely we will
want to make handlers only per-message instead of per-field, except for
variable-length fields.

@ -262,11 +262,11 @@ genfiles: tools/upbc
$(E) PROTOC upb/descriptor/descriptor.proto
$(Q) protoc upb/descriptor/descriptor.proto -oupb/descriptor/descriptor.pb
$(E) UPBC upb/descriptor/descriptor.pb
$(Q) ./tools/upbc upb/descriptor/descriptor.pb
$(Q) ./tools/upbc --generate-upbdefs upb/descriptor/descriptor.pb
$(E) PROTOC tests/json/test.proto
$(Q) protoc tests/json/test.proto -otests/json/test.proto.pb
$(E) UPBC tests/json/test.proto.pb
$(Q) ./tools/upbc tests/json/test.proto.pb
$(Q) ./tools/upbc --generate-upbdefs tests/json/test.proto.pb
$(E) DYNASM upb/pb/compile_decoder_x64.dasc
$(Q) $(LUA) third_party/dynasm/dynasm.lua -c upb/pb/compile_decoder_x64.dasc > upb/pb/compile_decoder_x64.h || (rm upb/pb/compile_decoder_x64.h ; false)

@ -0,0 +1,162 @@
/* This is a upb implementation of the upb conformance tests, see:
* https://github.com/google/protobuf/tree/master/conformance
*/
#include <errno.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#include "conformance.upb.h"
#include "google/protobuf/test_messages_proto3.upb.h"
int test_count = 0;
bool CheckedRead(int fd, void *buf, size_t len) {
size_t ofs = 0;
while (len > 0) {
ssize_t bytes_read = read(fd, (char*)buf + ofs, len);
if (bytes_read == 0) return false;
if (bytes_read < 0) {
perror("reading from test runner");
exit(1);
}
len -= bytes_read;
ofs += bytes_read;
}
return true;
}
void CheckedWrite(int fd, const void *buf, size_t len) {
if (write(fd, buf, len) != len) {
perror("writing to test runner");
exit(1);
}
}
void DoTest(
const conformance_ConformanceRequest* request,
conformance_ConformanceResponse *response,
upb_env *env) {
conformance_ConformanceResponse_new(env);
protobuf_test_messages_proto3_TestAllTypes *test_message;
switch (conformance_ConformanceRequest_payload_case(request)) {
case conformance_ConformanceRequest_payload_protobuf_payload:
test_message = protobuf_test_messages_proto3_TestAllTypes_parsenew(
conformance_ConformanceRequest_protobuf_payload(request), env);
if (!test_message) {
/* TODO(haberman): return details. */
static char msg[] = "Parse error (no more details available).";
conformance_ConformanceResponse_set_parse_error(
response, upb_stringview_make(msg, sizeof(msg)));
return;
}
break;
case conformance_ConformanceRequest_payload_json_payload: {
static char msg[] = "JSON support not yet implemented.";
conformance_ConformanceResponse_set_skipped(
response, upb_stringview_make(msg, sizeof(msg)));
return;
}
case conformance_ConformanceRequest_payload_NOT_SET:
fprintf(stderr, "conformance_upb: Request didn't have payload.");
exit(1);
}
switch (conformance_ConformanceRequest_requested_output_format(request)) {
case conformance_UNSPECIFIED:
fprintf(stderr, "conformance_upb: Unspecified output format.");
exit(1);
case conformance_PROTOBUF: {
size_t serialized_len;
char *serialized = protobuf_test_messages_proto3_TestAllTypes_serialize(
test_message, env, &serialized_len);
if (!serialized) {
fprintf(stderr, "conformance_upb: Error serialiing.");
exit(1);
}
conformance_ConformanceResponse_set_protobuf_payload(
response, upb_stringview_make(serialized, serialized_len));
break;
}
case conformance_JSON: {
static char msg[] = "JSON support not yet implemented.";
conformance_ConformanceResponse_set_skipped(
response, upb_stringview_make(msg, sizeof(msg)));
break;
}
default:
fprintf(stderr, "conformance_upb: Unknown output format: %d",
conformance_ConformanceRequest_requested_output_format(request));
exit(1);
}
return;
}
bool DoTestIo() {
upb_env env;
upb_status status;
char *serialized_input;
char *serialized_output;
uint32_t input_size;
size_t output_size;
conformance_ConformanceRequest *request;
conformance_ConformanceResponse *response;
if (!CheckedRead(STDIN_FILENO, &input_size, sizeof(uint32_t))) {
// EOF.
return false;
}
upb_env_init(&env);
upb_env_reporterrorsto(&env, &status);
serialized_input = upb_env_malloc(&env, input_size);
if (!CheckedRead(STDIN_FILENO, serialized_input, input_size)) {
fprintf(stderr, "conformance_upb: unexpected EOF on stdin.\n");
exit(1);
}
request = conformance_ConformanceRequest_parsenew(
upb_stringview_make(serialized_input, input_size), &env);
response = conformance_ConformanceResponse_new(&env);
if (request) {
DoTest(request, response, &env);
} else {
fprintf(stderr, "conformance_upb: parse of ConformanceRequest failed: %s\n",
upb_status_errmsg(&status));
}
serialized_output = conformance_ConformanceResponse_serialize(
response, &env, &output_size);
CheckedWrite(STDOUT_FILENO, &output_size, sizeof(uint32_t));
CheckedWrite(STDOUT_FILENO, serialized_output, output_size);
test_count++;
return true;
}
int main() {
while (1) {
if (!DoTestIo()) {
fprintf(stderr, "conformance_upb: received EOF from test runner "
"after %d tests, exiting\n", test_count);
return 0;
}
}
}

@ -0,0 +1,432 @@
--[[
Code to generate a C API in:
foo.proto -> foo.upb.h
foo.upb.c
This code is evolving very quickly and so there are lots of little things
that aren't perfect right now. As it settles a little more, the code
quality should improve.
--]]
local upb = require "upb"
local dump_cinit = require "dump_cinit"
local export = {}
local typemap = {
[upb.TYPE_BOOL] = "bool",
[upb.TYPE_FLOAT] = "float",
[upb.TYPE_INT32] = "int32_t",
[upb.TYPE_UINT32] = "uint32_t",
[upb.TYPE_DOUBLE] = "double",
[upb.TYPE_INT64] = "int64_t",
[upb.TYPE_UINT64] = "uint64_t",
[upb.TYPE_STRING] = "upb_stringview",
[upb.TYPE_BYTES] = "upb_stringview",
}
function strip_proto(filename)
return string.gsub(filename, '%.proto$','')
end
--[[
[upb.TYPE_ENUM] = 5,
[upb.TYPE_MESSAGE] = 8,
--]]
local function join(...)
return table.concat({...}, ".")
end
local function to_cident(...)
return string.gsub(join(...), "[%./]", "_")
end
local function to_preproc(...)
return string.upper(to_cident(...))
end
-- Strips away last path element, ie:
-- foo.Bar.Baz -> foo.Bar
local function remove_name(name)
local package_end = 0
for i=1,string.len(name) do
if string.byte(name, i) == string.byte(".", 1) then
package_end = i - 1
end
end
return string.sub(name, 1, package_end)
end
local function dump_enum_vals(enumdef, append)
local enum_vals = {}
for k, v in enumdef:values() do
enum_vals[#enum_vals + 1] = {k, v}
end
table.sort(enum_vals, function(a, b) return a[2] < b[2] end)
-- protobuf convention is that enum values are scoped at the level of the
-- enum itself, to follow C++. Ie, if you have the enum:
-- message Foo {
-- enum E {
-- VAL1 = 1;
-- VAL2 = 2;
-- }
-- }
--
-- The name of VAL1 is Foo.VAL1, not Foo.E.VAL1.
--
-- This seems a bit sketchy, but people often name their enum values
-- accordingly, ie:
--
-- enum Foo {
-- FOO_VAL1 = 1;
-- FOO_VAL2 = 2;
-- }
--
-- So if we don't respect this also, we end up with constants that look like:
--
-- GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_TYPE_DOUBLE = 1
--
-- (notice the duplicated "TYPE").
local cident = to_cident(remove_name(enumdef:full_name()))
for i, pair in ipairs(enum_vals) do
k, v = pair[1], pair[2]
append(' %s = %d', cident .. "_" .. k, v)
if i == #enum_vals then
append('\n')
else
append(',\n')
end
end
end
local function ctype(field)
if field:label() == upb.LABEL_REPEATED then
return "upb_array*"
elseif field:type() == upb.TYPE_MESSAGE then
if field:containing_type():file() == field:subdef():file() then
return to_cident(field:subdef():full_name()) .. "*"
else
return "struct " .. to_cident(field:subdef():full_name()) .. "*"
end
elseif field:type() == upb.TYPE_ENUM then
return to_cident(field:subdef():full_name())
else
return typemap[field:type()] or "void*"
end
end
local function emit_file_warning(filedef, append)
append('/* This file was generated by upbc (the upb compiler) from the input\n')
append(' * file:\n')
append(' *\n')
append(' * %s\n', filedef:name())
append(' *\n')
append(' * Do not edit -- your changes will be discarded when the file is\n')
append(' * regenerated. */\n\n')
end
local function field_layout_rank(field)
-- Order:
-- 1, 2, 3. primitive fields (8, 4, 1 byte)
-- 4. oneof fields
-- 5. string fields
-- 6. submessage fields
-- 7. repeated fields
local rank
if field:containing_oneof() then
rank = 4
elseif field:label() == upb.LABEL_REPEATED then
rank = 7
elseif field:type() == upb.TYPE_MESSAGE then
rank = 6
elseif field:type() == upb.TYPE_STRING or field:type() == upb.TYPE_BYTES then
rank = 5
elseif field:type() == upb.TYPE_BOOL then
rank = 3
elseif field:type() == upb.TYPE_FLOAT or
field:type() == upb.TYPE_INT32 or
field:type() == upb.TYPE_UINT32 then
rank = 2
else
rank = 1
end
-- Break ties with field number.
return (rank * 2^29) + field:number()
end
local function has_hasbit(field)
if field:containing_type():file():syntax() == upb.SYNTAX_PROTO2 then
return field:label() ~= upb.LABEL_REPEATED and not field:containing_oneof()
else
return false
end
end
local function write_h_file(filedef, append)
emit_file_warning(filedef, append)
local basename_preproc = to_preproc(filedef:name())
append('#ifndef %s_UPB_H_\n', basename_preproc)
append('#define %s_UPB_H_\n\n', basename_preproc)
append('#include "upb/msg.h"\n\n')
append('UPB_BEGIN_EXTERN_C\n\n')
for msg in filedef:defs(upb.DEF_MSG) do
-- TODO(haberman): forward declare C++ type names so we can use
-- UPB_DECLARE_TYPE().
local msgname = to_cident(msg:full_name())
append('struct %s;\n', msgname)
append('typedef struct %s %s;\n', msgname, msgname)
end
append("/* Enums */\n\n")
for _, def in ipairs(sorted_defs(filedef:defs(upb.DEF_ENUM))) do
local cident = to_cident(def:full_name())
append('typedef enum {\n')
dump_enum_vals(def, append)
append('} %s;\n\n', cident)
end
for msg in filedef:defs(upb.DEF_MSG) do
local msgname = to_cident(msg:full_name())
append('/* %s message definition. */\n', msgname)
append('extern const upb_msglayout_msginit_v1 %s_msginit;\n', msgname)
append('%s *%s_new(upb_env *env);\n', msgname, msgname)
append('%s *%s_parsenew(upb_stringview buf, upb_env *env);\n',
msgname, msgname)
append('char *%s_serialize(%s *msg, upb_env *env, size_t *len);\n',
msgname, msgname)
append('void %s_free(%s *msg, upb_env *env);\n', msgname, msgname)
append('\n')
append('/* %s getters. */\n', msgname)
local setters, get_setters = dump_cinit.str_appender()
for field in msg:fields() do
local fieldname = to_cident(field:name())
if field:type() == upb.TYPE_MESSAGE and
field:subdef():file() ~= filedef then
-- Forward declaration for message type declared in another file.
append('struct %s;\n', to_cident(field:subdef():full_name()))
end
if field:label() == upb.LABEL_REPEATED then
else
local typename = ctype(field)
append('%s %s_%s(const %s *msg);\n',
typename, msgname, fieldname, msgname)
setters('void %s_set_%s(%s *msg, %s value);\n',
msgname, fieldname, msgname, typename)
end
end
for oneof in msg:oneofs() do
local fullname = to_cident(oneof:containing_type():full_name() .. "." .. oneof:name())
append('typedef enum {\n')
for field in oneof:fields() do
append(' %s = %d,\n', fullname .. "_" .. field:name(), field:number())
end
append(' %s_NOT_SET = 0,\n', fullname)
append('} %s_oneofcases;\n', fullname)
append('%s_oneofcases %s_case(const %s *msg);\n', fullname, fullname, msgname)
end
append('\n')
append('/* %s setters. */\n', msgname)
append(get_setters())
append('\n')
append('\n')
end
append('UPB_END_EXTERN_C')
append('\n')
append('\n')
append('#endif /* %s_UPB_H_ */\n', basename_preproc)
end
local function write_c_file(filedef, hfilename, append)
emit_file_warning(filedef, append)
append('#include <stddef.h>\n')
append('#include "upb/msg.h"\n')
append('#include "upb/upb.h"\n')
append('#include "%s"\n\n', hfilename)
for dep in filedef:dependencies() do
local outbase = strip_proto(dep:name())
append('#include "%s.upb.h"\n', outbase)
end
append('\n')
for msg in filedef:defs(upb.DEF_MSG) do
local msgname = to_cident(msg:full_name())
local fields_array_ref = "NULL"
local submsgs_array_ref = "NULL"
local field_count = 0
local submsg_count = 0
local submsg_set = {}
local submsg_indexes = {}
local hasbit_count = 0
local hasbit_indexes = {}
-- TODO(haberman): oneofs
-- Create a layout order for fields. We use this order for the struct and
-- for offsets, but our list of fields we keep in field number order.
local fields_layout_order = {}
for field in msg:fields() do
table.insert(fields_layout_order, field)
end
table.sort(fields_layout_order, function(a, b)
return field_layout_rank(a) < field_layout_rank(b)
end)
-- Another sorted array in field number order.
local fields_number_order = {}
for field in msg:fields() do
table.insert(fields_number_order, field)
end
table.sort(fields_number_order, function(a, b)
return a:number() < b:number()
end)
append('struct %s {\n', msgname)
for _, field in ipairs(fields_layout_order) do
field_count = field_count + 1
if field:type() == upb.TYPE_MESSAGE then
submsg_count = submsg_count + 1
submsg_set[field:subdef()] = true
end
if has_hasbit(field) then
hasbit_indexes[field] = hasbit_count
hasbit_count = hasbit_count + 1
end
append(' %s %s;\n', ctype(field), field:name())
end
append('};\n\n')
if submsg_count > 0 then
-- TODO(haberman): could save a little bit of space by only generating a
-- "submsgs" array for every strongly-connected component.
local submsgs_array_name = msgname .. "_submsgs"
submsgs_array_ref = "&" .. submsgs_array_name .. "[0]"
append('static const upb_msglayout_msginit_v1 *const %s[%s] = {\n',
submsgs_array_name, submsg_count)
-- Create a deterministically-sorted array of submessage entries.
local submsg_array = {}
for k, v in pairs(submsg_set) do
table.insert(submsg_array, k)
end
table.sort(submsg_array, function(a, b)
return a:full_name() < b:full_name()
end)
for i, submsg in ipairs(submsg_array) do
append(' &%s_msginit,\n', to_cident(submsg:full_name()))
submsg_indexes[submsg] = i - 1
end
append('};\n\n')
end
if field_count > 0 then
local fields_array_name = msgname .. "__fields"
fields_array_ref = "&" .. fields_array_name .. "[0]"
append('static const upb_msglayout_fieldinit_v1 %s[%s] = {\n',
fields_array_name, field_count)
for _, field in ipairs(fields_number_order) do
local submsg_index = "-1"
local oneof_index = "UPB_NOT_IN_ONEOF"
if field:type() == upb.TYPE_MESSAGE then
submsg_index = submsg_indexes[field:subdef()]
end
-- TODO(haberman): oneofs.
append(' {%s, offsetof(%s, %s), %s, %s, %s, %s, %s},\n',
field:number(),
msgname,
field:name(),
hasbit_indexes[field] or "-1",
oneof_index,
submsg_index,
field:descriptor_type(),
field:label())
end
append('};\n\n')
end
append('const upb_msglayout_msginit_v1 %s_msginit = {\n', msgname)
append(' %s,\n', submsgs_array_ref)
append(' %s,\n', fields_array_ref)
append(' NULL, /* TODO. oneofs */\n')
append(' NULL, /* TODO. default_msg */\n')
append(' UPB_ALIGNED_SIZEOF(%s), %s, %s, %s, %s\n',
msgname, field_count,
0, -- TODO: oneof_count
'false', -- TODO: extendable
'true' -- TODO: is_proto2
)
append('};\n\n')
append('%s *%s_new(upb_env *env) {\n', msgname, msgname)
append(' %s *msg = upb_env_malloc(env, sizeof(*msg));\n',
msgname)
append(' memset(msg, 0, sizeof(*msg)); /* TODO: defaults */\n')
append(' return msg;\n')
append('}\n')
append('%s *%s_parsenew(upb_stringview buf, upb_env *env) {\n',
msgname, msgname)
append(' UPB_UNUSED(buf);\n')
append(' UPB_UNUSED(env);\n')
append(' return NULL;\n')
append('}\n')
append('char *%s_serialize(%s *msg, upb_env *env, size_t *size) {\n',
msgname, msgname)
append(' UPB_UNUSED(msg);\n')
append(' UPB_UNUSED(env);\n')
append(' UPB_UNUSED(size);\n')
append(' return NULL; /* TODO. */\n')
append('}\n')
for field in msg:fields() do
local typename = ctype(field)
append('%s %s_%s(const %s *msg) {\n',
typename, msgname, field:name(), msgname);
append(' return msg->%s;\n', field:name())
append('}\n')
append('void %s_set_%s(%s *msg, %s value) {\n',
msgname, field:name(), msgname, typename);
append(' msg->%s = value;\n', field:name())
append('}\n')
end
for oneof in msg:oneofs() do
local fullname = to_cident(oneof:containing_type():full_name() .. "." .. oneof:name())
append('%s_oneofcases %s_case(const %s *msg) {\n', fullname, fullname, msgname)
append(' return 0; /* TODO. */')
append('}')
end
end
end
function export.write_gencode(filedef, hfilename, append_h, append_c)
write_h_file(filedef, append_h)
write_c_file(filedef, hfilename, append_c)
end
return export

@ -1,20 +1,29 @@
--[[
The upb compiler. Unlike the proto2 compiler, this does
not output any parsing code or generated classes or anything
specific to the protobuf binary format at all. At the moment
it only dumps C initializers for upb_defs, so that a .proto
file can be represented in a .o file.
The upb compiler. It can write two different kinds of output
files:
- generated code for a C API (foo.upb.h, foo.upb.c)
- (obsolete): definitions of upb defs. (foo.upbdefs.h, foo.upbdefs.c)
--]]
local dump_cinit = require "dump_cinit"
local make_c_api = require "make_c_api"
local upb = require "upb"
local src = arg[1]
local generate_upbdefs = false
for _, argument in ipairs(arg) do
if argument == "--generate-upbdefs" then
generate_upbdefs = true
else
src = argument
end
end
if not src then
print("Usage: upbc <binary descriptor>")
print("Usage: upbc [--generate-upbdefs] <binary descriptor>")
return 1
end
@ -32,6 +41,8 @@ for _, file in ipairs(files) do
symtab:add_file(file)
local outbase = strip_proto(file:name())
-- Write upbdefs.
local hfilename = outbase .. ".upbdefs.h"
local cfilename = outbase .. ".upbdefs.c"
@ -44,14 +55,40 @@ for _, file in ipairs(files) do
end
os.execute(string.format("mkdir -p `dirname %s`", outbase))
if generate_upbdefs then
-- Legacy generated defs.
local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename)
local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename)
local happend = dump_cinit.file_appender(hfile)
local cappend = dump_cinit.file_appender(cfile)
dump_cinit.dump_defs(file, happend, cappend)
hfile:close()
cfile:close()
end
-- Write C API.
hfilename = outbase .. ".upb.h"
cfilename = outbase .. ".upb.c"
if os.getenv("UPBC_VERBOSE") then
print("upbc:")
print(string.format(" source file=%s", src))
print(string.format(" output file base=%s", outbase))
print(string.format(" hfilename=%s", hfilename))
print(string.format(" cfilename=%s", cfilename))
end
local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename)
local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename)
local happend = dump_cinit.file_appender(hfile)
local cappend = dump_cinit.file_appender(cfile)
-- Dump defs
dump_cinit.dump_defs(file, happend, cappend)
make_c_api.write_gencode(file, hfilename, happend, cappend)
hfile:close()
cfile:close()

@ -211,6 +211,7 @@ bool lupb_def_pushwrapper(lua_State *L, const upb_def *def,
type = LUPB_ENUMDEF;
break;
default:
printf("Def type: %d\n", (int)upb_def_type(def));
UPB_UNREACHABLE();
}
@ -231,6 +232,15 @@ static int lupb_def_type(lua_State *L) {
return 1;
}
void lupb_filedef_pushwrapper(lua_State *L, const upb_filedef *f,
const void *ref_donor);
static int lupb_def_file(lua_State *L) {
const upb_def *def = lupb_def_check(L, 1);
lupb_filedef_pushwrapper(L, upb_def_file(def), NULL);
return 1;
}
static int lupb_def_freeze(lua_State *L) {
upb_def *def = lupb_def_checkmutable(L, 1);
CHK(upb_def_freeze(&def, 1, &status));
@ -263,6 +273,7 @@ static int lupb_def_setfullname(lua_State *L) {
#define LUPB_COMMON_DEF_METHODS \
{"def_type", lupb_def_type}, \
{"file", lupb_def_file}, \
{"full_name", lupb_def_fullname}, \
{"freeze", lupb_def_freeze}, \
{"is_frozen", lupb_def_isfrozen}, \
@ -296,6 +307,15 @@ static int lupb_fielddef_new(lua_State *L) {
/* Getters */
void lupb_oneofdef_pushwrapper(lua_State *L, const upb_oneofdef *o,
const void *ref_donor);
static int lupb_fielddef_containingoneof(lua_State *L) {
const upb_fielddef *f = lupb_fielddef_check(L, 1);
lupb_oneofdef_pushwrapper(L, upb_fielddef_containingoneof(f), NULL);
return 1;
}
static int lupb_fielddef_containingtype(lua_State *L) {
const upb_fielddef *f = lupb_fielddef_check(L, 1);
lupb_msgdef_pushwrapper(L, upb_fielddef_containingtype(f), NULL);
@ -349,6 +369,12 @@ static int lupb_fielddef_default(lua_State *L) {
return 1;
}
static int lupb_fielddef_descriptortype(lua_State *L) {
const upb_fielddef *f = lupb_fielddef_check(L, 1);
lua_pushnumber(L, upb_fielddef_descriptortype(f));
return 1;
}
static int lupb_fielddef_getsel(lua_State *L) {
const upb_fielddef *f = lupb_fielddef_check(L, 1);
upb_selector_t sel;
@ -593,9 +619,11 @@ static const struct luaL_Reg lupb_fielddef_mm[] = {
static const struct luaL_Reg lupb_fielddef_m[] = {
LUPB_COMMON_DEF_METHODS
{"containing_oneof", lupb_fielddef_containingoneof},
{"containing_type", lupb_fielddef_containingtype},
{"containing_type_name", lupb_fielddef_containingtypename},
{"default", lupb_fielddef_default},
{"descriptor_type", lupb_fielddef_descriptortype},
{"getsel", lupb_fielddef_getsel},
{"has_subdef", lupb_fielddef_hassubdef},
{"index", lupb_fielddef_index},
@ -681,6 +709,24 @@ static int lupb_oneofdef_field(lua_State *L) {
return 1;
}
static int lupb_oneofiter_next(lua_State *L) {
upb_oneof_iter *i = lua_touserdata(L, lua_upvalueindex(1));
if (upb_oneof_done(i)) return 0;
lupb_fielddef_pushwrapper(L, upb_oneof_iter_field(i), NULL);
upb_oneof_next(i);
return 1;
}
static int lupb_oneofdef_fields(lua_State *L) {
const upb_oneofdef *o = lupb_oneofdef_check(L, 1);
upb_oneof_iter *i = lua_newuserdata(L, sizeof(upb_oneof_iter));
upb_oneof_begin(i, o);
/* Need to guarantee that the msgdef outlives the iter. */
lua_pushvalue(L, 1);
lua_pushcclosure(L, &lupb_oneofiter_next, 2);
return 1;
}
static int lupb_oneofdef_len(lua_State *L) {
const upb_oneofdef *o = lupb_oneofdef_check(L, 1);
lua_pushinteger(L, upb_oneofdef_numfields(o));
@ -711,6 +757,7 @@ static int lupb_oneofdef_setname(lua_State *L) {
static const struct luaL_Reg lupb_oneofdef_m[] = {
{"containing_type", lupb_oneofdef_containingtype},
{"field", lupb_oneofdef_field},
{"fields", lupb_oneofdef_fields},
{"name", lupb_oneofdef_name},
{"add", lupb_oneofdef_add},
@ -1008,6 +1055,29 @@ static int lupb_filedef_def(lua_State *L) {
return 1;
}
static int lupb_filedefdepiter_next(lua_State *L) {
const upb_filedef *f = lupb_filedef_check(L, lua_upvalueindex(1));
size_t i = lua_tointeger(L, lua_upvalueindex(2));
if (i >= upb_filedef_depcount(f)) {
return 0;
}
lupb_filedef_pushwrapper(L, upb_filedef_dep(f, i), NULL);
lua_pushinteger(L, i + 1);
lua_replace(L, lua_upvalueindex(2));
return 1;
}
static int lupb_filedef_dependencies(lua_State *L) {
lupb_filedef_check(L, 1);
lua_pushvalue(L, 1);
lua_pushnumber(L, 0); /* Index, starts at zero. */
lua_pushcclosure(L, &lupb_filedefdepiter_next, 2);
return 1;
}
static int lupb_filedef_name(lua_State *L) {
const upb_filedef *f = lupb_filedef_check(L, 1);
lua_pushstring(L, upb_filedef_name(f));
@ -1020,6 +1090,12 @@ static int lupb_filedef_package(lua_State *L) {
return 1;
}
static int lupb_filedef_syntax(lua_State *L) {
const upb_filedef *f = lupb_filedef_check(L, 1);
lua_pushnumber(L, upb_filedef_syntax(f));
return 1;
}
static int lupb_filedef_len(lua_State *L) {
const upb_filedef *f = lupb_filedef_check(L, 1);
lua_pushinteger(L, upb_filedef_defcount(f));
@ -1078,8 +1154,10 @@ static const struct luaL_Reg lupb_filedef_mm[] = {
static const struct luaL_Reg lupb_filedef_m[] = {
{"def", lupb_filedef_def},
{"defs", lupb_filedef_defs},
{"dependencies", lupb_filedef_dependencies},
{"name", lupb_filedef_name},
{"package", lupb_filedef_package},
{"syntax", lupb_filedef_syntax},
{"set_name", lupb_filedef_setname},
{"set_package", lupb_filedef_setpackage},

@ -434,7 +434,7 @@ static upb_msgval lupb_tomsgval(lua_State *L, upb_fieldtype_t type, int narg,
case UPB_TYPE_BYTES: {
size_t len;
const char *ptr = lupb_checkstring(L, narg, &len);
return upb_msgval_str(ptr, len);
return upb_msgval_str(upb_stringview_make(ptr, len));
}
case UPB_TYPE_MESSAGE:
UPB_ASSERT(lmsgclass);
@ -1014,7 +1014,7 @@ static int lupb_msg_index(lua_State *L) {
if (upb_msg_has(lmsg->msg, field_index, l)) {
upb_msgval val = upb_msg_get(lmsg->msg, field_index, l);
lua_pop(L, 1);
lua_pushlstring(L, val.str.ptr, val.str.len);
lua_pushlstring(L, val.str.data, val.str.size);
lupb_uservalseti(L, 1, lupb_fieldindex(f), -1);
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,527 @@
/* This file was generated by upbc (the upb compiler) from the input
* file:
*
* upb/descriptor/descriptor.proto
*
* Do not edit -- your changes will be discarded when the file is
* regenerated. */
#ifndef UPB_DESCRIPTOR_DESCRIPTOR_PROTO_UPB_H_
#define UPB_DESCRIPTOR_DESCRIPTOR_PROTO_UPB_H_
#include "upb/msg.h"
UPB_BEGIN_EXTERN_C
struct google_protobuf_FileDescriptorSet;
typedef struct google_protobuf_FileDescriptorSet google_protobuf_FileDescriptorSet;
struct google_protobuf_FileDescriptorProto;
typedef struct google_protobuf_FileDescriptorProto google_protobuf_FileDescriptorProto;
struct google_protobuf_DescriptorProto;
typedef struct google_protobuf_DescriptorProto google_protobuf_DescriptorProto;
struct google_protobuf_DescriptorProto_ExtensionRange;
typedef struct google_protobuf_DescriptorProto_ExtensionRange google_protobuf_DescriptorProto_ExtensionRange;
struct google_protobuf_DescriptorProto_ReservedRange;
typedef struct google_protobuf_DescriptorProto_ReservedRange google_protobuf_DescriptorProto_ReservedRange;
struct google_protobuf_FieldDescriptorProto;
typedef struct google_protobuf_FieldDescriptorProto google_protobuf_FieldDescriptorProto;
struct google_protobuf_OneofDescriptorProto;
typedef struct google_protobuf_OneofDescriptorProto google_protobuf_OneofDescriptorProto;
struct google_protobuf_EnumDescriptorProto;
typedef struct google_protobuf_EnumDescriptorProto google_protobuf_EnumDescriptorProto;
struct google_protobuf_EnumValueDescriptorProto;
typedef struct google_protobuf_EnumValueDescriptorProto google_protobuf_EnumValueDescriptorProto;
struct google_protobuf_ServiceDescriptorProto;
typedef struct google_protobuf_ServiceDescriptorProto google_protobuf_ServiceDescriptorProto;
struct google_protobuf_MethodDescriptorProto;
typedef struct google_protobuf_MethodDescriptorProto google_protobuf_MethodDescriptorProto;
struct google_protobuf_FileOptions;
typedef struct google_protobuf_FileOptions google_protobuf_FileOptions;
struct google_protobuf_MessageOptions;
typedef struct google_protobuf_MessageOptions google_protobuf_MessageOptions;
struct google_protobuf_FieldOptions;
typedef struct google_protobuf_FieldOptions google_protobuf_FieldOptions;
struct google_protobuf_EnumOptions;
typedef struct google_protobuf_EnumOptions google_protobuf_EnumOptions;
struct google_protobuf_EnumValueOptions;
typedef struct google_protobuf_EnumValueOptions google_protobuf_EnumValueOptions;
struct google_protobuf_ServiceOptions;
typedef struct google_protobuf_ServiceOptions google_protobuf_ServiceOptions;
struct google_protobuf_MethodOptions;
typedef struct google_protobuf_MethodOptions google_protobuf_MethodOptions;
struct google_protobuf_UninterpretedOption;
typedef struct google_protobuf_UninterpretedOption google_protobuf_UninterpretedOption;
struct google_protobuf_UninterpretedOption_NamePart;
typedef struct google_protobuf_UninterpretedOption_NamePart google_protobuf_UninterpretedOption_NamePart;
struct google_protobuf_SourceCodeInfo;
typedef struct google_protobuf_SourceCodeInfo google_protobuf_SourceCodeInfo;
struct google_protobuf_SourceCodeInfo_Location;
typedef struct google_protobuf_SourceCodeInfo_Location google_protobuf_SourceCodeInfo_Location;
/* Enums */
typedef enum {
google_protobuf_FieldDescriptorProto_LABEL_OPTIONAL = 1,
google_protobuf_FieldDescriptorProto_LABEL_REQUIRED = 2,
google_protobuf_FieldDescriptorProto_LABEL_REPEATED = 3
} google_protobuf_FieldDescriptorProto_Label;
typedef enum {
google_protobuf_FieldDescriptorProto_TYPE_DOUBLE = 1,
google_protobuf_FieldDescriptorProto_TYPE_FLOAT = 2,
google_protobuf_FieldDescriptorProto_TYPE_INT64 = 3,
google_protobuf_FieldDescriptorProto_TYPE_UINT64 = 4,
google_protobuf_FieldDescriptorProto_TYPE_INT32 = 5,
google_protobuf_FieldDescriptorProto_TYPE_FIXED64 = 6,
google_protobuf_FieldDescriptorProto_TYPE_FIXED32 = 7,
google_protobuf_FieldDescriptorProto_TYPE_BOOL = 8,
google_protobuf_FieldDescriptorProto_TYPE_STRING = 9,
google_protobuf_FieldDescriptorProto_TYPE_GROUP = 10,
google_protobuf_FieldDescriptorProto_TYPE_MESSAGE = 11,
google_protobuf_FieldDescriptorProto_TYPE_BYTES = 12,
google_protobuf_FieldDescriptorProto_TYPE_UINT32 = 13,
google_protobuf_FieldDescriptorProto_TYPE_ENUM = 14,
google_protobuf_FieldDescriptorProto_TYPE_SFIXED32 = 15,
google_protobuf_FieldDescriptorProto_TYPE_SFIXED64 = 16,
google_protobuf_FieldDescriptorProto_TYPE_SINT32 = 17,
google_protobuf_FieldDescriptorProto_TYPE_SINT64 = 18
} google_protobuf_FieldDescriptorProto_Type;
typedef enum {
google_protobuf_FieldOptions_STRING = 0,
google_protobuf_FieldOptions_CORD = 1,
google_protobuf_FieldOptions_STRING_PIECE = 2
} google_protobuf_FieldOptions_CType;
typedef enum {
google_protobuf_FieldOptions_JS_NORMAL = 0,
google_protobuf_FieldOptions_JS_STRING = 1,
google_protobuf_FieldOptions_JS_NUMBER = 2
} google_protobuf_FieldOptions_JSType;
typedef enum {
google_protobuf_FileOptions_SPEED = 1,
google_protobuf_FileOptions_CODE_SIZE = 2,
google_protobuf_FileOptions_LITE_RUNTIME = 3
} google_protobuf_FileOptions_OptimizeMode;
/* google_protobuf_FileDescriptorSet message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_FileDescriptorSet_msginit;
google_protobuf_FileDescriptorSet *google_protobuf_FileDescriptorSet_new(upb_env *env);
google_protobuf_FileDescriptorSet *google_protobuf_FileDescriptorSet_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_FileDescriptorSet_serialize(google_protobuf_FileDescriptorSet *msg, upb_env *env, size_t *len);
void google_protobuf_FileDescriptorSet_free(google_protobuf_FileDescriptorSet *msg, upb_env *env);
/* google_protobuf_FileDescriptorSet getters. */
/* google_protobuf_FileDescriptorSet setters. */
/* google_protobuf_FileDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_FileDescriptorProto_msginit;
google_protobuf_FileDescriptorProto *google_protobuf_FileDescriptorProto_new(upb_env *env);
google_protobuf_FileDescriptorProto *google_protobuf_FileDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_FileDescriptorProto_serialize(google_protobuf_FileDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_FileDescriptorProto_free(google_protobuf_FileDescriptorProto *msg, upb_env *env);
/* google_protobuf_FileDescriptorProto getters. */
upb_stringview google_protobuf_FileDescriptorProto_name(const google_protobuf_FileDescriptorProto *msg);
upb_stringview google_protobuf_FileDescriptorProto_package(const google_protobuf_FileDescriptorProto *msg);
google_protobuf_FileOptions* google_protobuf_FileDescriptorProto_options(const google_protobuf_FileDescriptorProto *msg);
google_protobuf_SourceCodeInfo* google_protobuf_FileDescriptorProto_source_code_info(const google_protobuf_FileDescriptorProto *msg);
upb_stringview google_protobuf_FileDescriptorProto_syntax(const google_protobuf_FileDescriptorProto *msg);
/* google_protobuf_FileDescriptorProto setters. */
void google_protobuf_FileDescriptorProto_set_name(google_protobuf_FileDescriptorProto *msg, upb_stringview value);
void google_protobuf_FileDescriptorProto_set_package(google_protobuf_FileDescriptorProto *msg, upb_stringview value);
void google_protobuf_FileDescriptorProto_set_options(google_protobuf_FileDescriptorProto *msg, google_protobuf_FileOptions* value);
void google_protobuf_FileDescriptorProto_set_source_code_info(google_protobuf_FileDescriptorProto *msg, google_protobuf_SourceCodeInfo* value);
void google_protobuf_FileDescriptorProto_set_syntax(google_protobuf_FileDescriptorProto *msg, upb_stringview value);
/* google_protobuf_DescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_DescriptorProto_msginit;
google_protobuf_DescriptorProto *google_protobuf_DescriptorProto_new(upb_env *env);
google_protobuf_DescriptorProto *google_protobuf_DescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_DescriptorProto_serialize(google_protobuf_DescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_DescriptorProto_free(google_protobuf_DescriptorProto *msg, upb_env *env);
/* google_protobuf_DescriptorProto getters. */
upb_stringview google_protobuf_DescriptorProto_name(const google_protobuf_DescriptorProto *msg);
google_protobuf_MessageOptions* google_protobuf_DescriptorProto_options(const google_protobuf_DescriptorProto *msg);
/* google_protobuf_DescriptorProto setters. */
void google_protobuf_DescriptorProto_set_name(google_protobuf_DescriptorProto *msg, upb_stringview value);
void google_protobuf_DescriptorProto_set_options(google_protobuf_DescriptorProto *msg, google_protobuf_MessageOptions* value);
/* google_protobuf_DescriptorProto_ExtensionRange message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_DescriptorProto_ExtensionRange_msginit;
google_protobuf_DescriptorProto_ExtensionRange *google_protobuf_DescriptorProto_ExtensionRange_new(upb_env *env);
google_protobuf_DescriptorProto_ExtensionRange *google_protobuf_DescriptorProto_ExtensionRange_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_DescriptorProto_ExtensionRange_serialize(google_protobuf_DescriptorProto_ExtensionRange *msg, upb_env *env, size_t *len);
void google_protobuf_DescriptorProto_ExtensionRange_free(google_protobuf_DescriptorProto_ExtensionRange *msg, upb_env *env);
/* google_protobuf_DescriptorProto_ExtensionRange getters. */
int32_t google_protobuf_DescriptorProto_ExtensionRange_start(const google_protobuf_DescriptorProto_ExtensionRange *msg);
int32_t google_protobuf_DescriptorProto_ExtensionRange_end(const google_protobuf_DescriptorProto_ExtensionRange *msg);
/* google_protobuf_DescriptorProto_ExtensionRange setters. */
void google_protobuf_DescriptorProto_ExtensionRange_set_start(google_protobuf_DescriptorProto_ExtensionRange *msg, int32_t value);
void google_protobuf_DescriptorProto_ExtensionRange_set_end(google_protobuf_DescriptorProto_ExtensionRange *msg, int32_t value);
/* google_protobuf_DescriptorProto_ReservedRange message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_DescriptorProto_ReservedRange_msginit;
google_protobuf_DescriptorProto_ReservedRange *google_protobuf_DescriptorProto_ReservedRange_new(upb_env *env);
google_protobuf_DescriptorProto_ReservedRange *google_protobuf_DescriptorProto_ReservedRange_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_DescriptorProto_ReservedRange_serialize(google_protobuf_DescriptorProto_ReservedRange *msg, upb_env *env, size_t *len);
void google_protobuf_DescriptorProto_ReservedRange_free(google_protobuf_DescriptorProto_ReservedRange *msg, upb_env *env);
/* google_protobuf_DescriptorProto_ReservedRange getters. */
int32_t google_protobuf_DescriptorProto_ReservedRange_start(const google_protobuf_DescriptorProto_ReservedRange *msg);
int32_t google_protobuf_DescriptorProto_ReservedRange_end(const google_protobuf_DescriptorProto_ReservedRange *msg);
/* google_protobuf_DescriptorProto_ReservedRange setters. */
void google_protobuf_DescriptorProto_ReservedRange_set_start(google_protobuf_DescriptorProto_ReservedRange *msg, int32_t value);
void google_protobuf_DescriptorProto_ReservedRange_set_end(google_protobuf_DescriptorProto_ReservedRange *msg, int32_t value);
/* google_protobuf_FieldDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_FieldDescriptorProto_msginit;
google_protobuf_FieldDescriptorProto *google_protobuf_FieldDescriptorProto_new(upb_env *env);
google_protobuf_FieldDescriptorProto *google_protobuf_FieldDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_FieldDescriptorProto_serialize(google_protobuf_FieldDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_FieldDescriptorProto_free(google_protobuf_FieldDescriptorProto *msg, upb_env *env);
/* google_protobuf_FieldDescriptorProto getters. */
upb_stringview google_protobuf_FieldDescriptorProto_name(const google_protobuf_FieldDescriptorProto *msg);
upb_stringview google_protobuf_FieldDescriptorProto_extendee(const google_protobuf_FieldDescriptorProto *msg);
int32_t google_protobuf_FieldDescriptorProto_number(const google_protobuf_FieldDescriptorProto *msg);
google_protobuf_FieldDescriptorProto_Label google_protobuf_FieldDescriptorProto_label(const google_protobuf_FieldDescriptorProto *msg);
google_protobuf_FieldDescriptorProto_Type google_protobuf_FieldDescriptorProto_type(const google_protobuf_FieldDescriptorProto *msg);
upb_stringview google_protobuf_FieldDescriptorProto_type_name(const google_protobuf_FieldDescriptorProto *msg);
upb_stringview google_protobuf_FieldDescriptorProto_default_value(const google_protobuf_FieldDescriptorProto *msg);
google_protobuf_FieldOptions* google_protobuf_FieldDescriptorProto_options(const google_protobuf_FieldDescriptorProto *msg);
int32_t google_protobuf_FieldDescriptorProto_oneof_index(const google_protobuf_FieldDescriptorProto *msg);
upb_stringview google_protobuf_FieldDescriptorProto_json_name(const google_protobuf_FieldDescriptorProto *msg);
/* google_protobuf_FieldDescriptorProto setters. */
void google_protobuf_FieldDescriptorProto_set_name(google_protobuf_FieldDescriptorProto *msg, upb_stringview value);
void google_protobuf_FieldDescriptorProto_set_extendee(google_protobuf_FieldDescriptorProto *msg, upb_stringview value);
void google_protobuf_FieldDescriptorProto_set_number(google_protobuf_FieldDescriptorProto *msg, int32_t value);
void google_protobuf_FieldDescriptorProto_set_label(google_protobuf_FieldDescriptorProto *msg, google_protobuf_FieldDescriptorProto_Label value);
void google_protobuf_FieldDescriptorProto_set_type(google_protobuf_FieldDescriptorProto *msg, google_protobuf_FieldDescriptorProto_Type value);
void google_protobuf_FieldDescriptorProto_set_type_name(google_protobuf_FieldDescriptorProto *msg, upb_stringview value);
void google_protobuf_FieldDescriptorProto_set_default_value(google_protobuf_FieldDescriptorProto *msg, upb_stringview value);
void google_protobuf_FieldDescriptorProto_set_options(google_protobuf_FieldDescriptorProto *msg, google_protobuf_FieldOptions* value);
void google_protobuf_FieldDescriptorProto_set_oneof_index(google_protobuf_FieldDescriptorProto *msg, int32_t value);
void google_protobuf_FieldDescriptorProto_set_json_name(google_protobuf_FieldDescriptorProto *msg, upb_stringview value);
/* google_protobuf_OneofDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_OneofDescriptorProto_msginit;
google_protobuf_OneofDescriptorProto *google_protobuf_OneofDescriptorProto_new(upb_env *env);
google_protobuf_OneofDescriptorProto *google_protobuf_OneofDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_OneofDescriptorProto_serialize(google_protobuf_OneofDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_OneofDescriptorProto_free(google_protobuf_OneofDescriptorProto *msg, upb_env *env);
/* google_protobuf_OneofDescriptorProto getters. */
upb_stringview google_protobuf_OneofDescriptorProto_name(const google_protobuf_OneofDescriptorProto *msg);
/* google_protobuf_OneofDescriptorProto setters. */
void google_protobuf_OneofDescriptorProto_set_name(google_protobuf_OneofDescriptorProto *msg, upb_stringview value);
/* google_protobuf_EnumDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_EnumDescriptorProto_msginit;
google_protobuf_EnumDescriptorProto *google_protobuf_EnumDescriptorProto_new(upb_env *env);
google_protobuf_EnumDescriptorProto *google_protobuf_EnumDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_EnumDescriptorProto_serialize(google_protobuf_EnumDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_EnumDescriptorProto_free(google_protobuf_EnumDescriptorProto *msg, upb_env *env);
/* google_protobuf_EnumDescriptorProto getters. */
upb_stringview google_protobuf_EnumDescriptorProto_name(const google_protobuf_EnumDescriptorProto *msg);
google_protobuf_EnumOptions* google_protobuf_EnumDescriptorProto_options(const google_protobuf_EnumDescriptorProto *msg);
/* google_protobuf_EnumDescriptorProto setters. */
void google_protobuf_EnumDescriptorProto_set_name(google_protobuf_EnumDescriptorProto *msg, upb_stringview value);
void google_protobuf_EnumDescriptorProto_set_options(google_protobuf_EnumDescriptorProto *msg, google_protobuf_EnumOptions* value);
/* google_protobuf_EnumValueDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_EnumValueDescriptorProto_msginit;
google_protobuf_EnumValueDescriptorProto *google_protobuf_EnumValueDescriptorProto_new(upb_env *env);
google_protobuf_EnumValueDescriptorProto *google_protobuf_EnumValueDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_EnumValueDescriptorProto_serialize(google_protobuf_EnumValueDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_EnumValueDescriptorProto_free(google_protobuf_EnumValueDescriptorProto *msg, upb_env *env);
/* google_protobuf_EnumValueDescriptorProto getters. */
upb_stringview google_protobuf_EnumValueDescriptorProto_name(const google_protobuf_EnumValueDescriptorProto *msg);
int32_t google_protobuf_EnumValueDescriptorProto_number(const google_protobuf_EnumValueDescriptorProto *msg);
google_protobuf_EnumValueOptions* google_protobuf_EnumValueDescriptorProto_options(const google_protobuf_EnumValueDescriptorProto *msg);
/* google_protobuf_EnumValueDescriptorProto setters. */
void google_protobuf_EnumValueDescriptorProto_set_name(google_protobuf_EnumValueDescriptorProto *msg, upb_stringview value);
void google_protobuf_EnumValueDescriptorProto_set_number(google_protobuf_EnumValueDescriptorProto *msg, int32_t value);
void google_protobuf_EnumValueDescriptorProto_set_options(google_protobuf_EnumValueDescriptorProto *msg, google_protobuf_EnumValueOptions* value);
/* google_protobuf_ServiceDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_ServiceDescriptorProto_msginit;
google_protobuf_ServiceDescriptorProto *google_protobuf_ServiceDescriptorProto_new(upb_env *env);
google_protobuf_ServiceDescriptorProto *google_protobuf_ServiceDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_ServiceDescriptorProto_serialize(google_protobuf_ServiceDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_ServiceDescriptorProto_free(google_protobuf_ServiceDescriptorProto *msg, upb_env *env);
/* google_protobuf_ServiceDescriptorProto getters. */
upb_stringview google_protobuf_ServiceDescriptorProto_name(const google_protobuf_ServiceDescriptorProto *msg);
google_protobuf_ServiceOptions* google_protobuf_ServiceDescriptorProto_options(const google_protobuf_ServiceDescriptorProto *msg);
/* google_protobuf_ServiceDescriptorProto setters. */
void google_protobuf_ServiceDescriptorProto_set_name(google_protobuf_ServiceDescriptorProto *msg, upb_stringview value);
void google_protobuf_ServiceDescriptorProto_set_options(google_protobuf_ServiceDescriptorProto *msg, google_protobuf_ServiceOptions* value);
/* google_protobuf_MethodDescriptorProto message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_MethodDescriptorProto_msginit;
google_protobuf_MethodDescriptorProto *google_protobuf_MethodDescriptorProto_new(upb_env *env);
google_protobuf_MethodDescriptorProto *google_protobuf_MethodDescriptorProto_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_MethodDescriptorProto_serialize(google_protobuf_MethodDescriptorProto *msg, upb_env *env, size_t *len);
void google_protobuf_MethodDescriptorProto_free(google_protobuf_MethodDescriptorProto *msg, upb_env *env);
/* google_protobuf_MethodDescriptorProto getters. */
upb_stringview google_protobuf_MethodDescriptorProto_name(const google_protobuf_MethodDescriptorProto *msg);
upb_stringview google_protobuf_MethodDescriptorProto_input_type(const google_protobuf_MethodDescriptorProto *msg);
upb_stringview google_protobuf_MethodDescriptorProto_output_type(const google_protobuf_MethodDescriptorProto *msg);
google_protobuf_MethodOptions* google_protobuf_MethodDescriptorProto_options(const google_protobuf_MethodDescriptorProto *msg);
bool google_protobuf_MethodDescriptorProto_client_streaming(const google_protobuf_MethodDescriptorProto *msg);
bool google_protobuf_MethodDescriptorProto_server_streaming(const google_protobuf_MethodDescriptorProto *msg);
/* google_protobuf_MethodDescriptorProto setters. */
void google_protobuf_MethodDescriptorProto_set_name(google_protobuf_MethodDescriptorProto *msg, upb_stringview value);
void google_protobuf_MethodDescriptorProto_set_input_type(google_protobuf_MethodDescriptorProto *msg, upb_stringview value);
void google_protobuf_MethodDescriptorProto_set_output_type(google_protobuf_MethodDescriptorProto *msg, upb_stringview value);
void google_protobuf_MethodDescriptorProto_set_options(google_protobuf_MethodDescriptorProto *msg, google_protobuf_MethodOptions* value);
void google_protobuf_MethodDescriptorProto_set_client_streaming(google_protobuf_MethodDescriptorProto *msg, bool value);
void google_protobuf_MethodDescriptorProto_set_server_streaming(google_protobuf_MethodDescriptorProto *msg, bool value);
/* google_protobuf_FileOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_FileOptions_msginit;
google_protobuf_FileOptions *google_protobuf_FileOptions_new(upb_env *env);
google_protobuf_FileOptions *google_protobuf_FileOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_FileOptions_serialize(google_protobuf_FileOptions *msg, upb_env *env, size_t *len);
void google_protobuf_FileOptions_free(google_protobuf_FileOptions *msg, upb_env *env);
/* google_protobuf_FileOptions getters. */
upb_stringview google_protobuf_FileOptions_java_package(const google_protobuf_FileOptions *msg);
upb_stringview google_protobuf_FileOptions_java_outer_classname(const google_protobuf_FileOptions *msg);
google_protobuf_FileOptions_OptimizeMode google_protobuf_FileOptions_optimize_for(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_java_multiple_files(const google_protobuf_FileOptions *msg);
upb_stringview google_protobuf_FileOptions_go_package(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_cc_generic_services(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_java_generic_services(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_py_generic_services(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_java_generate_equals_and_hash(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_deprecated(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_java_string_check_utf8(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_cc_enable_arenas(const google_protobuf_FileOptions *msg);
upb_stringview google_protobuf_FileOptions_objc_class_prefix(const google_protobuf_FileOptions *msg);
upb_stringview google_protobuf_FileOptions_csharp_namespace(const google_protobuf_FileOptions *msg);
bool google_protobuf_FileOptions_javanano_use_deprecated_package(const google_protobuf_FileOptions *msg);
upb_stringview google_protobuf_FileOptions_php_class_prefix(const google_protobuf_FileOptions *msg);
upb_stringview google_protobuf_FileOptions_php_namespace(const google_protobuf_FileOptions *msg);
/* google_protobuf_FileOptions setters. */
void google_protobuf_FileOptions_set_java_package(google_protobuf_FileOptions *msg, upb_stringview value);
void google_protobuf_FileOptions_set_java_outer_classname(google_protobuf_FileOptions *msg, upb_stringview value);
void google_protobuf_FileOptions_set_optimize_for(google_protobuf_FileOptions *msg, google_protobuf_FileOptions_OptimizeMode value);
void google_protobuf_FileOptions_set_java_multiple_files(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_go_package(google_protobuf_FileOptions *msg, upb_stringview value);
void google_protobuf_FileOptions_set_cc_generic_services(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_java_generic_services(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_py_generic_services(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_java_generate_equals_and_hash(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_deprecated(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_java_string_check_utf8(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_cc_enable_arenas(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_objc_class_prefix(google_protobuf_FileOptions *msg, upb_stringview value);
void google_protobuf_FileOptions_set_csharp_namespace(google_protobuf_FileOptions *msg, upb_stringview value);
void google_protobuf_FileOptions_set_javanano_use_deprecated_package(google_protobuf_FileOptions *msg, bool value);
void google_protobuf_FileOptions_set_php_class_prefix(google_protobuf_FileOptions *msg, upb_stringview value);
void google_protobuf_FileOptions_set_php_namespace(google_protobuf_FileOptions *msg, upb_stringview value);
/* google_protobuf_MessageOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_MessageOptions_msginit;
google_protobuf_MessageOptions *google_protobuf_MessageOptions_new(upb_env *env);
google_protobuf_MessageOptions *google_protobuf_MessageOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_MessageOptions_serialize(google_protobuf_MessageOptions *msg, upb_env *env, size_t *len);
void google_protobuf_MessageOptions_free(google_protobuf_MessageOptions *msg, upb_env *env);
/* google_protobuf_MessageOptions getters. */
bool google_protobuf_MessageOptions_message_set_wire_format(const google_protobuf_MessageOptions *msg);
bool google_protobuf_MessageOptions_no_standard_descriptor_accessor(const google_protobuf_MessageOptions *msg);
bool google_protobuf_MessageOptions_deprecated(const google_protobuf_MessageOptions *msg);
bool google_protobuf_MessageOptions_map_entry(const google_protobuf_MessageOptions *msg);
/* google_protobuf_MessageOptions setters. */
void google_protobuf_MessageOptions_set_message_set_wire_format(google_protobuf_MessageOptions *msg, bool value);
void google_protobuf_MessageOptions_set_no_standard_descriptor_accessor(google_protobuf_MessageOptions *msg, bool value);
void google_protobuf_MessageOptions_set_deprecated(google_protobuf_MessageOptions *msg, bool value);
void google_protobuf_MessageOptions_set_map_entry(google_protobuf_MessageOptions *msg, bool value);
/* google_protobuf_FieldOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_FieldOptions_msginit;
google_protobuf_FieldOptions *google_protobuf_FieldOptions_new(upb_env *env);
google_protobuf_FieldOptions *google_protobuf_FieldOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_FieldOptions_serialize(google_protobuf_FieldOptions *msg, upb_env *env, size_t *len);
void google_protobuf_FieldOptions_free(google_protobuf_FieldOptions *msg, upb_env *env);
/* google_protobuf_FieldOptions getters. */
google_protobuf_FieldOptions_CType google_protobuf_FieldOptions_ctype(const google_protobuf_FieldOptions *msg);
bool google_protobuf_FieldOptions_packed(const google_protobuf_FieldOptions *msg);
bool google_protobuf_FieldOptions_deprecated(const google_protobuf_FieldOptions *msg);
bool google_protobuf_FieldOptions_lazy(const google_protobuf_FieldOptions *msg);
google_protobuf_FieldOptions_JSType google_protobuf_FieldOptions_jstype(const google_protobuf_FieldOptions *msg);
bool google_protobuf_FieldOptions_weak(const google_protobuf_FieldOptions *msg);
/* google_protobuf_FieldOptions setters. */
void google_protobuf_FieldOptions_set_ctype(google_protobuf_FieldOptions *msg, google_protobuf_FieldOptions_CType value);
void google_protobuf_FieldOptions_set_packed(google_protobuf_FieldOptions *msg, bool value);
void google_protobuf_FieldOptions_set_deprecated(google_protobuf_FieldOptions *msg, bool value);
void google_protobuf_FieldOptions_set_lazy(google_protobuf_FieldOptions *msg, bool value);
void google_protobuf_FieldOptions_set_jstype(google_protobuf_FieldOptions *msg, google_protobuf_FieldOptions_JSType value);
void google_protobuf_FieldOptions_set_weak(google_protobuf_FieldOptions *msg, bool value);
/* google_protobuf_EnumOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_EnumOptions_msginit;
google_protobuf_EnumOptions *google_protobuf_EnumOptions_new(upb_env *env);
google_protobuf_EnumOptions *google_protobuf_EnumOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_EnumOptions_serialize(google_protobuf_EnumOptions *msg, upb_env *env, size_t *len);
void google_protobuf_EnumOptions_free(google_protobuf_EnumOptions *msg, upb_env *env);
/* google_protobuf_EnumOptions getters. */
bool google_protobuf_EnumOptions_allow_alias(const google_protobuf_EnumOptions *msg);
bool google_protobuf_EnumOptions_deprecated(const google_protobuf_EnumOptions *msg);
/* google_protobuf_EnumOptions setters. */
void google_protobuf_EnumOptions_set_allow_alias(google_protobuf_EnumOptions *msg, bool value);
void google_protobuf_EnumOptions_set_deprecated(google_protobuf_EnumOptions *msg, bool value);
/* google_protobuf_EnumValueOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_EnumValueOptions_msginit;
google_protobuf_EnumValueOptions *google_protobuf_EnumValueOptions_new(upb_env *env);
google_protobuf_EnumValueOptions *google_protobuf_EnumValueOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_EnumValueOptions_serialize(google_protobuf_EnumValueOptions *msg, upb_env *env, size_t *len);
void google_protobuf_EnumValueOptions_free(google_protobuf_EnumValueOptions *msg, upb_env *env);
/* google_protobuf_EnumValueOptions getters. */
bool google_protobuf_EnumValueOptions_deprecated(const google_protobuf_EnumValueOptions *msg);
/* google_protobuf_EnumValueOptions setters. */
void google_protobuf_EnumValueOptions_set_deprecated(google_protobuf_EnumValueOptions *msg, bool value);
/* google_protobuf_ServiceOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_ServiceOptions_msginit;
google_protobuf_ServiceOptions *google_protobuf_ServiceOptions_new(upb_env *env);
google_protobuf_ServiceOptions *google_protobuf_ServiceOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_ServiceOptions_serialize(google_protobuf_ServiceOptions *msg, upb_env *env, size_t *len);
void google_protobuf_ServiceOptions_free(google_protobuf_ServiceOptions *msg, upb_env *env);
/* google_protobuf_ServiceOptions getters. */
bool google_protobuf_ServiceOptions_deprecated(const google_protobuf_ServiceOptions *msg);
/* google_protobuf_ServiceOptions setters. */
void google_protobuf_ServiceOptions_set_deprecated(google_protobuf_ServiceOptions *msg, bool value);
/* google_protobuf_MethodOptions message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_MethodOptions_msginit;
google_protobuf_MethodOptions *google_protobuf_MethodOptions_new(upb_env *env);
google_protobuf_MethodOptions *google_protobuf_MethodOptions_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_MethodOptions_serialize(google_protobuf_MethodOptions *msg, upb_env *env, size_t *len);
void google_protobuf_MethodOptions_free(google_protobuf_MethodOptions *msg, upb_env *env);
/* google_protobuf_MethodOptions getters. */
bool google_protobuf_MethodOptions_deprecated(const google_protobuf_MethodOptions *msg);
/* google_protobuf_MethodOptions setters. */
void google_protobuf_MethodOptions_set_deprecated(google_protobuf_MethodOptions *msg, bool value);
/* google_protobuf_UninterpretedOption message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_UninterpretedOption_msginit;
google_protobuf_UninterpretedOption *google_protobuf_UninterpretedOption_new(upb_env *env);
google_protobuf_UninterpretedOption *google_protobuf_UninterpretedOption_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_UninterpretedOption_serialize(google_protobuf_UninterpretedOption *msg, upb_env *env, size_t *len);
void google_protobuf_UninterpretedOption_free(google_protobuf_UninterpretedOption *msg, upb_env *env);
/* google_protobuf_UninterpretedOption getters. */
upb_stringview google_protobuf_UninterpretedOption_identifier_value(const google_protobuf_UninterpretedOption *msg);
uint64_t google_protobuf_UninterpretedOption_positive_int_value(const google_protobuf_UninterpretedOption *msg);
int64_t google_protobuf_UninterpretedOption_negative_int_value(const google_protobuf_UninterpretedOption *msg);
double google_protobuf_UninterpretedOption_double_value(const google_protobuf_UninterpretedOption *msg);
upb_stringview google_protobuf_UninterpretedOption_string_value(const google_protobuf_UninterpretedOption *msg);
upb_stringview google_protobuf_UninterpretedOption_aggregate_value(const google_protobuf_UninterpretedOption *msg);
/* google_protobuf_UninterpretedOption setters. */
void google_protobuf_UninterpretedOption_set_identifier_value(google_protobuf_UninterpretedOption *msg, upb_stringview value);
void google_protobuf_UninterpretedOption_set_positive_int_value(google_protobuf_UninterpretedOption *msg, uint64_t value);
void google_protobuf_UninterpretedOption_set_negative_int_value(google_protobuf_UninterpretedOption *msg, int64_t value);
void google_protobuf_UninterpretedOption_set_double_value(google_protobuf_UninterpretedOption *msg, double value);
void google_protobuf_UninterpretedOption_set_string_value(google_protobuf_UninterpretedOption *msg, upb_stringview value);
void google_protobuf_UninterpretedOption_set_aggregate_value(google_protobuf_UninterpretedOption *msg, upb_stringview value);
/* google_protobuf_UninterpretedOption_NamePart message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_UninterpretedOption_NamePart_msginit;
google_protobuf_UninterpretedOption_NamePart *google_protobuf_UninterpretedOption_NamePart_new(upb_env *env);
google_protobuf_UninterpretedOption_NamePart *google_protobuf_UninterpretedOption_NamePart_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_UninterpretedOption_NamePart_serialize(google_protobuf_UninterpretedOption_NamePart *msg, upb_env *env, size_t *len);
void google_protobuf_UninterpretedOption_NamePart_free(google_protobuf_UninterpretedOption_NamePart *msg, upb_env *env);
/* google_protobuf_UninterpretedOption_NamePart getters. */
upb_stringview google_protobuf_UninterpretedOption_NamePart_name_part(const google_protobuf_UninterpretedOption_NamePart *msg);
bool google_protobuf_UninterpretedOption_NamePart_is_extension(const google_protobuf_UninterpretedOption_NamePart *msg);
/* google_protobuf_UninterpretedOption_NamePart setters. */
void google_protobuf_UninterpretedOption_NamePart_set_name_part(google_protobuf_UninterpretedOption_NamePart *msg, upb_stringview value);
void google_protobuf_UninterpretedOption_NamePart_set_is_extension(google_protobuf_UninterpretedOption_NamePart *msg, bool value);
/* google_protobuf_SourceCodeInfo message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_SourceCodeInfo_msginit;
google_protobuf_SourceCodeInfo *google_protobuf_SourceCodeInfo_new(upb_env *env);
google_protobuf_SourceCodeInfo *google_protobuf_SourceCodeInfo_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_SourceCodeInfo_serialize(google_protobuf_SourceCodeInfo *msg, upb_env *env, size_t *len);
void google_protobuf_SourceCodeInfo_free(google_protobuf_SourceCodeInfo *msg, upb_env *env);
/* google_protobuf_SourceCodeInfo getters. */
/* google_protobuf_SourceCodeInfo setters. */
/* google_protobuf_SourceCodeInfo_Location message definition. */
extern const upb_msglayout_msginit_v1 google_protobuf_SourceCodeInfo_Location_msginit;
google_protobuf_SourceCodeInfo_Location *google_protobuf_SourceCodeInfo_Location_new(upb_env *env);
google_protobuf_SourceCodeInfo_Location *google_protobuf_SourceCodeInfo_Location_parsenew(upb_stringview buf, upb_env *env);
char *google_protobuf_SourceCodeInfo_Location_serialize(google_protobuf_SourceCodeInfo_Location *msg, upb_env *env, size_t *len);
void google_protobuf_SourceCodeInfo_Location_free(google_protobuf_SourceCodeInfo_Location *msg, upb_env *env);
/* google_protobuf_SourceCodeInfo_Location getters. */
upb_stringview google_protobuf_SourceCodeInfo_Location_leading_comments(const google_protobuf_SourceCodeInfo_Location *msg);
upb_stringview google_protobuf_SourceCodeInfo_Location_trailing_comments(const google_protobuf_SourceCodeInfo_Location *msg);
/* google_protobuf_SourceCodeInfo_Location setters. */
void google_protobuf_SourceCodeInfo_Location_set_leading_comments(google_protobuf_SourceCodeInfo_Location *msg, upb_stringview value);
void google_protobuf_SourceCodeInfo_Location_set_trailing_comments(google_protobuf_SourceCodeInfo_Location *msg, upb_stringview value);
UPB_END_EXTERN_C
#endif /* UPB_DESCRIPTOR_DESCRIPTOR_PROTO_UPB_H_ */

@ -48,6 +48,7 @@ typedef struct {
struct upb_descreader {
upb_sink sink;
upb_inttable files;
upb_strtable files_by_name;
upb_filedef *file; /* The last file in files. */
upb_descreader_frame stack[UPB_MAX_MESSAGE_NESTING];
int stack_len;
@ -214,6 +215,7 @@ static size_t file_onname(void *closure, const void *hd, const char *buf,
UPB_UNUSED(handle);
name = upb_gstrndup(buf, n);
upb_strtable_insert(&r->files_by_name, name, upb_value_ptr(r->file));
/* XXX: see comment at the top of the file. */
ok = upb_filedef_setname(r->file, name, NULL);
upb_gfree(name);
@ -327,6 +329,18 @@ static void *file_startext(void *closure, const void *hd) {
return r;
}
static size_t file_ondep(void *closure, const void *hd, const char *buf,
size_t n, const upb_bufhandle *handle) {
upb_descreader *r = closure;
upb_value val;
if (upb_strtable_lookup2(&r->files_by_name, buf, n, &val)) {
upb_filedef_adddep(r->file, upb_value_getptr(val));
}
UPB_UNUSED(hd);
UPB_UNUSED(handle);
return n;
}
/** Handlers for google.protobuf.EnumValueDescriptorProto. *********************/
static bool enumval_startmsg(void *closure, const void *hd) {
@ -771,6 +785,8 @@ static void reghandlers(const void *closure, upb_handlers *h) {
&file_startenum, NULL);
upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, extension),
&file_startext, NULL);
upb_handlers_setstring(h, F(FileDescriptorProto, dependency),
&file_ondep, NULL);
} else if (upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)) {
upb_handlers_setstartmsg(h, &enumval_startmsg, NULL);
upb_handlers_setendmsg(h, &enumval_endmsg, NULL);
@ -830,6 +846,7 @@ void descreader_cleanup(void *_r) {
upb_gfree(r->name);
upb_inttable_uninit(&r->files);
upb_strtable_uninit(&r->files_by_name);
upb_inttable_uninit(&r->oneofs);
upb_gfree(r->default_string);
while (r->stack_len > 0) {
@ -848,6 +865,7 @@ upb_descreader *upb_descreader_create(upb_env *e, const upb_handlers *h) {
}
upb_inttable_init(&r->files, UPB_CTYPE_PTR);
upb_strtable_init(&r->files_by_name, UPB_CTYPE_PTR);
upb_inttable_init(&r->oneofs, UPB_CTYPE_PTR);
upb_sink_reset(upb_descreader_input(r), h, r);
r->stack_len = 0;

@ -135,7 +135,7 @@ static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
case UPB_TYPE_BYTES: {
size_t len;
const char *ptr = upb_fielddef_defaultstr(f, &len);
return upb_msgval_str(ptr, len);
return upb_msgval_makestr(ptr, len);
}
case UPB_TYPE_MESSAGE:
return upb_msgval_msg(NULL);
@ -170,7 +170,6 @@ static size_t upb_msglayout_place(upb_msglayout *l, size_t size) {
size_t ret;
l->data.size = align_up(l->data.size, size);
l->data.align = align_up(l->data.align, size);
ret = l->data.size;
l->data.size += size;
return ret;
@ -230,7 +229,7 @@ static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
upb_msglayout_fieldinit_v1 *fields;
upb_msglayout_oneofinit_v1 *oneofs;
for (upb_msg_field_begin(&it, m), hasbit = sizeof(void*) * 8;
for (upb_msg_field_begin(&it, m);
!upb_msg_field_done(&it);
upb_msg_field_next(&it)) {
const upb_fielddef* f = upb_msg_iter_field(&it);
@ -289,7 +288,6 @@ static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
/* Account for space used by hasbits. */
l->data.size = div_round_up(hasbit, 8);
l->data.align = 1;
/* Allocate non-oneof fields. */
for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
@ -332,7 +330,7 @@ static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
/* Size of the entire structure should be a multiple of its greatest
* alignment. */
l->data.size = align_up(l->data.size, l->data.align);
l->data.size = align_up(l->data.size, 8 /* TODO: track for real? */);
if (upb_msglayout_initdefault(l, m)) {
return l;
@ -425,9 +423,9 @@ void *upb_msg_startstr(void *msg, const void *hd, size_t size_hint) {
val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
upb_free(alloc, (void*)val.str.ptr);
val.str.ptr = NULL;
val.str.len = 0;
upb_free(alloc, (void*)val.str.data);
val.str.data = NULL;
val.str.size = 0;
upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
return msg;
@ -443,15 +441,15 @@ size_t upb_msg_str(void *msg, const void *hd, const char *ptr, size_t size,
val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
newsize = val.str.len + size;
val.str.ptr = upb_realloc(alloc, (void*)val.str.ptr, val.str.len, newsize);
newsize = val.str.size + size;
val.str.data = upb_realloc(alloc, (void*)val.str.data, val.str.size, newsize);
if (!val.str.ptr) {
if (!val.str.data) {
return false;
}
memcpy((char*)val.str.ptr + val.str.len, ptr, size);
val.str.len = newsize;
memcpy((char*)val.str.data + val.str.size, ptr, size);
val.str.size = newsize;
upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
return size;
}
@ -542,7 +540,7 @@ static bool upb_visitor_hasfield(const upb_msg *msg, const upb_fielddef *f,
return upb_msgval_getuint64(val) != 0;
case UPB_TYPE_STRING:
case UPB_TYPE_BYTES:
return upb_msgval_getstr(val) && upb_msgval_getstrlen(val) > 0;
return upb_msgval_getstr(val).size > 0;
case UPB_TYPE_MESSAGE:
return upb_msgval_getmsg(val) != NULL;
}
@ -896,8 +894,8 @@ static void upb_map_tokey(upb_fieldtype_t type, upb_msgval *key,
switch (type) {
case UPB_TYPE_STRING:
/* Point to string data of the input key. */
*out_key = key->str.ptr;
*out_len = key->str.len;
*out_key = key->str.data;
*out_len = key->str.size;
return;
case UPB_TYPE_BOOL:
case UPB_TYPE_INT32:
@ -922,7 +920,7 @@ static upb_msgval upb_map_fromkey(upb_fieldtype_t type, const char *key,
size_t len) {
switch (type) {
case UPB_TYPE_STRING:
return upb_msgval_str(key, len);
return upb_msgval_makestr(key, len);
case UPB_TYPE_BOOL:
case UPB_TYPE_INT32:
case UPB_TYPE_UINT32:

@ -110,6 +110,22 @@ const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
const upb_handlers *h);
/** upb_stringview ************************************************************/
typedef struct {
const char *data;
size_t size;
} upb_stringview;
UPB_INLINE upb_stringview upb_stringview_make(const char *data, size_t size) {
upb_stringview ret;
ret.data = data;
ret.size = size;
return ret;
}
#define UPB_STRINGVIEW_INIT(ptr, len) {ptr, len}
/** upb_msgval ****************************************************************/
/* A union representing all possible protobuf values. Used for generic get/set
@ -127,10 +143,7 @@ typedef union {
const upb_msg* msg;
const upb_array* arr;
const void* ptr;
struct {
const char *ptr;
size_t len;
} str;
upb_stringview str;
} upb_msgval;
#define ACCESSORS(name, membername, ctype) \
@ -157,22 +170,12 @@ ACCESSORS(map, map, const upb_map*)
ACCESSORS(msg, msg, const upb_msg*)
ACCESSORS(ptr, ptr, const void*)
ACCESSORS(arr, arr, const upb_array*)
ACCESSORS(str, str, upb_stringview)
#undef ACCESSORS
UPB_INLINE upb_msgval upb_msgval_str(const char *ptr, size_t len) {
upb_msgval ret;
ret.str.ptr = ptr;
ret.str.len = len;
return ret;
}
UPB_INLINE const char* upb_msgval_getstr(upb_msgval val) {
return val.str.ptr;
}
UPB_INLINE size_t upb_msgval_getstrlen(upb_msgval val) {
return val.str.len;
UPB_INLINE upb_msgval upb_msgval_makestr(const char *data, size_t size) {
return upb_msgval_str(upb_stringview_make(data, size));
}
@ -384,11 +387,6 @@ bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
#define UPB_NOT_IN_ONEOF UINT16_MAX
typedef struct {
const char *ptr;
uint32_t length;
} upb_msglayout_strinit_v1;
typedef struct {
uint32_t number;
uint32_t offset; /* If in a oneof, offset of default in default_msg below. */
@ -405,21 +403,22 @@ typedef struct {
} upb_msglayout_oneofinit_v1;
typedef struct upb_msglayout_msginit_v1 {
const struct upb_msglayout_msginit_v1 **submsgs;
const struct upb_msglayout_msginit_v1 *const* submsgs;
const upb_msglayout_fieldinit_v1 *fields;
const upb_msglayout_oneofinit_v1 *oneofs;
uint32_t *case_offsets;
void *default_msg;
/* Must be aligned to 8. Doesn't include internal members like unknown
* fields, extension dict, pointer to msglayout, etc. */
/* Must be aligned to sizeof(void*). Doesn't include internal members like
* unknown * fields, extension dict, pointer to msglayout, etc. */
uint32_t size;
uint16_t field_count;
uint16_t oneof_count;
bool extendable;
bool is_proto2;
char align;
} upb_msglayout_msginit_v1;
#define UPB_ALIGN_UP_TO(val, align) ((val + (align - 1)) & -align)
#define UPB_ALIGNED_SIZEOF(type) UPB_ALIGN_UP_TO(sizeof(type), sizeof(void*))
/* Initialize/uninitialize a msglayout from a msginit. If upb uses v1
* internally, this will not allocate any memory. Should only be used by
* generated code. */

Loading…
Cancel
Save