google-protobuf 4.26.1 → 4.28.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of google-protobuf might be problematic. Click here for more details.

Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/convert.c +39 -14
  3. data/ext/google/protobuf_c/defs.c +327 -1
  4. data/ext/google/protobuf_c/glue.c +16 -0
  5. data/ext/google/protobuf_c/map.c +72 -20
  6. data/ext/google/protobuf_c/map.h +6 -2
  7. data/ext/google/protobuf_c/message.c +78 -50
  8. data/ext/google/protobuf_c/message.h +1 -5
  9. data/ext/google/protobuf_c/protobuf.c +11 -9
  10. data/ext/google/protobuf_c/protobuf.h +3 -7
  11. data/ext/google/protobuf_c/repeated_field.c +61 -17
  12. data/ext/google/protobuf_c/repeated_field.h +5 -1
  13. data/ext/google/protobuf_c/ruby-upb.c +1693 -475
  14. data/ext/google/protobuf_c/ruby-upb.h +2526 -1386
  15. data/ext/google/protobuf_c/shared_convert.c +5 -2
  16. data/ext/google/protobuf_c/shared_message.c +0 -30
  17. data/ext/google/protobuf_c/shared_message.h +0 -4
  18. data/lib/google/protobuf/descriptor_pb.rb +2 -1
  19. data/lib/google/protobuf/ffi/descriptor.rb +4 -3
  20. data/lib/google/protobuf/ffi/descriptor_pool.rb +3 -1
  21. data/lib/google/protobuf/ffi/enum_descriptor.rb +3 -1
  22. data/lib/google/protobuf/ffi/ffi.rb +0 -5
  23. data/lib/google/protobuf/ffi/field_descriptor.rb +4 -2
  24. data/lib/google/protobuf/ffi/file_descriptor.rb +3 -1
  25. data/lib/google/protobuf/ffi/internal/arena.rb +0 -6
  26. data/lib/google/protobuf/ffi/internal/convert.rb +14 -7
  27. data/lib/google/protobuf/ffi/map.rb +45 -21
  28. data/lib/google/protobuf/ffi/message.rb +182 -60
  29. data/lib/google/protobuf/ffi/method_descriptor.rb +114 -0
  30. data/lib/google/protobuf/ffi/oneof_descriptor.rb +3 -1
  31. data/lib/google/protobuf/ffi/repeated_field.rb +42 -16
  32. data/lib/google/protobuf/ffi/service_descriptor.rb +107 -0
  33. data/lib/google/protobuf/repeated_field.rb +3 -3
  34. data/lib/google/protobuf_ffi.rb +2 -0
  35. metadata +20 -4
@@ -113,17 +113,17 @@ Error, UINTPTR_MAX is undefined
113
113
 
114
114
  // Macros for function attributes on compilers that support them.
115
115
  #ifdef __GNUC__
116
- #define UPB_FORCEINLINE __inline__ __attribute__((always_inline))
116
+ #define UPB_FORCEINLINE __inline__ __attribute__((always_inline)) static
117
117
  #define UPB_NOINLINE __attribute__((noinline))
118
118
  #define UPB_NORETURN __attribute__((__noreturn__))
119
119
  #define UPB_PRINTF(str, first_vararg) __attribute__((format (printf, str, first_vararg)))
120
120
  #elif defined(_MSC_VER)
121
121
  #define UPB_NOINLINE
122
- #define UPB_FORCEINLINE
122
+ #define UPB_FORCEINLINE static
123
123
  #define UPB_NORETURN __declspec(noreturn)
124
124
  #define UPB_PRINTF(str, first_vararg)
125
125
  #else /* !defined(__GNUC__) */
126
- #define UPB_FORCEINLINE
126
+ #define UPB_FORCEINLINE static
127
127
  #define UPB_NOINLINE
128
128
  #define UPB_NORETURN
129
129
  #define UPB_PRINTF(str, first_vararg)
@@ -305,10 +305,10 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
305
305
 
306
306
  /* Disable proto2 arena behavior (TEMPORARY) **********************************/
307
307
 
308
- #ifdef UPB_DISABLE_PROTO2_ENUM_CHECKING
309
- #define UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 1
308
+ #ifdef UPB_DISABLE_CLOSED_ENUM_CHECKING
309
+ #define UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN 1
310
310
  #else
311
- #define UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 0
311
+ #define UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN 0
312
312
  #endif
313
313
 
314
314
  #if defined(__cplusplus)
@@ -342,6 +342,83 @@ void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
342
342
  #endif
343
343
 
344
344
 
