diff --git a/BUILD b/BUILD index d4480d1047..19a69613e4 100644 --- a/BUILD +++ b/BUILD @@ -127,6 +127,7 @@ cc_library( "upb/mem/arena.h", "upb/message/extension_internal.h", "upb/message/message.h", + "upb/mini_table/extension_registry.h", "upb/msg.h", "upb/status.h", "upb/string_view.h", @@ -140,7 +141,6 @@ cc_library( deps = [ ":base", ":collections_internal", - ":extension_registry", ":fastdecode", ":hash", ":lex", @@ -168,30 +168,12 @@ cc_library( deps = [":port"], ) -cc_library( - name = "extension_registry", - srcs = [ - "upb/extension_registry.c", - ], - hdrs = [ - "upb/extension_registry.h", - ], - copts = UPB_DEFAULT_COPTS, - visibility = ["//visibility:public"], - deps = [ - ":base", - ":hash", - ":mem", - ":mini_table_internal", - ":port", - ], -) - cc_library( name = "mini_table", hdrs = [ "upb/mini_table.h", "upb/mini_table/decode.h", + "upb/mini_table/extension_registry.h", "upb/mini_table/types.h", ], copts = UPB_DEFAULT_COPTS, @@ -210,6 +192,7 @@ cc_library( "upb/mini_table/common.c", "upb/mini_table/decode.c", "upb/mini_table/encode.c", + "upb/mini_table/extension_registry.c", ], hdrs = [ "upb/mini_table/common.h", @@ -219,6 +202,7 @@ cc_library( "upb/mini_table/encode_internal.hpp", "upb/mini_table/enum_internal.h", "upb/mini_table/extension_internal.h", + "upb/mini_table/extension_registry.h", "upb/mini_table/field_internal.h", "upb/mini_table/file_internal.h", "upb/mini_table/message_internal.h", @@ -263,7 +247,6 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":base", - ":extension_registry", ":hash", ":mem", ":mini_table_internal", @@ -299,7 +282,6 @@ cc_test( ], deps = [ ":collections_internal", - ":extension_registry", ":hash", ":message_internal", ":mini_table_internal", @@ -334,7 +316,6 @@ cc_library( deps = [ ":base", ":collections_internal", - ":extension_registry", ":hash", ":mem_internal", ":message_internal", @@ -484,7 +465,6 @@ cc_library( visibility = ["//:__subpackages__"], deps = [ ":base", - ":extension_registry", ":hash", ":mem", ":message_internal", @@ -1056,9 +1036,9 @@ cc_library( copts = UPB_DEFAULT_COPTS, visibility = ["//visibility:public"], deps = [ - ":extension_registry", ":mem", ":message_internal", + ":mini_table", ":port", ":wire_internal", ], @@ -1085,7 +1065,6 @@ cc_library( deps = [ ":base", ":collections_internal", - ":extension_registry", ":hash", ":mem_internal", ":message_internal", @@ -1147,7 +1126,6 @@ upb_amalgamation( ":base", ":collections_internal", ":descriptor_upb_proto", - ":extension_registry", ":fastdecode", ":hash", ":lex", @@ -1183,7 +1161,6 @@ upb_amalgamation( ":collections_internal", ":descriptor_upb_proto", ":descriptor_upb_proto_reflection", - ":extension_registry", ":fastdecode", ":hash", ":json", @@ -1221,7 +1198,6 @@ upb_amalgamation( ":base", ":collections_internal", ":descriptor_upb_proto", - ":extension_registry", ":fastdecode", ":hash", ":json", @@ -1285,9 +1261,7 @@ filegroup( # compatible_with = ["//buildenv/target:non_prod"], # headers_to_exclude = glob([ # "**/*.hpp", -# ]) + [ -# "upb/extension_registry.h", -# ], +# ]), # no_string_conversion = ["upb_MiniTable_Build"], # strict_enums = ["upb_FieldType"], # ) diff --git a/upb/extension_registry.h b/upb/extension_registry.h index 34103dd76f..5a9564fb8b 100644 --- a/upb/extension_registry.h +++ b/upb/extension_registry.h @@ -25,77 +25,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// This header is deprecated, use upb/mini_table/extension_registry.h instead + #ifndef UPB_EXTENSION_REGISTRY_H_ #define UPB_EXTENSION_REGISTRY_H_ -#include "upb/mem/arena.h" -#include "upb/mini_table/types.h" - -// Must be last. -#include "upb/port/def.inc" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Extension registry: a dynamic data structure that stores a map of: - * (upb_MiniTable, number) -> extension info - * - * upb_decode() uses upb_ExtensionRegistry to look up extensions while parsing - * binary format. - * - * upb_ExtensionRegistry is part of the mini-table (msglayout) family of - * objects. Like all mini-table objects, it is suitable for reflection-less - * builds that do not want to expose names into the binary. - * - * Unlike most mini-table types, upb_ExtensionRegistry requires dynamic memory - * allocation and dynamic initialization: - * * If reflection is being used, then upb_DefPool will construct an appropriate - * upb_ExtensionRegistry automatically. - * * For a mini-table only build, the user must manually construct the - * upb_ExtensionRegistry and populate it with all of the extensions the user - * cares about. - * * A third alternative is to manually unpack relevant extensions after the - * main parse is complete, similar to how Any works. This is perhaps the - * nicest solution from the perspective of reducing dependencies, avoiding - * dynamic memory allocation, and avoiding the need to parse uninteresting - * extensions. The downsides are: - * (1) parse errors are not caught during the main parse - * (2) the CPU hit of parsing comes during access, which could cause an - * undesirable stutter in application performance. - * - * Users cannot directly get or put into this map. Users can only add the - * extensions from a generated module and pass the extension registry to the - * binary decoder. - * - * A upb_DefPool provides a upb_ExtensionRegistry, so any users who use - * reflection do not need to populate a upb_ExtensionRegistry directly. - */ - -typedef struct upb_ExtensionRegistry upb_ExtensionRegistry; - -// Creates a upb_ExtensionRegistry in the given arena. -// The arena must outlive any use of the extreg. -upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena); - -// Adds the given extension info for the array |e| of size |count| into the -// registry. If there are any errors, the entire array is backed out. -// The extensions must outlive the registry. -// Possible errors include OOM or an extension number that already exists. -// TODO: There is currently no way to determine the exact reason for failure. -bool upb_ExtensionRegistry_AddArray(upb_ExtensionRegistry* r, - const upb_MiniTableExtension** e, - size_t count); - -// Looks up the extension (if any) defined for message type |t| and field -// number |num|. Returns the extension if found, otherwise NULL. -const upb_MiniTableExtension* upb_ExtensionRegistry_Lookup( - const upb_ExtensionRegistry* r, const upb_MiniTable* t, uint32_t num); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include "upb/port/undef.inc" +#include "upb/mini_table/extension_registry.h" #endif /* UPB_EXTENSION_REGISTRY_H_ */ diff --git a/upb/fuzz_test_util.cc b/upb/fuzz_test_util.cc index fb5f872c9b..f60a0d3849 100644 --- a/upb/fuzz_test_util.cc +++ b/upb/fuzz_test_util.cc @@ -27,10 +27,10 @@ #include "upb/fuzz_test_util.h" -#include "upb/extension_registry.h" #include "upb/message/message.h" #include "upb/mini_table/decode.h" #include "upb/mini_table/extension_internal.h" +#include "upb/mini_table/extension_registry.h" #include "upb/upb.hpp" namespace upb { diff --git a/upb/fuzz_test_util.h b/upb/fuzz_test_util.h index 10728fd883..4e1e968398 100644 --- a/upb/fuzz_test_util.h +++ b/upb/fuzz_test_util.h @@ -31,7 +31,7 @@ #include #include -#include "upb/extension_registry.h" +#include "upb/mini_table/extension_registry.h" #include "upb/mini_table/types.h" namespace upb { diff --git a/upb/message/internal.h b/upb/message/internal.h index c7b3897efd..8dbe673a6c 100644 --- a/upb/message/internal.h +++ b/upb/message/internal.h @@ -38,11 +38,11 @@ #include #include -#include "upb/extension_registry.h" #include "upb/hash/common.h" #include "upb/message/extension_internal.h" #include "upb/message/message.h" #include "upb/mini_table/extension_internal.h" +#include "upb/mini_table/extension_registry.h" #include "upb/mini_table/file_internal.h" #include "upb/mini_table/message_internal.h" diff --git a/upb/extension_registry.c b/upb/mini_table/extension_registry.c similarity index 98% rename from upb/extension_registry.c rename to upb/mini_table/extension_registry.c index 3765515206..de8e05ed7a 100644 --- a/upb/extension_registry.c +++ b/upb/mini_table/extension_registry.c @@ -25,7 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "upb/extension_registry.h" +#include "upb/mini_table/extension_registry.h" #include "upb/hash/str_table.h" #include "upb/mini_table/extension_internal.h" diff --git a/upb/mini_table/extension_registry.h b/upb/mini_table/extension_registry.h new file mode 100644 index 0000000000..387dd09e49 --- /dev/null +++ b/upb/mini_table/extension_registry.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2009-2021, Google LLC + * All rights reserved. + * + * 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 LLC 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 Google LLC 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. + */ + +#ifndef UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ +#define UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ + +#include "upb/mem/arena.h" +#include "upb/mini_table/types.h" + +// Must be last. +#include "upb/port/def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Extension registry: a dynamic data structure that stores a map of: + * (upb_MiniTable, number) -> extension info + * + * upb_decode() uses upb_ExtensionRegistry to look up extensions while parsing + * binary format. + * + * upb_ExtensionRegistry is part of the mini-table (msglayout) family of + * objects. Like all mini-table objects, it is suitable for reflection-less + * builds that do not want to expose names into the binary. + * + * Unlike most mini-table types, upb_ExtensionRegistry requires dynamic memory + * allocation and dynamic initialization: + * * If reflection is being used, then upb_DefPool will construct an appropriate + * upb_ExtensionRegistry automatically. + * * For a mini-table only build, the user must manually construct the + * upb_ExtensionRegistry and populate it with all of the extensions the user + * cares about. + * * A third alternative is to manually unpack relevant extensions after the + * main parse is complete, similar to how Any works. This is perhaps the + * nicest solution from the perspective of reducing dependencies, avoiding + * dynamic memory allocation, and avoiding the need to parse uninteresting + * extensions. The downsides are: + * (1) parse errors are not caught during the main parse + * (2) the CPU hit of parsing comes during access, which could cause an + * undesirable stutter in application performance. + * + * Users cannot directly get or put into this map. Users can only add the + * extensions from a generated module and pass the extension registry to the + * binary decoder. + * + * A upb_DefPool provides a upb_ExtensionRegistry, so any users who use + * reflection do not need to populate a upb_ExtensionRegistry directly. + */ + +typedef struct upb_ExtensionRegistry upb_ExtensionRegistry; + +// Creates a upb_ExtensionRegistry in the given arena. +// The arena must outlive any use of the extreg. +upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena); + +// Adds the given extension info for the array |e| of size |count| into the +// registry. If there are any errors, the entire array is backed out. +// The extensions must outlive the registry. +// Possible errors include OOM or an extension number that already exists. +// TODO: There is currently no way to determine the exact reason for failure. +bool upb_ExtensionRegistry_AddArray(upb_ExtensionRegistry* r, + const upb_MiniTableExtension** e, + size_t count); + +// Looks up the extension (if any) defined for message type |t| and field +// number |num|. Returns the extension if found, otherwise NULL. +const upb_MiniTableExtension* upb_ExtensionRegistry_Lookup( + const upb_ExtensionRegistry* r, const upb_MiniTable* t, uint32_t num); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port/undef.inc" + +#endif /* UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ */ diff --git a/upb/wire/decode.h b/upb/wire/decode.h index e0041737eb..31eee25070 100644 --- a/upb/wire/decode.h +++ b/upb/wire/decode.h @@ -30,9 +30,9 @@ #ifndef UPB_WIRE_DECODE_H_ #define UPB_WIRE_DECODE_H_ -#include "upb/extension_registry.h" #include "upb/mem/arena.h" #include "upb/message/message.h" +#include "upb/mini_table/extension_registry.h" // Must be last. #include "upb/port/def.inc"