Update protobuf's upb dependency to current main HEAD.

PiperOrigin-RevId: 554500222
pull/13446/head
Sandy Zhang 2 years ago committed by Copybara-Service
parent 4280a0574c
commit e3b0943412
  1. 53
      php/ext/google/protobuf/php-upb.c
  2. 170
      php/ext/google/protobuf/php-upb.h
  3. 4
      protobuf_deps.bzl
  4. 53
      ruby/ext/google/protobuf_c/ruby-upb.c
  5. 170
      ruby/ext/google/protobuf_c/ruby-upb.h

@ -249,8 +249,23 @@
* expected behavior. * expected behavior.
*/ */
#if defined(__SANITIZE_ADDRESS__) /* Due to preprocessor limitations, the conditional logic for setting
* UPN_CLANG_ASAN below cannot be consolidated into a portable one-liner.
* See https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fattribute.html.
*/
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define UPB_CLANG_ASAN 1
#else
#define UPB_CLANG_ASAN 0
#endif
#else
#define UPB_CLANG_ASAN 0
#endif
#if defined(__SANITIZE_ADDRESS__) || UPB_CLANG_ASAN
#define UPB_ASAN 1 #define UPB_ASAN 1
#define UPB_ASAN_GUARD_SIZE 32
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -265,6 +280,7 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
__asan_unpoison_memory_region((addr), (size)) __asan_unpoison_memory_region((addr), (size))
#else #else
#define UPB_ASAN 0 #define UPB_ASAN 0
#define UPB_ASAN_GUARD_SIZE 0
#define UPB_POISON_MEMORY_REGION(addr, size) \ #define UPB_POISON_MEMORY_REGION(addr, size) \
((void)(addr), (void)(size)) ((void)(addr), (void)(size))
#define UPB_UNPOISON_MEMORY_REGION(addr, size) \ #define UPB_UNPOISON_MEMORY_REGION(addr, size) \
@ -5780,6 +5796,7 @@ static void* upb_global_allocfunc(upb_alloc* alloc, void* ptr, size_t oldsize,
upb_alloc upb_alloc_global = {&upb_global_allocfunc}; upb_alloc upb_alloc_global = {&upb_global_allocfunc};
// Must be last. // Must be last.
struct _upb_MemBlock { struct _upb_MemBlock {
@ -5818,7 +5835,7 @@ static _upb_ArenaRoot _upb_Arena_FindRoot(upb_Arena* a) {
// //
// This is true because: // This is true because:
// - If no fuses occur, this will eventually become the root. // - If no fuses occur, this will eventually become the root.
// - If fuses are actively occuring, the root may change, but the // - If fuses are actively occurring, the root may change, but the
// invariant is that `parent_or_count` merely points to *a* parent. // invariant is that `parent_or_count` merely points to *a* parent.
// //
// In other words, it is moving towards "the" root, and that root may move // In other words, it is moving towards "the" root, and that root may move
@ -8164,14 +8181,16 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
f->full_name, (int)f->type_); f->full_name, (int)f->type_);
} }
} }
} else if (has_type_name) {
f->type_ =
UPB_FIELD_TYPE_UNSPECIFIED; // We'll assign this in resolve_fielddef()
} }
if (f->type_ < kUpb_FieldType_Double || f->type_ > kUpb_FieldType_SInt64) { if (!has_type && has_type_name) {
_upb_DefBuilder_Errf(ctx, "invalid type for field %s (%d)", f->full_name, f->type_ =
f->type_); UPB_FIELD_TYPE_UNSPECIFIED; // We'll assign this in resolve_subdef()
} else {
if (f->type_ < kUpb_FieldType_Double || f->type_ > kUpb_FieldType_SInt64) {
_upb_DefBuilder_Errf(ctx, "invalid type for field %s (%d)", f->full_name,
f->type_);
}
} }
if (f->label_ < kUpb_Label_Optional || f->label_ > kUpb_Label_Repeated) { if (f->label_ < kUpb_Label_Optional || f->label_ > kUpb_Label_Repeated) {
@ -8220,14 +8239,15 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
f->is_packed = UPB_DESC(FieldOptions_packed)(f->opts); f->is_packed = UPB_DESC(FieldOptions_packed)(f->opts);
} else { } else {
// Repeated fields default to packed for proto3 only. // Repeated fields default to packed for proto3 only.
f->is_packed = upb_FieldDef_IsPrimitive(f) && f->is_packed = has_type && upb_FieldDef_IsPrimitive(f) &&
f->label_ == kUpb_Label_Repeated && f->label_ == kUpb_Label_Repeated &&
upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3; upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3;
} }
f->has_presence = f->has_presence =
(!upb_FieldDef_IsRepeated(f)) && (!upb_FieldDef_IsRepeated(f)) &&
(upb_FieldDef_IsSubMessage(f) || upb_FieldDef_ContainingOneof(f) || (f->type_ == kUpb_FieldType_Message || f->type_ == kUpb_FieldType_Group ||
upb_FieldDef_ContainingOneof(f) ||
(upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto2)); (upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto2));
} }
@ -8335,16 +8355,22 @@ static void resolve_subdef(upb_DefBuilder* ctx, const char* prefix,
case UPB_DEFTYPE_ENUM: case UPB_DEFTYPE_ENUM:
f->sub.enumdef = def; f->sub.enumdef = def;
f->type_ = kUpb_FieldType_Enum; f->type_ = kUpb_FieldType_Enum;
if (!UPB_DESC(FieldOptions_has_packed)(f->opts)) {
f->is_packed = f->label_ == kUpb_Label_Repeated &&
upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3;
}
break; break;
case UPB_DEFTYPE_MSG: case UPB_DEFTYPE_MSG:
f->sub.msgdef = def; f->sub.msgdef = def;
f->type_ = kUpb_FieldType_Message; // It appears there is no way of f->type_ = kUpb_FieldType_Message; // It appears there is no way of
// this being a group. // this being a group.
f->has_presence = !upb_FieldDef_IsRepeated(f);
break; break;
default: default:
_upb_DefBuilder_Errf(ctx, "Couldn't resolve type name for field %s", _upb_DefBuilder_Errf(ctx, "Couldn't resolve type name for field %s",
f->full_name); f->full_name);
} }
break;
} }
case kUpb_FieldType_Message: case kUpb_FieldType_Message:
case kUpb_FieldType_Group: case kUpb_FieldType_Group:
@ -9955,7 +9981,8 @@ void _upb_OneofDef_Insert(upb_DefBuilder* ctx, upb_OneofDef* o,
// TODO(salo): More redundant work happening here. // TODO(salo): More redundant work happening here.
const bool name_exists = upb_strtable_lookup2(&o->ntof, name, size, NULL); const bool name_exists = upb_strtable_lookup2(&o->ntof, name, size, NULL);
if (UPB_UNLIKELY(name_exists)) { if (UPB_UNLIKELY(name_exists)) {
_upb_DefBuilder_Errf(ctx, "oneof fields have the same name (%s)", name); _upb_DefBuilder_Errf(ctx, "oneof fields have the same name (%.*s)",
(int)size, name);
} }
const bool ok = upb_inttable_insert(&o->itof, number, v, ctx->arena) && const bool ok = upb_inttable_insert(&o->itof, number, v, ctx->arena) &&
@ -14479,7 +14506,7 @@ bool upb_MiniTable_Link(upb_MiniTable* mt, const upb_MiniTable** sub_tables,
for (int i = 0; i < mt->field_count; i++) { for (int i = 0; i < mt->field_count; i++) {
upb_MiniTableField* f = (upb_MiniTableField*)&mt->fields[i]; upb_MiniTableField* f = (upb_MiniTableField*)&mt->fields[i];
if (upb_MiniTableField_CType(f) == kUpb_CType_Enum) { if (upb_MiniTableField_IsClosedEnum(f)) {
const upb_MiniTableEnum* sub = sub_enums[enum_count++]; const upb_MiniTableEnum* sub = sub_enums[enum_count++];
if (enum_count > sub_enum_count) return false; if (enum_count > sub_enum_count) return false;
if (sub != NULL) { if (sub != NULL) {
@ -14673,6 +14700,8 @@ bool upb_MiniTable_NextOneofField(const upb_MiniTable* m,
#undef UPB_POISON_MEMORY_REGION #undef UPB_POISON_MEMORY_REGION
#undef UPB_UNPOISON_MEMORY_REGION #undef UPB_UNPOISON_MEMORY_REGION
#undef UPB_ASAN #undef UPB_ASAN
#undef UPB_ASAN_GUARD_SIZE
#undef UPB_CLANG_ASAN
#undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 #undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3
#undef UPB_DEPRECATED #undef UPB_DEPRECATED
#undef UPB_GNUC_MIN #undef UPB_GNUC_MIN

@ -248,8 +248,23 @@
* expected behavior. * expected behavior.
*/ */
#if defined(__SANITIZE_ADDRESS__) /* Due to preprocessor limitations, the conditional logic for setting
* UPN_CLANG_ASAN below cannot be consolidated into a portable one-liner.
* See https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fattribute.html.
*/
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define UPB_CLANG_ASAN 1
#else
#define UPB_CLANG_ASAN 0
#endif
#else
#define UPB_CLANG_ASAN 0
#endif
#if defined(__SANITIZE_ADDRESS__) || UPB_CLANG_ASAN
#define UPB_ASAN 1 #define UPB_ASAN 1
#define UPB_ASAN_GUARD_SIZE 32
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -264,6 +279,7 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
__asan_unpoison_memory_region((addr), (size)) __asan_unpoison_memory_region((addr), (size))
#else #else
#define UPB_ASAN 0 #define UPB_ASAN 0
#define UPB_ASAN_GUARD_SIZE 0
#define UPB_POISON_MEMORY_REGION(addr, size) \ #define UPB_POISON_MEMORY_REGION(addr, size) \
((void)(addr), (void)(size)) ((void)(addr), (void)(size))
#define UPB_UNPOISON_MEMORY_REGION(addr, size) \ #define UPB_UNPOISON_MEMORY_REGION(addr, size) \
@ -486,14 +502,22 @@ UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b) {
#include <stdint.h> #include <stdint.h>
#ifndef UPB_MESSAGE_TYPEDEF_H_
#define UPB_MESSAGE_TYPEDEF_H_
// This typedef needs its own header to resolve a circular dependency between
// messages and mini tables.
typedef void upb_Message;
#endif /* UPB_MESSAGE_TYPEDEF_H_ */
// Must be last. // Must be last.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef void upb_Message;
// When a upb_Message* is stored in a message, array, or map, it is stored in a // When a upb_Message* is stored in a message, array, or map, it is stored in a
// tagged form. If the tag bit is set, the referenced upb_Message is of type // tagged form. If the tag bit is set, the referenced upb_Message is of type
// _kUpb_MiniTable_Empty (a sentinel message type with no fields) instead of // _kUpb_MiniTable_Empty (a sentinel message type with no fields) instead of
@ -625,8 +649,6 @@ UPB_INLINE bool upb_MiniTableEnum_CheckValue(const struct upb_MiniTableEnum* e,
// Must be last. // Must be last.
// LINT.IfChange(mini_table_field_layout)
struct upb_MiniTableField { struct upb_MiniTableField {
uint32_t number; uint32_t number;
uint16_t offset; uint16_t offset;
@ -679,8 +701,6 @@ typedef enum {
#define kUpb_FieldRep_Shift 6 #define kUpb_FieldRep_Shift 6
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/mini_table_field.ts:mini_table_field_layout)
UPB_INLINE upb_FieldRep UPB_INLINE upb_FieldRep
_upb_MiniTableField_GetRep(const struct upb_MiniTableField* field) { _upb_MiniTableField_GetRep(const struct upb_MiniTableField* field) {
return (upb_FieldRep)(field->mode >> kUpb_FieldRep_Shift); return (upb_FieldRep)(field->mode >> kUpb_FieldRep_Shift);
@ -732,8 +752,6 @@ UPB_INLINE bool upb_IsSubMessage(const struct upb_MiniTableField* field) {
// Must be last. // Must be last.
typedef void upb_Message;
struct upb_Decoder; struct upb_Decoder;
typedef const char* _upb_FieldParser(struct upb_Decoder* d, const char* ptr, typedef const char* _upb_FieldParser(struct upb_Decoder* d, const char* ptr,
upb_Message* msg, intptr_t table, upb_Message* msg, intptr_t table,
@ -755,8 +773,6 @@ typedef enum {
kUpb_ExtMode_IsMapEntry = 4, kUpb_ExtMode_IsMapEntry = 4,
} upb_ExtMode; } upb_ExtMode;
// LINT.IfChange(mini_table_layout)
union upb_MiniTableSub; union upb_MiniTableSub;
// upb_MiniTable represents the memory layout of a given upb_MessageDef. // upb_MiniTable represents the memory layout of a given upb_MessageDef.
@ -782,8 +798,6 @@ struct upb_MiniTable {
_upb_FastTable_Entry fasttable[]; _upb_FastTable_Entry fasttable[];
}; };
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/mini_table.ts:presence_logic)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -1100,14 +1114,10 @@ UPB_INLINE void upb_gfree(void* ptr) { upb_free(&upb_alloc_global, ptr); }
typedef struct upb_Arena upb_Arena; typedef struct upb_Arena upb_Arena;
// LINT.IfChange(arena_head)
typedef struct { typedef struct {
char *ptr, *end; char *ptr, *end;
} _upb_ArenaHead; } _upb_ArenaHead;
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/arena.ts:arena_head)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -1131,7 +1141,8 @@ UPB_INLINE size_t _upb_ArenaHas(upb_Arena* a) {
UPB_API_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) { UPB_API_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) {
size = UPB_ALIGN_MALLOC(size); size = UPB_ALIGN_MALLOC(size);
if (UPB_UNLIKELY(_upb_ArenaHas(a) < size)) { size_t span = size + UPB_ASAN_GUARD_SIZE;
if (UPB_UNLIKELY(_upb_ArenaHas(a) < span)) {
return _upb_Arena_SlowMalloc(a, size); return _upb_Arena_SlowMalloc(a, size);
} }
@ -1142,18 +1153,7 @@ UPB_API_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) {
UPB_ASSERT(UPB_ALIGN_MALLOC(size) == size); UPB_ASSERT(UPB_ALIGN_MALLOC(size) == size);
UPB_UNPOISON_MEMORY_REGION(ret, size); UPB_UNPOISON_MEMORY_REGION(ret, size);
h->ptr += size; h->ptr += span;
#if UPB_ASAN
{
size_t guard_size = 32;
if (_upb_ArenaHas(a) >= guard_size) {
h->ptr += guard_size;
} else {
h->ptr = h->end;
}
}
#endif
return ret; return ret;
} }
@ -1167,7 +1167,8 @@ UPB_API_INLINE void upb_Arena_ShrinkLast(upb_Arena* a, void* ptr,
_upb_ArenaHead* h = (_upb_ArenaHead*)a; _upb_ArenaHead* h = (_upb_ArenaHead*)a;
oldsize = UPB_ALIGN_MALLOC(oldsize); oldsize = UPB_ALIGN_MALLOC(oldsize);
size = UPB_ALIGN_MALLOC(size); size = UPB_ALIGN_MALLOC(size);
UPB_ASSERT((char*)ptr + oldsize == h->ptr); // Must be the last alloc. // Must be the last alloc.
UPB_ASSERT((char*)ptr + oldsize == h->ptr - UPB_ASAN_GUARD_SIZE);
UPB_ASSERT(size <= oldsize); UPB_ASSERT(size <= oldsize);
h->ptr = (char*)ptr + size; h->ptr = (char*)ptr + size;
} }
@ -1930,7 +1931,7 @@ UPB_INLINE int upb_Log2Ceiling(int x) {
return 32 - __builtin_clz(x - 1); return 32 - __builtin_clz(x - 1);
#else #else
int lg2 = 0; int lg2 = 0;
while (1 << lg2 < x) lg2++; while ((1 << lg2) < x) lg2++;
return lg2; return lg2;
#endif #endif
} }
@ -2099,7 +2100,15 @@ typedef struct {
} upb_MapEntryData; } upb_MapEntryData;
typedef struct { typedef struct {
void* internal_data; // LINT.IfChange(internal_layout)
union {
void* internal_data;
// Force 8-byte alignment, since the data members may contain members that
// require 8-byte alignment.
double d;
};
// LINT.ThenChange(//depot/google3/third_party/upb/upb/message/internal.h:internal_layout)
upb_MapEntryData data; upb_MapEntryData data;
} upb_MapEntry; } upb_MapEntry;
@ -2267,10 +2276,22 @@ UPB_INLINE void _upb_msg_map_set_value(void* msg, const void* val,
#endif /* UPB_COLLECTIONS_MAP_GENCODE_UTIL_H_ */ #endif /* UPB_COLLECTIONS_MAP_GENCODE_UTIL_H_ */
// This header is deprecated, use upb/mini_table/extension_registry.h instead #ifndef UPB_MESSAGE_ACCESSORS_H_
#define UPB_MESSAGE_ACCESSORS_H_
/*
** Our memory representation for parsing tables and messages themselves.
** Functions in this file are used by generated code and possibly reflection.
**
** The definitions in this file are internal to upb.
**/
#ifndef UPB_MESSAGE_INTERNAL_H_
#define UPB_MESSAGE_INTERNAL_H_
#ifndef UPB_EXTENSION_REGISTRY_H_ #include <stdlib.h>
#define UPB_EXTENSION_REGISTRY_H_ #include <string.h>
#ifndef UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ #ifndef UPB_MINI_TABLE_EXTENSION_REGISTRY_H_
@ -2347,30 +2368,6 @@ UPB_API const upb_MiniTableExtension* upb_ExtensionRegistry_Lookup(
#endif /* UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ */ #endif /* UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ */
#endif /* UPB_EXTENSION_REGISTRY_H_ */
#ifndef UPB_MESSAGE_ACCESSORS_H_
#define UPB_MESSAGE_ACCESSORS_H_
#ifndef UPB_MESSAGE_ACCESSORS_INTERNAL_H_
#define UPB_MESSAGE_ACCESSORS_INTERNAL_H_
/*
** Our memory representation for parsing tables and messages themselves.
** Functions in this file are used by generated code and possibly reflection.
**
** The definitions in this file are internal to upb.
**/
#ifndef UPB_MESSAGE_INTERNAL_H_
#define UPB_MESSAGE_INTERNAL_H_
#include <stdlib.h>
#include <string.h>
// Must be last. // Must be last.
#ifdef __cplusplus #ifdef __cplusplus
@ -2411,7 +2408,15 @@ typedef struct {
} upb_Message_InternalData; } upb_Message_InternalData;
typedef struct { typedef struct {
upb_Message_InternalData* internal; // LINT.IfChange(internal_layout)
union {
upb_Message_InternalData* internal;
// Force 8-byte alignment, since the data members may contain members that
// require 8-byte alignment.
double d;
};
// LINT.ThenChange(//depot/google3/third_party/upb/upb/message/internal/map_entry.h:internal_layout)
/* Message data follows. */ /* Message data follows. */
} upb_Message_Internal; } upb_Message_Internal;
@ -2454,6 +2459,10 @@ bool _upb_Message_AddUnknown(upb_Message* msg, const char* data, size_t len,
#endif /* UPB_MESSAGE_INTERNAL_H_ */ #endif /* UPB_MESSAGE_INTERNAL_H_ */
#ifndef UPB_MESSAGE_INTERNAL_ACCESSORS_H_
#define UPB_MESSAGE_INTERNAL_ACCESSORS_H_
// Must be last. // Must be last.
#if defined(__GNUC__) && !defined(__clang__) #if defined(__GNUC__) && !defined(__clang__)
@ -2532,7 +2541,6 @@ UPB_INLINE uint32_t _upb_getoneofcase_field(const upb_Message* msg,
} }
// LINT.ThenChange(GoogleInternalName2) // LINT.ThenChange(GoogleInternalName2)
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/presence.ts:presence_logic)
UPB_INLINE bool _upb_MiniTableField_InOneOf(const upb_MiniTableField* field) { UPB_INLINE bool _upb_MiniTableField_InOneOf(const upb_MiniTableField* field) {
return field->presence < 0; return field->presence < 0;
@ -2557,8 +2565,6 @@ UPB_INLINE void _upb_Message_SetPresence(upb_Message* msg,
} }
} }
// LINT.IfChange(message_raw_fields)
UPB_INLINE bool _upb_MiniTable_ValueIsNonZero(const void* default_val, UPB_INLINE bool _upb_MiniTable_ValueIsNonZero(const void* default_val,
const upb_MiniTableField* field) { const upb_MiniTableField* field) {
char zero[16] = {0}; char zero[16] = {0};
@ -2597,8 +2603,6 @@ UPB_INLINE void _upb_MiniTable_CopyFieldData(void* to, const void* from,
UPB_UNREACHABLE(); UPB_UNREACHABLE();
} }
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/message.ts:message_raw_fields)
UPB_INLINE size_t UPB_INLINE size_t
_upb_MiniTable_ElementSizeLg2(const upb_MiniTableField* field) { _upb_MiniTable_ElementSizeLg2(const upb_MiniTableField* field) {
const unsigned char table[] = { const unsigned char table[] = {
@ -2807,7 +2811,7 @@ UPB_INLINE upb_Map* _upb_Message_GetOrCreateMutableMap(
#endif #endif
#endif // UPB_MESSAGE_ACCESSORS_INTERNAL_H_ #endif // UPB_MESSAGE_INTERNAL_ACCESSORS_H_
// Must be last. // Must be last.
@ -3393,9 +3397,9 @@ upb_MiniTable* upb_MiniTable_BuildWithBuf(const char* data, size_t len,
// Must be last. // Must be last.
struct upb_MiniTableFile { struct upb_MiniTableFile {
const upb_MiniTable** msgs; const struct upb_MiniTable** msgs;
const upb_MiniTableEnum** enums; const struct upb_MiniTableEnum** enums;
const upb_MiniTableExtension** exts; const struct upb_MiniTableExtension** exts;
int msg_count; int msg_count;
int enum_count; int enum_count;
int ext_count; int ext_count;
@ -11527,8 +11531,8 @@ double _upb_NoLocaleStrtod(const char *str, char **endptr);
#endif /* UPB_LEX_STRTOD_H_ */ #endif /* UPB_LEX_STRTOD_H_ */
#ifndef UPB_MEM_ARENA_INTERNAL_H_ #ifndef UPB_MEM_INTERNAL_ARENA_H_
#define UPB_MEM_ARENA_INTERNAL_H_ #define UPB_MEM_INTERNAL_ARENA_H_
// Must be last. // Must be last.
@ -11610,7 +11614,7 @@ UPB_INLINE bool upb_Arena_HasInitialBlock(upb_Arena* arena) {
} }
#endif /* UPB_MEM_ARENA_INTERNAL_H_ */ #endif /* UPB_MEM_INTERNAL_ARENA_H_ */
#ifndef UPB_PORT_ATOMIC_H_ #ifndef UPB_PORT_ATOMIC_H_
#define UPB_PORT_ATOMIC_H_ #define UPB_PORT_ATOMIC_H_
@ -11706,8 +11710,8 @@ extern "C" {
#define UPB_WIRE_READER_H_ #define UPB_WIRE_READER_H_
#ifndef UPB_WIRE_SWAP_INTERNAL_H_ #ifndef UPB_WIRE_INTERNAL_SWAP_H_
#define UPB_WIRE_SWAP_INTERNAL_H_ #define UPB_WIRE_INTERNAL_SWAP_H_
// Must be last. // Must be last.
@ -11739,7 +11743,7 @@ UPB_INLINE uint64_t _upb_BigEndian_Swap64(uint64_t val) {
#endif #endif
#endif /* UPB_WIRE_SWAP_INTERNAL_H_ */ #endif /* UPB_WIRE_INTERNAL_SWAP_H_ */
#ifndef UPB_WIRE_TYPES_H_ #ifndef UPB_WIRE_TYPES_H_
#define UPB_WIRE_TYPES_H_ #define UPB_WIRE_TYPES_H_
@ -12572,8 +12576,8 @@ upb_MethodDef* _upb_MethodDefs_New(
#endif /* UPB_REFLECTION_METHOD_DEF_INTERNAL_H_ */ #endif /* UPB_REFLECTION_METHOD_DEF_INTERNAL_H_ */
#ifndef UPB_WIRE_COMMON_INTERNAL_H_ #ifndef UPB_WIRE_INTERNAL_COMMON_H_
#define UPB_WIRE_COMMON_INTERNAL_H_ #define UPB_WIRE_INTERNAL_COMMON_H_
// Must be last. // Must be last.
@ -12592,15 +12596,15 @@ enum {
}; };
#endif /* UPB_WIRE_COMMON_INTERNAL_H_ */ #endif /* UPB_WIRE_INTERNAL_COMMON_H_ */
/* /*
* Internal implementation details of the decoder that are shared between * Internal implementation details of the decoder that are shared between
* decode.c and decode_fast.c. * decode.c and decode_fast.c.
*/ */
#ifndef UPB_WIRE_DECODE_INTERNAL_H_ #ifndef UPB_WIRE_INTERNAL_DECODE_H_
#define UPB_WIRE_DECODE_INTERNAL_H_ #define UPB_WIRE_INTERNAL_DECODE_H_
#include "utf8_range.h" #include "utf8_range.h"
@ -12723,7 +12727,7 @@ UPB_INLINE uint32_t _upb_FastDecoder_LoadTag(const char* ptr) {
} }
#endif /* UPB_WIRE_DECODE_INTERNAL_H_ */ #endif /* UPB_WIRE_INTERNAL_DECODE_H_ */
#ifndef UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_ #ifndef UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_
#define UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_ #define UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_
@ -12919,6 +12923,8 @@ UPB_INLINE const char* upb_MdDecoder_DecodeBase92Varint(
#undef UPB_POISON_MEMORY_REGION #undef UPB_POISON_MEMORY_REGION
#undef UPB_UNPOISON_MEMORY_REGION #undef UPB_UNPOISON_MEMORY_REGION
#undef UPB_ASAN #undef UPB_ASAN
#undef UPB_ASAN_GUARD_SIZE
#undef UPB_CLANG_ASAN
#undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 #undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3
#undef UPB_DEPRECATED #undef UPB_DEPRECATED
#undef UPB_GNUC_MIN #undef UPB_GNUC_MIN

@ -150,7 +150,7 @@ def protobuf_deps():
_github_archive( _github_archive(
name = "upb", name = "upb",
repo = "https://github.com/protocolbuffers/upb", repo = "https://github.com/protocolbuffers/upb",
commit = "01fed1cc1ba255bf22b49393ba054b8d270e6ba3", commit = "58877b55e0796bcca743e9bd4d2be42092562f30",
sha256 = "387bef0d61094773a4ce7dd1c3d92bb99444155531e00945161ec9cd36e5bfce", sha256 = "b3a3279cffb91e22fd38fb316a39ded87211bf89ff39337c7f151d88ed3b71fd",
patches = ["@com_google_protobuf//build_defs:upb.patch"], patches = ["@com_google_protobuf//build_defs:upb.patch"],
) )

@ -249,8 +249,23 @@
* expected behavior. * expected behavior.
*/ */
#if defined(__SANITIZE_ADDRESS__) /* Due to preprocessor limitations, the conditional logic for setting
* UPN_CLANG_ASAN below cannot be consolidated into a portable one-liner.
* See https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fattribute.html.
*/
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define UPB_CLANG_ASAN 1
#else
#define UPB_CLANG_ASAN 0
#endif
#else
#define UPB_CLANG_ASAN 0
#endif
#if defined(__SANITIZE_ADDRESS__) || UPB_CLANG_ASAN
#define UPB_ASAN 1 #define UPB_ASAN 1
#define UPB_ASAN_GUARD_SIZE 32
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -265,6 +280,7 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
__asan_unpoison_memory_region((addr), (size)) __asan_unpoison_memory_region((addr), (size))
#else #else
#define UPB_ASAN 0 #define UPB_ASAN 0
#define UPB_ASAN_GUARD_SIZE 0
#define UPB_POISON_MEMORY_REGION(addr, size) \ #define UPB_POISON_MEMORY_REGION(addr, size) \
((void)(addr), (void)(size)) ((void)(addr), (void)(size))
#define UPB_UNPOISON_MEMORY_REGION(addr, size) \ #define UPB_UNPOISON_MEMORY_REGION(addr, size) \
@ -5319,6 +5335,7 @@ static void* upb_global_allocfunc(upb_alloc* alloc, void* ptr, size_t oldsize,
upb_alloc upb_alloc_global = {&upb_global_allocfunc}; upb_alloc upb_alloc_global = {&upb_global_allocfunc};
// Must be last. // Must be last.
struct _upb_MemBlock { struct _upb_MemBlock {
@ -5357,7 +5374,7 @@ static _upb_ArenaRoot _upb_Arena_FindRoot(upb_Arena* a) {
// //
// This is true because: // This is true because:
// - If no fuses occur, this will eventually become the root. // - If no fuses occur, this will eventually become the root.
// - If fuses are actively occuring, the root may change, but the // - If fuses are actively occurring, the root may change, but the
// invariant is that `parent_or_count` merely points to *a* parent. // invariant is that `parent_or_count` merely points to *a* parent.
// //
// In other words, it is moving towards "the" root, and that root may move // In other words, it is moving towards "the" root, and that root may move
@ -7703,14 +7720,16 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
f->full_name, (int)f->type_); f->full_name, (int)f->type_);
} }
} }
} else if (has_type_name) {
f->type_ =
UPB_FIELD_TYPE_UNSPECIFIED; // We'll assign this in resolve_fielddef()
} }
if (f->type_ < kUpb_FieldType_Double || f->type_ > kUpb_FieldType_SInt64) { if (!has_type && has_type_name) {
_upb_DefBuilder_Errf(ctx, "invalid type for field %s (%d)", f->full_name, f->type_ =
f->type_); UPB_FIELD_TYPE_UNSPECIFIED; // We'll assign this in resolve_subdef()
} else {
if (f->type_ < kUpb_FieldType_Double || f->type_ > kUpb_FieldType_SInt64) {
_upb_DefBuilder_Errf(ctx, "invalid type for field %s (%d)", f->full_name,
f->type_);
}
} }
if (f->label_ < kUpb_Label_Optional || f->label_ > kUpb_Label_Repeated) { if (f->label_ < kUpb_Label_Optional || f->label_ > kUpb_Label_Repeated) {
@ -7759,14 +7778,15 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
f->is_packed = UPB_DESC(FieldOptions_packed)(f->opts); f->is_packed = UPB_DESC(FieldOptions_packed)(f->opts);
} else { } else {
// Repeated fields default to packed for proto3 only. // Repeated fields default to packed for proto3 only.
f->is_packed = upb_FieldDef_IsPrimitive(f) && f->is_packed = has_type && upb_FieldDef_IsPrimitive(f) &&
f->label_ == kUpb_Label_Repeated && f->label_ == kUpb_Label_Repeated &&
upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3; upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3;
} }
f->has_presence = f->has_presence =
(!upb_FieldDef_IsRepeated(f)) && (!upb_FieldDef_IsRepeated(f)) &&
(upb_FieldDef_IsSubMessage(f) || upb_FieldDef_ContainingOneof(f) || (f->type_ == kUpb_FieldType_Message || f->type_ == kUpb_FieldType_Group ||
upb_FieldDef_ContainingOneof(f) ||
(upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto2)); (upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto2));
} }
@ -7874,16 +7894,22 @@ static void resolve_subdef(upb_DefBuilder* ctx, const char* prefix,
case UPB_DEFTYPE_ENUM: case UPB_DEFTYPE_ENUM:
f->sub.enumdef = def; f->sub.enumdef = def;
f->type_ = kUpb_FieldType_Enum; f->type_ = kUpb_FieldType_Enum;
if (!UPB_DESC(FieldOptions_has_packed)(f->opts)) {
f->is_packed = f->label_ == kUpb_Label_Repeated &&
upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3;
}
break; break;
case UPB_DEFTYPE_MSG: case UPB_DEFTYPE_MSG:
f->sub.msgdef = def; f->sub.msgdef = def;
f->type_ = kUpb_FieldType_Message; // It appears there is no way of f->type_ = kUpb_FieldType_Message; // It appears there is no way of
// this being a group. // this being a group.
f->has_presence = !upb_FieldDef_IsRepeated(f);
break; break;
default: default:
_upb_DefBuilder_Errf(ctx, "Couldn't resolve type name for field %s", _upb_DefBuilder_Errf(ctx, "Couldn't resolve type name for field %s",
f->full_name); f->full_name);
} }
break;
} }
case kUpb_FieldType_Message: case kUpb_FieldType_Message:
case kUpb_FieldType_Group: case kUpb_FieldType_Group:
@ -9494,7 +9520,8 @@ void _upb_OneofDef_Insert(upb_DefBuilder* ctx, upb_OneofDef* o,
// TODO(salo): More redundant work happening here. // TODO(salo): More redundant work happening here.
const bool name_exists = upb_strtable_lookup2(&o->ntof, name, size, NULL); const bool name_exists = upb_strtable_lookup2(&o->ntof, name, size, NULL);
if (UPB_UNLIKELY(name_exists)) { if (UPB_UNLIKELY(name_exists)) {
_upb_DefBuilder_Errf(ctx, "oneof fields have the same name (%s)", name); _upb_DefBuilder_Errf(ctx, "oneof fields have the same name (%.*s)",
(int)size, name);
} }
const bool ok = upb_inttable_insert(&o->itof, number, v, ctx->arena) && const bool ok = upb_inttable_insert(&o->itof, number, v, ctx->arena) &&
@ -14018,7 +14045,7 @@ bool upb_MiniTable_Link(upb_MiniTable* mt, const upb_MiniTable** sub_tables,
for (int i = 0; i < mt->field_count; i++) { for (int i = 0; i < mt->field_count; i++) {
upb_MiniTableField* f = (upb_MiniTableField*)&mt->fields[i]; upb_MiniTableField* f = (upb_MiniTableField*)&mt->fields[i];
if (upb_MiniTableField_CType(f) == kUpb_CType_Enum) { if (upb_MiniTableField_IsClosedEnum(f)) {
const upb_MiniTableEnum* sub = sub_enums[enum_count++]; const upb_MiniTableEnum* sub = sub_enums[enum_count++];
if (enum_count > sub_enum_count) return false; if (enum_count > sub_enum_count) return false;
if (sub != NULL) { if (sub != NULL) {
@ -14212,6 +14239,8 @@ bool upb_MiniTable_NextOneofField(const upb_MiniTable* m,
#undef UPB_POISON_MEMORY_REGION #undef UPB_POISON_MEMORY_REGION
#undef UPB_UNPOISON_MEMORY_REGION #undef UPB_UNPOISON_MEMORY_REGION
#undef UPB_ASAN #undef UPB_ASAN
#undef UPB_ASAN_GUARD_SIZE
#undef UPB_CLANG_ASAN
#undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 #undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3
#undef UPB_DEPRECATED #undef UPB_DEPRECATED
#undef UPB_GNUC_MIN #undef UPB_GNUC_MIN

@ -250,8 +250,23 @@
* expected behavior. * expected behavior.
*/ */
#if defined(__SANITIZE_ADDRESS__) /* Due to preprocessor limitations, the conditional logic for setting
* UPN_CLANG_ASAN below cannot be consolidated into a portable one-liner.
* See https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fattribute.html.
*/
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define UPB_CLANG_ASAN 1
#else
#define UPB_CLANG_ASAN 0
#endif
#else
#define UPB_CLANG_ASAN 0
#endif
#if defined(__SANITIZE_ADDRESS__) || UPB_CLANG_ASAN
#define UPB_ASAN 1 #define UPB_ASAN 1
#define UPB_ASAN_GUARD_SIZE 32
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -266,6 +281,7 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
__asan_unpoison_memory_region((addr), (size)) __asan_unpoison_memory_region((addr), (size))
#else #else
#define UPB_ASAN 0 #define UPB_ASAN 0
#define UPB_ASAN_GUARD_SIZE 0
#define UPB_POISON_MEMORY_REGION(addr, size) \ #define UPB_POISON_MEMORY_REGION(addr, size) \
((void)(addr), (void)(size)) ((void)(addr), (void)(size))
#define UPB_UNPOISON_MEMORY_REGION(addr, size) \ #define UPB_UNPOISON_MEMORY_REGION(addr, size) \
@ -488,14 +504,22 @@ UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b) {
#include <stdint.h> #include <stdint.h>
#ifndef UPB_MESSAGE_TYPEDEF_H_
#define UPB_MESSAGE_TYPEDEF_H_
// This typedef needs its own header to resolve a circular dependency between
// messages and mini tables.
typedef void upb_Message;
#endif /* UPB_MESSAGE_TYPEDEF_H_ */
// Must be last. // Must be last.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef void upb_Message;
// When a upb_Message* is stored in a message, array, or map, it is stored in a // When a upb_Message* is stored in a message, array, or map, it is stored in a
// tagged form. If the tag bit is set, the referenced upb_Message is of type // tagged form. If the tag bit is set, the referenced upb_Message is of type
// _kUpb_MiniTable_Empty (a sentinel message type with no fields) instead of // _kUpb_MiniTable_Empty (a sentinel message type with no fields) instead of
@ -627,8 +651,6 @@ UPB_INLINE bool upb_MiniTableEnum_CheckValue(const struct upb_MiniTableEnum* e,
// Must be last. // Must be last.
// LINT.IfChange(mini_table_field_layout)
struct upb_MiniTableField { struct upb_MiniTableField {
uint32_t number; uint32_t number;
uint16_t offset; uint16_t offset;
@ -681,8 +703,6 @@ typedef enum {
#define kUpb_FieldRep_Shift 6 #define kUpb_FieldRep_Shift 6
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/mini_table_field.ts:mini_table_field_layout)
UPB_INLINE upb_FieldRep UPB_INLINE upb_FieldRep
_upb_MiniTableField_GetRep(const struct upb_MiniTableField* field) { _upb_MiniTableField_GetRep(const struct upb_MiniTableField* field) {
return (upb_FieldRep)(field->mode >> kUpb_FieldRep_Shift); return (upb_FieldRep)(field->mode >> kUpb_FieldRep_Shift);
@ -734,8 +754,6 @@ UPB_INLINE bool upb_IsSubMessage(const struct upb_MiniTableField* field) {
// Must be last. // Must be last.
typedef void upb_Message;
struct upb_Decoder; struct upb_Decoder;
typedef const char* _upb_FieldParser(struct upb_Decoder* d, const char* ptr, typedef const char* _upb_FieldParser(struct upb_Decoder* d, const char* ptr,
upb_Message* msg, intptr_t table, upb_Message* msg, intptr_t table,
@ -757,8 +775,6 @@ typedef enum {
kUpb_ExtMode_IsMapEntry = 4, kUpb_ExtMode_IsMapEntry = 4,
} upb_ExtMode; } upb_ExtMode;
// LINT.IfChange(mini_table_layout)
union upb_MiniTableSub; union upb_MiniTableSub;
// upb_MiniTable represents the memory layout of a given upb_MessageDef. // upb_MiniTable represents the memory layout of a given upb_MessageDef.
@ -784,8 +800,6 @@ struct upb_MiniTable {
_upb_FastTable_Entry fasttable[]; _upb_FastTable_Entry fasttable[];
}; };
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/mini_table.ts:presence_logic)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -1102,14 +1116,10 @@ UPB_INLINE void upb_gfree(void* ptr) { upb_free(&upb_alloc_global, ptr); }
typedef struct upb_Arena upb_Arena; typedef struct upb_Arena upb_Arena;
// LINT.IfChange(arena_head)
typedef struct { typedef struct {
char *ptr, *end; char *ptr, *end;
} _upb_ArenaHead; } _upb_ArenaHead;
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/arena.ts:arena_head)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -1133,7 +1143,8 @@ UPB_INLINE size_t _upb_ArenaHas(upb_Arena* a) {
UPB_API_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) { UPB_API_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) {
size = UPB_ALIGN_MALLOC(size); size = UPB_ALIGN_MALLOC(size);
if (UPB_UNLIKELY(_upb_ArenaHas(a) < size)) { size_t span = size + UPB_ASAN_GUARD_SIZE;
if (UPB_UNLIKELY(_upb_ArenaHas(a) < span)) {
return _upb_Arena_SlowMalloc(a, size); return _upb_Arena_SlowMalloc(a, size);
} }
@ -1144,18 +1155,7 @@ UPB_API_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) {
UPB_ASSERT(UPB_ALIGN_MALLOC(size) == size); UPB_ASSERT(UPB_ALIGN_MALLOC(size) == size);
UPB_UNPOISON_MEMORY_REGION(ret, size); UPB_UNPOISON_MEMORY_REGION(ret, size);
h->ptr += size; h->ptr += span;
#if UPB_ASAN
{
size_t guard_size = 32;
if (_upb_ArenaHas(a) >= guard_size) {
h->ptr += guard_size;
} else {
h->ptr = h->end;
}
}
#endif
return ret; return ret;
} }
@ -1169,7 +1169,8 @@ UPB_API_INLINE void upb_Arena_ShrinkLast(upb_Arena* a, void* ptr,
_upb_ArenaHead* h = (_upb_ArenaHead*)a; _upb_ArenaHead* h = (_upb_ArenaHead*)a;
oldsize = UPB_ALIGN_MALLOC(oldsize); oldsize = UPB_ALIGN_MALLOC(oldsize);
size = UPB_ALIGN_MALLOC(size); size = UPB_ALIGN_MALLOC(size);
UPB_ASSERT((char*)ptr + oldsize == h->ptr); // Must be the last alloc. // Must be the last alloc.
UPB_ASSERT((char*)ptr + oldsize == h->ptr - UPB_ASAN_GUARD_SIZE);
UPB_ASSERT(size <= oldsize); UPB_ASSERT(size <= oldsize);
h->ptr = (char*)ptr + size; h->ptr = (char*)ptr + size;
} }
@ -1932,7 +1933,7 @@ UPB_INLINE int upb_Log2Ceiling(int x) {
return 32 - __builtin_clz(x - 1); return 32 - __builtin_clz(x - 1);
#else #else
int lg2 = 0; int lg2 = 0;
while (1 << lg2 < x) lg2++; while ((1 << lg2) < x) lg2++;
return lg2; return lg2;
#endif #endif
} }
@ -2101,7 +2102,15 @@ typedef struct {
} upb_MapEntryData; } upb_MapEntryData;
typedef struct { typedef struct {
void* internal_data; // LINT.IfChange(internal_layout)
union {
void* internal_data;
// Force 8-byte alignment, since the data members may contain members that
// require 8-byte alignment.
double d;
};
// LINT.ThenChange(//depot/google3/third_party/upb/upb/message/internal.h:internal_layout)
upb_MapEntryData data; upb_MapEntryData data;
} upb_MapEntry; } upb_MapEntry;
@ -2231,10 +2240,22 @@ UPB_INLINE void _upb_msg_map_set_value(void* msg, const void* val,
#endif /* UPB_COLLECTIONS_MAP_GENCODE_UTIL_H_ */ #endif /* UPB_COLLECTIONS_MAP_GENCODE_UTIL_H_ */
// This header is deprecated, use upb/mini_table/extension_registry.h instead #ifndef UPB_MESSAGE_ACCESSORS_H_
#define UPB_MESSAGE_ACCESSORS_H_
/*
** Our memory representation for parsing tables and messages themselves.
** Functions in this file are used by generated code and possibly reflection.
**
** The definitions in this file are internal to upb.
**/
#ifndef UPB_MESSAGE_INTERNAL_H_
#define UPB_MESSAGE_INTERNAL_H_
#ifndef UPB_EXTENSION_REGISTRY_H_ #include <stdlib.h>
#define UPB_EXTENSION_REGISTRY_H_ #include <string.h>
#ifndef UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ #ifndef UPB_MINI_TABLE_EXTENSION_REGISTRY_H_
@ -2311,30 +2332,6 @@ UPB_API const upb_MiniTableExtension* upb_ExtensionRegistry_Lookup(
#endif /* UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ */ #endif /* UPB_MINI_TABLE_EXTENSION_REGISTRY_H_ */
#endif /* UPB_EXTENSION_REGISTRY_H_ */
#ifndef UPB_MESSAGE_ACCESSORS_H_
#define UPB_MESSAGE_ACCESSORS_H_
#ifndef UPB_MESSAGE_ACCESSORS_INTERNAL_H_
#define UPB_MESSAGE_ACCESSORS_INTERNAL_H_
/*
** Our memory representation for parsing tables and messages themselves.
** Functions in this file are used by generated code and possibly reflection.
**
** The definitions in this file are internal to upb.
**/
#ifndef UPB_MESSAGE_INTERNAL_H_
#define UPB_MESSAGE_INTERNAL_H_
#include <stdlib.h>
#include <string.h>
// Must be last. // Must be last.
#ifdef __cplusplus #ifdef __cplusplus
@ -2375,7 +2372,15 @@ typedef struct {
} upb_Message_InternalData; } upb_Message_InternalData;
typedef struct { typedef struct {
upb_Message_InternalData* internal; // LINT.IfChange(internal_layout)
union {
upb_Message_InternalData* internal;
// Force 8-byte alignment, since the data members may contain members that
// require 8-byte alignment.
double d;
};
// LINT.ThenChange(//depot/google3/third_party/upb/upb/message/internal/map_entry.h:internal_layout)
/* Message data follows. */ /* Message data follows. */
} upb_Message_Internal; } upb_Message_Internal;
@ -2418,6 +2423,10 @@ bool _upb_Message_AddUnknown(upb_Message* msg, const char* data, size_t len,
#endif /* UPB_MESSAGE_INTERNAL_H_ */ #endif /* UPB_MESSAGE_INTERNAL_H_ */
#ifndef UPB_MESSAGE_INTERNAL_ACCESSORS_H_
#define UPB_MESSAGE_INTERNAL_ACCESSORS_H_
// Must be last. // Must be last.
#if defined(__GNUC__) && !defined(__clang__) #if defined(__GNUC__) && !defined(__clang__)
@ -2496,7 +2505,6 @@ UPB_INLINE uint32_t _upb_getoneofcase_field(const upb_Message* msg,
} }
// LINT.ThenChange(GoogleInternalName2) // LINT.ThenChange(GoogleInternalName2)
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/presence.ts:presence_logic)
UPB_INLINE bool _upb_MiniTableField_InOneOf(const upb_MiniTableField* field) { UPB_INLINE bool _upb_MiniTableField_InOneOf(const upb_MiniTableField* field) {
return field->presence < 0; return field->presence < 0;
@ -2521,8 +2529,6 @@ UPB_INLINE void _upb_Message_SetPresence(upb_Message* msg,
} }
} }
// LINT.IfChange(message_raw_fields)
UPB_INLINE bool _upb_MiniTable_ValueIsNonZero(const void* default_val, UPB_INLINE bool _upb_MiniTable_ValueIsNonZero(const void* default_val,
const upb_MiniTableField* field) { const upb_MiniTableField* field) {
char zero[16] = {0}; char zero[16] = {0};
@ -2561,8 +2567,6 @@ UPB_INLINE void _upb_MiniTable_CopyFieldData(void* to, const void* from,
UPB_UNREACHABLE(); UPB_UNREACHABLE();
} }
// LINT.ThenChange(//depot/google3/third_party/upb/js/impl/upb_bits/message.ts:message_raw_fields)
UPB_INLINE size_t UPB_INLINE size_t
_upb_MiniTable_ElementSizeLg2(const upb_MiniTableField* field) { _upb_MiniTable_ElementSizeLg2(const upb_MiniTableField* field) {
const unsigned char table[] = { const unsigned char table[] = {
@ -2771,7 +2775,7 @@ UPB_INLINE upb_Map* _upb_Message_GetOrCreateMutableMap(
#endif #endif
#endif // UPB_MESSAGE_ACCESSORS_INTERNAL_H_ #endif // UPB_MESSAGE_INTERNAL_ACCESSORS_H_
// Must be last. // Must be last.
@ -3357,9 +3361,9 @@ upb_MiniTable* upb_MiniTable_BuildWithBuf(const char* data, size_t len,
// Must be last. // Must be last.
struct upb_MiniTableFile { struct upb_MiniTableFile {
const upb_MiniTable** msgs; const struct upb_MiniTable** msgs;
const upb_MiniTableEnum** enums; const struct upb_MiniTableEnum** enums;
const upb_MiniTableExtension** exts; const struct upb_MiniTableExtension** exts;
int msg_count; int msg_count;
int enum_count; int enum_count;
int ext_count; int ext_count;
@ -11307,8 +11311,8 @@ double _upb_NoLocaleStrtod(const char *str, char **endptr);
#endif /* UPB_LEX_STRTOD_H_ */ #endif /* UPB_LEX_STRTOD_H_ */
#ifndef UPB_MEM_ARENA_INTERNAL_H_ #ifndef UPB_MEM_INTERNAL_ARENA_H_
#define UPB_MEM_ARENA_INTERNAL_H_ #define UPB_MEM_INTERNAL_ARENA_H_
// Must be last. // Must be last.
@ -11390,7 +11394,7 @@ UPB_INLINE bool upb_Arena_HasInitialBlock(upb_Arena* arena) {
} }
#endif /* UPB_MEM_ARENA_INTERNAL_H_ */ #endif /* UPB_MEM_INTERNAL_ARENA_H_ */
#ifndef UPB_PORT_ATOMIC_H_ #ifndef UPB_PORT_ATOMIC_H_
#define UPB_PORT_ATOMIC_H_ #define UPB_PORT_ATOMIC_H_
@ -11486,8 +11490,8 @@ extern "C" {
#define UPB_WIRE_READER_H_ #define UPB_WIRE_READER_H_
#ifndef UPB_WIRE_SWAP_INTERNAL_H_ #ifndef UPB_WIRE_INTERNAL_SWAP_H_
#define UPB_WIRE_SWAP_INTERNAL_H_ #define UPB_WIRE_INTERNAL_SWAP_H_
// Must be last. // Must be last.
@ -11519,7 +11523,7 @@ UPB_INLINE uint64_t _upb_BigEndian_Swap64(uint64_t val) {
#endif #endif
#endif /* UPB_WIRE_SWAP_INTERNAL_H_ */ #endif /* UPB_WIRE_INTERNAL_SWAP_H_ */
#ifndef UPB_WIRE_TYPES_H_ #ifndef UPB_WIRE_TYPES_H_
#define UPB_WIRE_TYPES_H_ #define UPB_WIRE_TYPES_H_
@ -12399,8 +12403,8 @@ upb_MethodDef* _upb_MethodDefs_New(
#endif /* UPB_REFLECTION_METHOD_DEF_INTERNAL_H_ */ #endif /* UPB_REFLECTION_METHOD_DEF_INTERNAL_H_ */
#ifndef UPB_WIRE_COMMON_INTERNAL_H_ #ifndef UPB_WIRE_INTERNAL_COMMON_H_
#define UPB_WIRE_COMMON_INTERNAL_H_ #define UPB_WIRE_INTERNAL_COMMON_H_
// Must be last. // Must be last.
@ -12419,15 +12423,15 @@ enum {
}; };
#endif /* UPB_WIRE_COMMON_INTERNAL_H_ */ #endif /* UPB_WIRE_INTERNAL_COMMON_H_ */
/* /*
* Internal implementation details of the decoder that are shared between * Internal implementation details of the decoder that are shared between
* decode.c and decode_fast.c. * decode.c and decode_fast.c.
*/ */
#ifndef UPB_WIRE_DECODE_INTERNAL_H_ #ifndef UPB_WIRE_INTERNAL_DECODE_H_
#define UPB_WIRE_DECODE_INTERNAL_H_ #define UPB_WIRE_INTERNAL_DECODE_H_
#include "utf8_range.h" #include "utf8_range.h"
@ -12550,7 +12554,7 @@ UPB_INLINE uint32_t _upb_FastDecoder_LoadTag(const char* ptr) {
} }
#endif /* UPB_WIRE_DECODE_INTERNAL_H_ */ #endif /* UPB_WIRE_INTERNAL_DECODE_H_ */
#ifndef UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_ #ifndef UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_
#define UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_ #define UPB_MINI_DESCRIPTOR_INTERNAL_BASE92_H_
@ -12746,6 +12750,8 @@ UPB_INLINE const char* upb_MdDecoder_DecodeBase92Varint(
#undef UPB_POISON_MEMORY_REGION #undef UPB_POISON_MEMORY_REGION
#undef UPB_UNPOISON_MEMORY_REGION #undef UPB_UNPOISON_MEMORY_REGION
#undef UPB_ASAN #undef UPB_ASAN
#undef UPB_ASAN_GUARD_SIZE
#undef UPB_CLANG_ASAN
#undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 #undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3
#undef UPB_DEPRECATED #undef UPB_DEPRECATED
#undef UPB_GNUC_MIN #undef UPB_GNUC_MIN

Loading…
Cancel
Save