345
+ // Linker arrays combine elements from multiple translation units into a single
346
+ // array that can be iterated over at runtime.
347
+ //
348
+ // It is an alternative to pre-main "registration" functions.
349
+ //
350
+ // Usage:
351
+ //
352
+ // // In N translation units.
353
+ // UPB_LINKARR_APPEND(foo_array) static int elems[3] = {1, 2, 3};
354
+ //
355
+ // // At runtime:
356
+ // UPB_LINKARR_DECLARE(foo_array, int);
357
+ //
358
+ // void f() {
359
+ // const int* start = UPB_LINKARR_START(foo_array);
360
+ // const int* stop = UPB_LINKARR_STOP(foo_array);
361
+ // for (const int* p = start; p < stop; p++) {
362
+ // // Windows can introduce zero padding, so we have to skip zeroes.
363
+ // if (*p != 0) {
364
+ // vec.push_back(*p);
365
+ // }
366
+ // }
367
+ // }
368
+
369
+ #if defined(__ELF__) || defined(__wasm__)
370
+
371
+ #define UPB_LINKARR_APPEND(name) \
372
+ __attribute__((retain, used, section("linkarr_" #name)))
373
+ #define UPB_LINKARR_DECLARE(name, type) \
374
+ extern type const __start_linkarr_##name; \
375
+ extern type const __stop_linkarr_##name; \
376
+ UPB_LINKARR_APPEND(name) type UPB_linkarr_internal_empty_##name[1]
377
+ #define UPB_LINKARR_START(name) (&__start_linkarr_##name)
378
+ #define UPB_LINKARR_STOP(name) (&__stop_linkarr_##name)
379
+
380
+ #elif defined(__MACH__)
381
+
382
+ /* As described in: https://stackoverflow.com/a/22366882 */
383
+ #define UPB_LINKARR_APPEND(name) \
384
+ __attribute__((retain, used, section("__DATA,__la_" #name)))
385
+ #define UPB_LINKARR_DECLARE(name, type) \
386
+ extern type const __start_linkarr_##name __asm( \
387
+ "section$start$__DATA$__la_" #name); \
388
+ extern type const __stop_linkarr_##name __asm( \
389
+ "section$end$__DATA$" \
390
+ "__la_" #name); \
391
+ UPB_LINKARR_APPEND(name) type UPB_linkarr_internal_empty_##name[1]
392
+ #define UPB_LINKARR_START(name) (&__start_linkarr_##name)
393
+ #define UPB_LINKARR_STOP(name) (&__stop_linkarr_##name)
394
+
395
+ #elif defined(_MSC_VER) && defined(__clang__)
396
+
397
+ /* See:
398
+ * https://devblogs.microsoft.com/oldnewthing/20181107-00/?p=100155
399
+ * https://devblogs.microsoft.com/oldnewthing/20181108-00/?p=100165
400
+ * https://devblogs.microsoft.com/oldnewthing/20181109-00/?p=100175 */
401
+
402
+ // Usage of __attribute__ here probably means this is Clang-specific, and would
403
+ // not work on MSVC.
404
+ #define UPB_LINKARR_APPEND(name) \
405
+ __declspec(allocate("la_" #name "$j")) __attribute__((retain, used))
406
+ #define UPB_LINKARR_DECLARE(name, type) \
407
+ __declspec(allocate("la_" #name "$a")) type __start_linkarr_##name; \
408
+ __declspec(allocate("la_" #name "$z")) type __stop_linkarr_##name; \
409
+ UPB_LINKARR_APPEND(name) type UPB_linkarr_internal_empty_##name[1] = {0}
410
+ #define UPB_LINKARR_START(name) (&__start_linkarr_##name)
411
+ #define UPB_LINKARR_STOP(name) (&__stop_linkarr_##name)
412
+
413
+ #else
414
+
415
+ // Linker arrays are not supported on this platform. Make appends a no-op but
416
+ // don't define the other macros.
417
+ #define UPB_LINKARR_APPEND(name)
418
+
419
+ #endif
420
+
421
+
345
422
  #include <errno.h>
346
423
  #include <float.h>
347
424
  #include <stdarg.h>
@@ -398,14 +475,16 @@ void upb_Status_VAppendErrorFormat(upb_Status* status, const char* fmt,
398
475
  * google/protobuf/descriptor.proto
399
476
  *
400
477
  * Do not edit -- your changes will be discarded when the file is
401
- * regenerated. */
478
+ * regenerated.
479
+ * NO CHECKED-IN PROTOBUF GENCODE */
402
480
 
403
481
  #include <stddef.h>
404
482
 
405
483
  // Must be last.
406
484
 
407
- static const upb_MiniTableSub google_protobuf_FileDescriptorSet_submsgs[1] = {
408
- {.UPB_PRIVATE(submsg) = &google__protobuf__FileDescriptorProto_msg_init},
485
+ extern const struct upb_MiniTable UPB_PRIVATE(_kUpb_MiniTable_StaticallyTreeShaken);
486
+ static const upb_MiniTableSubInternal google_protobuf_FileDescriptorSet_submsgs[1] = {
487
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FileDescriptorProto_msg_init_ptr},
409
488
  };
410
489
 
411
490
  static const upb_MiniTableField google_protobuf_FileDescriptorSet__fields[1] = {
@@ -416,19 +495,23 @@ const upb_MiniTable google__protobuf__FileDescriptorSet_msg_init = {
416
495
  &google_protobuf_FileDescriptorSet_submsgs[0],
417
496
  &google_protobuf_FileDescriptorSet__fields[0],
418
497
  16, 1, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(8), 0,
498
+ #ifdef UPB_TRACING_ENABLED
499
+ "google.protobuf.FileDescriptorSet",
500
+ #endif
419
501
  UPB_FASTTABLE_INIT({
420
502
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
421
503
  {0x000800003f00000a, &upb_prm_1bt_max192b},
422
504
  })
423
505
  };
424
506
 
425
- static const upb_MiniTableSub google_protobuf_FileDescriptorProto_submsgs[7] = {
426
- {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto_msg_init},
427
- {.UPB_PRIVATE(submsg) = &google__protobuf__EnumDescriptorProto_msg_init},
428
- {.UPB_PRIVATE(submsg) = &google__protobuf__ServiceDescriptorProto_msg_init},
429
- {.UPB_PRIVATE(submsg) = &google__protobuf__FieldDescriptorProto_msg_init},
430
- {.UPB_PRIVATE(submsg) = &google__protobuf__FileOptions_msg_init},
431
- {.UPB_PRIVATE(submsg) = &google__protobuf__SourceCodeInfo_msg_init},
507
+ const upb_MiniTable* google__protobuf__FileDescriptorSet_msg_init_ptr = &google__protobuf__FileDescriptorSet_msg_init;
508
+ static const upb_MiniTableSubInternal google_protobuf_FileDescriptorProto_submsgs[7] = {
509
+ {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto_msg_init_ptr},
510
+ {.UPB_PRIVATE(submsg) = &google__protobuf__EnumDescriptorProto_msg_init_ptr},
511
+ {.UPB_PRIVATE(submsg) = &google__protobuf__ServiceDescriptorProto_msg_init_ptr},
512
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldDescriptorProto_msg_init_ptr},
513
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FileOptions_msg_init_ptr},
514
+ {.UPB_PRIVATE(submsg) = &google__protobuf__SourceCodeInfo_msg_init_ptr},
432
515
  {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
433
516
  };
434
517
 
@@ -452,6 +535,9 @@ const upb_MiniTable google__protobuf__FileDescriptorProto_msg_init = {
452
535
  &google_protobuf_FileDescriptorProto_submsgs[0],
453
536
  &google_protobuf_FileDescriptorProto__fields[0],
454
537
  UPB_SIZE(80, 136), 13, kUpb_ExtMode_NonExtendable, 12, UPB_FASTTABLE_MASK(120), 0,
538
+ #ifdef UPB_TRACING_ENABLED
539
+ "google.protobuf.FileDescriptorProto",
540
+ #endif
455
541
  UPB_FASTTABLE_INIT({
456
542
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
457
543
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -472,15 +558,16 @@ const upb_MiniTable google__protobuf__FileDescriptorProto_msg_init = {
472
558
  })
473
559
  };
474
560
 
475
- static const upb_MiniTableSub google_protobuf_DescriptorProto_submsgs[8] = {
476
- {.UPB_PRIVATE(submsg) = &google__protobuf__FieldDescriptorProto_msg_init},
477
- {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto_msg_init},
478
- {.UPB_PRIVATE(submsg) = &google__protobuf__EnumDescriptorProto_msg_init},
479
- {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto__ExtensionRange_msg_init},
480
- {.UPB_PRIVATE(submsg) = &google__protobuf__FieldDescriptorProto_msg_init},
481
- {.UPB_PRIVATE(submsg) = &google__protobuf__MessageOptions_msg_init},
482
- {.UPB_PRIVATE(submsg) = &google__protobuf__OneofDescriptorProto_msg_init},
483
- {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto__ReservedRange_msg_init},
561
+ const upb_MiniTable* google__protobuf__FileDescriptorProto_msg_init_ptr = &google__protobuf__FileDescriptorProto_msg_init;
562
+ static const upb_MiniTableSubInternal google_protobuf_DescriptorProto_submsgs[8] = {
563
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldDescriptorProto_msg_init_ptr},
564
+ {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto_msg_init_ptr},
565
+ {.UPB_PRIVATE(submsg) = &google__protobuf__EnumDescriptorProto_msg_init_ptr},
566
+ {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto__ExtensionRange_msg_init_ptr},
567
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldDescriptorProto_msg_init_ptr},
568
+ {.UPB_PRIVATE(submsg) = &google__protobuf__MessageOptions_msg_init_ptr},
569
+ {.UPB_PRIVATE(submsg) = &google__protobuf__OneofDescriptorProto_msg_init_ptr},
570
+ {.UPB_PRIVATE(submsg) = &google__protobuf__DescriptorProto__ReservedRange_msg_init_ptr},
484
571
  };
485
572
 
486
573
  static const upb_MiniTableField google_protobuf_DescriptorProto__fields[10] = {
@@ -500,6 +587,9 @@ const upb_MiniTable google__protobuf__DescriptorProto_msg_init = {
500
587
  &google_protobuf_DescriptorProto_submsgs[0],
501
588
  &google_protobuf_DescriptorProto__fields[0],
502
589
  UPB_SIZE(56, 104), 10, kUpb_ExtMode_NonExtendable, 10, UPB_FASTTABLE_MASK(120), 0,
590
+ #ifdef UPB_TRACING_ENABLED
591
+ "google.protobuf.DescriptorProto",
592
+ #endif
503
593
  UPB_FASTTABLE_INIT({
504
594
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
505
595
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -520,8 +610,9 @@ const upb_MiniTable google__protobuf__DescriptorProto_msg_init = {
520
610
  })
521
611
  };
522
612
 
523
- static const upb_MiniTableSub google_protobuf_DescriptorProto_ExtensionRange_submsgs[1] = {
524
- {.UPB_PRIVATE(submsg) = &google__protobuf__ExtensionRangeOptions_msg_init},
613
+ const upb_MiniTable* google__protobuf__DescriptorProto_msg_init_ptr = &google__protobuf__DescriptorProto_msg_init;
614
+ static const upb_MiniTableSubInternal google_protobuf_DescriptorProto_ExtensionRange_submsgs[1] = {
615
+ {.UPB_PRIVATE(submsg) = &google__protobuf__ExtensionRangeOptions_msg_init_ptr},
525
616
  };
526
617
 
527
618
  static const upb_MiniTableField google_protobuf_DescriptorProto_ExtensionRange__fields[3] = {
@@ -534,8 +625,12 @@ const upb_MiniTable google__protobuf__DescriptorProto__ExtensionRange_msg_init =
534
625
  &google_protobuf_DescriptorProto_ExtensionRange_submsgs[0],
535
626
  &google_protobuf_DescriptorProto_ExtensionRange__fields[0],
536
627
  UPB_SIZE(24, 32), 3, kUpb_ExtMode_NonExtendable, 3, UPB_FASTTABLE_MASK(255), 0,
628
+ #ifdef UPB_TRACING_ENABLED
629
+ "google.protobuf.DescriptorProto.ExtensionRange",
630
+ #endif
537
631
  };
538
632
 
633
+ const upb_MiniTable* google__protobuf__DescriptorProto__ExtensionRange_msg_init_ptr = &google__protobuf__DescriptorProto__ExtensionRange_msg_init;
539
634
  static const upb_MiniTableField google_protobuf_DescriptorProto_ReservedRange__fields[2] = {
540
635
  {1, 12, 64, kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
541
636
  {2, 16, 65, kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
@@ -545,12 +640,16 @@ const upb_MiniTable google__protobuf__DescriptorProto__ReservedRange_msg_init =
545
640
  NULL,
546
641
  &google_protobuf_DescriptorProto_ReservedRange__fields[0],
547
642
  24, 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(255), 0,
643
+ #ifdef UPB_TRACING_ENABLED
644
+ "google.protobuf.DescriptorProto.ReservedRange",
645
+ #endif
548
646
  };
549
647
 
550
- static const upb_MiniTableSub google_protobuf_ExtensionRangeOptions_submsgs[4] = {
551
- {.UPB_PRIVATE(submsg) = &google__protobuf__ExtensionRangeOptions__Declaration_msg_init},
552
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
553
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
648
+ const upb_MiniTable* google__protobuf__DescriptorProto__ReservedRange_msg_init_ptr = &google__protobuf__DescriptorProto__ReservedRange_msg_init;
649
+ static const upb_MiniTableSubInternal google_protobuf_ExtensionRangeOptions_submsgs[4] = {
650
+ {.UPB_PRIVATE(submsg) = &google__protobuf__ExtensionRangeOptions__Declaration_msg_init_ptr},
651
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
652
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
554
653
  {.UPB_PRIVATE(subenum) = &google_protobuf_ExtensionRangeOptions_VerificationState_enum_init},
555
654
  };
556
655
 
@@ -565,6 +664,9 @@ const upb_MiniTable google__protobuf__ExtensionRangeOptions_msg_init = {
565
664
  &google_protobuf_ExtensionRangeOptions_submsgs[0],
566
665
  &google_protobuf_ExtensionRangeOptions__fields[0],
567
666
  UPB_SIZE(32, 40), 4, kUpb_ExtMode_Extendable, 0, UPB_FASTTABLE_MASK(248), 0,
667
+ #ifdef UPB_TRACING_ENABLED
668
+ "google.protobuf.ExtensionRangeOptions",
669
+ #endif
568
670
  UPB_FASTTABLE_INIT({
569
671
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
570
672
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -601,6 +703,7 @@ const upb_MiniTable google__protobuf__ExtensionRangeOptions_msg_init = {
601
703
  })
602
704
  };
603
705
 
706
+ const upb_MiniTable* google__protobuf__ExtensionRangeOptions_msg_init_ptr = &google__protobuf__ExtensionRangeOptions_msg_init;
604
707
  static const upb_MiniTableField google_protobuf_ExtensionRangeOptions_Declaration__fields[5] = {
605
708
  {1, 12, 64, kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
606
709
  {2, UPB_SIZE(20, 24), 65, kUpb_NoSub, 12, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)},
@@ -613,10 +716,14 @@ const upb_MiniTable google__protobuf__ExtensionRangeOptions__Declaration_msg_ini
613
716
  NULL,
614
717
  &google_protobuf_ExtensionRangeOptions_Declaration__fields[0],
615
718
  UPB_SIZE(40, 56), 5, kUpb_ExtMode_NonExtendable, 3, UPB_FASTTABLE_MASK(255), 0,
719
+ #ifdef UPB_TRACING_ENABLED
720
+ "google.protobuf.ExtensionRangeOptions.Declaration",
721
+ #endif
616
722
  };
617
723
 
618
- static const upb_MiniTableSub google_protobuf_FieldDescriptorProto_submsgs[3] = {
619
- {.UPB_PRIVATE(submsg) = &google__protobuf__FieldOptions_msg_init},
724
+ const upb_MiniTable* google__protobuf__ExtensionRangeOptions__Declaration_msg_init_ptr = &google__protobuf__ExtensionRangeOptions__Declaration_msg_init;
725
+ static const upb_MiniTableSubInternal google_protobuf_FieldDescriptorProto_submsgs[3] = {
726
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldOptions_msg_init_ptr},
620
727
  {.UPB_PRIVATE(subenum) = &google_protobuf_FieldDescriptorProto_Label_enum_init},
621
728
  {.UPB_PRIVATE(subenum) = &google_protobuf_FieldDescriptorProto_Type_enum_init},
622
729
  };
@@ -639,10 +746,14 @@ const upb_MiniTable google__protobuf__FieldDescriptorProto_msg_init = {
639
746
  &google_protobuf_FieldDescriptorProto_submsgs[0],
640
747
  &google_protobuf_FieldDescriptorProto__fields[0],
641
748
  UPB_SIZE(80, 120), 11, kUpb_ExtMode_NonExtendable, 10, UPB_FASTTABLE_MASK(255), 0,
749
+ #ifdef UPB_TRACING_ENABLED
750
+ "google.protobuf.FieldDescriptorProto",
751
+ #endif
642
752
  };
643
753
 
644
- static const upb_MiniTableSub google_protobuf_OneofDescriptorProto_submsgs[1] = {
645
- {.UPB_PRIVATE(submsg) = &google__protobuf__OneofOptions_msg_init},
754
+ const upb_MiniTable* google__protobuf__FieldDescriptorProto_msg_init_ptr = &google__protobuf__FieldDescriptorProto_msg_init;
755
+ static const upb_MiniTableSubInternal google_protobuf_OneofDescriptorProto_submsgs[1] = {
756
+ {.UPB_PRIVATE(submsg) = &google__protobuf__OneofOptions_msg_init_ptr},
646
757
  };
647
758
 
648
759
  static const upb_MiniTableField google_protobuf_OneofDescriptorProto__fields[2] = {
@@ -654,12 +765,16 @@ const upb_MiniTable google__protobuf__OneofDescriptorProto_msg_init = {
654
765
  &google_protobuf_OneofDescriptorProto_submsgs[0],
655
766
  &google_protobuf_OneofDescriptorProto__fields[0],
656
767
  UPB_SIZE(24, 40), 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(255), 0,
768
+ #ifdef UPB_TRACING_ENABLED
769
+ "google.protobuf.OneofDescriptorProto",
770
+ #endif
657
771
  };
658
772
 
659
- static const upb_MiniTableSub google_protobuf_EnumDescriptorProto_submsgs[3] = {
660
- {.UPB_PRIVATE(submsg) = &google__protobuf__EnumValueDescriptorProto_msg_init},
661
- {.UPB_PRIVATE(submsg) = &google__protobuf__EnumOptions_msg_init},
662
- {.UPB_PRIVATE(submsg) = &google__protobuf__EnumDescriptorProto__EnumReservedRange_msg_init},
773
+ const upb_MiniTable* google__protobuf__OneofDescriptorProto_msg_init_ptr = &google__protobuf__OneofDescriptorProto_msg_init;
774
+ static const upb_MiniTableSubInternal google_protobuf_EnumDescriptorProto_submsgs[3] = {
775
+ {.UPB_PRIVATE(submsg) = &google__protobuf__EnumValueDescriptorProto_msg_init_ptr},
776
+ {.UPB_PRIVATE(submsg) = &google__protobuf__EnumOptions_msg_init_ptr},
777
+ {.UPB_PRIVATE(submsg) = &google__protobuf__EnumDescriptorProto__EnumReservedRange_msg_init_ptr},
663
778
  };
664
779
 
665
780
  static const upb_MiniTableField google_protobuf_EnumDescriptorProto__fields[5] = {
@@ -674,6 +789,9 @@ const upb_MiniTable google__protobuf__EnumDescriptorProto_msg_init = {
674
789
  &google_protobuf_EnumDescriptorProto_submsgs[0],
675
790
  &google_protobuf_EnumDescriptorProto__fields[0],
676
791
  UPB_SIZE(40, 64), 5, kUpb_ExtMode_NonExtendable, 5, UPB_FASTTABLE_MASK(56), 0,
792
+ #ifdef UPB_TRACING_ENABLED
793
+ "google.protobuf.EnumDescriptorProto",
794
+ #endif
677
795
  UPB_FASTTABLE_INIT({
678
796
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
679
797
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -686,6 +804,7 @@ const upb_MiniTable google__protobuf__EnumDescriptorProto_msg_init = {
686
804
  })
687
805
  };
688
806
 
807
+ const upb_MiniTable* google__protobuf__EnumDescriptorProto_msg_init_ptr = &google__protobuf__EnumDescriptorProto_msg_init;
689
808
  static const upb_MiniTableField google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[2] = {
690
809
  {1, 12, 64, kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
691
810
  {2, 16, 65, kUpb_NoSub, 5, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
@@ -695,10 +814,14 @@ const upb_MiniTable google__protobuf__EnumDescriptorProto__EnumReservedRange_msg
695
814
  NULL,
696
815
  &google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[0],
697
816
  24, 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(255), 0,
817
+ #ifdef UPB_TRACING_ENABLED
818
+ "google.protobuf.EnumDescriptorProto.EnumReservedRange",
819
+ #endif
698
820
  };
699
821
 
700
- static const upb_MiniTableSub google_protobuf_EnumValueDescriptorProto_submsgs[1] = {
701
- {.UPB_PRIVATE(submsg) = &google__protobuf__EnumValueOptions_msg_init},
822
+ const upb_MiniTable* google__protobuf__EnumDescriptorProto__EnumReservedRange_msg_init_ptr = &google__protobuf__EnumDescriptorProto__EnumReservedRange_msg_init;
823
+ static const upb_MiniTableSubInternal google_protobuf_EnumValueDescriptorProto_submsgs[1] = {
824
+ {.UPB_PRIVATE(submsg) = &google__protobuf__EnumValueOptions_msg_init_ptr},
702
825
  };
703
826
 
704
827
  static const upb_MiniTableField google_protobuf_EnumValueDescriptorProto__fields[3] = {
@@ -711,11 +834,15 @@ const upb_MiniTable google__protobuf__EnumValueDescriptorProto_msg_init = {
711
834
  &google_protobuf_EnumValueDescriptorProto_submsgs[0],
712
835
  &google_protobuf_EnumValueDescriptorProto__fields[0],
713
836
  UPB_SIZE(32, 40), 3, kUpb_ExtMode_NonExtendable, 3, UPB_FASTTABLE_MASK(255), 0,
837
+ #ifdef UPB_TRACING_ENABLED
838
+ "google.protobuf.EnumValueDescriptorProto",
839
+ #endif
714
840
  };
715
841
 
716
- static const upb_MiniTableSub google_protobuf_ServiceDescriptorProto_submsgs[2] = {
717
- {.UPB_PRIVATE(submsg) = &google__protobuf__MethodDescriptorProto_msg_init},
718
- {.UPB_PRIVATE(submsg) = &google__protobuf__ServiceOptions_msg_init},
842
+ const upb_MiniTable* google__protobuf__EnumValueDescriptorProto_msg_init_ptr = &google__protobuf__EnumValueDescriptorProto_msg_init;
843
+ static const upb_MiniTableSubInternal google_protobuf_ServiceDescriptorProto_submsgs[2] = {
844
+ {.UPB_PRIVATE(submsg) = &google__protobuf__MethodDescriptorProto_msg_init_ptr},
845
+ {.UPB_PRIVATE(submsg) = &google__protobuf__ServiceOptions_msg_init_ptr},
719
846
  };
720
847
 
721
848
  static const upb_MiniTableField google_protobuf_ServiceDescriptorProto__fields[3] = {
@@ -728,6 +855,9 @@ const upb_MiniTable google__protobuf__ServiceDescriptorProto_msg_init = {
728
855
  &google_protobuf_ServiceDescriptorProto_submsgs[0],
729
856
  &google_protobuf_ServiceDescriptorProto__fields[0],
730
857
  UPB_SIZE(32, 48), 3, kUpb_ExtMode_NonExtendable, 3, UPB_FASTTABLE_MASK(24), 0,
858
+ #ifdef UPB_TRACING_ENABLED
859
+ "google.protobuf.ServiceDescriptorProto",
860
+ #endif
731
861
  UPB_FASTTABLE_INIT({
732
862
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
733
863
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -736,8 +866,9 @@ const upb_MiniTable google__protobuf__ServiceDescriptorProto_msg_init = {
736
866
  })
737
867
  };
738
868
 
739
- static const upb_MiniTableSub google_protobuf_MethodDescriptorProto_submsgs[1] = {
740
- {.UPB_PRIVATE(submsg) = &google__protobuf__MethodOptions_msg_init},
869
+ const upb_MiniTable* google__protobuf__ServiceDescriptorProto_msg_init_ptr = &google__protobuf__ServiceDescriptorProto_msg_init;
870
+ static const upb_MiniTableSubInternal google_protobuf_MethodDescriptorProto_submsgs[1] = {
871
+ {.UPB_PRIVATE(submsg) = &google__protobuf__MethodOptions_msg_init_ptr},
741
872
  };
742
873
 
743
874
  static const upb_MiniTableField google_protobuf_MethodDescriptorProto__fields[6] = {
@@ -753,11 +884,15 @@ const upb_MiniTable google__protobuf__MethodDescriptorProto_msg_init = {
753
884
  &google_protobuf_MethodDescriptorProto_submsgs[0],
754
885
  &google_protobuf_MethodDescriptorProto__fields[0],
755
886
  UPB_SIZE(48, 72), 6, kUpb_ExtMode_NonExtendable, 6, UPB_FASTTABLE_MASK(255), 0,
887
+ #ifdef UPB_TRACING_ENABLED
888
+ "google.protobuf.MethodDescriptorProto",
889
+ #endif
756
890
  };
757
891
 
758
- static const upb_MiniTableSub google_protobuf_FileOptions_submsgs[3] = {
759
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
760
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
892
+ const upb_MiniTable* google__protobuf__MethodDescriptorProto_msg_init_ptr = &google__protobuf__MethodDescriptorProto_msg_init;
893
+ static const upb_MiniTableSubInternal google_protobuf_FileOptions_submsgs[3] = {
894
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
895
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
761
896
  {.UPB_PRIVATE(subenum) = &google_protobuf_FileOptions_OptimizeMode_enum_init},
762
897
  };
763
898
 
@@ -789,6 +924,9 @@ const upb_MiniTable google__protobuf__FileOptions_msg_init = {
789
924
  &google_protobuf_FileOptions_submsgs[0],
790
925
  &google_protobuf_FileOptions__fields[0],
791
926
  UPB_SIZE(112, 200), 21, kUpb_ExtMode_Extendable, 1, UPB_FASTTABLE_MASK(248), 0,
927
+ #ifdef UPB_TRACING_ENABLED
928
+ "google.protobuf.FileOptions",
929
+ #endif
792
930
  UPB_FASTTABLE_INIT({
793
931
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
794
932
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -825,9 +963,10 @@ const upb_MiniTable google__protobuf__FileOptions_msg_init = {
825
963
  })
826
964
  };
827
965
 
828
- static const upb_MiniTableSub google_protobuf_MessageOptions_submsgs[2] = {
829
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
830
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
966
+ const upb_MiniTable* google__protobuf__FileOptions_msg_init_ptr = &google__protobuf__FileOptions_msg_init;
967
+ static const upb_MiniTableSubInternal google_protobuf_MessageOptions_submsgs[2] = {
968
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
969
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
831
970
  };
832
971
 
833
972
  static const upb_MiniTableField google_protobuf_MessageOptions__fields[7] = {
@@ -844,6 +983,9 @@ const upb_MiniTable google__protobuf__MessageOptions_msg_init = {
844
983
  &google_protobuf_MessageOptions_submsgs[0],
845
984
  &google_protobuf_MessageOptions__fields[0],
846
985
  UPB_SIZE(24, 32), 7, kUpb_ExtMode_Extendable, 3, UPB_FASTTABLE_MASK(248), 0,
986
+ #ifdef UPB_TRACING_ENABLED
987
+ "google.protobuf.MessageOptions",
988
+ #endif
847
989
  UPB_FASTTABLE_INIT({
848
990
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
849
991
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -880,36 +1022,42 @@ const upb_MiniTable google__protobuf__MessageOptions_msg_init = {
880
1022
  })
881
1023
  };
882
1024
 
883
- static const upb_MiniTableSub google_protobuf_FieldOptions_submsgs[7] = {
884
- {.UPB_PRIVATE(submsg) = &google__protobuf__FieldOptions__EditionDefault_msg_init},
885
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
886
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
1025
+ const upb_MiniTable* google__protobuf__MessageOptions_msg_init_ptr = &google__protobuf__MessageOptions_msg_init;
1026
+ static const upb_MiniTableSubInternal google_protobuf_FieldOptions_submsgs[8] = {
1027
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldOptions__EditionDefault_msg_init_ptr},
1028
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1029
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldOptions__FeatureSupport_msg_init_ptr},
1030
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
887
1031
  {.UPB_PRIVATE(subenum) = &google_protobuf_FieldOptions_CType_enum_init},
888
1032
  {.UPB_PRIVATE(subenum) = &google_protobuf_FieldOptions_JSType_enum_init},
889
1033
  {.UPB_PRIVATE(subenum) = &google_protobuf_FieldOptions_OptionRetention_enum_init},
890
1034
  {.UPB_PRIVATE(subenum) = &google_protobuf_FieldOptions_OptionTargetType_enum_init},
891
1035
  };
892
1036
 
893
- static const upb_MiniTableField google_protobuf_FieldOptions__fields[13] = {
894
- {1, 12, 64, 3, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1037
+ static const upb_MiniTableField google_protobuf_FieldOptions__fields[14] = {
1038
+ {1, 12, 64, 4, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
895
1039
  {2, 16, 65, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
896
1040
  {3, 17, 66, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
897
1041
  {5, 18, 67, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
898
- {6, 20, 68, 4, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1042
+ {6, 20, 68, 5, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
899
1043
  {10, 24, 69, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
900
1044
  {15, 25, 70, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
901
1045
  {16, 26, 71, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
902
- {17, 28, 72, 5, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
903
- {19, 32, 0, 6, 14, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1046
+ {17, 28, 72, 6, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1047
+ {19, 32, 0, 7, 14, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
904
1048
  {20, UPB_SIZE(36, 40), 0, 0, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
905
1049
  {21, UPB_SIZE(40, 48), 73, 1, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
906
- {999, UPB_SIZE(44, 56), 0, 2, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1050
+ {22, UPB_SIZE(44, 56), 74, 2, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1051
+ {999, UPB_SIZE(48, 64), 0, 3, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
907
1052
  };
908
1053
 
909
1054
  const upb_MiniTable google__protobuf__FieldOptions_msg_init = {
910
1055
  &google_protobuf_FieldOptions_submsgs[0],
911
1056
  &google_protobuf_FieldOptions__fields[0],
912
- UPB_SIZE(48, 64), 13, kUpb_ExtMode_Extendable, 3, UPB_FASTTABLE_MASK(248), 0,
1057
+ UPB_SIZE(56, 72), 14, kUpb_ExtMode_Extendable, 3, UPB_FASTTABLE_MASK(248), 0,
1058
+ #ifdef UPB_TRACING_ENABLED
1059
+ "google.protobuf.FieldOptions",
1060
+ #endif
913
1061
  UPB_FASTTABLE_INIT({
914
1062
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
915
1063
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -934,7 +1082,7 @@ const upb_MiniTable google__protobuf__FieldOptions_msg_init = {
934
1082
  {0x002800003f0001a2, &upb_prm_2bt_max64b},
935
1083
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
936
1084
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
937
- {0x003800003f023eba, &upb_prm_2bt_max128b},
1085
+ {0x004000003f033eba, &upb_prm_2bt_max128b},
938
1086
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
939
1087
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
940
1088
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -946,7 +1094,8 @@ const upb_MiniTable google__protobuf__FieldOptions_msg_init = {
946
1094
  })
947
1095
  };
948
1096
 
949
- static const upb_MiniTableSub google_protobuf_FieldOptions_EditionDefault_submsgs[1] = {
1097
+ const upb_MiniTable* google__protobuf__FieldOptions_msg_init_ptr = &google__protobuf__FieldOptions_msg_init;
1098
+ static const upb_MiniTableSubInternal google_protobuf_FieldOptions_EditionDefault_submsgs[1] = {
950
1099
  {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
951
1100
  };
952
1101
 
@@ -959,11 +1108,38 @@ const upb_MiniTable google__protobuf__FieldOptions__EditionDefault_msg_init = {
959
1108
  &google_protobuf_FieldOptions_EditionDefault_submsgs[0],
960
1109
  &google_protobuf_FieldOptions_EditionDefault__fields[0],
961
1110
  UPB_SIZE(24, 32), 2, kUpb_ExtMode_NonExtendable, 0, UPB_FASTTABLE_MASK(255), 0,
1111
+ #ifdef UPB_TRACING_ENABLED
1112
+ "google.protobuf.FieldOptions.EditionDefault",
1113
+ #endif
1114
+ };
1115
+
1116
+ const upb_MiniTable* google__protobuf__FieldOptions__EditionDefault_msg_init_ptr = &google__protobuf__FieldOptions__EditionDefault_msg_init;
1117
+ static const upb_MiniTableSubInternal google_protobuf_FieldOptions_FeatureSupport_submsgs[3] = {
1118
+ {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
1119
+ {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
1120
+ {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
1121
+ };
1122
+
1123
+ static const upb_MiniTableField google_protobuf_FieldOptions_FeatureSupport__fields[4] = {
1124
+ {1, 12, 64, 0, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1125
+ {2, 16, 65, 1, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1126
+ {3, 24, 66, kUpb_NoSub, 12, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)},
1127
+ {4, 20, 67, 2, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1128
+ };
1129
+
1130
+ const upb_MiniTable google__protobuf__FieldOptions__FeatureSupport_msg_init = {
1131
+ &google_protobuf_FieldOptions_FeatureSupport_submsgs[0],
1132
+ &google_protobuf_FieldOptions_FeatureSupport__fields[0],
1133
+ UPB_SIZE(32, 40), 4, kUpb_ExtMode_NonExtendable, 4, UPB_FASTTABLE_MASK(255), 0,
1134
+ #ifdef UPB_TRACING_ENABLED
1135
+ "google.protobuf.FieldOptions.FeatureSupport",
1136
+ #endif
962
1137
  };
963
1138
 
964
- static const upb_MiniTableSub google_protobuf_OneofOptions_submsgs[2] = {
965
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
966
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
1139
+ const upb_MiniTable* google__protobuf__FieldOptions__FeatureSupport_msg_init_ptr = &google__protobuf__FieldOptions__FeatureSupport_msg_init;
1140
+ static const upb_MiniTableSubInternal google_protobuf_OneofOptions_submsgs[2] = {
1141
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1142
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
967
1143
  };
968
1144
 
969
1145
  static const upb_MiniTableField google_protobuf_OneofOptions__fields[2] = {
@@ -975,6 +1151,9 @@ const upb_MiniTable google__protobuf__OneofOptions_msg_init = {
975
1151
  &google_protobuf_OneofOptions_submsgs[0],
976
1152
  &google_protobuf_OneofOptions__fields[0],
977
1153
  UPB_SIZE(24, 32), 2, kUpb_ExtMode_Extendable, 1, UPB_FASTTABLE_MASK(248), 0,
1154
+ #ifdef UPB_TRACING_ENABLED
1155
+ "google.protobuf.OneofOptions",
1156
+ #endif
978
1157
  UPB_FASTTABLE_INIT({
979
1158
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
980
1159
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1011,9 +1190,10 @@ const upb_MiniTable google__protobuf__OneofOptions_msg_init = {
1011
1190
  })
1012
1191
  };
1013
1192
 
1014
- static const upb_MiniTableSub google_protobuf_EnumOptions_submsgs[2] = {
1015
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
1016
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
1193
+ const upb_MiniTable* google__protobuf__OneofOptions_msg_init_ptr = &google__protobuf__OneofOptions_msg_init;
1194
+ static const upb_MiniTableSubInternal google_protobuf_EnumOptions_submsgs[2] = {
1195
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1196
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
1017
1197
  };
1018
1198
 
1019
1199
  static const upb_MiniTableField google_protobuf_EnumOptions__fields[5] = {
@@ -1028,6 +1208,9 @@ const upb_MiniTable google__protobuf__EnumOptions_msg_init = {
1028
1208
  &google_protobuf_EnumOptions_submsgs[0],
1029
1209
  &google_protobuf_EnumOptions__fields[0],
1030
1210
  UPB_SIZE(24, 32), 5, kUpb_ExtMode_Extendable, 0, UPB_FASTTABLE_MASK(248), 0,
1211
+ #ifdef UPB_TRACING_ENABLED
1212
+ "google.protobuf.EnumOptions",
1213
+ #endif
1031
1214
  UPB_FASTTABLE_INIT({
1032
1215
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1033
1216
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1064,22 +1247,28 @@ const upb_MiniTable google__protobuf__EnumOptions_msg_init = {
1064
1247
  })
1065
1248
  };
1066
1249
 
1067
- static const upb_MiniTableSub google_protobuf_EnumValueOptions_submsgs[2] = {
1068
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
1069
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
1250
+ const upb_MiniTable* google__protobuf__EnumOptions_msg_init_ptr = &google__protobuf__EnumOptions_msg_init;
1251
+ static const upb_MiniTableSubInternal google_protobuf_EnumValueOptions_submsgs[3] = {
1252
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1253
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FieldOptions__FeatureSupport_msg_init_ptr},
1254
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
1070
1255
  };
1071
1256
 
1072
- static const upb_MiniTableField google_protobuf_EnumValueOptions__fields[4] = {
1257
+ static const upb_MiniTableField google_protobuf_EnumValueOptions__fields[5] = {
1073
1258
  {1, 9, 64, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
1074
1259
  {2, UPB_SIZE(12, 16), 65, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1075
1260
  {3, UPB_SIZE(16, 10), 66, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
1076
- {999, UPB_SIZE(20, 24), 0, 1, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1261
+ {4, UPB_SIZE(20, 24), 67, 1, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1262
+ {999, UPB_SIZE(24, 32), 0, 2, 11, (int)kUpb_FieldMode_Array | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1077
1263
  };
1078
1264
 
1079
1265
  const upb_MiniTable google__protobuf__EnumValueOptions_msg_init = {
1080
1266
  &google_protobuf_EnumValueOptions_submsgs[0],
1081
1267
  &google_protobuf_EnumValueOptions__fields[0],
1082
- UPB_SIZE(24, 32), 4, kUpb_ExtMode_Extendable, 3, UPB_FASTTABLE_MASK(248), 0,
1268
+ UPB_SIZE(32, 40), 5, kUpb_ExtMode_Extendable, 4, UPB_FASTTABLE_MASK(248), 0,
1269
+ #ifdef UPB_TRACING_ENABLED
1270
+ "google.protobuf.EnumValueOptions",
1271
+ #endif
1083
1272
  UPB_FASTTABLE_INIT({
1084
1273
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1085
1274
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1104,7 +1293,7 @@ const upb_MiniTable google__protobuf__EnumValueOptions_msg_init = {
1104
1293
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1105
1294
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1106
1295
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1107
- {0x001800003f013eba, &upb_prm_2bt_max128b},
1296
+ {0x002000003f023eba, &upb_prm_2bt_max128b},
1108
1297
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1109
1298
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1110
1299
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1116,9 +1305,10 @@ const upb_MiniTable google__protobuf__EnumValueOptions_msg_init = {
1116
1305
  })
1117
1306
  };
1118
1307
 
1119
- static const upb_MiniTableSub google_protobuf_ServiceOptions_submsgs[2] = {
1120
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
1121
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
1308
+ const upb_MiniTable* google__protobuf__EnumValueOptions_msg_init_ptr = &google__protobuf__EnumValueOptions_msg_init;
1309
+ static const upb_MiniTableSubInternal google_protobuf_ServiceOptions_submsgs[2] = {
1310
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1311
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
1122
1312
  };
1123
1313
 
1124
1314
  static const upb_MiniTableField google_protobuf_ServiceOptions__fields[3] = {
@@ -1131,6 +1321,9 @@ const upb_MiniTable google__protobuf__ServiceOptions_msg_init = {
1131
1321
  &google_protobuf_ServiceOptions_submsgs[0],
1132
1322
  &google_protobuf_ServiceOptions__fields[0],
1133
1323
  UPB_SIZE(24, 32), 3, kUpb_ExtMode_Extendable, 0, UPB_FASTTABLE_MASK(248), 0,
1324
+ #ifdef UPB_TRACING_ENABLED
1325
+ "google.protobuf.ServiceOptions",
1326
+ #endif
1134
1327
  UPB_FASTTABLE_INIT({
1135
1328
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1136
1329
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1167,9 +1360,10 @@ const upb_MiniTable google__protobuf__ServiceOptions_msg_init = {
1167
1360
  })
1168
1361
  };
1169
1362
 
1170
- static const upb_MiniTableSub google_protobuf_MethodOptions_submsgs[3] = {
1171
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
1172
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init},
1363
+ const upb_MiniTable* google__protobuf__ServiceOptions_msg_init_ptr = &google__protobuf__ServiceOptions_msg_init;
1364
+ static const upb_MiniTableSubInternal google_protobuf_MethodOptions_submsgs[3] = {
1365
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1366
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption_msg_init_ptr},
1173
1367
  {.UPB_PRIVATE(subenum) = &google_protobuf_MethodOptions_IdempotencyLevel_enum_init},
1174
1368
  };
1175
1369
 
@@ -1184,6 +1378,9 @@ const upb_MiniTable google__protobuf__MethodOptions_msg_init = {
1184
1378
  &google_protobuf_MethodOptions_submsgs[0],
1185
1379
  &google_protobuf_MethodOptions__fields[0],
1186
1380
  UPB_SIZE(24, 32), 4, kUpb_ExtMode_Extendable, 0, UPB_FASTTABLE_MASK(248), 0,
1381
+ #ifdef UPB_TRACING_ENABLED
1382
+ "google.protobuf.MethodOptions",
1383
+ #endif
1187
1384
  UPB_FASTTABLE_INIT({
1188
1385
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1189
1386
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1220,8 +1417,9 @@ const upb_MiniTable google__protobuf__MethodOptions_msg_init = {
1220
1417
  })
1221
1418
  };
1222
1419
 
1223
- static const upb_MiniTableSub google_protobuf_UninterpretedOption_submsgs[1] = {
1224
- {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption__NamePart_msg_init},
1420
+ const upb_MiniTable* google__protobuf__MethodOptions_msg_init_ptr = &google__protobuf__MethodOptions_msg_init;
1421
+ static const upb_MiniTableSubInternal google_protobuf_UninterpretedOption_submsgs[1] = {
1422
+ {.UPB_PRIVATE(submsg) = &google__protobuf__UninterpretedOption__NamePart_msg_init_ptr},
1225
1423
  };
1226
1424
 
1227
1425
  static const upb_MiniTableField google_protobuf_UninterpretedOption__fields[7] = {
@@ -1238,6 +1436,9 @@ const upb_MiniTable google__protobuf__UninterpretedOption_msg_init = {
1238
1436
  &google_protobuf_UninterpretedOption_submsgs[0],
1239
1437
  &google_protobuf_UninterpretedOption__fields[0],
1240
1438
  UPB_SIZE(64, 96), 7, kUpb_ExtMode_NonExtendable, 0, UPB_FASTTABLE_MASK(24), 0,
1439
+ #ifdef UPB_TRACING_ENABLED
1440
+ "google.protobuf.UninterpretedOption",
1441
+ #endif
1241
1442
  UPB_FASTTABLE_INIT({
1242
1443
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1243
1444
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
@@ -1246,6 +1447,7 @@ const upb_MiniTable google__protobuf__UninterpretedOption_msg_init = {
1246
1447
  })
1247
1448
  };
1248
1449
 
1450
+ const upb_MiniTable* google__protobuf__UninterpretedOption_msg_init_ptr = &google__protobuf__UninterpretedOption_msg_init;
1249
1451
  static const upb_MiniTableField google_protobuf_UninterpretedOption_NamePart__fields[2] = {
1250
1452
  {1, UPB_SIZE(12, 16), 64, kUpb_NoSub, 12, (int)kUpb_FieldMode_Scalar | (int)kUpb_LabelFlags_IsAlternate | ((int)kUpb_FieldRep_StringView << kUpb_FieldRep_Shift)},
1251
1453
  {2, 9, 65, kUpb_NoSub, 8, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
@@ -1255,9 +1457,13 @@ const upb_MiniTable google__protobuf__UninterpretedOption__NamePart_msg_init = {
1255
1457
  NULL,
1256
1458
  &google_protobuf_UninterpretedOption_NamePart__fields[0],
1257
1459
  UPB_SIZE(24, 32), 2, kUpb_ExtMode_NonExtendable, 2, UPB_FASTTABLE_MASK(255), 2,
1460
+ #ifdef UPB_TRACING_ENABLED
1461
+ "google.protobuf.UninterpretedOption.NamePart",
1462
+ #endif
1258
1463
  };
1259
1464
 
1260
- static const upb_MiniTableSub google_protobuf_FeatureSet_submsgs[6] = {
1465
+ const upb_MiniTable* google__protobuf__UninterpretedOption__NamePart_msg_init_ptr = &google__protobuf__UninterpretedOption__NamePart_msg_init;
1466
+ static const upb_MiniTableSubInternal google_protobuf_FeatureSet_submsgs[6] = {
1261
1467
  {.UPB_PRIVATE(subenum) = &google_protobuf_FeatureSet_FieldPresence_enum_init},
1262
1468
  {.UPB_PRIVATE(subenum) = &google_protobuf_FeatureSet_EnumType_enum_init},
1263
1469
  {.UPB_PRIVATE(subenum) = &google_protobuf_FeatureSet_RepeatedFieldEncoding_enum_init},
@@ -1279,10 +1485,14 @@ const upb_MiniTable google__protobuf__FeatureSet_msg_init = {
1279
1485
  &google_protobuf_FeatureSet_submsgs[0],
1280
1486
  &google_protobuf_FeatureSet__fields[0],
1281
1487
  40, 6, kUpb_ExtMode_Extendable, 6, UPB_FASTTABLE_MASK(255), 0,
1488
+ #ifdef UPB_TRACING_ENABLED
1489
+ "google.protobuf.FeatureSet",
1490
+ #endif
1282
1491
  };
1283
1492
 
1284
- static const upb_MiniTableSub google_protobuf_FeatureSetDefaults_submsgs[3] = {
1285
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init},
1493
+ const upb_MiniTable* google__protobuf__FeatureSet_msg_init_ptr = &google__protobuf__FeatureSet_msg_init;
1494
+ static const upb_MiniTableSubInternal google_protobuf_FeatureSetDefaults_submsgs[3] = {
1495
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init_ptr},
1286
1496
  {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
1287
1497
  {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
1288
1498
  };
@@ -1297,30 +1507,40 @@ const upb_MiniTable google__protobuf__FeatureSetDefaults_msg_init = {
1297
1507
  &google_protobuf_FeatureSetDefaults_submsgs[0],
1298
1508
  &google_protobuf_FeatureSetDefaults__fields[0],
1299
1509
  UPB_SIZE(24, 32), 3, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(8), 0,
1510
+ #ifdef UPB_TRACING_ENABLED
1511
+ "google.protobuf.FeatureSetDefaults",
1512
+ #endif
1300
1513
  UPB_FASTTABLE_INIT({
1301
1514
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1302
1515
  {0x001800003f00000a, &upb_prm_1bt_max64b},
1303
1516
  })
1304
1517
  };
1305
1518
 
1306
- static const upb_MiniTableSub google_protobuf_FeatureSetDefaults_FeatureSetEditionDefault_submsgs[2] = {
1307
- {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init},
1519
+ const upb_MiniTable* google__protobuf__FeatureSetDefaults_msg_init_ptr = &google__protobuf__FeatureSetDefaults_msg_init;
1520
+ static const upb_MiniTableSubInternal google_protobuf_FeatureSetDefaults_FeatureSetEditionDefault_submsgs[3] = {
1521
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1522
+ {.UPB_PRIVATE(submsg) = &google__protobuf__FeatureSet_msg_init_ptr},
1308
1523
  {.UPB_PRIVATE(subenum) = &google_protobuf_Edition_enum_init},
1309
1524
  };
1310
1525
 
1311
- static const upb_MiniTableField google_protobuf_FeatureSetDefaults_FeatureSetEditionDefault__fields[2] = {
1312
- {2, UPB_SIZE(12, 16), 64, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1313
- {3, UPB_SIZE(16, 12), 65, 1, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1526
+ static const upb_MiniTableField google_protobuf_FeatureSetDefaults_FeatureSetEditionDefault__fields[3] = {
1527
+ {3, 12, 64, 2, 14, (int)kUpb_FieldMode_Scalar | ((int)kUpb_FieldRep_4Byte << kUpb_FieldRep_Shift)},
1528
+ {4, 16, 65, 0, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1529
+ {5, UPB_SIZE(20, 24), 66, 1, 11, (int)kUpb_FieldMode_Scalar | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1314
1530
  };
1315
1531
 
1316
1532
  const upb_MiniTable google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init = {
1317
1533
  &google_protobuf_FeatureSetDefaults_FeatureSetEditionDefault_submsgs[0],
1318
1534
  &google_protobuf_FeatureSetDefaults_FeatureSetEditionDefault__fields[0],
1319
- 24, 2, kUpb_ExtMode_NonExtendable, 0, UPB_FASTTABLE_MASK(255), 0,
1535
+ UPB_SIZE(24, 32), 3, kUpb_ExtMode_NonExtendable, 0, UPB_FASTTABLE_MASK(255), 0,
1536
+ #ifdef UPB_TRACING_ENABLED
1537
+ "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault",
1538
+ #endif
1320
1539
  };
1321
1540
 
1322
- static const upb_MiniTableSub google_protobuf_SourceCodeInfo_submsgs[1] = {
1323
- {.UPB_PRIVATE(submsg) = &google__protobuf__SourceCodeInfo__Location_msg_init},
1541
+ const upb_MiniTable* google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init_ptr = &google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init;
1542
+ static const upb_MiniTableSubInternal google_protobuf_SourceCodeInfo_submsgs[1] = {
1543
+ {.UPB_PRIVATE(submsg) = &google__protobuf__SourceCodeInfo__Location_msg_init_ptr},
1324
1544
  };
1325
1545
 
1326
1546
  static const upb_MiniTableField google_protobuf_SourceCodeInfo__fields[1] = {
@@ -1331,12 +1551,16 @@ const upb_MiniTable google__protobuf__SourceCodeInfo_msg_init = {
1331
1551
  &google_protobuf_SourceCodeInfo_submsgs[0],
1332
1552
  &google_protobuf_SourceCodeInfo__fields[0],
1333
1553
  16, 1, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(8), 0,
1554
+ #ifdef UPB_TRACING_ENABLED
1555
+ "google.protobuf.SourceCodeInfo",
1556
+ #endif
1334
1557
  UPB_FASTTABLE_INIT({
1335
1558
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1336
1559
  {0x000800003f00000a, &upb_prm_1bt_max128b},
1337
1560
  })
1338
1561
  };
1339
1562
 
1563
+ const upb_MiniTable* google__protobuf__SourceCodeInfo_msg_init_ptr = &google__protobuf__SourceCodeInfo_msg_init;
1340
1564
  static const upb_MiniTableField google_protobuf_SourceCodeInfo_Location__fields[5] = {
1341
1565
  {1, UPB_SIZE(12, 16), 0, kUpb_NoSub, 5, (int)kUpb_FieldMode_Array | (int)kUpb_LabelFlags_IsPacked | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
1342
1566
  {2, UPB_SIZE(16, 24), 0, kUpb_NoSub, 5, (int)kUpb_FieldMode_Array | (int)kUpb_LabelFlags_IsPacked | ((int)UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte) << kUpb_FieldRep_Shift)},
@@ -1349,6 +1573,9 @@ const upb_MiniTable google__protobuf__SourceCodeInfo__Location_msg_init = {
1349
1573
  NULL,
1350
1574
  &google_protobuf_SourceCodeInfo_Location__fields[0],
1351
1575
  UPB_SIZE(40, 72), 5, kUpb_ExtMode_NonExtendable, 4, UPB_FASTTABLE_MASK(56), 0,
1576
+ #ifdef UPB_TRACING_ENABLED
1577
+ "google.protobuf.SourceCodeInfo.Location",
1578
+ #endif
1352
1579
  UPB_FASTTABLE_INIT({
1353
1580
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1354
1581
  {0x001000003f00000a, &upb_ppv4_1bt},
@@ -1361,8 +1588,9 @@ const upb_MiniTable google__protobuf__SourceCodeInfo__Location_msg_init = {
1361
1588
  })
1362
1589
  };
1363
1590
 
1364
- static const upb_MiniTableSub google_protobuf_GeneratedCodeInfo_submsgs[1] = {
1365
- {.UPB_PRIVATE(submsg) = &google__protobuf__GeneratedCodeInfo__Annotation_msg_init},
1591
+ const upb_MiniTable* google__protobuf__SourceCodeInfo__Location_msg_init_ptr = &google__protobuf__SourceCodeInfo__Location_msg_init;
1592
+ static const upb_MiniTableSubInternal google_protobuf_GeneratedCodeInfo_submsgs[1] = {
1593
+ {.UPB_PRIVATE(submsg) = &google__protobuf__GeneratedCodeInfo__Annotation_msg_init_ptr},
1366
1594
  };
1367
1595
 
1368
1596
  static const upb_MiniTableField google_protobuf_GeneratedCodeInfo__fields[1] = {
@@ -1373,13 +1601,17 @@ const upb_MiniTable google__protobuf__GeneratedCodeInfo_msg_init = {
1373
1601
  &google_protobuf_GeneratedCodeInfo_submsgs[0],
1374
1602
  &google_protobuf_GeneratedCodeInfo__fields[0],
1375
1603
  16, 1, kUpb_ExtMode_NonExtendable, 1, UPB_FASTTABLE_MASK(8), 0,
1604
+ #ifdef UPB_TRACING_ENABLED
1605
+ "google.protobuf.GeneratedCodeInfo",
1606
+ #endif
1376
1607
  UPB_FASTTABLE_INIT({
1377
1608
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1378
1609
  {0x000800003f00000a, &upb_prm_1bt_max64b},
1379
1610
  })
1380
1611
  };
1381
1612
 
1382
- static const upb_MiniTableSub google_protobuf_GeneratedCodeInfo_Annotation_submsgs[1] = {
1613
+ const upb_MiniTable* google__protobuf__GeneratedCodeInfo_msg_init_ptr = &google__protobuf__GeneratedCodeInfo_msg_init;
1614
+ static const upb_MiniTableSubInternal google_protobuf_GeneratedCodeInfo_Annotation_submsgs[1] = {
1383
1615
  {.UPB_PRIVATE(subenum) = &google_protobuf_GeneratedCodeInfo_Annotation_Semantic_enum_init},
1384
1616
  };
1385
1617
 
@@ -1395,53 +1627,23 @@ const upb_MiniTable google__protobuf__GeneratedCodeInfo__Annotation_msg_init = {
1395
1627
  &google_protobuf_GeneratedCodeInfo_Annotation_submsgs[0],
1396
1628
  &google_protobuf_GeneratedCodeInfo_Annotation__fields[0],
1397
1629
  UPB_SIZE(40, 48), 5, kUpb_ExtMode_NonExtendable, 5, UPB_FASTTABLE_MASK(8), 0,
1630
+ #ifdef UPB_TRACING_ENABLED
1631
+ "google.protobuf.GeneratedCodeInfo.Annotation",
1632
+ #endif
1398
1633
  UPB_FASTTABLE_INIT({
1399
1634
  {0x0000000000000000, &_upb_FastDecoder_DecodeGeneric},
1400
1635
  {0x001800003f00000a, &upb_ppv4_1bt},
1401
1636
  })
1402
1637
  };
1403
1638
 
1404
- static const upb_MiniTable *messages_layout[32] = {
1405
- &google__protobuf__FileDescriptorSet_msg_init,
1406
- &google__protobuf__FileDescriptorProto_msg_init,
1407
- &google__protobuf__DescriptorProto_msg_init,
1408
- &google__protobuf__DescriptorProto__ExtensionRange_msg_init,
1409
- &google__protobuf__DescriptorProto__ReservedRange_msg_init,
1410
- &google__protobuf__ExtensionRangeOptions_msg_init,
1411
- &google__protobuf__ExtensionRangeOptions__Declaration_msg_init,
1412
- &google__protobuf__FieldDescriptorProto_msg_init,
1413
- &google__protobuf__OneofDescriptorProto_msg_init,
1414
- &google__protobuf__EnumDescriptorProto_msg_init,
1415
- &google__protobuf__EnumDescriptorProto__EnumReservedRange_msg_init,
1416
- &google__protobuf__EnumValueDescriptorProto_msg_init,
1417
- &google__protobuf__ServiceDescriptorProto_msg_init,
1418
- &google__protobuf__MethodDescriptorProto_msg_init,
1419
- &google__protobuf__FileOptions_msg_init,
1420
- &google__protobuf__MessageOptions_msg_init,
1421
- &google__protobuf__FieldOptions_msg_init,
1422
- &google__protobuf__FieldOptions__EditionDefault_msg_init,
1423
- &google__protobuf__OneofOptions_msg_init,
1424
- &google__protobuf__EnumOptions_msg_init,
1425
- &google__protobuf__EnumValueOptions_msg_init,
1426
- &google__protobuf__ServiceOptions_msg_init,
1427
- &google__protobuf__MethodOptions_msg_init,
1428
- &google__protobuf__UninterpretedOption_msg_init,
1429
- &google__protobuf__UninterpretedOption__NamePart_msg_init,
1430
- &google__protobuf__FeatureSet_msg_init,
1431
- &google__protobuf__FeatureSetDefaults_msg_init,
1432
- &google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init,
1433
- &google__protobuf__SourceCodeInfo_msg_init,
1434
- &google__protobuf__SourceCodeInfo__Location_msg_init,
1435
- &google__protobuf__GeneratedCodeInfo_msg_init,
1436
- &google__protobuf__GeneratedCodeInfo__Annotation_msg_init,
1437
- };
1438
-
1639
+ const upb_MiniTable* google__protobuf__GeneratedCodeInfo__Annotation_msg_init_ptr = &google__protobuf__GeneratedCodeInfo__Annotation_msg_init;
1439
1640
  const upb_MiniTableEnum google_protobuf_Edition_enum_init = {
1440
1641
  64,
1441
- 8,
1642
+ 9,
1442
1643
  {
1443
1644
  0x7,
1444
1645
  0x0,
1646
+ 0x384,
1445
1647
  0x3e6,
1446
1648
  0x3e7,
1447
1649
  0x3e8,
@@ -1597,6 +1799,42 @@ const upb_MiniTableEnum google_protobuf_MethodOptions_IdempotencyLevel_enum_init
1597
1799
  },
1598
1800
  };
1599
1801
 
1802
+ static const upb_MiniTable *messages_layout[33] = {
1803
+ &google__protobuf__FileDescriptorSet_msg_init,
1804
+ &google__protobuf__FileDescriptorProto_msg_init,
1805
+ &google__protobuf__DescriptorProto_msg_init,
1806
+ &google__protobuf__DescriptorProto__ExtensionRange_msg_init,
1807
+ &google__protobuf__DescriptorProto__ReservedRange_msg_init,
1808
+ &google__protobuf__ExtensionRangeOptions_msg_init,
1809
+ &google__protobuf__ExtensionRangeOptions__Declaration_msg_init,
1810
+ &google__protobuf__FieldDescriptorProto_msg_init,
1811
+ &google__protobuf__OneofDescriptorProto_msg_init,
1812
+ &google__protobuf__EnumDescriptorProto_msg_init,
1813
+ &google__protobuf__EnumDescriptorProto__EnumReservedRange_msg_init,
1814
+ &google__protobuf__EnumValueDescriptorProto_msg_init,
1815
+ &google__protobuf__ServiceDescriptorProto_msg_init,
1816
+ &google__protobuf__MethodDescriptorProto_msg_init,
1817
+ &google__protobuf__FileOptions_msg_init,
1818
+ &google__protobuf__MessageOptions_msg_init,
1819
+ &google__protobuf__FieldOptions_msg_init,
1820
+ &google__protobuf__FieldOptions__EditionDefault_msg_init,
1821
+ &google__protobuf__FieldOptions__FeatureSupport_msg_init,
1822
+ &google__protobuf__OneofOptions_msg_init,
1823
+ &google__protobuf__EnumOptions_msg_init,
1824
+ &google__protobuf__EnumValueOptions_msg_init,
1825
+ &google__protobuf__ServiceOptions_msg_init,
1826
+ &google__protobuf__MethodOptions_msg_init,
1827
+ &google__protobuf__UninterpretedOption_msg_init,
1828
+ &google__protobuf__UninterpretedOption__NamePart_msg_init,
1829
+ &google__protobuf__FeatureSet_msg_init,
1830
+ &google__protobuf__FeatureSetDefaults_msg_init,
1831
+ &google__protobuf__FeatureSetDefaults__FeatureSetEditionDefault_msg_init,
1832
+ &google__protobuf__SourceCodeInfo_msg_init,
1833
+ &google__protobuf__SourceCodeInfo__Location_msg_init,
1834
+ &google__protobuf__GeneratedCodeInfo_msg_init,
1835
+ &google__protobuf__GeneratedCodeInfo__Annotation_msg_init,
1836
+ };
1837
+
1600
1838
  static const upb_MiniTableEnum *enums_layout[17] = {
1601
1839
  &google_protobuf_Edition_enum_init,
1602
1840
  &google_protobuf_ExtensionRangeOptions_VerificationState_enum_init,
@@ -1621,7 +1859,7 @@ const upb_MiniTableFile google_protobuf_descriptor_proto_upb_file_layout = {
1621
1859
  messages_layout,
1622
1860
  enums_layout,
1623
1861
  NULL,
1624
- 32,
1862
+ 33,
1625
1863
  17,
1626
1864
  0,
1627
1865
  };
@@ -2482,6 +2720,7 @@ static upb_MessageValue jsondec_bool(jsondec* d, const upb_FieldDef* f) {
2482
2720
  /* Composite types (array/message/map) ****************************************/
2483
2721
 
2484
2722
  static void jsondec_array(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
2723
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2485
2724
  upb_Array* arr = upb_Message_Mutable(msg, f, d->arena).array;
2486
2725
 
2487
2726
  jsondec_arrstart(d);
@@ -2495,6 +2734,7 @@ static void jsondec_array(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
2495
2734
  }
2496
2735
 
2497
2736
  static void jsondec_map(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
2737
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2498
2738
  upb_Map* map = upb_Message_Mutable(msg, f, d->arena).map;
2499
2739
  const upb_MessageDef* entry = upb_FieldDef_MessageSubDef(f);
2500
2740
  const upb_FieldDef* key_f = upb_MessageDef_FindFieldByNumber(entry, 1);
@@ -2516,6 +2756,7 @@ static void jsondec_map(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
2516
2756
 
2517
2757
  static void jsondec_tomsg(jsondec* d, upb_Message* msg,
2518
2758
  const upb_MessageDef* m) {
2759
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2519
2760
  if (upb_MessageDef_WellKnownType(m) == kUpb_WellKnown_Unspecified) {
2520
2761
  jsondec_object(d, msg, m);
2521
2762
  } else {
@@ -2536,6 +2777,7 @@ static upb_MessageValue jsondec_msg(jsondec* d, const upb_FieldDef* f) {
2536
2777
 
2537
2778
  static void jsondec_field(jsondec* d, upb_Message* msg,
2538
2779
  const upb_MessageDef* m) {
2780
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2539
2781
  upb_StringView name;
2540
2782
  const upb_FieldDef* f;
2541
2783
  const upb_FieldDef* preserved;
@@ -2574,7 +2816,7 @@ static void jsondec_field(jsondec* d, upb_Message* msg,
2574
2816
  }
2575
2817
 
2576
2818
  if (upb_FieldDef_RealContainingOneof(f) &&
2577
- upb_Message_WhichOneof(msg, upb_FieldDef_ContainingOneof(f))) {
2819
+ upb_Message_WhichOneofByDef(msg, upb_FieldDef_ContainingOneof(f))) {
2578
2820
  jsondec_err(d, "More than one field for this oneof.");
2579
2821
  }
2580
2822
 
@@ -2601,6 +2843,7 @@ static void jsondec_field(jsondec* d, upb_Message* msg,
2601
2843
 
2602
2844
  static void jsondec_object(jsondec* d, upb_Message* msg,
2603
2845
  const upb_MessageDef* m) {
2846
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2604
2847
  jsondec_objstart(d);
2605
2848
  while (jsondec_objnext(d)) {
2606
2849
  jsondec_field(d, msg, m);
@@ -2701,6 +2944,7 @@ static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s) {
2701
2944
 
2702
2945
  static void jsondec_timestamp(jsondec* d, upb_Message* msg,
2703
2946
  const upb_MessageDef* m) {
2947
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2704
2948
  upb_MessageValue seconds;
2705
2949
  upb_MessageValue nanos;
2706
2950
  upb_StringView str = jsondec_string(d);
@@ -2766,6 +3010,7 @@ malformed:
2766
3010
 
2767
3011
  static void jsondec_duration(jsondec* d, upb_Message* msg,
2768
3012
  const upb_MessageDef* m) {
3013
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2769
3014
  upb_MessageValue seconds;
2770
3015
  upb_MessageValue nanos;
2771
3016
  upb_StringView str = jsondec_string(d);
@@ -2798,6 +3043,7 @@ static void jsondec_duration(jsondec* d, upb_Message* msg,
2798
3043
 
2799
3044
  static void jsondec_listvalue(jsondec* d, upb_Message* msg,
2800
3045
  const upb_MessageDef* m) {
3046
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2801
3047
  const upb_FieldDef* values_f = upb_MessageDef_FindFieldByNumber(m, 1);
2802
3048
  const upb_MessageDef* value_m = upb_FieldDef_MessageSubDef(values_f);
2803
3049
  const upb_MiniTable* value_layout = upb_MessageDef_MiniTable(value_m);
@@ -2816,6 +3062,7 @@ static void jsondec_listvalue(jsondec* d, upb_Message* msg,
2816
3062
 
2817
3063
  static void jsondec_struct(jsondec* d, upb_Message* msg,
2818
3064
  const upb_MessageDef* m) {
3065
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2819
3066
  const upb_FieldDef* fields_f = upb_MessageDef_FindFieldByNumber(m, 1);
2820
3067
  const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(fields_f);
2821
3068
  const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(entry_m, 2);
@@ -2838,6 +3085,7 @@ static void jsondec_struct(jsondec* d, upb_Message* msg,
2838
3085
 
2839
3086
  static void jsondec_wellknownvalue(jsondec* d, upb_Message* msg,
2840
3087
  const upb_MessageDef* m) {
3088
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2841
3089
  upb_MessageValue val;
2842
3090
  const upb_FieldDef* f;
2843
3091
  upb_Message* submsg;
@@ -2926,6 +3174,7 @@ static upb_StringView jsondec_mask(jsondec* d, const char* buf,
2926
3174
 
2927
3175
  static void jsondec_fieldmask(jsondec* d, upb_Message* msg,
2928
3176
  const upb_MessageDef* m) {
3177
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2929
3178
  /* repeated string paths = 1; */
2930
3179
  const upb_FieldDef* paths_f = upb_MessageDef_FindFieldByNumber(m, 1);
2931
3180
  upb_Array* arr = upb_Message_Mutable(msg, paths_f, d->arena).array;
@@ -2949,6 +3198,7 @@ static void jsondec_fieldmask(jsondec* d, upb_Message* msg,
2949
3198
 
2950
3199
  static void jsondec_anyfield(jsondec* d, upb_Message* msg,
2951
3200
  const upb_MessageDef* m) {
3201
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2952
3202
  if (upb_MessageDef_WellKnownType(m) == kUpb_WellKnown_Unspecified) {
2953
3203
  /* For regular types: {"@type": "[user type]", "f1": <V1>, "f2": <V2>}
2954
3204
  * where f1, f2, etc. are the normal fields of this type. */
@@ -2967,6 +3217,7 @@ static void jsondec_anyfield(jsondec* d, upb_Message* msg,
2967
3217
 
2968
3218
  static const upb_MessageDef* jsondec_typeurl(jsondec* d, upb_Message* msg,
2969
3219
  const upb_MessageDef* m) {
3220
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2970
3221
  const upb_FieldDef* type_url_f = upb_MessageDef_FindFieldByNumber(m, 1);
2971
3222
  const upb_MessageDef* type_m;
2972
3223
  upb_StringView type_url = jsondec_string(d);
@@ -2996,6 +3247,7 @@ static const upb_MessageDef* jsondec_typeurl(jsondec* d, upb_Message* msg,
2996
3247
  }
2997
3248
 
2998
3249
  static void jsondec_any(jsondec* d, upb_Message* msg, const upb_MessageDef* m) {
3250
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
2999
3251
  /* string type_url = 1;
3000
3252
  * bytes value = 2; */
3001
3253
  const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 2);
@@ -3064,6 +3316,7 @@ static void jsondec_any(jsondec* d, upb_Message* msg, const upb_MessageDef* m) {
3064
3316
 
3065
3317
  static void jsondec_wrapper(jsondec* d, upb_Message* msg,
3066
3318
  const upb_MessageDef* m) {
3319
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
3067
3320
  const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 1);
3068
3321
  upb_JsonMessageValue val = jsondec_value(d, value_f);
3069
3322
  UPB_ASSUME(val.ignore == false); // Wrapper cannot be an enum.
@@ -3072,6 +3325,7 @@ static void jsondec_wrapper(jsondec* d, upb_Message* msg,
3072
3325
 
3073
3326
  static void jsondec_wellknown(jsondec* d, upb_Message* msg,
3074
3327
  const upb_MessageDef* m) {
3328
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
3075
3329
  switch (upb_MessageDef_WellKnownType(m)) {
3076
3330
  case kUpb_WellKnown_Any:
3077
3331
  jsondec_any(d, msg, m);
@@ -3112,6 +3366,7 @@ static void jsondec_wellknown(jsondec* d, upb_Message* msg,
3112
3366
 
3113
3367
  static bool upb_JsonDecoder_Decode(jsondec* const d, upb_Message* const msg,
3114
3368
  const upb_MessageDef* const m) {
3369
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
3115
3370
  if (UPB_SETJMP(d->err)) return false;
3116
3371
 
3117
3372
  jsondec_tomsg(d, msg, m);
@@ -3131,6 +3386,7 @@ static bool upb_JsonDecoder_Decode(jsondec* const d, upb_Message* const msg,
3131
3386
  bool upb_JsonDecode(const char* buf, size_t size, upb_Message* msg,
3132
3387
  const upb_MessageDef* m, const upb_DefPool* symtab,
3133
3388
  int options, upb_Arena* arena, upb_Status* status) {
3389
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
3134
3390
  jsondec d;
3135
3391
 
3136
3392
  if (size == 0) return true;
@@ -3185,7 +3441,7 @@ static void jsonenc_value(jsonenc* e, const upb_Message* msg,
3185
3441
 
3186
3442
  UPB_NORETURN static void jsonenc_err(jsonenc* e, const char* msg) {
3187
3443
  upb_Status_SetErrorMessage(e->status, msg);
3188
- longjmp(e->err, 1);
3444
+ UPB_LONGJMP(e->err, 1);
3189
3445
  }
3190
3446
 
3191
3447
  UPB_PRINTF(2, 3)
@@ -3194,7 +3450,7 @@ UPB_NORETURN static void jsonenc_errf(jsonenc* e, const char* fmt, ...) {
3194
3450
  va_start(argp, fmt);
3195
3451
  upb_Status_VSetErrorFormat(e->status, fmt, argp);
3196
3452
  va_end(argp);
3197
- longjmp(e->err, 1);
3453
+ UPB_LONGJMP(e->err, 1);
3198
3454
  }
3199
3455
 
3200
3456
  static upb_Arena* jsonenc_arena(jsonenc* e) {
@@ -3941,12 +4197,20 @@ static void* upb_global_allocfunc(upb_alloc* alloc, void* ptr, size_t oldsize,
3941
4197
  upb_alloc upb_alloc_global = {&upb_global_allocfunc};
3942
4198
 
3943
4199
 
4200
+ #ifdef UPB_TRACING_ENABLED
4201
+ #include <stdatomic.h>
4202
+ #endif
4203
+
3944
4204
  #include <stddef.h>
3945
4205
  #include <stdint.h>
3946
4206
 
3947
4207
 
3948
4208
  // Must be last.
3949
4209
 
4210
+ static UPB_ATOMIC(size_t) max_block_size = 32 << 10;
4211
+
4212
+ void upb_Arena_SetMaxBlockSize(size_t max) { max_block_size = max; }
4213
+
3950
4214
  typedef struct upb_MemBlock {
3951
4215
  // Atomic only for the benefit of SpaceAllocated().
3952
4216
  UPB_ATOMIC(struct upb_MemBlock*) next;
@@ -4047,6 +4311,38 @@ static bool _upb_ArenaInternal_HasInitialBlock(upb_ArenaInternal* ai) {
4047
4311
  return ai->block_alloc & 0x1;
4048
4312
  }
4049
4313
 
4314
+ #ifdef UPB_TRACING_ENABLED
4315
+ static void (*_init_arena_trace_handler)(const upb_Arena*, size_t size) = NULL;
4316
+ static void (*_fuse_arena_trace_handler)(const upb_Arena*,
4317
+ const upb_Arena*) = NULL;
4318
+ static void (*_free_arena_trace_handler)(const upb_Arena*) = NULL;
4319
+
4320
+ void upb_Arena_SetTraceHandler(
4321
+ void (*initArenaTraceHandler)(const upb_Arena*, size_t size),
4322
+ void (*fuseArenaTraceHandler)(const upb_Arena*, const upb_Arena*),
4323
+ void (*freeArenaTraceHandler)(const upb_Arena*)) {
4324
+ _init_arena_trace_handler = initArenaTraceHandler;
4325
+ _fuse_arena_trace_handler = fuseArenaTraceHandler;
4326
+ _free_arena_trace_handler = freeArenaTraceHandler;
4327
+ }
4328
+
4329
+ void upb_Arena_LogInit(const upb_Arena* arena, size_t size) {
4330
+ if (_init_arena_trace_handler) {
4331
+ _init_arena_trace_handler(arena, size);
4332
+ }
4333
+ }
4334
+ void upb_Arena_LogFuse(const upb_Arena* arena1, const upb_Arena* arena2) {
4335
+ if (_fuse_arena_trace_handler) {
4336
+ _fuse_arena_trace_handler(arena1, arena2);
4337
+ }
4338
+ }
4339
+ void upb_Arena_LogFree(const upb_Arena* arena) {
4340
+ if (_free_arena_trace_handler) {
4341
+ _free_arena_trace_handler(arena);
4342
+ }
4343
+ }
4344
+ #endif // UPB_TRACING_ENABLED
4345
+
4050
4346
  static upb_ArenaRoot _upb_Arena_FindRoot(upb_Arena* a) {
4051
4347
  upb_ArenaInternal* ai = upb_Arena_Internal(a);
4052
4348
  uintptr_t poc = upb_Atomic_Load(&ai->parent_or_count, memory_order_acquire);
@@ -4104,6 +4400,21 @@ size_t upb_Arena_SpaceAllocated(upb_Arena* arena, size_t* fused_count) {
4104
4400
  return memsize;
4105
4401
  }
4106
4402
 
4403
+ bool UPB_PRIVATE(_upb_Arena_Contains)(const upb_Arena* a, void* ptr) {
4404
+ upb_ArenaInternal* ai = upb_Arena_Internal(a);
4405
+ UPB_ASSERT(ai);
4406
+
4407
+ upb_MemBlock* block = upb_Atomic_Load(&ai->blocks, memory_order_relaxed);
4408
+ while (block) {
4409
+ uintptr_t beg = (uintptr_t)block;
4410
+ uintptr_t end = beg + block->size;
4411
+ if ((uintptr_t)ptr >= beg && (uintptr_t)ptr < end) return true;
4412
+ block = upb_Atomic_Load(&block->next, memory_order_relaxed);
4413
+ }
4414
+
4415
+ return false;
4416
+ }
4417
+
4107
4418
  uint32_t upb_Arena_DebugRefCount(upb_Arena* a) {
4108
4419
  upb_ArenaInternal* ai = upb_Arena_Internal(a);
4109
4420
  // These loads could probably be relaxed, but given that this is debug-only,
@@ -4137,7 +4448,14 @@ static bool _upb_Arena_AllocBlock(upb_Arena* a, size_t size) {
4137
4448
  if (!ai->block_alloc) return false;
4138
4449
  upb_MemBlock* last_block = upb_Atomic_Load(&ai->blocks, memory_order_acquire);
4139
4450
  size_t last_size = last_block != NULL ? last_block->size : 128;
4140
- size_t block_size = UPB_MAX(size, last_size * 2) + kUpb_MemblockReserve;
4451
+
4452
+ // Don't naturally grow beyond the max block size.
4453
+ size_t clamped_size = UPB_MIN(last_size * 2, max_block_size);
4454
+
4455
+ // We may need to exceed the max block size if the user requested a large
4456
+ // allocation.
4457
+ size_t block_size = UPB_MAX(size, clamped_size) + kUpb_MemblockReserve;
4458
+
4141
4459
  upb_MemBlock* block =
4142
4460
  upb_malloc(_upb_ArenaInternal_BlockAlloc(ai), block_size);
4143
4461
 
@@ -4195,7 +4513,13 @@ upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc) {
4195
4513
  n = UPB_ALIGN_DOWN(n, UPB_ALIGN_OF(upb_ArenaState));
4196
4514
 
4197
4515
  if (UPB_UNLIKELY(n < sizeof(upb_ArenaState))) {
4516
+ #ifdef UPB_TRACING_ENABLED
4517
+ upb_Arena* ret = _upb_Arena_InitSlow(alloc);
4518
+ upb_Arena_LogInit(ret, n);
4519
+ return ret;
4520
+ #else
4198
4521
  return _upb_Arena_InitSlow(alloc);
4522
+ #endif
4199
4523
  }
4200
4524
 
4201
4525
  a = UPB_PTR_AT(mem, n - sizeof(upb_ArenaState), upb_ArenaState);
@@ -4208,13 +4532,14 @@ upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc) {
4208
4532
  a->body.block_alloc = _upb_Arena_MakeBlockAlloc(alloc, 1);
4209
4533
  a->head.UPB_PRIVATE(ptr) = mem;
4210
4534
  a->head.UPB_PRIVATE(end) = UPB_PTR_AT(mem, n - sizeof(upb_ArenaState), char);
4211
-
4535
+ #ifdef UPB_TRACING_ENABLED
4536
+ upb_Arena_LogInit(&a->head, n);
4537
+ #endif
4212
4538
  return &a->head;
4213
4539
  }
4214
4540
 
4215
4541
  static void _upb_Arena_DoFree(upb_ArenaInternal* ai) {
4216
4542
  UPB_ASSERT(_upb_Arena_RefCountFromTagged(ai->parent_or_count) == 1);
4217
-
4218
4543
  while (ai != NULL) {
4219
4544
  // Load first since arena itself is likely from one of its blocks.
4220
4545
  upb_ArenaInternal* next_arena =
@@ -4245,6 +4570,9 @@ retry:
4245
4570
  // expensive then direct loads. As an optimization, we only do RMW ops
4246
4571
  // when we need to update things for other threads to see.
4247
4572
  if (poc == _upb_Arena_TaggedFromRefcount(1)) {
4573
+ #ifdef UPB_TRACING_ENABLED
4574
+ upb_Arena_LogFree(a);
4575
+ #endif
4248
4576
  _upb_Arena_DoFree(ai);
4249
4577
  return;
4250
4578
  }
@@ -4364,6 +4692,10 @@ static bool _upb_Arena_FixupRefs(upb_ArenaInternal* new_root,
4364
4692
  bool upb_Arena_Fuse(upb_Arena* a1, upb_Arena* a2) {
4365
4693
  if (a1 == a2) return true; // trivial fuse
4366
4694
 
4695
+ #ifdef UPB_TRACING_ENABLED
4696
+ upb_Arena_LogFuse(a1, a2);
4697
+ #endif
4698
+
4367
4699
  upb_ArenaInternal* ai1 = upb_Arena_Internal(a1);
4368
4700
  upb_ArenaInternal* ai2 = upb_Arena_Internal(a2);
4369
4701
 
@@ -4430,18 +4762,17 @@ void UPB_PRIVATE(_upb_Arena_SwapOut)(upb_Arena* des, const upb_Arena* src) {
4430
4762
 
4431
4763
  // Must be last.
4432
4764
 
4433
- bool upb_Message_SetMapEntry(upb_Map* map, const upb_MiniTable* mini_table,
4765
+ bool upb_Message_SetMapEntry(upb_Map* map, const upb_MiniTable* m,
4434
4766
  const upb_MiniTableField* f,
4435
4767
  upb_Message* map_entry_message, upb_Arena* arena) {
4436
- // TODO: use a variant of upb_MiniTable_GetSubMessageTable() here.
4437
- const upb_MiniTable* map_entry_mini_table = upb_MiniTableSub_Message(
4438
- mini_table->UPB_PRIVATE(subs)[f->UPB_PRIVATE(submsg_index)]);
4768
+ UPB_ASSERT(!upb_Message_IsFrozen(map_entry_message));
4769
+ const upb_MiniTable* map_entry_mini_table =
4770
+ upb_MiniTable_MapEntrySubMessage(m, f);
4439
4771
  UPB_ASSERT(map_entry_mini_table);
4440
- UPB_ASSERT(map_entry_mini_table->UPB_PRIVATE(field_count) == 2);
4441
4772
  const upb_MiniTableField* map_entry_key_field =
4442
- &map_entry_mini_table->UPB_PRIVATE(fields)[0];
4773
+ upb_MiniTable_MapKey(map_entry_mini_table);
4443
4774
  const upb_MiniTableField* map_entry_value_field =
4444
- &map_entry_mini_table->UPB_PRIVATE(fields)[1];
4775
+ upb_MiniTable_MapValue(map_entry_mini_table);
4445
4776
  // Map key/value cannot have explicit defaults,
4446
4777
  // hence assuming a zero default is valid.
4447
4778
  upb_MessageValue default_val;
@@ -4466,31 +4797,33 @@ upb_Array* upb_Array_New(upb_Arena* a, upb_CType type) {
4466
4797
  }
4467
4798
 
4468
4799
  upb_MessageValue upb_Array_Get(const upb_Array* arr, size_t i) {
4800
+ UPB_ASSERT(i < upb_Array_Size(arr));
4469
4801
  upb_MessageValue ret;
4470
4802
  const char* data = upb_Array_DataPtr(arr);
4471
4803
  const int lg2 = UPB_PRIVATE(_upb_Array_ElemSizeLg2)(arr);
4472
- UPB_ASSERT(i < arr->UPB_PRIVATE(size));
4473
4804
  memcpy(&ret, data + (i << lg2), 1 << lg2);
4474
4805
  return ret;
4475
4806
  }
4476
4807
 
4477
4808
  upb_MutableMessageValue upb_Array_GetMutable(upb_Array* arr, size_t i) {
4809
+ UPB_ASSERT(i < upb_Array_Size(arr));
4478
4810
  upb_MutableMessageValue ret;
4479
4811
  char* data = upb_Array_MutableDataPtr(arr);
4480
4812
  const int lg2 = UPB_PRIVATE(_upb_Array_ElemSizeLg2)(arr);
4481
- UPB_ASSERT(i < arr->UPB_PRIVATE(size));
4482
4813
  memcpy(&ret, data + (i << lg2), 1 << lg2);
4483
4814
  return ret;
4484
4815
  }
4485
4816
 
4486
4817
  void upb_Array_Set(upb_Array* arr, size_t i, upb_MessageValue val) {
4818
+ UPB_ASSERT(!upb_Array_IsFrozen(arr));
4819
+ UPB_ASSERT(i < upb_Array_Size(arr));
4487
4820
  char* data = upb_Array_MutableDataPtr(arr);
4488
4821
  const int lg2 = UPB_PRIVATE(_upb_Array_ElemSizeLg2)(arr);
4489
- UPB_ASSERT(i < arr->UPB_PRIVATE(size));
4490
4822
  memcpy(data + (i << lg2), &val, 1 << lg2);
4491
4823
  }
4492
4824
 
4493
4825
  bool upb_Array_Append(upb_Array* arr, upb_MessageValue val, upb_Arena* arena) {
4826
+ UPB_ASSERT(!upb_Array_IsFrozen(arr));
4494
4827
  UPB_ASSERT(arena);
4495
4828
  if (!UPB_PRIVATE(_upb_Array_ResizeUninitialized)(
4496
4829
  arr, arr->UPB_PRIVATE(size) + 1, arena)) {
@@ -4502,6 +4835,7 @@ bool upb_Array_Append(upb_Array* arr, upb_MessageValue val, upb_Arena* arena) {
4502
4835
 
4503
4836
  void upb_Array_Move(upb_Array* arr, size_t dst_idx, size_t src_idx,
4504
4837
  size_t count) {
4838
+ UPB_ASSERT(!upb_Array_IsFrozen(arr));
4505
4839
  const int lg2 = UPB_PRIVATE(_upb_Array_ElemSizeLg2)(arr);
4506
4840
  char* data = upb_Array_MutableDataPtr(arr);
4507
4841
  memmove(&data[dst_idx << lg2], &data[src_idx << lg2], count << lg2);
@@ -4509,6 +4843,7 @@ void upb_Array_Move(upb_Array* arr, size_t dst_idx, size_t src_idx,
4509
4843
 
4510
4844
  bool upb_Array_Insert(upb_Array* arr, size_t i, size_t count,
4511
4845
  upb_Arena* arena) {
4846
+ UPB_ASSERT(!upb_Array_IsFrozen(arr));
4512
4847
  UPB_ASSERT(arena);
4513
4848
  UPB_ASSERT(i <= arr->UPB_PRIVATE(size));
4514
4849
  UPB_ASSERT(count + arr->UPB_PRIVATE(size) >= count);
@@ -4526,6 +4861,7 @@ bool upb_Array_Insert(upb_Array* arr, size_t i, size_t count,
4526
4861
  * |------------|XXXXXXXX|--------|
4527
4862
  */
4528
4863
  void upb_Array_Delete(upb_Array* arr, size_t i, size_t count) {
4864
+ UPB_ASSERT(!upb_Array_IsFrozen(arr));
4529
4865
  const size_t end = i + count;
4530
4866
  UPB_ASSERT(i <= end);
4531
4867
  UPB_ASSERT(end <= arr->UPB_PRIVATE(size));
@@ -4534,6 +4870,7 @@ void upb_Array_Delete(upb_Array* arr, size_t i, size_t count) {
4534
4870
  }
4535
4871
 
4536
4872
  bool upb_Array_Resize(upb_Array* arr, size_t size, upb_Arena* arena) {
4873
+ UPB_ASSERT(!upb_Array_IsFrozen(arr));
4537
4874
  const size_t oldsize = arr->UPB_PRIVATE(size);
4538
4875
  if (UPB_UNLIKELY(
4539
4876
  !UPB_PRIVATE(_upb_Array_ResizeUninitialized)(arr, size, arena))) {
@@ -4567,6 +4904,20 @@ bool UPB_PRIVATE(_upb_Array_Realloc)(upb_Array* array, size_t min_capacity,
4567
4904
  return true;
4568
4905
  }
4569
4906
 
4907
+ void upb_Array_Freeze(upb_Array* arr, const upb_MiniTable* m) {
4908
+ if (upb_Array_IsFrozen(arr)) return;
4909
+ UPB_PRIVATE(_upb_Array_ShallowFreeze)(arr);
4910
+
4911
+ if (m) {
4912
+ const size_t size = upb_Array_Size(arr);
4913
+
4914
+ for (size_t i = 0; i < size; i++) {
4915
+ upb_MessageValue val = upb_Array_Get(arr, i);
4916
+ upb_Message_Freeze((upb_Message*)val.msg_val, m);
4917
+ }
4918
+ }
4919
+ }
4920
+
4570
4921
 
4571
4922
  #include <stddef.h>
4572
4923
  #include <stdint.h>
@@ -4583,19 +4934,20 @@ const upb_MiniTableExtension* upb_Message_ExtensionByIndex(
4583
4934
  return ext[index].ext;
4584
4935
  }
4585
4936
 
4586
- const upb_Extension* upb_Message_FindExtensionByNumber(const upb_Message* msg,
4587
- uint32_t field_number) {
4937
+ const upb_MiniTableExtension* upb_Message_FindExtensionByNumber(
4938
+ const upb_Message* msg, uint32_t field_number) {
4588
4939
  size_t count;
4589
4940
  const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
4590
4941
 
4591
- while (count--) {
4592
- if (upb_MiniTableExtension_Number(ext->ext) == field_number) return ext;
4593
- ext++;
4942
+ for (; count--; ext++) {
4943
+ const upb_MiniTableExtension* e = ext->ext;
4944
+ if (upb_MiniTableExtension_Number(e) == field_number) return e;
4594
4945
  }
4595
4946
  return NULL;
4596
4947
  }
4597
4948
 
4598
4949
 
4950
+ #include <stdint.h>
4599
4951
  #include <string.h>
4600
4952
 
4601
4953
 
@@ -4694,6 +5046,20 @@ upb_MessageValue upb_MapIterator_Value(const upb_Map* map, size_t iter) {
4694
5046
  return ret;
4695
5047
  }
4696
5048
 
5049
+ void upb_Map_Freeze(upb_Map* map, const upb_MiniTable* m) {
5050
+ if (upb_Map_IsFrozen(map)) return;
5051
+ UPB_PRIVATE(_upb_Map_ShallowFreeze)(map);
5052
+
5053
+ if (m) {
5054
+ size_t iter = kUpb_Map_Begin;
5055
+ upb_MessageValue key, val;
5056
+
5057
+ while (upb_Map_Next(map, &key, &val, &iter)) {
5058
+ upb_Message_Freeze((upb_Message*)val.msg_val, m);
5059
+ }
5060
+ }
5061
+ }
5062
+
4697
5063
  // EVERYTHING BELOW THIS LINE IS INTERNAL - DO NOT USE /////////////////////////
4698
5064
 
4699
5065
  upb_Map* _upb_Map_New(upb_Arena* a, size_t key_size, size_t value_size) {
@@ -4703,6 +5069,7 @@ upb_Map* _upb_Map_New(upb_Arena* a, size_t key_size, size_t value_size) {
4703
5069
  upb_strtable_init(&map->table, 4, a);
4704
5070
  map->key_size = key_size;
4705
5071
  map->val_size = value_size;
5072
+ map->UPB_PRIVATE(is_frozen) = false;
4706
5073
 
4707
5074
  return map;
4708
5075
  }
@@ -4866,22 +5233,24 @@ upb_Message* upb_Message_New(const upb_MiniTable* m, upb_Arena* a) {
4866
5233
 
4867
5234
  bool UPB_PRIVATE(_upb_Message_AddUnknown)(upb_Message* msg, const char* data,
4868
5235
  size_t len, upb_Arena* arena) {
5236
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
4869
5237
  if (!UPB_PRIVATE(_upb_Message_Realloc)(msg, len, arena)) return false;
4870
- upb_Message_Internal* in = msg->internal;
5238
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
4871
5239
  memcpy(UPB_PTR_AT(in, in->unknown_end, char), data, len);
4872
5240
  in->unknown_end += len;
4873
5241
  return true;
4874
5242
  }
4875
5243
 
4876
5244
  void _upb_Message_DiscardUnknown_shallow(upb_Message* msg) {
4877
- upb_Message_Internal* in = msg->internal;
5245
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
5246
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
4878
5247
  if (in) {
4879
5248
  in->unknown_end = message_overhead;
4880
5249
  }
4881
5250
  }
4882
5251
 
4883
5252
  const char* upb_Message_GetUnknown(const upb_Message* msg, size_t* len) {
4884
- upb_Message_Internal* in = msg->internal;
5253
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
4885
5254
  if (in) {
4886
5255
  *len = in->unknown_end - message_overhead;
4887
5256
  return (char*)(in + 1);
@@ -4892,7 +5261,8 @@ const char* upb_Message_GetUnknown(const upb_Message* msg, size_t* len) {
4892
5261
  }
4893
5262
 
4894
5263
  void upb_Message_DeleteUnknown(upb_Message* msg, const char* data, size_t len) {
4895
- upb_Message_Internal* in = msg->internal;
5264
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
5265
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
4896
5266
  const char* internal_unknown_end = UPB_PTR_AT(in, in->unknown_end, char);
4897
5267
 
4898
5268
  #ifndef NDEBUG
@@ -4916,35 +5286,242 @@ size_t upb_Message_ExtensionCount(const upb_Message* msg) {
4916
5286
  return count;
4917
5287
  }
4918
5288
 
5289
+ void upb_Message_Freeze(upb_Message* msg, const upb_MiniTable* m) {
5290
+ if (upb_Message_IsFrozen(msg)) return;
5291
+ UPB_PRIVATE(_upb_Message_ShallowFreeze)(msg);
5292
+
5293
+ // Base Fields.
5294
+ const size_t field_count = upb_MiniTable_FieldCount(m);
5295
+
5296
+ for (size_t i = 0; i < field_count; i++) {
5297
+ const upb_MiniTableField* f = upb_MiniTable_GetFieldByIndex(m, i);
5298
+ const upb_MiniTable* m2 = upb_MiniTable_SubMessage(m, f);
5299
+
5300
+ switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(f)) {
5301
+ case kUpb_FieldMode_Array: {
5302
+ upb_Array* arr = upb_Message_GetMutableArray(msg, f);
5303
+ if (arr) upb_Array_Freeze(arr, m2);
5304
+ break;
5305
+ }
5306
+ case kUpb_FieldMode_Map: {
5307
+ upb_Map* map = upb_Message_GetMutableMap(msg, f);
5308
+ if (map) {
5309
+ const upb_MiniTableField* f2 = upb_MiniTable_MapValue(m2);
5310
+ const upb_MiniTable* m3 = upb_MiniTable_SubMessage(m2, f2);
5311
+ upb_Map_Freeze(map, m3);
5312
+ }
5313
+ break;
5314
+ }
5315
+ case kUpb_FieldMode_Scalar: {
5316
+ if (m2) {
5317
+ upb_Message* msg2 = upb_Message_GetMutableMessage(msg, f);
5318
+ if (msg2) upb_Message_Freeze(msg2, m2);
5319
+ }
5320
+ break;
5321
+ }
5322
+ }
5323
+ }
5324
+
5325
+ // Extensions.
5326
+ size_t ext_count;
5327
+ const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &ext_count);
5328
+
5329
+ for (size_t i = 0; i < ext_count; i++) {
5330
+ const upb_MiniTableExtension* e = ext[i].ext;
5331
+ const upb_MiniTableField* f = &e->UPB_PRIVATE(field);
5332
+ const upb_MiniTable* m2 = upb_MiniTableExtension_GetSubMessage(e);
5333
+
5334
+ upb_MessageValue val;
5335
+ memcpy(&val, &ext[i].data, sizeof(upb_MessageValue));
5336
+
5337
+ switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(f)) {
5338
+ case kUpb_FieldMode_Array: {
5339
+ upb_Array* arr = (upb_Array*)val.array_val;
5340
+ if (arr) upb_Array_Freeze(arr, m2);
5341
+ break;
5342
+ }
5343
+ case kUpb_FieldMode_Map:
5344
+ UPB_UNREACHABLE(); // Maps cannot be extensions.
5345
+ break;
5346
+ case kUpb_FieldMode_Scalar:
5347
+ if (upb_MiniTableField_IsSubMessage(f)) {
5348
+ upb_Message* msg2 = (upb_Message*)val.msg_val;
5349
+ if (msg2) upb_Message_Freeze(msg2, m2);
5350
+ }
5351
+ break;
5352
+ }
5353
+ }
5354
+ }
4919
5355
 
4920
- #include <string.h>
5356
+
5357
+ #include <stddef.h>
4921
5358
 
4922
5359
 
4923
5360
  // Must be last.
4924
5361
 
4925
- bool upb_Message_IsExactlyEqual(const upb_Message* msg1,
4926
- const upb_Message* msg2,
4927
- const upb_MiniTable* m) {
4928
- if (msg1 == msg2) return true;
4929
5362
 
4930
- int opts = kUpb_EncodeOption_SkipUnknown | kUpb_EncodeOption_Deterministic;
4931
- upb_Arena* a = upb_Arena_New();
5363
+ #ifdef __cplusplus
5364
+ extern "C" {
5365
+ #endif
5366
+
5367
+ bool upb_Message_IsEmpty(const upb_Message* msg, const upb_MiniTable* m) {
5368
+ if (upb_Message_ExtensionCount(msg)) return false;
5369
+
5370
+ const upb_MiniTableField* f;
5371
+ upb_MessageValue v;
5372
+ size_t iter = kUpb_BaseField_Begin;
5373
+ return !UPB_PRIVATE(_upb_Message_NextBaseField)(msg, m, &f, &v, &iter);
5374
+ }
5375
+
5376
+ static bool _upb_Array_IsEqual(const upb_Array* arr1, const upb_Array* arr2,
5377
+ upb_CType ctype, const upb_MiniTable* m,
5378
+ int options) {
5379
+ // Check for trivial equality.
5380
+ if (arr1 == arr2) return true;
4932
5381
 
4933
- // Compare deterministically serialized payloads with no unknown fields.
4934
- size_t size1, size2;
4935
- char *data1, *data2;
4936
- upb_EncodeStatus status1 = upb_Encode(msg1, m, opts, a, &data1, &size1);
4937
- upb_EncodeStatus status2 = upb_Encode(msg2, m, opts, a, &data2, &size2);
5382
+ // Must have identical element counts.
5383
+ const size_t size1 = arr1 ? upb_Array_Size(arr1) : 0;
5384
+ const size_t size2 = arr2 ? upb_Array_Size(arr2) : 0;
5385
+ if (size1 != size2) return false;
4938
5386
 
4939
- if (status1 != kUpb_EncodeStatus_Ok || status2 != kUpb_EncodeStatus_Ok) {
4940
- // TODO: How should we fail here? (In Ruby we throw an exception.)
4941
- upb_Arena_Free(a);
5387
+ for (size_t i = 0; i < size1; i++) {
5388
+ const upb_MessageValue val1 = upb_Array_Get(arr1, i);
5389
+ const upb_MessageValue val2 = upb_Array_Get(arr2, i);
5390
+
5391
+ if (!upb_MessageValue_IsEqual(val1, val2, ctype, m, options)) return false;
5392
+ }
5393
+
5394
+ return true;
5395
+ }
5396
+
5397
+ static bool _upb_Map_IsEqual(const upb_Map* map1, const upb_Map* map2,
5398
+ const upb_MiniTable* m, int options) {
5399
+ // Check for trivial equality.
5400
+ if (map1 == map2) return true;
5401
+
5402
+ // Must have identical element counts.
5403
+ size_t size1 = map1 ? upb_Map_Size(map1) : 0;
5404
+ size_t size2 = map2 ? upb_Map_Size(map2) : 0;
5405
+ if (size1 != size2) return false;
5406
+
5407
+ const upb_MiniTableField* f = upb_MiniTable_MapValue(m);
5408
+ const upb_MiniTable* m2_value = upb_MiniTable_SubMessage(m, f);
5409
+ const upb_CType ctype = upb_MiniTableField_CType(f);
5410
+
5411
+ upb_MessageValue key, val1, val2;
5412
+ size_t iter = kUpb_Map_Begin;
5413
+ while (upb_Map_Next(map1, &key, &val1, &iter)) {
5414
+ if (!upb_Map_Get(map2, key, &val2)) return false;
5415
+ if (!upb_MessageValue_IsEqual(val1, val2, ctype, m2_value, options))
5416
+ return false;
5417
+ }
5418
+
5419
+ return true;
5420
+ }
5421
+
5422
+ static bool _upb_Message_BaseFieldsAreEqual(const upb_Message* msg1,
5423
+ const upb_Message* msg2,
5424
+ const upb_MiniTable* m,
5425
+ int options) {
5426
+ // Iterate over all base fields for each message.
5427
+ // The order will always match if the messages are equal.
5428
+ size_t iter1 = kUpb_BaseField_Begin;
5429
+ size_t iter2 = kUpb_BaseField_Begin;
5430
+
5431
+ for (;;) {
5432
+ const upb_MiniTableField *f1, *f2;
5433
+ upb_MessageValue val1, val2;
5434
+
5435
+ const bool got1 =
5436
+ UPB_PRIVATE(_upb_Message_NextBaseField)(msg1, m, &f1, &val1, &iter1);
5437
+ const bool got2 =
5438
+ UPB_PRIVATE(_upb_Message_NextBaseField)(msg2, m, &f2, &val2, &iter2);
5439
+
5440
+ if (got1 != got2) return false; // Must have identical field counts.
5441
+ if (!got1) return true; // Loop termination condition.
5442
+ if (f1 != f2) return false; // Must have identical fields set.
5443
+
5444
+ const upb_MiniTable* subm = upb_MiniTable_SubMessage(m, f1);
5445
+ const upb_CType ctype = upb_MiniTableField_CType(f1);
5446
+
5447
+ bool eq;
5448
+ switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(f1)) {
5449
+ case kUpb_FieldMode_Array:
5450
+ eq = _upb_Array_IsEqual(val1.array_val, val2.array_val, ctype, subm,
5451
+ options);
5452
+ break;
5453
+ case kUpb_FieldMode_Map:
5454
+ eq = _upb_Map_IsEqual(val1.map_val, val2.map_val, subm, options);
5455
+ break;
5456
+ case kUpb_FieldMode_Scalar:
5457
+ eq = upb_MessageValue_IsEqual(val1, val2, ctype, subm, options);
5458
+ break;
5459
+ }
5460
+ if (!eq) return false;
5461
+ }
5462
+ }
5463
+
5464
+ static bool _upb_Message_ExtensionsAreEqual(const upb_Message* msg1,
5465
+ const upb_Message* msg2,
5466
+ const upb_MiniTable* m,
5467
+ int options) {
5468
+ // Must have identical extension counts.
5469
+ if (upb_Message_ExtensionCount(msg1) != upb_Message_ExtensionCount(msg2)) {
4942
5470
  return false;
4943
5471
  }
4944
5472
 
4945
- const bool ret = (size1 == size2) && (memcmp(data1, data2, size1) == 0);
4946
- upb_Arena_Free(a);
4947
- return ret;
5473
+ const upb_MiniTableExtension* e;
5474
+ upb_MessageValue val1;
5475
+
5476
+ // Iterate over all extensions for msg1, and search msg2 for each extension.
5477
+ size_t iter1 = kUpb_Extension_Begin;
5478
+ while (UPB_PRIVATE(_upb_Message_NextExtension)(msg1, m, &e, &val1, &iter1)) {
5479
+ const upb_Extension* ext2 = UPB_PRIVATE(_upb_Message_Getext)(msg2, e);
5480
+ if (!ext2) return false;
5481
+
5482
+ const upb_MessageValue val2 = ext2->data;
5483
+ const upb_MiniTableField* f = &e->UPB_PRIVATE(field);
5484
+ const upb_MiniTable* subm = upb_MiniTableField_IsSubMessage(f)
5485
+ ? upb_MiniTableExtension_GetSubMessage(e)
5486
+ : NULL;
5487
+ const upb_CType ctype = upb_MiniTableField_CType(f);
5488
+
5489
+ bool eq;
5490
+ switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(f)) {
5491
+ case kUpb_FieldMode_Array:
5492
+ eq = _upb_Array_IsEqual(val1.array_val, val2.array_val, ctype, subm,
5493
+ options);
5494
+ break;
5495
+ case kUpb_FieldMode_Map:
5496
+ UPB_UNREACHABLE(); // Maps cannot be extensions.
5497
+ break;
5498
+ case kUpb_FieldMode_Scalar: {
5499
+ eq = upb_MessageValue_IsEqual(val1, val2, ctype, subm, options);
5500
+ break;
5501
+ }
5502
+ }
5503
+ if (!eq) return false;
5504
+ }
5505
+ return true;
5506
+ }
5507
+
5508
+ bool upb_Message_IsEqual(const upb_Message* msg1, const upb_Message* msg2,
5509
+ const upb_MiniTable* m, int options) {
5510
+ if (UPB_UNLIKELY(msg1 == msg2)) return true;
5511
+
5512
+ if (!_upb_Message_BaseFieldsAreEqual(msg1, msg2, m, options)) return false;
5513
+ if (!_upb_Message_ExtensionsAreEqual(msg1, msg2, m, options)) return false;
5514
+
5515
+ if (!(options & kUpb_CompareOption_IncludeUnknownFields)) return true;
5516
+
5517
+ // Check the unknown fields.
5518
+ size_t usize1, usize2;
5519
+ const char* uf1 = upb_Message_GetUnknown(msg1, &usize1);
5520
+ const char* uf2 = upb_Message_GetUnknown(msg2, &usize2);
5521
+
5522
+ // The wire encoder enforces a maximum depth of 100 so we match that here.
5523
+ return UPB_PRIVATE(_upb_Message_UnknownFieldsAreEqual)(
5524
+ uf1, usize1, uf2, usize2, 100) == kUpb_UnknownCompareResult_Equal;
4948
5525
  }
4949
5526
 
4950
5527
 
@@ -5018,7 +5595,7 @@ upb_Map* upb_Map_DeepClone(const upb_Map* map, upb_CType key_type,
5018
5595
  size_t iter = kUpb_Map_Begin;
5019
5596
  while (upb_Map_Next(map, &key, &val, &iter)) {
5020
5597
  const upb_MiniTableField* value_field =
5021
- &map_entry_table->UPB_PRIVATE(fields)[1];
5598
+ upb_MiniTable_MapValue(map_entry_table);
5022
5599
  const upb_MiniTable* value_sub =
5023
5600
  upb_MiniTableField_CType(value_field) == kUpb_CType_Message
5024
5601
  ? upb_MiniTable_GetSubMessageTable(map_entry_table, value_field)
@@ -5039,15 +5616,14 @@ static upb_Map* upb_Message_Map_DeepClone(const upb_Map* map,
5039
5616
  const upb_MiniTableField* f,
5040
5617
  upb_Message* clone,
5041
5618
  upb_Arena* arena) {
5042
- // TODO: use a variant of upb_MiniTable_GetSubMessageTable() here.
5043
- const upb_MiniTable* map_entry_table = upb_MiniTableSub_Message(
5044
- mini_table->UPB_PRIVATE(subs)[f->UPB_PRIVATE(submsg_index)]);
5619
+ UPB_ASSERT(!upb_Message_IsFrozen(clone));
5620
+ const upb_MiniTable* map_entry_table =
5621
+ upb_MiniTable_MapEntrySubMessage(mini_table, f);
5045
5622
  UPB_ASSERT(map_entry_table);
5046
5623
 
5047
- const upb_MiniTableField* key_field =
5048
- &map_entry_table->UPB_PRIVATE(fields)[0];
5624
+ const upb_MiniTableField* key_field = upb_MiniTable_MapKey(map_entry_table);
5049
5625
  const upb_MiniTableField* value_field =
5050
- &map_entry_table->UPB_PRIVATE(fields)[1];
5626
+ upb_MiniTable_MapValue(map_entry_table);
5051
5627
 
5052
5628
  upb_Map* cloned_map = upb_Map_DeepClone(
5053
5629
  map, upb_MiniTableField_CType(key_field),
@@ -5055,13 +5631,13 @@ static upb_Map* upb_Message_Map_DeepClone(const upb_Map* map,
5055
5631
  if (!cloned_map) {
5056
5632
  return NULL;
5057
5633
  }
5058
- _upb_Message_SetNonExtensionField(clone, f, &cloned_map);
5634
+ upb_Message_SetBaseField(clone, f, &cloned_map);
5059
5635
  return cloned_map;
5060
5636
  }
5061
5637
 
5062
5638
  upb_Array* upb_Array_DeepClone(const upb_Array* array, upb_CType value_type,
5063
5639
  const upb_MiniTable* sub, upb_Arena* arena) {
5064
- const size_t size = array->UPB_PRIVATE(size);
5640
+ const size_t size = upb_Array_Size(array);
5065
5641
  const int lg2 = UPB_PRIVATE(_upb_CType_SizeLg2)(value_type);
5066
5642
  upb_Array* cloned_array = UPB_PRIVATE(_upb_Array_New)(arena, size, lg2);
5067
5643
  if (!cloned_array) {
@@ -5084,6 +5660,7 @@ static bool upb_Message_Array_DeepClone(const upb_Array* array,
5084
5660
  const upb_MiniTable* mini_table,
5085
5661
  const upb_MiniTableField* field,
5086
5662
  upb_Message* clone, upb_Arena* arena) {
5663
+ UPB_ASSERT(!upb_Message_IsFrozen(clone));
5087
5664
  UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(field);
5088
5665
  upb_Array* cloned_array = upb_Array_DeepClone(
5089
5666
  array, upb_MiniTableField_CType(field),
@@ -5093,7 +5670,7 @@ static bool upb_Message_Array_DeepClone(const upb_Array* array,
5093
5670
  arena);
5094
5671
 
5095
5672
  // Clear out upb_Array* due to parent memcpy.
5096
- _upb_Message_SetNonExtensionField(clone, field, &cloned_array);
5673
+ upb_Message_SetBaseField(clone, field, &cloned_array);
5097
5674
  return true;
5098
5675
  }
5099
5676
 
@@ -5102,19 +5679,20 @@ static bool upb_Clone_ExtensionValue(
5102
5679
  upb_Extension* dest, upb_Arena* arena) {
5103
5680
  dest->data = source->data;
5104
5681
  return upb_Clone_MessageValue(
5105
- &dest->data,
5106
- upb_MiniTableField_CType(&mini_table_ext->UPB_PRIVATE(field)),
5682
+ &dest->data, upb_MiniTableExtension_CType(mini_table_ext),
5107
5683
  upb_MiniTableExtension_GetSubMessage(mini_table_ext), arena);
5108
5684
  }
5109
5685
 
5110
5686
  upb_Message* _upb_Message_Copy(upb_Message* dst, const upb_Message* src,
5111
5687
  const upb_MiniTable* mini_table,
5112
5688
  upb_Arena* arena) {
5689
+ UPB_ASSERT(!upb_Message_IsFrozen(dst));
5113
5690
  upb_StringView empty_string = upb_StringView_FromDataAndSize(NULL, 0);
5114
5691
  // Only copy message area skipping upb_Message_Internal.
5115
5692
  memcpy(dst + 1, src + 1, mini_table->UPB_PRIVATE(size) - sizeof(upb_Message));
5116
- for (size_t i = 0; i < mini_table->UPB_PRIVATE(field_count); ++i) {
5117
- const upb_MiniTableField* field = &mini_table->UPB_PRIVATE(fields)[i];
5693
+ for (int i = 0; i < upb_MiniTable_FieldCount(mini_table); ++i) {
5694
+ const upb_MiniTableField* field =
5695
+ upb_MiniTable_GetFieldByIndex(mini_table, i);
5118
5696
  if (upb_MiniTableField_IsScalar(field)) {
5119
5697
  switch (upb_MiniTableField_CType(field)) {
5120
5698
  case kUpb_CType_Message: {
@@ -5135,10 +5713,10 @@ upb_Message* _upb_Message_Copy(upb_Message* dst, const upb_Message* src,
5135
5713
  if (dst_sub_message == NULL) {
5136
5714
  return NULL;
5137
5715
  }
5138
- _upb_Message_SetTaggedMessagePtr(
5139
- dst, mini_table, field,
5140
- UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(dst_sub_message,
5141
- is_empty));
5716
+ UPB_PRIVATE(_upb_Message_SetTaggedMessagePtr)
5717
+ (dst, field,
5718
+ UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(dst_sub_message,
5719
+ is_empty));
5142
5720
  }
5143
5721
  } break;
5144
5722
  case kUpb_CType_String:
@@ -5188,7 +5766,7 @@ upb_Message* _upb_Message_Copy(upb_Message* dst, const upb_Message* src,
5188
5766
  return NULL;
5189
5767
  }
5190
5768
  } else {
5191
- upb_Array* msg_array = (upb_Array*)msg_ext->data.ptr;
5769
+ upb_Array* msg_array = (upb_Array*)msg_ext->data.array_val;
5192
5770
  UPB_ASSERT(msg_array);
5193
5771
  upb_Array* cloned_array = upb_Array_DeepClone(
5194
5772
  msg_array, upb_MiniTableField_CType(field),
@@ -5196,7 +5774,7 @@ upb_Message* _upb_Message_Copy(upb_Message* dst, const upb_Message* src,
5196
5774
  if (!cloned_array) {
5197
5775
  return NULL;
5198
5776
  }
5199
- dst_ext->data.ptr = (void*)cloned_array;
5777
+ dst_ext->data.array_val = cloned_array;
5200
5778
  }
5201
5779
  }
5202
5780
 
@@ -5215,6 +5793,7 @@ upb_Message* _upb_Message_Copy(upb_Message* dst, const upb_Message* src,
5215
5793
 
5216
5794
  bool upb_Message_DeepCopy(upb_Message* dst, const upb_Message* src,
5217
5795
  const upb_MiniTable* mini_table, upb_Arena* arena) {
5796
+ UPB_ASSERT(!upb_Message_IsFrozen(dst));
5218
5797
  upb_Message_Clear(dst, mini_table);
5219
5798
  return _upb_Message_Copy(dst, src, mini_table, arena) != NULL;
5220
5799
  }
@@ -5231,6 +5810,7 @@ upb_Message* upb_Message_DeepClone(const upb_Message* msg,
5231
5810
  // Performs a shallow copy. TODO: Extend to handle unknown fields.
5232
5811
  void upb_Message_ShallowCopy(upb_Message* dst, const upb_Message* src,
5233
5812
  const upb_MiniTable* m) {
5813
+ UPB_ASSERT(!upb_Message_IsFrozen(dst));
5234
5814
  memcpy(dst, src, m->UPB_PRIVATE(size));
5235
5815
  }
5236
5816
 
@@ -5243,6 +5823,36 @@ upb_Message* upb_Message_ShallowClone(const upb_Message* msg,
5243
5823
  return clone;
5244
5824
  }
5245
5825
 
5826
+ #include "stddef.h"
5827
+
5828
+ // Must be last.
5829
+
5830
+ bool upb_Message_MergeFrom(upb_Message* dst, const upb_Message* src,
5831
+ const upb_MiniTable* mt,
5832
+ const upb_ExtensionRegistry* extreg,
5833
+ upb_Arena* arena) {
5834
+ char* buf = NULL;
5835
+ size_t size = 0;
5836
+ // This tmp arena is used to hold the bytes for `src` serialized. This bends
5837
+ // the typical "no hidden allocations" design of upb, but under a properly
5838
+ // optimized implementation this extra allocation would not be necessary and
5839
+ // so we don't want to unnecessarily have the bad API or bloat the passed-in
5840
+ // arena with this very-short-term allocation.
5841
+ upb_Arena* encode_arena = upb_Arena_New();
5842
+ upb_EncodeStatus e_status = upb_Encode(src, mt, 0, encode_arena, &buf, &size);
5843
+ if (e_status != kUpb_EncodeStatus_Ok) {
5844
+ upb_Arena_Free(encode_arena);
5845
+ return false;
5846
+ }
5847
+ upb_DecodeStatus d_status = upb_Decode(buf, size, dst, mt, extreg, 0, arena);
5848
+ if (d_status != kUpb_DecodeStatus_Ok) {
5849
+ upb_Arena_Free(encode_arena);
5850
+ return false;
5851
+ }
5852
+ upb_Arena_Free(encode_arena);
5853
+ return true;
5854
+ }
5855
+
5246
5856
 
5247
5857
  #include <stddef.h>
5248
5858
  #include <stdint.h>
@@ -5348,9 +5958,9 @@ static upb_MiniTableEnum* upb_MtDecoder_BuildMiniTableEnum(
5348
5958
  return upb_MtDecoder_DoBuildMiniTableEnum(decoder, data, len);
5349
5959
  }
5350
5960
 
5351
- upb_MiniTableEnum* upb_MiniDescriptor_BuildEnum(const char* data, size_t len,
5352
- upb_Arena* arena,
5353
- upb_Status* status) {
5961
+ upb_MiniTableEnum* upb_MiniTableEnum_Build(const char* data, size_t len,
5962
+ upb_Arena* arena,
5963
+ upb_Status* status) {
5354
5964
  upb_MdEnumDecoder decoder = {
5355
5965
  .base =
5356
5966
  {
@@ -5391,7 +6001,7 @@ typedef enum {
5391
6001
  kUpb_LayoutItemType_Max = kUpb_LayoutItemType_Field,
5392
6002
  } upb_LayoutItemType;
5393
6003
 
5394
- #define kUpb_LayoutItem_IndexSentinel ((uint16_t)-1)
6004
+ #define kUpb_LayoutItem_IndexSentinel ((uint16_t) - 1)
5395
6005
 
5396
6006
  typedef struct {
5397
6007
  // Index of the corresponding field. When this is a oneof field, the field's
@@ -5588,6 +6198,12 @@ static void upb_MtDecoder_ModifyField(upb_MtDecoder* d,
5588
6198
  upb_MiniTableField_Number(field));
5589
6199
  }
5590
6200
 
6201
+ if (singular && upb_MiniTableField_IsSubMessage(field)) {
6202
+ upb_MdDecoder_ErrorJmp(&d->base,
6203
+ "Field %" PRIu32 " cannot be a singular submessage",
6204
+ upb_MiniTableField_Number(field));
6205
+ }
6206
+
5591
6207
  if (singular) field->UPB_PRIVATE(offset) = kNoPresence;
5592
6208
  if (required) {
5593
6209
  field->UPB_PRIVATE(offset) = kRequiredPresence;
@@ -5744,11 +6360,15 @@ static void upb_MtDecoder_AllocateSubs(upb_MtDecoder* d,
5744
6360
  upb_SubCounts sub_counts) {
5745
6361
  uint32_t total_count = sub_counts.submsg_count + sub_counts.subenum_count;
5746
6362
  size_t subs_bytes = sizeof(*d->table->UPB_PRIVATE(subs)) * total_count;
5747
- upb_MiniTableSub* subs = upb_Arena_Malloc(d->arena, subs_bytes);
6363
+ size_t ptrs_bytes = sizeof(upb_MiniTable*) * sub_counts.submsg_count;
6364
+ upb_MiniTableSubInternal* subs = upb_Arena_Malloc(d->arena, subs_bytes);
6365
+ const upb_MiniTable** subs_ptrs = upb_Arena_Malloc(d->arena, ptrs_bytes);
5748
6366
  upb_MdDecoder_CheckOutOfMemory(&d->base, subs);
6367
+ upb_MdDecoder_CheckOutOfMemory(&d->base, subs_ptrs);
5749
6368
  uint32_t i = 0;
5750
6369
  for (; i < sub_counts.submsg_count; i++) {
5751
- subs[i].UPB_PRIVATE(submsg) = UPB_PRIVATE(_upb_MiniTable_Empty)();
6370
+ subs_ptrs[i] = UPB_PRIVATE(_upb_MiniTable_Empty)();
6371
+ subs[i].UPB_PRIVATE(submsg) = &subs_ptrs[i];
5752
6372
  }
5753
6373
  if (sub_counts.subenum_count) {
5754
6374
  upb_MiniTableField* f = d->fields;
@@ -6074,6 +6694,11 @@ static upb_MiniTable* upb_MtDecoder_DoBuildMiniTableWithBuf(
6074
6694
  decoder->table->UPB_PRIVATE(dense_below) = 0;
6075
6695
  decoder->table->UPB_PRIVATE(table_mask) = -1;
6076
6696
  decoder->table->UPB_PRIVATE(required_count) = 0;
6697
+ #if UPB_TRACING_ENABLED
6698
+ // MiniTables built from MiniDescriptors will not be able to vend the message
6699
+ // name unless it is explicitly set with upb_MiniTable_SetFullName().
6700
+ decoder->table->UPB_PRIVATE(full_name) = 0;
6701
+ #endif
6077
6702
 
6078
6703
  // Strip off and verify the version tag.
6079
6704
  if (!len--) goto done;
@@ -6235,6 +6860,7 @@ upb_MiniTable* _upb_MiniTable_Build(const char* data, size_t len,
6235
6860
 
6236
6861
  #include <stddef.h>
6237
6862
  #include <stdint.h>
6863
+ #include <string.h>
6238
6864
 
6239
6865
 
6240
6866
  // Must be last.
@@ -6270,12 +6896,12 @@ bool upb_MiniTable_SetSubMessage(upb_MiniTable* table,
6270
6896
  return false;
6271
6897
  }
6272
6898
 
6273
- upb_MiniTableSub* table_sub =
6274
- (void*)&table->UPB_PRIVATE(subs)[field->UPB_PRIVATE(submsg_index)];
6899
+ int idx = field->UPB_PRIVATE(submsg_index);
6900
+ upb_MiniTableSubInternal* table_subs = (void*)table->UPB_PRIVATE(subs);
6275
6901
  // TODO: Add this assert back once YouTube is updated to not call
6276
6902
  // this function repeatedly.
6277
6903
  // UPB_ASSERT(UPB_PRIVATE(_upb_MiniTable_IsEmpty)(table_sub->submsg));
6278
- *table_sub = upb_MiniTableSub_FromMessage(sub);
6904
+ memcpy((void*)table_subs[idx].UPB_PRIVATE(submsg), &sub, sizeof(void*));
6279
6905
  return true;
6280
6906
  }
6281
6907
 
@@ -6292,13 +6918,13 @@ bool upb_MiniTable_SetSubEnum(upb_MiniTable* table, upb_MiniTableField* field,
6292
6918
  return true;
6293
6919
  }
6294
6920
 
6295
- uint32_t upb_MiniTable_GetSubList(const upb_MiniTable* mt,
6921
+ uint32_t upb_MiniTable_GetSubList(const upb_MiniTable* m,
6296
6922
  const upb_MiniTableField** subs) {
6297
6923
  uint32_t msg_count = 0;
6298
6924
  uint32_t enum_count = 0;
6299
6925
 
6300
- for (int i = 0; i < mt->UPB_PRIVATE(field_count); i++) {
6301
- const upb_MiniTableField* f = &mt->UPB_PRIVATE(fields)[i];
6926
+ for (int i = 0; i < upb_MiniTable_FieldCount(m); i++) {
6927
+ const upb_MiniTableField* f = upb_MiniTable_GetFieldByIndex(m, i);
6302
6928
  if (upb_MiniTableField_CType(f) == kUpb_CType_Message) {
6303
6929
  *subs = f;
6304
6930
  ++subs;
@@ -6306,9 +6932,9 @@ uint32_t upb_MiniTable_GetSubList(const upb_MiniTable* mt,
6306
6932
  }
6307
6933
  }
6308
6934
 
6309
- for (int i = 0; i < mt->UPB_PRIVATE(field_count); i++) {
6310
- const upb_MiniTableField* f = &mt->UPB_PRIVATE(fields)[i];
6311
- if (upb_MiniTableField_CType(f) == kUpb_CType_Enum) {
6935
+ for (int i = 0; i < upb_MiniTable_FieldCount(m); i++) {
6936
+ const upb_MiniTableField* f = upb_MiniTable_GetFieldByIndex(m, i);
6937
+ if (upb_MiniTableField_IsClosedEnum(f)) {
6312
6938
  *subs = f;
6313
6939
  ++subs;
6314
6940
  enum_count++;
@@ -6321,36 +6947,34 @@ uint32_t upb_MiniTable_GetSubList(const upb_MiniTable* mt,
6321
6947
  // The list of sub_tables and sub_enums must exactly match the number and order
6322
6948
  // of sub-message fields and sub-enum fields given by upb_MiniTable_GetSubList()
6323
6949
  // above.
6324
- bool upb_MiniTable_Link(upb_MiniTable* mt, const upb_MiniTable** sub_tables,
6950
+ bool upb_MiniTable_Link(upb_MiniTable* m, const upb_MiniTable** sub_tables,
6325
6951
  size_t sub_table_count,
6326
6952
  const upb_MiniTableEnum** sub_enums,
6327
6953
  size_t sub_enum_count) {
6328
6954
  uint32_t msg_count = 0;
6329
6955
  uint32_t enum_count = 0;
6330
6956
 
6331
- for (int i = 0; i < mt->UPB_PRIVATE(field_count); i++) {
6332
- upb_MiniTableField* f = (upb_MiniTableField*)&mt->UPB_PRIVATE(fields)[i];
6957
+ for (int i = 0; i < upb_MiniTable_FieldCount(m); i++) {
6958
+ upb_MiniTableField* f =
6959
+ (upb_MiniTableField*)upb_MiniTable_GetFieldByIndex(m, i);
6333
6960
  if (upb_MiniTableField_CType(f) == kUpb_CType_Message) {
6334
6961
  const upb_MiniTable* sub = sub_tables[msg_count++];
6335
6962
  if (msg_count > sub_table_count) return false;
6336
- if (sub != NULL) {
6337
- if (!upb_MiniTable_SetSubMessage(mt, f, sub)) return false;
6338
- }
6963
+ if (sub && !upb_MiniTable_SetSubMessage(m, f, sub)) return false;
6339
6964
  }
6340
6965
  }
6341
6966
 
6342
- for (int i = 0; i < mt->UPB_PRIVATE(field_count); i++) {
6343
- upb_MiniTableField* f = (upb_MiniTableField*)&mt->UPB_PRIVATE(fields)[i];
6967
+ for (int i = 0; i < upb_MiniTable_FieldCount(m); i++) {
6968
+ upb_MiniTableField* f =
6969
+ (upb_MiniTableField*)upb_MiniTable_GetFieldByIndex(m, i);
6344
6970
  if (upb_MiniTableField_IsClosedEnum(f)) {
6345
6971
  const upb_MiniTableEnum* sub = sub_enums[enum_count++];
6346
6972
  if (enum_count > sub_enum_count) return false;
6347
- if (sub != NULL) {
6348
- if (!upb_MiniTable_SetSubEnum(mt, f, sub)) return false;
6349
- }
6973
+ if (sub && !upb_MiniTable_SetSubEnum(m, f, sub)) return false;
6350
6974
  }
6351
6975
  }
6352
6976
 
6353
- return true;
6977
+ return (msg_count == sub_table_count) && (enum_count == sub_enum_count);
6354
6978
  }
6355
6979
 
6356
6980
 
@@ -6412,6 +7036,24 @@ failure:
6412
7036
  return false;
6413
7037
  }
6414
7038
 
7039
+ #ifdef UPB_LINKARR_DECLARE
7040
+
7041
+ UPB_LINKARR_DECLARE(upb_AllExts, upb_MiniTableExtension);
7042
+
7043
+ bool upb_ExtensionRegistry_AddAllLinkedExtensions(upb_ExtensionRegistry* r) {
7044
+ const upb_MiniTableExtension* start = UPB_LINKARR_START(upb_AllExts);
7045
+ const upb_MiniTableExtension* stop = UPB_LINKARR_STOP(upb_AllExts);
7046
+ for (const upb_MiniTableExtension* p = start; p < stop; p++) {
7047
+ // Windows can introduce zero padding, so we have to skip zeroes.
7048
+ if (upb_MiniTableExtension_Number(p) != 0) {
7049
+ if (!upb_ExtensionRegistry_Add(r, p)) return false;
7050
+ }
7051
+ }
7052
+ return true;
7053
+ }
7054
+
7055
+ #endif // UPB_LINKARR_DECLARE
7056
+
6415
7057
  const upb_MiniTableExtension* upb_ExtensionRegistry_Lookup(
6416
7058
  const upb_ExtensionRegistry* r, const upb_MiniTable* t, uint32_t num) {
6417
7059
  char buf[EXTREG_KEY_SIZE];
@@ -6650,15 +7292,15 @@ typedef union {
6650
7292
  // Returns the MiniTable corresponding to a given MiniTableField
6651
7293
  // from an array of MiniTableSubs.
6652
7294
  static const upb_MiniTable* _upb_MiniTableSubs_MessageByField(
6653
- const upb_MiniTableSub* subs, const upb_MiniTableField* field) {
6654
- return upb_MiniTableSub_Message(subs[field->UPB_PRIVATE(submsg_index)]);
7295
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) {
7296
+ return *subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(submsg);
6655
7297
  }
6656
7298
 
6657
7299
  // Returns the MiniTableEnum corresponding to a given MiniTableField
6658
7300
  // from an array of MiniTableSub.
6659
7301
  static const upb_MiniTableEnum* _upb_MiniTableSubs_EnumByField(
6660
- const upb_MiniTableSub* subs, const upb_MiniTableField* field) {
6661
- return upb_MiniTableSub_Enum(subs[field->UPB_PRIVATE(submsg_index)]);
7302
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) {
7303
+ return subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(subenum);
6662
7304
  }
6663
7305
 
6664
7306
  static const char* _upb_Decoder_DecodeMessage(upb_Decoder* d, const char* ptr,
@@ -6705,8 +7347,7 @@ static _upb_DecodeLongVarintReturn _upb_Decoder_DecodeLongVarint(
6705
7347
  const char* ptr, uint64_t val) {
6706
7348
  _upb_DecodeLongVarintReturn ret = {NULL, 0};
6707
7349
  uint64_t byte;
6708
- int i;
6709
- for (i = 1; i < 10; i++) {
7350
+ for (int i = 1; i < 10; i++) {
6710
7351
  byte = (uint8_t)ptr[i];
6711
7352
  val += (byte - 1) << (i * 7);
6712
7353
  if (!(byte & 0x80)) {
@@ -6719,8 +7360,8 @@ static _upb_DecodeLongVarintReturn _upb_Decoder_DecodeLongVarint(
6719
7360
  }
6720
7361
 
6721
7362
  UPB_FORCEINLINE
6722
- static const char* _upb_Decoder_DecodeVarint(upb_Decoder* d, const char* ptr,
6723
- uint64_t* val) {
7363
+ const char* _upb_Decoder_DecodeVarint(upb_Decoder* d, const char* ptr,
7364
+ uint64_t* val) {
6724
7365
  uint64_t byte = (uint8_t)*ptr;
6725
7366
  if (UPB_LIKELY((byte & 0x80) == 0)) {
6726
7367
  *val = byte;
@@ -6734,8 +7375,8 @@ static const char* _upb_Decoder_DecodeVarint(upb_Decoder* d, const char* ptr,
6734
7375
  }
6735
7376
 
6736
7377
  UPB_FORCEINLINE
6737
- static const char* _upb_Decoder_DecodeTag(upb_Decoder* d, const char* ptr,
6738
- uint32_t* val) {
7378
+ const char* _upb_Decoder_DecodeTag(upb_Decoder* d, const char* ptr,
7379
+ uint32_t* val) {
6739
7380
  uint64_t byte = (uint8_t)*ptr;
6740
7381
  if (UPB_LIKELY((byte & 0x80) == 0)) {
6741
7382
  *val = byte;
@@ -6752,8 +7393,8 @@ static const char* _upb_Decoder_DecodeTag(upb_Decoder* d, const char* ptr,
6752
7393
  }
6753
7394
 
6754
7395
  UPB_FORCEINLINE
6755
- static const char* upb_Decoder_DecodeSize(upb_Decoder* d, const char* ptr,
6756
- uint32_t* size) {
7396
+ const char* upb_Decoder_DecodeSize(upb_Decoder* d, const char* ptr,
7397
+ uint32_t* size) {
6757
7398
  uint64_t size64;
6758
7399
  ptr = _upb_Decoder_DecodeVarint(d, ptr, &size64);
6759
7400
  if (size64 >= INT32_MAX ||
@@ -6794,11 +7435,10 @@ static void _upb_Decoder_Munge(int type, wireval* val) {
6794
7435
  }
6795
7436
  }
6796
7437
 
6797
- static upb_Message* _upb_Decoder_NewSubMessage(upb_Decoder* d,
6798
- const upb_MiniTableSub* subs,
6799
- const upb_MiniTableField* field,
6800
- upb_TaggedMessagePtr* target) {
6801
- const upb_MiniTable* subl = _upb_MiniTableSubs_MessageByField(subs, field);
7438
+ static upb_Message* _upb_Decoder_NewSubMessage2(upb_Decoder* d,
7439
+ const upb_MiniTable* subl,
7440
+ const upb_MiniTableField* field,
7441
+ upb_TaggedMessagePtr* target) {
6802
7442
  UPB_ASSERT(subl);
6803
7443
  upb_Message* msg = _upb_Message_New(subl, &d->arena);
6804
7444
  if (!msg) _upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_OutOfMemory);
@@ -6819,8 +7459,15 @@ static upb_Message* _upb_Decoder_NewSubMessage(upb_Decoder* d,
6819
7459
  return msg;
6820
7460
  }
6821
7461
 
7462
+ static upb_Message* _upb_Decoder_NewSubMessage(
7463
+ upb_Decoder* d, const upb_MiniTableSubInternal* subs,
7464
+ const upb_MiniTableField* field, upb_TaggedMessagePtr* target) {
7465
+ const upb_MiniTable* subl = _upb_MiniTableSubs_MessageByField(subs, field);
7466
+ return _upb_Decoder_NewSubMessage2(d, subl, field, target);
7467
+ }
7468
+
6822
7469
  static upb_Message* _upb_Decoder_ReuseSubMessage(
6823
- upb_Decoder* d, const upb_MiniTableSub* subs,
7470
+ upb_Decoder* d, const upb_MiniTableSubInternal* subs,
6824
7471
  const upb_MiniTableField* field, upb_TaggedMessagePtr* target) {
6825
7472
  upb_TaggedMessagePtr tagged = *target;
6826
7473
  const upb_MiniTable* subl = _upb_MiniTableSubs_MessageByField(subs, field);
@@ -6855,11 +7502,10 @@ static const char* _upb_Decoder_ReadString(upb_Decoder* d, const char* ptr,
6855
7502
  }
6856
7503
 
6857
7504
  UPB_FORCEINLINE
6858
- static const char* _upb_Decoder_RecurseSubMessage(upb_Decoder* d,
6859
- const char* ptr,
6860
- upb_Message* submsg,
6861
- const upb_MiniTable* subl,
6862
- uint32_t expected_end_group) {
7505
+ const char* _upb_Decoder_RecurseSubMessage(upb_Decoder* d, const char* ptr,
7506
+ upb_Message* submsg,
7507
+ const upb_MiniTable* subl,
7508
+ uint32_t expected_end_group) {
6863
7509
  if (--d->depth < 0) {
6864
7510
  _upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_MaxDepthExceeded);
6865
7511
  }
@@ -6872,9 +7518,11 @@ static const char* _upb_Decoder_RecurseSubMessage(upb_Decoder* d,
6872
7518
  }
6873
7519
 
6874
7520
  UPB_FORCEINLINE
6875
- static const char* _upb_Decoder_DecodeSubMessage(
6876
- upb_Decoder* d, const char* ptr, upb_Message* submsg,
6877
- const upb_MiniTableSub* subs, const upb_MiniTableField* field, int size) {
7521
+ const char* _upb_Decoder_DecodeSubMessage(upb_Decoder* d, const char* ptr,
7522
+ upb_Message* submsg,
7523
+ const upb_MiniTableSubInternal* subs,
7524
+ const upb_MiniTableField* field,
7525
+ int size) {
6878
7526
  int saved_delta = upb_EpsCopyInputStream_PushLimit(&d->input, ptr, size);
6879
7527
  const upb_MiniTable* subl = _upb_MiniTableSubs_MessageByField(subs, field);
6880
7528
  UPB_ASSERT(subl);
@@ -6884,10 +7532,10 @@ static const char* _upb_Decoder_DecodeSubMessage(
6884
7532
  }
6885
7533
 
6886
7534
  UPB_FORCEINLINE
6887
- static const char* _upb_Decoder_DecodeGroup(upb_Decoder* d, const char* ptr,
6888
- upb_Message* submsg,
6889
- const upb_MiniTable* subl,
6890
- uint32_t number) {
7535
+ const char* _upb_Decoder_DecodeGroup(upb_Decoder* d, const char* ptr,
7536
+ upb_Message* submsg,
7537
+ const upb_MiniTable* subl,
7538
+ uint32_t number) {
6891
7539
  if (_upb_Decoder_IsDone(d, &ptr)) {
6892
7540
  _upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_Malformed);
6893
7541
  }
@@ -6897,16 +7545,16 @@ static const char* _upb_Decoder_DecodeGroup(upb_Decoder* d, const char* ptr,
6897
7545
  }
6898
7546
 
6899
7547
  UPB_FORCEINLINE
6900
- static const char* _upb_Decoder_DecodeUnknownGroup(upb_Decoder* d,
6901
- const char* ptr,
6902
- uint32_t number) {
7548
+ const char* _upb_Decoder_DecodeUnknownGroup(upb_Decoder* d, const char* ptr,
7549
+ uint32_t number) {
6903
7550
  return _upb_Decoder_DecodeGroup(d, ptr, NULL, NULL, number);
6904
7551
  }
6905
7552
 
6906
7553
  UPB_FORCEINLINE
6907
- static const char* _upb_Decoder_DecodeKnownGroup(
6908
- upb_Decoder* d, const char* ptr, upb_Message* submsg,
6909
- const upb_MiniTableSub* subs, const upb_MiniTableField* field) {
7554
+ const char* _upb_Decoder_DecodeKnownGroup(upb_Decoder* d, const char* ptr,
7555
+ upb_Message* submsg,
7556
+ const upb_MiniTableSubInternal* subs,
7557
+ const upb_MiniTableField* field) {
6910
7558
  const upb_MiniTable* subl = _upb_MiniTableSubs_MessageByField(subs, field);
6911
7559
  UPB_ASSERT(subl);
6912
7560
  return _upb_Decoder_DecodeGroup(d, ptr, submsg, subl,
@@ -6936,10 +7584,9 @@ static void _upb_Decoder_AddUnknownVarints(upb_Decoder* d, upb_Message* msg,
6936
7584
  }
6937
7585
 
6938
7586
  UPB_FORCEINLINE
6939
- static bool _upb_Decoder_CheckEnum(upb_Decoder* d, const char* ptr,
6940
- upb_Message* msg, const upb_MiniTableEnum* e,
6941
- const upb_MiniTableField* field,
6942
- wireval* val) {
7587
+ bool _upb_Decoder_CheckEnum(upb_Decoder* d, const char* ptr, upb_Message* msg,
7588
+ const upb_MiniTableEnum* e,
7589
+ const upb_MiniTableField* field, wireval* val) {
6943
7590
  const uint32_t v = val->uint32_val;
6944
7591
 
6945
7592
  if (UPB_LIKELY(upb_MiniTableEnum_CheckValue(e, v))) return true;
@@ -6957,12 +7604,10 @@ static bool _upb_Decoder_CheckEnum(upb_Decoder* d, const char* ptr,
6957
7604
  }
6958
7605
 
6959
7606
  UPB_NOINLINE
6960
- static const char* _upb_Decoder_DecodeEnumArray(upb_Decoder* d, const char* ptr,
6961
- upb_Message* msg,
6962
- upb_Array* arr,
6963
- const upb_MiniTableSub* subs,
6964
- const upb_MiniTableField* field,
6965
- wireval* val) {
7607
+ static const char* _upb_Decoder_DecodeEnumArray(
7608
+ upb_Decoder* d, const char* ptr, upb_Message* msg, upb_Array* arr,
7609
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field,
7610
+ wireval* val) {
6966
7611
  const upb_MiniTableEnum* e = _upb_MiniTableSubs_EnumByField(subs, field);
6967
7612
  if (!_upb_Decoder_CheckEnum(d, ptr, msg, e, field, val)) return ptr;
6968
7613
  void* mem = UPB_PTR_AT(upb_Array_MutableDataPtr(arr),
@@ -6973,9 +7618,10 @@ static const char* _upb_Decoder_DecodeEnumArray(upb_Decoder* d, const char* ptr,
6973
7618
  }
6974
7619
 
6975
7620
  UPB_FORCEINLINE
6976
- static const char* _upb_Decoder_DecodeFixedPacked(
6977
- upb_Decoder* d, const char* ptr, upb_Array* arr, wireval* val,
6978
- const upb_MiniTableField* field, int lg2) {
7621
+ const char* _upb_Decoder_DecodeFixedPacked(upb_Decoder* d, const char* ptr,
7622
+ upb_Array* arr, wireval* val,
7623
+ const upb_MiniTableField* field,
7624
+ int lg2) {
6979
7625
  int mask = (1 << lg2) - 1;
6980
7626
  size_t count = val->size >> lg2;
6981
7627
  if ((val->size & mask) != 0) {
@@ -7010,9 +7656,10 @@ static const char* _upb_Decoder_DecodeFixedPacked(
7010
7656
  }
7011
7657
 
7012
7658
  UPB_FORCEINLINE
7013
- static const char* _upb_Decoder_DecodeVarintPacked(
7014
- upb_Decoder* d, const char* ptr, upb_Array* arr, wireval* val,
7015
- const upb_MiniTableField* field, int lg2) {
7659
+ const char* _upb_Decoder_DecodeVarintPacked(upb_Decoder* d, const char* ptr,
7660
+ upb_Array* arr, wireval* val,
7661
+ const upb_MiniTableField* field,
7662
+ int lg2) {
7016
7663
  int scale = 1 << lg2;
7017
7664
  int saved_limit = upb_EpsCopyInputStream_PushLimit(&d->input, ptr, val->size);
7018
7665
  char* out = UPB_PTR_AT(upb_Array_MutableDataPtr(arr),
@@ -7036,7 +7683,7 @@ static const char* _upb_Decoder_DecodeVarintPacked(
7036
7683
  UPB_NOINLINE
7037
7684
  static const char* _upb_Decoder_DecodeEnumPacked(
7038
7685
  upb_Decoder* d, const char* ptr, upb_Message* msg, upb_Array* arr,
7039
- const upb_MiniTableSub* subs, const upb_MiniTableField* field,
7686
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field,
7040
7687
  wireval* val) {
7041
7688
  const upb_MiniTableEnum* e = _upb_MiniTableSubs_EnumByField(subs, field);
7042
7689
  int saved_limit = upb_EpsCopyInputStream_PushLimit(&d->input, ptr, val->size);
@@ -7070,11 +7717,10 @@ static upb_Array* _upb_Decoder_CreateArray(upb_Decoder* d,
7070
7717
  return ret;
7071
7718
  }
7072
7719
 
7073
- static const char* _upb_Decoder_DecodeToArray(upb_Decoder* d, const char* ptr,
7074
- upb_Message* msg,
7075
- const upb_MiniTableSub* subs,
7076
- const upb_MiniTableField* field,
7077
- wireval* val, int op) {
7720
+ static const char* _upb_Decoder_DecodeToArray(
7721
+ upb_Decoder* d, const char* ptr, upb_Message* msg,
7722
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field,
7723
+ wireval* val, int op) {
7078
7724
  upb_Array** arrp = UPB_PTR_AT(msg, field->UPB_PRIVATE(offset), void);
7079
7725
  upb_Array* arr = *arrp;
7080
7726
  void* mem;
@@ -7175,11 +7821,10 @@ static upb_Map* _upb_Decoder_CreateMap(upb_Decoder* d,
7175
7821
  return ret;
7176
7822
  }
7177
7823
 
7178
- static const char* _upb_Decoder_DecodeToMap(upb_Decoder* d, const char* ptr,
7179
- upb_Message* msg,
7180
- const upb_MiniTableSub* subs,
7181
- const upb_MiniTableField* field,
7182
- wireval* val) {
7824
+ static const char* _upb_Decoder_DecodeToMap(
7825
+ upb_Decoder* d, const char* ptr, upb_Message* msg,
7826
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field,
7827
+ wireval* val) {
7183
7828
  upb_Map** map_p = UPB_PTR_AT(msg, field->UPB_PRIVATE(offset), upb_Map*);
7184
7829
  upb_Map* map = *map_p;
7185
7830
  upb_MapEntry ent;
@@ -7240,8 +7885,8 @@ static const char* _upb_Decoder_DecodeToMap(upb_Decoder* d, const char* ptr,
7240
7885
 
7241
7886
  static const char* _upb_Decoder_DecodeToSubMessage(
7242
7887
  upb_Decoder* d, const char* ptr, upb_Message* msg,
7243
- const upb_MiniTableSub* subs, const upb_MiniTableField* field, wireval* val,
7244
- int op) {
7888
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field,
7889
+ wireval* val, int op) {
7245
7890
  void* mem = UPB_PTR_AT(msg, field->UPB_PRIVATE(offset), void);
7246
7891
  int type = field->UPB_PRIVATE(descriptortype);
7247
7892
 
@@ -7255,7 +7900,7 @@ static const char* _upb_Decoder_DecodeToSubMessage(
7255
7900
  // Set presence if necessary.
7256
7901
  if (UPB_PRIVATE(_upb_MiniTableField_HasHasbit)(field)) {
7257
7902
  UPB_PRIVATE(_upb_Message_SetHasbit)(msg, field);
7258
- } else if (UPB_PRIVATE(_upb_MiniTableField_IsInOneof)(field)) {
7903
+ } else if (upb_MiniTableField_IsInOneof(field)) {
7259
7904
  // Oneof case
7260
7905
  uint32_t* oneof_case = UPB_PRIVATE(_upb_Message_OneofCasePtr)(msg, field);
7261
7906
  if (op == kUpb_DecodeOp_SubMessage &&
@@ -7318,9 +7963,8 @@ const char* _upb_Decoder_CheckRequired(upb_Decoder* d, const char* ptr,
7318
7963
  }
7319
7964
 
7320
7965
  UPB_FORCEINLINE
7321
- static bool _upb_Decoder_TryFastDispatch(upb_Decoder* d, const char** ptr,
7322
- upb_Message* msg,
7323
- const upb_MiniTable* m) {
7966
+ bool _upb_Decoder_TryFastDispatch(upb_Decoder* d, const char** ptr,
7967
+ upb_Message* msg, const upb_MiniTable* m) {
7324
7968
  #if UPB_FASTTABLE
7325
7969
  if (m && m->UPB_PRIVATE(table_mask) != (unsigned char)-1) {
7326
7970
  uint16_t tag = _upb_FastDecoder_LoadTag(*ptr);
@@ -7372,9 +8016,9 @@ static void upb_Decoder_AddKnownMessageSetItem(
7372
8016
  if (UPB_UNLIKELY(!ext)) {
7373
8017
  _upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_OutOfMemory);
7374
8018
  }
7375
- upb_Message* submsg = _upb_Decoder_NewSubMessage(
7376
- d, &ext->ext->UPB_PRIVATE(sub), &ext->ext->UPB_PRIVATE(field),
7377
- (upb_TaggedMessagePtr*)&ext->data);
8019
+ upb_Message* submsg = _upb_Decoder_NewSubMessage2(
8020
+ d, ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg),
8021
+ &ext->ext->UPB_PRIVATE(field), (upb_TaggedMessagePtr*)&ext->data);
7378
8022
  upb_DecodeStatus status = upb_Decode(
7379
8023
  data, size, submsg, upb_MiniTableExtension_GetSubMessage(item_mt),
7380
8024
  d->extreg, d->options, &d->arena);
@@ -7558,9 +8202,8 @@ static int _upb_Decoder_GetVarintOp(const upb_MiniTableField* field) {
7558
8202
  }
7559
8203
 
7560
8204
  UPB_FORCEINLINE
7561
- static void _upb_Decoder_CheckUnlinked(upb_Decoder* d, const upb_MiniTable* mt,
7562
- const upb_MiniTableField* field,
7563
- int* op) {
8205
+ void _upb_Decoder_CheckUnlinked(upb_Decoder* d, const upb_MiniTable* mt,
8206
+ const upb_MiniTableField* field, int* op) {
7564
8207
  // If sub-message is not linked, treat as unknown.
7565
8208
  if (field->UPB_PRIVATE(mode) & kUpb_LabelFlags_IsExtension) return;
7566
8209
  const upb_MiniTable* mt_sub =
@@ -7576,8 +8219,9 @@ static void _upb_Decoder_CheckUnlinked(upb_Decoder* d, const upb_MiniTable* mt,
7576
8219
  // unlinked.
7577
8220
  do {
7578
8221
  UPB_ASSERT(upb_MiniTableField_CType(oneof) == kUpb_CType_Message);
7579
- const upb_MiniTableSub* oneof_sub =
7580
- &mt->UPB_PRIVATE(subs)[oneof->UPB_PRIVATE(submsg_index)];
8222
+ const upb_MiniTable* oneof_sub =
8223
+ *mt->UPB_PRIVATE(subs)[oneof->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(
8224
+ submsg);
7581
8225
  UPB_ASSERT(!oneof_sub);
7582
8226
  } while (upb_MiniTable_NextOneofField(mt, &oneof));
7583
8227
  }
@@ -7586,9 +8230,8 @@ static void _upb_Decoder_CheckUnlinked(upb_Decoder* d, const upb_MiniTable* mt,
7586
8230
  }
7587
8231
 
7588
8232
  UPB_FORCEINLINE
7589
- static void _upb_Decoder_MaybeVerifyUtf8(upb_Decoder* d,
7590
- const upb_MiniTableField* field,
7591
- int* op) {
8233
+ void _upb_Decoder_MaybeVerifyUtf8(upb_Decoder* d,
8234
+ const upb_MiniTableField* field, int* op) {
7592
8235
  if ((field->UPB_ONLYBITS(mode) & kUpb_LabelFlags_IsAlternate) &&
7593
8236
  UPB_UNLIKELY(d->options & kUpb_DecodeOption_AlwaysValidateUtf8))
7594
8237
  *op = kUpb_DecodeOp_String;
@@ -7658,11 +8301,10 @@ static int _upb_Decoder_GetDelimitedOp(upb_Decoder* d, const upb_MiniTable* mt,
7658
8301
  }
7659
8302
 
7660
8303
  UPB_FORCEINLINE
7661
- static const char* _upb_Decoder_DecodeWireValue(upb_Decoder* d, const char* ptr,
7662
- const upb_MiniTable* mt,
7663
- const upb_MiniTableField* field,
7664
- int wire_type, wireval* val,
7665
- int* op) {
8304
+ const char* _upb_Decoder_DecodeWireValue(upb_Decoder* d, const char* ptr,
8305
+ const upb_MiniTable* mt,
8306
+ const upb_MiniTableField* field,
8307
+ int wire_type, wireval* val, int* op) {
7666
8308
  static const unsigned kFixed32OkMask = (1 << kUpb_FieldType_Float) |
7667
8309
  (1 << kUpb_FieldType_Fixed32) |
7668
8310
  (1 << kUpb_FieldType_SFixed32);
@@ -7712,12 +8354,14 @@ static const char* _upb_Decoder_DecodeWireValue(upb_Decoder* d, const char* ptr,
7712
8354
  }
7713
8355
 
7714
8356
  UPB_FORCEINLINE
7715
- static const char* _upb_Decoder_DecodeKnownField(
7716
- upb_Decoder* d, const char* ptr, upb_Message* msg,
7717
- const upb_MiniTable* layout, const upb_MiniTableField* field, int op,
7718
- wireval* val) {
7719
- const upb_MiniTableSub* subs = layout->UPB_PRIVATE(subs);
8357
+ const char* _upb_Decoder_DecodeKnownField(upb_Decoder* d, const char* ptr,
8358
+ upb_Message* msg,
8359
+ const upb_MiniTable* layout,
8360
+ const upb_MiniTableField* field,
8361
+ int op, wireval* val) {
8362
+ const upb_MiniTableSubInternal* subs = layout->UPB_PRIVATE(subs);
7720
8363
  uint8_t mode = field->UPB_PRIVATE(mode);
8364
+ upb_MiniTableSubInternal ext_sub;
7721
8365
 
7722
8366
  if (UPB_UNLIKELY(mode & kUpb_LabelFlags_IsExtension)) {
7723
8367
  const upb_MiniTableExtension* ext_layout =
@@ -7729,7 +8373,14 @@ static const char* _upb_Decoder_DecodeKnownField(
7729
8373
  }
7730
8374
  d->unknown_msg = msg;
7731
8375
  msg = (upb_Message*)&ext->data;
7732
- subs = &ext->ext->UPB_PRIVATE(sub);
8376
+ if (upb_MiniTableField_IsSubMessage(&ext->ext->UPB_PRIVATE(field))) {
8377
+ ext_sub.UPB_PRIVATE(submsg) =
8378
+ &ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg);
8379
+ } else {
8380
+ ext_sub.UPB_PRIVATE(subenum) =
8381
+ ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(subenum);
8382
+ }
8383
+ subs = &ext_sub;
7733
8384
  }
7734
8385
 
7735
8386
  switch (mode & kUpb_FieldMode_Mask) {
@@ -7921,9 +8572,10 @@ static upb_DecodeStatus upb_Decoder_Decode(upb_Decoder* const decoder,
7921
8572
  }
7922
8573
 
7923
8574
  upb_DecodeStatus upb_Decode(const char* buf, size_t size, upb_Message* msg,
7924
- const upb_MiniTable* m,
8575
+ const upb_MiniTable* mt,
7925
8576
  const upb_ExtensionRegistry* extreg, int options,
7926
8577
  upb_Arena* arena) {
8578
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
7927
8579
  upb_Decoder decoder;
7928
8580
  unsigned depth = (unsigned)options >> 16;
7929
8581
 
@@ -7945,7 +8597,63 @@ upb_DecodeStatus upb_Decode(const char* buf, size_t size, upb_Message* msg,
7945
8597
  // (particularly parent_or_count).
7946
8598
  UPB_PRIVATE(_upb_Arena_SwapIn)(&decoder.arena, arena);
7947
8599
 
7948
- return upb_Decoder_Decode(&decoder, buf, msg, m, arena);
8600
+ return upb_Decoder_Decode(&decoder, buf, msg, mt, arena);
8601
+ }
8602
+
8603
+ upb_DecodeStatus upb_DecodeLengthPrefixed(const char* buf, size_t size,
8604
+ upb_Message* msg,
8605
+ size_t* num_bytes_read,
8606
+ const upb_MiniTable* mt,
8607
+ const upb_ExtensionRegistry* extreg,
8608
+ int options, upb_Arena* arena) {
8609
+ // To avoid needing to make a Decoder just to decode the initial length,
8610
+ // hand-decode the leading varint for the message length here.
8611
+ uint64_t msg_len = 0;
8612
+ for (size_t i = 0;; ++i) {
8613
+ if (i >= size || i > 9) {
8614
+ return kUpb_DecodeStatus_Malformed;
8615
+ }
8616
+ uint64_t b = *buf;
8617
+ buf++;
8618
+ msg_len += (b & 0x7f) << (i * 7);
8619
+ if ((b & 0x80) == 0) {
8620
+ *num_bytes_read = i + 1 + msg_len;
8621
+ break;
8622
+ }
8623
+ }
8624
+
8625
+ // If the total number of bytes we would read (= the bytes from the varint
8626
+ // plus however many bytes that varint says we should read) is larger then the
8627
+ // input buffer then error as malformed.
8628
+ if (*num_bytes_read > size) {
8629
+ return kUpb_DecodeStatus_Malformed;
8630
+ }
8631
+ if (msg_len > INT32_MAX) {
8632
+ return kUpb_DecodeStatus_Malformed;
8633
+ }
8634
+
8635
+ return upb_Decode(buf, msg_len, msg, mt, extreg, options, arena);
8636
+ }
8637
+
8638
+ const char* upb_DecodeStatus_String(upb_DecodeStatus status) {
8639
+ switch (status) {
8640
+ case kUpb_DecodeStatus_Ok:
8641
+ return "Ok";
8642
+ case kUpb_DecodeStatus_Malformed:
8643
+ return "Wire format was corrupt";
8644
+ case kUpb_DecodeStatus_OutOfMemory:
8645
+ return "Arena alloc failed";
8646
+ case kUpb_DecodeStatus_BadUtf8:
8647
+ return "String field had bad UTF-8";
8648
+ case kUpb_DecodeStatus_MaxDepthExceeded:
8649
+ return "Exceeded upb_DecodeOptions_MaxDepth";
8650
+ case kUpb_DecodeStatus_MissingRequired:
8651
+ return "Missing required field";
8652
+ case kUpb_DecodeStatus_UnlinkedSubMessage:
8653
+ return "Unlinked sub-message field was present";
8654
+ default:
8655
+ return "Unknown decode status";
8656
+ }
7949
8657
  }
7950
8658
 
7951
8659
  #undef OP_FIXPCK_LG2
@@ -7962,6 +8670,13 @@ upb_DecodeStatus upb_Decode(const char* buf, size_t size, upb_Message* msg,
7962
8670
 
7963
8671
  // Must be last.
7964
8672
 
8673
+ // Returns the MiniTable corresponding to a given MiniTableField
8674
+ // from an array of MiniTableSubs.
8675
+ static const upb_MiniTable* _upb_Encoder_GetSubMiniTable(
8676
+ const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) {
8677
+ return *subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(submsg);
8678
+ }
8679
+
7965
8680
  #define UPB_PB_VARINT_MAX_LEN 10
7966
8681
 
7967
8682
  UPB_NOINLINE
@@ -8032,7 +8747,7 @@ static void encode_growbuffer(upb_encstate* e, size_t bytes) {
8032
8747
  /* Call to ensure that at least "bytes" bytes are available for writing at
8033
8748
  * e->ptr. Returns false if the bytes could not be allocated. */
8034
8749
  UPB_FORCEINLINE
8035
- static void encode_reserve(upb_encstate* e, size_t bytes) {
8750
+ void encode_reserve(upb_encstate* e, size_t bytes) {
8036
8751
  if ((size_t)(e->ptr - e->buf) < bytes) {
8037
8752
  encode_growbuffer(e, bytes);
8038
8753
  return;
@@ -8071,7 +8786,7 @@ static void encode_longvarint(upb_encstate* e, uint64_t val) {
8071
8786
  }
8072
8787
 
8073
8788
  UPB_FORCEINLINE
8074
- static void encode_varint(upb_encstate* e, uint64_t val) {
8789
+ void encode_varint(upb_encstate* e, uint64_t val) {
8075
8790
  if (val < 128 && e->ptr != e->buf) {
8076
8791
  --e->ptr;
8077
8792
  *e->ptr = val;
@@ -8101,7 +8816,7 @@ static void encode_tag(upb_encstate* e, uint32_t field_number,
8101
8816
 
8102
8817
  static void encode_fixedarray(upb_encstate* e, const upb_Array* arr,
8103
8818
  size_t elem_size, uint32_t tag) {
8104
- size_t bytes = arr->UPB_PRIVATE(size) * elem_size;
8819
+ size_t bytes = upb_Array_Size(arr) * elem_size;
8105
8820
  const char* data = upb_Array_DataPtr(arr);
8106
8821
  const char* ptr = data + bytes - elem_size;
8107
8822
 
@@ -8143,7 +8858,7 @@ static void encode_TaggedMessagePtr(upb_encstate* e,
8143
8858
  }
8144
8859
 
8145
8860
  static void encode_scalar(upb_encstate* e, const void* _field_mem,
8146
- const upb_MiniTableSub* subs,
8861
+ const upb_MiniTableSubInternal* subs,
8147
8862
  const upb_MiniTableField* f) {
8148
8863
  const char* field_mem = _field_mem;
8149
8864
  int wire_type;
@@ -8192,13 +8907,12 @@ static void encode_scalar(upb_encstate* e, const void* _field_mem,
8192
8907
  case kUpb_FieldType_Group: {
8193
8908
  size_t size;
8194
8909
  upb_TaggedMessagePtr submsg = *(upb_TaggedMessagePtr*)field_mem;
8195
- const upb_MiniTable* subm =
8196
- upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]);
8910
+ const upb_MiniTable* subm = _upb_Encoder_GetSubMiniTable(subs, f);
8197
8911
  if (submsg == 0) {
8198
8912
  return;
8199
8913
  }
8200
8914
  if (--e->depth == 0) encode_err(e, kUpb_EncodeStatus_MaxDepthExceeded);
8201
- encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_EndGroup);
8915
+ encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_EndGroup);
8202
8916
  encode_TaggedMessagePtr(e, submsg, subm, &size);
8203
8917
  wire_type = kUpb_WireType_StartGroup;
8204
8918
  e->depth++;
@@ -8207,8 +8921,7 @@ static void encode_scalar(upb_encstate* e, const void* _field_mem,
8207
8921
  case kUpb_FieldType_Message: {
8208
8922
  size_t size;
8209
8923
  upb_TaggedMessagePtr submsg = *(upb_TaggedMessagePtr*)field_mem;
8210
- const upb_MiniTable* subm =
8211
- upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]);
8924
+ const upb_MiniTable* subm = _upb_Encoder_GetSubMiniTable(subs, f);
8212
8925
  if (submsg == 0) {
8213
8926
  return;
8214
8927
  }
@@ -8224,24 +8937,24 @@ static void encode_scalar(upb_encstate* e, const void* _field_mem,
8224
8937
  }
8225
8938
  #undef CASE
8226
8939
 
8227
- encode_tag(e, f->UPB_PRIVATE(number), wire_type);
8940
+ encode_tag(e, upb_MiniTableField_Number(f), wire_type);
8228
8941
  }
8229
8942
 
8230
8943
  static void encode_array(upb_encstate* e, const upb_Message* msg,
8231
- const upb_MiniTableSub* subs,
8944
+ const upb_MiniTableSubInternal* subs,
8232
8945
  const upb_MiniTableField* f) {
8233
8946
  const upb_Array* arr = *UPB_PTR_AT(msg, f->UPB_PRIVATE(offset), upb_Array*);
8234
8947
  bool packed = upb_MiniTableField_IsPacked(f);
8235
8948
  size_t pre_len = e->limit - e->ptr;
8236
8949
 
8237
- if (arr == NULL || arr->UPB_PRIVATE(size) == 0) {
8950
+ if (arr == NULL || upb_Array_Size(arr) == 0) {
8238
8951
  return;
8239
8952
  }
8240
8953
 
8241
8954
  #define VARINT_CASE(ctype, encode) \
8242
8955
  { \
8243
8956
  const ctype* start = upb_Array_DataPtr(arr); \
8244
- const ctype* ptr = start + arr->UPB_PRIVATE(size); \
8957
+ const ctype* ptr = start + upb_Array_Size(arr); \
8245
8958
  uint32_t tag = \
8246
8959
  packed ? 0 : (f->UPB_PRIVATE(number) << 3) | kUpb_WireType_Varint; \
8247
8960
  do { \
@@ -8286,43 +8999,41 @@ static void encode_array(upb_encstate* e, const upb_Message* msg,
8286
8999
  case kUpb_FieldType_String:
8287
9000
  case kUpb_FieldType_Bytes: {
8288
9001
  const upb_StringView* start = upb_Array_DataPtr(arr);
8289
- const upb_StringView* ptr = start + arr->UPB_PRIVATE(size);
9002
+ const upb_StringView* ptr = start + upb_Array_Size(arr);
8290
9003
  do {
8291
9004
  ptr--;
8292
9005
  encode_bytes(e, ptr->data, ptr->size);
8293
9006
  encode_varint(e, ptr->size);
8294
- encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_Delimited);
9007
+ encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_Delimited);
8295
9008
  } while (ptr != start);
8296
9009
  return;
8297
9010
  }
8298
9011
  case kUpb_FieldType_Group: {
8299
9012
  const upb_TaggedMessagePtr* start = upb_Array_DataPtr(arr);
8300
- const upb_TaggedMessagePtr* ptr = start + arr->UPB_PRIVATE(size);
8301
- const upb_MiniTable* subm =
8302
- upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]);
9013
+ const upb_TaggedMessagePtr* ptr = start + upb_Array_Size(arr);
9014
+ const upb_MiniTable* subm = _upb_Encoder_GetSubMiniTable(subs, f);
8303
9015
  if (--e->depth == 0) encode_err(e, kUpb_EncodeStatus_MaxDepthExceeded);
8304
9016
  do {
8305
9017
  size_t size;
8306
9018
  ptr--;
8307
- encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_EndGroup);
9019
+ encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_EndGroup);
8308
9020
  encode_TaggedMessagePtr(e, *ptr, subm, &size);
8309
- encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_StartGroup);
9021
+ encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_StartGroup);
8310
9022
  } while (ptr != start);
8311
9023
  e->depth++;
8312
9024
  return;
8313
9025
  }
8314
9026
  case kUpb_FieldType_Message: {
8315
9027
  const upb_TaggedMessagePtr* start = upb_Array_DataPtr(arr);
8316
- const upb_TaggedMessagePtr* ptr = start + arr->UPB_PRIVATE(size);
8317
- const upb_MiniTable* subm =
8318
- upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]);
9028
+ const upb_TaggedMessagePtr* ptr = start + upb_Array_Size(arr);
9029
+ const upb_MiniTable* subm = _upb_Encoder_GetSubMiniTable(subs, f);
8319
9030
  if (--e->depth == 0) encode_err(e, kUpb_EncodeStatus_MaxDepthExceeded);
8320
9031
  do {
8321
9032
  size_t size;
8322
9033
  ptr--;
8323
9034
  encode_TaggedMessagePtr(e, *ptr, subm, &size);
8324
9035
  encode_varint(e, size);
8325
- encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_Delimited);
9036
+ encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_Delimited);
8326
9037
  } while (ptr != start);
8327
9038
  e->depth++;
8328
9039
  return;
@@ -8332,15 +9043,15 @@ static void encode_array(upb_encstate* e, const upb_Message* msg,
8332
9043
 
8333
9044
  if (packed) {
8334
9045
  encode_varint(e, e->limit - e->ptr - pre_len);
8335
- encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_Delimited);
9046
+ encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_Delimited);
8336
9047
  }
8337
9048
  }
8338
9049
 
8339
9050
  static void encode_mapentry(upb_encstate* e, uint32_t number,
8340
9051
  const upb_MiniTable* layout,
8341
9052
  const upb_MapEntry* ent) {
8342
- const upb_MiniTableField* key_field = &layout->UPB_PRIVATE(fields)[0];
8343
- const upb_MiniTableField* val_field = &layout->UPB_PRIVATE(fields)[1];
9053
+ const upb_MiniTableField* key_field = upb_MiniTable_MapKey(layout);
9054
+ const upb_MiniTableField* val_field = upb_MiniTable_MapValue(layout);
8344
9055
  size_t pre_len = e->limit - e->ptr;
8345
9056
  size_t size;
8346
9057
  encode_scalar(e, &ent->v, layout->UPB_PRIVATE(subs), val_field);
@@ -8351,12 +9062,11 @@ static void encode_mapentry(upb_encstate* e, uint32_t number,
8351
9062
  }
8352
9063
 
8353
9064
  static void encode_map(upb_encstate* e, const upb_Message* msg,
8354
- const upb_MiniTableSub* subs,
9065
+ const upb_MiniTableSubInternal* subs,
8355
9066
  const upb_MiniTableField* f) {
8356
9067
  const upb_Map* map = *UPB_PTR_AT(msg, f->UPB_PRIVATE(offset), const upb_Map*);
8357
- const upb_MiniTable* layout =
8358
- upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]);
8359
- UPB_ASSERT(layout->UPB_PRIVATE(field_count) == 2);
9068
+ const upb_MiniTable* layout = _upb_Encoder_GetSubMiniTable(subs, f);
9069
+ UPB_ASSERT(upb_MiniTable_FieldCount(layout) == 2);
8360
9070
 
8361
9071
  if (!map || !upb_Map_Size(map)) return;
8362
9072
 
@@ -8367,7 +9077,7 @@ static void encode_map(upb_encstate* e, const upb_Message* msg,
8367
9077
  map, &sorted);
8368
9078
  upb_MapEntry ent;
8369
9079
  while (_upb_sortedmap_next(&e->sorter, map, &sorted, &ent)) {
8370
- encode_mapentry(e, f->UPB_PRIVATE(number), layout, &ent);
9080
+ encode_mapentry(e, upb_MiniTableField_Number(f), layout, &ent);
8371
9081
  }
8372
9082
  _upb_mapsorter_popmap(&e->sorter, &sorted);
8373
9083
  } else {
@@ -8378,13 +9088,12 @@ static void encode_map(upb_encstate* e, const upb_Message* msg,
8378
9088
  upb_MapEntry ent;
8379
9089
  _upb_map_fromkey(key, &ent.k, map->key_size);
8380
9090
  _upb_map_fromvalue(val, &ent.v, map->val_size);
8381
- encode_mapentry(e, f->UPB_PRIVATE(number), layout, &ent);
9091
+ encode_mapentry(e, upb_MiniTableField_Number(f), layout, &ent);
8382
9092
  }
8383
9093
  }
8384
9094
  }
8385
9095
 
8386
9096
  static bool encode_shouldencode(upb_encstate* e, const upb_Message* msg,
8387
- const upb_MiniTableSub* subs,
8388
9097
  const upb_MiniTableField* f) {
8389
9098
  if (f->presence == 0) {
8390
9099
  // Proto3 presence or map/array.
@@ -8418,12 +9127,12 @@ static bool encode_shouldencode(upb_encstate* e, const upb_Message* msg,
8418
9127
  } else {
8419
9128
  // Field is in a oneof.
8420
9129
  return UPB_PRIVATE(_upb_Message_GetOneofCase)(msg, f) ==
8421
- f->UPB_PRIVATE(number);
9130
+ upb_MiniTableField_Number(f);
8422
9131
  }
8423
9132
  }
8424
9133
 
8425
9134
  static void encode_field(upb_encstate* e, const upb_Message* msg,
8426
- const upb_MiniTableSub* subs,
9135
+ const upb_MiniTableSubInternal* subs,
8427
9136
  const upb_MiniTableField* field) {
8428
9137
  switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(field)) {
8429
9138
  case kUpb_FieldMode_Array:
@@ -8444,7 +9153,7 @@ static void encode_field(upb_encstate* e, const upb_Message* msg,
8444
9153
  static void encode_msgset_item(upb_encstate* e, const upb_Extension* ext) {
8445
9154
  size_t size;
8446
9155
  encode_tag(e, kUpb_MsgSet_Item, kUpb_WireType_EndGroup);
8447
- encode_message(e, ext->data.ptr,
9156
+ encode_message(e, ext->data.msg_val,
8448
9157
  upb_MiniTableExtension_GetSubMessage(ext->ext), &size);
8449
9158
  encode_varint(e, size);
8450
9159
  encode_tag(e, kUpb_MsgSet_Message, kUpb_WireType_Delimited);
@@ -8458,7 +9167,14 @@ static void encode_ext(upb_encstate* e, const upb_Extension* ext,
8458
9167
  if (UPB_UNLIKELY(is_message_set)) {
8459
9168
  encode_msgset_item(e, ext);
8460
9169
  } else {
8461
- encode_field(e, (upb_Message*)&ext->data, &ext->ext->UPB_PRIVATE(sub),
9170
+ upb_MiniTableSubInternal sub;
9171
+ if (upb_MiniTableField_IsSubMessage(&ext->ext->UPB_PRIVATE(field))) {
9172
+ sub.UPB_PRIVATE(submsg) = &ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg);
9173
+ } else {
9174
+ sub.UPB_PRIVATE(subenum) =
9175
+ ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(subenum);
9176
+ }
9177
+ encode_field(e, (upb_Message*)&ext->data, &sub,
8462
9178
  &ext->ext->UPB_PRIVATE(field));
8463
9179
  }
8464
9180
  }
@@ -8508,13 +9224,13 @@ static void encode_message(upb_encstate* e, const upb_Message* msg,
8508
9224
  }
8509
9225
  }
8510
9226
 
8511
- if (m->UPB_PRIVATE(field_count)) {
9227
+ if (upb_MiniTable_FieldCount(m)) {
8512
9228
  const upb_MiniTableField* f =
8513
9229
  &m->UPB_PRIVATE(fields)[m->UPB_PRIVATE(field_count)];
8514
9230
  const upb_MiniTableField* first = &m->UPB_PRIVATE(fields)[0];
8515
9231
  while (f != first) {
8516
9232
  f--;
8517
- if (encode_shouldencode(e, msg, m->UPB_PRIVATE(subs), f)) {
9233
+ if (encode_shouldencode(e, msg, f)) {
8518
9234
  encode_field(e, msg, m->UPB_PRIVATE(subs), f);
8519
9235
  }
8520
9236
  }
@@ -8526,14 +9242,18 @@ static void encode_message(upb_encstate* e, const upb_Message* msg,
8526
9242
  static upb_EncodeStatus upb_Encoder_Encode(upb_encstate* const encoder,
8527
9243
  const upb_Message* const msg,
8528
9244
  const upb_MiniTable* const l,
8529
- char** const buf,
8530
- size_t* const size) {
9245
+ char** const buf, size_t* const size,
9246
+ bool prepend_len) {
8531
9247
  // Unfortunately we must continue to perform hackery here because there are
8532
9248
  // code paths which blindly copy the returned pointer without bothering to
8533
9249
  // check for errors until much later (b/235839510). So we still set *buf to
8534
9250
  // NULL on error and we still set it to non-NULL on a successful empty result.
8535
9251
  if (UPB_SETJMP(encoder->err) == 0) {
8536
- encode_message(encoder, msg, l, size);
9252
+ size_t encoded_msg_size;
9253
+ encode_message(encoder, msg, l, &encoded_msg_size);
9254
+ if (prepend_len) {
9255
+ encode_varint(encoder, encoded_msg_size);
9256
+ }
8537
9257
  *size = encoder->limit - encoder->ptr;
8538
9258
  if (*size == 0) {
8539
9259
  static char ch;
@@ -8552,9 +9272,10 @@ static upb_EncodeStatus upb_Encoder_Encode(upb_encstate* const encoder,
8552
9272
  return encoder->status;
8553
9273
  }
8554
9274
 
8555
- upb_EncodeStatus upb_Encode(const upb_Message* msg, const upb_MiniTable* l,
8556
- int options, upb_Arena* arena, char** buf,
8557
- size_t* size) {
9275
+ static upb_EncodeStatus _upb_Encode(const upb_Message* msg,
9276
+ const upb_MiniTable* l, int options,
9277
+ upb_Arena* arena, char** buf, size_t* size,
9278
+ bool prepend_len) {
8558
9279
  upb_encstate e;
8559
9280
  unsigned depth = (unsigned)options >> 16;
8560
9281
 
@@ -8567,7 +9288,35 @@ upb_EncodeStatus upb_Encode(const upb_Message* msg, const upb_MiniTable* l,
8567
9288
  e.options = options;
8568
9289
  _upb_mapsorter_init(&e.sorter);
8569
9290
 
8570
- return upb_Encoder_Encode(&e, msg, l, buf, size);
9291
+ return upb_Encoder_Encode(&e, msg, l, buf, size, prepend_len);
9292
+ }
9293
+
9294
+ upb_EncodeStatus upb_Encode(const upb_Message* msg, const upb_MiniTable* l,
9295
+ int options, upb_Arena* arena, char** buf,
9296
+ size_t* size) {
9297
+ return _upb_Encode(msg, l, options, arena, buf, size, false);
9298
+ }
9299
+
9300
+ upb_EncodeStatus upb_EncodeLengthPrefixed(const upb_Message* msg,
9301
+ const upb_MiniTable* l, int options,
9302
+ upb_Arena* arena, char** buf,
9303
+ size_t* size) {
9304
+ return _upb_Encode(msg, l, options, arena, buf, size, true);
9305
+ }
9306
+
9307
+ const char* upb_EncodeStatus_String(upb_EncodeStatus status) {
9308
+ switch (status) {
9309
+ case kUpb_EncodeStatus_Ok:
9310
+ return "Ok";
9311
+ case kUpb_EncodeStatus_MissingRequired:
9312
+ return "Missing required field";
9313
+ case kUpb_EncodeStatus_MaxDepthExceeded:
9314
+ return "Max depth exceeded";
9315
+ case kUpb_EncodeStatus_OutOfMemory:
9316
+ return "Arena alloc failed";
9317
+ default:
9318
+ return "Unknown encode status";
9319
+ }
8571
9320
  }
8572
9321
 
8573
9322
  // Fast decoder: ~3x the speed of decode.c, but requires x86-64/ARM64.
@@ -8617,7 +9366,7 @@ static const char* fastdecode_isdonefallback(UPB_PARSE_PARAMS) {
8617
9366
  }
8618
9367
 
8619
9368
  UPB_FORCEINLINE
8620
- static const char* fastdecode_dispatch(UPB_PARSE_PARAMS) {
9369
+ const char* fastdecode_dispatch(UPB_PARSE_PARAMS) {
8621
9370
  int overrun;
8622
9371
  switch (upb_EpsCopyInputStream_IsDoneStatus(&d->input, ptr, &overrun)) {
8623
9372
  case kUpb_IsDoneStatus_Done:
@@ -8639,7 +9388,7 @@ static const char* fastdecode_dispatch(UPB_PARSE_PARAMS) {
8639
9388
  }
8640
9389
 
8641
9390
  UPB_FORCEINLINE
8642
- static bool fastdecode_checktag(uint16_t data, int tagbytes) {
9391
+ bool fastdecode_checktag(uint16_t data, int tagbytes) {
8643
9392
  if (tagbytes == 1) {
8644
9393
  return (data & 0xff) == 0;
8645
9394
  } else {
@@ -8648,7 +9397,7 @@ static bool fastdecode_checktag(uint16_t data, int tagbytes) {
8648
9397
  }
8649
9398
 
8650
9399
  UPB_FORCEINLINE
8651
- static const char* fastdecode_longsize(const char* ptr, int* size) {
9400
+ const char* fastdecode_longsize(const char* ptr, int* size) {
8652
9401
  int i;
8653
9402
  UPB_ASSERT(*size & 0x80);
8654
9403
  *size &= 0xff;
@@ -8668,7 +9417,7 @@ static const char* fastdecode_longsize(const char* ptr, int* size) {
8668
9417
  }
8669
9418
 
8670
9419
  UPB_FORCEINLINE
8671
- static const char* fastdecode_delimited(
9420
+ const char* fastdecode_delimited(
8672
9421
  upb_Decoder* d, const char* ptr,
8673
9422
  upb_EpsCopyInputStream_ParseDelimitedFunc* func, void* ctx) {
8674
9423
  ptr++;
@@ -8721,8 +9470,8 @@ typedef struct {
8721
9470
  } fastdecode_nextret;
8722
9471
 
8723
9472
  UPB_FORCEINLINE
8724
- static void* fastdecode_resizearr(upb_Decoder* d, void* dst,
8725
- fastdecode_arr* farr, int valbytes) {
9473
+ void* fastdecode_resizearr(upb_Decoder* d, void* dst, fastdecode_arr* farr,
9474
+ int valbytes) {
8726
9475
  if (UPB_UNLIKELY(dst == farr->end)) {
8727
9476
  size_t old_capacity = farr->arr->UPB_PRIVATE(capacity);
8728
9477
  size_t old_bytes = old_capacity * valbytes;
@@ -8740,7 +9489,7 @@ static void* fastdecode_resizearr(upb_Decoder* d, void* dst,
8740
9489
  }
8741
9490
 
8742
9491
  UPB_FORCEINLINE
8743
- static bool fastdecode_tagmatch(uint32_t tag, uint64_t data, int tagbytes) {
9492
+ bool fastdecode_tagmatch(uint32_t tag, uint64_t data, int tagbytes) {
8744
9493
  if (tagbytes == 1) {
8745
9494
  return (uint8_t)tag == (uint8_t)data;
8746
9495
  } else {
@@ -8749,19 +9498,17 @@ static bool fastdecode_tagmatch(uint32_t tag, uint64_t data, int tagbytes) {
8749
9498
  }
8750
9499
 
8751
9500
  UPB_FORCEINLINE
8752
- static void fastdecode_commitarr(void* dst, fastdecode_arr* farr,
8753
- int valbytes) {
9501
+ void fastdecode_commitarr(void* dst, fastdecode_arr* farr, int valbytes) {
8754
9502
  farr->arr->UPB_PRIVATE(size) =
8755
9503
  (size_t)((char*)dst - (char*)upb_Array_MutableDataPtr(farr->arr)) /
8756
9504
  valbytes;
8757
9505
  }
8758
9506
 
8759
9507
  UPB_FORCEINLINE
8760
- static fastdecode_nextret fastdecode_nextrepeated(upb_Decoder* d, void* dst,
8761
- const char** ptr,
8762
- fastdecode_arr* farr,
8763
- uint64_t data, int tagbytes,
8764
- int valbytes) {
9508
+ fastdecode_nextret fastdecode_nextrepeated(upb_Decoder* d, void* dst,
9509
+ const char** ptr,
9510
+ fastdecode_arr* farr, uint64_t data,
9511
+ int tagbytes, int valbytes) {
8765
9512
  fastdecode_nextret ret;
8766
9513
  dst = (char*)dst + valbytes;
8767
9514
 
@@ -8783,16 +9530,16 @@ static fastdecode_nextret fastdecode_nextrepeated(upb_Decoder* d, void* dst,
8783
9530
  }
8784
9531
 
8785
9532
  UPB_FORCEINLINE
8786
- static void* fastdecode_fieldmem(upb_Message* msg, uint64_t data) {
9533
+ void* fastdecode_fieldmem(upb_Message* msg, uint64_t data) {
8787
9534
  size_t ofs = data >> 48;
8788
9535
  return (char*)msg + ofs;
8789
9536
  }
8790
9537
 
8791
9538
  UPB_FORCEINLINE
8792
- static void* fastdecode_getfield(upb_Decoder* d, const char* ptr,
8793
- upb_Message* msg, uint64_t* data,
8794
- uint64_t* hasbits, fastdecode_arr* farr,
8795
- int valbytes, upb_card card) {
9539
+ void* fastdecode_getfield(upb_Decoder* d, const char* ptr, upb_Message* msg,
9540
+ uint64_t* data, uint64_t* hasbits,
9541
+ fastdecode_arr* farr, int valbytes, upb_card card) {
9542
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
8796
9543
  switch (card) {
8797
9544
  case CARD_s: {
8798
9545
  uint8_t hasbit_index = *data >> 24;
@@ -8831,7 +9578,7 @@ static void* fastdecode_getfield(upb_Decoder* d, const char* ptr,
8831
9578
  }
8832
9579
 
8833
9580
  UPB_FORCEINLINE
8834
- static bool fastdecode_flippacked(uint64_t* data, int tagbytes) {
9581
+ bool fastdecode_flippacked(uint64_t* data, int tagbytes) {
8835
9582
  *data ^= (0x2 ^ 0x0); // Patch data to match packed wiretype.
8836
9583
  return fastdecode_checktag(*data, tagbytes);
8837
9584
  }
@@ -8847,7 +9594,7 @@ static bool fastdecode_flippacked(uint64_t* data, int tagbytes) {
8847
9594
  /* varint fields **************************************************************/
8848
9595
 
8849
9596
  UPB_FORCEINLINE
8850
- static uint64_t fastdecode_munge(uint64_t val, int valbytes, bool zigzag) {
9597
+ uint64_t fastdecode_munge(uint64_t val, int valbytes, bool zigzag) {
8851
9598
  if (valbytes == 1) {
8852
9599
  return val != 0;
8853
9600
  } else if (zigzag) {
@@ -8863,7 +9610,7 @@ static uint64_t fastdecode_munge(uint64_t val, int valbytes, bool zigzag) {
8863
9610
  }
8864
9611
 
8865
9612
  UPB_FORCEINLINE
8866
- static const char* fastdecode_varint64(const char* ptr, uint64_t* val) {
9613
+ const char* fastdecode_varint64(const char* ptr, uint64_t* val) {
8867
9614
  ptr++;
8868
9615
  *val = (uint8_t)ptr[-1];
8869
9616
  if (UPB_UNLIKELY(*val & 0x80)) {
@@ -8938,8 +9685,8 @@ typedef struct {
8938
9685
  } fastdecode_varintdata;
8939
9686
 
8940
9687
  UPB_FORCEINLINE
8941
- static const char* fastdecode_topackedvarint(upb_EpsCopyInputStream* e,
8942
- const char* ptr, void* ctx) {
9688
+ const char* fastdecode_topackedvarint(upb_EpsCopyInputStream* e,
9689
+ const char* ptr, void* ctx) {
8943
9690
  upb_Decoder* d = (upb_Decoder*)e;
8944
9691
  fastdecode_varintdata* data = ctx;
8945
9692
  void* dst = data->dst;
@@ -9168,6 +9915,7 @@ UPB_NOINLINE
9168
9915
  static const char* fastdecode_verifyutf8(upb_Decoder* d, const char* ptr,
9169
9916
  upb_Message* msg, intptr_t table,
9170
9917
  uint64_t hasbits, uint64_t data) {
9918
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
9171
9919
  upb_StringView* dst = (upb_StringView*)data;
9172
9920
  if (!_upb_Decoder_VerifyUtf8Inline(dst->data, dst->size)) {
9173
9921
  _upb_FastDecoder_ErrorJmp(d, kUpb_DecodeStatus_BadUtf8);
@@ -9213,14 +9961,14 @@ UPB_NOINLINE
9213
9961
  static const char* fastdecode_longstring_noutf8(
9214
9962
  struct upb_Decoder* d, const char* ptr, upb_Message* msg, intptr_t table,
9215
9963
  uint64_t hasbits, uint64_t data) {
9964
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
9216
9965
  upb_StringView* dst = (upb_StringView*)data;
9217
9966
  FASTDECODE_LONGSTRING(d, ptr, msg, table, hasbits, dst, false);
9218
9967
  }
9219
9968
 
9220
9969
  UPB_FORCEINLINE
9221
- static void fastdecode_docopy(upb_Decoder* d, const char* ptr, uint32_t size,
9222
- int copy, char* data, size_t data_offset,
9223
- upb_StringView* dst) {
9970
+ void fastdecode_docopy(upb_Decoder* d, const char* ptr, uint32_t size, int copy,
9971
+ char* data, size_t data_offset, upb_StringView* dst) {
9224
9972
  d->arena.UPB_PRIVATE(ptr) += copy;
9225
9973
  dst->data = data + data_offset;
9226
9974
  UPB_UNPOISON_MEMORY_REGION(data, copy);
@@ -9451,8 +10199,8 @@ typedef struct {
9451
10199
  } fastdecode_submsgdata;
9452
10200
 
9453
10201
  UPB_FORCEINLINE
9454
- static const char* fastdecode_tosubmsg(upb_EpsCopyInputStream* e,
9455
- const char* ptr, void* ctx) {
10202
+ const char* fastdecode_tosubmsg(upb_EpsCopyInputStream* e, const char* ptr,
10203
+ void* ctx) {
9456
10204
  upb_Decoder* d = (upb_Decoder*)e;
9457
10205
  fastdecode_submsgdata* submsg = ctx;
9458
10206
  ptr = fastdecode_dispatch(d, ptr, submsg->msg, submsg->table, 0, 0);
@@ -9570,8 +10318,7 @@ UPB_NOINLINE UPB_PRIVATE(_upb_WireReader_LongVarint)
9570
10318
  UPB_PRIVATE(_upb_WireReader_ReadLongVarint)(const char* ptr, uint64_t val) {
9571
10319
  UPB_PRIVATE(_upb_WireReader_LongVarint) ret = {NULL, 0};
9572
10320
  uint64_t byte;
9573
- int i;
9574
- for (i = 1; i < 10; i++) {
10321
+ for (int i = 1; i < 10; i++) {
9575
10322
  byte = (uint8_t)ptr[i];
9576
10323
  val += (byte - 1) << (i * 7);
9577
10324
  if (!(byte & 0x80)) {
@@ -10467,6 +11214,8 @@ const char* upb_BufToInt64(const char* ptr, const char* end, int64_t* val,
10467
11214
 
10468
11215
 
10469
11216
  #include <float.h>
11217
+ #include <math.h>
11218
+ #include <stdio.h>
10470
11219
  #include <stdlib.h>
10471
11220
 
10472
11221
  // Must be last.
@@ -10486,6 +11235,10 @@ static void upb_FixLocale(char* p) {
10486
11235
 
10487
11236
  void _upb_EncodeRoundTripDouble(double val, char* buf, size_t size) {
10488
11237
  assert(size >= kUpb_RoundTripBufferSize);
11238
+ if (isnan(val)) {
11239
+ snprintf(buf, size, "%s", "nan");
11240
+ return;
11241
+ }
10489
11242
  snprintf(buf, size, "%.*g", DBL_DIG, val);
10490
11243
  if (strtod(buf, NULL) != val) {
10491
11244
  snprintf(buf, size, "%.*g", DBL_DIG + 2, val);
@@ -10496,6 +11249,10 @@ void _upb_EncodeRoundTripDouble(double val, char* buf, size_t size) {
10496
11249
 
10497
11250
  void _upb_EncodeRoundTripFloat(float val, char* buf, size_t size) {
10498
11251
  assert(size >= kUpb_RoundTripBufferSize);
11252
+ if (isnan(val)) {
11253
+ snprintf(buf, size, "%s", "nan");
11254
+ return;
11255
+ }
10499
11256
  snprintf(buf, size, "%.*g", FLT_DIG, val);
10500
11257
  if (strtof(buf, NULL) != val) {
10501
11258
  snprintf(buf, size, "%.*g", FLT_DIG + 3, val);
@@ -10603,15 +11360,291 @@ int upb_Unicode_ToUTF8(uint32_t cp, char* out) {
10603
11360
  }
10604
11361
 
10605
11362
 
11363
+ #include <stdlib.h>
11364
+
11365
+
11366
+ // Must be last.
11367
+
11368
+ typedef struct upb_UnknownFields upb_UnknownFields;
11369
+
11370
+ typedef struct {
11371
+ uint32_t tag;
11372
+ union {
11373
+ uint64_t varint;
11374
+ uint64_t uint64;
11375
+ uint32_t uint32;
11376
+ upb_StringView delimited;
11377
+ upb_UnknownFields* group;
11378
+ } data;
11379
+ } upb_UnknownField;
11380
+
11381
+ struct upb_UnknownFields {
11382
+ size_t size;
11383
+ size_t capacity;
11384
+ upb_UnknownField* fields;
11385
+ };
11386
+
11387
+ typedef struct {
11388
+ upb_EpsCopyInputStream stream;
11389
+ upb_Arena* arena;
11390
+ upb_UnknownField* tmp;
11391
+ size_t tmp_size;
11392
+ int depth;
11393
+ upb_UnknownCompareResult status;
11394
+ jmp_buf err;
11395
+ } upb_UnknownField_Context;
11396
+
11397
+ UPB_NORETURN static void upb_UnknownFields_OutOfMemory(
11398
+ upb_UnknownField_Context* ctx) {
11399
+ ctx->status = kUpb_UnknownCompareResult_OutOfMemory;
11400
+ UPB_LONGJMP(ctx->err, 1);
11401
+ }
11402
+
11403
+ static void upb_UnknownFields_Grow(upb_UnknownField_Context* ctx,
11404
+ upb_UnknownField** base,
11405
+ upb_UnknownField** ptr,
11406
+ upb_UnknownField** end) {
11407
+ size_t old = (*ptr - *base);
11408
+ size_t new = UPB_MAX(4, old * 2);
11409
+
11410
+ *base = upb_Arena_Realloc(ctx->arena, *base, old * sizeof(**base),
11411
+ new * sizeof(**base));
11412
+ if (!*base) upb_UnknownFields_OutOfMemory(ctx);
11413
+
11414
+ *ptr = *base + old;
11415
+ *end = *base + new;
11416
+ }
11417
+
11418
+ // We have to implement our own sort here, since qsort() is not an in-order
11419
+ // sort. Here we use merge sort, the simplest in-order sort.
11420
+ static void upb_UnknownFields_Merge(upb_UnknownField* arr, size_t start,
11421
+ size_t mid, size_t end,
11422
+ upb_UnknownField* tmp) {
11423
+ memcpy(tmp, &arr[start], (end - start) * sizeof(*tmp));
11424
+
11425
+ upb_UnknownField* ptr1 = tmp;
11426
+ upb_UnknownField* end1 = &tmp[mid - start];
11427
+ upb_UnknownField* ptr2 = &tmp[mid - start];
11428
+ upb_UnknownField* end2 = &tmp[end - start];
11429
+ upb_UnknownField* out = &arr[start];
11430
+
11431
+ while (ptr1 < end1 && ptr2 < end2) {
11432
+ if (ptr1->tag <= ptr2->tag) {
11433
+ *out++ = *ptr1++;
11434
+ } else {
11435
+ *out++ = *ptr2++;
11436
+ }
11437
+ }
11438
+
11439
+ if (ptr1 < end1) {
11440
+ memcpy(out, ptr1, (end1 - ptr1) * sizeof(*out));
11441
+ } else if (ptr2 < end2) {
11442
+ memcpy(out, ptr1, (end2 - ptr2) * sizeof(*out));
11443
+ }
11444
+ }
11445
+
11446
+ static void upb_UnknownFields_SortRecursive(upb_UnknownField* arr, size_t start,
11447
+ size_t end, upb_UnknownField* tmp) {
11448
+ if (end - start > 1) {
11449
+ size_t mid = start + ((end - start) / 2);
11450
+ upb_UnknownFields_SortRecursive(arr, start, mid, tmp);
11451
+ upb_UnknownFields_SortRecursive(arr, mid, end, tmp);
11452
+ upb_UnknownFields_Merge(arr, start, mid, end, tmp);
11453
+ }
11454
+ }
11455
+
11456
+ static void upb_UnknownFields_Sort(upb_UnknownField_Context* ctx,
11457
+ upb_UnknownFields* fields) {
11458
+ if (ctx->tmp_size < fields->size) {
11459
+ const int oldsize = ctx->tmp_size * sizeof(*ctx->tmp);
11460
+ ctx->tmp_size = UPB_MAX(8, ctx->tmp_size);
11461
+ while (ctx->tmp_size < fields->size) ctx->tmp_size *= 2;
11462
+ const int newsize = ctx->tmp_size * sizeof(*ctx->tmp);
11463
+ ctx->tmp = upb_grealloc(ctx->tmp, oldsize, newsize);
11464
+ }
11465
+ upb_UnknownFields_SortRecursive(fields->fields, 0, fields->size, ctx->tmp);
11466
+ }
11467
+
11468
+ static upb_UnknownFields* upb_UnknownFields_DoBuild(
11469
+ upb_UnknownField_Context* ctx, const char** buf) {
11470
+ upb_UnknownField* arr_base = NULL;
11471
+ upb_UnknownField* arr_ptr = NULL;
11472
+ upb_UnknownField* arr_end = NULL;
11473
+ const char* ptr = *buf;
11474
+ uint32_t last_tag = 0;
11475
+ bool sorted = true;
11476
+ while (!upb_EpsCopyInputStream_IsDone(&ctx->stream, &ptr)) {
11477
+ uint32_t tag;
11478
+ ptr = upb_WireReader_ReadTag(ptr, &tag);
11479
+ UPB_ASSERT(tag <= UINT32_MAX);
11480
+ int wire_type = upb_WireReader_GetWireType(tag);
11481
+ if (wire_type == kUpb_WireType_EndGroup) break;
11482
+ if (tag < last_tag) sorted = false;
11483
+ last_tag = tag;
11484
+
11485
+ if (arr_ptr == arr_end) {
11486
+ upb_UnknownFields_Grow(ctx, &arr_base, &arr_ptr, &arr_end);
11487
+ }
11488
+ upb_UnknownField* field = arr_ptr;
11489
+ field->tag = tag;
11490
+ arr_ptr++;
11491
+
11492
+ switch (wire_type) {
11493
+ case kUpb_WireType_Varint:
11494
+ ptr = upb_WireReader_ReadVarint(ptr, &field->data.varint);
11495
+ break;
11496
+ case kUpb_WireType_64Bit:
11497
+ ptr = upb_WireReader_ReadFixed64(ptr, &field->data.uint64);
11498
+ break;
11499
+ case kUpb_WireType_32Bit:
11500
+ ptr = upb_WireReader_ReadFixed32(ptr, &field->data.uint32);
11501
+ break;
11502
+ case kUpb_WireType_Delimited: {
11503
+ int size;
11504
+ ptr = upb_WireReader_ReadSize(ptr, &size);
11505
+ const char* s_ptr = ptr;
11506
+ ptr = upb_EpsCopyInputStream_ReadStringAliased(&ctx->stream, &s_ptr,
11507
+ size);
11508
+ field->data.delimited.data = s_ptr;
11509
+ field->data.delimited.size = size;
11510
+ break;
11511
+ }
11512
+ case kUpb_WireType_StartGroup:
11513
+ if (--ctx->depth == 0) {
11514
+ ctx->status = kUpb_UnknownCompareResult_MaxDepthExceeded;
11515
+ UPB_LONGJMP(ctx->err, 1);
11516
+ }
11517
+ field->data.group = upb_UnknownFields_DoBuild(ctx, &ptr);
11518
+ ctx->depth++;
11519
+ break;
11520
+ default:
11521
+ UPB_UNREACHABLE();
11522
+ }
11523
+ }
11524
+
11525
+ *buf = ptr;
11526
+ upb_UnknownFields* ret = upb_Arena_Malloc(ctx->arena, sizeof(*ret));
11527
+ if (!ret) upb_UnknownFields_OutOfMemory(ctx);
11528
+ ret->fields = arr_base;
11529
+ ret->size = arr_ptr - arr_base;
11530
+ ret->capacity = arr_end - arr_base;
11531
+ if (!sorted) {
11532
+ upb_UnknownFields_Sort(ctx, ret);
11533
+ }
11534
+ return ret;
11535
+ }
11536
+
11537
+ // Builds a upb_UnknownFields data structure from the binary data in buf.
11538
+ static upb_UnknownFields* upb_UnknownFields_Build(upb_UnknownField_Context* ctx,
11539
+ const char* ptr,
11540
+ size_t size) {
11541
+ upb_EpsCopyInputStream_Init(&ctx->stream, &ptr, size, true);
11542
+ upb_UnknownFields* fields = upb_UnknownFields_DoBuild(ctx, &ptr);
11543
+ UPB_ASSERT(upb_EpsCopyInputStream_IsDone(&ctx->stream, &ptr) &&
11544
+ !upb_EpsCopyInputStream_IsError(&ctx->stream));
11545
+ return fields;
11546
+ }
11547
+
11548
+ // Compares two sorted upb_UnknownFields structures for equality.
11549
+ static bool upb_UnknownFields_IsEqual(const upb_UnknownFields* uf1,
11550
+ const upb_UnknownFields* uf2) {
11551
+ if (uf1->size != uf2->size) return false;
11552
+ for (size_t i = 0, n = uf1->size; i < n; i++) {
11553
+ upb_UnknownField* f1 = &uf1->fields[i];
11554
+ upb_UnknownField* f2 = &uf2->fields[i];
11555
+ if (f1->tag != f2->tag) return false;
11556
+ int wire_type = f1->tag & 7;
11557
+ switch (wire_type) {
11558
+ case kUpb_WireType_Varint:
11559
+ if (f1->data.varint != f2->data.varint) return false;
11560
+ break;
11561
+ case kUpb_WireType_64Bit:
11562
+ if (f1->data.uint64 != f2->data.uint64) return false;
11563
+ break;
11564
+ case kUpb_WireType_32Bit:
11565
+ if (f1->data.uint32 != f2->data.uint32) return false;
11566
+ break;
11567
+ case kUpb_WireType_Delimited:
11568
+ if (!upb_StringView_IsEqual(f1->data.delimited, f2->data.delimited)) {
11569
+ return false;
11570
+ }
11571
+ break;
11572
+ case kUpb_WireType_StartGroup:
11573
+ if (!upb_UnknownFields_IsEqual(f1->data.group, f2->data.group)) {
11574
+ return false;
11575
+ }
11576
+ break;
11577
+ default:
11578
+ UPB_UNREACHABLE();
11579
+ }
11580
+ }
11581
+ return true;
11582
+ }
11583
+
11584
+ static upb_UnknownCompareResult upb_UnknownField_DoCompare(
11585
+ upb_UnknownField_Context* ctx, const char* buf1, size_t size1,
11586
+ const char* buf2, size_t size2) {
11587
+ upb_UnknownCompareResult ret;
11588
+ // First build both unknown fields into a sorted data structure (similar
11589
+ // to the UnknownFieldSet in C++).
11590
+ upb_UnknownFields* uf1 = upb_UnknownFields_Build(ctx, buf1, size1);
11591
+ upb_UnknownFields* uf2 = upb_UnknownFields_Build(ctx, buf2, size2);
11592
+
11593
+ // Now perform the equality check on the sorted structures.
11594
+ if (upb_UnknownFields_IsEqual(uf1, uf2)) {
11595
+ ret = kUpb_UnknownCompareResult_Equal;
11596
+ } else {
11597
+ ret = kUpb_UnknownCompareResult_NotEqual;
11598
+ }
11599
+ return ret;
11600
+ }
11601
+
11602
+ static upb_UnknownCompareResult upb_UnknownField_Compare(
11603
+ upb_UnknownField_Context* const ctx, const char* const buf1,
11604
+ const size_t size1, const char* const buf2, const size_t size2) {
11605
+ upb_UnknownCompareResult ret;
11606
+ if (UPB_SETJMP(ctx->err) == 0) {
11607
+ ret = upb_UnknownField_DoCompare(ctx, buf1, size1, buf2, size2);
11608
+ } else {
11609
+ ret = ctx->status;
11610
+ UPB_ASSERT(ret != kUpb_UnknownCompareResult_Equal);
11611
+ }
11612
+
11613
+ upb_Arena_Free(ctx->arena);
11614
+ upb_gfree(ctx->tmp);
11615
+ return ret;
11616
+ }
11617
+
11618
+ upb_UnknownCompareResult UPB_PRIVATE(_upb_Message_UnknownFieldsAreEqual)(
11619
+ const char* buf1, size_t size1, const char* buf2, size_t size2,
11620
+ int max_depth) {
11621
+ if (size1 == 0 && size2 == 0) return kUpb_UnknownCompareResult_Equal;
11622
+ if (size1 == 0 || size2 == 0) return kUpb_UnknownCompareResult_NotEqual;
11623
+ if (memcmp(buf1, buf2, size1) == 0) return kUpb_UnknownCompareResult_Equal;
11624
+
11625
+ upb_UnknownField_Context ctx = {
11626
+ .arena = upb_Arena_New(),
11627
+ .depth = max_depth,
11628
+ .tmp = NULL,
11629
+ .tmp_size = 0,
11630
+ .status = kUpb_UnknownCompareResult_Equal,
11631
+ };
11632
+
11633
+ if (!ctx.arena) return kUpb_UnknownCompareResult_OutOfMemory;
11634
+
11635
+ return upb_UnknownField_Compare(&ctx, buf1, size1, buf2, size2);
11636
+ }
11637
+
11638
+
10606
11639
  #include <string.h>
10607
11640
 
10608
11641
 
10609
11642
  // Must be last.
10610
11643
 
10611
- const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
11644
+ const upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
10612
11645
  const struct upb_Message* msg, const upb_MiniTableExtension* e) {
10613
11646
  size_t n;
10614
- const struct upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &n);
11647
+ const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &n);
10615
11648
 
10616
11649
  // For now we use linear search exclusively to find extensions.
10617
11650
  // If this becomes an issue due to messages with lots of extensions,
@@ -10625,11 +11658,11 @@ const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
10625
11658
  return NULL;
10626
11659
  }
10627
11660
 
10628
- const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
11661
+ const upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
10629
11662
  const struct upb_Message* msg, size_t* count) {
10630
- upb_Message_Internal* in = msg->internal;
11663
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
10631
11664
  if (in) {
10632
- *count = (in->size - in->ext_begin) / sizeof(struct upb_Extension);
11665
+ *count = (in->size - in->ext_begin) / sizeof(upb_Extension);
10633
11666
  return UPB_PTR_AT(in, in->ext_begin, void);
10634
11667
  } else {
10635
11668
  *count = 0;
@@ -10637,17 +11670,17 @@ const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
10637
11670
  }
10638
11671
  }
10639
11672
 
10640
- struct upb_Extension* UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(
11673
+ upb_Extension* UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(
10641
11674
  struct upb_Message* msg, const upb_MiniTableExtension* e, upb_Arena* a) {
10642
- struct upb_Extension* ext =
10643
- (struct upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
11675
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
11676
+ upb_Extension* ext = (upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
10644
11677
  if (ext) return ext;
10645
- if (!UPB_PRIVATE(_upb_Message_Realloc)(msg, sizeof(struct upb_Extension), a))
11678
+ if (!UPB_PRIVATE(_upb_Message_Realloc)(msg, sizeof(upb_Extension), a))
10646
11679
  return NULL;
10647
- upb_Message_Internal* in = msg->internal;
10648
- in->ext_begin -= sizeof(struct upb_Extension);
11680
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
11681
+ in->ext_begin -= sizeof(upb_Extension);
10649
11682
  ext = UPB_PTR_AT(in, in->ext_begin, void);
10650
- memset(ext, 0, sizeof(struct upb_Extension));
11683
+ memset(ext, 0, sizeof(upb_Extension));
10651
11684
  ext->ext = e;
10652
11685
  return ext;
10653
11686
  }
@@ -10665,9 +11698,10 @@ const double kUpb_NaN = NAN;
10665
11698
 
10666
11699
  bool UPB_PRIVATE(_upb_Message_Realloc)(struct upb_Message* msg, size_t need,
10667
11700
  upb_Arena* a) {
11701
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
10668
11702
  const size_t overhead = sizeof(upb_Message_Internal);
10669
11703
 
10670
- upb_Message_Internal* in = msg->internal;
11704
+ upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
10671
11705
  if (!in) {
10672
11706
  // No internal data, allocate from scratch.
10673
11707
  size_t size = UPB_MAX(128, upb_Log2CeilingSize(need + overhead));
@@ -10677,7 +11711,7 @@ bool UPB_PRIVATE(_upb_Message_Realloc)(struct upb_Message* msg, size_t need,
10677
11711
  in->size = size;
10678
11712
  in->unknown_end = overhead;
10679
11713
  in->ext_begin = size;
10680
- msg->internal = in;
11714
+ UPB_PRIVATE(_upb_Message_SetInternal)(msg, in);
10681
11715
  } else if (in->ext_begin - in->unknown_end < need) {
10682
11716
  // Internal data is too small, reallocate.
10683
11717
  size_t new_size = upb_Log2CeilingSize(in->size + need);
@@ -10693,13 +11727,88 @@ bool UPB_PRIVATE(_upb_Message_Realloc)(struct upb_Message* msg, size_t need,
10693
11727
  }
10694
11728
  in->ext_begin = new_ext_begin;
10695
11729
  in->size = new_size;
10696
- msg->internal = in;
11730
+ UPB_PRIVATE(_upb_Message_SetInternal)(msg, in);
10697
11731
  }
10698
11732
 
10699
11733
  UPB_ASSERT(in->ext_begin - in->unknown_end >= need);
10700
11734
  return true;
10701
11735
  }
10702
11736
 
11737
+ #if UPB_TRACING_ENABLED
11738
+ static void (*_message_trace_handler)(const upb_MiniTable*, const upb_Arena*);
11739
+
11740
+ void upb_Message_LogNewMessage(const upb_MiniTable* m, const upb_Arena* arena) {
11741
+ if (_message_trace_handler) {
11742
+ _message_trace_handler(m, arena);
11743
+ }
11744
+ }
11745
+
11746
+ void upb_Message_SetNewMessageTraceHandler(void (*handler)(const upb_MiniTable*,
11747
+ const upb_Arena*)) {
11748
+ _message_trace_handler = handler;
11749
+ }
11750
+ #endif // UPB_TRACING_ENABLED
11751
+
11752
+
11753
+ #include <stddef.h>
11754
+
11755
+
11756
+ // Must be last.
11757
+
11758
+ bool UPB_PRIVATE(_upb_Message_NextBaseField)(const upb_Message* msg,
11759
+ const upb_MiniTable* m,
11760
+ const upb_MiniTableField** out_f,
11761
+ upb_MessageValue* out_v,
11762
+ size_t* iter) {
11763
+ const size_t count = upb_MiniTable_FieldCount(m);
11764
+ size_t i = *iter;
11765
+
11766
+ while (++i < count) {
11767
+ const upb_MiniTableField* f = upb_MiniTable_GetFieldByIndex(m, i);
11768
+ const void* src = UPB_PRIVATE(_upb_Message_DataPtr)(msg, f);
11769
+
11770
+ upb_MessageValue val;
11771
+ UPB_PRIVATE(_upb_MiniTableField_DataCopy)(f, &val, src);
11772
+
11773
+ // Skip field if unset or empty.
11774
+ if (upb_MiniTableField_HasPresence(f)) {
11775
+ if (!upb_Message_HasBaseField(msg, f)) continue;
11776
+ } else {
11777
+ if (UPB_PRIVATE(_upb_MiniTableField_DataIsZero)(f, src)) continue;
11778
+
11779
+ if (upb_MiniTableField_IsArray(f)) {
11780
+ if (upb_Array_Size(val.array_val) == 0) continue;
11781
+ } else if (upb_MiniTableField_IsMap(f)) {
11782
+ if (upb_Map_Size(val.map_val) == 0) continue;
11783
+ }
11784
+ }
11785
+
11786
+ *out_f = f;
11787
+ *out_v = val;
11788
+ *iter = i;
11789
+ return true;
11790
+ }
11791
+
11792
+ return false;
11793
+ }
11794
+
11795
+ bool UPB_PRIVATE(_upb_Message_NextExtension)(
11796
+ const upb_Message* msg, const upb_MiniTable* m,
11797
+ const upb_MiniTableExtension** out_e, upb_MessageValue* out_v,
11798
+ size_t* iter) {
11799
+ size_t count;
11800
+ const upb_Extension* exts = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
11801
+ size_t i = *iter;
11802
+
11803
+ if (++i < count) {
11804
+ *out_e = exts[i].ext;
11805
+ *out_v = exts[i].data;
11806
+ *iter = i;
11807
+ return true;
11808
+ }
11809
+
11810
+ return false;
11811
+ }
10703
11812
 
10704
11813
  const char _kUpb_ToBase92[] = {
10705
11814
  ' ', '!', '#', '$', '%', '&', '(', ')', '*', '+', ',', '-', '.', '/',
@@ -11036,7 +12145,12 @@ char* upb_MtDataEncoder_EndEnum(upb_MtDataEncoder* e, char* ptr) {
11036
12145
 
11037
12146
  // Must be last.
11038
12147
 
11039
- // A MiniTable for an empty message, used for unlinked sub-messages.
12148
+ // A MiniTable for an empty message, used for unlinked sub-messages that are
12149
+ // built via MiniDescriptors. Messages that use this MiniTable may possibly
12150
+ // be linked later, in which case this MiniTable will be replaced with a real
12151
+ // one. This pattern is known as "dynamic tree shaking", and it introduces
12152
+ // complication because sub-messages may either be the "empty" type or the
12153
+ // "real" type. A tagged bit indicates the difference.
11040
12154
  const struct upb_MiniTable UPB_PRIVATE(_kUpb_MiniTable_Empty) = {
11041
12155
  .UPB_PRIVATE(subs) = NULL,
11042
12156
  .UPB_PRIVATE(fields) = NULL,
@@ -11048,6 +12162,21 @@ const struct upb_MiniTable UPB_PRIVATE(_kUpb_MiniTable_Empty) = {
11048
12162
  .UPB_PRIVATE(required_count) = 0,
11049
12163
  };
11050
12164
 
12165
+ // A MiniTable for a statically tree shaken message. Messages that use this
12166
+ // MiniTable are guaranteed to remain unlinked; unlike the empty message, this
12167
+ // MiniTable is never replaced, which greatly simplifies everything, because the
12168
+ // type of a sub-message is always known, without consulting a tagged bit.
12169
+ const struct upb_MiniTable UPB_PRIVATE(_kUpb_MiniTable_StaticallyTreeShaken) = {
12170
+ .UPB_PRIVATE(subs) = NULL,
12171
+ .UPB_PRIVATE(fields) = NULL,
12172
+ .UPB_PRIVATE(size) = sizeof(struct upb_Message),
12173
+ .UPB_PRIVATE(field_count) = 0,
12174
+ .UPB_PRIVATE(ext) = kUpb_ExtMode_NonExtendable,
12175
+ .UPB_PRIVATE(dense_below) = 0,
12176
+ .UPB_PRIVATE(table_mask) = -1,
12177
+ .UPB_PRIVATE(required_count) = 0,
12178
+ };
12179
+
11051
12180
 
11052
12181
 
11053
12182
  // Must be last.
@@ -11729,7 +12858,11 @@ const upb_EnumValueDef* upb_EnumDef_Value(const upb_EnumDef* e, int i) {
11729
12858
  }
11730
12859
 
11731
12860
  bool upb_EnumDef_IsClosed(const upb_EnumDef* e) {
11732
- if (UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3) return false;
12861
+ if (UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN) return false;
12862
+ return upb_EnumDef_IsSpecifiedAsClosed(e);
12863
+ }
12864
+
12865
+ bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e) {
11733
12866
  return UPB_DESC(FeatureSet_enum_type)(e->resolved_features) ==
11734
12867
  UPB_DESC(FeatureSet_CLOSED);
11735
12868
  }
@@ -12035,15 +13168,10 @@ static void create_enumvaldef(upb_DefBuilder* ctx, const char* prefix,
12035
13168
  static void _upb_EnumValueDef_CheckZeroValue(upb_DefBuilder* ctx,
12036
13169
  const upb_EnumDef* e,
12037
13170
  const upb_EnumValueDef* v, int n) {
12038
- if (upb_EnumDef_IsClosed(e) || n == 0 || v[0].number == 0) return;
12039
-
12040
- // When the special UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 is enabled, we have to
12041
- // exempt proto2 enums from this check, even when we are treating them as
13171
+ // When the special UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN is enabled, we have to
13172
+ // exempt closed enums from this check, even when we are treating them as
12042
13173
  // open.
12043
- if (UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 &&
12044
- upb_FileDef_Syntax(upb_EnumDef_File(e)) == kUpb_Syntax_Proto2) {
12045
- return;
12046
- }
13174
+ if (upb_EnumDef_IsSpecifiedAsClosed(e) || n == 0 || v[0].number == 0) return;
12047
13175
 
12048
13176
  _upb_DefBuilder_Errf(ctx, "for open enums, the first value must be zero (%s)",
12049
13177
  upb_EnumDef_FullName(e));
@@ -12225,27 +13353,16 @@ upb_CType upb_FieldDef_CType(const upb_FieldDef* f) {
12225
13353
  return upb_FieldType_CType(f->type_);
12226
13354
  }
12227
13355
 
12228
- upb_FieldType upb_FieldDef_Type(const upb_FieldDef* f) {
12229
- // TODO: remove once we can deprecate kUpb_FieldType_Group.
12230
- if (f->type_ == kUpb_FieldType_Message &&
12231
- UPB_DESC(FeatureSet_message_encoding)(f->resolved_features) ==
12232
- UPB_DESC(FeatureSet_DELIMITED)) {
12233
- return kUpb_FieldType_Group;
12234
- }
12235
- return f->type_;
12236
- }
13356
+ upb_FieldType upb_FieldDef_Type(const upb_FieldDef* f) { return f->type_; }
12237
13357
 
12238
13358
  uint32_t upb_FieldDef_Index(const upb_FieldDef* f) { return f->index_; }
12239
13359
 
12240
- upb_Label upb_FieldDef_Label(const upb_FieldDef* f) {
12241
- // TODO: remove once we can deprecate kUpb_Label_Required.
12242
- if (UPB_DESC(FeatureSet_field_presence)(f->resolved_features) ==
12243
- UPB_DESC(FeatureSet_LEGACY_REQUIRED)) {
12244
- return kUpb_Label_Required;
12245
- }
12246
- return f->label_;
13360
+ uint32_t upb_FieldDef_LayoutIndex(const upb_FieldDef* f) {
13361
+ return f->layout_index;
12247
13362
  }
12248
13363
 
13364
+ upb_Label upb_FieldDef_Label(const upb_FieldDef* f) { return f->label_; }
13365
+
12249
13366
  uint32_t upb_FieldDef_Number(const upb_FieldDef* f) { return f->number_; }
12250
13367
 
12251
13368
  bool upb_FieldDef_IsExtension(const upb_FieldDef* f) { return f->is_extension; }
@@ -12334,11 +13451,11 @@ upb_MessageValue upb_FieldDef_Default(const upb_FieldDef* f) {
12334
13451
  }
12335
13452
 
12336
13453
  const upb_MessageDef* upb_FieldDef_MessageSubDef(const upb_FieldDef* f) {
12337
- return upb_FieldDef_CType(f) == kUpb_CType_Message ? f->sub.msgdef : NULL;
13454
+ return upb_FieldDef_IsSubMessage(f) ? f->sub.msgdef : NULL;
12338
13455
  }
12339
13456
 
12340
13457
  const upb_EnumDef* upb_FieldDef_EnumSubDef(const upb_FieldDef* f) {
12341
- return upb_FieldDef_CType(f) == kUpb_CType_Enum ? f->sub.enumdef : NULL;
13458
+ return upb_FieldDef_IsEnum(f) ? f->sub.enumdef : NULL;
12342
13459
  }
12343
13460
 
12344
13461
  const upb_MiniTableField* upb_FieldDef_MiniTable(const upb_FieldDef* f) {
@@ -12376,6 +13493,39 @@ bool _upb_FieldDef_ValidateUtf8(const upb_FieldDef* f) {
12376
13493
  UPB_DESC(FeatureSet_VERIFY);
12377
13494
  }
12378
13495
 
13496
+ bool _upb_FieldDef_IsGroupLike(const upb_FieldDef* f) {
13497
+ // Groups are always tag-delimited.
13498
+ if (f->type_ != kUpb_FieldType_Group) {
13499
+ return false;
13500
+ }
13501
+
13502
+ const upb_MessageDef* msg = upb_FieldDef_MessageSubDef(f);
13503
+
13504
+ // Group fields always are always the lowercase type name.
13505
+ const char* mname = upb_MessageDef_Name(msg);
13506
+ const char* fname = upb_FieldDef_Name(f);
13507
+ size_t name_size = strlen(fname);
13508
+ if (name_size != strlen(mname)) return false;
13509
+ for (size_t i = 0; i < name_size; ++i) {
13510
+ if ((mname[i] | 0x20) != fname[i]) {
13511
+ // Case-insensitive ascii comparison.
13512
+ return false;
13513
+ }
13514
+ }
13515
+
13516
+ if (upb_MessageDef_File(msg) != upb_FieldDef_File(f)) {
13517
+ return false;
13518
+ }
13519
+
13520
+ // Group messages are always defined in the same scope as the field. File
13521
+ // level extensions will compare NULL == NULL here, which is why the file
13522
+ // comparison above is necessary to ensure both come from the same file.
13523
+ return upb_FieldDef_IsExtension(f) ? upb_FieldDef_ExtensionScope(f) ==
13524
+ upb_MessageDef_ContainingType(msg)
13525
+ : upb_FieldDef_ContainingType(f) ==
13526
+ upb_MessageDef_ContainingType(msg);
13527
+ }
13528
+
12379
13529
  uint64_t _upb_FieldDef_Modifiers(const upb_FieldDef* f) {
12380
13530
  uint64_t out = upb_FieldDef_IsPacked(f) ? kUpb_FieldModifier_IsPacked : 0;
12381
13531
 
@@ -12402,8 +13552,11 @@ bool upb_FieldDef_HasDefault(const upb_FieldDef* f) { return f->has_default; }
12402
13552
  bool upb_FieldDef_HasPresence(const upb_FieldDef* f) { return f->has_presence; }
12403
13553
 
12404
13554
  bool upb_FieldDef_HasSubDef(const upb_FieldDef* f) {
12405
- return upb_FieldDef_IsSubMessage(f) ||
12406
- upb_FieldDef_CType(f) == kUpb_CType_Enum;
13555
+ return upb_FieldDef_IsSubMessage(f) || upb_FieldDef_IsEnum(f);
13556
+ }
13557
+
13558
+ bool upb_FieldDef_IsEnum(const upb_FieldDef* f) {
13559
+ return upb_FieldDef_CType(f) == kUpb_CType_Enum;
12407
13560
  }
12408
13561
 
12409
13562
  bool upb_FieldDef_IsMap(const upb_FieldDef* f) {
@@ -12707,7 +13860,6 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
12707
13860
 
12708
13861
  const upb_StringView name = UPB_DESC(FieldDescriptorProto_name)(field_proto);
12709
13862
  f->full_name = _upb_DefBuilder_MakeFullName(ctx, prefix, name);
12710
- f->label_ = (int)UPB_DESC(FieldDescriptorProto_label)(field_proto);
12711
13863
  f->number_ = UPB_DESC(FieldDescriptorProto_number)(field_proto);
12712
13864
  f->is_proto3_optional =
12713
13865
  UPB_DESC(FieldDescriptorProto_proto3_optional)(field_proto);
@@ -12739,7 +13891,7 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
12739
13891
  f->full_name);
12740
13892
  }
12741
13893
 
12742
- if (oneof_index >= upb_MessageDef_OneofCount(m)) {
13894
+ if (oneof_index < 0 || oneof_index >= upb_MessageDef_OneofCount(m)) {
12743
13895
  _upb_DefBuilder_Errf(ctx, "oneof_index out of range (%s)", f->full_name);
12744
13896
  }
12745
13897
 
@@ -12753,6 +13905,14 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
12753
13905
  f->resolved_features = _upb_DefBuilder_DoResolveFeatures(
12754
13906
  ctx, parent_features, unresolved_features, implicit);
12755
13907
 
13908
+ f->label_ = (int)UPB_DESC(FieldDescriptorProto_label)(field_proto);
13909
+ if (f->label_ == kUpb_Label_Optional &&
13910
+ // TODO: remove once we can deprecate kUpb_Label_Required.
13911
+ UPB_DESC(FeatureSet_field_presence)(f->resolved_features) ==
13912
+ UPB_DESC(FeatureSet_LEGACY_REQUIRED)) {
13913
+ f->label_ = kUpb_Label_Required;
13914
+ }
13915
+
12756
13916
  if (!UPB_DESC(FieldDescriptorProto_has_name)(field_proto)) {
12757
13917
  _upb_DefBuilder_Errf(ctx, "field has no name");
12758
13918
  }
@@ -12792,7 +13952,7 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
12792
13952
  }
12793
13953
  }
12794
13954
 
12795
- if (!has_type && has_type_name) {
13955
+ if ((!has_type && has_type_name) || f->type_ == kUpb_FieldType_Message) {
12796
13956
  f->type_ =
12797
13957
  UPB_FIELD_TYPE_UNSPECIFIED; // We'll assign this in resolve_subdef()
12798
13958
  } else {
@@ -12821,10 +13981,11 @@ static void _upb_FieldDef_Create(upb_DefBuilder* ctx, const char* prefix,
12821
13981
 
12822
13982
  f->has_presence =
12823
13983
  (!upb_FieldDef_IsRepeated(f)) &&
12824
- (f->type_ == kUpb_FieldType_Message || f->type_ == kUpb_FieldType_Group ||
12825
- upb_FieldDef_ContainingOneof(f) ||
12826
- UPB_DESC(FeatureSet_field_presence)(f->resolved_features) !=
12827
- UPB_DESC(FeatureSet_IMPLICIT));
13984
+ (f->is_extension ||
13985
+ (f->type_ == kUpb_FieldType_Message ||
13986
+ f->type_ == kUpb_FieldType_Group || upb_FieldDef_ContainingOneof(f) ||
13987
+ UPB_DESC(FeatureSet_field_presence)(f->resolved_features) !=
13988
+ UPB_DESC(FeatureSet_IMPLICIT)));
12828
13989
  }
12829
13990
 
12830
13991
  static void _upb_FieldDef_CreateExt(upb_DefBuilder* ctx, const char* prefix,
@@ -12941,8 +14102,15 @@ static void resolve_subdef(upb_DefBuilder* ctx, const char* prefix,
12941
14102
  break;
12942
14103
  case UPB_DEFTYPE_MSG:
12943
14104
  f->sub.msgdef = def;
12944
- f->type_ = kUpb_FieldType_Message; // It appears there is no way of
12945
- // this being a group.
14105
+ f->type_ = kUpb_FieldType_Message;
14106
+ // TODO: remove once we can deprecate
14107
+ // kUpb_FieldType_Group.
14108
+ if (UPB_DESC(FeatureSet_message_encoding)(f->resolved_features) ==
14109
+ UPB_DESC(FeatureSet_DELIMITED) &&
14110
+ !upb_MessageDef_IsMapEntry(def) &&
14111
+ !(f->msgdef && upb_MessageDef_IsMapEntry(f->msgdef))) {
14112
+ f->type_ = kUpb_FieldType_Group;
14113
+ }
12946
14114
  f->has_presence = !upb_FieldDef_IsRepeated(f);
12947
14115
  break;
12948
14116
  default:
@@ -13260,6 +14428,17 @@ const upb_MiniTableExtension* _upb_FileDef_ExtensionMiniTable(
13260
14428
  return f->ext_layouts[i];
13261
14429
  }
13262
14430
 
14431
+ // Note: Import cycles are not allowed so this will terminate.
14432
+ bool upb_FileDef_Resolves(const upb_FileDef* f, const char* path) {
14433
+ if (!strcmp(f->name, path)) return true;
14434
+
14435
+ for (int i = 0; i < upb_FileDef_PublicDependencyCount(f); i++) {
14436
+ const upb_FileDef* dep = upb_FileDef_PublicDependency(f, i);
14437
+ if (upb_FileDef_Resolves(dep, path)) return true;
14438
+ }
14439
+ return false;
14440
+ }
14441
+
13263
14442
  static char* strviewdup(upb_DefBuilder* ctx, upb_StringView view) {
13264
14443
  char* ret = upb_strdup2(view.data, view.size, _upb_DefBuilder_Arena(ctx));
13265
14444
  if (!ret) _upb_DefBuilder_OomErr(ctx);
@@ -13311,20 +14490,35 @@ const UPB_DESC(FeatureSet*)
13311
14490
  size_t n;
13312
14491
  const UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault)* const* d =
13313
14492
  UPB_DESC(FeatureSetDefaults_defaults)(defaults, &n);
13314
- const UPB_DESC(FeatureSet)* ret = NULL;
14493
+ const UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault)* result = NULL;
13315
14494
  for (size_t i = 0; i < n; i++) {
13316
14495
  if (UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault_edition)(d[i]) >
13317
14496
  edition) {
13318
14497
  break;
13319
14498
  }
13320
- ret = UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault_features)(d[i]);
14499
+ result = d[i];
13321
14500
  }
13322
- if (ret == NULL) {
14501
+ if (result == NULL) {
13323
14502
  _upb_DefBuilder_Errf(ctx, "No valid default found for edition %s",
13324
14503
  upb_FileDef_EditionName(edition));
13325
14504
  return NULL;
13326
14505
  }
13327
- return ret;
14506
+
14507
+ // Merge the fixed and overridable features to get the edition's default
14508
+ // feature set.
14509
+ const UPB_DESC(FeatureSet)* fixed = UPB_DESC(
14510
+ FeatureSetDefaults_FeatureSetEditionDefault_fixed_features)(result);
14511
+ const UPB_DESC(FeatureSet)* overridable = UPB_DESC(
14512
+ FeatureSetDefaults_FeatureSetEditionDefault_overridable_features)(result);
14513
+ if (!fixed && !overridable) {
14514
+ _upb_DefBuilder_Errf(ctx, "No valid default found for edition %s",
14515
+ upb_FileDef_EditionName(edition));
14516
+ return NULL;
14517
+ } else if (!fixed) {
14518
+ return overridable;
14519
+ }
14520
+ return _upb_DefBuilder_DoResolveFeatures(ctx, fixed, overridable,
14521
+ /*is_implicit=*/true);
13328
14522
  }
13329
14523
 
13330
14524
  // Allocate and initialize one file def, and add it to the context object.
@@ -13964,8 +15158,8 @@ bool upb_Message_HasFieldByDef(const upb_Message* msg, const upb_FieldDef* f) {
13964
15158
  }
13965
15159
  }
13966
15160
 
13967
- const upb_FieldDef* upb_Message_WhichOneof(const upb_Message* msg,
13968
- const upb_OneofDef* o) {
15161
+ const upb_FieldDef* upb_Message_WhichOneofByDef(const upb_Message* msg,
15162
+ const upb_OneofDef* o) {
13969
15163
  const upb_FieldDef* f = upb_OneofDef_Field(o, 0);
13970
15164
  if (upb_OneofDef_IsSynthetic(o)) {
13971
15165
  UPB_ASSERT(upb_OneofDef_FieldCount(o) == 1);
@@ -13988,6 +15182,7 @@ upb_MessageValue upb_Message_GetFieldByDef(const upb_Message* msg,
13988
15182
  upb_MutableMessageValue upb_Message_Mutable(upb_Message* msg,
13989
15183
  const upb_FieldDef* f,
13990
15184
  upb_Arena* a) {
15185
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
13991
15186
  UPB_ASSERT(upb_FieldDef_IsSubMessage(f) || upb_FieldDef_IsRepeated(f));
13992
15187
  if (upb_FieldDef_HasPresence(f) && !upb_Message_HasFieldByDef(msg, f)) {
13993
15188
  // We need to skip the upb_Message_GetFieldByDef() call in this case.
@@ -14026,10 +15221,20 @@ make:
14026
15221
 
14027
15222
  bool upb_Message_SetFieldByDef(upb_Message* msg, const upb_FieldDef* f,
14028
15223
  upb_MessageValue val, upb_Arena* a) {
14029
- return upb_Message_SetField(msg, upb_FieldDef_MiniTable(f), val, a);
15224
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
15225
+ const upb_MiniTableField* m_f = upb_FieldDef_MiniTable(f);
15226
+
15227
+ if (upb_MiniTableField_IsExtension(m_f)) {
15228
+ return upb_Message_SetExtension(msg, (const upb_MiniTableExtension*)m_f,
15229
+ &val, a);
15230
+ } else {
15231
+ upb_Message_SetBaseField(msg, m_f, &val);
15232
+ return true;
15233
+ }
14030
15234
  }
14031
15235
 
14032
15236
  void upb_Message_ClearFieldByDef(upb_Message* msg, const upb_FieldDef* f) {
15237
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
14033
15238
  const upb_MiniTableField* m_f = upb_FieldDef_MiniTable(f);
14034
15239
 
14035
15240
  if (upb_MiniTableField_IsExtension(m_f)) {
@@ -14040,25 +15245,27 @@ void upb_Message_ClearFieldByDef(upb_Message* msg, const upb_FieldDef* f) {
14040
15245
  }
14041
15246
 
14042
15247
  void upb_Message_ClearByDef(upb_Message* msg, const upb_MessageDef* m) {
15248
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
14043
15249
  upb_Message_Clear(msg, upb_MessageDef_MiniTable(m));
14044
15250
  }
14045
15251
 
14046
15252
  bool upb_Message_Next(const upb_Message* msg, const upb_MessageDef* m,
14047
15253
  const upb_DefPool* ext_pool, const upb_FieldDef** out_f,
14048
15254
  upb_MessageValue* out_val, size_t* iter) {
15255
+ const upb_MiniTable* mt = upb_MessageDef_MiniTable(m);
14049
15256
  size_t i = *iter;
14050
- size_t n = upb_MessageDef_FieldCount(m);
15257
+ size_t n = upb_MiniTable_FieldCount(mt);
15258
+ const upb_MessageValue zero = {0};
14051
15259
  UPB_UNUSED(ext_pool);
14052
15260
 
14053
15261
  // Iterate over normal fields, returning the first one that is set.
14054
15262
  while (++i < n) {
14055
- const upb_FieldDef* f = upb_MessageDef_Field(m, i);
14056
- const upb_MiniTableField* field = upb_FieldDef_MiniTable(f);
14057
- upb_MessageValue val = upb_Message_GetFieldByDef(msg, f);
15263
+ const upb_MiniTableField* field = upb_MiniTable_GetFieldByIndex(mt, i);
15264
+ upb_MessageValue val = upb_Message_GetField(msg, field, zero);
14058
15265
 
14059
15266
  // Skip field if unset or empty.
14060
15267
  if (upb_MiniTableField_HasPresence(field)) {
14061
- if (!upb_Message_HasFieldByDef(msg, f)) continue;
15268
+ if (!upb_Message_HasBaseField(msg, field)) continue;
14062
15269
  } else {
14063
15270
  switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(field)) {
14064
15271
  case kUpb_FieldMode_Map:
@@ -14075,7 +15282,8 @@ bool upb_Message_Next(const upb_Message* msg, const upb_MessageDef* m,
14075
15282
  }
14076
15283
 
14077
15284
  *out_val = val;
14078
- *out_f = f;
15285
+ *out_f =
15286
+ upb_MessageDef_FindFieldByNumber(m, upb_MiniTableField_Number(field));
14079
15287
  *iter = i;
14080
15288
  return true;
14081
15289
  }
@@ -14099,6 +15307,7 @@ bool upb_Message_Next(const upb_Message* msg, const upb_MessageDef* m,
14099
15307
 
14100
15308
  bool _upb_Message_DiscardUnknown(upb_Message* msg, const upb_MessageDef* m,
14101
15309
  int depth) {
15310
+ UPB_ASSERT(!upb_Message_IsFrozen(msg));
14102
15311
  size_t iter = kUpb_Message_Begin;
14103
15312
  const upb_FieldDef* f;
14104
15313
  upb_MessageValue val;
@@ -14539,7 +15748,10 @@ void _upb_MessageDef_InsertField(upb_DefBuilder* ctx, upb_MessageDef* m,
14539
15748
  _upb_MessageDef_Insert(m, shortname, shortnamelen, field_v, ctx->arena);
14540
15749
  if (!ok) _upb_DefBuilder_OomErr(ctx);
14541
15750
 
14542
- if (strcmp(shortname, json_name) != 0 &&
15751
+ bool skip_json_conflicts =
15752
+ UPB_DESC(MessageOptions_deprecated_legacy_json_field_conflicts)(
15753
+ upb_MessageDef_Options(m));
15754
+ if (!skip_json_conflicts && strcmp(shortname, json_name) != 0 &&
14543
15755
  UPB_DESC(FeatureSet_json_format)(m->resolved_features) ==
14544
15756
  UPB_DESC(FeatureSet_ALLOW) &&
14545
15757
  upb_strtable_lookup(&m->ntof, json_name, &v)) {
@@ -14549,14 +15761,16 @@ void _upb_MessageDef_InsertField(upb_DefBuilder* ctx, upb_MessageDef* m,
14549
15761
  }
14550
15762
 
14551
15763
  if (upb_strtable_lookup(&m->jtof, json_name, &v)) {
14552
- _upb_DefBuilder_Errf(ctx, "duplicate json_name (%s)", json_name);
15764
+ if (!skip_json_conflicts) {
15765
+ _upb_DefBuilder_Errf(ctx, "duplicate json_name (%s)", json_name);
15766
+ }
15767
+ } else {
15768
+ const size_t json_size = strlen(json_name);
15769
+ ok = upb_strtable_insert(&m->jtof, json_name, json_size,
15770
+ upb_value_constptr(f), ctx->arena);
15771
+ if (!ok) _upb_DefBuilder_OomErr(ctx);
14553
15772
  }
14554
15773
 
14555
- const size_t json_size = strlen(json_name);
14556
- ok = upb_strtable_insert(&m->jtof, json_name, json_size,
14557
- upb_value_constptr(f), ctx->arena);
14558
- if (!ok) _upb_DefBuilder_OomErr(ctx);
14559
-
14560
15774
  if (upb_inttable_lookup(&m->itof, field_number, NULL)) {
14561
15775
  _upb_DefBuilder_Errf(ctx, "duplicate field number (%u)", field_number);
14562
15776
  }
@@ -14570,7 +15784,7 @@ void _upb_MessageDef_CreateMiniTable(upb_DefBuilder* ctx, upb_MessageDef* m) {
14570
15784
  m->layout = _upb_MessageDef_MakeMiniTable(ctx, m);
14571
15785
  } else {
14572
15786
  m->layout = upb_MiniTableFile_Message(ctx->layout, ctx->msg_count++);
14573
- UPB_ASSERT(m->field_count == m->layout->UPB_PRIVATE(field_count));
15787
+ UPB_ASSERT(m->field_count == upb_MiniTable_FieldCount(m->layout));
14574
15788
 
14575
15789
  // We don't need the result of this call, but it will assign layout_index
14576
15790
  // for all the fields in O(n lg n) time.
@@ -14628,7 +15842,7 @@ void _upb_MessageDef_LinkMiniTable(upb_DefBuilder* ctx,
14628
15842
  for (int i = 0; i < m->field_count; i++) {
14629
15843
  const upb_FieldDef* f = upb_MessageDef_Field(m, i);
14630
15844
  const int layout_index = _upb_FieldDef_LayoutIndex(f);
14631
- UPB_ASSERT(layout_index < m->layout->UPB_PRIVATE(field_count));
15845
+ UPB_ASSERT(layout_index < upb_MiniTable_FieldCount(m->layout));
14632
15846
  const upb_MiniTableField* mt_f =
14633
15847
  &m->layout->UPB_PRIVATE(fields)[layout_index];
14634
15848
  UPB_ASSERT(upb_FieldDef_Type(f) == upb_MiniTableField_Type(mt_f));
@@ -15394,7 +16608,7 @@ upb_ServiceDef* _upb_ServiceDefs_New(upb_DefBuilder* ctx, int n,
15394
16608
  #undef UPB_ASAN
15395
16609
  #undef UPB_ASAN_GUARD_SIZE
15396
16610
  #undef UPB_CLANG_ASAN
15397
- #undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3
16611
+ #undef UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN
15398
16612
  #undef UPB_DEPRECATED
15399
16613
  #undef UPB_GNUC_MIN
15400
16614
  #undef UPB_DESCRIPTOR_UPB_H_FILENAME
@@ -15405,3 +16619,7 @@ upb_ServiceDef* _upb_ServiceDefs_New(upb_DefBuilder* ctx, int n,
15405
16619
  #undef UPB_USE_C11_ATOMICS
15406
16620
  #undef UPB_PRIVATE
15407
16621
  #undef UPB_ONLYBITS
16622
+ #undef UPB_LINKARR_DECLARE
16623
+ #undef UPB_LINKARR_APPEND
16624
+ #undef UPB_LINKARR_START
16625
+ #undef UPB_LINKARR_STOP