commit
14c96a143c
30 changed files with 2706 additions and 2067 deletions
@ -0,0 +1,497 @@ |
||||
load( |
||||
":build_defs.bzl", |
||||
"lua_cclibrary", |
||||
"lua_library", |
||||
"lua_binary", |
||||
"lua_test", |
||||
"generated_file_staleness_test", |
||||
"make_shell_script", |
||||
"upb_amalgamation", |
||||
"upb_proto_library", |
||||
) |
||||
|
||||
# C/C++ rules ################################################################## |
||||
|
||||
cc_library( |
||||
name = "upb", |
||||
srcs = [ |
||||
"google/protobuf/descriptor.upb.c", |
||||
"upb/decode.c", |
||||
"upb/def.c", |
||||
"upb/encode.c", |
||||
"upb/handlers.c", |
||||
"upb/handlers-inl.h", |
||||
"upb/msg.c", |
||||
"upb/msgfactory.c", |
||||
"upb/port_def.inc", |
||||
"upb/port_undef.inc", |
||||
"upb/refcounted.c", |
||||
"upb/sink.c", |
||||
"upb/structdefs.int.h", |
||||
"upb/structs.int.h", |
||||
"upb/table.c", |
||||
"upb/table.int.h", |
||||
"upb/upb.c", |
||||
], |
||||
hdrs = [ |
||||
"google/protobuf/descriptor.upb.h", |
||||
"upb/decode.h", |
||||
"upb/def.h", |
||||
"upb/encode.h", |
||||
"upb/handlers.h", |
||||
"upb/msg.h", |
||||
"upb/msgfactory.h", |
||||
"upb/refcounted.h", |
||||
"upb/sink.h", |
||||
"upb/upb.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
visibility = ["//visibility:public"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_pb", |
||||
srcs = [ |
||||
"upb/pb/compile_decoder.c", |
||||
"upb/pb/decoder.c", |
||||
"upb/pb/decoder.int.h", |
||||
"upb/pb/encoder.c", |
||||
"upb/pb/textprinter.c", |
||||
"upb/pb/varint.c", |
||||
"upb/pb/varint.int.h", |
||||
], |
||||
hdrs = [ |
||||
"upb/pb/decoder.h", |
||||
"upb/pb/encoder.h", |
||||
"upb/pb/textprinter.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
deps = [ |
||||
":upb", |
||||
], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_json", |
||||
srcs = [ |
||||
"upb/json/parser.c", |
||||
"upb/json/printer.c", |
||||
], |
||||
hdrs = [ |
||||
"upb/json/parser.h", |
||||
"upb/json/printer.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
deps = [":upb"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_cc_bindings", |
||||
hdrs = [ |
||||
"upb/bindings/stdc++/string.h", |
||||
], |
||||
deps = [":upb"], |
||||
) |
||||
|
||||
# Amalgamation ################################################################# |
||||
|
||||
py_binary( |
||||
name = "amalgamate", |
||||
srcs = ["tools/amalgamate.py"], |
||||
) |
||||
|
||||
upb_amalgamation( |
||||
name = "gen_amalgamation", |
||||
outs = [ |
||||
"upb.c", |
||||
"upb.h", |
||||
], |
||||
amalgamator = ":amalgamate", |
||||
libs = [ |
||||
":upb", |
||||
":upb_pb", |
||||
":upb_json", |
||||
], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "amalgamation", |
||||
srcs = ["upb.c"], |
||||
hdrs = ["upb.h"], |
||||
) |
||||
|
||||
# C/C++ tests ################################################################## |
||||
|
||||
cc_library( |
||||
name = "upb_test", |
||||
testonly = 1, |
||||
srcs = [ |
||||
"tests/testmain.cc", |
||||
], |
||||
hdrs = [ |
||||
"tests/test_util.h", |
||||
"tests/upb_test.h", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_varint", |
||||
srcs = ["tests/pb/test_varint.c"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_def", |
||||
srcs = ["tests/test_def.c"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_handlers", |
||||
srcs = ["tests/test_handlers.c"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_decoder", |
||||
srcs = ["tests/pb/test_decoder.cc"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_encoder", |
||||
srcs = ["tests/pb/test_encoder.cc"], |
||||
data = ["upb/descriptor/descriptor.pb"], |
||||
deps = [ |
||||
":upb_cc_bindings", |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_cpp", |
||||
srcs = ["tests/test_cpp.cc"], |
||||
deps = [ |
||||
":upb", |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_table", |
||||
srcs = ["tests/test_table.cc"], |
||||
deps = [ |
||||
":upb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_json", |
||||
srcs = [ |
||||
"tests/json/test.upbdefs.c", |
||||
"tests/json/test.upbdefs.h", |
||||
"tests/json/test_json.cc", |
||||
], |
||||
deps = [ |
||||
":upb_json", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
upb_proto_library( |
||||
name = "conformance_proto_upb", |
||||
upbc = ":protoc-gen-upb", |
||||
deps = [ |
||||
"@com_google_protobuf//:conformance_proto", |
||||
"@com_google_protobuf//:test_messages_proto3_proto", |
||||
], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "conformance_upb", |
||||
srcs = [ |
||||
"tests/conformance_upb.c", |
||||
], |
||||
deps = [ |
||||
":conformance_proto_upb", |
||||
":upb", |
||||
], |
||||
copts = ["-Ibazel-out/k8-fastbuild/bin"], |
||||
) |
||||
|
||||
make_shell_script( |
||||
name = "gen_test_conformance_upb", |
||||
out = "test_conformance_upb.sh", |
||||
contents = "$(rlocation com_google_protobuf/conformance_test_runner) $(rlocation upb/conformance_upb)", |
||||
) |
||||
|
||||
sh_test( |
||||
name = "test_conformance_upb", |
||||
srcs = ["test_conformance_upb.sh"], |
||||
data = [ |
||||
"tests/conformance_upb_failures.txt", |
||||
":conformance_upb", |
||||
"@bazel_tools//tools/bash/runfiles", |
||||
"@com_google_protobuf//:conformance_test_runner", |
||||
], |
||||
) |
||||
|
||||
# Lua libraries. ############################################################### |
||||
|
||||
lua_cclibrary( |
||||
name = "lua/upb_c", |
||||
srcs = [ |
||||
"upb/bindings/lua/def.c", |
||||
"upb/bindings/lua/msg.c", |
||||
"upb/bindings/lua/upb.c", |
||||
], |
||||
hdrs = [ |
||||
"upb/bindings/lua/upb.h", |
||||
], |
||||
deps = [ |
||||
"upb", |
||||
"upb_pb", |
||||
], |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upb", |
||||
srcs = ["upb/bindings/lua/upb.lua"], |
||||
luadeps = ["lua/upb_c"], |
||||
strip_prefix = "upb/bindings/lua", |
||||
) |
||||
|
||||
lua_cclibrary( |
||||
name = "lua/upb/pb_c", |
||||
srcs = ["upb/bindings/lua/upb/pb.c"], |
||||
luadeps = ["lua/upb_c"], |
||||
deps = ["upb_pb"], |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upb/pb", |
||||
srcs = ["upb/bindings/lua/upb/pb.lua"], |
||||
luadeps = [ |
||||
"lua/upb", |
||||
"lua/upb/pb_c", |
||||
], |
||||
strip_prefix = "upb/bindings/lua", |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upbc_lib", |
||||
srcs = [ |
||||
"tools/dump_cinit.lua", |
||||
"tools/make_c_api.lua", |
||||
], |
||||
luadeps = [ |
||||
"lua/upb", |
||||
], |
||||
strip_prefix = "tools", |
||||
) |
||||
|
||||
# Lua tests. ################################################################### |
||||
|
||||
lua_test( |
||||
name = "lua/test_upb", |
||||
luadeps = ["lua/upb"], |
||||
luamain = "tests/bindings/lua/test_upb.lua", |
||||
) |
||||
|
||||
lua_test( |
||||
name = "lua/test_upb_pb", |
||||
luadeps = ["lua/upb/pb"], |
||||
luamain = "tests/bindings/lua/test_upb.pb.lua", |
||||
) |
||||
|
||||
# upb compiler ################################################################# |
||||
|
||||
lua_binary( |
||||
name = "lua_upbc", |
||||
luadeps = [ |
||||
"lua/upbc_lib", |
||||
], |
||||
luamain = "tools/upbc.lua", |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upbc_generator", |
||||
hdrs = ["upbc/generator.h"], |
||||
srcs = ["upbc/generator.cc", "upbc/message_layout.h", "upbc/message_layout.cc"], |
||||
deps = [ |
||||
"@com_google_protobuf//:protobuf", |
||||
"@com_google_protobuf//:protoc_lib", |
||||
"@absl//absl/strings", |
||||
], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "protoc-gen-upb", |
||||
srcs = ["upbc/main.cc"], |
||||
deps = [ |
||||
":upbc_generator", |
||||
"@com_google_protobuf//:protoc_lib", |
||||
], |
||||
) |
||||
|
||||
# Test the CMake build ######################################################### |
||||
|
||||
make_shell_script( |
||||
name = "gen_run_cmake_build", |
||||
out = "run_cmake_build.sh", |
||||
contents = "mkdir build && cd build && cmake .. && make -j8 && make test" |
||||
) |
||||
|
||||
sh_test( |
||||
name = "cmake_build", |
||||
srcs = ["run_cmake_build.sh"], |
||||
data = glob([ |
||||
"CMakeLists.txt", |
||||
"google/**/*", |
||||
"upbc/**/*", |
||||
"upb/**/*", |
||||
"tests/**/*", |
||||
]) + [ |
||||
"@bazel_tools//tools/bash/runfiles", |
||||
], |
||||
) |
||||
|
||||
# Generated files ############################################################## |
||||
|
||||
exports_files(["tools/staleness_test.py"]) |
||||
|
||||
py_library( |
||||
name = "staleness_test_lib", |
||||
testonly = 1, |
||||
srcs = ["tools/staleness_test_lib.py"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "make_dynasm_decoder", |
||||
srcs = [ |
||||
"third_party/dynasm/dynasm.lua", |
||||
"third_party/dynasm/dasm_x64.lua", |
||||
"third_party/dynasm/dasm_x86.lua", |
||||
"upb/pb/compile_decoder_x64.dasc", |
||||
], |
||||
outs = ["generated/upb/pb/compile_decoder_x64.h"], |
||||
cmd = "LUA_PATH=third_party/dynasm/?.lua $(location @lua//:lua) third_party/dynasm/dynasm.lua -c upb/pb/compile_decoder_x64.dasc > $@", |
||||
tools = ["@lua"], |
||||
) |
||||
|
||||
py_binary( |
||||
name = "make_cmakelists", |
||||
srcs = ["tools/make_cmakelists.py"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "gen_cmakelists", |
||||
outs = ["generated/CMakeLists.txt"], |
||||
srcs = ["BUILD", "WORKSPACE"], |
||||
tools = [":make_cmakelists"], |
||||
cmd = "$(location :make_cmakelists) $@" |
||||
) |
||||
|
||||
proto_library( |
||||
name = "google_descriptor_proto", |
||||
srcs = [ |
||||
"google/protobuf/descriptor.proto", |
||||
], |
||||
) |
||||
|
||||
genrule( |
||||
name = "copy_google_descriptor_pb", |
||||
srcs = [":google_descriptor_proto"], |
||||
outs = ["generated/google/protobuf/descriptor.pb"], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
genrule( |
||||
name = "generate_descriptor_c", |
||||
srcs = ["google/protobuf/descriptor.proto"], |
||||
outs = [ |
||||
"generated/google/protobuf/descriptor.upb.h", |
||||
"generated/google/protobuf/descriptor.upb.c", |
||||
], |
||||
cmd = "$(location @com_google_protobuf//:protoc) $< --upb_out=$(GENDIR)/generated --plugin=protoc-gen-upb=$(location :protoc-gen-upb)", |
||||
tools = [ |
||||
"@com_google_protobuf//:protoc", |
||||
":protoc-gen-upb" |
||||
], |
||||
) |
||||
|
||||
proto_library( |
||||
name = "json_test_proto", |
||||
srcs = ["tests/json/test.proto"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "copy_json_test_proto", |
||||
srcs = [":json_test_proto"], |
||||
outs = ["generated/tests/json/test.proto.pb"], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
genrule( |
||||
name = "generated_json_test_proto_upbdefs", |
||||
srcs = ["generated/tests/json/test.proto.pb"], |
||||
outs = [ |
||||
"generated/tests/json/test.upbdefs.h", |
||||
"generated/tests/json/test.upbdefs.c", |
||||
], |
||||
cmd = "UPBC=$$PWD/$(location :lua_upbc); INFILE=$$PWD/$<; cd $(GENDIR)/generated && $$UPBC --generate-upbdefs $$INFILE", |
||||
tools = [":lua_upbc"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "generate_json_ragel", |
||||
srcs = ["upb/json/parser.rl"], |
||||
outs = ["generated/upb/json/parser.c"], |
||||
cmd = "$(location @ragel//:ragel) -C -o upb/json/parser.c $< && mv upb/json/parser.c $@", |
||||
tools = ["@ragel"], |
||||
) |
||||
|
||||
generated_file_staleness_test( |
||||
name = "test_generated_files", |
||||
outs = [ |
||||
"CMakeLists.txt", |
||||
"google/protobuf/descriptor.upb.c", |
||||
"google/protobuf/descriptor.upb.h", |
||||
"tests/json/test.proto.pb", |
||||
"tests/json/test.upbdefs.c", |
||||
"tests/json/test.upbdefs.h", |
||||
"upb/descriptor/descriptor.pb", |
||||
"upb/descriptor/descriptor.upbdefs.c", |
||||
"upb/descriptor/descriptor.upbdefs.h", |
||||
"upb/json/parser.c", |
||||
"upb/pb/compile_decoder_x64.h", |
||||
], |
||||
generated_pattern = "generated/%s", |
||||
) |
@ -0,0 +1,46 @@ |
||||
|
||||
workspace(name = "upb") |
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") |
||||
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") |
||||
|
||||
http_archive( |
||||
name = "lua", |
||||
build_file = "//:lua.BUILD", |
||||
sha256 = "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b", |
||||
strip_prefix = "lua-5.2.4", |
||||
urls = [ |
||||
"https://mirror.bazel.build/www.lua.org/ftp/lua-5.2.4.tar.gz", |
||||
"https://www.lua.org/ftp/lua-5.2.4.tar.gz", |
||||
], |
||||
) |
||||
|
||||
git_repository( |
||||
name = "com_google_protobuf", |
||||
commit = "25feb59620627b673df76813dfd66e3f565765e7", |
||||
#sha256 = "d7a221b3d4fb4f05b7473795ccea9e05dab3b8721f6286a95fffbffc2d926f8b", |
||||
remote = "https://github.com/haberman/protobuf.git", |
||||
#tag = "conformance-build-tag", |
||||
) |
||||
|
||||
git_repository( |
||||
name = "absl", |
||||
commit = "070f6e47b33a2909d039e620c873204f78809492", |
||||
remote = "https://github.com/abseil/abseil-cpp.git", |
||||
) |
||||
|
||||
http_archive( |
||||
name = "ragel", |
||||
sha256 = "5f156edb65d20b856d638dd9ee2dfb43285914d9aa2b6ec779dac0270cd56c3f", |
||||
build_file = "//:ragel.BUILD", |
||||
strip_prefix = "ragel-6.10", |
||||
urls = ["http://www.colm.net/files/ragel/ragel-6.10.tar.gz"], |
||||
) |
||||
|
||||
# Used by protobuf. |
||||
http_archive( |
||||
name = "bazel_skylib", |
||||
sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d", |
||||
strip_prefix = "bazel-skylib-2169ae1c374aab4a09aa90e65efe1a3aad4e279b", |
||||
urls = ["https://github.com/bazelbuild/bazel-skylib/archive/2169ae1c374aab4a09aa90e65efe1a3aad4e279b.tar.gz"], |
||||
) |
@ -0,0 +1,274 @@ |
||||
|
||||
_shell_find_runfiles = """ |
||||
# --- begin runfiles.bash initialization --- |
||||
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash). |
||||
set -euo pipefail |
||||
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
||||
if [[ -f "$0.runfiles_manifest" ]]; then |
||||
export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" |
||||
elif [[ -f "$0.runfiles/MANIFEST" ]]; then |
||||
export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST" |
||||
elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
||||
export RUNFILES_DIR="$0.runfiles" |
||||
fi |
||||
fi |
||||
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
||||
source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" |
||||
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
||||
source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ |
||||
"$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" |
||||
else |
||||
echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" |
||||
exit 1 |
||||
fi |
||||
# --- end runfiles.bash initialization --- |
||||
""" |
||||
|
||||
def _librule(name): |
||||
return name + "_lib" |
||||
|
||||
def lua_cclibrary(name, srcs, hdrs = [], deps = [], luadeps = []): |
||||
lib_rule = name + "_lib" |
||||
so_rule = "lib" + name + ".so" |
||||
so_file = _remove_prefix(name, "lua/") + ".so" |
||||
|
||||
native.cc_library( |
||||
name = _librule(name), |
||||
hdrs = hdrs, |
||||
srcs = srcs, |
||||
deps = deps + [_librule(dep) for dep in luadeps] + ["@lua//:liblua_headers"], |
||||
) |
||||
|
||||
native.cc_binary( |
||||
name = so_rule, |
||||
linkshared = True, |
||||
deps = [_librule(name)], |
||||
) |
||||
|
||||
native.genrule( |
||||
name = name + "_copy", |
||||
srcs = [":" + so_rule], |
||||
outs = [so_file], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
native.filegroup( |
||||
name = name, |
||||
data = [so_file], |
||||
) |
||||
|
||||
def _remove_prefix(str, prefix): |
||||
if not str.startswith(prefix): |
||||
fail("%s doesn't start with %s" % (str, prefix)) |
||||
return str[len(prefix):] |
||||
|
||||
def _remove_suffix(str, suffix): |
||||
if not str.endswith(suffix): |
||||
fail("%s doesn't end with %s" % (str, suffix)) |
||||
return str[:-len(suffix)] |
||||
|
||||
def lua_library(name, srcs, strip_prefix, luadeps = []): |
||||
outs = [_remove_prefix(src, strip_prefix + "/") for src in srcs] |
||||
native.genrule( |
||||
name = name + "_copy", |
||||
srcs = srcs, |
||||
outs = outs, |
||||
cmd = "cp $(SRCS) $(@D)", |
||||
) |
||||
|
||||
native.filegroup( |
||||
name = name, |
||||
data = outs + luadeps, |
||||
) |
||||
|
||||
def make_shell_script(name, contents, out): |
||||
script_contents = (_shell_find_runfiles + contents).replace("$", "$$") |
||||
native.genrule( |
||||
name = "gen_" + name, |
||||
outs = [out], |
||||
cmd = "(cat <<'HEREDOC'\n%s\nHEREDOC\n) > $@" % script_contents, |
||||
) |
||||
|
||||
def _lua_binary_or_test(name, luamain, luadeps, rule): |
||||
script = name + ".sh" |
||||
|
||||
make_shell_script( |
||||
name = "gen_" + name, |
||||
out = script, |
||||
contents = """ |
||||
BASE=$(dirname $(rlocation upb/upb_c.so)) |
||||
export LUA_CPATH="$BASE/?.so" |
||||
export LUA_PATH="$BASE/?.lua" |
||||
$(rlocation lua/lua) $(rlocation upb/tools/upbc.lua) "$@" |
||||
""" |
||||
) |
||||
|
||||
rule( |
||||
name = name, |
||||
srcs = [script], |
||||
data = ["@lua//:lua", "@bazel_tools//tools/bash/runfiles", luamain] + luadeps, |
||||
) |
||||
|
||||
def lua_binary(name, luamain, luadeps=[]): |
||||
_lua_binary_or_test(name, luamain, luadeps, native.sh_binary) |
||||
|
||||
def lua_test(name, luamain, luadeps=[]): |
||||
_lua_binary_or_test(name, luamain, luadeps, native.sh_test) |
||||
|
||||
def generated_file_staleness_test(name, outs, generated_pattern): |
||||
"""Tests that checked-in file(s) match the contents of generated file(s). |
||||
|
||||
The resulting test will verify that all output files exist and have the |
||||
correct contents. If the test fails, it can be invoked with --fix to |
||||
bring the checked-in files up to date. |
||||
|
||||
Args: |
||||
name: Name of the rule. |
||||
outs: the checked-in files that are copied from generated files. |
||||
generated_pattern: the pattern for transforming each "out" file into a |
||||
generated file. For example, if generated_pattern="generated/%s" then |
||||
a file foo.txt will look for generated file generated/foo.txt. |
||||
""" |
||||
|
||||
script_name = name + ".py" |
||||
script_src = "//:tools/staleness_test.py" |
||||
|
||||
# Filter out non-existing rules so Blaze doesn't error out before we even |
||||
# run the test. |
||||
existing_outs = native.glob(include = outs) |
||||
|
||||
# The file list contains a few extra bits of information at the end. |
||||
# These get unpacked by the Config class in staleness_test_lib.py. |
||||
file_list = outs + [generated_pattern, native.package_name() or ".", name] |
||||
|
||||
native.genrule( |
||||
name = name + "_makescript", |
||||
outs = [script_name], |
||||
srcs = [script_src], |
||||
testonly = 1, |
||||
cmd = "cat $(location " + script_src + ") > $@; " + |
||||
"sed -i '' -e 's|INSERT_FILE_LIST_HERE|" + "\\\n ".join(file_list) + "|' $@", |
||||
) |
||||
|
||||
native.py_test( |
||||
name = name, |
||||
srcs = [script_name], |
||||
data = existing_outs + [generated_pattern % file for file in outs], |
||||
deps = [ |
||||
"//:staleness_test_lib", |
||||
], |
||||
) |
||||
|
||||
# upb_amalgamation() rule, with file_list aspect. |
||||
|
||||
SrcList = provider( |
||||
fields = { |
||||
'srcs' : 'list of srcs', |
||||
'hdrs' : 'list of hdrs', |
||||
} |
||||
) |
||||
|
||||
def _file_list_aspect_impl(target, ctx): |
||||
srcs = [] |
||||
hdrs = [] |
||||
for src in ctx.rule.attr.srcs: |
||||
srcs += src.files.to_list() |
||||
for hdr in ctx.rule.attr.hdrs: |
||||
hdrs += hdr.files.to_list() |
||||
return [SrcList(srcs = srcs, hdrs = hdrs)] |
||||
|
||||
_file_list_aspect = aspect( |
||||
implementation = _file_list_aspect_impl, |
||||
) |
||||
|
||||
def _upb_amalgamation(ctx): |
||||
srcs = [] |
||||
hdrs = [] |
||||
for lib in ctx.attr.libs: |
||||
srcs += lib[SrcList].srcs |
||||
hdrs += lib[SrcList].hdrs |
||||
ctx.actions.run( |
||||
inputs = srcs + hdrs, |
||||
outputs = ctx.outputs.outs, |
||||
arguments = ["", ctx.bin_dir.path + "/"] + [f.path for f in srcs], |
||||
progress_message = "Making amalgamation", |
||||
executable = ctx.executable.amalgamator, |
||||
) |
||||
|
||||
upb_amalgamation = rule( |
||||
implementation = _upb_amalgamation, |
||||
attrs = { |
||||
"amalgamator": attr.label( |
||||
executable = True, |
||||
cfg = "host", |
||||
), |
||||
"libs": attr.label_list(aspects = [_file_list_aspect]), |
||||
"outs": attr.output_list(), |
||||
} |
||||
) |
||||
|
||||
# upb_proto_library() rule |
||||
|
||||
def _remove_up(string): |
||||
if string.startswith("../"): |
||||
string = string[3:] |
||||
pos = string.find("/") |
||||
string = string[pos + 1:] |
||||
|
||||
return _remove_suffix(string, ".proto") |
||||
|
||||
def _upb_proto_library_srcs_impl(ctx): |
||||
sources = [] |
||||
outs = [] |
||||
include_dirs = {} |
||||
for dep in ctx.attr.deps: |
||||
if hasattr(dep, 'proto'): |
||||
for src in dep.proto.transitive_sources: |
||||
sources.append(src) |
||||
include_dirs[_remove_suffix(src.path, _remove_up(src.short_path) + "." + src.extension)] = True |
||||
outs.append(ctx.actions.declare_file(_remove_up(src.short_path) + ".upb.h")) |
||||
outs.append(ctx.actions.declare_file(_remove_up(src.short_path) + ".upb.c")) |
||||
outdir = _remove_suffix(outs[-1].path, _remove_up(src.short_path) + ".upb.c") |
||||
|
||||
source_paths = [d.path for d in sources] |
||||
include_args = ["-I" + root for root in include_dirs.keys()] |
||||
|
||||
ctx.actions.run( |
||||
inputs = [ctx.executable.upbc] + sources, |
||||
outputs = outs, |
||||
executable = ctx.executable.protoc, |
||||
arguments = ["--upb_out", outdir, "--plugin=protoc-gen-upb=" + ctx.executable.upbc.path] + include_args + source_paths, |
||||
progress_message = "Generating upb protos", |
||||
) |
||||
|
||||
return [DefaultInfo(files = depset(outs))] |
||||
|
||||
_upb_proto_library_srcs = rule( |
||||
implementation = _upb_proto_library_srcs_impl, |
||||
attrs = { |
||||
"upbc": attr.label( |
||||
executable = True, |
||||
cfg = "host", |
||||
), |
||||
"protoc": attr.label( |
||||
executable = True, |
||||
cfg = "host", |
||||
default = "@com_google_protobuf//:protoc", |
||||
), |
||||
"deps": attr.label_list(), |
||||
} |
||||
) |
||||
|
||||
def upb_proto_library(name, deps, upbc): |
||||
srcs_rule = name + "_srcs.cc" |
||||
_upb_proto_library_srcs( |
||||
name = srcs_rule, |
||||
upbc = upbc, |
||||
deps = deps, |
||||
) |
||||
native.cc_library( |
||||
name = name, |
||||
srcs = [":" + srcs_rule], |
||||
deps = [":upb"], |
||||
copts = ["-Ibazel-out/k8-fastbuild/bin"], |
||||
) |
@ -0,0 +1,4 @@ |
||||
#!/bin/bash |
||||
|
||||
cd $(dirname $0)/../.. |
||||
bazel test :all |
@ -0,0 +1,2 @@ |
||||
build_file: "upb/kokoro/ubuntu/build.sh" |
||||
timeout_mins: 15 |
@ -0,0 +1,2 @@ |
||||
build_file: "upb/kokoro/ubuntu/build.sh" |
||||
timeout_mins: 15 |
@ -0,0 +1,102 @@ |
||||
package( |
||||
default_visibility = ["//visibility:public"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "liblua_headers", |
||||
defines = ["LUA_USE_LINUX"], |
||||
hdrs = [ |
||||
"src/lauxlib.h", |
||||
"src/lua.h", |
||||
"src/lua.hpp", |
||||
"src/luaconf.h", |
||||
"src/lualib.h", |
||||
], |
||||
includes = ["src"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "liblua", |
||||
srcs = [ |
||||
"src/lapi.c", |
||||
"src/lapi.h", |
||||
"src/lauxlib.c", |
||||
"src/lauxlib.h", |
||||
"src/lbaselib.c", |
||||
"src/lbitlib.c", |
||||
"src/lcode.c", |
||||
"src/lcode.h", |
||||
"src/lcorolib.c", |
||||
"src/lctype.c", |
||||
"src/lctype.h", |
||||
"src/ldblib.c", |
||||
"src/ldebug.c", |
||||
"src/ldebug.h", |
||||
"src/ldo.c", |
||||
"src/ldo.h", |
||||
"src/ldump.c", |
||||
"src/lfunc.c", |
||||
"src/lfunc.h", |
||||
"src/lgc.c", |
||||
"src/lgc.h", |
||||
"src/linit.c", |
||||
"src/liolib.c", |
||||
"src/llex.c", |
||||
"src/llex.h", |
||||
"src/llimits.h", |
||||
"src/lmathlib.c", |
||||
"src/lmem.c", |
||||
"src/lmem.h", |
||||
"src/loadlib.c", |
||||
"src/lobject.c", |
||||
"src/lobject.h", |
||||
"src/lopcodes.c", |
||||
"src/lopcodes.h", |
||||
"src/loslib.c", |
||||
"src/lparser.c", |
||||
"src/lparser.h", |
||||
"src/lstate.c", |
||||
"src/lstate.h", |
||||
"src/lstring.c", |
||||
"src/lstring.h", |
||||
"src/lstrlib.c", |
||||
"src/ltable.c", |
||||
"src/ltable.h", |
||||
"src/ltablib.c", |
||||
"src/ltm.c", |
||||
"src/ltm.h", |
||||
"src/lundump.c", |
||||
"src/lundump.h", |
||||
"src/lvm.c", |
||||
"src/lvm.h", |
||||
"src/lzio.c", |
||||
"src/lzio.h", |
||||
], |
||||
defines = ["LUA_USE_LINUX"], |
||||
hdrs = [ |
||||
"src/lauxlib.h", |
||||
"src/lua.h", |
||||
"src/lua.hpp", |
||||
"src/luaconf.h", |
||||
"src/lualib.h", |
||||
], |
||||
includes = ["src"], |
||||
linkopts = [ |
||||
"-lm", |
||||
"-ldl", |
||||
], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "lua", |
||||
srcs = [ |
||||
"src/lua.c", |
||||
], |
||||
deps = [ |
||||
":liblua", |
||||
], |
||||
linkopts = [ |
||||
"-lreadline", |
||||
"-rdynamic", |
||||
], |
||||
) |
@ -0,0 +1,193 @@ |
||||
|
||||
package( |
||||
default_visibility = ["//visibility:public"], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "ragel", |
||||
srcs = [ |
||||
"ragel/rubycodegen.cpp", |
||||
"ragel/goipgoto.h", |
||||
"ragel/cdtable.h", |
||||
"ragel/rubycodegen.h", |
||||
"ragel/gotable.h", |
||||
"ragel/gocodegen.cpp", |
||||
"ragel/rubyfflat.cpp", |
||||
"ragel/common.cpp", |
||||
"ragel/gofflat.cpp", |
||||
"ragel/cdtable.cpp", |
||||
"ragel/cdsplit.cpp", |
||||
"ragel/rlparse.cpp", |
||||
"ragel/csfgoto.cpp", |
||||
"ragel/javacodegen.cpp", |
||||
"ragel/gocodegen.h", |
||||
"ragel/mlgoto.cpp", |
||||
"ragel/fsmgraph.cpp", |
||||
"ragel/version.h", |
||||
"ragel/mlfflat.h", |
||||
"ragel/fsmgraph.h", |
||||
"ragel/fsmbase.cpp", |
||||
"ragel/fsmstate.cpp", |
||||
"ragel/gotablish.cpp", |
||||
"ragel/rubyflat.cpp", |
||||
"ragel/cdfgoto.h", |
||||
"ragel/cscodegen.h", |
||||
"ragel/mlflat.cpp", |
||||
"ragel/rubyflat.h", |
||||
"ragel/goftable.h", |
||||
"ragel/rbxgoto.cpp", |
||||
"ragel/csfflat.cpp", |
||||
"ragel/gofgoto.cpp", |
||||
"ragel/gofgoto.h", |
||||
"ragel/ragel.h", |
||||
"ragel/goftable.cpp", |
||||
"ragel/cdcodegen.cpp", |
||||
"ragel/rlparse.h", |
||||
"ragel/cdsplit.h", |
||||
"ragel/xmlcodegen.cpp", |
||||
"ragel/goipgoto.cpp", |
||||
"ragel/dotcodegen.h", |
||||
"ragel/gogoto.cpp", |
||||
"ragel/csflat.h", |
||||
"ragel/csfflat.h", |
||||
#"ragel/config.h.in", |
||||
"ragel/csipgoto.cpp", |
||||
"ragel/mltable.cpp", |
||||
"ragel/mlflat.h", |
||||
"ragel/csftable.cpp", |
||||
"ragel/cdgoto.h", |
||||
"ragel/goflat.cpp", |
||||
"ragel/rubyfflat.h", |
||||
"ragel/mlftable.h", |
||||
"ragel/rubyftable.h", |
||||
"ragel/fsmap.cpp", |
||||
"ragel/redfsm.cpp", |
||||
"ragel/goflat.h", |
||||
"ragel/parsetree.cpp", |
||||
"ragel/fsmmin.cpp", |
||||
"ragel/dotcodegen.cpp", |
||||
"ragel/redfsm.h", |
||||
"ragel/mlcodegen.cpp", |
||||
"ragel/cdfgoto.cpp", |
||||
"ragel/cssplit.cpp", |
||||
"ragel/cstable.cpp", |
||||
"ragel/javacodegen.h", |
||||
"ragel/parsedata.cpp", |
||||
"ragel/buffer.h", |
||||
"ragel/gogoto.h", |
||||
"ragel/csgoto.h", |
||||
"ragel/pcheck.h", |
||||
"ragel/rubyftable.cpp", |
||||
"ragel/csfgoto.h", |
||||
"ragel/common.h", |
||||
"ragel/cdftable.h", |
||||
"ragel/mlgoto.h", |
||||
"ragel/csgoto.cpp", |
||||
"ragel/cdflat.h", |
||||
"ragel/cdipgoto.h", |
||||
"ragel/cstable.h", |
||||
"ragel/gendata.h", |
||||
"ragel/cdfflat.cpp", |
||||
"ragel/gotable.cpp", |
||||
"ragel/cdcodegen.h", |
||||
"ragel/gendata.cpp", |
||||
"ragel/rubytable.h", |
||||
"ragel/csflat.cpp", |
||||
"ragel/inputdata.h", |
||||
"ragel/inputdata.cpp", |
||||
"ragel/rubytable.cpp", |
||||
"ragel/fsmattach.cpp", |
||||
"ragel/csipgoto.h", |
||||
"ragel/cscodegen.cpp", |
||||
"ragel/cdfflat.h", |
||||
"ragel/rbxgoto.h", |
||||
"ragel/xmlcodegen.h", |
||||
"ragel/gofflat.h", |
||||
"ragel/parsedata.h", |
||||
"ragel/mlfgoto.h", |
||||
"ragel/cdflat.cpp", |
||||
"ragel/config.h", |
||||
"ragel/rlscan.cpp", |
||||
"ragel/mlcodegen.h", |
||||
"ragel/mlfflat.cpp", |
||||
"ragel/mlftable.cpp", |
||||
"ragel/mltable.h", |
||||
"ragel/cdipgoto.cpp", |
||||
"ragel/cdftable.cpp", |
||||
"ragel/parsetree.h", |
||||
"ragel/rlscan.h", |
||||
"ragel/main.cpp", |
||||
"ragel/cssplit.h", |
||||
"ragel/mlfgoto.cpp", |
||||
"ragel/csftable.h", |
||||
"ragel/gotablish.h", |
||||
"ragel/cdgoto.cpp", |
||||
"aapl/avlmelkey.h", |
||||
"aapl/dlistmel.h", |
||||
"aapl/avliset.h", |
||||
"aapl/avlkeyless.h", |
||||
"aapl/sbstset.h", |
||||
"aapl/sbsttable.h", |
||||
"aapl/quicksort.h", |
||||
"aapl/avlitree.h", |
||||
"aapl/avlcommon.h", |
||||
"aapl/bstset.h", |
||||
"aapl/avlmel.h", |
||||
"aapl/insertsort.h", |
||||
"aapl/dlist.h", |
||||
"aapl/avlmap.h", |
||||
"aapl/mergesort.h", |
||||
"aapl/resize.h", |
||||
"aapl/bstcommon.h", |
||||
"aapl/bstmap.h", |
||||
"aapl/compare.h", |
||||
"aapl/svector.h", |
||||
"aapl/avlset.h", |
||||
"aapl/bsttable.h", |
||||
"aapl/avlikeyless.h", |
||||
"aapl/bubblesort.h", |
||||
"aapl/table.h", |
||||
"aapl/avlbasic.h", |
||||
"aapl/vector.h", |
||||
"aapl/avlimap.h", |
||||
"aapl/dlistval.h", |
||||
"aapl/dlcommon.h", |
||||
"aapl/avlibasic.h", |
||||
"aapl/sbstmap.h", |
||||
"aapl/avlimel.h", |
||||
"aapl/avlimelkey.h", |
||||
"aapl/avltree.h", |
||||
], |
||||
includes = ["ragel", "aapl"], |
||||
) |
||||
|
||||
config_h_contents = """ |
||||
#define PACKAGE "ragel" |
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */ |
||||
#define PACKAGE_BUGREPORT "" |
||||
|
||||
/* Define to the full name of this package. */ |
||||
#define PACKAGE_NAME "ragel" |
||||
|
||||
/* Define to the full name and version of this package. */ |
||||
#define PACKAGE_STRING "ragel 6.10" |
||||
|
||||
/* Define to the one symbol short name of this package. */ |
||||
#define PACKAGE_TARNAME "ragel" |
||||
|
||||
/* Define to the home page for this package. */ |
||||
#define PACKAGE_URL "" |
||||
|
||||
/* Define to the version of this package. */ |
||||
#define PACKAGE_VERSION "6.10" |
||||
|
||||
/* Version number of package */ |
||||
#define VERSION "6.10" |
||||
""" |
||||
|
||||
genrule( |
||||
name = "gen_config_h", |
||||
outs = ["ragel/config.h"], |
||||
cmd = "(cat <<'HEREDOC'\n%s\nHEREDOC\n) > $@" % config_h_contents, |
||||
) |
@ -0,0 +1,240 @@ |
||||
#!/usr/bin/env python |
||||
|
||||
"""TODO(haberman): DO NOT SUBMIT without one-line documentation for make_cmakelists. |
||||
|
||||
TODO(haberman): DO NOT SUBMIT without a detailed description of make_cmakelists. |
||||
""" |
||||
|
||||
from __future__ import absolute_import |
||||
from __future__ import division |
||||
from __future__ import print_function |
||||
|
||||
import sys |
||||
import textwrap |
||||
|
||||
def StripColons(deps): |
||||
return map(lambda x: x[1:], deps) |
||||
|
||||
def IsSourceFile(name): |
||||
return name.endswith(".c") or name.endswith(".cc") |
||||
|
||||
class BuildFileFunctions(object): |
||||
def __init__(self, converter): |
||||
self.converter = converter |
||||
|
||||
def _add_deps(self, kwargs, keyword=""): |
||||
if "deps" not in kwargs: |
||||
return |
||||
self.converter.toplevel += "target_link_libraries(%s%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
keyword, |
||||
"\n ".join(StripColons(kwargs["deps"])) |
||||
) |
||||
|
||||
def load(self, *args): |
||||
pass |
||||
|
||||
def cc_library(self, **kwargs): |
||||
if kwargs["name"] == "amalgamation" or kwargs["name"] == "upbc_generator": |
||||
return |
||||
files = kwargs.get("srcs", []) + kwargs.get("hdrs", []) |
||||
|
||||
if filter(IsSourceFile, files): |
||||
# Has sources, make this a normal library. |
||||
self.converter.toplevel += "add_library(%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
"\n ".join(files) |
||||
) |
||||
self._add_deps(kwargs) |
||||
else: |
||||
# Header-only library, have to do a couple things differently. |
||||
# For some info, see: |
||||
# http://mariobadr.com/creating-a-header-only-library-with-cmake.html |
||||
self.converter.toplevel += "add_library(%s INTERFACE)\n" % ( |
||||
kwargs["name"] |
||||
) |
||||
self._add_deps(kwargs, " INTERFACE") |
||||
|
||||
def cc_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def cc_test(self, **kwargs): |
||||
self.converter.toplevel += "add_executable(%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
"\n ".join(kwargs["srcs"]) |
||||
) |
||||
self.converter.toplevel += "add_test(NAME %s COMMAND %s)\n" % ( |
||||
kwargs["name"], |
||||
kwargs["name"], |
||||
) |
||||
|
||||
if "data" in kwargs: |
||||
for data_dep in kwargs["data"]: |
||||
self.converter.toplevel += textwrap.dedent("""\ |
||||
add_custom_command( |
||||
TARGET %s POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy |
||||
${CMAKE_SOURCE_DIR}/%s |
||||
${CMAKE_CURRENT_BINARY_DIR}/%s)\n""" % ( |
||||
kwargs["name"], data_dep, data_dep |
||||
)) |
||||
|
||||
self._add_deps(kwargs) |
||||
|
||||
def py_library(self, **kwargs): |
||||
pass |
||||
|
||||
def py_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_cclibrary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_library(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_test(self, **kwargs): |
||||
pass |
||||
|
||||
def sh_test(self, **kwargs): |
||||
pass |
||||
|
||||
def make_shell_script(self, **kwargs): |
||||
pass |
||||
|
||||
def exports_files(self, files, **kwargs): |
||||
pass |
||||
|
||||
def proto_library(self, **kwargs): |
||||
pass |
||||
|
||||
def generated_file_staleness_test(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_amalgamation(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_proto_library(self, **kwargs): |
||||
pass |
||||
|
||||
def genrule(self, **kwargs): |
||||
pass |
||||
|
||||
def glob(*args): |
||||
return [] |
||||
|
||||
|
||||
class WorkspaceFileFunctions(object): |
||||
def __init__(self, converter): |
||||
self.converter = converter |
||||
|
||||
def load(self, *args): |
||||
pass |
||||
|
||||
def workspace(self, **kwargs): |
||||
self.converter.prelude += "project(%s)\n" % (kwargs["name"]) |
||||
|
||||
def http_archive(self, **kwargs): |
||||
pass |
||||
|
||||
def git_repository(self, **kwargs): |
||||
pass |
||||
|
||||
|
||||
class Converter(object): |
||||
def __init__(self): |
||||
self.prelude = "" |
||||
self.toplevel = "" |
||||
self.if_lua = "" |
||||
|
||||
def convert(self): |
||||
return self.template % { |
||||
"prelude": converter.prelude, |
||||
"toplevel": converter.toplevel, |
||||
} |
||||
|
||||
template = textwrap.dedent("""\ |
||||
# This file was generated from BUILD using tools/make_cmakelists.py. |
||||
|
||||
cmake_minimum_required(VERSION 3.1) |
||||
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.12) |
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) |
||||
else() |
||||
cmake_policy(VERSION 3.12) |
||||
endif() |
||||
|
||||
cmake_minimum_required (VERSION 3.0) |
||||
cmake_policy(SET CMP0048 NEW) |
||||
|
||||
%(prelude)s |
||||
|
||||
# Prevent CMake from setting -rdynamic on Linux (!!). |
||||
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") |
||||
SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") |
||||
|
||||
# Set default build type. |
||||
if(NOT CMAKE_BUILD_TYPE) |
||||
message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.") |
||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING |
||||
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." |
||||
FORCE) |
||||
endif() |
||||
|
||||
# When using Ninja, compiler output won't be colorized without this. |
||||
include(CheckCXXCompilerFlag) |
||||
CHECK_CXX_COMPILER_FLAG(-fdiagnostics-color=always SUPPORTS_COLOR_ALWAYS) |
||||
if(SUPPORTS_COLOR_ALWAYS) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always") |
||||
endif() |
||||
|
||||
# Implement ASAN/UBSAN options |
||||
if(UPB_ENABLE_ASAN) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") |
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") |
||||
endif() |
||||
|
||||
if(UPB_ENABLE_UBSAN) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") |
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") |
||||
endif() |
||||
|
||||
include_directories(.) |
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) |
||||
|
||||
if(APPLE) |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup -flat_namespace") |
||||
elseif(UNIX) |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id") |
||||
endif() |
||||
|
||||
enable_testing() |
||||
|
||||
%(toplevel)s |
||||
|
||||
""") |
||||
|
||||
data = {} |
||||
converter = Converter() |
||||
|
||||
def GetDict(obj): |
||||
ret = {} |
||||
for k in dir(obj): |
||||
if not k.startswith("_"): |
||||
ret[k] = getattr(obj, k); |
||||
return ret |
||||
|
||||
globs = GetDict(converter) |
||||
|
||||
execfile("WORKSPACE", GetDict(WorkspaceFileFunctions(converter))) |
||||
execfile("BUILD", GetDict(BuildFileFunctions(converter))) |
||||
|
||||
with open(sys.argv[1], "w") as f: |
||||
f.write(converter.convert()) |
@ -0,0 +1,30 @@ |
||||
"""The py_test() script for generated_file_staleness_test() rules. |
||||
|
||||
Note that this file is preprocessed! The INSERT_<...> text below is replaced |
||||
with the actual list of files before we actually run the script. |
||||
""" |
||||
|
||||
from __future__ import absolute_import |
||||
|
||||
from tools import staleness_test_lib |
||||
import unittest |
||||
import sys |
||||
|
||||
file_list = """ |
||||
INSERT_FILE_LIST_HERE |
||||
""".split() |
||||
|
||||
config = staleness_test_lib.Config(file_list) |
||||
|
||||
|
||||
class TestFilesMatch(unittest.TestCase): |
||||
|
||||
def testFilesMatch(self): |
||||
errors = staleness_test_lib.CheckFilesMatch(config) |
||||
self.assertFalse(errors, errors) |
||||
|
||||
|
||||
if len(sys.argv) > 1 and sys.argv[1] == "--fix": |
||||
staleness_test_lib.FixFiles(config) |
||||
else: |
||||
unittest.main() |
@ -0,0 +1,158 @@ |
||||
"""Shared code for validating generated_file_staleness_test() rules. |
||||
|
||||
This code is used by test scripts generated from |
||||
generated_file_staleness_test() rules. |
||||
""" |
||||
|
||||
from __future__ import absolute_import |
||||
from __future__ import print_function |
||||
|
||||
import os |
||||
from shutil import copyfile |
||||
|
||||
|
||||
class _FilePair(object): |
||||
"""Represents a single (target, generated) file pair.""" |
||||
|
||||
def __init__(self, target, generated): |
||||
self.target = target |
||||
self.generated = generated |
||||
|
||||
|
||||
class Config(object): |
||||
"""Represents the configuration for a single staleness test target.""" |
||||
|
||||
def __init__(self, file_list): |
||||
# Duplicate to avoid modifying our arguments. |
||||
file_list = list(file_list) |
||||
|
||||
# The file list contains a few other bits of information at the end. |
||||
# This is packed by the code in build_defs.bzl. |
||||
self.target_name = file_list.pop() |
||||
self.package_name = file_list.pop() |
||||
self.pattern = file_list.pop() |
||||
|
||||
self.file_list = file_list |
||||
|
||||
|
||||
def _GetFilePairs(config): |
||||
"""Generates the list of file pairs. |
||||
|
||||
Args: |
||||
config: a Config object representing this target's config. |
||||
|
||||
Returns: |
||||
A list of _FilePair objects. |
||||
""" |
||||
|
||||
ret = [] |
||||
|
||||
has_bazel_genfiles = os.path.exists("bazel-genfiles") |
||||
|
||||
for filename in config.file_list: |
||||
target = os.path.join(config.package_name, filename) |
||||
generated = os.path.join(config.package_name, config.pattern % filename) |
||||
if has_bazel_genfiles: |
||||
generated = os.path.join("bazel-genfiles", generated) |
||||
|
||||
# Generated files should always exist. Blaze should guarantee this before |
||||
# we are run. |
||||
if not os.path.isfile(generated): |
||||
print("Generated file '%s' does not exist." % generated) |
||||
print("Please run this command to generate it:") |
||||
print(" bazel build %s:%s" % (config.package_name, config.target_name)) |
||||
ret.append(_FilePair(target, generated)) |
||||
|
||||
return ret |
||||
|
||||
|
||||
def _GetMissingAndStaleFiles(file_pairs): |
||||
"""Generates lists of missing and stale files. |
||||
|
||||
Args: |
||||
file_pairs: a list of _FilePair objects. |
||||
|
||||
Returns: |
||||
missing_files: a list of _FilePair objects representing missing files. |
||||
These target files do not exist at all. |
||||
stale_files: a list of _FilePair objects representing stale files. |
||||
These target files exist but have stale contents. |
||||
""" |
||||
|
||||
missing_files = [] |
||||
stale_files = [] |
||||
|
||||
for pair in file_pairs: |
||||
if not os.path.isfile(pair.target): |
||||
missing_files.append(pair) |
||||
continue |
||||
|
||||
generated = open(pair.generated).read() |
||||
target = open(pair.target).read() |
||||
if generated != target: |
||||
stale_files.append(pair) |
||||
|
||||
return missing_files, stale_files |
||||
|
||||
|
||||
def _CopyFiles(file_pairs): |
||||
"""Copies all generated files to the corresponding target file. |
||||
|
||||
The target files must be writable already. |
||||
|
||||
Args: |
||||
file_pairs: a list of _FilePair objects that we want to copy. |
||||
""" |
||||
|
||||
for pair in file_pairs: |
||||
target_dir = os.path.dirname(pair.target) |
||||
if not os.path.isdir(target_dir): |
||||
os.makedirs(target_dir) |
||||
copyfile(pair.generated, pair.target) |
||||
|
||||
|
||||
def FixFiles(config): |
||||
"""Implements the --fix option: overwrites missing or out-of-date files. |
||||
|
||||
Args: |
||||
config: the Config object for this test. |
||||
""" |
||||
|
||||
file_pairs = _GetFilePairs(config) |
||||
missing_files, stale_files = _GetMissingAndStaleFiles(file_pairs) |
||||
|
||||
_CopyFiles(stale_files + missing_files) |
||||
|
||||
|
||||
def CheckFilesMatch(config): |
||||
"""Checks whether each target file matches the corresponding generated file. |
||||
|
||||
Args: |
||||
config: the Config object for this test. |
||||
|
||||
Returns: |
||||
None if everything matches, otherwise a string error message. |
||||
""" |
||||
|
||||
diff_errors = [] |
||||
|
||||
file_pairs = _GetFilePairs(config) |
||||
missing_files, stale_files = _GetMissingAndStaleFiles(file_pairs) |
||||
|
||||
for pair in missing_files: |
||||
diff_errors.append("File %s does not exist" % pair.target) |
||||
continue |
||||
|
||||
for pair in stale_files: |
||||
diff_errors.append("File %s is out of date" % pair.target) |
||||
|
||||
if diff_errors: |
||||
error_msg = "Files out of date!\n\n" |
||||
error_msg += "To fix run THIS command:\n" |
||||
error_msg += " bazel-bin/%s/%s --fix\n\n" % (config.package_name, |
||||
config.target_name) |
||||
error_msg += "Errors:\n" |
||||
error_msg += " " + "\n ".join(diff_errors) |
||||
return error_msg |
||||
else: |
||||
return None |
@ -1,927 +0,0 @@ |
||||
/* 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. */ |
||||
|
||||
#include "upb/def.h" |
||||
#include "upb/structdefs.int.h" |
||||
|
||||
static const upb_msgdef msgs[22]; |
||||
static const upb_fielddef fields[107]; |
||||
static const upb_enumdef enums[5]; |
||||
static const upb_tabent strentries[236]; |
||||
static const upb_tabent intentries[18]; |
||||
static const upb_tabval arrays[187]; |
||||
|
||||
#ifdef UPB_DEBUG_REFS |
||||
static upb_inttable reftables[268]; |
||||
#endif |
||||
|
||||
static const upb_msgdef msgs[22] = { |
||||
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 41, 8, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[0]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[0], &reftables[1]), |
||||
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[2], &reftables[3]), |
||||
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ReservedRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[14], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[20]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[4], &reftables[5]), |
||||
UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[17], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[24]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[6], &reftables[7]), |
||||
UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 9, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[21], 4, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[8], &reftables[9]), |
||||
UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 9, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[25], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[32]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[10], &reftables[11]), |
||||
UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[29], 2, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[36]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[12], &reftables[13]), |
||||
UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 24, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[40]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[14], &reftables[15]), |
||||
UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 13, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[42], 11, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[56]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[16], &reftables[17]), |
||||
UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 43, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[53], 13, 12), UPB_STRTABLE_INIT(12, 15, UPB_CTYPE_PTR, 4, &strentries[72]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[18], &reftables[19]), |
||||
UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[66], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[88]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[20], &reftables[21]), |
||||
UPB_MSGDEF_INIT("google.protobuf.FileOptions", 38, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 42, 17), UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[22], &reftables[23]), |
||||
UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 11, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[110], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[24], &reftables[25]), |
||||
UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 16, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[118], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[26], &reftables[27]), |
||||
UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[125], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[28], &reftables[29]), |
||||
UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[126], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[30], &reftables[31]), |
||||
UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[128], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[32], &reftables[33]), |
||||
UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[132], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[34], &reftables[35]), |
||||
UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[133], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[36], &reftables[37]), |
||||
UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 20, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[135], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[38], &reftables[39]), |
||||
UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 19, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[142], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[40], &reftables[41]), |
||||
UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 7, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[151], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, UPB_WELLKNOWN_UNSPECIFIED, &reftables[42], &reftables[43]), |
||||
}; |
||||
|
||||
static const upb_fielddef fields[107] = { |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL, 16, 6, {0},&reftables[44], &reftables[45]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL, 7, 1, {0},&reftables[46], &reftables[47]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL, 24, 12, {0},&reftables[48], &reftables[49]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[11], NULL, 18, 6, {0},&reftables[50], &reftables[51]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "client_streaming", 5, &msgs[13], NULL, 14, 4, {0},&reftables[52], &reftables[53]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "csharp_namespace", 37, &msgs[11], NULL, 28, 14, {0},&reftables[54], &reftables[55]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[8], (const upb_def*)(&enums[2]), 7, 1, {0},&reftables[56], &reftables[57]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[7], NULL, 17, 7, {0},&reftables[58], &reftables[59]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[9], NULL, 31, 8, {0},&reftables[60], &reftables[61]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[8], NULL, 9, 3, {0},&reftables[62], &reftables[63]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[14], NULL, 7, 1, {0},&reftables[64], &reftables[65]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[12], NULL, 9, 3, {0},&reftables[66], &reftables[67]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 23, &msgs[11], NULL, 22, 10, {0},&reftables[68], &reftables[69]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 1, &msgs[6], NULL, 7, 1, {0},&reftables[70], &reftables[71]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[4], NULL, 8, 2, {0},&reftables[72], &reftables[73]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[17], NULL, 7, 1, {0},&reftables[74], &reftables[75]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[20], NULL, 12, 4, {0},&reftables[76], &reftables[77]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[2], NULL, 4, 1, {0},&reftables[78], &reftables[79]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 4, 1, {0},&reftables[80], &reftables[81]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[9], (const upb_def*)(&msgs[3]), 14, 1, {0},&reftables[82], &reftables[83]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[3]), 19, 2, {0},&reftables[84], &reftables[85]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[7], NULL, 8, 2, {0},&reftables[86], &reftables[87]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[7]), 25, 4, {0},&reftables[88], &reftables[89]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[9], (const upb_def*)(&msgs[7]), 20, 3, {0},&reftables[90], &reftables[91]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 22, 3, {0},&reftables[92], &reftables[93]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[7]), 13, 0, {0},&reftables[94], &reftables[95]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[10], (const upb_def*)(&msgs[9]), 6, 0, {0},&reftables[96], &reftables[97]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[11], NULL, 15, 5, {0},&reftables[98], &reftables[99]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[20], NULL, 7, 1, {0},&reftables[100], &reftables[101]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[13], NULL, 8, 2, {0},&reftables[102], &reftables[103]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[21], NULL, 6, 1, {0},&reftables[104], &reftables[105]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[11], NULL, 21, 9, {0},&reftables[106], &reftables[107]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[11], NULL, 19, 7, {0},&reftables[108], &reftables[109]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[11], NULL, 14, 4, {0},&reftables[110], &reftables[111]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[11], NULL, 10, 2, {0},&reftables[112], &reftables[113]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[11], NULL, 7, 1, {0},&reftables[114], &reftables[115]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_string_check_utf8", 27, &msgs[11], NULL, 23, 11, {0},&reftables[116], &reftables[117]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "javanano_use_deprecated_package", 38, &msgs[11], NULL, 31, 15, {0},&reftables[118], &reftables[119]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "json_name", 10, &msgs[7], NULL, 21, 9, {0},&reftables[120], &reftables[121]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "jstype", 6, &msgs[8], (const upb_def*)(&enums[3]), 11, 5, {0},&reftables[122], &reftables[123]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[7], (const upb_def*)(&enums[0]), 12, 4, {0},&reftables[124], &reftables[125]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[8], NULL, 10, 4, {0},&reftables[126], &reftables[127]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[19], NULL, 9, 2, {0},&reftables[128], &reftables[129]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "leading_detached_comments", 6, &msgs[19], NULL, 17, 4, {0},&reftables[130], &reftables[131]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[18], (const upb_def*)(&msgs[19]), 6, 0, {0},&reftables[132], &reftables[133]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "map_entry", 7, &msgs[12], NULL, 10, 4, {0},&reftables[134], &reftables[135]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[12], NULL, 7, 1, {0},&reftables[136], &reftables[137]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]), 11, 0, {0},&reftables[138], &reftables[139]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]), 7, 0, {0},&reftables[140], &reftables[141]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]), 6, 0, {0},&reftables[142], &reftables[143]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 5, 1, {0},&reftables[144], &reftables[145]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 23, 6, {0},&reftables[146], &reftables[147]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 9, 2, {0},&reftables[148], &reftables[149]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL, 9, 2, {0},&reftables[150], &reftables[151]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 3, 0, {0},&reftables[152], &reftables[153]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 5, 1, {0},&reftables[154], &reftables[155]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL, 5, 1, {0},&reftables[156], &reftables[157]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 33, 8, {0},&reftables[158], &reftables[159]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL, 3, 0, {0},&reftables[160], &reftables[161]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL, 11, 3, {0},&reftables[162], &reftables[163]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 16, 1, {0},&reftables[164], &reftables[165]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL, 8, 2, {0},&reftables[166], &reftables[167]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 11, 3, {0},&reftables[168], &reftables[169]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 8, 2, {0},&reftables[170], &reftables[171]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL, 25, 13, {0},&reftables[172], &reftables[173]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]), 29, 6, {0},&reftables[174], &reftables[175]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL, 20, 8, {0},&reftables[176], &reftables[177]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]), 13, 3, {0},&reftables[178], &reftables[179]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 26, 5, {0},&reftables[180], &reftables[181]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 21, 4, {0},&reftables[182], &reftables[183]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 4, 0, {0},&reftables[184], &reftables[185]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 4, 0, {0},&reftables[186], &reftables[187]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 8, 1, {0},&reftables[188], &reftables[189]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 8, 1, {0},&reftables[190], &reftables[191]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 4, 0, {0},&reftables[192], &reftables[193]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL, 11, 3, {0},&reftables[194], &reftables[195]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL, 26, 7, {0},&reftables[196], &reftables[197]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL, 8, 2, {0},&reftables[198], &reftables[199]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL, 5, 0, {0},&reftables[200], &reftables[201]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_class_prefix", 40, &msgs[11], NULL, 32, 16, {0},&reftables[202], &reftables[203]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_namespace", 41, &msgs[11], NULL, 35, 17, {0},&reftables[204], &reftables[205]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 10, 2, {0},&reftables[206], &reftables[207]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 36, 9, {0},&reftables[208], &reftables[209]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 20, 8, {0},&reftables[210], &reftables[211]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 38, 9, {0},&reftables[212], &reftables[213]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 32, 7, {0},&reftables[214], &reftables[215]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 15, 5, {0},&reftables[216], &reftables[217]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 17, 2, {0},&reftables[218], &reftables[219]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 22, 5, {0},&reftables[220], &reftables[221]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 8, 1, {0},&reftables[222], &reftables[223]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 3, 0, {0},&reftables[224], &reftables[225]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 3, 0, {0},&reftables[226], &reftables[227]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 13, 5, {0},&reftables[228], &reftables[229]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 40, 11, {0},&reftables[230], &reftables[231]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 12, 3, {0},&reftables[232], &reftables[233]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 13, 5, {0},&reftables[234], &reftables[235]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 14, 6, {0},&reftables[236], &reftables[237]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[238], &reftables[239]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[240], &reftables[241]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[242], &reftables[243]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[244], &reftables[245]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[246], &reftables[247]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[248], &reftables[249]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[250], &reftables[251]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 7, 0, {0},&reftables[252], &reftables[253]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 12, 6, {0},&reftables[254], &reftables[255]), |
||||
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 39, 10, {0},&reftables[256], &reftables[257]), |
||||
}; |
||||
|
||||
static const upb_enumdef enums[5] = { |
||||
UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Label", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[188]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[154], 4, 3), 0, &reftables[258], &reftables[259]), |
||||
UPB_ENUMDEF_INIT("google.protobuf.FieldDescriptorProto.Type", UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_INT32, 5, &strentries[192]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[158], 19, 18), 0, &reftables[260], &reftables[261]), |
||||
UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.CType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[224]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[177], 3, 3), 0, &reftables[262], &reftables[263]), |
||||
UPB_ENUMDEF_INIT("google.protobuf.FieldOptions.JSType", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[228]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[180], 3, 3), 0, &reftables[264], &reftables[265]), |
||||
UPB_ENUMDEF_INIT("google.protobuf.FileOptions.OptimizeMode", UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_INT32, 2, &strentries[232]), UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_CSTR, 0, NULL, &arrays[183], 4, 3), 0, &reftables[266], &reftables[267]), |
||||
}; |
||||
|
||||
static const upb_tabent strentries[236] = { |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[22]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\015", "\000", "\000", "\000", "reserved_name"), UPB_TABVALUE_PTR_INIT(&fields[84]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "field"), UPB_TABVALUE_PTR_INIT(&fields[25]), &strentries[12]}, |
||||
{UPB_TABKEY_STR("\017", "\000", "\000", "\000", "extension_range"), UPB_TABVALUE_PTR_INIT(&fields[24]), &strentries[14]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "nested_type"), UPB_TABVALUE_PTR_INIT(&fields[60]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\016", "\000", "\000", "\000", "reserved_range"), UPB_TABVALUE_PTR_INIT(&fields[85]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[68]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "oneof_decl"), UPB_TABVALUE_PTR_INIT(&fields[65]), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), &strentries[13]}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[91]), NULL}, |
||||
{UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[18]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[90]), NULL}, |
||||
{UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[17]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[104]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[52]), &strentries[26]}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "allow_alias"), UPB_TABVALUE_PTR_INIT(&fields[1]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[63]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[50]), &strentries[34]}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "oneof_index"), UPB_TABVALUE_PTR_INIT(&fields[66]), NULL}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "label"), UPB_TABVALUE_PTR_INIT(&fields[40]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[56]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[62]), &strentries[53]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\010", "\000", "\000", "\000", "extendee"), UPB_TABVALUE_PTR_INIT(&fields[21]), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[96]), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "json_name"), UPB_TABVALUE_PTR_INIT(&fields[38]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[95]), &strentries[50]}, |
||||
{UPB_TABKEY_STR("\015", "\000", "\000", "\000", "default_value"), UPB_TABVALUE_PTR_INIT(&fields[7]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[105]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "packed"), UPB_TABVALUE_PTR_INIT(&fields[77]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "lazy"), UPB_TABVALUE_PTR_INIT(&fields[41]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "ctype"), UPB_TABVALUE_PTR_INIT(&fields[6]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "jstype"), UPB_TABVALUE_PTR_INIT(&fields[39]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[9]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[23]), NULL}, |
||||
{UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[106]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[87]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[88]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "syntax"), UPB_TABVALUE_PTR_INIT(&fields[93]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "dependency"), UPB_TABVALUE_PTR_INIT(&fields[8]), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "message_type"), UPB_TABVALUE_PTR_INIT(&fields[47]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "package"), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[69]), &strentries[86]}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[19]), NULL}, |
||||
{UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[82]), &strentries[85]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "file"), UPB_TABVALUE_PTR_INIT(&fields[26]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\023", "\000", "\000", "\000", "cc_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[3]), NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "csharp_namespace"), UPB_TABVALUE_PTR_INIT(&fields[5]), &strentries[116]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "go_package"), UPB_TABVALUE_PTR_INIT(&fields[27]), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "java_package"), UPB_TABVALUE_PTR_INIT(&fields[35]), &strentries[120]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "java_outer_classname"), UPB_TABVALUE_PTR_INIT(&fields[34]), NULL}, |
||||
{UPB_TABKEY_STR("\015", "\000", "\000", "\000", "php_namespace"), UPB_TABVALUE_PTR_INIT(&fields[80]), &strentries[113]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\023", "\000", "\000", "\000", "java_multiple_files"), UPB_TABVALUE_PTR_INIT(&fields[33]), &strentries[117]}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL}, |
||||
{UPB_TABKEY_STR("\025", "\000", "\000", "\000", "java_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[32]), &strentries[118]}, |
||||
{UPB_TABKEY_STR("\035", "\000", "\000", "\000", "java_generate_equals_and_hash"), UPB_TABVALUE_PTR_INIT(&fields[31]), NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "php_class_prefix"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL}, |
||||
{UPB_TABKEY_STR("\037", "\000", "\000", "\000", "javanano_use_deprecated_package"), UPB_TABVALUE_PTR_INIT(&fields[37]), &strentries[123]}, |
||||
{UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[83]), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "optimize_for"), UPB_TABVALUE_PTR_INIT(&fields[67]), NULL}, |
||||
{UPB_TABKEY_STR("\026", "\000", "\000", "\000", "java_string_check_utf8"), UPB_TABVALUE_PTR_INIT(&fields[36]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[12]), &strentries[119]}, |
||||
{UPB_TABKEY_STR("\021", "\000", "\000", "\000", "objc_class_prefix"), UPB_TABVALUE_PTR_INIT(&fields[64]), NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "cc_enable_arenas"), UPB_TABVALUE_PTR_INIT(&fields[2]), NULL}, |
||||
{UPB_TABKEY_STR("\027", "\000", "\000", "\000", "message_set_wire_format"), UPB_TABVALUE_PTR_INIT(&fields[46]), &strentries[128]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[11]), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "map_entry"), UPB_TABVALUE_PTR_INIT(&fields[45]), NULL}, |
||||
{UPB_TABKEY_STR("\037", "\000", "\000", "\000", "no_standard_descriptor_accessor"), UPB_TABVALUE_PTR_INIT(&fields[61]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "client_streaming"), UPB_TABVALUE_PTR_INIT(&fields[4]), NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "server_streaming"), UPB_TABVALUE_PTR_INIT(&fields[86]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "input_type"), UPB_TABVALUE_PTR_INIT(&fields[29]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "output_type"), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[54]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[72]), &strentries[150]}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "method"), UPB_TABVALUE_PTR_INIT(&fields[48]), NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[149]}, |
||||
{UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\010", "\000", "\000", "\000", "location"), UPB_TABVALUE_PTR_INIT(&fields[44]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[89]), &strentries[167]}, |
||||
{UPB_TABKEY_STR("\031", "\000", "\000", "\000", "leading_detached_comments"), UPB_TABVALUE_PTR_INIT(&fields[43]), &strentries[165]}, |
||||
{UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[94]), NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "leading_comments"), UPB_TABVALUE_PTR_INIT(&fields[42]), &strentries[164]}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "path"), UPB_TABVALUE_PTR_INIT(&fields[78]), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "double_value"), UPB_TABVALUE_PTR_INIT(&fields[16]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[49]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\022", "\000", "\000", "\000", "negative_int_value"), UPB_TABVALUE_PTR_INIT(&fields[59]), NULL}, |
||||
{UPB_TABKEY_STR("\017", "\000", "\000", "\000", "aggregate_value"), UPB_TABVALUE_PTR_INIT(&fields[0]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[81]), NULL}, |
||||
{UPB_TABKEY_STR("\020", "\000", "\000", "\000", "identifier_value"), UPB_TABVALUE_PTR_INIT(&fields[28]), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[92]), &strentries[182]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "is_extension"), UPB_TABVALUE_PTR_INIT(&fields[30]), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "name_part"), UPB_TABVALUE_PTR_INIT(&fields[58]), NULL}, |
||||
{UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REQUIRED"), UPB_TABVALUE_INT_INIT(2), &strentries[190]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REPEATED"), UPB_TABVALUE_INT_INIT(3), NULL}, |
||||
{UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_OPTIONAL"), UPB_TABVALUE_INT_INIT(1), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_FIXED64"), UPB_TABVALUE_INT_INIT(6), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_STRING"), UPB_TABVALUE_INT_INIT(9), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_FLOAT"), UPB_TABVALUE_INT_INIT(2), &strentries[221]}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_DOUBLE"), UPB_TABVALUE_INT_INIT(1), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT32"), UPB_TABVALUE_INT_INIT(5), NULL}, |
||||
{UPB_TABKEY_STR("\015", "\000", "\000", "\000", "TYPE_SFIXED32"), UPB_TABVALUE_INT_INIT(15), NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_FIXED32"), UPB_TABVALUE_INT_INIT(7), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_MESSAGE"), UPB_TABVALUE_INT_INIT(11), &strentries[222]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT64"), UPB_TABVALUE_INT_INIT(3), &strentries[219]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "TYPE_ENUM"), UPB_TABVALUE_INT_INIT(14), NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT32"), UPB_TABVALUE_INT_INIT(13), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT64"), UPB_TABVALUE_INT_INIT(4), &strentries[218]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\015", "\000", "\000", "\000", "TYPE_SFIXED64"), UPB_TABVALUE_INT_INIT(16), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_BYTES"), UPB_TABVALUE_INT_INIT(12), NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_SINT64"), UPB_TABVALUE_INT_INIT(18), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "TYPE_BOOL"), UPB_TABVALUE_INT_INIT(8), NULL}, |
||||
{UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_GROUP"), UPB_TABVALUE_INT_INIT(10), NULL}, |
||||
{UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_SINT32"), UPB_TABVALUE_INT_INIT(17), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\004", "\000", "\000", "\000", "CORD"), UPB_TABVALUE_INT_INIT(1), NULL}, |
||||
{UPB_TABKEY_STR("\006", "\000", "\000", "\000", "STRING"), UPB_TABVALUE_INT_INIT(0), &strentries[225]}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "STRING_PIECE"), UPB_TABVALUE_INT_INIT(2), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "JS_NORMAL"), UPB_TABVALUE_INT_INIT(0), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "JS_NUMBER"), UPB_TABVALUE_INT_INIT(2), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "JS_STRING"), UPB_TABVALUE_INT_INIT(1), NULL}, |
||||
{UPB_TABKEY_STR("\011", "\000", "\000", "\000", "CODE_SIZE"), UPB_TABVALUE_INT_INIT(2), NULL}, |
||||
{UPB_TABKEY_STR("\005", "\000", "\000", "\000", "SPEED"), UPB_TABVALUE_INT_INIT(1), &strentries[235]}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_STR("\014", "\000", "\000", "\000", "LITE_RUNTIME"), UPB_TABVALUE_INT_INIT(3), NULL}, |
||||
}; |
||||
|
||||
static const upb_tabent intentries[18] = { |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[103]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[102]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[101]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[99]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[97]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[100]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(33), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL}, |
||||
{UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL}, |
||||
{UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[98]), NULL}, |
||||
}; |
||||
|
||||
static const upb_tabval arrays[187] = { |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[57]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[25]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[60]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[20]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[24]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[22]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[68]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[65]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[85]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[84]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[91]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[18]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[90]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[17]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[52]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[104]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[73]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[1]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[14]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[50]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[63]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[74]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[13]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[56]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[21]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[62]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[40]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[95]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[96]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[7]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[70]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[66]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[38]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[6]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[77]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[9]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[41]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[39]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[105]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[51]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[76]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[8]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[47]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[19]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[87]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[23]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[69]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[88]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[82]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[106]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[93]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[26]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[35]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[34]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[67]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[33]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[27]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[3]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[32]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[83]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[31]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[12]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[36]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[2]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[64]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[5]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[37]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[79]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[80]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[46]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[61]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[11]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[45]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[55]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[29]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[75]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[71]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[4]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[86]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[54]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[53]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[48]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[72]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[44]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[78]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[89]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[42]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[94]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[43]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[49]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[28]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[81]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[59]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[16]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[92]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[0]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT(&fields[58]), |
||||
UPB_TABVALUE_PTR_INIT(&fields[30]), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT("LABEL_OPTIONAL"), |
||||
UPB_TABVALUE_PTR_INIT("LABEL_REQUIRED"), |
||||
UPB_TABVALUE_PTR_INIT("LABEL_REPEATED"), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT("TYPE_DOUBLE"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_FLOAT"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_INT64"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_UINT64"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_INT32"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_FIXED64"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_FIXED32"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_BOOL"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_STRING"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_GROUP"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_MESSAGE"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_BYTES"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_UINT32"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_ENUM"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_SFIXED32"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_SFIXED64"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_SINT32"), |
||||
UPB_TABVALUE_PTR_INIT("TYPE_SINT64"), |
||||
UPB_TABVALUE_PTR_INIT("STRING"), |
||||
UPB_TABVALUE_PTR_INIT("CORD"), |
||||
UPB_TABVALUE_PTR_INIT("STRING_PIECE"), |
||||
UPB_TABVALUE_PTR_INIT("JS_NORMAL"), |
||||
UPB_TABVALUE_PTR_INIT("JS_STRING"), |
||||
UPB_TABVALUE_PTR_INIT("JS_NUMBER"), |
||||
UPB_TABVALUE_EMPTY_INIT, |
||||
UPB_TABVALUE_PTR_INIT("SPEED"), |
||||
UPB_TABVALUE_PTR_INIT("CODE_SIZE"), |
||||
UPB_TABVALUE_PTR_INIT("LITE_RUNTIME"), |
||||
}; |
||||
|
||||
#ifdef UPB_DEBUG_REFS |
||||
static upb_inttable reftables[268] = { |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
UPB_EMPTY_INTTABLE_INIT(UPB_CTYPE_PTR), |
||||
}; |
||||
#endif |
||||
|
||||
static const upb_msgdef *refm(const upb_msgdef *m, const void *owner) { |
||||
upb_msgdef_ref(m, owner); |
||||
return m; |
||||
} |
||||
|
||||
static const upb_enumdef *refe(const upb_enumdef *e, const void *owner) { |
||||
upb_enumdef_ref(e, owner); |
||||
return e; |
||||
} |
||||
|
||||
/* Public API. */ |
||||
const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_get(const void *owner) { return refm(&msgs[0], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_get(const void *owner) { return refm(&msgs[1], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_get(const void *owner) { return refm(&msgs[2], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto_get(const void *owner) { return refm(&msgs[3], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_EnumOptions_get(const void *owner) { return refm(&msgs[4], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto_get(const void *owner) { return refm(&msgs[5], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions_get(const void *owner) { return refm(&msgs[6], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto_get(const void *owner) { return refm(&msgs[7], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_FieldOptions_get(const void *owner) { return refm(&msgs[8], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto_get(const void *owner) { return refm(&msgs[9], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet_get(const void *owner) { return refm(&msgs[10], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_FileOptions_get(const void *owner) { return refm(&msgs[11], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_MessageOptions_get(const void *owner) { return refm(&msgs[12], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto_get(const void *owner) { return refm(&msgs[13], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_MethodOptions_get(const void *owner) { return refm(&msgs[14], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_OneofDescriptorProto_get(const void *owner) { return refm(&msgs[15], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto_get(const void *owner) { return refm(&msgs[16], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_ServiceOptions_get(const void *owner) { return refm(&msgs[17], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_get(const void *owner) { return refm(&msgs[18], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location_get(const void *owner) { return refm(&msgs[19], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_get(const void *owner) { return refm(&msgs[20], owner); } |
||||
const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePart_get(const void *owner) { return refm(&msgs[21], owner); } |
||||
|
||||
const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label_get(const void *owner) { return refe(&enums[0], owner); } |
||||
const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type_get(const void *owner) { return refe(&enums[1], owner); } |
||||
const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType_get(const void *owner) { return refe(&enums[2], owner); } |
||||
const upb_enumdef *upbdefs_google_protobuf_FieldOptions_JSType_get(const void *owner) { return refe(&enums[3], owner); } |
||||
const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode_get(const void *owner) { return refe(&enums[4], owner); } |
@ -1,901 +0,0 @@ |
||||
/*
|
||||
** XXX: The routines in this file that consume a string do not currently |
||||
** support having the string span buffers. In the future, as upb_sink and |
||||
** its buffering/sharing functionality evolve there should be an easy and |
||||
** idiomatic way of correctly handling this case. For now, we accept this |
||||
** limitation since we currently only parse descriptors from single strings. |
||||
*/ |
||||
|
||||
#include "upb/descriptor/reader.h" |
||||
|
||||
#include <errno.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include "upb/def.h" |
||||
#include "upb/sink.h" |
||||
#include "upb/descriptor/descriptor.upbdefs.h" |
||||
|
||||
/* Compares a NULL-terminated string with a non-NULL-terminated string. */ |
||||
static bool upb_streq(const char *str, const char *buf, size_t n) { |
||||
return strlen(str) == n && memcmp(str, buf, n) == 0; |
||||
} |
||||
|
||||
/* We keep a stack of all the messages scopes we are currently in, as well as
|
||||
* the top-level file scope. This is necessary to correctly qualify the |
||||
* definitions that are contained inside. "name" tracks the name of the |
||||
* message or package (a bare name -- not qualified by any enclosing scopes). */ |
||||
typedef struct { |
||||
char *name; |
||||
/* Index of the first def that is under this scope. For msgdefs, the
|
||||
* msgdef itself is at start-1. */ |
||||
int start; |
||||
uint32_t oneof_start; |
||||
uint32_t oneof_index; |
||||
} upb_descreader_frame; |
||||
|
||||
/* The maximum number of nested declarations that are allowed, ie.
|
||||
* message Foo { |
||||
* message Bar { |
||||
* message Baz { |
||||
* } |
||||
* } |
||||
* } |
||||
* |
||||
* This is a resource limit that affects how big our runtime stack can grow. |
||||
* TODO: make this a runtime-settable property of the Reader instance. */ |
||||
#define UPB_MAX_MESSAGE_NESTING 64 |
||||
|
||||
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; |
||||
upb_inttable oneofs; |
||||
|
||||
uint32_t number; |
||||
char *name; |
||||
bool saw_number; |
||||
bool saw_name; |
||||
|
||||
char *default_string; |
||||
|
||||
upb_fielddef *f; |
||||
}; |
||||
|
||||
static char *upb_gstrndup(const char *buf, size_t n) { |
||||
char *ret = upb_gmalloc(n + 1); |
||||
if (!ret) return NULL; |
||||
memcpy(ret, buf, n); |
||||
ret[n] = '\0'; |
||||
return ret; |
||||
} |
||||
|
||||
/* Returns a newly allocated string that joins input strings together, for
|
||||
* example: |
||||
* join("Foo.Bar", "Baz") -> "Foo.Bar.Baz" |
||||
* join("", "Baz") -> "Baz" |
||||
* Caller owns a ref on the returned string. */ |
||||
static char *upb_join(const char *base, const char *name) { |
||||
if (!base || strlen(base) == 0) { |
||||
return upb_gstrdup(name); |
||||
} else { |
||||
char *ret = upb_gmalloc(strlen(base) + strlen(name) + 2); |
||||
if (!ret) { |
||||
return NULL; |
||||
} |
||||
ret[0] = '\0'; |
||||
strcat(ret, base); |
||||
strcat(ret, "."); |
||||
strcat(ret, name); |
||||
return ret; |
||||
} |
||||
} |
||||
|
||||
/* Qualify the defname for all defs starting with offset "start" with "str". */ |
||||
static bool upb_descreader_qualify(upb_filedef *f, char *str, int32_t start) { |
||||
size_t i; |
||||
for (i = start; i < upb_filedef_defcount(f); i++) { |
||||
upb_def *def = upb_filedef_mutabledef(f, i); |
||||
char *name = upb_join(str, upb_def_fullname(def)); |
||||
if (!name) { |
||||
/* Need better logic here; at this point we've qualified some names but
|
||||
* not others. */ |
||||
return false; |
||||
} |
||||
upb_def_setfullname(def, name, NULL); |
||||
upb_gfree(name); |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
|
||||
/* upb_descreader ************************************************************/ |
||||
|
||||
static upb_msgdef *upb_descreader_top(upb_descreader *r) { |
||||
int index; |
||||
UPB_ASSERT(r->stack_len > 1); |
||||
index = r->stack[r->stack_len-1].start - 1; |
||||
UPB_ASSERT(index >= 0); |
||||
return upb_downcast_msgdef_mutable(upb_filedef_mutabledef(r->file, index)); |
||||
} |
||||
|
||||
static upb_def *upb_descreader_last(upb_descreader *r) { |
||||
return upb_filedef_mutabledef(r->file, upb_filedef_defcount(r->file) - 1); |
||||
} |
||||
|
||||
/* Start/end handlers for FileDescriptorProto and DescriptorProto (the two
|
||||
* entities that have names and can contain sub-definitions. */ |
||||
void upb_descreader_startcontainer(upb_descreader *r) { |
||||
upb_descreader_frame *f = &r->stack[r->stack_len++]; |
||||
f->start = upb_filedef_defcount(r->file); |
||||
f->oneof_start = upb_inttable_count(&r->oneofs); |
||||
f->oneof_index = 0; |
||||
f->name = NULL; |
||||
} |
||||
|
||||
bool upb_descreader_endcontainer(upb_descreader *r) { |
||||
upb_descreader_frame *f = &r->stack[r->stack_len - 1]; |
||||
|
||||
while (upb_inttable_count(&r->oneofs) > f->oneof_start) { |
||||
upb_oneofdef *o = upb_value_getptr(upb_inttable_pop(&r->oneofs)); |
||||
bool ok = upb_msgdef_addoneof(upb_descreader_top(r), o, &r->oneofs, NULL); |
||||
UPB_ASSERT(ok); |
||||
} |
||||
|
||||
if (!upb_descreader_qualify(r->file, f->name, f->start)) { |
||||
return false; |
||||
} |
||||
upb_gfree(f->name); |
||||
f->name = NULL; |
||||
|
||||
r->stack_len--; |
||||
return true; |
||||
} |
||||
|
||||
void upb_descreader_setscopename(upb_descreader *r, char *str) { |
||||
upb_descreader_frame *f = &r->stack[r->stack_len-1]; |
||||
upb_gfree(f->name); |
||||
f->name = str; |
||||
} |
||||
|
||||
static upb_oneofdef *upb_descreader_getoneof(upb_descreader *r, |
||||
uint32_t index) { |
||||
bool found; |
||||
upb_value val; |
||||
upb_descreader_frame *f = &r->stack[r->stack_len-1]; |
||||
|
||||
/* DescriptorProto messages can be nested, so we will see the nested messages
|
||||
* between when we see the FieldDescriptorProto and the OneofDescriptorProto. |
||||
* We need to preserve the oneofs in between these two things. */ |
||||
index += f->oneof_start; |
||||
|
||||
while (upb_inttable_count(&r->oneofs) <= index) { |
||||
upb_inttable_push(&r->oneofs, upb_value_ptr(upb_oneofdef_new(&r->oneofs))); |
||||
} |
||||
|
||||
found = upb_inttable_lookup(&r->oneofs, index, &val); |
||||
UPB_ASSERT(found); |
||||
return upb_value_getptr(val); |
||||
} |
||||
|
||||
/** Handlers for google.protobuf.FileDescriptorSet. ***************************/ |
||||
|
||||
static void *fileset_startfile(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
r->file = upb_filedef_new(&r->files); |
||||
upb_inttable_push(&r->files, upb_value_ptr(r->file)); |
||||
return r; |
||||
} |
||||
|
||||
/** Handlers for google.protobuf.FileDescriptorProto. *************************/ |
||||
|
||||
static bool file_start(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
upb_descreader_startcontainer(r); |
||||
return true; |
||||
} |
||||
|
||||
static bool file_end(void *closure, const void *hd, upb_status *status) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(status); |
||||
return upb_descreader_endcontainer(r); |
||||
} |
||||
|
||||
static size_t file_onname(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *name; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
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); |
||||
UPB_ASSERT(ok); |
||||
return n; |
||||
} |
||||
|
||||
static size_t file_onpackage(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *package; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
package = upb_gstrndup(buf, n); |
||||
/* XXX: see comment at the top of the file. */ |
||||
upb_descreader_setscopename(r, package); |
||||
ok = upb_filedef_setpackage(r->file, package, NULL); |
||||
UPB_ASSERT(ok); |
||||
return n; |
||||
} |
||||
|
||||
static void *file_startphpnamespace(void *closure, const void *hd, |
||||
size_t size_hint) { |
||||
upb_descreader *r = closure; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(size_hint); |
||||
|
||||
ok = upb_filedef_setphpnamespace(r->file, "", NULL); |
||||
UPB_ASSERT(ok); |
||||
return closure; |
||||
} |
||||
|
||||
static size_t file_onphpnamespace(void *closure, const void *hd, |
||||
const char *buf, size_t n, |
||||
const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *php_namespace; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
php_namespace = upb_gstrndup(buf, n); |
||||
ok = upb_filedef_setphpnamespace(r->file, php_namespace, NULL); |
||||
upb_gfree(php_namespace); |
||||
UPB_ASSERT(ok); |
||||
return n; |
||||
} |
||||
|
||||
static size_t file_onphpprefix(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *prefix; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
prefix = upb_gstrndup(buf, n); |
||||
ok = upb_filedef_setphpprefix(r->file, prefix, NULL); |
||||
upb_gfree(prefix); |
||||
UPB_ASSERT(ok); |
||||
return n; |
||||
} |
||||
|
||||
static size_t file_onsyntax(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
/* XXX: see comment at the top of the file. */ |
||||
if (upb_streq("proto2", buf, n)) { |
||||
ok = upb_filedef_setsyntax(r->file, UPB_SYNTAX_PROTO2, NULL); |
||||
} else if (upb_streq("proto3", buf, n)) { |
||||
ok = upb_filedef_setsyntax(r->file, UPB_SYNTAX_PROTO3, NULL); |
||||
} else { |
||||
ok = false; |
||||
} |
||||
|
||||
UPB_ASSERT(ok); |
||||
return n; |
||||
} |
||||
|
||||
static void *file_startmsg(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
upb_msgdef *m = upb_msgdef_new(&m); |
||||
bool ok = upb_filedef_addmsg(r->file, m, &m, NULL); |
||||
UPB_UNUSED(hd); |
||||
UPB_ASSERT(ok); |
||||
return r; |
||||
} |
||||
|
||||
static void *file_startenum(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
upb_enumdef *e = upb_enumdef_new(&e); |
||||
bool ok = upb_filedef_addenum(r->file, e, &e, NULL); |
||||
UPB_UNUSED(hd); |
||||
UPB_ASSERT(ok); |
||||
return r; |
||||
} |
||||
|
||||
static void *file_startext(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
bool ok; |
||||
r->f = upb_fielddef_new(r); |
||||
ok = upb_filedef_addext(r->file, r->f, r, NULL); |
||||
UPB_UNUSED(hd); |
||||
UPB_ASSERT(ok); |
||||
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) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
r->saw_number = false; |
||||
r->saw_name = false; |
||||
return true; |
||||
} |
||||
|
||||
static size_t enumval_onname(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
/* XXX: see comment at the top of the file. */ |
||||
upb_gfree(r->name); |
||||
r->name = upb_gstrndup(buf, n); |
||||
r->saw_name = true; |
||||
return n; |
||||
} |
||||
|
||||
static bool enumval_onnumber(void *closure, const void *hd, int32_t val) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
r->number = val; |
||||
r->saw_number = true; |
||||
return true; |
||||
} |
||||
|
||||
static bool enumval_endmsg(void *closure, const void *hd, upb_status *status) { |
||||
upb_descreader *r = closure; |
||||
upb_enumdef *e; |
||||
UPB_UNUSED(hd); |
||||
|
||||
if(!r->saw_number || !r->saw_name) { |
||||
upb_status_seterrmsg(status, "Enum value missing name or number."); |
||||
return false; |
||||
} |
||||
e = upb_downcast_enumdef_mutable(upb_descreader_last(r)); |
||||
upb_enumdef_addval(e, r->name, r->number, status); |
||||
upb_gfree(r->name); |
||||
r->name = NULL; |
||||
return true; |
||||
} |
||||
|
||||
/** Handlers for google.protobuf.EnumDescriptorProto. *************************/ |
||||
|
||||
static bool enum_endmsg(void *closure, const void *hd, upb_status *status) { |
||||
upb_descreader *r = closure; |
||||
upb_enumdef *e; |
||||
UPB_UNUSED(hd); |
||||
|
||||
e = upb_downcast_enumdef_mutable(upb_descreader_last(r)); |
||||
if (upb_def_fullname(upb_descreader_last(r)) == NULL) { |
||||
upb_status_seterrmsg(status, "Enum had no name."); |
||||
return false; |
||||
} |
||||
if (upb_enumdef_numvals(e) == 0) { |
||||
upb_status_seterrmsg(status, "Enum had no values."); |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
static size_t enum_onname(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *fullname = upb_gstrndup(buf, n); |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
/* XXX: see comment at the top of the file. */ |
||||
upb_def_setfullname(upb_descreader_last(r), fullname, NULL); |
||||
upb_gfree(fullname); |
||||
return n; |
||||
} |
||||
|
||||
/** Handlers for google.protobuf.FieldDescriptorProto *************************/ |
||||
|
||||
static bool field_startmsg(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
UPB_ASSERT(r->f); |
||||
upb_gfree(r->default_string); |
||||
r->default_string = NULL; |
||||
|
||||
/* fielddefs default to packed, but descriptors default to non-packed. */ |
||||
upb_fielddef_setpacked(r->f, false); |
||||
return true; |
||||
} |
||||
|
||||
/* Converts the default value in string "str" into "d". Passes a ref on str.
|
||||
* Returns true on success. */ |
||||
static bool parse_default(char *str, upb_fielddef *f) { |
||||
bool success = true; |
||||
char *end; |
||||
switch (upb_fielddef_type(f)) { |
||||
case UPB_TYPE_INT32: { |
||||
long val = strtol(str, &end, 0); |
||||
if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || *end) |
||||
success = false; |
||||
else |
||||
upb_fielddef_setdefaultint32(f, val); |
||||
break; |
||||
} |
||||
case UPB_TYPE_INT64: { |
||||
/* XXX: Need to write our own strtoll, since it's not available in c89. */ |
||||
long long val = strtol(str, &end, 0); |
||||
if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || *end) |
||||
success = false; |
||||
else |
||||
upb_fielddef_setdefaultint64(f, val); |
||||
break; |
||||
} |
||||
case UPB_TYPE_UINT32: { |
||||
unsigned long val = strtoul(str, &end, 0); |
||||
if (val > UINT32_MAX || errno == ERANGE || *end) |
||||
success = false; |
||||
else |
||||
upb_fielddef_setdefaultuint32(f, val); |
||||
break; |
||||
} |
||||
case UPB_TYPE_UINT64: { |
||||
/* XXX: Need to write our own strtoull, since it's not available in c89. */ |
||||
unsigned long long val = strtoul(str, &end, 0); |
||||
if (val > UINT64_MAX || errno == ERANGE || *end) |
||||
success = false; |
||||
else |
||||
upb_fielddef_setdefaultuint64(f, val); |
||||
break; |
||||
} |
||||
case UPB_TYPE_DOUBLE: { |
||||
double val = strtod(str, &end); |
||||
if (errno == ERANGE || *end) |
||||
success = false; |
||||
else |
||||
upb_fielddef_setdefaultdouble(f, val); |
||||
break; |
||||
} |
||||
case UPB_TYPE_FLOAT: { |
||||
/* XXX: Need to write our own strtof, since it's not available in c89. */ |
||||
float val = strtod(str, &end); |
||||
if (errno == ERANGE || *end) |
||||
success = false; |
||||
else |
||||
upb_fielddef_setdefaultfloat(f, val); |
||||
break; |
||||
} |
||||
case UPB_TYPE_BOOL: { |
||||
if (strcmp(str, "false") == 0) |
||||
upb_fielddef_setdefaultbool(f, false); |
||||
else if (strcmp(str, "true") == 0) |
||||
upb_fielddef_setdefaultbool(f, true); |
||||
else |
||||
success = false; |
||||
break; |
||||
} |
||||
default: abort(); |
||||
} |
||||
return success; |
||||
} |
||||
|
||||
static bool field_endmsg(void *closure, const void *hd, upb_status *status) { |
||||
upb_descreader *r = closure; |
||||
upb_fielddef *f = r->f; |
||||
UPB_UNUSED(hd); |
||||
|
||||
/* TODO: verify that all required fields were present. */ |
||||
UPB_ASSERT(upb_fielddef_number(f) != 0); |
||||
UPB_ASSERT(upb_fielddef_name(f) != NULL); |
||||
UPB_ASSERT((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f)); |
||||
|
||||
if (r->default_string) { |
||||
if (upb_fielddef_issubmsg(f)) { |
||||
upb_status_seterrmsg(status, "Submessages cannot have defaults."); |
||||
return false; |
||||
} |
||||
if (upb_fielddef_isstring(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM) { |
||||
upb_fielddef_setdefaultcstr(f, r->default_string, NULL); |
||||
} else { |
||||
if (r->default_string && !parse_default(r->default_string, f)) { |
||||
/* We don't worry too much about giving a great error message since the
|
||||
* compiler should have ensured this was correct. */ |
||||
upb_status_seterrmsg(status, "Error converting default value."); |
||||
return false; |
||||
} |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
static bool field_onlazy(void *closure, const void *hd, bool val) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
|
||||
upb_fielddef_setlazy(r->f, val); |
||||
return true; |
||||
} |
||||
|
||||
static bool field_onpacked(void *closure, const void *hd, bool val) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
|
||||
upb_fielddef_setpacked(r->f, val); |
||||
return true; |
||||
} |
||||
|
||||
static bool field_ontype(void *closure, const void *hd, int32_t val) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
|
||||
upb_fielddef_setdescriptortype(r->f, val); |
||||
return true; |
||||
} |
||||
|
||||
static bool field_onlabel(void *closure, const void *hd, int32_t val) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
|
||||
upb_fielddef_setlabel(r->f, val); |
||||
return true; |
||||
} |
||||
|
||||
static bool field_onnumber(void *closure, const void *hd, int32_t val) { |
||||
upb_descreader *r = closure; |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
|
||||
ok = upb_fielddef_setnumber(r->f, val, NULL); |
||||
UPB_ASSERT(ok); |
||||
return true; |
||||
} |
||||
|
||||
static size_t field_onname(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *name = upb_gstrndup(buf, n); |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
/* XXX: see comment at the top of the file. */ |
||||
upb_fielddef_setname(r->f, name, NULL); |
||||
upb_gfree(name); |
||||
return n; |
||||
} |
||||
|
||||
static size_t field_ontypename(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *name = upb_gstrndup(buf, n); |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
/* XXX: see comment at the top of the file. */ |
||||
upb_fielddef_setsubdefname(r->f, name, NULL); |
||||
upb_gfree(name); |
||||
return n; |
||||
} |
||||
|
||||
static size_t field_onextendee(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
char *name = upb_gstrndup(buf, n); |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
/* XXX: see comment at the top of the file. */ |
||||
upb_fielddef_setcontainingtypename(r->f, name, NULL); |
||||
upb_gfree(name); |
||||
return n; |
||||
} |
||||
|
||||
static size_t field_ondefaultval(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
/* Have to convert from string to the correct type, but we might not know the
|
||||
* type yet, so we save it as a string until the end of the field. |
||||
* XXX: see comment at the top of the file. */ |
||||
upb_gfree(r->default_string); |
||||
r->default_string = upb_gstrndup(buf, n); |
||||
return n; |
||||
} |
||||
|
||||
static bool field_ononeofindex(void *closure, const void *hd, int32_t index) { |
||||
upb_descreader *r = closure; |
||||
upb_oneofdef *o = upb_descreader_getoneof(r, index); |
||||
bool ok = upb_oneofdef_addfield(o, r->f, &r->f, NULL); |
||||
UPB_UNUSED(hd); |
||||
|
||||
UPB_ASSERT(ok); |
||||
return true; |
||||
} |
||||
|
||||
/** Handlers for google.protobuf.OneofDescriptorProto. ************************/ |
||||
|
||||
static size_t oneof_name(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
upb_descreader_frame *f = &r->stack[r->stack_len-1]; |
||||
upb_oneofdef *o = upb_descreader_getoneof(r, f->oneof_index++); |
||||
char *name_null_terminated = upb_gstrndup(buf, n); |
||||
bool ok = upb_oneofdef_setname(o, name_null_terminated, NULL); |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
UPB_ASSERT(ok); |
||||
free(name_null_terminated); |
||||
return n; |
||||
} |
||||
|
||||
/** Handlers for google.protobuf.DescriptorProto ******************************/ |
||||
|
||||
static bool msg_start(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
UPB_UNUSED(hd); |
||||
|
||||
upb_descreader_startcontainer(r); |
||||
return true; |
||||
} |
||||
|
||||
static bool msg_end(void *closure, const void *hd, upb_status *status) { |
||||
upb_descreader *r = closure; |
||||
upb_msgdef *m = upb_descreader_top(r); |
||||
UPB_UNUSED(hd); |
||||
|
||||
if(!upb_def_fullname(upb_msgdef_upcast_mutable(m))) { |
||||
upb_status_seterrmsg(status, "Encountered message with no name."); |
||||
return false; |
||||
} |
||||
return upb_descreader_endcontainer(r); |
||||
} |
||||
|
||||
static size_t msg_name(void *closure, const void *hd, const char *buf, |
||||
size_t n, const upb_bufhandle *handle) { |
||||
upb_descreader *r = closure; |
||||
upb_msgdef *m = upb_descreader_top(r); |
||||
/* XXX: see comment at the top of the file. */ |
||||
char *name = upb_gstrndup(buf, n); |
||||
UPB_UNUSED(hd); |
||||
UPB_UNUSED(handle); |
||||
|
||||
upb_def_setfullname(upb_msgdef_upcast_mutable(m), name, NULL); |
||||
upb_descreader_setscopename(r, name); /* Passes ownership of name. */ |
||||
|
||||
return n; |
||||
} |
||||
|
||||
static void *msg_startmsg(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
upb_msgdef *m = upb_msgdef_new(&m); |
||||
bool ok = upb_filedef_addmsg(r->file, m, &m, NULL); |
||||
UPB_UNUSED(hd); |
||||
UPB_ASSERT(ok); |
||||
return r; |
||||
} |
||||
|
||||
static void *msg_startext(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
upb_fielddef *f = upb_fielddef_new(&f); |
||||
bool ok = upb_filedef_addext(r->file, f, &f, NULL); |
||||
UPB_UNUSED(hd); |
||||
UPB_ASSERT(ok); |
||||
return r; |
||||
} |
||||
|
||||
static void *msg_startfield(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
r->f = upb_fielddef_new(&r->f); |
||||
/* We can't add the new field to the message until its name/number are
|
||||
* filled in. */ |
||||
UPB_UNUSED(hd); |
||||
return r; |
||||
} |
||||
|
||||
static bool msg_endfield(void *closure, const void *hd) { |
||||
upb_descreader *r = closure; |
||||
upb_msgdef *m = upb_descreader_top(r); |
||||
bool ok; |
||||
UPB_UNUSED(hd); |
||||
|
||||
/* Oneof fields are added to the msgdef through their oneof, so don't need to
|
||||
* be added here. */ |
||||
if (upb_fielddef_containingoneof(r->f) == NULL) { |
||||
ok = upb_msgdef_addfield(m, r->f, &r->f, NULL); |
||||
UPB_ASSERT(ok); |
||||
} |
||||
r->f = NULL; |
||||
return true; |
||||
} |
||||
|
||||
static bool msg_onmapentry(void *closure, const void *hd, bool mapentry) { |
||||
upb_descreader *r = closure; |
||||
upb_msgdef *m = upb_descreader_top(r); |
||||
UPB_UNUSED(hd); |
||||
|
||||
upb_msgdef_setmapentry(m, mapentry); |
||||
r->f = NULL; |
||||
return true; |
||||
} |
||||
|
||||
|
||||
|
||||
/** Code to register handlers *************************************************/ |
||||
|
||||
#define F(msg, field) upbdefs_google_protobuf_ ## msg ## _f_ ## field(m) |
||||
|
||||
static void reghandlers(const void *closure, upb_handlers *h) { |
||||
const upb_msgdef *m = upb_handlers_msgdef(h); |
||||
UPB_UNUSED(closure); |
||||
|
||||
if (upbdefs_google_protobuf_FileDescriptorSet_is(m)) { |
||||
upb_handlers_setstartsubmsg(h, F(FileDescriptorSet, file), |
||||
&fileset_startfile, NULL); |
||||
} else if (upbdefs_google_protobuf_DescriptorProto_is(m)) { |
||||
upb_handlers_setstartmsg(h, &msg_start, NULL); |
||||
upb_handlers_setendmsg(h, &msg_end, NULL); |
||||
upb_handlers_setstring(h, F(DescriptorProto, name), &msg_name, NULL); |
||||
upb_handlers_setstartsubmsg(h, F(DescriptorProto, extension), &msg_startext, |
||||
NULL); |
||||
upb_handlers_setstartsubmsg(h, F(DescriptorProto, nested_type), |
||||
&msg_startmsg, NULL); |
||||
upb_handlers_setstartsubmsg(h, F(DescriptorProto, field), |
||||
&msg_startfield, NULL); |
||||
upb_handlers_setendsubmsg(h, F(DescriptorProto, field), |
||||
&msg_endfield, NULL); |
||||
upb_handlers_setstartsubmsg(h, F(DescriptorProto, enum_type), |
||||
&file_startenum, NULL); |
||||
} else if (upbdefs_google_protobuf_FileDescriptorProto_is(m)) { |
||||
upb_handlers_setstartmsg(h, &file_start, NULL); |
||||
upb_handlers_setendmsg(h, &file_end, NULL); |
||||
upb_handlers_setstring(h, F(FileDescriptorProto, name), &file_onname, |
||||
NULL); |
||||
upb_handlers_setstring(h, F(FileDescriptorProto, package), &file_onpackage, |
||||
NULL); |
||||
upb_handlers_setstring(h, F(FileDescriptorProto, syntax), &file_onsyntax, |
||||
NULL); |
||||
upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, message_type), |
||||
&file_startmsg, NULL); |
||||
upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, enum_type), |
||||
&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); |
||||
upb_handlers_setstring(h, F(EnumValueDescriptorProto, name), &enumval_onname, NULL); |
||||
upb_handlers_setint32(h, F(EnumValueDescriptorProto, number), &enumval_onnumber, |
||||
NULL); |
||||
} else if (upbdefs_google_protobuf_EnumDescriptorProto_is(m)) { |
||||
upb_handlers_setendmsg(h, &enum_endmsg, NULL); |
||||
upb_handlers_setstring(h, F(EnumDescriptorProto, name), &enum_onname, NULL); |
||||
} else if (upbdefs_google_protobuf_FieldDescriptorProto_is(m)) { |
||||
upb_handlers_setstartmsg(h, &field_startmsg, NULL); |
||||
upb_handlers_setendmsg(h, &field_endmsg, NULL); |
||||
upb_handlers_setint32(h, F(FieldDescriptorProto, type), &field_ontype, |
||||
NULL); |
||||
upb_handlers_setint32(h, F(FieldDescriptorProto, label), &field_onlabel, |
||||
NULL); |
||||
upb_handlers_setint32(h, F(FieldDescriptorProto, number), &field_onnumber, |
||||
NULL); |
||||
upb_handlers_setstring(h, F(FieldDescriptorProto, name), &field_onname, |
||||
NULL); |
||||
upb_handlers_setstring(h, F(FieldDescriptorProto, type_name), |
||||
&field_ontypename, NULL); |
||||
upb_handlers_setstring(h, F(FieldDescriptorProto, extendee), |
||||
&field_onextendee, NULL); |
||||
upb_handlers_setstring(h, F(FieldDescriptorProto, default_value), |
||||
&field_ondefaultval, NULL); |
||||
upb_handlers_setint32(h, F(FieldDescriptorProto, oneof_index), |
||||
&field_ononeofindex, NULL); |
||||
} else if (upbdefs_google_protobuf_OneofDescriptorProto_is(m)) { |
||||
upb_handlers_setstring(h, F(OneofDescriptorProto, name), &oneof_name, NULL); |
||||
} else if (upbdefs_google_protobuf_FieldOptions_is(m)) { |
||||
upb_handlers_setbool(h, F(FieldOptions, lazy), &field_onlazy, NULL); |
||||
upb_handlers_setbool(h, F(FieldOptions, packed), &field_onpacked, NULL); |
||||
} else if (upbdefs_google_protobuf_MessageOptions_is(m)) { |
||||
upb_handlers_setbool(h, F(MessageOptions, map_entry), &msg_onmapentry, NULL); |
||||
} else if (upbdefs_google_protobuf_FileOptions_is(m)) { |
||||
upb_handlers_setstring(h, F(FileOptions, php_class_prefix), |
||||
&file_onphpprefix, NULL); |
||||
upb_handlers_setstartstr(h, F(FileOptions, php_namespace), |
||||
&file_startphpnamespace, NULL); |
||||
upb_handlers_setstring(h, F(FileOptions, php_namespace), |
||||
&file_onphpnamespace, NULL); |
||||
} |
||||
|
||||
UPB_ASSERT(upb_ok(upb_handlers_status(h))); |
||||
} |
||||
|
||||
#undef F |
||||
|
||||
void descreader_cleanup(void *_r) { |
||||
upb_descreader *r = _r; |
||||
size_t i; |
||||
|
||||
for (i = 0; i < upb_descreader_filecount(r); i++) { |
||||
upb_filedef_unref(upb_descreader_file(r, i), &r->files); |
||||
} |
||||
|
||||
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) { |
||||
upb_descreader_frame *f = &r->stack[--r->stack_len]; |
||||
upb_gfree(f->name); |
||||
} |
||||
} |
||||
|
||||
|
||||
/* Public API ****************************************************************/ |
||||
|
||||
upb_descreader *upb_descreader_create(upb_env *e, const upb_handlers *h) { |
||||
upb_descreader *r = upb_env_malloc(e, sizeof(upb_descreader)); |
||||
if (!r || !upb_env_addcleanup(e, descreader_cleanup, r)) { |
||||
return NULL; |
||||
} |
||||
|
||||
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; |
||||
r->name = NULL; |
||||
r->default_string = NULL; |
||||
|
||||
return r; |
||||
} |
||||
|
||||
size_t upb_descreader_filecount(const upb_descreader *r) { |
||||
return upb_inttable_count(&r->files); |
||||
} |
||||
|
||||
upb_filedef *upb_descreader_file(const upb_descreader *r, size_t i) { |
||||
upb_value v; |
||||
if (upb_inttable_lookup(&r->files, i, &v)) { |
||||
return upb_value_getptr(v); |
||||
} else { |
||||
return NULL; |
||||
} |
||||
} |
||||
|
||||
upb_sink *upb_descreader_input(upb_descreader *r) { |
||||
return &r->sink; |
||||
} |
||||
|
||||
const upb_handlers *upb_descreader_newhandlers(const void *owner) { |
||||
const upb_msgdef *m = upbdefs_google_protobuf_FileDescriptorSet_get(&m); |
||||
const upb_handlers *h = upb_handlers_newfrozen(m, owner, reghandlers, NULL); |
||||
upb_msgdef_unref(m, &m); |
||||
return h; |
||||
} |
@ -0,0 +1,540 @@ |
||||
|
||||
#include <unordered_map> |
||||
#include <unordered_set> |
||||
#include <memory> |
||||
|
||||
#include "absl/strings/ascii.h" |
||||
#include "absl/strings/str_replace.h" |
||||
#include "absl/strings/substitute.h" |
||||
#include "google/protobuf/compiler/code_generator.h" |
||||
#include "google/protobuf/descriptor.h" |
||||
#include "google/protobuf/io/zero_copy_stream.h" |
||||
|
||||
#include "upbc/generator.h" |
||||
#include "upbc/message_layout.h" |
||||
|
||||
namespace protoc = ::google::protobuf::compiler; |
||||
namespace protobuf = ::google::protobuf; |
||||
|
||||
static std::string StripExtension(absl::string_view fname) { |
||||
size_t lastdot = fname.find_last_of("."); |
||||
if (lastdot == std::string::npos) { |
||||
return std::string(fname); |
||||
} |
||||
return std::string(fname.substr(0, lastdot)); |
||||
} |
||||
|
||||
static std::string HeaderFilename(std::string proto_filename) { |
||||
return StripExtension(proto_filename) + ".upb.h"; |
||||
} |
||||
|
||||
static std::string SourceFilename(std::string proto_filename) { |
||||
return StripExtension(proto_filename) + ".upb.c"; |
||||
} |
||||
|
||||
class Output { |
||||
public: |
||||
Output(protobuf::io::ZeroCopyOutputStream* stream) : stream_(stream) {} |
||||
~Output() { stream_->BackUp(size_); } |
||||
|
||||
template <class... Arg> |
||||
void operator()(absl::string_view format, const Arg&... arg) { |
||||
Write(absl::Substitute(format, arg...)); |
||||
} |
||||
|
||||
private: |
||||
void Write(absl::string_view data) { |
||||
while (!data.empty()) { |
||||
RefreshOutput(); |
||||
size_t to_write = std::min(data.size(), size_); |
||||
memcpy(ptr_, data.data(), to_write); |
||||
data.remove_prefix(to_write); |
||||
ptr_ += to_write; |
||||
size_ -= to_write; |
||||
} |
||||
} |
||||
|
||||
void RefreshOutput() { |
||||
while (size_ == 0) { |
||||
void *ptr; |
||||
int size; |
||||
if (!stream_->Next(&ptr, &size)) { |
||||
fprintf(stderr, "upbc: Failed to write to to output\n"); |
||||
abort(); |
||||
} |
||||
ptr_ = static_cast<char*>(ptr); |
||||
size_ = size; |
||||
} |
||||
} |
||||
|
||||
protobuf::io::ZeroCopyOutputStream* stream_; |
||||
char *ptr_ = nullptr; |
||||
size_t size_ = 0; |
||||
}; |
||||
|
||||
namespace upbc { |
||||
|
||||
class Generator : public protoc::CodeGenerator { |
||||
~Generator() override {} |
||||
bool Generate(const protobuf::FileDescriptor* file, |
||||
const std::string& parameter, protoc::GeneratorContext* context, |
||||
std::string* error) const override; |
||||
|
||||
}; |
||||
|
||||
void AddMessages(const protobuf::Descriptor* message, |
||||
std::vector<const protobuf::Descriptor*>* messages) { |
||||
messages->push_back(message); |
||||
for (int i = 0; i < message->nested_type_count(); i++) { |
||||
AddMessages(message->nested_type(i), messages); |
||||
} |
||||
} |
||||
|
||||
void AddEnums(const protobuf::Descriptor* message, |
||||
std::vector<const protobuf::EnumDescriptor*>* enums) { |
||||
for (int i = 0; i < message->enum_type_count(); i++) { |
||||
enums->push_back(message->enum_type(i)); |
||||
} |
||||
for (int i = 0; i < message->nested_type_count(); i++) { |
||||
AddEnums(message->nested_type(i), enums); |
||||
} |
||||
} |
||||
|
||||
template <class T> |
||||
void SortDefs(std::vector<T>* defs) { |
||||
std::sort(defs->begin(), defs->end(), |
||||
[](T a, T b) { return a->full_name() < b->full_name(); }); |
||||
} |
||||
|
||||
std::vector<const protobuf::Descriptor*> SortedMessages( |
||||
const protobuf::FileDescriptor* file) { |
||||
std::vector<const protobuf::Descriptor*> messages; |
||||
for (int i = 0; i < file->message_type_count(); i++) { |
||||
AddMessages(file->message_type(i), &messages); |
||||
} |
||||
//SortDefs(&messages);
|
||||
return messages; |
||||
} |
||||
|
||||
std::vector<const protobuf::EnumDescriptor*> SortedEnums( |
||||
const protobuf::FileDescriptor* file) { |
||||
std::vector<const protobuf::EnumDescriptor*> enums; |
||||
for (int i = 0; i < file->enum_type_count(); i++) { |
||||
enums.push_back(file->enum_type(i)); |
||||
} |
||||
for (int i = 0; i < file->message_type_count(); i++) { |
||||
AddEnums(file->message_type(i), &enums); |
||||
} |
||||
SortDefs(&enums); |
||||
return enums; |
||||
} |
||||
|
||||
std::vector<const protobuf::FieldDescriptor*> FieldNumberOrder( |
||||
const protobuf::Descriptor* message) { |
||||
std::vector<const protobuf::FieldDescriptor*> messages; |
||||
for (int i = 0; i < message->field_count(); i++) { |
||||
messages.push_back(message->field(i)); |
||||
} |
||||
std::sort(messages.begin(), messages.end(), |
||||
[](const protobuf::FieldDescriptor* a, |
||||
const protobuf::FieldDescriptor* b) { |
||||
return a->number() < b->number(); |
||||
}); |
||||
return messages; |
||||
} |
||||
|
||||
std::vector<const protobuf::FieldDescriptor*> SortedSubmessages( |
||||
const protobuf::Descriptor* message) { |
||||
std::vector<const protobuf::FieldDescriptor*> ret; |
||||
for (int i = 0; i < message->field_count(); i++) { |
||||
if (message->field(i)->cpp_type() == |
||||
protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { |
||||
ret.push_back(message->field(i)); |
||||
} |
||||
} |
||||
std::sort(ret.begin(), ret.end(), |
||||
[](const protobuf::FieldDescriptor* a, |
||||
const protobuf::FieldDescriptor* b) { |
||||
return a->message_type()->full_name() < |
||||
b->message_type()->full_name(); |
||||
}); |
||||
return ret; |
||||
} |
||||
|
||||
std::string ToCIdent(absl::string_view str) { |
||||
return absl::StrReplaceAll(str, {{".", "_"}, {"/", "_"}}); |
||||
} |
||||
|
||||
std::string ToPreproc(absl::string_view str) { |
||||
return absl::AsciiStrToUpper(ToCIdent(str)); |
||||
} |
||||
|
||||
std::string EnumValueSymbol(const protobuf::EnumValueDescriptor* value) { |
||||
return ToCIdent(value->full_name()); |
||||
} |
||||
|
||||
std::string GetSizeInit(const MessageLayout::Size& size) { |
||||
return absl::Substitute("UPB_SIZE($0, $1)", size.size32, size.size64); |
||||
} |
||||
|
||||
std::string CTypeInternal(const protobuf::FieldDescriptor* field, |
||||
bool is_const) { |
||||
std::string maybe_const = is_const ? "const " : ""; |
||||
if (field->label() == protobuf::FieldDescriptor::LABEL_REPEATED) { |
||||
return maybe_const + "upb_array*"; |
||||
} |
||||
|
||||
switch (field->cpp_type()) { |
||||
case protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { |
||||
std::string maybe_struct = |
||||
field->file() != field->message_type()->file() ? "struct " : ""; |
||||
return maybe_const + maybe_struct + |
||||
ToCIdent(field->message_type()->full_name()) + "*"; |
||||
} |
||||
case protobuf::FieldDescriptor::CPPTYPE_ENUM: |
||||
return ToCIdent(field->enum_type()->full_name()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_BOOL: |
||||
return "bool"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_FLOAT: |
||||
return "float"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_INT32: |
||||
return "int32_t"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_UINT32: |
||||
return "uint32_t"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_DOUBLE: |
||||
return "double"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_INT64: |
||||
return "int64_t"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_UINT64: |
||||
return "uint64_t"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_STRING: |
||||
return "upb_stringview"; |
||||
default: |
||||
fprintf(stderr, "Unexpected type"); |
||||
abort(); |
||||
} |
||||
} |
||||
|
||||
std::string FieldDefault(const protobuf::FieldDescriptor* field) { |
||||
switch (field->cpp_type()) { |
||||
case protobuf::FieldDescriptor::CPPTYPE_MESSAGE: |
||||
return "NULL"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_STRING: |
||||
return absl::Substitute("upb_stringview_make(\"$0\", strlen(\"$0\"))", |
||||
absl::CEscape(field->default_value_string())); |
||||
case protobuf::FieldDescriptor::CPPTYPE_INT32: |
||||
return absl::StrCat(field->default_value_int32()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_INT64: |
||||
return absl::StrCat(field->default_value_int64()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_UINT32: |
||||
return absl::StrCat(field->default_value_uint32()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_UINT64: |
||||
return absl::StrCat(field->default_value_uint64()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_FLOAT: |
||||
return absl::StrCat(field->default_value_float()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_DOUBLE: |
||||
return absl::StrCat(field->default_value_double()); |
||||
case protobuf::FieldDescriptor::CPPTYPE_BOOL: |
||||
return field->default_value_bool() ? "true" : "false"; |
||||
case protobuf::FieldDescriptor::CPPTYPE_ENUM: |
||||
return EnumValueSymbol(field->default_value_enum()); |
||||
} |
||||
ABSL_ASSERT(false); |
||||
return "XXX"; |
||||
} |
||||
|
||||
std::string CType(const protobuf::FieldDescriptor* field) { |
||||
return CTypeInternal(field, false); |
||||
} |
||||
|
||||
std::string CTypeConst(const protobuf::FieldDescriptor* field) { |
||||
return CTypeInternal(field, true); |
||||
} |
||||
|
||||
void DumpEnumValues(const protobuf::EnumDescriptor* desc, Output& output) { |
||||
std::vector<const protobuf::EnumValueDescriptor*> values; |
||||
for (int i = 0; i < desc->value_count(); i++) { |
||||
values.push_back(desc->value(i)); |
||||
} |
||||
std::sort(values.begin(), values.end(), |
||||
[](const protobuf::EnumValueDescriptor* a, |
||||
const protobuf::EnumValueDescriptor* b) { |
||||
return a->number() < b->number(); |
||||
}); |
||||
|
||||
for (size_t i = 0; i < values.size(); i++) { |
||||
auto value = values[i]; |
||||
output(" $0 = $1", EnumValueSymbol(value), value->number()); |
||||
if (i != values.size() - 1) { |
||||
output(","); |
||||
} |
||||
output("\n"); |
||||
} |
||||
} |
||||
|
||||
void EmitFileWarning(const protobuf::FileDescriptor* file, Output& output) { |
||||
output( |
||||
"/* This file was generated by upbc (the upb compiler) from the input\n" |
||||
" * file:\n" |
||||
" *\n" |
||||
" * $0\n" |
||||
" *\n" |
||||
" * Do not edit -- your changes will be discarded when the file is\n" |
||||
" * regenerated. */\n\n", |
||||
file->name()); |
||||
} |
||||
|
||||
void GenerateMessageInHeader(const protobuf::Descriptor* message, Output& output) { |
||||
MessageLayout layout(message); |
||||
|
||||
output("/* $0 */\n\n", message->full_name()); |
||||
std::string msgname = ToCIdent(message->full_name()); |
||||
output( |
||||
"extern const upb_msglayout $0_msginit;\n" |
||||
"UPB_INLINE $0 *$0_new(upb_arena *arena) {\n" |
||||
" return ($0 *)upb_msg_new(&$0_msginit, arena);\n" |
||||
"}\n" |
||||
"UPB_INLINE $0 *$0_parsenew(upb_stringview buf, upb_arena *arena) {\n" |
||||
" $0 *ret = $0_new(arena);\n" |
||||
" return (ret && upb_decode(buf, ret, &$0_msginit)) ? ret : NULL;\n" |
||||
"}\n" |
||||
"UPB_INLINE char *$0_serialize(const $0 *msg, upb_arena *arena, size_t " |
||||
"*len) {\n" |
||||
" return upb_encode(msg, &$0_msginit, arena, len);\n" |
||||
"}\n" |
||||
"\n", |
||||
msgname); |
||||
|
||||
for (int i = 0; i < message->oneof_decl_count(); i++) { |
||||
const protobuf::OneofDescriptor* oneof = message->oneof_decl(i); |
||||
std::string fullname = ToCIdent(oneof->full_name()); |
||||
output("typedef enum {\n"); |
||||
for (int i = 0; i < oneof->field_count(); i++) { |
||||
const protobuf::FieldDescriptor* field = oneof->field(i); |
||||
output(" $0_$1 = $2,\n", fullname, field->name(), field->number()); |
||||
} |
||||
output( |
||||
" $0_NOT_SET = 0,\n" |
||||
"} $0_oneofcases;\n", |
||||
fullname); |
||||
output( |
||||
"UPB_INLINE $0_oneofcases $1_$2_case(const $1* msg) { " |
||||
"return UPB_FIELD_AT(msg, int, $3); }\n" |
||||
"\n", |
||||
fullname, msgname, oneof->name(), |
||||
GetSizeInit(layout.GetOneofCaseOffset(oneof))); |
||||
} |
||||
|
||||
for (auto field : FieldNumberOrder(message)) { |
||||
output("UPB_INLINE $0 $1_$2(const $1 *msg) {", CTypeConst(field), msgname, |
||||
field->name()); |
||||
if (field->containing_oneof()) { |
||||
output(" return UPB_READ_ONEOF(msg, $0, $1, $2, $3, $4); }\n", |
||||
CTypeConst(field), GetSizeInit(layout.GetFieldOffset(field)), |
||||
GetSizeInit(layout.GetOneofCaseOffset(field->containing_oneof())), |
||||
field->number(), FieldDefault(field)); |
||||
} else { |
||||
output(" return UPB_FIELD_AT(msg, $0, $1); }\n", CTypeConst(field), |
||||
GetSizeInit(layout.GetFieldOffset(field))); |
||||
} |
||||
} |
||||
|
||||
output("\n"); |
||||
|
||||
for (auto field : FieldNumberOrder(message)) { |
||||
output("UPB_INLINE void $0_set_$1($0 *msg, $2 value) { ", msgname, |
||||
field->name(), CType(field)); |
||||
if (field->containing_oneof()) { |
||||
output("UPB_WRITE_ONEOF(msg, $0, $1, value, $2, $3); }\n", CType(field), |
||||
GetSizeInit(layout.GetFieldOffset(field)), |
||||
GetSizeInit(layout.GetOneofCaseOffset(field->containing_oneof())), |
||||
field->number()); |
||||
} else { |
||||
output("UPB_FIELD_AT(msg, $0, $1) = value; }\n", CType(field), |
||||
GetSizeInit(layout.GetFieldOffset(field))); |
||||
} |
||||
} |
||||
|
||||
output("\n\n"); |
||||
} |
||||
|
||||
void WriteHeader(const protobuf::FileDescriptor* file, Output& output) { |
||||
EmitFileWarning(file, output); |
||||
output( |
||||
"#ifndef $0_UPB_H_\n" |
||||
"#define $0_UPB_H_\n\n" |
||||
"#include \"upb/msg.h\"\n\n" |
||||
"#include \"upb/decode.h\"\n" |
||||
"#include \"upb/encode.h\"\n" |
||||
"#include \"upb/port_def.inc\"\n" |
||||
"UPB_BEGIN_EXTERN_C\n\n", |
||||
ToPreproc(file->name())); |
||||
|
||||
// Forward-declare types defined in this file.
|
||||
for (auto message : SortedMessages(file)) { |
||||
output("struct $0;\n", ToCIdent(message->full_name())); |
||||
} |
||||
for (auto message : SortedMessages(file)) { |
||||
output("typedef struct $0 $0;\n", ToCIdent(message->full_name())); |
||||
}; |
||||
|
||||
// Forward-declare types not in this file, but used as submessages.
|
||||
std::set<std::string> forward_names; |
||||
for (auto message : SortedMessages(file)) { |
||||
for (int i = 0; i < message->field_count(); i++) { |
||||
const protobuf::FieldDescriptor* field = message->field(i); |
||||
if (field->cpp_type() == protobuf::FieldDescriptor::CPPTYPE_MESSAGE && |
||||
field->file() != message->file()) { |
||||
forward_names.insert(ToCIdent(field->message_type()->full_name())); |
||||
} |
||||
} |
||||
} |
||||
for (const auto& name : forward_names) { |
||||
output("struct $0;\n", name); |
||||
} |
||||
|
||||
output( |
||||
"\n" |
||||
"/* Enums */\n\n"); |
||||
for (auto enumdesc : SortedEnums(file)) { |
||||
output("typedef enum {\n"); |
||||
DumpEnumValues(enumdesc, output); |
||||
output("} $0;\n\n", ToCIdent(enumdesc->full_name())); |
||||
} |
||||
|
||||
for (auto message : SortedMessages(file)) { |
||||
GenerateMessageInHeader(message, output); |
||||
} |
||||
|
||||
output( |
||||
"UPB_END_EXTERN_C\n" |
||||
"\n" |
||||
"#include \"upb/port_undef.inc\"\n" |
||||
"\n" |
||||
"#endif /* $0_UPB_H_ */\n", |
||||
ToPreproc(file->name())); |
||||
} |
||||
|
||||
void WriteSource(const protobuf::FileDescriptor* file, Output& output) { |
||||
EmitFileWarning(file, output); |
||||
|
||||
output( |
||||
"#include <stddef.h>\n" |
||||
"#include \"upb/msg.h\"\n" |
||||
"#include \"$0\"\n", |
||||
HeaderFilename(file->name())); |
||||
|
||||
for (int i = 0; i < file->dependency_count(); i++) { |
||||
output("#include \"$0\"\n", HeaderFilename(file->dependency(i)->name())); |
||||
} |
||||
|
||||
output( |
||||
"\n" |
||||
"#include \"upb/port_def.inc\"\n" |
||||
"\n"); |
||||
|
||||
|
||||
for (auto message : SortedMessages(file)) { |
||||
std::string msgname = ToCIdent(message->full_name()); |
||||
std::string fields_array_ref = "NULL"; |
||||
std::string submsgs_array_ref = "NULL"; |
||||
std::string oneofs_array_ref = "NULL"; |
||||
std::unordered_map<const protobuf::Descriptor*, int> submsg_indexes; |
||||
MessageLayout layout(message); |
||||
std::vector<const protobuf::FieldDescriptor*> sorted_submsgs = |
||||
SortedSubmessages(message); |
||||
|
||||
if (!sorted_submsgs.empty()) { |
||||
// TODO(haberman): could save a little bit of space by only generating a
|
||||
// "submsgs" array for every strongly-connected component.
|
||||
std::string submsgs_array_name = msgname + "_submsgs"; |
||||
submsgs_array_ref = "&" + submsgs_array_name + "[0]"; |
||||
output("static const upb_msglayout *const $0[$1] = {\n", |
||||
submsgs_array_name, sorted_submsgs.size()); |
||||
|
||||
int i = 0; |
||||
for (auto submsg : sorted_submsgs) { |
||||
if (submsg_indexes.find(submsg->message_type()) != |
||||
submsg_indexes.end()) { |
||||
continue; |
||||
} |
||||
output(" &$0_msginit,\n", |
||||
ToCIdent(submsg->message_type()->full_name())); |
||||
submsg_indexes[submsg->message_type()] = i++; |
||||
} |
||||
|
||||
output("};\n\n"); |
||||
} |
||||
|
||||
std::vector<const protobuf::FieldDescriptor*> field_number_order = |
||||
FieldNumberOrder(message); |
||||
if (!field_number_order.empty()) { |
||||
std::string fields_array_name = msgname + "__fields"; |
||||
fields_array_ref = "&" + fields_array_name + "[0]"; |
||||
output("static const upb_msglayout_field $0[$1] = {\n", |
||||
fields_array_name, field_number_order.size()); |
||||
for (auto field : field_number_order) { |
||||
int submsg_index = 0; |
||||
std::string presence = "0"; |
||||
|
||||
if (field->cpp_type() == protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { |
||||
submsg_index = submsg_indexes[field->message_type()]; |
||||
} |
||||
|
||||
if (MessageLayout::HasHasbit(field)) { |
||||
presence = absl::StrCat(layout.GetHasbitIndex(field) + 1); |
||||
} else if (field->containing_oneof()) { |
||||
MessageLayout::Size case_offset = |
||||
layout.GetOneofCaseOffset(field->containing_oneof()); |
||||
|
||||
// Our encoding that distinguishes oneofs from presence-having fields.
|
||||
case_offset.size32 = -case_offset.size32 - 1; |
||||
case_offset.size64 = -case_offset.size64 - 1; |
||||
presence = GetSizeInit(case_offset); |
||||
} |
||||
|
||||
output(" {$0, $1, $2, $3, $4, $5},\n", |
||||
field->number(), |
||||
GetSizeInit(layout.GetFieldOffset(field)), |
||||
presence, |
||||
submsg_index, |
||||
field->type(), |
||||
field->label()); |
||||
} |
||||
output("};\n\n"); |
||||
} |
||||
|
||||
output("const upb_msglayout $0_msginit = {\n", msgname); |
||||
output(" $0,\n", submsgs_array_ref); |
||||
output(" $0,\n", fields_array_ref); |
||||
output(" $0, $1, $2,\n", GetSizeInit(layout.message_size()), |
||||
field_number_order.size(), |
||||
"false" // TODO: extendable
|
||||
); |
||||
|
||||
output("};\n\n"); |
||||
} |
||||
|
||||
output("#include \"upb/port_undef.inc\"\n"); |
||||
output("\n"); |
||||
} |
||||
|
||||
bool Generator::Generate(const protobuf::FileDescriptor* file, |
||||
const std::string& parameter, |
||||
protoc::GeneratorContext* context, |
||||
std::string* error) const { |
||||
Output h_output(context->Open(HeaderFilename(file->name()))); |
||||
WriteHeader(file, h_output); |
||||
|
||||
Output c_output(context->Open(SourceFilename(file->name()))); |
||||
WriteSource(file, c_output); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
std::unique_ptr<google::protobuf::compiler::CodeGenerator> GetGenerator() { |
||||
return std::unique_ptr<google::protobuf::compiler::CodeGenerator>( |
||||
new Generator()); |
||||
} |
||||
|
||||
} // namespace upbc
|
@ -0,0 +1,12 @@ |
||||
|
||||
#ifndef UPBC_GENERATOR_H_ |
||||
#define UPBC_GENERATOR_H_ |
||||
|
||||
#include <memory> |
||||
#include <google/protobuf/compiler/code_generator.h> |
||||
|
||||
namespace upbc { |
||||
std::unique_ptr<google::protobuf::compiler::CodeGenerator> GetGenerator(); |
||||
} |
||||
|
||||
#endif // UPBC_GENERATOR_H_
|
@ -0,0 +1,9 @@ |
||||
|
||||
#include <google/protobuf/compiler/plugin.h> |
||||
|
||||
#include "upbc/generator.h" |
||||
|
||||
int main(int argc, char** argv) { |
||||
return google::protobuf::compiler::PluginMain(argc, argv, |
||||
upbc::GetGenerator().get()); |
||||
} |
@ -0,0 +1,173 @@ |
||||
|
||||
#include "upbc/message_layout.h" |
||||
|
||||
namespace upbc { |
||||
|
||||
namespace protobuf = ::google::protobuf; |
||||
|
||||
static int64_t DivRoundUp(int64_t a, int64_t b) { |
||||
ABSL_ASSERT(a >= 0); |
||||
ABSL_ASSERT(b > 0); |
||||
return (a + b - 1) / b; |
||||
} |
||||
|
||||
MessageLayout::Size MessageLayout::Place( |
||||
MessageLayout::SizeAndAlign size_and_align) { |
||||
Size offset = size_; |
||||
offset.AlignUp(size_and_align.align); |
||||
size_ = offset; |
||||
size_.Add(size_and_align.size); |
||||
//maxalign_.MaxFrom(size_and_align.align);
|
||||
maxalign_.MaxFrom(size_and_align.size); |
||||
return offset; |
||||
} |
||||
|
||||
bool MessageLayout::HasHasbit(const protobuf::FieldDescriptor* field) { |
||||
return field->file()->syntax() == protobuf::FileDescriptor::SYNTAX_PROTO2 && |
||||
field->label() != protobuf::FieldDescriptor::LABEL_REPEATED && |
||||
!field->containing_oneof(); |
||||
} |
||||
|
||||
MessageLayout::SizeAndAlign MessageLayout::SizeOf( |
||||
const protobuf::FieldDescriptor* field) { |
||||
if (field->label() == protobuf::FieldDescriptor::LABEL_REPEATED || |
||||
field->cpp_type() == protobuf::FieldDescriptor::CPPTYPE_MESSAGE) { |
||||
return {{4, 8}, {4, 8}}; |
||||
} |
||||
|
||||
switch (field->cpp_type()) { |
||||
case protobuf::FieldDescriptor::CPPTYPE_STRING: |
||||
// upb_stringview
|
||||
// return {{8, 16}, {4, 8}};
|
||||
return {{8, 16}, {8, 16}}; |
||||
case protobuf::FieldDescriptor::CPPTYPE_BOOL: |
||||
return {{1, 1}, {1, 1}}; |
||||
case protobuf::FieldDescriptor::CPPTYPE_FLOAT: |
||||
case protobuf::FieldDescriptor::CPPTYPE_INT32: |
||||
case protobuf::FieldDescriptor::CPPTYPE_UINT32: |
||||
return {{4, 4}, {4, 4}}; |
||||
default: |
||||
return {{8, 8}, {8, 8}}; |
||||
} |
||||
} |
||||
|
||||
int64_t MessageLayout::FieldLayoutRank(const protobuf::FieldDescriptor* field) { |
||||
// Order:
|
||||
// 1, 2, 3. primitive fields (8, 4, 1 byte)
|
||||
// 4. string fields
|
||||
// 5. submessage fields
|
||||
// 6. repeated fields
|
||||
//
|
||||
// This has the following nice properties:
|
||||
//
|
||||
// 1. padding alignment is (nearly) minimized.
|
||||
// 2. fields that might have defaults (1-4) are segregated
|
||||
// from fields that are always zero-initialized (5-7).
|
||||
//
|
||||
// We skip oneof fields, because they are emitted in a separate pass.
|
||||
int64_t rank; |
||||
if (field->containing_oneof()) { |
||||
fprintf(stderr, "shouldn't have oneofs here.\n"); |
||||
abort(); |
||||
} else if (field->label() == protobuf::FieldDescriptor::LABEL_REPEATED) { |
||||
rank = 6; |
||||
} else { |
||||
switch (field->cpp_type()) { |
||||
case protobuf::FieldDescriptor::CPPTYPE_MESSAGE: |
||||
rank = 5; |
||||
break; |
||||
case protobuf::FieldDescriptor::CPPTYPE_STRING: |
||||
rank = 4; |
||||
break; |
||||
case protobuf::FieldDescriptor::CPPTYPE_BOOL: |
||||
rank = 3; |
||||
break; |
||||
case protobuf::FieldDescriptor::CPPTYPE_FLOAT: |
||||
case protobuf::FieldDescriptor::CPPTYPE_INT32: |
||||
case protobuf::FieldDescriptor::CPPTYPE_UINT32: |
||||
rank = 2; |
||||
break; |
||||
default: |
||||
rank = 1; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
// Break ties with field number.
|
||||
return (rank << 29) | field->number(); |
||||
} |
||||
|
||||
void MessageLayout::ComputeLayout(const protobuf::Descriptor* descriptor) { |
||||
size_ = Size{0, 0}; |
||||
maxalign_ = Size{0, 0}; |
||||
PlaceNonOneofFields(descriptor); |
||||
PlaceOneofFields(descriptor); |
||||
|
||||
// Align overall size up to max size.
|
||||
size_.AlignUp(maxalign_); |
||||
} |
||||
|
||||
void MessageLayout::PlaceNonOneofFields( |
||||
const protobuf::Descriptor* descriptor) { |
||||
std::vector<const protobuf::FieldDescriptor*> field_order; |
||||
for (int i = 0; i < descriptor->field_count(); i++) { |
||||
const protobuf::FieldDescriptor* field = descriptor->field(i); |
||||
if (!field->containing_oneof()) { |
||||
field_order.push_back(descriptor->field(i)); |
||||
} |
||||
} |
||||
std::sort(field_order.begin(), field_order.end(), |
||||
[](const protobuf::FieldDescriptor* a, |
||||
const protobuf::FieldDescriptor* b) { |
||||
return FieldLayoutRank(a) < FieldLayoutRank(b); |
||||
}); |
||||
|
||||
// Place/count hasbits.
|
||||
int hasbit_count = 0; |
||||
for (auto field : field_order) { |
||||
if (HasHasbit(field)) { |
||||
hasbit_indexes_[field] = hasbit_count++; |
||||
} |
||||
} |
||||
|
||||
// Place hasbits at the beginning.
|
||||
int64_t hasbit_bytes = DivRoundUp(hasbit_count, 8); |
||||
Place(SizeAndAlign{{hasbit_bytes, hasbit_bytes}, {1, 1}}); |
||||
|
||||
// Place non-oneof fields.
|
||||
for (auto field : field_order) { |
||||
field_offsets_[field] = Place(SizeOf(field)); |
||||
} |
||||
} |
||||
|
||||
void MessageLayout::PlaceOneofFields(const protobuf::Descriptor* descriptor) { |
||||
std::vector<const protobuf::OneofDescriptor*> oneof_order; |
||||
for (int i = 0; i < descriptor->oneof_decl_count(); i++) { |
||||
oneof_order.push_back(descriptor->oneof_decl(i)); |
||||
} |
||||
std::sort(oneof_order.begin(), oneof_order.end(), |
||||
[](const protobuf::OneofDescriptor* a, |
||||
const protobuf::OneofDescriptor* b) { |
||||
return a->full_name() < b->full_name(); |
||||
}); |
||||
|
||||
for (auto oneof : oneof_order) { |
||||
SizeAndAlign oneof_maxsize{{0, 0}, {0, 0}}; |
||||
// Calculate max size.
|
||||
for (int i = 0; i < oneof->field_count(); i++) { |
||||
oneof_maxsize.MaxFrom(SizeOf(oneof->field(i))); |
||||
} |
||||
|
||||
// Place discriminator enum and data.
|
||||
Size data = Place(oneof_maxsize); |
||||
Size discriminator = Place(SizeAndAlign{{4, 4}, {4, 4}}); |
||||
|
||||
oneof_case_offsets_[oneof] = discriminator; |
||||
|
||||
for (int i = 0; i < oneof->field_count(); i++) { |
||||
field_offsets_[oneof->field(i)] = data; |
||||
} |
||||
} |
||||
} |
||||
|
||||
} // namespace upbc
|
@ -0,0 +1,104 @@ |
||||
|
||||
#ifndef UPBC_MESSAGE_LAYOUT_H |
||||
#define UPBC_MESSAGE_LAYOUT_H |
||||
|
||||
#include <unordered_map> |
||||
#include "absl/base/macros.h" |
||||
#include "google/protobuf/descriptor.h" |
||||
|
||||
namespace upbc { |
||||
|
||||
class MessageLayout { |
||||
public: |
||||
struct Size { |
||||
void Add(const Size& other) { |
||||
size32 += other.size32; |
||||
size64 += other.size64; |
||||
} |
||||
|
||||
void MaxFrom(const Size& other) { |
||||
size32 = std::max(size32, other.size32); |
||||
size64 = std::max(size64, other.size64); |
||||
} |
||||
|
||||
void AlignUp(const Size& align) { |
||||
size32 = Align(size32, align.size32); |
||||
size64 = Align(size64, align.size64); |
||||
} |
||||
|
||||
int64_t size32; |
||||
int64_t size64; |
||||
}; |
||||
|
||||
struct SizeAndAlign { |
||||
Size size; |
||||
Size align; |
||||
|
||||
void MaxFrom(const SizeAndAlign& other) { |
||||
size.MaxFrom(other.size); |
||||
align.MaxFrom(other.align); |
||||
} |
||||
}; |
||||
|
||||
MessageLayout(const google::protobuf::Descriptor* descriptor) { |
||||
ComputeLayout(descriptor); |
||||
} |
||||
|
||||
Size GetFieldOffset(const google::protobuf::FieldDescriptor* field) const { |
||||
return GetMapValue(field_offsets_, field); |
||||
} |
||||
|
||||
Size GetOneofCaseOffset( |
||||
const google::protobuf::OneofDescriptor* oneof) const { |
||||
return GetMapValue(oneof_case_offsets_, oneof); |
||||
} |
||||
|
||||
int GetHasbitIndex(const google::protobuf::FieldDescriptor* field) const { |
||||
return GetMapValue(hasbit_indexes_, field); |
||||
} |
||||
|
||||
Size message_size() const { return size_; } |
||||
|
||||
static bool HasHasbit(const google::protobuf::FieldDescriptor* field); |
||||
|
||||
private: |
||||
void ComputeLayout(const google::protobuf::Descriptor* descriptor); |
||||
void PlaceNonOneofFields(const google::protobuf::Descriptor* descriptor); |
||||
void PlaceOneofFields(const google::protobuf::Descriptor* descriptor); |
||||
Size Place(SizeAndAlign size_and_align); |
||||
|
||||
template <class K, class V> |
||||
static V GetMapValue(const std::unordered_map<K, V>& map, K key) { |
||||
auto iter = map.find(key); |
||||
if (iter == map.end()) { |
||||
fprintf(stderr, "No value for field.\n"); |
||||
abort(); |
||||
} |
||||
return iter->second; |
||||
} |
||||
|
||||
static bool IsPowerOfTwo(size_t val) { |
||||
return (val & (val - 1)) == 0; |
||||
} |
||||
|
||||
static size_t Align(size_t val, size_t align) { |
||||
ABSL_ASSERT(IsPowerOfTwo(align)); |
||||
return (val + align - 1) & ~(align - 1); |
||||
} |
||||
|
||||
static SizeAndAlign SizeOf(const google::protobuf::FieldDescriptor* field); |
||||
static int64_t FieldLayoutRank(const google::protobuf::FieldDescriptor* field); |
||||
|
||||
std::unordered_map<const google::protobuf::FieldDescriptor*, Size> |
||||
field_offsets_; |
||||
std::unordered_map<const google::protobuf::FieldDescriptor*, int> |
||||
hasbit_indexes_; |
||||
std::unordered_map<const google::protobuf::OneofDescriptor*, Size> |
||||
oneof_case_offsets_; |
||||
Size maxalign_; |
||||
Size size_; |
||||
}; |
||||
|
||||
} // namespace upbc
|
||||
|
||||
#endif // UPBC_MESSAGE_LAYOUT_H
|
Loading…
Reference in new issue