upb/upb/upb.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2021, Google LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of Google LLC nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 /*
29  * This file contains shared definitions that are widely used across upb.
30  */
31 
32 #ifndef UPB_H_
33 #define UPB_H_
34 
35 #include <assert.h>
36 #include <stdarg.h>
37 #include <stdbool.h>
38 #include <stddef.h>
39 #include <stdint.h>
40 #include <string.h>
41 
42 #include "upb/port_def.inc"
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 /* upb_Status *****************************************************************/
49 
50 #define _kUpb_Status_MaxMessage 127
51 
52 typedef struct {
53  bool ok;
54  char msg[_kUpb_Status_MaxMessage]; /* Error message; NULL-terminated. */
55 } upb_Status;
56 
57 const char* upb_Status_ErrorMessage(const upb_Status* status);
58 bool upb_Status_IsOk(const upb_Status* status);
59 
60 /* These are no-op if |status| is NULL. */
63 void upb_Status_SetErrorFormat(upb_Status* status, const char* fmt, ...)
64  UPB_PRINTF(2, 3);
66  va_list args) UPB_PRINTF(2, 0);
68  va_list args) UPB_PRINTF(2, 0);
69 
72 typedef struct {
73  const char* data;
74  size_t size;
76 
78  size_t size) {
80  ret.data = data;
81  ret.size = size;
82  return ret;
83 }
84 
86  return upb_StringView_FromDataAndSize(data, strlen(data));
87 }
88 
90  return a.size == b.size && memcmp(a.data, b.data, a.size) == 0;
91 }
92 
93 #define UPB_STRINGVIEW_INIT(ptr, len) \
94  { ptr, len }
95 
96 #define UPB_STRINGVIEW_FORMAT "%.*s"
97 #define UPB_STRINGVIEW_ARGS(view) (int)(view).size, (view).data
98 
101 /* A upb_alloc is a possibly-stateful allocator object.
102  *
103  * It could either be an arena allocator (which doesn't require individual
104  * free() calls) or a regular malloc() (which does). The client must therefore
105  * free memory unless it knows that the allocator is an arena allocator. */
106 
107 struct upb_alloc;
108 typedef struct upb_alloc upb_alloc;
109 
110 /* A malloc()/free() function.
111  * If "size" is 0 then the function acts like free(), otherwise it acts like
112  * realloc(). Only "oldsize" bytes from a previous allocation are preserved. */
113 typedef void* upb_alloc_func(upb_alloc* alloc, void* ptr, size_t oldsize,
114  size_t size);
115 
116 struct upb_alloc {
118 };
119 
121  UPB_ASSERT(alloc);
122  return alloc->func(alloc, NULL, 0, size);
123 }
124 
125 UPB_INLINE void* upb_realloc(upb_alloc* alloc, void* ptr, size_t oldsize,
126  size_t size) {
127  UPB_ASSERT(alloc);
128  return alloc->func(alloc, ptr, oldsize, size);
129 }
130 
132  assert(alloc);
133  alloc->func(alloc, ptr, 0, 0);
134 }
135 
136 /* The global allocator used by upb. Uses the standard malloc()/free(). */
137 
139 
140 /* Functions that hard-code the global malloc.
141  *
142  * We still get benefit because we can put custom logic into our global
143  * allocator, like injecting out-of-memory faults in debug/testing builds. */
144 
145 UPB_INLINE void* upb_gmalloc(size_t size) {
146  return upb_malloc(&upb_alloc_global, size);
147 }
148 
149 UPB_INLINE void* upb_grealloc(void* ptr, size_t oldsize, size_t size) {
150  return upb_realloc(&upb_alloc_global, ptr, oldsize, size);
151 }
152 
154 
155 /* upb_Arena ******************************************************************/
156 
157 /* upb_Arena is a specific allocator implementation that uses arena allocation.
158  * The user provides an allocator that will be used to allocate the underlying
159  * arena blocks. Arenas by nature do not require the individual allocations
160  * to be freed. However the Arena does allow users to register cleanup
161  * functions that will run when the arena is destroyed.
162  *
163  * A upb_Arena is *not* thread-safe.
164  *
165  * You could write a thread-safe arena allocator that satisfies the
166  * upb_alloc interface, but it would not be as efficient for the
167  * single-threaded case. */
168 
169 typedef void upb_CleanupFunc(void* ud);
170 
171 struct upb_Arena;
172 typedef struct upb_Arena upb_Arena;
173 
174 typedef struct {
175  /* We implement the allocator interface.
176  * This must be the first member of upb_Arena!
177  * TODO(haberman): remove once handlers are gone. */
179 
180  char *ptr, *end;
182 
183 /* Creates an arena from the given initial block (if any -- n may be 0).
184  * Additional blocks will be allocated from |alloc|. If |alloc| is NULL, this
185  * is a fixed-size arena and cannot grow. */
186 upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc);
187 void upb_Arena_Free(upb_Arena* a);
190 void* _upb_Arena_SlowMalloc(upb_Arena* a, size_t size);
191 
193 
196  return (size_t)(h->end - h->ptr);
197 }
198 
201  void* ret = h->ptr;
202  //UPB_ASSERT(UPB_ALIGN_MALLOC((uintptr_t)ret) == (uintptr_t)ret);
205 
206  h->ptr += size;
207 
208 #if UPB_ASAN
209  {
210  size_t guard_size = 32;
211  if (_upb_ArenaHas(a) >= guard_size) {
212  h->ptr += guard_size;
213  } else {
214  h->ptr = h->end;
215  }
216  }
217 #endif
218 
219  return ret;
220 }
221 
224 
225  if (UPB_UNLIKELY(_upb_ArenaHas(a) < size)) {
226  return _upb_Arena_SlowMalloc(a, size);
227  }
228 
229  return _upb_Arena_FastMalloc(a, size);
230 }
231 
232 // Shrinks the last alloc from arena.
233 // REQUIRES: (ptr, oldsize) was the last malloc/realloc from this arena.
234 // We could also add a upb_Arena_TryShrinkLast() which is simply a no-op if
235 // this was not the last alloc.
236 UPB_INLINE void upb_Arena_ShrinkLast(upb_Arena* a, void* ptr, size_t oldsize,
237  size_t size) {
239  oldsize = UPB_ALIGN_MALLOC(oldsize);
241  UPB_ASSERT((char*)ptr + oldsize == h->ptr); // Must be the last alloc.
242  UPB_ASSERT(size <= oldsize);
243  h->ptr = (char*)ptr + size;
244 }
245 
246 UPB_INLINE void* upb_Arena_Realloc(upb_Arena* a, void* ptr, size_t oldsize,
247  size_t size) {
249  oldsize = UPB_ALIGN_MALLOC(oldsize);
251  if (size <= oldsize) {
252  if ((char*)ptr + oldsize == h->ptr) {
253  upb_Arena_ShrinkLast(a, ptr, oldsize, size);
254  }
255  return ptr;
256  }
257 
258  void* ret = upb_Arena_Malloc(a, size);
259 
260  if (ret && oldsize > 0) {
261  memcpy(ret, ptr, UPB_MIN(oldsize, size));
262  }
263 
264  return ret;
265 }
266 
268  return upb_Arena_Init(NULL, 0, &upb_alloc_global);
269 }
270 
271 /* Constants ******************************************************************/
272 
273 /* A list of types as they are encoded on-the-wire. */
274 typedef enum {
281 } upb_WireType;
282 
283 /* The types a field can have. Note that this list is not identical to the
284  * types defined in descriptor.proto, which gives INT32 and SINT32 separate
285  * types (we distinguish the two with the "integer encoding" enum below). */
286 typedef enum {
291  kUpb_CType_Enum = 5, /* Enum values are int32. */
298 } upb_CType;
299 
300 /* The repeated-ness of each field; this matches descriptor.proto. */
301 typedef enum {
305 } upb_Label;
306 
307 /* Descriptor types, as defined in descriptor.proto. */
308 typedef enum {
327 } upb_FieldType;
328 
329 #define kUpb_Map_Begin ((size_t)-1)
330 
332  int x = 1;
333  return *(char*)&x == 1;
334 }
335 
337  if (_upb_IsLittleEndian()) {
338  return val;
339  } else {
340  return ((val & 0xff) << 24) | ((val & 0xff00) << 8) |
341  ((val & 0xff0000) >> 8) | ((val & 0xff000000) >> 24);
342  }
343 }
344 
346  if (_upb_IsLittleEndian()) {
347  return val;
348  } else {
349  return ((uint64_t)_upb_BigEndian_Swap32(val) << 32) |
350  _upb_BigEndian_Swap32(val >> 32);
351  }
352 }
353 
355  if (x <= 1) return 0;
356 #ifdef __GNUC__
357  return 32 - __builtin_clz(x - 1);
358 #else
359  int lg2 = 0;
360  while (1 << lg2 < x) lg2++;
361  return lg2;
362 #endif
363 }
364 
366 
367 #include "upb/port_undef.inc"
368 
369 #ifdef __cplusplus
370 } /* extern "C" */
371 #endif
372 
373 #endif /* UPB_H_ */
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
kUpb_WireType_Delimited
@ kUpb_WireType_Delimited
Definition: upb/upb/upb.h:277
kUpb_CType_String
@ kUpb_CType_String
Definition: upb/upb/upb.h:296
kUpb_FieldType_SInt64
@ kUpb_FieldType_SInt64
Definition: upb/upb/upb.h:326
upb_FieldType
upb_FieldType
Definition: upb/upb/upb.h:308
kUpb_CType_UInt32
@ kUpb_CType_UInt32
Definition: upb/upb/upb.h:290
kUpb_FieldType_SFixed64
@ kUpb_FieldType_SFixed64
Definition: upb/upb/upb.h:324
upb_Arena_ShrinkLast
UPB_INLINE void upb_Arena_ShrinkLast(upb_Arena *a, void *ptr, size_t oldsize, size_t size)
Definition: upb/upb/upb.h:236
upb_CType
upb_CType
Definition: upb/upb/upb.h:286
upb_alloc_func
void * upb_alloc_func(upb_alloc *alloc, void *ptr, size_t oldsize, size_t size)
Definition: upb/upb/upb.h:113
kUpb_CType_Int32
@ kUpb_CType_Int32
Definition: upb/upb/upb.h:289
kUpb_FieldType_SInt32
@ kUpb_FieldType_SInt32
Definition: upb/upb/upb.h:325
upb_Arena_Realloc
UPB_INLINE void * upb_Arena_Realloc(upb_Arena *a, void *ptr, size_t oldsize, size_t size)
Definition: upb/upb/upb.h:246
upb_Status_VAppendErrorFormat
void void void upb_Status_VAppendErrorFormat(upb_Status *status, const char *fmt, va_list args) UPB_PRINTF(2
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
_upb_Arena_SlowMalloc
void * _upb_Arena_SlowMalloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.c:176
_upb_ArenaHas
UPB_INLINE size_t _upb_ArenaHas(upb_Arena *a)
Definition: upb/upb/upb.h:194
UPB_UNLIKELY
#define UPB_UNLIKELY(x)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:62
kUpb_FieldType_UInt64
@ kUpb_FieldType_UInt64
Definition: upb/upb/upb.h:312
upb_CleanupFunc
void upb_CleanupFunc(void *ud)
Definition: upb/upb/upb.h:169
upb_StringView::data
const char * data
Definition: upb/upb/upb.h:73
upb_Status_VSetErrorFormat
void void upb_Status_VSetErrorFormat(upb_Status *status, const char *fmt, va_list args) UPB_PRINTF(2
_upb_ArenaHead::alloc
upb_alloc alloc
Definition: upb/upb/upb.h:178
string.h
kUpb_CType_Bytes
@ kUpb_CType_Bytes
Definition: upb/upb/upb.h:297
status
absl::Status status
Definition: rls.cc:251
kUpb_FieldType_SFixed32
@ kUpb_FieldType_SFixed32
Definition: upb/upb/upb.h:323
upb_free
UPB_INLINE void upb_free(upb_alloc *alloc, void *ptr)
Definition: upb/upb/upb.h:131
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
_upb_Log2CeilingSize
UPB_INLINE int _upb_Log2CeilingSize(int x)
Definition: upb/upb/upb.h:365
_upb_Arena_FastMalloc
UPB_INLINE void * _upb_Arena_FastMalloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.h:199
UPB_PRINTF
#define UPB_PRINTF(str, first_vararg)
Definition: php-upb.c:122
upb_Arena_New
UPB_INLINE upb_Arena * upb_Arena_New(void)
Definition: upb/upb/upb.h:267
kUpb_CType_Int64
@ kUpb_CType_Int64
Definition: upb/upb/upb.h:294
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
kUpb_FieldType_Double
@ kUpb_FieldType_Double
Definition: upb/upb/upb.h:309
kUpb_FieldType_Bool
@ kUpb_FieldType_Bool
Definition: upb/upb/upb.h:316
upb_WireType
upb_WireType
Definition: upb/upb/upb.h:274
UPB_MIN
#define UPB_MIN(x, y)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:126
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
kUpb_FieldType_Float
@ kUpb_FieldType_Float
Definition: upb/upb/upb.h:310
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
kUpb_FieldType_UInt32
@ kUpb_FieldType_UInt32
Definition: upb/upb/upb.h:321
kUpb_WireType_EndGroup
@ kUpb_WireType_EndGroup
Definition: upb/upb/upb.h:279
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
kUpb_FieldType_String
@ kUpb_FieldType_String
Definition: upb/upb/upb.h:317
_kUpb_Status_MaxMessage
#define _kUpb_Status_MaxMessage
Definition: upb/upb/upb.h:50
kUpb_CType_Double
@ kUpb_CType_Double
Definition: upb/upb/upb.h:293
upb_StringView::size
size_t size
Definition: upb/upb/upb.h:74
kUpb_FieldType_Enum
@ kUpb_FieldType_Enum
Definition: upb/upb/upb.h:322
upb_Arena_Malloc
UPB_INLINE void * upb_Arena_Malloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.h:222
kUpb_FieldType_Fixed32
@ kUpb_FieldType_Fixed32
Definition: upb/upb/upb.h:315
upb_gfree
UPB_INLINE void upb_gfree(void *ptr)
Definition: upb/upb/upb.h:153
UPB_INLINE
#define UPB_INLINE
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:53
kUpb_WireType_Varint
@ kUpb_WireType_Varint
Definition: upb/upb/upb.h:275
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
UPB_ALIGN_MALLOC
#define UPB_ALIGN_MALLOC(size)
Definition: php-upb.c:95
upb_Status_ErrorMessage
const char * upb_Status_ErrorMessage(const upb_Status *status)
Definition: upb/upb/upb.c:52
upb_realloc
UPB_INLINE void * upb_realloc(upb_alloc *alloc, void *ptr, size_t oldsize, size_t size)
Definition: upb/upb/upb.h:125
upb_Status_SetErrorFormat
void upb_Status_SetErrorFormat(upb_Status *status, const char *fmt,...) UPB_PRINTF(2
_upb_ArenaHead::ptr
char * ptr
Definition: upb/upb/upb.h:180
upb_Status_Clear
void upb_Status_Clear(upb_Status *status)
Definition: upb/upb/upb.c:44
upb_Status
Definition: upb/upb/upb.h:52
UPB_ASSERT
#define UPB_ASSERT(expr)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:135
x
int x
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3610
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
_upb_BigEndian_Swap64
UPB_INLINE uint64_t _upb_BigEndian_Swap64(uint64_t val)
Definition: upb/upb/upb.h:345
_upb_IsLittleEndian
UPB_INLINE bool _upb_IsLittleEndian(void)
Definition: upb/upb/upb.h:331
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
kUpb_Label_Required
@ kUpb_Label_Required
Definition: upb/upb/upb.h:303
upb_Arena_Init
upb_Arena * upb_Arena_Init(void *mem, size_t n, upb_alloc *alloc)
Definition: upb/upb/upb.c:216
upb_StringView_IsEqual
UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b)
Definition: upb/upb/upb.h:89
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
stdint.h
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
upb_Arena_Alloc
UPB_INLINE upb_alloc * upb_Arena_Alloc(upb_Arena *a)
Definition: upb/upb/upb.h:192
kUpb_CType_Float
@ kUpb_CType_Float
Definition: upb/upb/upb.h:288
mem
void * mem
Definition: libc.cpp:91
kUpb_FieldType_Fixed64
@ kUpb_FieldType_Fixed64
Definition: upb/upb/upb.h:314
testing::internal::fmt
GTEST_API_ const char * fmt
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1808
upb_gmalloc
UPB_INLINE void * upb_gmalloc(size_t size)
Definition: upb/upb/upb.h:145
func
const EVP_CIPHER *(* func)(void)
Definition: cipher_extra.c:73
kUpb_WireType_32Bit
@ kUpb_WireType_32Bit
Definition: upb/upb/upb.h:280
kUpb_Label_Repeated
@ kUpb_Label_Repeated
Definition: upb/upb/upb.h:304
upb_StringView
Definition: upb/upb/upb.h:72
upb_Arena_Free
void upb_Arena_Free(upb_Arena *a)
Definition: upb/upb/upb.c:273
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
upb_alloc_global
upb_alloc upb_alloc_global
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:2241
kUpb_FieldType_Group
@ kUpb_FieldType_Group
Definition: upb/upb/upb.h:318
_upb_Log2Ceiling
UPB_INLINE int _upb_Log2Ceiling(int x)
Definition: upb/upb/upb.h:354
upb_Arena_Fuse
bool upb_Arena_Fuse(upb_Arena *a, upb_Arena *b)
Definition: upb/upb/upb.c:299
upb_StringView_FromDataAndSize
UPB_INLINE upb_StringView upb_StringView_FromDataAndSize(const char *data, size_t size)
Definition: upb/upb/upb.h:77
_upb_BigEndian_Swap32
UPB_INLINE uint32_t _upb_BigEndian_Swap32(uint32_t val)
Definition: upb/upb/upb.h:336
kUpb_FieldType_Message
@ kUpb_FieldType_Message
Definition: upb/upb/upb.h:319
upb_StringView_FromString
UPB_INLINE upb_StringView upb_StringView_FromString(const char *data)
Definition: upb/upb/upb.h:85
upb_alloc::func
upb_alloc_func * func
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.h:300
kUpb_CType_Bool
@ kUpb_CType_Bool
Definition: upb/upb/upb.h:287
kUpb_CType_Enum
@ kUpb_CType_Enum
Definition: upb/upb/upb.h:291
upb_malloc
UPB_INLINE void * upb_malloc(upb_alloc *alloc, size_t size)
Definition: upb/upb/upb.h:120
upb_Label
upb_Label
Definition: upb/upb/upb.h:301
kUpb_CType_UInt64
@ kUpb_CType_UInt64
Definition: upb/upb/upb.h:295
upb_grealloc
UPB_INLINE void * upb_grealloc(void *ptr, size_t oldsize, size_t size)
Definition: upb/upb/upb.h:149
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
kUpb_FieldType_Int32
@ kUpb_FieldType_Int32
Definition: upb/upb/upb.h:313
upb_Arena_AddCleanup
bool upb_Arena_AddCleanup(upb_Arena *a, void *ud, upb_CleanupFunc *func)
Definition: upb/upb/upb.c:278
upb_alloc
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.h:299
kUpb_FieldType_Int64
@ kUpb_FieldType_Int64
Definition: upb/upb/upb.h:311
upb_Status::ok
bool ok
Definition: upb/upb/upb.h:53
kUpb_Label_Optional
@ kUpb_Label_Optional
Definition: upb/upb/upb.h:302
upb_Arena
Definition: upb_internal.h:36
upb_Status_IsOk
bool upb_Status_IsOk(const upb_Status *status)
Definition: upb/upb/upb.c:50
_upb_ArenaHead
Definition: upb/upb/upb.h:174
upb_Status_SetErrorMessage
void upb_Status_SetErrorMessage(upb_Status *status, const char *msg)
Definition: upb/upb/upb.c:56
alloc
std::allocator< int > alloc
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:87
UPB_UNPOISON_MEMORY_REGION
#define UPB_UNPOISON_MEMORY_REGION(addr, size)
Definition: php-upb.c:253
kUpb_WireType_64Bit
@ kUpb_WireType_64Bit
Definition: upb/upb/upb.h:276
kUpb_CType_Message
@ kUpb_CType_Message
Definition: upb/upb/upb.h:292
kUpb_WireType_StartGroup
@ kUpb_WireType_StartGroup
Definition: upb/upb/upb.h:278
kUpb_FieldType_Bytes
@ kUpb_FieldType_Bytes
Definition: upb/upb/upb.h:320


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:48