mini_table.c
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 #include "upb/mini_table.h"
29 
30 #include <inttypes.h>
31 #include <setjmp.h>
32 
33 #include "upb/msg_internal.h"
34 #include "upb/upb.h"
35 
36 // Must be last.
37 #include "upb/port_def.inc"
38 
39 typedef enum {
58 
61 
62 typedef enum {
65  // upb only.
69 
70 enum {
82 };
83 
85  static const char kUpb_ToBase92[] = {
86  ' ', '!', '#', '$', '%', '&', '(', ')', '*', '+', ',', '-', '.', '/',
87  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=',
88  '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
89  'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
90  'Z', '[', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
91  'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
92  'w', 'x', 'y', 'z', '{', '|', '}', '~',
93  };
94 
95  UPB_ASSERT(0 <= ch && ch < 92);
96  return kUpb_ToBase92[ch];
97 }
98 
100  static const int8_t kUpb_FromBase92[] = {
101  0, 1, -1, 2, 3, 4, 5, -1, 6, 7, 8, 9, 10, 11, 12, 13,
102  14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
103  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
104  46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, 58, 59, 60,
105  61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
106  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
107  };
108 
109  if (' ' > ch || ch > '~') return -1;
110  return kUpb_FromBase92[ch - ' '];
111 }
112 
114  // clang-format off
115  static const unsigned kUnpackableTypes =
116  (1 << kUpb_FieldType_String) |
117  (1 << kUpb_FieldType_Bytes) |
118  (1 << kUpb_FieldType_Message) |
119  (1 << kUpb_FieldType_Group);
120  // clang-format on
121  return (1 << type) & ~kUnpackableTypes;
122 }
123 
126 typedef struct {
127  char* buf_start; // Only for checking kUpb_MtDataEncoder_MinSize.
130  enum {
134  } oneof_state;
136 
138  upb_MtDataEncoder* e, char* buf_start) {
140  ret->buf_start = buf_start;
141  return ret;
142 }
143 
144 static char* upb_MtDataEncoder_Put(upb_MtDataEncoder* e, char* ptr, char ch) {
147  if (ptr == e->end) return NULL;
148  *ptr++ = upb_ToBase92(ch);
149  return ptr;
150 }
151 
153  uint32_t val, int min, int max) {
155  UPB_ASSERT(shift <= 6);
156  uint32_t mask = (1 << shift) - 1;
157  do {
158  uint32_t bits = val & mask;
160  if (!ptr) return NULL;
161  val >>= shift;
162  } while (val);
163  return ptr;
164 }
165 
167  uint64_t mod) {
168  if (mod) {
172  }
173  return ptr;
174 }
175 
177  uint64_t msg_mod) {
179  in->msg_mod = msg_mod;
180  in->last_field_num = 0;
181  in->oneof_state = kUpb_OneofState_NotStarted;
182  return upb_MtDataEncoder_PutModifier(e, ptr, msg_mod);
183 }
184 
186  upb_FieldType type, uint32_t field_num,
187  uint64_t field_mod) {
188  static const char kUpb_TypeToEncoded[] = {
207  };
208 
210  if (field_num <= in->last_field_num) return NULL;
211  if (in->last_field_num + 1 != field_num) {
212  // Put skip.
213  UPB_ASSERT(field_num > in->last_field_num);
214  uint32_t skip = field_num - in->last_field_num;
217  if (!ptr) return NULL;
218  }
219  in->last_field_num = field_num;
220 
221  uint32_t encoded_modifiers = 0;
222 
223  // Put field type.
224  if (type == kUpb_FieldType_Enum &&
225  !(field_mod & kUpb_FieldModifier_IsClosedEnum)) {
227  }
228 
229  int encoded_type = kUpb_TypeToEncoded[type];
230  if (field_mod & kUpb_FieldModifier_IsRepeated) {
231  // Repeated fields shift the type number up (unlike other modifiers which
232  // are bit flags).
233  encoded_type += kUpb_EncodedType_RepeatedBase;
234 
235  if (upb_IsTypePackable(type)) {
236  bool field_is_packed = field_mod & kUpb_FieldModifier_IsPacked;
237  bool default_is_packed =
239  if (field_is_packed != default_is_packed) {
240  encoded_modifiers |= kUpb_EncodedFieldModifier_FlipPacked;
241  }
242  }
243  }
244  ptr = upb_MtDataEncoder_Put(e, ptr, encoded_type);
245  if (!ptr) return NULL;
246 
247  if (field_mod & kUpb_FieldModifier_IsProto3Singular) {
248  encoded_modifiers |= kUpb_EncodedFieldModifier_IsProto3Singular;
249  }
250  if (field_mod & kUpb_FieldModifier_IsRequired) {
251  encoded_modifiers |= kUpb_EncodedFieldModifier_IsRequired;
252  }
253  return upb_MtDataEncoder_PutModifier(e, ptr, encoded_modifiers);
254 }
255 
258  if (in->oneof_state == kUpb_OneofState_NotStarted) {
260  } else {
263  }
264  in->oneof_state = kUpb_OneofState_StartedOneof;
265  return ptr;
266 }
267 
269  uint32_t field_num) {
271  if (in->oneof_state == kUpb_OneofState_EmittedOneofField) {
274  if (!ptr) return NULL;
275  }
277  upb_ToBase92(63));
278  in->oneof_state = kUpb_OneofState_EmittedOneofField;
279  return ptr;
280 }
281 
284  int n = table->field_count;
285  for (int i = 0; i < n; i++) {
286  if (table->fields[i].number == number) {
287  return &table->fields[i];
288  }
289  }
290  return NULL;
291 }
292 
295 // Note: we sort by this number when calculating layout order.
296 typedef enum {
298  kUpb_LayoutItemType_OneofField, // Oneof field data.
299  kUpb_LayoutItemType_Field, // Non-oneof field data.
300 
303 
304 #define kUpb_LayoutItem_IndexSentinel ((uint16_t)-1)
305 
306 typedef struct {
307  // Index of the corresponding field. When this is a oneof field, the field's
308  // offset will be the index of the next field in a linked list.
314 
315 typedef struct {
317  size_t size;
318  size_t capacity;
320 
321 typedef struct {
322  const char* end;
329  jmp_buf err;
330 } upb_MtDecoder;
331 
332 UPB_PRINTF(2, 3)
334  const char* fmt, ...) {
335  va_list argp;
336  upb_Status_SetErrorMessage(d->status, "Error building mini table: ");
337  va_start(argp, fmt);
339  va_end(argp);
340  UPB_LONGJMP(d->err, 1);
341 }
342 
343 static void upb_MtDecoder_CheckOutOfMemory(upb_MtDecoder* d, const void* ptr) {
344  if (!ptr) upb_MtDecoder_ErrorFormat(d, "Out of memory");
345 }
346 
347 // In each field's offset, we temporarily store a presence classifier:
353  // Negative values refer to a specific oneof with that number. Positive
354  // values >= kOneofBase indicate that this field is in a oneof, and specify
355  // the next field in this oneof's linked list.
356 };
357 
359  const char* ptr,
360  char first_ch, uint8_t min,
361  uint8_t max,
362  uint32_t* out_val) {
363  uint32_t val = 0;
364  uint32_t shift = 0;
365  const int bits_per_char =
367  char ch = first_ch;
368  while (1) {
370  UPB_ASSERT(shift < 32 - bits_per_char);
371  val |= bits << shift;
372  if (ptr == d->end || *ptr < min || max < *ptr) {
373  *out_val = val;
374  return ptr;
375  }
376  ch = *ptr++;
377  shift += bits_per_char;
378  }
379 }
380 
382  uint64_t msg_modifiers) {
383  switch (field->descriptortype) {
386  case kUpb_FieldType_Enum:
387  return true;
389  if (!(msg_modifiers & kUpb_MessageModifier_ValidateUtf8)) {
390  field->descriptortype = kUpb_FieldType_Bytes;
391  }
392  return false;
393  default:
394  return false;
395  }
396 }
397 
399  return (field->mode & kUpb_FieldMode_Array) &&
400  upb_IsTypePackable(field->descriptortype);
401 }
402 
404  upb_FieldType type, uint32_t* sub_count,
405  uint64_t msg_modifiers) {
406  field->descriptortype = type;
407  if (upb_MiniTable_HasSub(field, msg_modifiers)) {
408  field->submsg_index = sub_count ? (*sub_count)++ : 0;
409  } else {
410  field->submsg_index = kUpb_NoSub;
411  }
412 
414  (msg_modifiers & kUpb_MessageModifier_DefaultIsPacked)) {
416  }
417 }
418 
421  uint64_t msg_modifiers,
422  uint32_t* sub_count) {
423  static const char kUpb_EncodedToFieldRep[] = {
442  };
443 
444  static const char kUpb_EncodedToType[] = {
463  };
464 
468  field->mode = kUpb_FieldMode_Array;
470  field->offset = kNoPresence;
471  } else {
473  field->mode |= kUpb_EncodedToFieldRep[type] << kUpb_FieldRep_Shift;
474  field->offset = kHasbitPresence;
475  }
476  if (type >= 18) {
477  upb_MtDecoder_ErrorFormat(d, "Invalid field type: %d", (int)type);
478  UPB_UNREACHABLE();
479  }
480  upb_MiniTable_SetTypeAndSub(field, kUpb_EncodedToType[type], sub_count,
481  msg_modifiers);
482 }
483 
485  uint32_t message_modifiers,
486  uint32_t field_modifiers,
488  if (field_modifiers & kUpb_EncodedFieldModifier_FlipPacked) {
491  d, "Cannot flip packed on unpackable field %" PRIu32, field->number);
492  UPB_UNREACHABLE();
493  }
495  }
496 
497  bool singular = field_modifiers & kUpb_EncodedFieldModifier_IsProto3Singular;
498  bool required = field_modifiers & kUpb_EncodedFieldModifier_IsRequired;
499 
500  // Validate.
501  if ((singular || required) && field->offset != kHasbitPresence) {
503  d, "Invalid modifier(s) for repeated field %" PRIu32, field->number);
504  UPB_UNREACHABLE();
505  }
506  if (singular && required) {
508  d, "Field %" PRIu32 " cannot be both singular and required",
509  field->number);
510  UPB_UNREACHABLE();
511  }
512 
513  if (singular) field->offset = kNoPresence;
514  if (required) {
515  field->offset = kRequiredPresence;
516  }
517 }
518 
520  if (d->vec.size == d->vec.capacity) {
521  size_t new_cap = UPB_MAX(8, d->vec.size * 2);
522  d->vec.data = realloc(d->vec.data, new_cap * sizeof(*d->vec.data));
523  upb_MtDecoder_CheckOutOfMemory(d, d->vec.data);
524  d->vec.capacity = new_cap;
525  }
526  d->vec.data[d->vec.size++] = item;
527 }
528 
531  upb_MtDecoder_ErrorFormat(d, "Empty oneof");
532  UPB_UNREACHABLE();
533  }
534  item.field_index -= kOneofBase;
535 
536  // Push oneof data.
538  upb_MtDecoder_PushItem(d, item);
539 
540  // Push oneof case.
541  item.rep = kUpb_FieldRep_4Byte; // Field Number.
543  upb_MtDecoder_PushItem(d, item);
544 }
545 
548  static const uint8_t kRepToSize32[] = {
551  [kUpb_FieldRep_8Byte] = 8,
552  };
553  static const uint8_t kRepToSize64[] = {
556  [kUpb_FieldRep_8Byte] = 8,
557  };
558  UPB_ASSERT(sizeof(upb_StringView) ==
559  UPB_SIZE(kRepToSize32, kRepToSize64)[kUpb_FieldRep_StringView]);
560  return platform == kUpb_MiniTablePlatform_32Bit ? kRepToSize32[rep]
561  : kRepToSize64[rep];
562 }
563 
566  static const uint8_t kRepToAlign32[] = {
569  [kUpb_FieldRep_8Byte] = 8,
570  };
571  static const uint8_t kRepToAlign64[] = {
574  [kUpb_FieldRep_8Byte] = 8,
575  };
577  UPB_SIZE(kRepToAlign32, kRepToAlign64)[kUpb_FieldRep_StringView]);
578  return platform == kUpb_MiniTablePlatform_32Bit ? kRepToAlign32[rep]
579  : kRepToAlign64[rep];
580 }
581 
583  const char* ptr,
584  char first_ch,
585  upb_LayoutItem* item) {
586  uint32_t field_num;
589  kUpb_EncodedValue_MaxOneofField, &field_num);
591  (void*)upb_MiniTable_FindFieldByNumber(d->table, field_num);
592 
593  if (!f) {
595  "Couldn't add field number %" PRIu32
596  " to oneof, no such field number.",
597  field_num);
598  UPB_UNREACHABLE();
599  }
600  if (f->offset != kHasbitPresence) {
602  d,
603  "Cannot add repeated, required, or singular field %" PRIu32
604  " to oneof.",
605  field_num);
606  UPB_UNREACHABLE();
607  }
608 
609  // Oneof storage must be large enough to accommodate the largest member.
610  int rep = f->mode >> kUpb_FieldRep_Shift;
611  if (upb_MtDecoder_SizeOfRep(rep, d->platform) >
612  upb_MtDecoder_SizeOfRep(item->rep, d->platform)) {
613  item->rep = rep;
614  }
615  // Prepend this field to the linked list.
616  f->offset = item->field_index;
617  item->field_index = (f - d->fields) + kOneofBase;
618  return ptr;
619 }
620 
622  const char* ptr) {
623  upb_LayoutItem item = {.rep = 0,
624  .field_index = kUpb_LayoutItem_IndexSentinel};
625  while (ptr < d->end) {
626  char ch = *ptr++;
628  // Field separator, no action needed.
629  } else if (ch == kUpb_EncodedValue_OneofSeparator) {
630  // End of oneof.
631  upb_MtDecoder_PushOneof(d, item);
632  item.field_index = kUpb_LayoutItem_IndexSentinel; // Move to next oneof.
633  } else {
635  }
636  }
637 
638  // Push final oneof.
639  upb_MtDecoder_PushOneof(d, item);
640  return ptr;
641 }
642 
644  const char* ptr, char first_ch,
645  upb_MiniTable_Field* last_field,
646  uint64_t* msg_modifiers) {
647  uint32_t mod;
651  if (last_field) {
652  upb_MtDecoder_ModifyField(d, *msg_modifiers, mod, last_field);
653  } else {
654  if (!d->table) {
655  upb_MtDecoder_ErrorFormat(d, "Extensions cannot have message modifiers");
656  UPB_UNREACHABLE();
657  }
658  *msg_modifiers = mod;
659  }
660 
661  return ptr;
662 }
663 
665  size_t subs_bytes = sizeof(*d->table->subs) * sub_count;
666  d->table->subs = upb_Arena_Malloc(d->arena, subs_bytes);
667  upb_MtDecoder_CheckOutOfMemory(d, d->table->subs);
668 }
669 
670 static void upb_MtDecoder_Parse(upb_MtDecoder* d, const char* ptr, size_t len,
671  void* fields, size_t field_size,
672  uint16_t* field_count, uint32_t* sub_count) {
673  uint64_t msg_modifiers = 0;
674  uint32_t last_field_number = 0;
675  upb_MiniTable_Field* last_field = NULL;
676  bool need_dense_below = d->table != NULL;
677 
678  d->end = UPB_PTRADD(ptr, len);
679 
680  while (ptr < d->end) {
681  char ch = *ptr++;
684  *field_count += 1;
685  fields = (char*)fields + field_size;
686  field->number = ++last_field_number;
687  last_field = field;
688  upb_MiniTable_SetField(d, ch, field, msg_modifiers, sub_count);
689  } else if (kUpb_EncodedValue_MinModifier <= ch &&
691  ptr = upb_MtDecoder_ParseModifier(d, ptr, ch, last_field, &msg_modifiers);
692  } else if (ch == kUpb_EncodedValue_End) {
693  if (!d->table) {
694  upb_MtDecoder_ErrorFormat(d, "Extensions cannot have oneofs.");
695  UPB_UNREACHABLE();
696  }
698  } else if (kUpb_EncodedValue_MinSkip <= ch &&
700  if (need_dense_below) {
701  d->table->dense_below = d->table->field_count;
702  need_dense_below = false;
703  }
704  uint32_t skip;
708  last_field_number += skip;
709  last_field_number--; // Next field seen will increment.
710  }
711  }
712 
713  if (need_dense_below) {
714  d->table->dense_below = d->table->field_count;
715  }
716 }
717 
718 static void upb_MtDecoder_ParseMessage(upb_MtDecoder* d, const char* data,
719  size_t len) {
720  // Buffer length is an upper bound on the number of fields. We will return
721  // what we don't use.
722  d->fields = upb_Arena_Malloc(d->arena, sizeof(*d->fields) * len);
724 
725  uint32_t sub_count = 0;
726  d->table->field_count = 0;
727  d->table->fields = d->fields;
728  upb_MtDecoder_Parse(d, data, len, d->fields, sizeof(*d->fields),
729  &d->table->field_count, &sub_count);
730 
731  upb_Arena_ShrinkLast(d->arena, d->fields, sizeof(*d->fields) * len,
732  sizeof(*d->fields) * d->table->field_count);
733  d->table->fields = d->fields;
734  upb_MtDecoder_AllocateSubs(d, sub_count);
735 }
736 
737 int upb_MtDecoder_CompareFields(const void* _a, const void* _b) {
738  const upb_LayoutItem* a = _a;
739  const upb_LayoutItem* b = _b;
740  // Currently we just sort by:
741  // 1. rep (smallest fields first)
742  // 2. type (oneof cases first)
743  // 2. field_index (smallest numbers first)
744  // The main goal of this is to reduce space lost to padding.
745  // Later we may have more subtle reasons to prefer a different ordering.
746  const int rep_bits = _upb_Log2Ceiling(kUpb_FieldRep_Max);
747  const int type_bits = _upb_Log2Ceiling(kUpb_LayoutItemType_Max);
748  const int idx_bits = (sizeof(a->field_index) * 8);
749  UPB_ASSERT(idx_bits + rep_bits + type_bits < 32);
750 #define UPB_COMBINE(rep, ty, idx) (((rep << type_bits) | ty) << idx_bits) | idx
751  uint32_t a_packed = UPB_COMBINE(a->rep, a->type, a->field_index);
752  uint32_t b_packed = UPB_COMBINE(b->rep, b->type, b->field_index);
753  assert(a_packed != b_packed);
754 #undef UPB_COMBINE
755  return a_packed < b_packed ? -1 : 1;
756 }
757 
759  // Add items for all non-oneof fields (oneofs were already added).
760  int n = d->table->field_count;
761  for (int i = 0; i < n; i++) {
762  upb_MiniTable_Field* f = &d->fields[i];
763  if (f->offset >= kOneofBase) continue;
764  upb_LayoutItem item = {.field_index = i,
765  .rep = f->mode >> kUpb_FieldRep_Shift,
766  .type = kUpb_LayoutItemType_Field};
767  upb_MtDecoder_PushItem(d, item);
768  }
769 
770  if (d->vec.size) {
771  qsort(d->vec.data, d->vec.size, sizeof(*d->vec.data),
773  }
774 
775  return true;
776 }
777 
778 static size_t upb_MiniTable_DivideRoundUp(size_t n, size_t d) {
779  return (n + d - 1) / d;
780 }
781 
783  int n = ret->field_count;
784  int last_hasbit = 0; // 0 cannot be used.
785 
786  // First assign required fields, which must have the lowest hasbits.
787  for (int i = 0; i < n; i++) {
789  if (field->offset == kRequiredPresence) {
790  field->presence = ++last_hasbit;
791  } else if (field->offset == kNoPresence) {
792  field->presence = 0;
793  }
794  }
795  ret->required_count = last_hasbit;
796 
797  // Next assign non-required hasbit fields.
798  for (int i = 0; i < n; i++) {
800  if (field->offset == kHasbitPresence) {
801  field->presence = ++last_hasbit;
802  }
803  }
804 
805  ret->size = last_hasbit ? upb_MiniTable_DivideRoundUp(last_hasbit + 1, 8) : 0;
806 }
807 
809  size_t size = upb_MtDecoder_SizeOfRep(rep, d->platform);
810  size_t align = upb_MtDecoder_AlignOfRep(rep, d->platform);
811  size_t ret = UPB_ALIGN_UP(d->table->size, align);
812  d->table->size = ret + size;
813  return ret;
814 }
815 
817  upb_LayoutItem* end = UPB_PTRADD(d->vec.data, d->vec.size);
818 
819  // Compute offsets.
820  for (upb_LayoutItem* item = d->vec.data; item < end; item++) {
821  item->offset = upb_MtDecoder_Place(d, item->rep);
822  }
823 
824  // Assign oneof case offsets. We must do these first, since assigning
825  // actual offsets will overwrite the links of the linked list.
826  for (upb_LayoutItem* item = d->vec.data; item < end; item++) {
827  if (item->type != kUpb_LayoutItemType_OneofCase) continue;
828  upb_MiniTable_Field* f = &d->fields[item->field_index];
829  while (true) {
830  f->presence = ~item->offset;
831  if (f->offset == kUpb_LayoutItem_IndexSentinel) break;
832  UPB_ASSERT(f->offset - kOneofBase < d->table->field_count);
833  f = &d->fields[f->offset - kOneofBase];
834  }
835  }
836 
837  // Assign offsets.
838  for (upb_LayoutItem* item = d->vec.data; item < end; item++) {
839  upb_MiniTable_Field* f = &d->fields[item->field_index];
840  switch (item->type) {
842  while (true) {
843  uint16_t next_offset = f->offset;
844  f->offset = item->offset;
845  if (next_offset == kUpb_LayoutItem_IndexSentinel) break;
846  f = &d->fields[next_offset - kOneofBase];
847  }
848  break;
850  f->offset = item->offset;
851  break;
852  default:
853  break;
854  }
855  }
856 
857  if (d->platform == kUpb_MiniTablePlatform_64Bit) {
858  // For compatibility with fast table parsing, we have to align this up to a
859  // multiple of 16 + 8. This is because arena alloc size must be a multiple
860  // of 16, but we will add sizeof(upb_Message_Internal) at runtime, as the
861  // table size does not include this value.
862  //
863  // This is a bit convoluted and should probably be simplified.
864  d->table->size = UPB_ALIGN_UP(d->table->size, 8);
865  if (UPB_ALIGN_UP(d->table->size, 16) == d->table->size) {
866  d->table->size += 8;
867  }
868  }
869 }
870 
873  upb_Arena* arena, void** buf,
874  size_t* buf_size,
875  upb_Status* status) {
876  upb_MtDecoder decoder = {
877  .platform = platform,
878  .vec =
879  {
880  .data = *buf,
881  .capacity = *buf_size / sizeof(*decoder.vec.data),
882  .size = 0,
883  },
884  .arena = arena,
885  .status = status,
886  .table = upb_Arena_Malloc(arena, sizeof(*decoder.table)),
887  };
888 
889  if (UPB_SETJMP(decoder.err)) {
890  decoder.table = NULL;
891  goto done;
892  }
893 
894  upb_MtDecoder_CheckOutOfMemory(&decoder, decoder.table);
895 
896  decoder.table->size = 0;
897  decoder.table->field_count = 0;
899  decoder.table->dense_below = 0;
900  decoder.table->table_mask = 0;
901  decoder.table->required_count = 0;
902 
903  upb_MtDecoder_ParseMessage(&decoder, data, len);
906  upb_MtDecoder_AssignOffsets(&decoder);
907 
908 done:
909  *buf = decoder.vec.data;
910  *buf_size = decoder.vec.capacity / sizeof(*decoder.vec.data);
911  return decoder.table;
912 }
913 
915  upb_Arena* arena) {
917  if (!ret) return NULL;
918 
919  ret->size = 0;
920  ret->field_count = 0;
922  ret->dense_below = 0;
923  ret->table_mask = 0;
924  ret->required_count = 0;
925  return ret;
926 }
927 
930  bool value_is_proto3_enum,
932  upb_Arena* arena) {
935  if (!ret || !fields) return NULL;
936 
937  upb_MiniTable_Sub* subs = NULL;
938  if (value_is_proto3_enum) value_type = kUpb_FieldType_Int32;
941  subs = upb_Arena_Malloc(arena, sizeof(*subs));
942  if (!subs) return NULL;
943  }
944 
945  size_t field_size =
947 
948  fields[0].number = 1;
949  fields[1].number = 2;
950  fields[0].mode = kUpb_FieldMode_Scalar;
951  fields[1].mode = kUpb_FieldMode_Scalar;
952  fields[0].presence = 0;
953  fields[1].presence = 0;
954  fields[0].offset = 0;
955  fields[1].offset = field_size;
956 
959 
960  ret->size = UPB_ALIGN_UP(2 * field_size, 8);
961  ret->field_count = 2;
963  ret->dense_below = 2;
964  ret->table_mask = 0;
965  ret->required_count = 0;
966  ret->subs = subs;
967  ret->fields = fields;
968  return ret;
969 }
970 
972  upb_Arena* arena,
973  upb_Status* status) {
974  upb_MtDecoder decoder = {
975  .status = status,
976  };
977 
978  if (UPB_SETJMP(decoder.err)) {
979  return NULL;
980  }
981 
984 
985  table->mask = 0;
986  table->value_count = 0;
987  table->values = NULL;
988 
989  const char* ptr = data;
990  const char* end = UPB_PTRADD(data, len);
991 
992  // Currently we do minimal validation of invariants (eg. that values are in
993  // order). We may want to add these, but more likely, we will want the format
994  // to be a more compact variation where these errors are not possible.
995  while (end - ptr >= 4) {
996  uint32_t val;
997  memcpy(&val, ptr, 4);
998  if (val >= 64) break;
999  table->mask |= 1ULL << val;
1000  ptr += 4;
1001  }
1002 
1003  if (ptr != end) {
1004  size_t bytes = end - ptr;
1005  if (bytes % 4 != 0) {
1006  upb_MtDecoder_ErrorFormat(&decoder, "Bytes should be a multiple of 4");
1007  UPB_UNREACHABLE();
1008  }
1009  table->values = upb_Arena_Malloc(arena, end - ptr);
1011  memcpy((void*)table->values, ptr, end - ptr);
1012  table->value_count = bytes / 4;
1013  }
1014 
1015  return table;
1016 }
1017 
1018 bool upb_MiniTable_BuildExtension(const char* data, size_t len,
1021  upb_MtDecoder decoder = {
1022  .arena = NULL,
1023  .status = status,
1024  .table = NULL,
1025  };
1026 
1027  if (UPB_SETJMP(decoder.err)) {
1028  return false;
1029  }
1030 
1031  uint16_t count = 0;
1032  upb_MtDecoder_Parse(&decoder, data, len, ext, sizeof(*ext), &count, NULL);
1033  ext->field.mode |= kUpb_LabelFlags_IsExtension;
1034  ext->field.offset = 0;
1035  return true;
1036 }
1037 
1041  void* buf = NULL;
1042  size_t size = 0;
1044  &buf, &size, status);
1045  free(buf);
1046  return ret;
1047 }
1048 
1051  const upb_MiniTable* sub) {
1052  UPB_ASSERT((uintptr_t)table->fields <= (uintptr_t)field &&
1053  (uintptr_t)field <
1054  (uintptr_t)(table->fields + table->field_count));
1055  if (sub->ext & kUpb_ExtMode_IsMapEntry) {
1056  field->mode =
1058  }
1059  upb_MiniTable_Sub* table_sub = (void*)&table->subs[field->submsg_index];
1060  table_sub->submsg = sub;
1061 }
1062 
1064  const upb_MiniTable_Enum* sub) {
1065  UPB_ASSERT((uintptr_t)table->fields <= (uintptr_t)field &&
1066  (uintptr_t)field <
1067  (uintptr_t)(table->fields + table->field_count));
1068  upb_MiniTable_Sub* table_sub = (void*)&table->subs[field->submsg_index];
1069  table_sub->subenum = sub;
1070 }
kUpb_EncodedType_UInt32
@ kUpb_EncodedType_UInt32
Definition: mini_table.c:47
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
upb_MtDataEncoder_StartMessage
char * upb_MtDataEncoder_StartMessage(upb_MtDataEncoder *e, char *ptr, uint64_t msg_mod)
Definition: mini_table.c:176
kUpb_LayoutItemType_Field
@ kUpb_LayoutItemType_Field
Definition: mini_table.c:299
upb_MtDecoder_SortLayoutItems
static bool upb_MtDecoder_SortLayoutItems(upb_MtDecoder *d)
Definition: mini_table.c:758
kUpb_FieldRep_4Byte
@ kUpb_FieldRep_4Byte
Definition: msg_internal.h:101
kUpb_FieldType_SInt64
@ kUpb_FieldType_SInt64
Definition: upb/upb/upb.h:326
upb_FieldType
upb_FieldType
Definition: upb/upb/upb.h:308
kUpb_FieldType_SFixed64
@ kUpb_FieldType_SFixed64
Definition: upb/upb/upb.h:324
test_server.argp
argp
Definition: test_server.py:33
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
kUpb_EncodedType_Int32
@ kUpb_EncodedType_Int32
Definition: mini_table.c:46
upb_MiniTable_Sub
Definition: msg_internal.h:154
kUpb_EncodedFieldModifier_IsClosedEnum
@ kUpb_EncodedFieldModifier_IsClosedEnum
Definition: mini_table.c:64
kUpb_FieldType_SInt32
@ kUpb_FieldType_SInt32
Definition: upb/upb/upb.h:325
kUpb_EncodedType_Float
@ kUpb_EncodedType_Float
Definition: mini_table.c:41
kUpb_EncodedValue_MaxSkip
@ kUpb_EncodedValue_MaxSkip
Definition: mini_table.c:77
upb_MtDecoder::vec
upb_LayoutItemVector vec
Definition: mini_table.c:326
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
upb_MtDataEncoder_Put
static char * upb_MtDataEncoder_Put(upb_MtDataEncoder *e, char *ptr, char ch)
Definition: mini_table.c:144
kUpb_MtDataEncoder_MinSize
#define kUpb_MtDataEncoder_MinSize
Definition: mini_table.h:70
upb_MiniTable_HasSub
static bool upb_MiniTable_HasSub(upb_MiniTable_Field *field, uint64_t msg_modifiers)
Definition: mini_table.c:381
upb_MtDecoder_Place
size_t upb_MtDecoder_Place(upb_MtDecoder *d, upb_FieldRep rep)
Definition: mini_table.c:808
upb_MiniTable_Sub::subenum
const upb_MiniTable_Enum * subenum
Definition: msg_internal.h:156
upb_EncodedFieldModifier
upb_EncodedFieldModifier
Definition: mini_table.c:62
upb_MiniTable_Enum
Definition: msg_internal.h:136
mkowners.skip
bool skip
Definition: mkowners.py:224
upb_MiniTable_Field
Definition: msg_internal.h:71
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
kUpb_FieldType_UInt64
@ kUpb_FieldType_UInt64
Definition: upb/upb/upb.h:312
kUpb_LabelFlags_IsPacked
@ kUpb_LabelFlags_IsPacked
Definition: msg_internal.h:94
upb_MtDataEncoder_PutOneofField
char * upb_MtDataEncoder_PutOneofField(upb_MtDataEncoder *e, char *ptr, uint32_t field_num)
Definition: mini_table.c:268
kUpb_LayoutItemType_OneofCase
@ kUpb_LayoutItemType_OneofCase
Definition: mini_table.c:297
kUpb_FieldModifier_IsPacked
@ kUpb_FieldModifier_IsPacked
Definition: mini_table.h:51
upb_MtDecoder_PushOneof
static void upb_MtDecoder_PushOneof(upb_MtDecoder *d, upb_LayoutItem item)
Definition: mini_table.c:529
upb_LayoutItem::type
upb_LayoutItemType type
Definition: mini_table.c:312
upb_MiniTable::dense_below
uint8_t dense_below
Definition: msg_internal.h:193
upb_MiniTable_FindFieldByNumber
const upb_MiniTable_Field * upb_MiniTable_FindFieldByNumber(const upb_MiniTable *table, uint32_t number)
Definition: mini_table.c:282
ext
void * ext
Definition: x509v3.h:87
kUpb_EncodedType_SInt64
@ kUpb_EncodedType_SInt64
Definition: mini_table.c:51
upb_MiniTable_Sub::submsg
const struct upb_MiniTable * submsg
Definition: msg_internal.h:155
upb_FieldRep
upb_FieldRep
Definition: msg_internal.h:99
kUpb_MiniTablePlatform_64Bit
@ kUpb_MiniTablePlatform_64Bit
Definition: mini_table.h:115
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
upb_MtDecoder_ErrorFormat
static UPB_NORETURN void upb_MtDecoder_ErrorFormat(upb_MtDecoder *d, const char *fmt,...)
Definition: mini_table.c:333
kUpb_EncodedValue_MaxField
@ kUpb_EncodedValue_MaxField
Definition: mini_table.c:72
upb_MtDecoder_AllocateSubs
static void upb_MtDecoder_AllocateSubs(upb_MtDecoder *d, uint32_t sub_count)
Definition: mini_table.c:664
upb_MiniTable_Extension
Definition: msg_internal.h:202
upb_MiniTable::ext
uint8_t ext
Definition: msg_internal.h:192
upb_MtDecoder::arena
upb_Arena * arena
Definition: mini_table.c:327
UPB_ALIGN_UP
#define UPB_ALIGN_UP(size, align)
Definition: php-upb.c:93
upb_MtDecoder_AssignOffsets
static void upb_MtDecoder_AssignOffsets(upb_MtDecoder *d)
Definition: mini_table.c:816
UPB_UNREACHABLE
#define UPB_UNREACHABLE()
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:145
upb_MiniTable_SetSubMessage
void upb_MiniTable_SetSubMessage(upb_MiniTable *table, upb_MiniTable_Field *field, const upb_MiniTable *sub)
Definition: mini_table.c:1049
upb_MtDecoder::err
jmp_buf err
Definition: mini_table.c:329
UPB_SETJMP
#define UPB_SETJMP(buf)
Definition: php-upb.c:163
status
absl::Status status
Definition: rls.cc:251
kUpb_FieldType_SFixed32
@ kUpb_FieldType_SFixed32
Definition: upb/upb/upb.h:323
upb_MiniTable
Definition: msg_internal.h:185
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
upb_MiniTable_BuildMapEntry
upb_MiniTable * upb_MiniTable_BuildMapEntry(upb_FieldType key_type, upb_FieldType value_type, bool value_is_proto3_enum, upb_MiniTablePlatform platform, upb_Arena *arena)
Definition: mini_table.c:928
upb_MtDataEncoder_PutField
char * upb_MtDataEncoder_PutField(upb_MtDataEncoder *e, char *ptr, upb_FieldType type, uint32_t field_num, uint64_t field_mod)
Definition: mini_table.c:185
upb_MtDataEncoder_GetInternal
static upb_MtDataEncoderInternal * upb_MtDataEncoder_GetInternal(upb_MtDataEncoder *e, char *buf_start)
Definition: mini_table.c:137
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
UPB_PRINTF
#define UPB_PRINTF(str, first_vararg)
Definition: php-upb.c:122
kUpb_EncodedValue_MinModifier
@ kUpb_EncodedValue_MinModifier
Definition: mini_table.c:73
kUpb_FieldRep_Max
@ kUpb_FieldRep_Max
Definition: msg_internal.h:107
upb_MiniTable_SetTypeAndSub
static void upb_MiniTable_SetTypeAndSub(upb_MiniTable_Field *field, upb_FieldType type, uint32_t *sub_count, uint64_t msg_modifiers)
Definition: mini_table.c:403
upb_MtDecoder::end
const char * end
Definition: mini_table.c:322
upb_MiniTable_DecodeBase92Varint
static const char * upb_MiniTable_DecodeBase92Varint(upb_MtDecoder *d, const char *ptr, char first_ch, uint8_t min, uint8_t max, uint32_t *out_val)
Definition: mini_table.c:358
upb_MtDecoder_DecodeOneofs
static const char * upb_MtDecoder_DecodeOneofs(upb_MtDecoder *d, const char *ptr)
Definition: mini_table.c:621
kUpb_FieldModifier_IsRepeated
@ kUpb_FieldModifier_IsRepeated
Definition: mini_table.h:50
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
upb_LayoutItemVector
Definition: mini_table.c:315
kUpb_LabelFlags_IsExtension
@ kUpb_LabelFlags_IsExtension
Definition: msg_internal.h:95
upb_MtDecoder_SizeOfRep
size_t upb_MtDecoder_SizeOfRep(upb_FieldRep rep, upb_MiniTablePlatform platform)
Definition: mini_table.c:546
kUpb_EncodedType_UInt64
@ kUpb_EncodedType_UInt64
Definition: mini_table.c:50
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_IsTypePackable
bool upb_IsTypePackable(upb_FieldType type)
Definition: mini_table.c:113
kUpb_ExtMode_NonExtendable
@ kUpb_ExtMode_NonExtendable
Definition: msg_internal.h:160
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
upb_MtDataEncoderInternal::buf_start
char * buf_start
Definition: mini_table.c:127
kUpb_EncodedType_Group
@ kUpb_EncodedType_Group
Definition: mini_table.c:56
kUpb_FieldType_Float
@ kUpb_FieldType_Float
Definition: upb/upb/upb.h:310
ULL
#define ULL(x)
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:57
upb_MtDecoder::status
upb_Status * status
Definition: mini_table.c:328
upb_LayoutItem::offset
uint16_t offset
Definition: mini_table.c:310
kUpb_EncodedValue_OneofSeparator
@ kUpb_EncodedValue_OneofSeparator
Definition: mini_table.c:78
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
upb_MtDataEncoderInternal::msg_mod
uint64_t msg_mod
Definition: mini_table.c:128
UPB_PTRADD
#define UPB_PTRADD(ptr, ofs)
Definition: php-upb.c:168
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
kUpb_FieldType_UInt32
@ kUpb_FieldType_UInt32
Definition: upb/upb/upb.h:321
kHasbitPresence
@ kHasbitPresence
Definition: mini_table.c:350
upb_Status_SetErrorMessage
void upb_Status_SetErrorMessage(upb_Status *status, const char *msg)
Definition: upb/upb/upb.c:56
kUpb_FieldRep_8Byte
@ kUpb_FieldRep_8Byte
Definition: msg_internal.h:104
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
kUpb_ExtMode_IsMapEntry
@ kUpb_ExtMode_IsMapEntry
Definition: msg_internal.h:168
upb_MtDecoder::fields
upb_MiniTable_Field * fields
Definition: mini_table.c:324
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_EncodedFieldModifier_IsProto3Singular
@ kUpb_EncodedFieldModifier_IsProto3Singular
Definition: mini_table.c:66
kUpb_EncodedType_Double
@ kUpb_EncodedType_Double
Definition: mini_table.c:40
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
upb_MtDataEncoder
Definition: mini_table.h:62
upb_LayoutItemVector::capacity
size_t capacity
Definition: mini_table.c:318
kUpb_EncodedType_String
@ kUpb_EncodedType_String
Definition: mini_table.c:55
upb_MiniTable::field_count
uint16_t field_count
Definition: msg_internal.h:191
upb_MiniTable_SetField
static void upb_MiniTable_SetField(upb_MtDecoder *d, uint8_t ch, upb_MiniTable_Field *field, uint64_t msg_modifiers, uint32_t *sub_count)
Definition: mini_table.c:419
upb.h
kUpb_EncodedType_Fixed64
@ kUpb_EncodedType_Fixed64
Definition: mini_table.c:43
kUpb_EncodedValue_MinOneofField
@ kUpb_EncodedValue_MinOneofField
Definition: mini_table.c:80
upb_MiniTable::table_mask
uint8_t table_mask
Definition: msg_internal.h:194
upb_MtDecoder_ParseMessage
static void upb_MtDecoder_ParseMessage(upb_MtDecoder *d, const char *data, size_t len)
Definition: mini_table.c:718
upb_MtDecoder_AssignHasbits
static void upb_MtDecoder_AssignHasbits(upb_MiniTable *ret)
Definition: mini_table.c:782
kUpb_FieldType_Enum
@ kUpb_FieldType_Enum
Definition: upb/upb/upb.h:322
kUpb_EncodedValue_End
@ kUpb_EncodedValue_End
Definition: mini_table.c:75
UPB_SIZE
#define UPB_SIZE(size32, size64)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:32
upb_Arena_Malloc
UPB_INLINE void * upb_Arena_Malloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.h:222
upb_Status_VAppendErrorFormat
void upb_Status_VAppendErrorFormat(upb_Status *status, const char *fmt, va_list args)
Definition: upb/upb/upb.c:78
kUpb_MessageModifier_DefaultIsPacked
@ kUpb_MessageModifier_DefaultIsPacked
Definition: mini_table.h:45
kUpb_FieldType_Fixed32
@ kUpb_FieldType_Fixed32
Definition: upb/upb/upb.h:315
upb_LayoutItem::field_index
uint16_t field_index
Definition: mini_table.c:309
kUpb_EncodedType_Fixed32
@ kUpb_EncodedType_Fixed32
Definition: mini_table.c:42
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
UPB_ALIGN_OF
#define UPB_ALIGN_OF(type)
Definition: php-upb.c:96
bits
OPENSSL_EXPORT ASN1_BIT_STRING * bits
Definition: x509v3.h:482
upb_MtDecoder::platform
upb_MiniTablePlatform platform
Definition: mini_table.c:325
upb_FromBase92
char upb_FromBase92(uint8_t ch)
Definition: mini_table.c:99
upb_MtDataEncoder_PutBase92Varint
static char * upb_MtDataEncoder_PutBase92Varint(upb_MtDataEncoder *e, char *ptr, uint32_t val, int min, int max)
Definition: mini_table.c:152
done
struct tab * done
Definition: bloaty/third_party/zlib/examples/enough.c:176
upb_MiniTable_BuildEnum
upb_MiniTable_Enum * upb_MiniTable_BuildEnum(const char *data, size_t len, upb_Arena *arena, upb_Status *status)
Definition: mini_table.c:971
absl::compare_internal::value_type
int8_t value_type
Definition: abseil-cpp/absl/types/compare.h:45
number
int32_t number
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:850
kUpb_FieldRep_Shift
@ kUpb_FieldRep_Shift
Definition: msg_internal.h:106
upb_MtDecoder_CheckOutOfMemory
static void upb_MtDecoder_CheckOutOfMemory(upb_MtDecoder *d, const void *ptr)
Definition: mini_table.c:343
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
kUpb_FieldMode_Map
@ kUpb_FieldMode_Map
Definition: msg_internal.h:84
upb_MtDecoder_PushItem
static void upb_MtDecoder_PushItem(upb_MtDecoder *d, upb_LayoutItem item)
Definition: mini_table.c:519
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
upb_MtDataEncoder_PutModifier
char * upb_MtDataEncoder_PutModifier(upb_MtDataEncoder *e, char *ptr, uint64_t mod)
Definition: mini_table.c:166
performance.bq_upload_result.required
required
Definition: bq_upload_result.py:299
uintptr_t
_W64 unsigned int uintptr_t
Definition: stdint-msvc2008.h:119
upb_MtDecoder_ParseModifier
static const char * upb_MtDecoder_ParseModifier(upb_MtDecoder *d, const char *ptr, char first_ch, upb_MiniTable_Field *last_field, uint64_t *msg_modifiers)
Definition: mini_table.c:643
min
#define min(a, b)
Definition: qsort.h:83
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
UPB_COMBINE
#define UPB_COMBINE(rep, ty, idx)
kUpb_EncodedFieldModifier_IsRequired
@ kUpb_EncodedFieldModifier_IsRequired
Definition: mini_table.c:67
upb_LayoutItem
Definition: mini_table.c:306
kUpb_LayoutItemType_OneofField
@ kUpb_LayoutItemType_OneofField
Definition: mini_table.c:298
d
static const fe d
Definition: curve25519_tables.h:19
qsort
void qsort(void *a, size_t n, size_t es, int(*cmp)(const void *, const void *))
Definition: qsort.h:130
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
upb_MtDataEncoderInternal::kUpb_OneofState_NotStarted
@ kUpb_OneofState_NotStarted
Definition: mini_table.c:131
upb_LayoutItemVector::data
upb_LayoutItem * data
Definition: mini_table.c:316
upb_LayoutItemVector::size
size_t size
Definition: mini_table.c:317
kUpb_FieldModifier_IsRequired
@ kUpb_FieldModifier_IsRequired
Definition: mini_table.h:54
upb_MiniTable_BuildMessageSet
upb_MiniTable * upb_MiniTable_BuildMessageSet(upb_MiniTablePlatform platform, upb_Arena *arena)
Definition: mini_table.c:914
kUpb_NoSub
#define kUpb_NoSub
Definition: msg_internal.h:81
upb_MtDecoder_CompareFields
int upb_MtDecoder_CompareFields(const void *_a, const void *_b)
Definition: mini_table.c:737
upb_MtDecoder_DecodeOneofField
static const char * upb_MtDecoder_DecodeOneofField(upb_MtDecoder *d, const char *ptr, char first_ch, upb_LayoutItem *item)
Definition: mini_table.c:582
kUpb_EncodedType_SInt32
@ kUpb_EncodedType_SInt32
Definition: mini_table.c:48
kUpb_FieldType_Fixed64
@ kUpb_FieldType_Fixed64
Definition: upb/upb/upb.h:314
UPB_MAX
#define UPB_MAX(x, y)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:125
kUpb_MiniTablePlatform_32Bit
@ kUpb_MiniTablePlatform_32Bit
Definition: mini_table.h:114
testing::internal::fmt
GTEST_API_ const char * fmt
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1808
kUpb_EncodedType_Message
@ kUpb_EncodedType_Message
Definition: mini_table.c:57
kUpb_FieldMode_Scalar
@ kUpb_FieldMode_Scalar
Definition: msg_internal.h:86
upb_MiniTable_BuildWithBuf
upb_MiniTable * upb_MiniTable_BuildWithBuf(const char *data, size_t len, upb_MiniTablePlatform platform, upb_Arena *arena, void **buf, size_t *buf_size, upb_Status *status)
Definition: mini_table.c:871
field
const FieldDescriptor * field
Definition: bloaty/third_party/protobuf/src/google/protobuf/compiler/parser_unittest.cc:2692
upb_LayoutItemType
upb_LayoutItemType
Definition: mini_table.c:296
kUpb_EncodedType_Enum
@ kUpb_EncodedType_Enum
Definition: mini_table.c:52
upb_StringView
Definition: upb/upb/upb.h:72
upb_MiniTablePlatform
upb_MiniTablePlatform
Definition: mini_table.h:113
absl::time_internal::cctz::detail::align
CONSTEXPR_F fields align(second_tag, fields f) noexcept
Definition: abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h:325
bytes
uint8 bytes[10]
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:153
kUpb_EncodedType_Bytes
@ kUpb_EncodedType_Bytes
Definition: mini_table.c:54
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
kUpb_FieldModifier_IsProto3Singular
@ kUpb_FieldModifier_IsProto3Singular
Definition: mini_table.h:53
kUpb_LayoutItem_IndexSentinel
#define kUpb_LayoutItem_IndexSentinel
Definition: mini_table.c:304
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
kUpb_FieldType_Group
@ kUpb_FieldType_Group
Definition: upb/upb/upb.h:318
upb_MiniTable::size
uint16_t size
Definition: msg_internal.h:190
kUpb_EncodedType_RepeatedBase
@ kUpb_EncodedType_RepeatedBase
Definition: mini_table.c:59
profile_analyzer.fields
list fields
Definition: profile_analyzer.py:266
PresenceClass
PresenceClass
Definition: mini_table.c:348
upb_MtDecoder_ModifyField
static void upb_MtDecoder_ModifyField(upb_MtDecoder *d, uint32_t message_modifiers, uint32_t field_modifiers, upb_MiniTable_Field *field)
Definition: mini_table.c:484
_upb_Log2Ceiling
UPB_INLINE int _upb_Log2Ceiling(int x)
Definition: upb/upb/upb.h:354
kUpb_EncodedType_Bool
@ kUpb_EncodedType_Bool
Definition: mini_table.c:53
upb_MtDecoder::table
upb_MiniTable * table
Definition: mini_table.c:323
upb_MtDecoder_FieldIsPackable
static bool upb_MtDecoder_FieldIsPackable(upb_MiniTable_Field *field)
Definition: mini_table.c:398
kUpb_ExtMode_IsMessageSet
@ kUpb_ExtMode_IsMessageSet
Definition: msg_internal.h:162
upb_ToBase92
char upb_ToBase92(int8_t ch)
Definition: mini_table.c:84
rep
const CordRep * rep
Definition: cord_analysis.cc:53
upb_MtDataEncoder_StartOneof
char * upb_MtDataEncoder_StartOneof(upb_MtDataEncoder *e, char *ptr)
Definition: mini_table.c:256
UPB_NORETURN
#define UPB_NORETURN
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:79
upb_MiniTable_Build
upb_MiniTable * upb_MiniTable_Build(const char *data, size_t len, upb_MiniTablePlatform platform, upb_Arena *arena, upb_Status *status)
Definition: mini_table.c:1038
kUpb_FieldModifier_IsClosedEnum
@ kUpb_FieldModifier_IsClosedEnum
Definition: mini_table.h:52
upb_MtDataEncoderInternal::kUpb_OneofState_EmittedOneofField
@ kUpb_OneofState_EmittedOneofField
Definition: mini_table.c:133
upb_MtDecoder
Definition: mini_table.c:321
upb_LayoutItem::rep
upb_FieldRep rep
Definition: mini_table.c:311
kUpb_FieldType_Message
@ kUpb_FieldType_Message
Definition: upb/upb/upb.h:319
upb_MiniTable::required_count
uint8_t required_count
Definition: msg_internal.h:195
kUpb_EncodedValue_FieldSeparator
@ kUpb_EncodedValue_FieldSeparator
Definition: mini_table.c:79
kUpb_EncodedValue_MinField
@ kUpb_EncodedValue_MinField
Definition: mini_table.c:71
kUpb_EncodedType_Int64
@ kUpb_EncodedType_Int64
Definition: mini_table.c:49
table
uint8_t table[256]
Definition: hpack_parser.cc:456
upb_MtDecoder_AlignOfRep
size_t upb_MtDecoder_AlignOfRep(upb_FieldRep rep, upb_MiniTablePlatform platform)
Definition: mini_table.c:564
kUpb_EncodedType_SFixed32
@ kUpb_EncodedType_SFixed32
Definition: mini_table.c:44
upb_MiniTable_SetSubEnum
void upb_MiniTable_SetSubEnum(upb_MiniTable *table, upb_MiniTable_Field *field, const upb_MiniTable_Enum *sub)
Definition: mini_table.c:1063
upb_EncodedType
upb_EncodedType
Definition: mini_table.c:39
kUpb_EncodedType_SFixed64
@ kUpb_EncodedType_SFixed64
Definition: mini_table.c:45
kUpb_EncodedFieldModifier_FlipPacked
@ kUpb_EncodedFieldModifier_FlipPacked
Definition: mini_table.c:63
int8_t
signed char int8_t
Definition: stdint-msvc2008.h:75
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
upb_MtDataEncoderInternal::kUpb_OneofState_StartedOneof
@ kUpb_OneofState_StartedOneof
Definition: mini_table.c:132
kUpb_MessageModifier_ValidateUtf8
@ kUpb_MessageModifier_ValidateUtf8
Definition: mini_table.h:44
kUpb_FieldRep_Pointer
@ kUpb_FieldRep_Pointer
Definition: msg_internal.h:103
mini_table.h
upb_MtDataEncoderInternal
Definition: mini_table.c:126
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
kUpb_FieldRep_1Byte
@ kUpb_FieldRep_1Byte
Definition: msg_internal.h:100
key_type
upb_fieldtype_t key_type
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1071
kUpb_FieldRep_StringView
@ kUpb_FieldRep_StringView
Definition: msg_internal.h:102
upb_MtDecoder_Parse
static void upb_MtDecoder_Parse(upb_MtDecoder *d, const char *ptr, size_t len, void *fields, size_t field_size, uint16_t *field_count, uint32_t *sub_count)
Definition: mini_table.c:670
kRequiredPresence
@ kRequiredPresence
Definition: mini_table.c:351
kUpb_FieldMode_Array
@ kUpb_FieldMode_Array
Definition: msg_internal.h:85
kOneofBase
@ kOneofBase
Definition: mini_table.c:352
kUpb_FieldType_Int64
@ kUpb_FieldType_Int64
Definition: upb/upb/upb.h:311
subs
template_param_type subs
Definition: cxa_demangle.cpp:4906
upb_MtDataEncoderInternal::last_field_num
uint32_t last_field_num
Definition: mini_table.c:129
demo_pb2._b
int _b
Definition: demo_pb2.py:6
kUpb_EncodedValue_MaxOneofField
@ kUpb_EncodedValue_MaxOneofField
Definition: mini_table.c:81
platform
Definition: test_arm_regression.c:18
msg_internal.h
upb_Arena
Definition: upb_internal.h:36
kUpb_LayoutItemType_Max
@ kUpb_LayoutItemType_Max
Definition: mini_table.c:301
upb_MiniTable_BuildExtension
bool upb_MiniTable_BuildExtension(const char *data, size_t len, upb_MiniTable_Extension *ext, upb_MiniTable_Sub sub, upb_Status *status)
Definition: mini_table.c:1018
if
if(p->owned &&p->wrapped !=NULL)
Definition: call.c:42
kNoPresence
@ kNoPresence
Definition: mini_table.c:349
UPB_LONGJMP
#define UPB_LONGJMP(buf, val)
Definition: php-upb.c:164
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
generate_build_files.platform
dictionary platform
Definition: generate_build_files.py:990
kUpb_EncodedValue_MinSkip
@ kUpb_EncodedValue_MinSkip
Definition: mini_table.c:76
kUpb_FieldType_Bytes
@ kUpb_FieldType_Bytes
Definition: upb/upb/upb.h:320
upb_MiniTable_DivideRoundUp
static size_t upb_MiniTable_DivideRoundUp(size_t n, size_t d)
Definition: mini_table.c:778
kUpb_EncodedValue_MaxModifier
@ kUpb_EncodedValue_MaxModifier
Definition: mini_table.c:74


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:40