diff options
-rw-r--r-- | BUILD | 155 | ||||
-rw-r--r-- | CMakeLists.txt | 5 | ||||
-rw-r--r-- | WORKSPACE | 3 | ||||
-rw-r--r-- | build_defs.bzl | 248 | ||||
-rw-r--r-- | generated_for_cmake/google/protobuf/descriptor.upb.c (renamed from google/protobuf/descriptor.upb.c) | 8 | ||||
-rw-r--r-- | generated_for_cmake/google/protobuf/descriptor.upb.h (renamed from google/protobuf/descriptor.upb.h) | 20 | ||||
-rw-r--r-- | generated_for_cmake/upb/json/parser.c (renamed from upb/json/parser.c) | 0 | ||||
-rw-r--r-- | google/protobuf/descriptor.pb | bin | 7493 -> 0 bytes | |||
-rw-r--r-- | google/protobuf/descriptor.proto | 870 | ||||
-rw-r--r-- | tests/json/enum_from_separate_file.proto | 9 | ||||
-rw-r--r-- | tests/pb/test_encoder.cc | 34 | ||||
-rwxr-xr-x | tools/amalgamate.py | 43 | ||||
-rwxr-xr-x | tools/make_cmakelists.py | 18 | ||||
-rwxr-xr-x | travis.sh | 196 | ||||
-rw-r--r-- | upb/decode.c | 2 |
15 files changed, 351 insertions, 1260 deletions
@@ -11,6 +11,7 @@ load( "upb_amalgamation", "upb_proto_library", "upb_proto_reflection_library", + "upb_proto_srcs", ) licenses(["notice"]) # BSD (Google-authored w/ possible external contributions) @@ -45,7 +46,6 @@ config_setting( cc_library( name = "upb", srcs = [ - "google/protobuf/descriptor.upb.c", "upb/decode.c", "upb/encode.c", "upb/msg.c", @@ -56,7 +56,6 @@ cc_library( "upb/upb.c", ], hdrs = [ - "google/protobuf/descriptor.upb.h", "upb/decode.h", "upb/encode.h", "upb/generated_util.h", @@ -67,6 +66,11 @@ cc_library( visibility = ["//visibility:public"], ) +upb_proto_library( + name = "descriptor_upbproto", + deps = ["@com_google_protobuf//:descriptor_proto"], +) + cc_library( name = "reflection", srcs = [ @@ -79,7 +83,10 @@ cc_library( ], copts = COPTS, visibility = ["//visibility:public"], - deps = [":upb"], + deps = [ + ":descriptor_upbproto", + ":upb" + ], ) # Internal C/C++ libraries ##################################################### @@ -196,6 +203,7 @@ cc_binary( map_dep("@com_google_protobuf//:protoc_lib"), ], copts = CPPOPTS, + visibility = ["//visibility:public"], ) # We strip the tests and remaining rules from google3 until the upb_proto_library() @@ -237,7 +245,6 @@ proto_library( upb_proto_reflection_library( name = "test_decoder_upbproto", - upbc = ":protoc-gen-upb", deps = ["test_decoder_proto"], ) @@ -252,11 +259,16 @@ cc_test( copts = CPPOPTS, ) +upb_proto_reflection_library( + name = "descriptor_upbreflection", + deps = ["@com_google_protobuf//:descriptor_proto"], +) + cc_test( name = "test_encoder", srcs = ["tests/pb/test_encoder.cc"], - data = ["google/protobuf/descriptor.pb"], deps = [ + "descriptor_upbreflection", ":upb_cc_bindings", ":upb_pb", ":upb_test", @@ -273,7 +285,6 @@ proto_library( upb_proto_reflection_library( name = "test_cpp_upbproto", - upbc = ":protoc-gen-upb", deps = ["test_cpp_proto"], ) @@ -300,23 +311,29 @@ cc_test( ) proto_library( + name = "test_json_enum_from_separate", + srcs = ["tests/json/enum_from_separate_file.proto"], + deps = [":test_json_proto"], +) + +proto_library( name = "test_json_proto", - srcs = [ - "tests/json/test.proto", - # "tests/json/enum_from_separate_file.proto", - ], + srcs = ["tests/json/test.proto"], ) upb_proto_reflection_library( name = "test_json_upbprotoreflection", - upbc = ":protoc-gen-upb", deps = ["test_json_proto"], ) upb_proto_library( + name = "test_json_enum_from_separate_upbproto", + deps = [":test_json_enum_from_separate"], +) + +upb_proto_library( name = "test_json_upbproto", - upbc = ":protoc-gen-upb", - deps = ["test_json_proto"], + deps = [":test_json_proto"], ) cc_test( @@ -335,11 +352,12 @@ cc_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", - ], + deps = ["@com_google_protobuf//:conformance_proto"], +) + +upb_proto_library( + name = "test_messages_proto3_proto_upb", + deps = ["@com_google_protobuf//:test_messages_proto3_proto"], ) cc_binary( @@ -350,6 +368,7 @@ cc_binary( copts = COPTS + ["-Ibazel-out/k8-fastbuild/bin"], deps = [ ":conformance_proto_upb", + ":test_messages_proto3_proto_upb", ":upb", ], ) @@ -378,6 +397,11 @@ py_binary( srcs = ["tools/amalgamate.py"], ) +upb_proto_srcs( + name = "descriptor_upbproto_srcs", + deps = ["@com_google_protobuf//:descriptor_proto"], +) + upb_amalgamation( name = "gen_amalgamation", outs = [ @@ -387,6 +411,7 @@ upb_amalgamation( amalgamator = ":amalgamate", libs = [ ":upb", + ":descriptor_upbproto_srcs", ":reflection", ":handlers", ":upb_pb", @@ -460,22 +485,29 @@ lua_test( # Test the CMake build ######################################################### +filegroup( + name = "cmake_files", + srcs = glob([ + "CMakeLists.txt", + "generated_for_cmake/**/*", + "google/**/*", + "upbc/**/*", + "upb/**/*", + "tests/**/*", + ]) +) + make_shell_script( name = "gen_run_cmake_build", out = "run_cmake_build.sh", - contents = "mkdir build && cd build && cmake .. && make -j8 && make test", + contents = "find . && 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/**/*", - ]) + [ + data = [ + ":cmake_files", "@bazel_tools//tools/bash/runfiles", ], ) @@ -500,78 +532,47 @@ genrule( srcs = [ "BUILD", "WORKSPACE", + ":cmake_files", ], - outs = ["generated/CMakeLists.txt"], + outs = ["generated-in/CMakeLists.txt"], cmd = "$(location :make_cmakelists) $@", tools = [":make_cmakelists"], ) -proto_library( - name = "descriptor_proto", - srcs = [ - "google/protobuf/descriptor.proto", - ], +genrule( + name = "generate_json_ragel", + srcs = ["upb/json/parser.rl"], + outs = ["upb/json/parser.c"], + cmd = "$(location @ragel//:ragel) -C -o upb/json/parser.c $< && mv upb/json/parser.c $@", + tools = ["@ragel"], ) genrule( - name = "copy_upb_descriptor_pb", - srcs = [":descriptor_proto"], - outs = ["generated/google/protobuf/descriptor.pb"], + name = "copy_json_ragel", + srcs = ["upb/json/parser.c"], + outs = ["generated-in/generated_for_cmake/upb/json/parser.c"], cmd = "cp $< $@", ) -proto_library( - name = "google_descriptor_proto", - srcs = [ - "google/protobuf/descriptor.proto", - ], -) - genrule( - name = "generate_descriptor_c", - srcs = ["google/protobuf/descriptor.proto"], + name = "copy_protos", + srcs = [":descriptor_upbproto_srcs"], outs = [ - "generated/google/protobuf/descriptor.upb.h", - "generated/google/protobuf/descriptor.upb.c", + "generated-in/generated_for_cmake/google/protobuf/descriptor.upb.c", + "generated-in/generated_for_cmake/google/protobuf/descriptor.upb.h", ], - cmd = "$(location @com_google_protobuf//:protoc) $< --upb_out=$(GENDIR)/generated --plugin=protoc-gen-upb=$(location :protoc-gen-upb)", - tools = [ - ":protoc-gen-upb", - "@com_google_protobuf//:protoc", - ], -) - -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 = "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"], + cmd = "cp $(SRCS) $(@D)/generated-in/generated_for_cmake/google/protobuf", ) generated_file_staleness_test( name = "test_generated_files", outs = [ "CMakeLists.txt", - "google/protobuf/descriptor.pb", - "google/protobuf/descriptor.upb.c", - "google/protobuf/descriptor.upb.h", - "tests/json/test.proto.pb", - "upb/json/parser.c", + "generated_for_cmake/upb/json/parser.c", + "generated_for_cmake/google/protobuf/descriptor.upb.c", + "generated_for_cmake/google/protobuf/descriptor.upb.h", ], - generated_pattern = "generated/%s", + generated_pattern = "generated-in/%s", ) # copybara:strip_end diff --git a/CMakeLists.txt b/CMakeLists.txt index af09f4e..3e08cd7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,7 @@ if(UPB_ENABLE_UBSAN) endif() include_directories(.) +include_directories(generated_for_cmake) include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(APPLE) @@ -60,7 +61,6 @@ endif() enable_testing() add_library(upb - google/protobuf/descriptor.upb.c upb/decode.c upb/encode.c upb/msg.c @@ -69,7 +69,6 @@ add_library(upb upb/table.c upb/table.int.h upb/upb.c - google/protobuf/descriptor.upb.h upb/decode.h upb/encode.h upb/generated_util.h @@ -81,6 +80,7 @@ add_library(reflection upb/def.h upb/msgfactory.h) target_link_libraries(reflection + descriptor_upbproto upb) add_library(table INTERFACE) target_link_libraries(table INTERFACE @@ -115,7 +115,6 @@ target_link_libraries(upb_pb table upb) add_library(upb_json - upb/json/parser.c upb/json/printer.c upb/json/parser.h upb/json/printer.h) @@ -20,6 +20,7 @@ git_repository( commit = "25feb59620627b673df76813dfd66e3f565765e7", #sha256 = "d7a221b3d4fb4f05b7473795ccea9e05dab3b8721f6286a95fffbffc2d926f8b", remote = "https://github.com/haberman/protobuf.git", + shallow_since = "1541281400 -0700" #tag = "conformance-build-tag", ) @@ -27,6 +28,7 @@ git_repository( name = "absl", commit = "070f6e47b33a2909d039e620c873204f78809492", remote = "https://github.com/abseil/abseil-cpp.git", + shallow_since = "1541627663 -0500" ) http_archive( @@ -37,7 +39,6 @@ http_archive( urls = ["http://www.colm.net/files/ragel/ragel-6.10.tar.gz"], ) -# Used by protobuf. http_archive( name = "bazel_skylib", sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d", diff --git a/build_defs.bzl b/build_defs.bzl index 05b3974..9deb336 100644 --- a/build_defs.bzl +++ b/build_defs.bzl @@ -23,6 +23,10 @@ _shell_find_runfiles = """ # --- end runfiles.bash initialization --- """ +load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain") +load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "CPP_LINK_STATIC_LIBRARY_ACTION_NAME") + def _librule(name): return name + "_lib" @@ -42,12 +46,12 @@ def lua_cclibrary(name, srcs, hdrs = [], deps = [], luadeps = []): name = so_rule, linkshared = True, deps = [_librule(name)], - linkopts = select({ - ":darwin": [ - "-undefined dynamic_lookup", - ], - "//conditions:default": [], - }) + linkopts = select({ + ":darwin": [ + "-undefined dynamic_lookup", + ], + "//conditions:default": [], + }), ) native.genrule( @@ -174,6 +178,9 @@ SrcList = provider( ) def _file_list_aspect_impl(target, ctx): + if SrcList in target: + return [] + srcs = [] hdrs = [] for src in ctx.rule.attr.srcs: @@ -196,7 +203,7 @@ def _upb_amalgamation(ctx): ctx.actions.run( inputs = inputs, outputs = ctx.outputs.outs, - arguments = ["", ctx.bin_dir.path + "/"] + [f.path for f in srcs], + arguments = [ctx.bin_dir.path + "/"] + [f.path for f in srcs] + ["-I" + root for root in _get_real_roots(inputs)], progress_message = "Making amalgamation", executable = ctx.executable.amalgamator, ) @@ -229,102 +236,207 @@ def map_dep(dep): else: return google3_dep_map[dep] -# upb_proto_library() rule +def _get_real_short_path(file): + # For some reason, files from other archives have short paths that look like: + # ../com_google_protobuf/google/protobuf/descriptor.proto + short_path = file.short_path + if short_path.startswith("../"): + second_slash = short_path.index("/", 3) + short_path = short_path[second_slash + 1:] + return short_path + +def _get_real_root(file): + real_short_path = _get_real_short_path(file) + return file.path[:-len(real_short_path) - 1] + +def _get_real_roots(files): + roots = {} + for file in files: + real_root = _get_real_root(file) + if real_root: + roots[real_root] = True + return roots.keys() + +def _generate_output_file(ctx, src, extension): + real_short_path = _get_real_short_path(src) + output_filename = paths.replace_extension(real_short_path, extension) + ret = ctx.new_file(ctx.genfiles_dir, output_filename) + return ret + +def filter_none(elems): + out = [] + for elem in elems: + if elem: + out.append(elem) + return out -def _remove_up(string): - if string.startswith("../"): - string = string[3:] - pos = string.find("/") - string = string[pos + 1:] +# upb_proto_library() rule - return _remove_suffix(string, ".proto") +def cc_library_func(ctx, hdrs, srcs, deps): + compilation_contexts = [] + linking_contexts = [] + for dep in deps: + if CcInfo in dep: + linking_contexts.append(dep[CcInfo].linking_context) + compilation_contexts.append(dep[CcInfo].compilation_context) + toolchain = find_cpp_toolchain(ctx) + feature_configuration = cc_common.configure_features( + cc_toolchain = toolchain, + requested_features = ctx.features, + unsupported_features = ctx.disabled_features, + ) + compilation_info = cc_common.compile( + ctx = ctx, + feature_configuration = feature_configuration, + cc_toolchain = toolchain, + srcs = srcs, + hdrs = hdrs, + compilation_contexts = compilation_contexts, + ) + linking_info = cc_common.link( + ctx = ctx, + feature_configuration = feature_configuration, + cc_toolchain = toolchain, + cc_compilation_outputs = compilation_info.cc_compilation_outputs, + linking_contexts = linking_contexts, + ) -def _upb_proto_srcs_impl(ctx, suffix): - 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_dir = _remove_suffix(src.path, _remove_up(src.short_path) + "." + src.extension) - if include_dir: - include_dirs[include_dir] = True - outs.append(ctx.actions.declare_file(_remove_up(src.short_path) + suffix + ".h")) - outs.append(ctx.actions.declare_file(_remove_up(src.short_path) + suffix + ".c")) - outdir = _remove_suffix(outs[-1].path, _remove_up(src.short_path) + suffix + ".c") - - source_paths = [d.path for d in sources] - include_args = ["-I" + root for root in include_dirs.keys()] + return CcInfo( + compilation_context = compilation_info.compilation_context, + linking_context = linking_info.linking_context, + ) +def _compile_upb_protos(ctx, proto_info, proto_sources, ext): + srcs = [_generate_output_file(ctx, name, ext + ".c") for name in proto_sources] + hdrs = [_generate_output_file(ctx, name, ext + ".h") for name in proto_sources] + transitive_sets = list(proto_info.transitive_descriptor_sets) 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", + inputs = depset( + direct = [ctx.executable._upbc, proto_info.direct_descriptor_set], + transitive = [proto_info.transitive_descriptor_sets], + ), + outputs = srcs + hdrs, + executable = ctx.executable._protoc, + arguments = [ + "--upb_out=" + _get_real_root(srcs[0]), + "--plugin=protoc-gen-upb=" + ctx.executable._upbc.path, + "--descriptor_set_in=" + ":".join([f.path for f in transitive_sets]), + ] + + [_get_real_short_path(file) for file in proto_sources], + progress_message = "Generating upb protos for :" + ctx.label.name, ) + return SrcList(srcs = srcs, hdrs = hdrs) + +# upb_proto_library() shared code ############################################# + +# Can share these with upb_proto_library() once cc_common.link() supports name +# param. + +def _upb_proto_rule_impl(ctx): + if len(ctx.attr.deps) != 1: + fail("only one deps dependency allowed.") + dep = ctx.attr.deps[0] + if CcInfo not in dep: + fail("proto_library rule must generate CcInfo (aspect should have handled this).") + lib = dep[CcInfo].linking_context.libraries_to_link[0] + files = filter_none([ + lib.static_library, + lib.pic_static_library, + lib.dynamic_library, + ]) + return [ + DefaultInfo(files = depset(files)), + dep[CcInfo], + ] + +def _upb_proto_aspect_impl(target, ctx): + proto_info = target[ProtoInfo] + files = _compile_upb_protos(ctx, proto_info, proto_info.direct_sources, ctx.attr._ext) + cc_info = cc_library_func( + ctx = ctx, + hdrs = files.hdrs, + srcs = files.srcs, + deps = ctx.rule.attr.deps + [ctx.attr._upb], + ) + return [cc_info] - return [DefaultInfo(files = depset(outs))] - -def _upb_proto_library_srcs_impl(ctx): - return _upb_proto_srcs_impl(ctx, ".upb") - -def _upb_proto_reflection_library_srcs_impl(ctx): - return _upb_proto_srcs_impl(ctx, ".upbdefs") +# upb_proto_library() ########################################################## -_upb_proto_library_srcs = rule( +_upb_proto_library_aspect = aspect( attrs = { - "upbc": attr.label( + "_upbc": attr.label( executable = True, cfg = "host", + default = ":protoc-gen-upb", ), - "protoc": attr.label( + "_protoc": attr.label( executable = True, cfg = "host", default = map_dep("@com_google_protobuf//:protoc"), ), - "deps": attr.label_list(), + "_cc_toolchain": attr.label(default = "@bazel_tools//tools/cpp:current_cc_toolchain"), + "_upb": attr.label(default = ":upb"), + "_ext": attr.string(default = ".upb"), }, - implementation = _upb_proto_library_srcs_impl, + implementation = _upb_proto_aspect_impl, + attr_aspects = ["deps"], + fragments = ["cpp"], ) -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"], - ) +upb_proto_library = rule( + output_to_genfiles = True, + implementation = _upb_proto_rule_impl, + attrs = { + "deps": attr.label_list( + aspects = [_upb_proto_library_aspect], + allow_rules = ["proto_library"], + providers = [ProtoInfo], + ), + }, +) -_upb_proto_reflection_library_srcs = rule( +# upb_proto_srcs() ############################################################# + +def _upb_proto_srcs_impl(ctx): + srcs = [] + hdrs = [] + for dep in ctx.attr.deps: + if hasattr(dep, "proto"): + proto_info = dep[ProtoInfo] + files = _compile_upb_protos(ctx, proto_info, proto_info.transitive_sources, ctx.attr.ext) + srcs += files.srcs + hdrs += files.hdrs + return [ + SrcList(srcs = srcs, hdrs = hdrs), + DefaultInfo(files = depset(srcs + hdrs)), + ] + +upb_proto_srcs = rule( attrs = { - "upbc": attr.label( + "_upbc": attr.label( executable = True, cfg = "host", + default = ":protoc-gen-upb", ), - "protoc": attr.label( + "_protoc": attr.label( executable = True, cfg = "host", default = map_dep("@com_google_protobuf//:protoc"), ), "deps": attr.label_list(), + "ext": attr.string(default = ".upb") }, - implementation = _upb_proto_reflection_library_srcs_impl, + implementation = _upb_proto_srcs_impl, ) -def upb_proto_reflection_library(name, deps, upbc): +# upb_proto_reflection_library() ############################################### + +def upb_proto_reflection_library(name, deps): srcs_rule = name + "_defsrcs.cc" - _upb_proto_reflection_library_srcs( + upb_proto_srcs( name = srcs_rule, - upbc = upbc, deps = deps, + ext = ".upbdefs", ) native.cc_library( name = name, diff --git a/google/protobuf/descriptor.upb.c b/generated_for_cmake/google/protobuf/descriptor.upb.c index 25fd1e1..61b9299 100644 --- a/google/protobuf/descriptor.upb.c +++ b/generated_for_cmake/google/protobuf/descriptor.upb.c @@ -251,7 +251,7 @@ static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = { &google_protobuf_UninterpretedOption_msginit, }; -static const upb_msglayout_field google_protobuf_FileOptions__fields[19] = { +static const upb_msglayout_field google_protobuf_FileOptions__fields[21] = { {1, UPB_SIZE(28, 32), 11, 0, 9, 1}, {8, UPB_SIZE(36, 48), 12, 0, 9, 1}, {9, UPB_SIZE(8, 8), 1, 0, 14, 1}, @@ -270,13 +270,15 @@ static const upb_msglayout_field google_protobuf_FileOptions__fields[19] = { {40, UPB_SIZE(76, 128), 17, 0, 9, 1}, {41, UPB_SIZE(84, 144), 18, 0, 9, 1}, {42, UPB_SIZE(24, 24), 10, 0, 8, 1}, - {999, UPB_SIZE(92, 160), 0, 0, 11, 3}, + {44, UPB_SIZE(92, 160), 19, 0, 9, 1}, + {45, UPB_SIZE(100, 176), 20, 0, 9, 1}, + {999, UPB_SIZE(108, 192), 0, 0, 11, 3}, }; const upb_msglayout google_protobuf_FileOptions_msginit = { &google_protobuf_FileOptions_submsgs[0], &google_protobuf_FileOptions__fields[0], - UPB_SIZE(96, 176), 19, false, + UPB_SIZE(112, 208), 21, false, }; static const upb_msglayout *const google_protobuf_MessageOptions_submsgs[1] = { diff --git a/google/protobuf/descriptor.upb.h b/generated_for_cmake/google/protobuf/descriptor.upb.h index b65fbd1..7f164fb 100644 --- a/google/protobuf/descriptor.upb.h +++ b/generated_for_cmake/google/protobuf/descriptor.upb.h @@ -1030,7 +1030,11 @@ UPB_INLINE bool google_protobuf_FileOptions_has_php_namespace(const google_proto UPB_INLINE upb_strview google_protobuf_FileOptions_php_namespace(const google_protobuf_FileOptions *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(84, 144)); } UPB_INLINE bool google_protobuf_FileOptions_has_php_generic_services(const google_protobuf_FileOptions *msg) { return _upb_has_field(msg, 10); } UPB_INLINE bool google_protobuf_FileOptions_php_generic_services(const google_protobuf_FileOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(24, 24)); } -UPB_INLINE const google_protobuf_UninterpretedOption* const* google_protobuf_FileOptions_uninterpreted_option(const google_protobuf_FileOptions *msg, size_t *len) { return (const google_protobuf_UninterpretedOption* const*)_upb_array_accessor(msg, UPB_SIZE(92, 160), len); } +UPB_INLINE bool google_protobuf_FileOptions_has_php_metadata_namespace(const google_protobuf_FileOptions *msg) { return _upb_has_field(msg, 19); } +UPB_INLINE upb_strview google_protobuf_FileOptions_php_metadata_namespace(const google_protobuf_FileOptions *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(92, 160)); } +UPB_INLINE bool google_protobuf_FileOptions_has_ruby_package(const google_protobuf_FileOptions *msg) { return _upb_has_field(msg, 20); } +UPB_INLINE upb_strview google_protobuf_FileOptions_ruby_package(const google_protobuf_FileOptions *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(100, 176)); } +UPB_INLINE const google_protobuf_UninterpretedOption* const* google_protobuf_FileOptions_uninterpreted_option(const google_protobuf_FileOptions *msg, size_t *len) { return (const google_protobuf_UninterpretedOption* const*)_upb_array_accessor(msg, UPB_SIZE(108, 192), len); } UPB_INLINE void google_protobuf_FileOptions_set_java_package(google_protobuf_FileOptions *msg, upb_strview value) { _upb_sethas(msg, 11); @@ -1104,16 +1108,24 @@ UPB_INLINE void google_protobuf_FileOptions_set_php_generic_services(google_prot _upb_sethas(msg, 10); UPB_FIELD_AT(msg, bool, UPB_SIZE(24, 24)) = value; } +UPB_INLINE void google_protobuf_FileOptions_set_php_metadata_namespace(google_protobuf_FileOptions *msg, upb_strview value) { + _upb_sethas(msg, 19); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(92, 160)) = value; +} +UPB_INLINE void google_protobuf_FileOptions_set_ruby_package(google_protobuf_FileOptions *msg, upb_strview value) { + _upb_sethas(msg, 20); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(100, 176)) = value; +} UPB_INLINE google_protobuf_UninterpretedOption** google_protobuf_FileOptions_mutable_uninterpreted_option(google_protobuf_FileOptions *msg, size_t *len) { - return (google_protobuf_UninterpretedOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(92, 160), len); + return (google_protobuf_UninterpretedOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(108, 192), len); } UPB_INLINE google_protobuf_UninterpretedOption** google_protobuf_FileOptions_resize_uninterpreted_option(google_protobuf_FileOptions *msg, size_t len, upb_arena *arena) { - return (google_protobuf_UninterpretedOption**)_upb_array_resize_accessor(msg, UPB_SIZE(92, 160), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (google_protobuf_UninterpretedOption**)_upb_array_resize_accessor(msg, UPB_SIZE(108, 192), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct google_protobuf_UninterpretedOption* google_protobuf_FileOptions_add_uninterpreted_option(google_protobuf_FileOptions *msg, upb_arena *arena) { struct google_protobuf_UninterpretedOption* sub = (struct google_protobuf_UninterpretedOption*)upb_msg_new(&google_protobuf_UninterpretedOption_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(92, 160), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(108, 192), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } diff --git a/upb/json/parser.c b/generated_for_cmake/upb/json/parser.c index 1e9d2fc..1e9d2fc 100644 --- a/upb/json/parser.c +++ b/generated_for_cmake/upb/json/parser.c diff --git a/google/protobuf/descriptor.pb b/google/protobuf/descriptor.pb Binary files differdeleted file mode 100644 index 0a74c99..0000000 --- a/google/protobuf/descriptor.pb +++ /dev/null diff --git a/google/protobuf/descriptor.proto b/google/protobuf/descriptor.proto deleted file mode 100644 index 4fd66e4..0000000 --- a/google/protobuf/descriptor.proto +++ /dev/null @@ -1,870 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Author: kenton@google.com (Kenton Varda) -// Based on original Protocol Buffers design by -// Sanjay Ghemawat, Jeff Dean, and others. -// -// The messages in this file describe the definitions found in .proto files. -// A valid .proto file can be translated directly to a FileDescriptorProto -// without any other information (e.g. without reading its imports). - - -syntax = "proto2"; - -package google.protobuf; -option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "DescriptorProtos"; -option csharp_namespace = "Google.Protobuf.Reflection"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; - -// descriptor.proto must be optimized for speed because reflection-based -// algorithms don't work during bootstrapping. -option optimize_for = SPEED; - -// The protocol compiler can output a FileDescriptorSet containing the .proto -// files it parses. -message FileDescriptorSet { - repeated FileDescriptorProto file = 1; -} - -// Describes a complete .proto file. -message FileDescriptorProto { - optional string name = 1; // file name, relative to root of source tree - optional string package = 2; // e.g. "foo", "foo.bar", etc. - - // Names of files imported by this file. - repeated string dependency = 3; - // Indexes of the public imported files in the dependency list above. - repeated int32 public_dependency = 10; - // Indexes of the weak imported files in the dependency list. - // For Google-internal migration only. Do not use. - repeated int32 weak_dependency = 11; - - // All top-level definitions in this file. - repeated DescriptorProto message_type = 4; - repeated EnumDescriptorProto enum_type = 5; - repeated ServiceDescriptorProto service = 6; - repeated FieldDescriptorProto extension = 7; - - optional FileOptions options = 8; - - // This field contains optional information about the original source code. - // You may safely remove this entire field without harming runtime - // functionality of the descriptors -- the information is needed only by - // development tools. - optional SourceCodeInfo source_code_info = 9; - - // The syntax of the proto file. - // The supported values are "proto2" and "proto3". - optional string syntax = 12; -} - -// Describes a message type. -message DescriptorProto { - optional string name = 1; - - repeated FieldDescriptorProto field = 2; - repeated FieldDescriptorProto extension = 6; - - repeated DescriptorProto nested_type = 3; - repeated EnumDescriptorProto enum_type = 4; - - message ExtensionRange { - optional int32 start = 1; - optional int32 end = 2; - - optional ExtensionRangeOptions options = 3; - } - repeated ExtensionRange extension_range = 5; - - repeated OneofDescriptorProto oneof_decl = 8; - - optional MessageOptions options = 7; - - // Range of reserved tag numbers. Reserved tag numbers may not be used by - // fields or extension ranges in the same message. Reserved ranges may - // not overlap. - message ReservedRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Exclusive. - } - repeated ReservedRange reserved_range = 9; - // Reserved field names, which may not be used by fields in the same message. - // A given name may only be reserved once. - repeated string reserved_name = 10; -} - -message ExtensionRangeOptions { - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -// Describes a field within a message. -message FieldDescriptorProto { - enum Type { - // 0 is reserved for errors. - // Order is weird for historical reasons. - TYPE_DOUBLE = 1; - TYPE_FLOAT = 2; - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if - // negative values are likely. - TYPE_INT64 = 3; - TYPE_UINT64 = 4; - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if - // negative values are likely. - TYPE_INT32 = 5; - TYPE_FIXED64 = 6; - TYPE_FIXED32 = 7; - TYPE_BOOL = 8; - TYPE_STRING = 9; - // Tag-delimited aggregate. - // Group type is deprecated and not supported in proto3. However, Proto3 - // implementations should still be able to parse the group wire format and - // treat group fields as unknown fields. - TYPE_GROUP = 10; - TYPE_MESSAGE = 11; // Length-delimited aggregate. - - // New in version 2. - TYPE_BYTES = 12; - TYPE_UINT32 = 13; - TYPE_ENUM = 14; - TYPE_SFIXED32 = 15; - TYPE_SFIXED64 = 16; - TYPE_SINT32 = 17; // Uses ZigZag encoding. - TYPE_SINT64 = 18; // Uses ZigZag encoding. - }; - - enum Label { - // 0 is reserved for errors - LABEL_OPTIONAL = 1; - LABEL_REQUIRED = 2; - LABEL_REPEATED = 3; - }; - - optional string name = 1; - optional int32 number = 3; - optional Label label = 4; - - // If type_name is set, this need not be set. If both this and type_name - // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. - optional Type type = 5; - - // For message and enum types, this is the name of the type. If the name - // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping - // rules are used to find the type (i.e. first the nested types within this - // message are searched, then within the parent, on up to the root - // namespace). - optional string type_name = 6; - - // For extensions, this is the name of the type being extended. It is - // resolved in the same manner as type_name. - optional string extendee = 2; - - // For numeric types, contains the original text representation of the value. - // For booleans, "true" or "false". - // For strings, contains the default text contents (not escaped in any way). - // For bytes, contains the C escaped value. All bytes >= 128 are escaped. - // TODO(kenton): Base-64 encode? - optional string default_value = 7; - - // If set, gives the index of a oneof in the containing type's oneof_decl - // list. This field is a member of that oneof. - optional int32 oneof_index = 9; - - // JSON name of this field. The value is set by protocol compiler. If the - // user has set a "json_name" option on this field, that option's value - // will be used. Otherwise, it's deduced from the field's name by converting - // it to camelCase. - optional string json_name = 10; - - optional FieldOptions options = 8; -} - -// Describes a oneof. -message OneofDescriptorProto { - optional string name = 1; - optional OneofOptions options = 2; -} - -// Describes an enum type. -message EnumDescriptorProto { - optional string name = 1; - - repeated EnumValueDescriptorProto value = 2; - - optional EnumOptions options = 3; - - // Range of reserved numeric values. Reserved values may not be used by - // entries in the same enum. Reserved ranges may not overlap. - // - // Note that this is distinct from DescriptorProto.ReservedRange in that it - // is inclusive such that it can appropriately represent the entire int32 - // domain. - message EnumReservedRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Inclusive. - } - - // Range of reserved numeric values. Reserved numeric values may not be used - // by enum values in the same enum declaration. Reserved ranges may not - // overlap. - repeated EnumReservedRange reserved_range = 4; - - // Reserved enum value names, which may not be reused. A given name may only - // be reserved once. - repeated string reserved_name = 5; -} - -// Describes a value within an enum. -message EnumValueDescriptorProto { - optional string name = 1; - optional int32 number = 2; - - optional EnumValueOptions options = 3; -} - -// Describes a service. -message ServiceDescriptorProto { - optional string name = 1; - repeated MethodDescriptorProto method = 2; - - optional ServiceOptions options = 3; -} - -// Describes a method of a service. -message MethodDescriptorProto { - optional string name = 1; - - // Input and output type names. These are resolved in the same way as - // FieldDescriptorProto.type_name, but must refer to a message type. - optional string input_type = 2; - optional string output_type = 3; - - optional MethodOptions options = 4; - - // Identifies if client streams multiple client messages - optional bool client_streaming = 5 [default=false]; - // Identifies if server streams multiple server messages - optional bool server_streaming = 6 [default=false]; -} - - -// =================================================================== -// Options - -// Each of the definitions above may have "options" attached. These are -// just annotations which may cause code to be generated slightly differently -// or may contain hints for code that manipulates protocol messages. -// -// Clients may define custom options as extensions of the *Options messages. -// These extensions may not yet be known at parsing time, so the parser cannot -// store the values in them. Instead it stores them in a field in the *Options -// message called uninterpreted_option. This field must have the same name -// across all *Options messages. We then use this field to populate the -// extensions when we build a descriptor, at which point all protos have been -// parsed and so all extensions are known. -// -// Extension numbers for custom options may be chosen as follows: -// * For options which will only be used within a single application or -// organization, or for experimental options, use field numbers 50000 -// through 99999. It is up to you to ensure that you do not use the -// same number for multiple options. -// * For options which will be published and used publicly by multiple -// independent entities, e-mail protobuf-global-extension-registry@google.com -// to reserve extension numbers. Simply provide your project name (e.g. -// Objective-C plugin) and your project website (if available) -- there's no -// need to explain how you intend to use them. Usually you only need one -// extension number. You can declare multiple options with only one extension -// number by putting them in a sub-message. See the Custom Options section of -// the docs for examples: -// https://developers.google.com/protocol-buffers/docs/proto#options -// If this turns out to be popular, a web service will be set up -// to automatically assign option numbers. - - -message FileOptions { - - // Sets the Java package where classes generated from this .proto will be - // placed. By default, the proto package is used, but this is often - // inappropriate because proto packages do not normally start with backwards - // domain names. - optional string java_package = 1; - - - // If set, all the classes from the .proto file are wrapped in a single - // outer class with the given name. This applies to both Proto1 - // (equivalent to the old "--one_java_file" option) and Proto2 (where - // a .proto always translates to a single class, but you may want to - // explicitly choose the class name). - optional string java_outer_classname = 8; - - // If set true, then the Java code generator will generate a separate .java - // file for each top-level message, enum, and service defined in the .proto - // file. Thus, these types will *not* be nested inside the outer class - // named by java_outer_classname. However, the outer class will still be - // generated to contain the file's getDescriptor() method as well as any - // top-level extensions defined in the file. - optional bool java_multiple_files = 10 [default=false]; - - // This option does nothing. - optional bool java_generate_equals_and_hash = 20 [deprecated=true]; - - // If set true, then the Java2 code generator will generate code that - // throws an exception whenever an attempt is made to assign a non-UTF-8 - // byte sequence to a string field. - // Message reflection will do the same. - // However, an extension field still accepts non-UTF-8 byte sequences. - // This option has no effect on when used with the lite runtime. - optional bool java_string_check_utf8 = 27 [default=false]; - - - // Generated classes can be optimized for speed or code size. - enum OptimizeMode { - SPEED = 1; // Generate complete code for parsing, serialization, - // etc. - CODE_SIZE = 2; // Use ReflectionOps to implement these methods. - LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. - } - optional OptimizeMode optimize_for = 9 [default=SPEED]; - - // Sets the Go package where structs generated from this .proto will be - // placed. If omitted, the Go package will be derived from the following: - // - The basename of the package import path, if provided. - // - Otherwise, the package statement in the .proto file, if present. - // - Otherwise, the basename of the .proto file, without extension. - optional string go_package = 11; - - - - // Should generic services be generated in each language? "Generic" services - // are not specific to any particular RPC system. They are generated by the - // main code generators in each language (without additional plugins). - // Generic services were the only kind of service generation supported by - // early versions of google.protobuf. - // - // Generic services are now considered deprecated in favor of using plugins - // that generate code specific to your particular RPC system. Therefore, - // these default to false. Old code which depends on generic services should - // explicitly set them to true. - optional bool cc_generic_services = 16 [default=false]; - optional bool java_generic_services = 17 [default=false]; - optional bool py_generic_services = 18 [default=false]; - optional bool php_generic_services = 42 [default=false]; - - // Is this file deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for everything in the file, or it will be completely ignored; in the very - // least, this is a formalization for deprecating files. - optional bool deprecated = 23 [default=false]; - - // Enables the use of arenas for the proto messages in this file. This applies - // only to generated classes for C++. - optional bool cc_enable_arenas = 31 [default=false]; - - - // Sets the objective c class prefix which is prepended to all objective c - // generated classes from this .proto. There is no default. - optional string objc_class_prefix = 36; - - // Namespace for generated classes; defaults to the package. - optional string csharp_namespace = 37; - - // By default Swift generators will take the proto package and CamelCase it - // replacing '.' with underscore and use that to prefix the types/symbols - // defined. When this options is provided, they will use this value instead - // to prefix the types/symbols defined. - optional string swift_prefix = 39; - - // Sets the php class prefix which is prepended to all php generated classes - // from this .proto. Default is empty. - optional string php_class_prefix = 40; - - // Use this option to change the namespace of php generated classes. Default - // is empty. When this option is empty, the package name will be used for - // determining the namespace. - optional string php_namespace = 41; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; - - reserved 38; -} - -message MessageOptions { - // Set true to use the old proto1 MessageSet wire format for extensions. - // This is provided for backwards-compatibility with the MessageSet wire - // format. You should not use this for any other reason: It's less - // efficient, has fewer features, and is more complicated. - // - // The message must be defined exactly as follows: - // message Foo { - // option message_set_wire_format = true; - // extensions 4 to max; - // } - // Note that the message cannot have any defined fields; MessageSets only - // have extensions. - // - // All extensions of your type must be singular messages; e.g. they cannot - // be int32s, enums, or repeated messages. - // - // Because this is an option, the above two restrictions are not enforced by - // the protocol compiler. - optional bool message_set_wire_format = 1 [default=false]; - - // Disables the generation of the standard "descriptor()" accessor, which can - // conflict with a field of the same name. This is meant to make migration - // from proto1 easier; new code should avoid fields named "descriptor". - optional bool no_standard_descriptor_accessor = 2 [default=false]; - - // Is this message deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the message, or it will be completely ignored; in the very least, - // this is a formalization for deprecating messages. - optional bool deprecated = 3 [default=false]; - - // Whether the message is an automatically generated map entry type for the - // maps field. - // - // For maps fields: - // map<KeyType, ValueType> map_field = 1; - // The parsed descriptor looks like: - // message MapFieldEntry { - // option map_entry = true; - // optional KeyType key = 1; - // optional ValueType value = 2; - // } - // repeated MapFieldEntry map_field = 1; - // - // Implementations may choose not to generate the map_entry=true message, but - // use a native map in the target language to hold the keys and values. - // The reflection APIs in such implementions still need to work as - // if the field is a repeated message field. - // - // NOTE: Do not set the option in .proto files. Always use the maps syntax - // instead. The option should only be implicitly set by the proto compiler - // parser. - optional bool map_entry = 7; - - reserved 8; // javalite_serializable - reserved 9; // javanano_as_lite - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message FieldOptions { - // The ctype option instructs the C++ code generator to use a different - // representation of the field than it normally would. See the specific - // options below. This option is not yet implemented in the open source - // release -- sorry, we'll try to include it in a future version! - optional CType ctype = 1 [default = STRING]; - enum CType { - // Default mode. - STRING = 0; - - CORD = 1; - - STRING_PIECE = 2; - } - // The packed option can be enabled for repeated primitive fields to enable - // a more efficient representation on the wire. Rather than repeatedly - // writing the tag and type for each element, the entire array is encoded as - // a single length-delimited blob. In proto3, only explicit setting it to - // false will avoid using packed encoding. - optional bool packed = 2; - - // The jstype option determines the JavaScript type used for values of the - // field. The option is permitted only for 64 bit integral and fixed types - // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING - // is represented as JavaScript string, which avoids loss of precision that - // can happen when a large value is converted to a floating point JavaScript. - // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to - // use the JavaScript "number" type. The behavior of the default option - // JS_NORMAL is implementation dependent. - // - // This option is an enum to permit additional types to be added, e.g. - // goog.math.Integer. - optional JSType jstype = 6 [default = JS_NORMAL]; - enum JSType { - // Use the default type. - JS_NORMAL = 0; - - // Use JavaScript strings. - JS_STRING = 1; - - // Use JavaScript numbers. - JS_NUMBER = 2; - } - - // Should this field be parsed lazily? Lazy applies only to message-type - // fields. It means that when the outer message is initially parsed, the - // inner message's contents will not be parsed but instead stored in encoded - // form. The inner message will actually be parsed when it is first accessed. - // - // This is only a hint. Implementations are free to choose whether to use - // eager or lazy parsing regardless of the value of this option. However, - // setting this option true suggests that the protocol author believes that - // using lazy parsing on this field is worth the additional bookkeeping - // overhead typically needed to implement it. - // - // This option does not affect the public interface of any generated code; - // all method signatures remain the same. Furthermore, thread-safety of the - // interface is not affected by this option; const methods remain safe to - // call from multiple threads concurrently, while non-const methods continue - // to require exclusive access. - // - // - // Note that implementations may choose not to check required fields within - // a lazy sub-message. That is, calling IsInitialized() on the outer message - // may return true even if the inner message has missing required fields. - // This is necessary because otherwise the inner message would have to be - // parsed in order to perform the check, defeating the purpose of lazy - // parsing. An implementation which chooses not to check required fields - // must be consistent about it. That is, for any particular sub-message, the - // implementation must either *always* check its required fields, or *never* - // check its required fields, regardless of whether or not the message has - // been parsed. - optional bool lazy = 5 [default=false]; - - // Is this field deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for accessors, or it will be completely ignored; in the very least, this - // is a formalization for deprecating fields. - optional bool deprecated = 3 [default=false]; - - // For Google-internal migration only. Do not use. - optional bool weak = 10 [default=false]; - - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; - - reserved 4; // removed jtype -} - -message OneofOptions { - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message EnumOptions { - - // Set this option to true to allow mapping different tag names to the same - // value. - optional bool allow_alias = 2; - - // Is this enum deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum, or it will be completely ignored; in the very least, this - // is a formalization for deprecating enums. - optional bool deprecated = 3 [default=false]; - - reserved 5; // javanano_as_lite - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message EnumValueOptions { - // Is this enum value deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum value, or it will be completely ignored; in the very least, - // this is a formalization for deprecating enum values. - optional bool deprecated = 1 [default=false]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message ServiceOptions { - - // Note: Field numbers 1 through 32 are reserved for Google's internal RPC - // framework. We apologize for hoarding these numbers to ourselves, but - // we were already using them long before we decided to release Protocol - // Buffers. - - // Is this service deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the service, or it will be completely ignored; in the very least, - // this is a formalization for deprecating services. - optional bool deprecated = 33 [default=false]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message MethodOptions { - - // Note: Field numbers 1 through 32 are reserved for Google's internal RPC - // framework. We apologize for hoarding these numbers to ourselves, but - // we were already using them long before we decided to release Protocol - // Buffers. - - // Is this method deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the method, or it will be completely ignored; in the very least, - // this is a formalization for deprecating methods. - optional bool deprecated = 33 [default=false]; - - // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, - // or neither? HTTP based RPC implementation may choose GET verb for safe - // methods, and PUT verb for idempotent methods instead of the default POST. - enum IdempotencyLevel { - IDEMPOTENCY_UNKNOWN = 0; - NO_SIDE_EFFECTS = 1; // implies idempotent - IDEMPOTENT = 2; // idempotent, but may have side effects - } - optional IdempotencyLevel idempotency_level = - 34 [default=IDEMPOTENCY_UNKNOWN]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - - -// A message representing a option the parser does not recognize. This only -// appears in options protos created by the compiler::Parser class. -// DescriptorPool resolves these when building Descriptor objects. Therefore, -// options protos in descriptor objects (e.g. returned by Descriptor::options(), -// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions -// in them. -message UninterpretedOption { - // The name of the uninterpreted option. Each string represents a segment in - // a dot-separated name. is_extension is true iff a segment represents an - // extension (denoted with parentheses in options specs in .proto files). - // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents - // "foo.(bar.baz).qux". - message NamePart { - required string name_part = 1; - required bool is_extension = 2; - } - repeated NamePart name = 2; - - // The value of the uninterpreted option, in whatever type the tokenizer - // identified it as during parsing. Exactly one of these should be set. - optional string identifier_value = 3; - optional uint64 positive_int_value = 4; - optional int64 negative_int_value = 5; - optional double double_value = 6; - optional bytes string_value = 7; - optional string aggregate_value = 8; -} - -// =================================================================== -// Optional source code info - -// Encapsulates information about the original source file from which a -// FileDescriptorProto was generated. -message SourceCodeInfo { - // A Location identifies a piece of source code in a .proto file which - // corresponds to a particular definition. This information is intended - // to be useful to IDEs, code indexers, documentation generators, and similar - // tools. - // - // For example, say we have a file like: - // message Foo { - // optional string foo = 1; - // } - // Let's look at just the field definition: - // optional string foo = 1; - // ^ ^^ ^^ ^ ^^^ - // a bc de f ghi - // We have the following locations: - // span path represents - // [a,i) [ 4, 0, 2, 0 ] The whole field definition. - // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). - // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). - // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). - // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). - // - // Notes: - // - A location may refer to a repeated field itself (i.e. not to any - // particular index within it). This is used whenever a set of elements are - // logically enclosed in a single code segment. For example, an entire - // extend block (possibly containing multiple extension definitions) will - // have an outer location whose path refers to the "extensions" repeated - // field without an index. - // - Multiple locations may have the same path. This happens when a single - // logical declaration is spread out across multiple places. The most - // obvious example is the "extend" block again -- there may be multiple - // extend blocks in the same scope, each of which will have the same path. - // - A location's span is not always a subset of its parent's span. For - // example, the "extendee" of an extension declaration appears at the - // beginning of the "extend" block and is shared by all extensions within - // the block. - // - Just because a location's span is a subset of some other location's span - // does not mean that it is a descendent. For example, a "group" defines - // both a type and a field in a single declaration. Thus, the locations - // corresponding to the type and field and their components will overlap. - // - Code which tries to interpret locations should probably be designed to - // ignore those that it doesn't understand, as more types of locations could - // be recorded in the future. - repeated Location location = 1; - message Location { - // Identifies which part of the FileDescriptorProto was defined at this - // location. - // - // Each element is a field number or an index. They form a path from - // the root FileDescriptorProto to the place where the definition. For - // example, this path: - // [ 4, 3, 2, 7, 1 ] - // refers to: - // file.message_type(3) // 4, 3 - // .field(7) // 2, 7 - // .name() // 1 - // This is because FileDescriptorProto.message_type has field number 4: - // repeated DescriptorProto message_type = 4; - // and DescriptorProto.field has field number 2: - // repeated FieldDescriptorProto field = 2; - // and FieldDescriptorProto.name has field number 1: - // optional string name = 1; - // - // Thus, the above path gives the location of a field name. If we removed - // the last element: - // [ 4, 3, 2, 7 ] - // this path refers to the whole field declaration (from the beginning - // of the label to the terminating semicolon). - repeated int32 path = 1 [packed=true]; - - // Always has exactly three or four elements: start line, start column, - // end line (optional, otherwise assumed same as start line), end column. - // These are packed into a single field for efficiency. Note that line - // and column numbers are zero-based -- typically you will want to add - // 1 to each before displaying to a user. - repeated int32 span = 2 [packed=true]; - - // If this SourceCodeInfo represents a complete declaration, these are any - // comments appearing before and after the declaration which appear to be - // attached to the declaration. - // - // A series of line comments appearing on consecutive lines, with no other - // tokens appearing on those lines, will be treated as a single comment. - // - // leading_detached_comments will keep paragraphs of comments that appear - // before (but not connected to) the current element. Each paragraph, - // separated by empty lines, will be one comment element in the repeated - // field. - // - // Only the comment content is provided; comment markers (e.g. //) are - // stripped out. For block comments, leading whitespace and an asterisk - // will be stripped from the beginning of each line other than the first. - // Newlines are included in the output. - // - // Examples: - // - // optional int32 foo = 1; // Comment attached to foo. - // // Comment attached to bar. - // optional int32 bar = 2; - // - // optional string baz = 3; - // // Comment attached to baz. - // // Another line attached to baz. - // - // // Comment attached to qux. - // // - // // Another line attached to qux. - // optional double qux = 4; - // - // // Detached comment for corge. This is not leading or trailing comments - // // to qux or corge because there are blank lines separating it from - // // both. - // - // // Detached comment for corge paragraph 2. - // - // optional string corge = 5; - // /* Block comment attached - // * to corge. Leading asterisks - // * will be removed. */ - // /* Block comment attached to - // * grault. */ - // optional int32 grault = 6; - // - // // ignored detached comments. - optional string leading_comments = 3; - optional string trailing_comments = 4; - repeated string leading_detached_comments = 6; - } -} - -// Describes the relationship between generated code and its original source -// file. A GeneratedCodeInfo message is associated with only one generated -// source file, but may contain references to different source .proto files. -message GeneratedCodeInfo { - // An Annotation connects some span of text in generated code to an element - // of its generating .proto file. - repeated Annotation annotation = 1; - message Annotation { - // Identifies the element in the original source .proto file. This field - // is formatted the same as SourceCodeInfo.Location.path. - repeated int32 path = 1 [packed=true]; - - // Identifies the filesystem path to the original source .proto. - optional string source_file = 2; - - // Identifies the starting offset in bytes in the generated code - // that relates to the identified object. - optional int32 begin = 3; - - // Identifies the ending offset in bytes in the generated code that - // relates to the identified offset. The end offset should be one past - // the last relevant byte (so the length of the text = end - begin). - optional int32 end = 4; - } -} diff --git a/tests/json/enum_from_separate_file.proto b/tests/json/enum_from_separate_file.proto new file mode 100644 index 0000000..ceb9b42 --- /dev/null +++ b/tests/json/enum_from_separate_file.proto @@ -0,0 +1,9 @@ +syntax = "proto2"; + +import "tests/json/test.proto"; + +package upb.test.json; + +message ImportEnum { + optional MyEnum e = 1; +} diff --git a/tests/pb/test_encoder.cc b/tests/pb/test_encoder.cc index 3039767..c6544be 100644 --- a/tests/pb/test_encoder.cc +++ b/tests/pb/test_encoder.cc @@ -3,43 +3,25 @@ #include "tests/upb_test.h" #include "upb/bindings/stdc++/string.h" #include "google/protobuf/descriptor.upb.h" +#include "google/protobuf/descriptor.upbdefs.h" #include "upb/pb/decoder.h" #include "upb/pb/encoder.h" #include "upb/port_def.inc" - -std::string read_string(const char *filename) { - size_t len; - char *str = upb_readfile(filename, &len); - ASSERT(str); - if (!str) { return std::string(); } - std::string ret = std::string(str, len); - free(str); - return ret; -} +#include <iostream> void test_pb_roundtrip() { - std::string input = read_string("google/protobuf/descriptor.pb"); + std::string input( + google_protobuf_descriptor_proto_upbdefinit.descriptor.data, + google_protobuf_descriptor_proto_upbdefinit.descriptor.size); + std::cout << input.size() << "\n"; upb::SymbolTable symtab; upb::HandlerCache encoder_cache(upb::pb::EncoderPtr::NewCache()); upb::pb::CodeCache decoder_cache(&encoder_cache); upb::Arena arena; - google_protobuf_FileDescriptorSet *set = - google_protobuf_FileDescriptorSet_parse(input.c_str(), input.size(), - arena.ptr()); - ASSERT(set); - size_t n; - const google_protobuf_FileDescriptorProto *const *files = - google_protobuf_FileDescriptorSet_file(set, &n); - ASSERT(n == 1); upb::Status status; - upb::FileDefPtr file_def = symtab.AddFile(files[0], &status); - if (!file_def) { - fprintf(stderr, "Error building def: %s\n", status.error_message()); - ASSERT(false); - } - upb::MessageDefPtr md = - symtab.LookupMessage("google.protobuf.FileDescriptorSet"); + upb::MessageDefPtr md( + google_protobuf_FileDescriptorProto_getmsgdef(symtab.ptr())); ASSERT(md); const upb::Handlers *encoder_handlers = encoder_cache.Get(md); ASSERT(encoder_handlers); diff --git a/tools/amalgamate.py b/tools/amalgamate.py index ed5f665..16b34aa 100755 --- a/tools/amalgamate.py +++ b/tools/amalgamate.py @@ -2,6 +2,7 @@ import sys import re +import os INCLUDE_RE = re.compile('^#include "([^"]*)"$') @@ -10,8 +11,8 @@ def parse_include(line): return match.groups()[0] if match else None class Amalgamator: - def __init__(self, include_path, output_path): - self.include_path = include_path + def __init__(self, output_path): + self.include_paths = ["."] self.included = set(["upb/port_def.inc", "upb/port_undef.inc"]) self.output_h = open(output_path + "upb.h", "w") self.output_c = open(output_path + "upb.c", "w") @@ -24,18 +25,32 @@ class Amalgamator: self.output_h.write('#include <stdint.h>') self.output_h.write(open("upb/port_def.inc").read()) + def add_include_path(self, path): + self.include_paths.append(path) + def finish(self): self.output_c.write(open("upb/port_undef.inc").read()) self.output_h.write(open("upb/port_undef.inc").read()) def _process_file(self, infile_name, outfile): - for line in open(infile_name): + file = None + for path in self.include_paths: + try: + full_path = os.path.join(path, infile_name) + file = open(full_path) + break + except IOError: + pass + if not file: + raise RuntimeError("Couldn't open file " + infile_name) + + for line in file: include = parse_include(line) if include is not None and (include.startswith("upb") or include.startswith("google")): if include not in self.included: self.included.add(include) - self._add_header(self.include_path + include) + self._add_header(include) else: outfile.write(line) @@ -47,12 +62,20 @@ class Amalgamator: # ---- main ---- -include_path = sys.argv[1] -output_path = sys.argv[2] -amalgamator = Amalgamator(include_path, output_path) +output_path = sys.argv[1] +amalgamator = Amalgamator(output_path) +files = [] + +for arg in sys.argv[3:]: + arg = arg.strip() + if arg.startswith("-I"): + amalgamator.add_include_path(arg[2:]) + elif arg.endswith(".h") or arg.endswith(".inc"): + pass + else: + files.append(arg) -for filename in sys.argv[3:]: - if filename.endswith(".h") or filename.endswith(".inc"): - amalgamator.add_src(filename.strip()) +for filename in files: + amalgamator.add_src(filename) amalgamator.finish() diff --git a/tools/make_cmakelists.py b/tools/make_cmakelists.py index 86544cb..e320be4 100755 --- a/tools/make_cmakelists.py +++ b/tools/make_cmakelists.py @@ -11,6 +11,7 @@ from __future__ import print_function import sys import textwrap +import os def StripColons(deps): return map(lambda x: x[1:], deps) @@ -38,12 +39,20 @@ class BuildFileFunctions(object): if kwargs["name"] == "amalgamation" or kwargs["name"] == "upbc_generator": return files = kwargs.get("srcs", []) + kwargs.get("hdrs", []) + found_files = [] + for file in files: + if os.path.isfile(file): + found_files.append(file) + elif os.path.isfile("generated/" + file): + found_files.append("generated/" + file) + else: + print("Warning: no such file: " + file) 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) + "\n ".join(found_files) ) self._add_deps(kwargs) else: @@ -125,6 +134,9 @@ class BuildFileFunctions(object): def upb_proto_reflection_library(self, **kwargs): pass + def upb_proto_srcs(self, **kwargs): + pass + def genrule(self, **kwargs): pass @@ -140,6 +152,9 @@ class BuildFileFunctions(object): def licenses(self, *args): pass + def filegroup(self, **kwargs): + pass + def map_dep(self, arg): return arg @@ -224,6 +239,7 @@ class Converter(object): endif() include_directories(.) + include_directories(generated_for_cmake) include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(APPLE) diff --git a/travis.sh b/travis.sh deleted file mode 100755 index e8323df..0000000 --- a/travis.sh +++ /dev/null @@ -1,196 +0,0 @@ -#!/bin/bash - -install_protoc() { - sudo apt-get install protobuf-compiler - protoc --version || true -} - -# Bare build: no dependencies installed, no JIT enabled. -bare_install() { - : -} -bare_script() { - make -j12 tests - make test -} - -# Bare JIT build: no dependencies installed, but JIT enabled. -barejit_install() { - : -} -barejit_script() { - make -j12 tests WITH_JIT=yes - make test -} - -# Build with strict warnings. -warnings_install() { - : -} -warnings_script() { - make -j12 default WITH_MAX_WARNINGS=yes - make -j12 tests WITH_MAX_WARNINGS=yes - make test -} - -# A 32-bit build. Can only test the core because any dependencies -# need to be available as 32-bit libs also, which gets hairy fast. -# Can't enable the JIT because it only supports x64. -core32_install() { - sudo apt-get update -qq - sudo apt-get install libc6-dev-i386 g++-multilib -} -core32_script() { - make -j12 tests USER_CPPFLAGS="$USER_CPPFLAGS -m32" - make test -} - -# A build of Lua and running of Lua tests. -lua_install() { - sudo apt-get update -qq - sudo apt-get install lua5.2 liblua5.2-dev -} -lua_script() { - make -j12 testlua USER_CPPFLAGS="$USER_CPPFLAGS `pkg-config lua5.2 --cflags`" -} - -# Test that generated files don't need to be regenerated. -# -# We would include the Ragel output here too, but we can't really guarantee -# that its output will be stable for multiple versions of the tool, and we -# don't want the test to be brittle. -genfiles_install() { - sudo apt-get update -qq - sudo apt-get install lua5.2 liblua5.2-dev - - # Need a recent version of protoc to compile proto3 files. - # .travis.yml will add this to our path - mkdir protoc - cd protoc - wget https://github.com/google/protobuf/releases/download/v3.0.0-beta-2/protoc-3.0.0-beta-2-linux-x86_64.zip - unzip protoc-3.0.0-beta-2-linux-x86_64.zip - cd .. -} -genfiles_script() { - protoc --version || true - - # Avoid regenerating descriptor.pb, since its output can vary based on the - # version of protoc. - touch upb/descriptor/descriptor.pb - - make -j12 genfiles USER_CPPFLAGS="$USER_CPPFLAGS `pkg-config lua5.2 --cflags`" - # Will fail if any differences were observed. - git diff --exit-code -} - -# Tests the ndebug build. -ndebug_install() { - sudo apt-get update -qq - sudo apt-get install lua5.2 liblua5.2-dev libprotobuf-dev - install_protoc -} -ndebug_script() { - # Override of USER_CPPFLAGS removes -UNDEBUG. - export USER_CPPFLAGS="`pkg-config lua5.2 --cflags` -g -fomit-frame-pointer" - make -j12 tests testlua WITH_JIT=yes - make test -} - -# Tests the amalgamated build (this ensures that the different .c files -# don't have symbols or macros that conflict with each other. -amalgamated_install() { - : -} -amalgamated_script() { - # Override of USER_CPPFLAGS removes -UNDEBUG. - export USER_CPPFLAGS="-UNDEBUG" - make amalgamated -} - -# A run that executes with coverage support and uploads to coveralls.io -coverage_install() { - sudo apt-get update -qq - sudo apt-get install libprotobuf-dev lua5.2 liblua5.2-dev - install_protoc - sudo pip install cpp-coveralls -} -coverage_script() { - export USER_CPPFLAGS="--coverage -O0 `pkg-config lua5.2 --cflags`" - make -j12 tests testlua WITH_JIT=yes - make test -} -coverage_after_success() { - coveralls --exclude dynasm --exclude tests --exclude upb/bindings/linux --gcov-options '\-lp' -} - -set -e -set -x - -if [ "$1" == "local" ]; then - run_config() { - make clean - echo - echo "travis.sh: TESTING CONFIGURATION $1 ===============================" - echo - UPB_TRAVIS_BUILD=$1 ./travis.sh script - } - # Run all configurations serially locally to test before pushing a pull - # request. - export CC=gcc - export CXX=g++ - run_config "bare" - run_config "barejit" - run_config "core32" - run_config "lua" - run_config "ndebug" - run_config "genfiles" - run_config "amalgamated" - exit -fi - -$CC --version -$CXX --version - -# Uncomment to enable uploading failure logs to S3. -# UPLOAD_TO_S3=true - -if [ "$1" == "after_failure" ] && [ "$UPLOAD_TO_S3" == "true" ]; then - # Upload failing tree to S3. - curl -sL https://raw.githubusercontent.com/travis-ci/artifacts/master/install | bash - PATH="$PATH:$HOME/bin" - export ARTIFACTS_BUCKET=haberman-upb-travis-artifacts2 - ARCHIVE=failing-artifacts.tar.gz - tar zcvf $ARCHIVE $(git ls-files -o) - artifacts upload $ARCHIVE - exit -fi - -if [ "$1" == "after_success" ] && [ "$UPB_TRAVIS_BUILD" != "coverage" ]; then - # after_success is only used for coverage. - exit -fi - -if [ "$CC" != "gcc" ] && [ "$UPB_TRAVIS_BUILD" == "coverage" ]; then - # coverage build only works for GCC. - exit -fi - -# Enable asserts and ref debugging (though some configurations override this). -export USER_CPPFLAGS="-UNDEBUG -DUPB_DEBUG_REFS -DUPB_THREAD_UNSAFE -DUPB_DEBUG_TABLE -g" - -if [ "$CC" == "gcc" ]; then - # For the GCC build test loading JIT code via SO. For the Clang build test - # loading it in the normal way. - export USER_CPPFLAGS="$USER_CPPFLAGS -DUPB_JIT_LOAD_SO" -fi - -# TODO(haberman): Test UPB_DUMP_BYTECODE? We don't right now because it is so -# noisy. - -# Enable verbose build. -export Q= - -# Make any compiler warning fail the build. -export UPB_FAIL_WARNINGS=true - -eval ${UPB_TRAVIS_BUILD}_${1} diff --git a/upb/decode.c b/upb/decode.c index 96622f9..79e1d6d 100644 --- a/upb/decode.c +++ b/upb/decode.c @@ -512,7 +512,7 @@ static bool upb_decode_field(upb_decstate *d, upb_decframe *frame) { frame->limit = d->ptr; return true; default: - return false; + CHK(false); } } else { CHK(field_number != 0); |