google-protobuf 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of google-protobuf might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/defs.c +2 -2
- data/ext/google/protobuf_c/encode_decode.c +4 -4
- data/ext/google/protobuf_c/message.c +44 -0
- data/ext/google/protobuf_c/upb.c +3120 -1982
- data/ext/google/protobuf_c/upb.h +755 -471
- data/lib/google/protobuf/repeated_field.rb +1 -1
- data/tests/basic.rb +19 -0
- metadata +24 -18
    
        data/ext/google/protobuf_c/upb.h
    CHANGED
    
    | @@ -55,14 +55,13 @@ | |
| 55 55 | 
             
            ** store pointers or integers of at least 32 bits (upb isn't really useful on
         | 
| 56 56 | 
             
            ** systems where sizeof(void*) < 4).
         | 
| 57 57 | 
             
            **
         | 
| 58 | 
            -
            ** The table must be  | 
| 58 | 
            +
            ** The table must be homogenous (all values of the same type).  In debug
         | 
| 59 59 | 
             
            ** mode, we check this on insert and lookup.
         | 
| 60 60 | 
             
            */
         | 
| 61 61 |  | 
| 62 62 | 
             
            #ifndef UPB_TABLE_H_
         | 
| 63 63 | 
             
            #define UPB_TABLE_H_
         | 
| 64 64 |  | 
| 65 | 
            -
            #include <assert.h>
         | 
| 66 65 | 
             
            #include <stdint.h>
         | 
| 67 66 | 
             
            #include <string.h>
         | 
| 68 67 | 
             
            /*
         | 
| @@ -118,20 +117,21 @@ template <int N> class InlinedEnvironment; | |
| 118 117 | 
             
            #define UPB_NORETURN
         | 
| 119 118 | 
             
            #endif
         | 
| 120 119 |  | 
| 120 | 
            +
            #if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L
         | 
| 121 | 
            +
            /* C99/C++11 versions. */
         | 
| 122 | 
            +
            #include <stdio.h>
         | 
| 123 | 
            +
            #define _upb_snprintf snprintf
         | 
| 124 | 
            +
            #define _upb_vsnprintf vsnprintf
         | 
| 125 | 
            +
            #define _upb_va_copy(a, b) va_copy(a, b)
         | 
| 126 | 
            +
            #elif defined __GNUC__
         | 
| 121 127 | 
             
            /* A few hacky workarounds for functions not in C89.
         | 
| 122 128 | 
             
             * For internal use only!
         | 
| 123 129 | 
             
             * TODO(haberman): fix these by including our own implementations, or finding
         | 
| 124 130 | 
             
             * another workaround.
         | 
| 125 131 | 
             
             */
         | 
| 126 | 
            -
            #ifdef __GNUC__
         | 
| 127 132 | 
             
            #define _upb_snprintf __builtin_snprintf
         | 
| 128 133 | 
             
            #define _upb_vsnprintf __builtin_vsnprintf
         | 
| 129 134 | 
             
            #define _upb_va_copy(a, b) __va_copy(a, b)
         | 
| 130 | 
            -
            #elif __STDC_VERSION__ >= 199901L
         | 
| 131 | 
            -
            /* C99 versions. */
         | 
| 132 | 
            -
            #define _upb_snprintf snprintf
         | 
| 133 | 
            -
            #define _upb_vsnprintf vsnprintf
         | 
| 134 | 
            -
            #define _upb_va_copy(a, b) va_copy(a, b)
         | 
| 135 135 | 
             
            #else
         | 
| 136 136 | 
             
            #error Need implementations of [v]snprintf and va_copy
         | 
| 137 137 | 
             
            #endif
         | 
| @@ -263,10 +263,23 @@ template <int N> class InlinedEnvironment; | |
| 263 263 |  | 
| 264 264 | 
             
            #define UPB_UNUSED(var) (void)var
         | 
| 265 265 |  | 
| 266 | 
            -
            /*  | 
| 267 | 
            -
             *  | 
| 268 | 
            -
              | 
| 269 | 
            -
            #define  | 
| 266 | 
            +
            /* UPB_ASSERT(): in release mode, we use the expression without letting it be
         | 
| 267 | 
            +
             * evaluated.  This prevents "unused variable" warnings. */
         | 
| 268 | 
            +
            #ifdef NDEBUG
         | 
| 269 | 
            +
            #define UPB_ASSERT(expr) do {} while (false && (expr))
         | 
| 270 | 
            +
            #else
         | 
| 271 | 
            +
            #define UPB_ASSERT(expr) assert(expr)
         | 
| 272 | 
            +
            #endif
         | 
| 273 | 
            +
             | 
| 274 | 
            +
            /* UPB_ASSERT_DEBUGVAR(): assert that uses functions or variables that only
         | 
| 275 | 
            +
             * exist in debug mode.  This turns into regular assert. */
         | 
| 276 | 
            +
            #define UPB_ASSERT_DEBUGVAR(expr) assert(expr)
         | 
| 277 | 
            +
             | 
| 278 | 
            +
            #ifdef __GNUC__
         | 
| 279 | 
            +
            #define UPB_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while(0)
         | 
| 280 | 
            +
            #else
         | 
| 281 | 
            +
            #define UPB_UNREACHABLE() do { assert(0); } while(0)
         | 
| 282 | 
            +
            #endif
         | 
| 270 283 |  | 
| 271 284 | 
             
            /* Generic function type. */
         | 
| 272 285 | 
             
            typedef void upb_func();
         | 
| @@ -501,17 +514,18 @@ struct upb_alloc { | |
| 501 514 | 
             
            };
         | 
| 502 515 |  | 
| 503 516 | 
             
            UPB_INLINE void *upb_malloc(upb_alloc *alloc, size_t size) {
         | 
| 504 | 
            -
               | 
| 517 | 
            +
              UPB_ASSERT(alloc);
         | 
| 505 518 | 
             
              return alloc->func(alloc, NULL, 0, size);
         | 
| 506 519 | 
             
            }
         | 
| 507 520 |  | 
| 508 521 | 
             
            UPB_INLINE void *upb_realloc(upb_alloc *alloc, void *ptr, size_t oldsize,
         | 
| 509 522 | 
             
                                         size_t size) {
         | 
| 510 | 
            -
               | 
| 523 | 
            +
              UPB_ASSERT(alloc);
         | 
| 511 524 | 
             
              return alloc->func(alloc, ptr, oldsize, size);
         | 
| 512 525 | 
             
            }
         | 
| 513 526 |  | 
| 514 527 | 
             
            UPB_INLINE void upb_free(upb_alloc *alloc, void *ptr) {
         | 
| 528 | 
            +
              assert(alloc);
         | 
| 515 529 | 
             
              alloc->func(alloc, ptr, 0, 0);
         | 
| 516 530 | 
             
            }
         | 
| 517 531 |  | 
| @@ -560,11 +574,11 @@ UPB_BEGIN_EXTERN_C | |
| 560 574 | 
             
            void upb_arena_init(upb_arena *a);
         | 
| 561 575 | 
             
            void upb_arena_init2(upb_arena *a, void *mem, size_t n, upb_alloc *alloc);
         | 
| 562 576 | 
             
            void upb_arena_uninit(upb_arena *a);
         | 
| 563 | 
            -
            upb_alloc *upb_arena_alloc(upb_arena *a);
         | 
| 564 577 | 
             
            bool upb_arena_addcleanup(upb_arena *a, upb_cleanup_func *func, void *ud);
         | 
| 565 578 | 
             
            size_t upb_arena_bytesallocated(const upb_arena *a);
         | 
| 566 579 | 
             
            void upb_arena_setnextblocksize(upb_arena *a, size_t size);
         | 
| 567 580 | 
             
            void upb_arena_setmaxblocksize(upb_arena *a, size_t size);
         | 
| 581 | 
            +
            UPB_INLINE upb_alloc *upb_arena_alloc(upb_arena *a) { return (upb_alloc*)a; }
         | 
| 568 582 |  | 
| 569 583 | 
             
            UPB_END_EXTERN_C
         | 
| 570 584 |  | 
| @@ -795,7 +809,9 @@ typedef enum { | |
| 795 809 | 
             
              UPB_CTYPE_CSTR     = 6,
         | 
| 796 810 | 
             
              UPB_CTYPE_PTR      = 7,
         | 
| 797 811 | 
             
              UPB_CTYPE_CONSTPTR = 8,
         | 
| 798 | 
            -
              UPB_CTYPE_FPTR     = 9
         | 
| 812 | 
            +
              UPB_CTYPE_FPTR     = 9,
         | 
| 813 | 
            +
              UPB_CTYPE_FLOAT    = 10,
         | 
| 814 | 
            +
              UPB_CTYPE_DOUBLE   = 11
         | 
| 799 815 | 
             
            } upb_ctype_t;
         | 
| 800 816 |  | 
| 801 817 | 
             
            typedef struct {
         | 
| @@ -854,7 +870,7 @@ UPB_INLINE upb_value _upb_value_val(uint64_t val, upb_ctype_t ctype) { | |
| 854 870 | 
             
                return ret; \
         | 
| 855 871 | 
             
              } \
         | 
| 856 872 | 
             
              UPB_INLINE type_t upb_value_get ## name(upb_value val) { \
         | 
| 857 | 
            -
                 | 
| 873 | 
            +
                UPB_ASSERT_DEBUGVAR(val.ctype == proto_type); \
         | 
| 858 874 | 
             
                return (type_t)(converter)val.val; \
         | 
| 859 875 | 
             
              }
         | 
| 860 876 |  | 
| @@ -869,6 +885,29 @@ FUNCS(constptr, constptr,     const void*,  uintptr_t,  UPB_CTYPE_CONSTPTR) | |
| 869 885 | 
             
            FUNCS(fptr,     fptr,         upb_func*,    uintptr_t,  UPB_CTYPE_FPTR)
         | 
| 870 886 |  | 
| 871 887 | 
             
            #undef FUNCS
         | 
| 888 | 
            +
             | 
| 889 | 
            +
            UPB_INLINE void upb_value_setfloat(upb_value *val, float cval) {
         | 
| 890 | 
            +
              memcpy(&val->val, &cval, sizeof(cval));
         | 
| 891 | 
            +
              SET_TYPE(val->ctype, UPB_CTYPE_FLOAT);
         | 
| 892 | 
            +
            }
         | 
| 893 | 
            +
             | 
| 894 | 
            +
            UPB_INLINE void upb_value_setdouble(upb_value *val, double cval) {
         | 
| 895 | 
            +
              memcpy(&val->val, &cval, sizeof(cval));
         | 
| 896 | 
            +
              SET_TYPE(val->ctype, UPB_CTYPE_DOUBLE);
         | 
| 897 | 
            +
            }
         | 
| 898 | 
            +
             | 
| 899 | 
            +
            UPB_INLINE upb_value upb_value_float(float cval) {
         | 
| 900 | 
            +
              upb_value ret;
         | 
| 901 | 
            +
              upb_value_setfloat(&ret, cval);
         | 
| 902 | 
            +
              return ret;
         | 
| 903 | 
            +
            }
         | 
| 904 | 
            +
             | 
| 905 | 
            +
            UPB_INLINE upb_value upb_value_double(double cval) {
         | 
| 906 | 
            +
              upb_value ret;
         | 
| 907 | 
            +
              upb_value_setdouble(&ret, cval);
         | 
| 908 | 
            +
              return ret;
         | 
| 909 | 
            +
            }
         | 
| 910 | 
            +
             | 
| 872 911 | 
             
            #undef SET_TYPE
         | 
| 873 912 |  | 
| 874 913 |  | 
| @@ -1111,6 +1150,13 @@ UPB_INLINE size_t upb_strtable_count(const upb_strtable *t) { | |
| 1111 1150 | 
             
              return t->t.count;
         | 
| 1112 1151 | 
             
            }
         | 
| 1113 1152 |  | 
| 1153 | 
            +
            void upb_inttable_packedsize(const upb_inttable *t, size_t *size);
         | 
| 1154 | 
            +
            void upb_strtable_packedsize(const upb_strtable *t, size_t *size);
         | 
| 1155 | 
            +
            upb_inttable *upb_inttable_pack(const upb_inttable *t, void *p, size_t *ofs,
         | 
| 1156 | 
            +
                                            size_t size);
         | 
| 1157 | 
            +
            upb_strtable *upb_strtable_pack(const upb_strtable *t, void *p, size_t *ofs,
         | 
| 1158 | 
            +
                                            size_t size);
         | 
| 1159 | 
            +
             | 
| 1114 1160 | 
             
            /* Inserts the given key into the hashtable with the given value.  The key must
         | 
| 1115 1161 | 
             
             * not already exist in the hash table.  For string tables, the key must be
         | 
| 1116 1162 | 
             
             * NULL-terminated, and the table will make an internal copy of the key.
         | 
| @@ -1556,7 +1602,7 @@ template <class T> class upb::reffed_ptr { | |
| 1556 1602 | 
             
              reffed_ptr(U* val, const void* ref_donor = NULL)
         | 
| 1557 1603 | 
             
                  : ptr_(upb::upcast(val)) {
         | 
| 1558 1604 | 
             
                if (ref_donor) {
         | 
| 1559 | 
            -
                   | 
| 1605 | 
            +
                  UPB_ASSERT(ptr_);
         | 
| 1560 1606 | 
             
                  ptr_->DonateRef(ref_donor, this);
         | 
| 1561 1607 | 
             
                } else if (ptr_) {
         | 
| 1562 1608 | 
             
                  ptr_->Ref(this);
         | 
| @@ -1601,12 +1647,12 @@ template <class T> class upb::reffed_ptr { | |
| 1601 1647 | 
             
              }
         | 
| 1602 1648 |  | 
| 1603 1649 | 
             
              T& operator*() const {
         | 
| 1604 | 
            -
                 | 
| 1650 | 
            +
                UPB_ASSERT(ptr_);
         | 
| 1605 1651 | 
             
                return *ptr_;
         | 
| 1606 1652 | 
             
              }
         | 
| 1607 1653 |  | 
| 1608 1654 | 
             
              T* operator->() const {
         | 
| 1609 | 
            -
                 | 
| 1655 | 
            +
                UPB_ASSERT(ptr_);
         | 
| 1610 1656 | 
             
                return ptr_;
         | 
| 1611 1657 | 
             
              }
         | 
| 1612 1658 |  | 
| @@ -1657,6 +1703,7 @@ class FieldDef; | |
| 1657 1703 | 
             
            class FileDef;
         | 
| 1658 1704 | 
             
            class MessageDef;
         | 
| 1659 1705 | 
             
            class OneofDef;
         | 
| 1706 | 
            +
            class SymbolTable;
         | 
| 1660 1707 | 
             
            }
         | 
| 1661 1708 | 
             
            #endif
         | 
| 1662 1709 |  | 
| @@ -1665,6 +1712,8 @@ UPB_DECLARE_DERIVED_TYPE(upb::OneofDef, upb::RefCounted, upb_oneofdef, | |
| 1665 1712 | 
             
                                     upb_refcounted)
         | 
| 1666 1713 | 
             
            UPB_DECLARE_DERIVED_TYPE(upb::FileDef, upb::RefCounted, upb_filedef,
         | 
| 1667 1714 | 
             
                                     upb_refcounted)
         | 
| 1715 | 
            +
            UPB_DECLARE_TYPE(upb::SymbolTable, upb_symtab)
         | 
| 1716 | 
            +
             | 
| 1668 1717 |  | 
| 1669 1718 | 
             
            /* The maximum message depth that the type graph can have.  This is a resource
         | 
| 1670 1719 | 
             
             * limit for the C stack since we sometimes need to recursively traverse the
         | 
| @@ -1698,8 +1747,6 @@ class upb::Def { | |
| 1698 1747 | 
             
             public:
         | 
| 1699 1748 | 
             
              typedef upb_deftype_t Type;
         | 
| 1700 1749 |  | 
| 1701 | 
            -
              Def* Dup(const void *owner) const;
         | 
| 1702 | 
            -
             | 
| 1703 1750 | 
             
              /* upb::RefCounted methods like Ref()/Unref(). */
         | 
| 1704 1751 | 
             
              UPB_REFCOUNTED_CPPMETHODS
         | 
| 1705 1752 |  | 
| @@ -1745,9 +1792,6 @@ class upb::Def { | |
| 1745 1792 |  | 
| 1746 1793 | 
             
            UPB_BEGIN_EXTERN_C
         | 
| 1747 1794 |  | 
| 1748 | 
            -
            /* Native C API. */
         | 
| 1749 | 
            -
            upb_def *upb_def_dup(const upb_def *def, const void *owner);
         | 
| 1750 | 
            -
             | 
| 1751 1795 | 
             
            /* Include upb_refcounted methods like upb_def_ref()/upb_def_unref(). */
         | 
| 1752 1796 | 
             
            UPB_REFCOUNTED_CMETHODS(upb_def, upb_def_upcast)
         | 
| 1753 1797 |  | 
| @@ -1808,7 +1852,7 @@ UPB_END_EXTERN_C | |
| 1808 1852 | 
             
                return (upb_##lower *)def;                                             \
         | 
| 1809 1853 | 
             
              }                                                                        \
         | 
| 1810 1854 | 
             
              UPB_INLINE const upb_##lower *upb_downcast_##lower(const upb_def *def) { \
         | 
| 1811 | 
            -
                 | 
| 1855 | 
            +
                UPB_ASSERT(upb_def_type(def) == UPB_DEF_##upper);                          \
         | 
| 1812 1856 | 
             
                return (const upb_##lower *)def;                                       \
         | 
| 1813 1857 | 
             
              }                                                                        \
         | 
| 1814 1858 | 
             
              UPB_INLINE upb_##lower *upb_dyncast_##lower##_mutable(upb_def *def) {    \
         | 
| @@ -1844,15 +1888,19 @@ UPB_DECLARE_DEF_TYPE(upb::EnumDef, enumdef, ENUM) | |
| 1844 1888 | 
             
             * types defined in descriptor.proto, which gives INT32 and SINT32 separate
         | 
| 1845 1889 | 
             
             * types (we distinguish the two with the "integer encoding" enum below). */
         | 
| 1846 1890 | 
             
            typedef enum {
         | 
| 1847 | 
            -
               | 
| 1848 | 
            -
               | 
| 1849 | 
            -
               | 
| 1850 | 
            -
               | 
| 1851 | 
            -
               | 
| 1852 | 
            -
               | 
| 1853 | 
            -
              UPB_TYPE_ENUM     =  | 
| 1854 | 
            -
               | 
| 1855 | 
            -
               | 
| 1891 | 
            +
              /* Types stored in 1 byte. */
         | 
| 1892 | 
            +
              UPB_TYPE_BOOL     = 1,
         | 
| 1893 | 
            +
              /* Types stored in 4 bytes. */
         | 
| 1894 | 
            +
              UPB_TYPE_FLOAT    = 2,
         | 
| 1895 | 
            +
              UPB_TYPE_INT32    = 3,
         | 
| 1896 | 
            +
              UPB_TYPE_UINT32   = 4,
         | 
| 1897 | 
            +
              UPB_TYPE_ENUM     = 5,  /* Enum values are int32. */
         | 
| 1898 | 
            +
              /* Types stored as pointers (probably 4 or 8 bytes). */
         | 
| 1899 | 
            +
              UPB_TYPE_STRING   = 6,
         | 
| 1900 | 
            +
              UPB_TYPE_BYTES    = 7,
         | 
| 1901 | 
            +
              UPB_TYPE_MESSAGE  = 8,
         | 
| 1902 | 
            +
              /* Types stored as 8 bytes. */
         | 
| 1903 | 
            +
              UPB_TYPE_DOUBLE   = 9,
         | 
| 1856 1904 | 
             
              UPB_TYPE_INT64    = 10,
         | 
| 1857 1905 | 
             
              UPB_TYPE_UINT64   = 11
         | 
| 1858 1906 | 
             
            } upb_fieldtype_t;
         | 
| @@ -1933,13 +1981,6 @@ class upb::FieldDef { | |
| 1933 1981 | 
             
              /* Returns NULL if memory allocation failed. */
         | 
| 1934 1982 | 
             
              static reffed_ptr<FieldDef> New();
         | 
| 1935 1983 |  | 
| 1936 | 
            -
              /* Duplicates the given field, returning NULL if memory allocation failed.
         | 
| 1937 | 
            -
               * When a fielddef is duplicated, the subdef (if any) is made symbolic if it
         | 
| 1938 | 
            -
               * wasn't already.  If the subdef is set but has no name (which is possible
         | 
| 1939 | 
            -
               * since msgdefs are not required to have a name) the new fielddef's subdef
         | 
| 1940 | 
            -
               * will be unset. */
         | 
| 1941 | 
            -
              FieldDef* Dup(const void* owner) const;
         | 
| 1942 | 
            -
             | 
| 1943 1984 | 
             
              /* upb::RefCounted methods like Ref()/Unref(). */
         | 
| 1944 1985 | 
             
              UPB_REFCOUNTED_CPPMETHODS
         | 
| 1945 1986 |  | 
| @@ -2026,16 +2067,10 @@ class upb::FieldDef { | |
| 2026 2067 | 
             
              bool IsPrimitive() const;
         | 
| 2027 2068 | 
             
              bool IsMap() const;
         | 
| 2028 2069 |  | 
| 2029 | 
            -
              /*  | 
| 2070 | 
            +
              /* Returns whether this field explicitly represents presence.
         | 
| 2030 2071 | 
             
               *
         | 
| 2031 | 
            -
               *  | 
| 2032 | 
            -
               * | 
| 2033 | 
            -
               *
         | 
| 2034 | 
            -
               * * This is always true for submessages.
         | 
| 2035 | 
            -
               *
         | 
| 2036 | 
            -
               * * For other fields, it depends on the message (see
         | 
| 2037 | 
            -
               *   MessageDef::SetPrimitivesHavePresence())
         | 
| 2038 | 
            -
               */
         | 
| 2072 | 
            +
               * For proto2 messages: Returns true for any scalar (non-repeated) field.
         | 
| 2073 | 
            +
               * For proto3 messages: Returns true for scalar submessage or oneof fields. */
         | 
| 2039 2074 | 
             
              bool HasPresence() const;
         | 
| 2040 2075 |  | 
| 2041 2076 | 
             
              /* How integers are encoded.  Only meaningful for integer types.
         | 
| @@ -2194,7 +2229,6 @@ UPB_BEGIN_EXTERN_C | |
| 2194 2229 |  | 
| 2195 2230 | 
             
            /* Native C API. */
         | 
| 2196 2231 | 
             
            upb_fielddef *upb_fielddef_new(const void *owner);
         | 
| 2197 | 
            -
            upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner);
         | 
| 2198 2232 |  | 
| 2199 2233 | 
             
            /* Include upb_refcounted methods like upb_fielddef_ref(). */
         | 
| 2200 2234 | 
             
            UPB_REFCOUNTED_CMETHODS(upb_fielddef, upb_fielddef_upcast2)
         | 
| @@ -2404,16 +2438,6 @@ class upb::MessageDef { | |
| 2404 2438 | 
             
                return FindOneofByName(str.c_str(), str.size());
         | 
| 2405 2439 | 
             
              }
         | 
| 2406 2440 |  | 
| 2407 | 
            -
              /* Returns a new msgdef that is a copy of the given msgdef (and a copy of all
         | 
| 2408 | 
            -
               * the fields) but with any references to submessages broken and replaced
         | 
| 2409 | 
            -
               * with just the name of the submessage.  Returns NULL if memory allocation
         | 
| 2410 | 
            -
               * failed.
         | 
| 2411 | 
            -
               *
         | 
| 2412 | 
            -
               * TODO(haberman): which is more useful, keeping fields resolved or
         | 
| 2413 | 
            -
               * unresolving them?  If there's no obvious answer, Should this functionality
         | 
| 2414 | 
            -
               * just be moved into symtab.c? */
         | 
| 2415 | 
            -
              MessageDef* Dup(const void* owner) const;
         | 
| 2416 | 
            -
             | 
| 2417 2441 | 
             
              /* Is this message a map entry? */
         | 
| 2418 2442 | 
             
              void setmapentry(bool map_entry);
         | 
| 2419 2443 | 
             
              bool mapentry() const;
         | 
| @@ -2547,7 +2571,6 @@ UPB_REFCOUNTED_CMETHODS(upb_msgdef, upb_msgdef_upcast2) | |
| 2547 2571 |  | 
| 2548 2572 | 
             
            bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status);
         | 
| 2549 2573 |  | 
| 2550 | 
            -
            upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner);
         | 
| 2551 2574 | 
             
            const char *upb_msgdef_fullname(const upb_msgdef *m);
         | 
| 2552 2575 | 
             
            const char *upb_msgdef_name(const upb_msgdef *m);
         | 
| 2553 2576 | 
             
            int upb_msgdef_numoneofs(const upb_msgdef *m);
         | 
| @@ -2697,10 +2720,6 @@ class upb::EnumDef { | |
| 2697 2720 | 
             
               * first one that was added. */
         | 
| 2698 2721 | 
             
              const char* FindValueByNumber(int32_t num) const;
         | 
| 2699 2722 |  | 
| 2700 | 
            -
              /* Returns a new EnumDef with all the same values.  The new EnumDef will be
         | 
| 2701 | 
            -
               * owned by the given owner. */
         | 
| 2702 | 
            -
              EnumDef* Dup(const void* owner) const;
         | 
| 2703 | 
            -
             | 
| 2704 2723 | 
             
              /* Iteration over name/value pairs.  The order is undefined.
         | 
| 2705 2724 | 
             
               * Adding an enum val invalidates any iterators.
         | 
| 2706 2725 | 
             
               *
         | 
| @@ -2728,7 +2747,6 @@ UPB_BEGIN_EXTERN_C | |
| 2728 2747 |  | 
| 2729 2748 | 
             
            /* Native C API. */
         | 
| 2730 2749 | 
             
            upb_enumdef *upb_enumdef_new(const void *owner);
         | 
| 2731 | 
            -
            upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner);
         | 
| 2732 2750 |  | 
| 2733 2751 | 
             
            /* Include upb_refcounted methods like upb_enumdef_ref(). */
         | 
| 2734 2752 | 
             
            UPB_REFCOUNTED_CMETHODS(upb_enumdef, upb_enumdef_upcast2)
         | 
| @@ -2773,6 +2791,7 @@ int32_t upb_enum_iter_number(upb_enum_iter *iter); | |
| 2773 2791 |  | 
| 2774 2792 | 
             
            UPB_END_EXTERN_C
         | 
| 2775 2793 |  | 
| 2794 | 
            +
             | 
| 2776 2795 | 
             
            /* upb::OneofDef **************************************************************/
         | 
| 2777 2796 |  | 
| 2778 2797 | 
             
            typedef upb_inttable_iter upb_oneof_iter;
         | 
| @@ -2837,10 +2856,6 @@ class upb::OneofDef { | |
| 2837 2856 | 
             
              /* Looks up by tag number. */
         | 
| 2838 2857 | 
             
              const FieldDef* FindFieldByNumber(uint32_t num) const;
         | 
| 2839 2858 |  | 
| 2840 | 
            -
              /* Returns a new OneofDef with all the same fields. The OneofDef will be owned
         | 
| 2841 | 
            -
               * by the given owner. */
         | 
| 2842 | 
            -
              OneofDef* Dup(const void* owner) const;
         | 
| 2843 | 
            -
             | 
| 2844 2859 | 
             
              /* Iteration over fields.  The order is undefined. */
         | 
| 2845 2860 | 
             
              class iterator : public std::iterator<std::forward_iterator_tag, FieldDef*> {
         | 
| 2846 2861 | 
             
               public:
         | 
| @@ -2886,16 +2901,16 @@ UPB_BEGIN_EXTERN_C | |
| 2886 2901 |  | 
| 2887 2902 | 
             
            /* Native C API. */
         | 
| 2888 2903 | 
             
            upb_oneofdef *upb_oneofdef_new(const void *owner);
         | 
| 2889 | 
            -
            upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner);
         | 
| 2890 2904 |  | 
| 2891 2905 | 
             
            /* Include upb_refcounted methods like upb_oneofdef_ref(). */
         | 
| 2892 2906 | 
             
            UPB_REFCOUNTED_CMETHODS(upb_oneofdef, upb_oneofdef_upcast)
         | 
| 2893 2907 |  | 
| 2894 2908 | 
             
            const char *upb_oneofdef_name(const upb_oneofdef *o);
         | 
| 2895 | 
            -
            bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
         | 
| 2896 | 
            -
             | 
| 2897 2909 | 
             
            const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o);
         | 
| 2898 2910 | 
             
            int upb_oneofdef_numfields(const upb_oneofdef *o);
         | 
| 2911 | 
            +
            uint32_t upb_oneofdef_index(const upb_oneofdef *o);
         | 
| 2912 | 
            +
             | 
| 2913 | 
            +
            bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
         | 
| 2899 2914 | 
             
            bool upb_oneofdef_addfield(upb_oneofdef *o, upb_fielddef *f,
         | 
| 2900 2915 | 
             
                                       const void *ref_donor,
         | 
| 2901 2916 | 
             
                                       upb_status *s);
         | 
| @@ -3039,19 +3054,163 @@ UPB_INLINE upb_def *upb_filedef_mutabledef(upb_filedef *f, int i) { | |
| 3039 3054 |  | 
| 3040 3055 | 
             
            UPB_END_EXTERN_C
         | 
| 3041 3056 |  | 
| 3057 | 
            +
            typedef struct {
         | 
| 3058 | 
            +
             UPB_PRIVATE_FOR_CPP
         | 
| 3059 | 
            +
              upb_strtable_iter iter;
         | 
| 3060 | 
            +
              upb_deftype_t type;
         | 
| 3061 | 
            +
            } upb_symtab_iter;
         | 
| 3062 | 
            +
             | 
| 3063 | 
            +
            #ifdef __cplusplus
         | 
| 3064 | 
            +
             | 
| 3065 | 
            +
            /* Non-const methods in upb::SymbolTable are NOT thread-safe. */
         | 
| 3066 | 
            +
            class upb::SymbolTable {
         | 
| 3067 | 
            +
             public:
         | 
| 3068 | 
            +
              /* Returns a new symbol table with a single ref owned by "owner."
         | 
| 3069 | 
            +
               * Returns NULL if memory allocation failed. */
         | 
| 3070 | 
            +
              static SymbolTable* New();
         | 
| 3071 | 
            +
              static void Free(upb::SymbolTable* table);
         | 
| 3072 | 
            +
             | 
| 3073 | 
            +
              /* For all lookup functions, the returned pointer is not owned by the
         | 
| 3074 | 
            +
               * caller; it may be invalidated by any non-const call or unref of the
         | 
| 3075 | 
            +
               * SymbolTable!  To protect against this, take a ref if desired. */
         | 
| 3076 | 
            +
             | 
| 3077 | 
            +
              /* Freezes the symbol table: prevents further modification of it.
         | 
| 3078 | 
            +
               * After the Freeze() operation is successful, the SymbolTable must only be
         | 
| 3079 | 
            +
               * accessed via a const pointer.
         | 
| 3080 | 
            +
               *
         | 
| 3081 | 
            +
               * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
         | 
| 3082 | 
            +
               * a necessary step in using a SymbolTable.  If you have no need for it to be
         | 
| 3083 | 
            +
               * immutable, there is no need to freeze it ever.  However sometimes it is
         | 
| 3084 | 
            +
               * useful, and SymbolTables that are statically compiled into the binary are
         | 
| 3085 | 
            +
               * always frozen by nature. */
         | 
| 3086 | 
            +
              void Freeze();
         | 
| 3087 | 
            +
             | 
| 3088 | 
            +
              /* Resolves the given symbol using the rules described in descriptor.proto,
         | 
| 3089 | 
            +
               * namely:
         | 
| 3090 | 
            +
               *
         | 
| 3091 | 
            +
               *    If the name starts with a '.', it is fully-qualified.  Otherwise,
         | 
| 3092 | 
            +
               *    C++-like scoping rules are used to find the type (i.e. first the nested
         | 
| 3093 | 
            +
               *    types within this message are searched, then within the parent, on up
         | 
| 3094 | 
            +
               *    to the root namespace).
         | 
| 3095 | 
            +
               *
         | 
| 3096 | 
            +
               * If not found, returns NULL. */
         | 
| 3097 | 
            +
              const Def* Resolve(const char* base, const char* sym) const;
         | 
| 3098 | 
            +
             | 
| 3099 | 
            +
              /* Finds an entry in the symbol table with this exact name.  If not found,
         | 
| 3100 | 
            +
               * returns NULL. */
         | 
| 3101 | 
            +
              const Def* Lookup(const char *sym) const;
         | 
| 3102 | 
            +
              const MessageDef* LookupMessage(const char *sym) const;
         | 
| 3103 | 
            +
              const EnumDef* LookupEnum(const char *sym) const;
         | 
| 3104 | 
            +
             | 
| 3105 | 
            +
              /* TODO: introduce a C++ iterator, but make it nice and templated so that if
         | 
| 3106 | 
            +
               * you ask for an iterator of MessageDef the iterated elements are strongly
         | 
| 3107 | 
            +
               * typed as MessageDef*. */
         | 
| 3108 | 
            +
             | 
| 3109 | 
            +
              /* Adds the given mutable defs to the symtab, resolving all symbols (including
         | 
| 3110 | 
            +
               * enum default values) and finalizing the defs.  Only one def per name may be
         | 
| 3111 | 
            +
               * in the list, and the defs may not duplicate any name already in the symtab.
         | 
| 3112 | 
            +
               * All defs must have a name -- anonymous defs are not allowed.  Anonymous
         | 
| 3113 | 
            +
               * defs can still be frozen by calling upb_def_freeze() directly.
         | 
| 3114 | 
            +
               *
         | 
| 3115 | 
            +
               * The entire operation either succeeds or fails.  If the operation fails,
         | 
| 3116 | 
            +
               * the symtab is unchanged, false is returned, and status indicates the
         | 
| 3117 | 
            +
               * error.  The caller passes a ref on all defs to the symtab (even if the
         | 
| 3118 | 
            +
               * operation fails).
         | 
| 3119 | 
            +
               *
         | 
| 3120 | 
            +
               * TODO(haberman): currently failure will leave the symtab unchanged, but may
         | 
| 3121 | 
            +
               * leave the defs themselves partially resolved.  Does this matter?  If so we
         | 
| 3122 | 
            +
               * could do a prepass that ensures that all symbols are resolvable and bail
         | 
| 3123 | 
            +
               * if not, so we don't mutate anything until we know the operation will
         | 
| 3124 | 
            +
               * succeed. */
         | 
| 3125 | 
            +
              bool Add(Def*const* defs, size_t n, void* ref_donor, Status* status);
         | 
| 3126 | 
            +
             | 
| 3127 | 
            +
              bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
         | 
| 3128 | 
            +
                return Add((Def*const*)&defs[0], defs.size(), owner, status);
         | 
| 3129 | 
            +
              }
         | 
| 3130 | 
            +
             | 
| 3131 | 
            +
              /* Resolves all subdefs for messages in this file and attempts to freeze the
         | 
| 3132 | 
            +
               * file.  If this succeeds, adds all the symbols to this SymbolTable
         | 
| 3133 | 
            +
               * (replacing any existing ones with the same names). */
         | 
| 3134 | 
            +
              bool AddFile(FileDef* file, Status* s);
         | 
| 3135 | 
            +
             | 
| 3136 | 
            +
             private:
         | 
| 3137 | 
            +
              UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable)
         | 
| 3138 | 
            +
            };
         | 
| 3139 | 
            +
             | 
| 3140 | 
            +
            #endif  /* __cplusplus */
         | 
| 3141 | 
            +
             | 
| 3142 | 
            +
            UPB_BEGIN_EXTERN_C
         | 
| 3143 | 
            +
             | 
| 3144 | 
            +
            /* Native C API. */
         | 
| 3145 | 
            +
             | 
| 3146 | 
            +
            upb_symtab *upb_symtab_new();
         | 
| 3147 | 
            +
            void upb_symtab_free(upb_symtab* s);
         | 
| 3148 | 
            +
            const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
         | 
| 3149 | 
            +
                                              const char *sym);
         | 
| 3150 | 
            +
            const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
         | 
| 3151 | 
            +
            const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
         | 
| 3152 | 
            +
            const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
         | 
| 3153 | 
            +
            bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
         | 
| 3154 | 
            +
                                void *ref_donor, upb_status *status);
         | 
| 3155 | 
            +
            bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status* status);
         | 
| 3156 | 
            +
             | 
| 3157 | 
            +
            /* upb_symtab_iter i;
         | 
| 3158 | 
            +
             * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
         | 
| 3159 | 
            +
             *     upb_symtab_next(&i)) {
         | 
| 3160 | 
            +
             *   const upb_def *def = upb_symtab_iter_def(&i);
         | 
| 3161 | 
            +
             *    // ...
         | 
| 3162 | 
            +
             * }
         | 
| 3163 | 
            +
             *
         | 
| 3164 | 
            +
             * For C we don't have separate iterators for const and non-const.
         | 
| 3165 | 
            +
             * It is the caller's responsibility to cast the upb_fielddef* to
         | 
| 3166 | 
            +
             * const if the upb_msgdef* is const. */
         | 
| 3167 | 
            +
            void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
         | 
| 3168 | 
            +
                                  upb_deftype_t type);
         | 
| 3169 | 
            +
            void upb_symtab_next(upb_symtab_iter *iter);
         | 
| 3170 | 
            +
            bool upb_symtab_done(const upb_symtab_iter *iter);
         | 
| 3171 | 
            +
            const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
         | 
| 3172 | 
            +
             | 
| 3173 | 
            +
            UPB_END_EXTERN_C
         | 
| 3174 | 
            +
             | 
| 3175 | 
            +
            #ifdef __cplusplus
         | 
| 3176 | 
            +
            /* C++ inline wrappers. */
         | 
| 3177 | 
            +
            namespace upb {
         | 
| 3178 | 
            +
            inline SymbolTable* SymbolTable::New() {
         | 
| 3179 | 
            +
              return upb_symtab_new();
         | 
| 3180 | 
            +
            }
         | 
| 3181 | 
            +
            inline void SymbolTable::Free(SymbolTable* s) {
         | 
| 3182 | 
            +
              upb_symtab_free(s);
         | 
| 3183 | 
            +
            }
         | 
| 3184 | 
            +
            inline const Def *SymbolTable::Resolve(const char *base,
         | 
| 3185 | 
            +
                                                   const char *sym) const {
         | 
| 3186 | 
            +
              return upb_symtab_resolve(this, base, sym);
         | 
| 3187 | 
            +
            }
         | 
| 3188 | 
            +
            inline const Def* SymbolTable::Lookup(const char *sym) const {
         | 
| 3189 | 
            +
              return upb_symtab_lookup(this, sym);
         | 
| 3190 | 
            +
            }
         | 
| 3191 | 
            +
            inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
         | 
| 3192 | 
            +
              return upb_symtab_lookupmsg(this, sym);
         | 
| 3193 | 
            +
            }
         | 
| 3194 | 
            +
            inline bool SymbolTable::Add(
         | 
| 3195 | 
            +
                Def*const* defs, size_t n, void* ref_donor, Status* status) {
         | 
| 3196 | 
            +
              return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
         | 
| 3197 | 
            +
            }
         | 
| 3198 | 
            +
            inline bool SymbolTable::AddFile(FileDef* file, Status* s) {
         | 
| 3199 | 
            +
              return upb_symtab_addfile(this, file, s);
         | 
| 3200 | 
            +
            }
         | 
| 3201 | 
            +
            }  /* namespace upb */
         | 
| 3202 | 
            +
            #endif
         | 
| 3203 | 
            +
             | 
| 3042 3204 | 
             
            #ifdef __cplusplus
         | 
| 3043 3205 |  | 
| 3044 3206 | 
             
            UPB_INLINE const char* upb_safecstr(const std::string& str) {
         | 
| 3045 | 
            -
               | 
| 3207 | 
            +
              UPB_ASSERT(str.size() == std::strlen(str.c_str()));
         | 
| 3046 3208 | 
             
              return str.c_str();
         | 
| 3047 3209 | 
             
            }
         | 
| 3048 3210 |  | 
| 3049 3211 | 
             
            /* Inline C++ wrappers. */
         | 
| 3050 3212 | 
             
            namespace upb {
         | 
| 3051 3213 |  | 
| 3052 | 
            -
            inline Def* Def::Dup(const void* owner) const {
         | 
| 3053 | 
            -
              return upb_def_dup(this, owner);
         | 
| 3054 | 
            -
            }
         | 
| 3055 3214 | 
             
            inline Def::Type Def::def_type() const { return upb_def_type(this); }
         | 
| 3056 3215 | 
             
            inline const char* Def::full_name() const { return upb_def_fullname(this); }
         | 
| 3057 3216 | 
             
            inline const char* Def::name() const { return upb_def_name(this); }
         | 
| @@ -3081,19 +3240,19 @@ inline bool FieldDef::CheckIntegerFormat(int32_t val) { | |
| 3081 3240 | 
             
              return upb_fielddef_checkintfmt(val);
         | 
| 3082 3241 | 
             
            }
         | 
| 3083 3242 | 
             
            inline FieldDef::Type FieldDef::ConvertType(int32_t val) {
         | 
| 3084 | 
            -
               | 
| 3243 | 
            +
              UPB_ASSERT(CheckType(val));
         | 
| 3085 3244 | 
             
              return static_cast<FieldDef::Type>(val);
         | 
| 3086 3245 | 
             
            }
         | 
| 3087 3246 | 
             
            inline FieldDef::Label FieldDef::ConvertLabel(int32_t val) {
         | 
| 3088 | 
            -
               | 
| 3247 | 
            +
              UPB_ASSERT(CheckLabel(val));
         | 
| 3089 3248 | 
             
              return static_cast<FieldDef::Label>(val);
         | 
| 3090 3249 | 
             
            }
         | 
| 3091 3250 | 
             
            inline FieldDef::DescriptorType FieldDef::ConvertDescriptorType(int32_t val) {
         | 
| 3092 | 
            -
               | 
| 3251 | 
            +
              UPB_ASSERT(CheckDescriptorType(val));
         | 
| 3093 3252 | 
             
              return static_cast<FieldDef::DescriptorType>(val);
         | 
| 3094 3253 | 
             
            }
         | 
| 3095 3254 | 
             
            inline FieldDef::IntegerFormat FieldDef::ConvertIntegerFormat(int32_t val) {
         | 
| 3096 | 
            -
               | 
| 3255 | 
            +
              UPB_ASSERT(CheckIntegerFormat(val));
         | 
| 3097 3256 | 
             
              return static_cast<FieldDef::IntegerFormat>(val);
         | 
| 3098 3257 | 
             
            }
         | 
| 3099 3258 |  | 
| @@ -3101,9 +3260,6 @@ inline reffed_ptr<FieldDef> FieldDef::New() { | |
| 3101 3260 | 
             
              upb_fielddef *f = upb_fielddef_new(&f);
         | 
| 3102 3261 | 
             
              return reffed_ptr<FieldDef>(f, &f);
         | 
| 3103 3262 | 
             
            }
         | 
| 3104 | 
            -
            inline FieldDef* FieldDef::Dup(const void* owner) const {
         | 
| 3105 | 
            -
              return upb_fielddef_dup(this, owner);
         | 
| 3106 | 
            -
            }
         | 
| 3107 3263 | 
             
            inline const char* FieldDef::full_name() const {
         | 
| 3108 3264 | 
             
              return upb_fielddef_fullname(this);
         | 
| 3109 3265 | 
             
            }
         | 
| @@ -3343,9 +3499,6 @@ inline const OneofDef* MessageDef::FindOneofByName(const char* name, | |
| 3343 3499 | 
             
                                                               size_t len) const {
         | 
| 3344 3500 | 
             
              return upb_msgdef_ntoo(this, name, len);
         | 
| 3345 3501 | 
             
            }
         | 
| 3346 | 
            -
            inline MessageDef* MessageDef::Dup(const void *owner) const {
         | 
| 3347 | 
            -
              return upb_msgdef_dup(this, owner);
         | 
| 3348 | 
            -
            }
         | 
| 3349 3502 | 
             
            inline void MessageDef::setmapentry(bool map_entry) {
         | 
| 3350 3503 | 
             
              upb_msgdef_setmapentry(this, map_entry);
         | 
| 3351 3504 | 
             
            }
         | 
| @@ -3515,9 +3668,6 @@ inline bool EnumDef::FindValueByName(const char* name, int32_t *num) const { | |
| 3515 3668 | 
             
            inline const char* EnumDef::FindValueByNumber(int32_t num) const {
         | 
| 3516 3669 | 
             
              return upb_enumdef_iton(this, num);
         | 
| 3517 3670 | 
             
            }
         | 
| 3518 | 
            -
            inline EnumDef* EnumDef::Dup(const void* owner) const {
         | 
| 3519 | 
            -
              return upb_enumdef_dup(this, owner);
         | 
| 3520 | 
            -
            }
         | 
| 3521 3671 |  | 
| 3522 3672 | 
             
            inline EnumDef::Iterator::Iterator(const EnumDef* e) {
         | 
| 3523 3673 | 
             
              upb_enum_begin(&iter_, e);
         | 
| @@ -3824,6 +3974,7 @@ extern const struct upb_refcounted_vtbl upb_enumdef_vtbl; | |
| 3824 3974 | 
             
            struct upb_oneofdef {
         | 
| 3825 3975 | 
             
              upb_refcounted base;
         | 
| 3826 3976 |  | 
| 3977 | 
            +
              uint32_t index;  /* Index within oneofs. */
         | 
| 3827 3978 | 
             
              const char *name;
         | 
| 3828 3979 | 
             
              upb_strtable ntof;
         | 
| 3829 3980 | 
             
              upb_inttable itof;
         | 
| @@ -3833,7 +3984,7 @@ struct upb_oneofdef { | |
| 3833 3984 | 
             
            extern const struct upb_refcounted_vtbl upb_oneofdef_vtbl;
         | 
| 3834 3985 |  | 
| 3835 3986 | 
             
            #define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
         | 
| 3836 | 
            -
              { UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), name, ntof, itof }
         | 
| 3987 | 
            +
              { UPB_REFCOUNT_INIT(&upb_oneofdef_vtbl, refs, ref2s), 0, name, ntof, itof }
         | 
| 3837 3988 |  | 
| 3838 3989 |  | 
| 3839 3990 | 
             
            /* upb_symtab *****************************************************************/
         | 
| @@ -4469,7 +4620,7 @@ template <class T> class Handler { | |
| 4469 4620 | 
             
              void AddCleanup(Handlers* h) const {
         | 
| 4470 4621 | 
             
                if (cleanup_func_) {
         | 
| 4471 4622 | 
             
                  bool ok = h->AddCleanup(cleanup_data_, cleanup_func_);
         | 
| 4472 | 
            -
                   | 
| 4623 | 
            +
                  UPB_ASSERT(ok);
         | 
| 4473 4624 | 
             
                }
         | 
| 4474 4625 | 
             
              }
         | 
| 4475 4626 |  | 
| @@ -5489,7 +5640,7 @@ struct ConvertParams<BoundFunc5<R, P1, P2, P3, P4, P5, F, I>, T> { | |
| 5489 5640 | 
             
              inline bool Handlers::SetValueHandler<vtype>(                                \
         | 
| 5490 5641 | 
             
                  const FieldDef *f,                                                       \
         | 
| 5491 5642 | 
             
                  const Handlers::utype ## Handler& handler) {                             \
         | 
| 5492 | 
            -
                 | 
| 5643 | 
            +
                UPB_ASSERT(!handler.registered_);                                              \
         | 
| 5493 5644 | 
             
                handler.AddCleanup(this);                                                  \
         | 
| 5494 5645 | 
             
                handler.registered_ = true;                                                \
         | 
| 5495 5646 | 
             
                return upb_handlers_set##ltype(this, f, handler.handler_, &handler.attr_); \
         | 
| @@ -5601,7 +5752,7 @@ inline Handler<T>::Handler(F func) | |
| 5601 5752 |  | 
| 5602 5753 | 
             
            template <class T>
         | 
| 5603 5754 | 
             
            inline Handler<T>::~Handler() {
         | 
| 5604 | 
            -
               | 
| 5755 | 
            +
              UPB_ASSERT(registered_);
         | 
| 5605 5756 | 
             
            }
         | 
| 5606 5757 |  | 
| 5607 5758 | 
             
            inline HandlerAttributes::HandlerAttributes() { upb_handlerattr_init(this); }
         | 
| @@ -5687,63 +5838,63 @@ inline bool Handlers::AddCleanup(void *p, upb_handlerfree *func) { | |
| 5687 5838 | 
             
            }
         | 
| 5688 5839 | 
             
            inline bool Handlers::SetStartMessageHandler(
         | 
| 5689 5840 | 
             
                const Handlers::StartMessageHandler &handler) {
         | 
| 5690 | 
            -
               | 
| 5841 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5691 5842 | 
             
              handler.registered_ = true;
         | 
| 5692 5843 | 
             
              handler.AddCleanup(this);
         | 
| 5693 5844 | 
             
              return upb_handlers_setstartmsg(this, handler.handler_, &handler.attr_);
         | 
| 5694 5845 | 
             
            }
         | 
| 5695 5846 | 
             
            inline bool Handlers::SetEndMessageHandler(
         | 
| 5696 5847 | 
             
                const Handlers::EndMessageHandler &handler) {
         | 
| 5697 | 
            -
               | 
| 5848 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5698 5849 | 
             
              handler.registered_ = true;
         | 
| 5699 5850 | 
             
              handler.AddCleanup(this);
         | 
| 5700 5851 | 
             
              return upb_handlers_setendmsg(this, handler.handler_, &handler.attr_);
         | 
| 5701 5852 | 
             
            }
         | 
| 5702 5853 | 
             
            inline bool Handlers::SetStartStringHandler(const FieldDef *f,
         | 
| 5703 5854 | 
             
                                                        const StartStringHandler &handler) {
         | 
| 5704 | 
            -
               | 
| 5855 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5705 5856 | 
             
              handler.registered_ = true;
         | 
| 5706 5857 | 
             
              handler.AddCleanup(this);
         | 
| 5707 5858 | 
             
              return upb_handlers_setstartstr(this, f, handler.handler_, &handler.attr_);
         | 
| 5708 5859 | 
             
            }
         | 
| 5709 5860 | 
             
            inline bool Handlers::SetEndStringHandler(const FieldDef *f,
         | 
| 5710 5861 | 
             
                                                      const EndFieldHandler &handler) {
         | 
| 5711 | 
            -
               | 
| 5862 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5712 5863 | 
             
              handler.registered_ = true;
         | 
| 5713 5864 | 
             
              handler.AddCleanup(this);
         | 
| 5714 5865 | 
             
              return upb_handlers_setendstr(this, f, handler.handler_, &handler.attr_);
         | 
| 5715 5866 | 
             
            }
         | 
| 5716 5867 | 
             
            inline bool Handlers::SetStringHandler(const FieldDef *f,
         | 
| 5717 5868 | 
             
                                                   const StringHandler& handler) {
         | 
| 5718 | 
            -
               | 
| 5869 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5719 5870 | 
             
              handler.registered_ = true;
         | 
| 5720 5871 | 
             
              handler.AddCleanup(this);
         | 
| 5721 5872 | 
             
              return upb_handlers_setstring(this, f, handler.handler_, &handler.attr_);
         | 
| 5722 5873 | 
             
            }
         | 
| 5723 5874 | 
             
            inline bool Handlers::SetStartSequenceHandler(
         | 
| 5724 5875 | 
             
                const FieldDef *f, const StartFieldHandler &handler) {
         | 
| 5725 | 
            -
               | 
| 5876 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5726 5877 | 
             
              handler.registered_ = true;
         | 
| 5727 5878 | 
             
              handler.AddCleanup(this);
         | 
| 5728 5879 | 
             
              return upb_handlers_setstartseq(this, f, handler.handler_, &handler.attr_);
         | 
| 5729 5880 | 
             
            }
         | 
| 5730 5881 | 
             
            inline bool Handlers::SetStartSubMessageHandler(
         | 
| 5731 5882 | 
             
                const FieldDef *f, const StartFieldHandler &handler) {
         | 
| 5732 | 
            -
               | 
| 5883 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5733 5884 | 
             
              handler.registered_ = true;
         | 
| 5734 5885 | 
             
              handler.AddCleanup(this);
         | 
| 5735 5886 | 
             
              return upb_handlers_setstartsubmsg(this, f, handler.handler_, &handler.attr_);
         | 
| 5736 5887 | 
             
            }
         | 
| 5737 5888 | 
             
            inline bool Handlers::SetEndSubMessageHandler(const FieldDef *f,
         | 
| 5738 5889 | 
             
                                                          const EndFieldHandler &handler) {
         | 
| 5739 | 
            -
               | 
| 5890 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5740 5891 | 
             
              handler.registered_ = true;
         | 
| 5741 5892 | 
             
              handler.AddCleanup(this);
         | 
| 5742 5893 | 
             
              return upb_handlers_setendsubmsg(this, f, handler.handler_, &handler.attr_);
         | 
| 5743 5894 | 
             
            }
         | 
| 5744 5895 | 
             
            inline bool Handlers::SetEndSequenceHandler(const FieldDef *f,
         | 
| 5745 5896 | 
             
                                                        const EndFieldHandler &handler) {
         | 
| 5746 | 
            -
               | 
| 5897 | 
            +
              UPB_ASSERT(!handler.registered_);
         | 
| 5747 5898 | 
             
              handler.registered_ = true;
         | 
| 5748 5899 | 
             
              handler.AddCleanup(this);
         | 
| 5749 5900 | 
             
              return upb_handlers_setendseq(this, f, handler.handler_, &handler.attr_);
         | 
| @@ -5820,12 +5971,14 @@ inline BytesHandler::~BytesHandler() {} | |
| 5820 5971 |  | 
| 5821 5972 | 
             
            #ifdef __cplusplus
         | 
| 5822 5973 | 
             
            namespace upb {
         | 
| 5974 | 
            +
            class BufferSink;
         | 
| 5823 5975 | 
             
            class BufferSource;
         | 
| 5824 5976 | 
             
            class BytesSink;
         | 
| 5825 5977 | 
             
            class Sink;
         | 
| 5826 5978 | 
             
            }
         | 
| 5827 5979 | 
             
            #endif
         | 
| 5828 5980 |  | 
| 5981 | 
            +
            UPB_DECLARE_TYPE(upb::BufferSink, upb_bufsink)
         | 
| 5829 5982 | 
             
            UPB_DECLARE_TYPE(upb::BufferSource, upb_bufsrc)
         | 
| 5830 5983 | 
             
            UPB_DECLARE_TYPE(upb::BytesSink, upb_bytessink)
         | 
| 5831 5984 | 
             
            UPB_DECLARE_TYPE(upb::Sink, upb_sink)
         | 
| @@ -6012,6 +6165,13 @@ struct upb_bufsrc { | |
| 6012 6165 |  | 
| 6013 6166 | 
             
            UPB_BEGIN_EXTERN_C
         | 
| 6014 6167 |  | 
| 6168 | 
            +
            /* A class for accumulating output string data in a flat buffer. */
         | 
| 6169 | 
            +
             | 
| 6170 | 
            +
            upb_bufsink *upb_bufsink_new(upb_env *env);
         | 
| 6171 | 
            +
            void upb_bufsink_free(upb_bufsink *sink);
         | 
| 6172 | 
            +
            upb_bytessink *upb_bufsink_sink(upb_bufsink *sink);
         | 
| 6173 | 
            +
            const char *upb_bufsink_getdata(const upb_bufsink *sink, size_t *len);
         | 
| 6174 | 
            +
             | 
| 6015 6175 | 
             
            /* Inline definitions. */
         | 
| 6016 6176 |  | 
| 6017 6177 | 
             
            UPB_INLINE void upb_bytessink_reset(upb_bytessink *s, const upb_byteshandler *h,
         | 
| @@ -6061,23 +6221,7 @@ UPB_INLINE bool upb_bytessink_end(upb_bytessink *s) { | |
| 6061 6221 | 
             
                             &s->handler->table[UPB_ENDSTR_SELECTOR].attr));
         | 
| 6062 6222 | 
             
            }
         | 
| 6063 6223 |  | 
| 6064 | 
            -
             | 
| 6065 | 
            -
                                              upb_bytessink *sink) {
         | 
| 6066 | 
            -
              void *subc;
         | 
| 6067 | 
            -
              bool ret;
         | 
| 6068 | 
            -
              upb_bufhandle handle;
         | 
| 6069 | 
            -
              upb_bufhandle_init(&handle);
         | 
| 6070 | 
            -
              upb_bufhandle_setbuf(&handle, buf, 0);
         | 
| 6071 | 
            -
              ret = upb_bytessink_start(sink, len, &subc);
         | 
| 6072 | 
            -
              if (ret && len != 0) {
         | 
| 6073 | 
            -
                ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) >= len);
         | 
| 6074 | 
            -
              }
         | 
| 6075 | 
            -
              if (ret) {
         | 
| 6076 | 
            -
                ret = upb_bytessink_end(sink);
         | 
| 6077 | 
            -
              }
         | 
| 6078 | 
            -
              upb_bufhandle_uninit(&handle);
         | 
| 6079 | 
            -
              return ret;
         | 
| 6080 | 
            -
            }
         | 
| 6224 | 
            +
            bool upb_bufsrc_putbuf(const char *buf, size_t len, upb_bytessink *sink);
         | 
| 6081 6225 |  | 
| 6082 6226 | 
             
            #define PUTVAL(type, ctype)                                                    \
         | 
| 6083 6227 | 
             
              UPB_INLINE bool upb_sink_put##type(upb_sink *s, upb_selector_t sel,          \
         | 
| @@ -6325,267 +6469,407 @@ inline bool BufferSource::PutBuffer(const char *buf, size_t len, | |
| 6325 6469 |  | 
| 6326 6470 | 
             
            #endif
         | 
| 6327 6471 | 
             
            /*
         | 
| 6328 | 
            -
            **  | 
| 6329 | 
            -
            ** overhead of calling a handler can be significant.  This file allows the
         | 
| 6330 | 
            -
            ** user to define handlers that do something very simple like store the value
         | 
| 6331 | 
            -
            ** to memory and/or set a hasbit.  JIT compilers can then special-case these
         | 
| 6332 | 
            -
            ** handlers and emit specialized code for them instead of actually calling the
         | 
| 6333 | 
            -
            ** handler.
         | 
| 6472 | 
            +
            ** upb::Message is a representation for protobuf messages.
         | 
| 6334 6473 | 
             
            **
         | 
| 6335 | 
            -
            **  | 
| 6336 | 
            -
            **  | 
| 6337 | 
            -
             | 
| 6338 | 
            -
             | 
| 6339 | 
            -
             | 
| 6340 | 
            -
             | 
| 6474 | 
            +
            ** However it differs from other common representations like
         | 
| 6475 | 
            +
            ** google::protobuf::Message in one key way: it does not prescribe any
         | 
| 6476 | 
            +
            ** ownership between messages and submessages, and it relies on the
         | 
| 6477 | 
            +
            ** client to delete each message/submessage/array/map at the appropriate
         | 
| 6478 | 
            +
            ** time.
         | 
| 6479 | 
            +
            **
         | 
| 6480 | 
            +
            ** A client can access a upb::Message without knowing anything about
         | 
| 6481 | 
            +
            ** ownership semantics, but to create or mutate a message a user needs
         | 
| 6482 | 
            +
            ** to implement the memory management themselves.
         | 
| 6483 | 
            +
            **
         | 
| 6484 | 
            +
            ** Currently all messages, arrays, and maps store a upb_alloc* internally.
         | 
| 6485 | 
            +
            ** Mutating operations use this when they require dynamically-allocated
         | 
| 6486 | 
            +
            ** memory.  We could potentially eliminate this size overhead later by
         | 
| 6487 | 
            +
            ** letting the user flip a bit on the factory that prevents this from
         | 
| 6488 | 
            +
            ** being stored.  The user would then need to use separate functions where
         | 
| 6489 | 
            +
            ** the upb_alloc* is passed explicitly.  However for handlers to populate
         | 
| 6490 | 
            +
            ** such structures, they would need a place to store this upb_alloc* during
         | 
| 6491 | 
            +
            ** parsing; upb_handlers don't currently have a good way to accommodate this.
         | 
| 6492 | 
            +
            **
         | 
| 6493 | 
            +
            ** TODO: UTF-8 checking?
         | 
| 6494 | 
            +
            **/
         | 
| 6341 6495 |  | 
| 6496 | 
            +
            #ifndef UPB_MSG_H_
         | 
| 6497 | 
            +
            #define UPB_MSG_H_
         | 
| 6342 6498 |  | 
| 6343 | 
            -
            typedef struct {
         | 
| 6344 | 
            -
              size_t offset;
         | 
| 6345 | 
            -
              int32_t hasbit;
         | 
| 6346 | 
            -
            } upb_shim_data;
         | 
| 6347 6499 |  | 
| 6348 6500 | 
             
            #ifdef __cplusplus
         | 
| 6349 6501 |  | 
| 6350 6502 | 
             
            namespace upb {
         | 
| 6503 | 
            +
            class Array;
         | 
| 6504 | 
            +
            class Map;
         | 
| 6505 | 
            +
            class MapIterator;
         | 
| 6506 | 
            +
            class MessageFactory;
         | 
| 6507 | 
            +
            class MessageLayout;
         | 
| 6508 | 
            +
            class Visitor;
         | 
| 6509 | 
            +
            class VisitorPlan;
         | 
| 6510 | 
            +
            }
         | 
| 6351 6511 |  | 
| 6352 | 
            -
             | 
| 6353 | 
            -
              typedef upb_shim_data Data;
         | 
| 6512 | 
            +
            #endif
         | 
| 6354 6513 |  | 
| 6355 | 
            -
             | 
| 6356 | 
            -
             | 
| 6357 | 
            -
             | 
| 6358 | 
            -
             | 
| 6514 | 
            +
            UPB_DECLARE_TYPE(upb::MessageFactory, upb_msgfactory)
         | 
| 6515 | 
            +
            UPB_DECLARE_TYPE(upb::MessageLayout, upb_msglayout)
         | 
| 6516 | 
            +
            UPB_DECLARE_TYPE(upb::Array, upb_array)
         | 
| 6517 | 
            +
            UPB_DECLARE_TYPE(upb::Map, upb_map)
         | 
| 6518 | 
            +
            UPB_DECLARE_TYPE(upb::MapIterator, upb_mapiter)
         | 
| 6519 | 
            +
            UPB_DECLARE_TYPE(upb::Visitor, upb_visitor)
         | 
| 6520 | 
            +
            UPB_DECLARE_TYPE(upb::VisitorPlan, upb_visitorplan)
         | 
| 6359 6521 |  | 
| 6360 | 
            -
             | 
| 6361 | 
            -
               * stores the type in "type".  Otherwise returns NULL. */
         | 
| 6362 | 
            -
              static const Data* GetData(const Handlers* h, Handlers::Selector s,
         | 
| 6363 | 
            -
                                         FieldDef::Type* type);
         | 
| 6364 | 
            -
            };
         | 
| 6522 | 
            +
            /* TODO(haberman): C++ accessors */
         | 
| 6365 6523 |  | 
| 6366 | 
            -
             | 
| 6524 | 
            +
            UPB_BEGIN_EXTERN_C
         | 
| 6367 6525 |  | 
| 6368 | 
            -
             | 
| 6526 | 
            +
            typedef void upb_msg;
         | 
| 6369 6527 |  | 
| 6370 | 
            -
            UPB_BEGIN_EXTERN_C
         | 
| 6371 6528 |  | 
| 6372 | 
            -
             | 
| 6373 | 
            -
            bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
         | 
| 6374 | 
            -
                              int32_t hasbit);
         | 
| 6375 | 
            -
            const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,
         | 
| 6376 | 
            -
                                                  upb_fieldtype_t *type);
         | 
| 6529 | 
            +
            /** upb_msglayout *************************************************************/
         | 
| 6377 6530 |  | 
| 6378 | 
            -
             | 
| 6531 | 
            +
            /* upb_msglayout represents the memory layout of a given upb_msgdef.  You get
         | 
| 6532 | 
            +
             * instances of this from a upb_msgfactory, and the factory always owns the
         | 
| 6533 | 
            +
             * msglayout. */
         | 
| 6379 6534 |  | 
| 6380 | 
            -
             | 
| 6381 | 
            -
             | 
| 6382 | 
            -
            namespace upb {
         | 
| 6383 | 
            -
            inline bool Shim::Set(Handlers* h, const FieldDef* f, size_t ofs,
         | 
| 6384 | 
            -
                                  int32_t hasbit) {
         | 
| 6385 | 
            -
              return upb_shim_set(h, f, ofs, hasbit);
         | 
| 6386 | 
            -
            }
         | 
| 6387 | 
            -
            inline const Shim::Data* Shim::GetData(const Handlers* h, Handlers::Selector s,
         | 
| 6388 | 
            -
                                                   FieldDef::Type* type) {
         | 
| 6389 | 
            -
              return upb_shim_getdata(h, s, type);
         | 
| 6390 | 
            -
            }
         | 
| 6391 | 
            -
            }  /* namespace upb */
         | 
| 6392 | 
            -
            #endif
         | 
| 6535 | 
            +
            /* Gets the factory for this layout */
         | 
| 6536 | 
            +
            upb_msgfactory *upb_msglayout_factory(const upb_msglayout *l);
         | 
| 6393 6537 |  | 
| 6394 | 
            -
             | 
| 6395 | 
            -
             | 
| 6396 | 
            -
             | 
| 6397 | 
            -
             | 
| 6398 | 
            -
             | 
| 6399 | 
            -
             | 
| 6400 | 
            -
             | 
| 6401 | 
            -
             | 
| 6402 | 
            -
            **
         | 
| 6403 | 
            -
            ** This is a mixed C/C++ interface that offers a full API to both languages.
         | 
| 6404 | 
            -
            ** See the top-level README for more information.
         | 
| 6405 | 
            -
            */
         | 
| 6538 | 
            +
            /* Get the msglayout for a submessage.  This requires that this field is a
         | 
| 6539 | 
            +
             * submessage, ie. upb_fielddef_issubmsg(upb_msglayout_msgdef(l)) == true.
         | 
| 6540 | 
            +
             *
         | 
| 6541 | 
            +
             * Since map entry messages don't have layouts, if upb_fielddef_ismap(f) == true
         | 
| 6542 | 
            +
             * then this function will return the layout for the map's value.  It requires
         | 
| 6543 | 
            +
             * that the value type of the map field is a submessage. */
         | 
| 6544 | 
            +
            const upb_msglayout *upb_msglayout_sublayout(const upb_msglayout *l,
         | 
| 6545 | 
            +
                                                         const upb_fielddef *f);
         | 
| 6406 6546 |  | 
| 6407 | 
            -
             | 
| 6408 | 
            -
             | 
| 6547 | 
            +
            /* Returns the msgdef for this msglayout. */
         | 
| 6548 | 
            +
            const upb_msgdef *upb_msglayout_msgdef(const upb_msglayout *l);
         | 
| 6409 6549 |  | 
| 6410 6550 |  | 
| 6411 | 
            -
             | 
| 6412 | 
            -
            #include <vector>
         | 
| 6413 | 
            -
            namespace upb { class SymbolTable; }
         | 
| 6414 | 
            -
            #endif
         | 
| 6551 | 
            +
            /** upb_visitor ***************************************************************/
         | 
| 6415 6552 |  | 
| 6416 | 
            -
             | 
| 6417 | 
            -
             | 
| 6553 | 
            +
            /* upb_visitor will visit all the fields of a message and its submessages.  It
         | 
| 6554 | 
            +
             * uses a upb_visitorplan which you can obtain from a upb_msgfactory. */
         | 
| 6418 6555 |  | 
| 6419 | 
            -
             | 
| 6420 | 
            -
              | 
| 6421 | 
            -
             | 
| 6422 | 
            -
              upb_deftype_t type;
         | 
| 6423 | 
            -
            } upb_symtab_iter;
         | 
| 6556 | 
            +
            upb_visitor *upb_visitor_create(upb_env *e, const upb_visitorplan *vp,
         | 
| 6557 | 
            +
                                            upb_sink *output);
         | 
| 6558 | 
            +
            bool upb_visitor_visitmsg(upb_visitor *v, const upb_msg *msg);
         | 
| 6424 6559 |  | 
| 6425 | 
            -
            #ifdef __cplusplus
         | 
| 6426 6560 |  | 
| 6427 | 
            -
             | 
| 6428 | 
            -
            class upb::SymbolTable {
         | 
| 6429 | 
            -
             public:
         | 
| 6430 | 
            -
              /* Returns a new symbol table with a single ref owned by "owner."
         | 
| 6431 | 
            -
               * Returns NULL if memory allocation failed. */
         | 
| 6432 | 
            -
              static reffed_ptr<SymbolTable> New();
         | 
| 6561 | 
            +
            /** upb_msgfactory ************************************************************/
         | 
| 6433 6562 |  | 
| 6434 | 
            -
             | 
| 6435 | 
            -
               | 
| 6563 | 
            +
            /* A upb_msgfactory contains a cache of upb_msglayout, upb_handlers, and
         | 
| 6564 | 
            +
             * upb_visitorplan objects.  These are the objects necessary to represent,
         | 
| 6565 | 
            +
             * populate, and and visit upb_msg objects.
         | 
| 6566 | 
            +
             *
         | 
| 6567 | 
            +
             * These caches are all populated by upb_msgdef, and lazily created on demand.
         | 
| 6568 | 
            +
             */
         | 
| 6436 6569 |  | 
| 6437 | 
            -
             | 
| 6438 | 
            -
             | 
| 6439 | 
            -
             | 
| 6570 | 
            +
            /* Creates and destroys a msgfactory, respectively.  The messages for this
         | 
| 6571 | 
            +
             * msgfactory must come from |symtab| (which should outlive the msgfactory). */
         | 
| 6572 | 
            +
            upb_msgfactory *upb_msgfactory_new(const upb_symtab *symtab);
         | 
| 6573 | 
            +
            void upb_msgfactory_free(upb_msgfactory *f);
         | 
| 6440 6574 |  | 
| 6441 | 
            -
             | 
| 6442 | 
            -
               * After the Freeze() operation is successful, the SymbolTable must only be
         | 
| 6443 | 
            -
               * accessed via a const pointer.
         | 
| 6444 | 
            -
               *
         | 
| 6445 | 
            -
               * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
         | 
| 6446 | 
            -
               * a necessary step in using a SymbolTable.  If you have no need for it to be
         | 
| 6447 | 
            -
               * immutable, there is no need to freeze it ever.  However sometimes it is
         | 
| 6448 | 
            -
               * useful, and SymbolTables that are statically compiled into the binary are
         | 
| 6449 | 
            -
               * always frozen by nature. */
         | 
| 6450 | 
            -
              void Freeze();
         | 
| 6575 | 
            +
            const upb_symtab *upb_msgfactory_symtab(const upb_msgfactory *f);
         | 
| 6451 6576 |  | 
| 6452 | 
            -
             | 
| 6453 | 
            -
             | 
| 6454 | 
            -
             | 
| 6455 | 
            -
             | 
| 6456 | 
            -
             | 
| 6457 | 
            -
             | 
| 6458 | 
            -
             | 
| 6459 | 
            -
             | 
| 6460 | 
            -
             | 
| 6461 | 
            -
             | 
| 6577 | 
            +
            /* The functions to get cached objects, lazily creating them on demand.  These
         | 
| 6578 | 
            +
             * all require:
         | 
| 6579 | 
            +
             *
         | 
| 6580 | 
            +
             * - m is in upb_msgfactory_symtab(f)
         | 
| 6581 | 
            +
             * - upb_msgdef_mapentry(m) == false (since map messages can't have layouts).
         | 
| 6582 | 
            +
             *
         | 
| 6583 | 
            +
             * The returned objects will live for as long as the msgfactory does.
         | 
| 6584 | 
            +
             *
         | 
| 6585 | 
            +
             * TODO(haberman): consider making this thread-safe and take a const
         | 
| 6586 | 
            +
             * upb_msgfactory. */
         | 
| 6587 | 
            +
            const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
         | 
| 6588 | 
            +
                                                          const upb_msgdef *m);
         | 
| 6589 | 
            +
            const upb_handlers *upb_msgfactory_getmergehandlers(upb_msgfactory *f,
         | 
| 6590 | 
            +
                                                                const upb_msgdef *m);
         | 
| 6591 | 
            +
            const upb_visitorplan *upb_msgfactory_getvisitorplan(upb_msgfactory *f,
         | 
| 6592 | 
            +
                                                                 const upb_handlers *h);
         | 
| 6462 6593 |  | 
| 6463 | 
            -
              /* Finds an entry in the symbol table with this exact name.  If not found,
         | 
| 6464 | 
            -
               * returns NULL. */
         | 
| 6465 | 
            -
              const Def* Lookup(const char *sym) const;
         | 
| 6466 | 
            -
              const MessageDef* LookupMessage(const char *sym) const;
         | 
| 6467 | 
            -
              const EnumDef* LookupEnum(const char *sym) const;
         | 
| 6468 6594 |  | 
| 6469 | 
            -
             | 
| 6470 | 
            -
               * you ask for an iterator of MessageDef the iterated elements are strongly
         | 
| 6471 | 
            -
               * typed as MessageDef*. */
         | 
| 6595 | 
            +
            /** upb_msgval ****************************************************************/
         | 
| 6472 6596 |  | 
| 6473 | 
            -
             | 
| 6474 | 
            -
             | 
| 6475 | 
            -
               * name may be in the list, but defs can replace existing defs in the symtab.
         | 
| 6476 | 
            -
               * All defs must have a name -- anonymous defs are not allowed.  Anonymous
         | 
| 6477 | 
            -
               * defs can still be frozen by calling upb_def_freeze() directly.
         | 
| 6478 | 
            -
               *
         | 
| 6479 | 
            -
               * Any existing defs that can reach defs that are being replaced will
         | 
| 6480 | 
            -
               * themselves be replaced also, so that the resulting set of defs is fully
         | 
| 6481 | 
            -
               * consistent.
         | 
| 6482 | 
            -
               *
         | 
| 6483 | 
            -
               * This logic implemented in this method is a convenience; ultimately it
         | 
| 6484 | 
            -
               * calls some combination of upb_fielddef_setsubdef(), upb_def_dup(), and
         | 
| 6485 | 
            -
               * upb_freeze(), any of which the client could call themself.  However, since
         | 
| 6486 | 
            -
               * the logic for doing so is nontrivial, we provide it here.
         | 
| 6487 | 
            -
               *
         | 
| 6488 | 
            -
               * The entire operation either succeeds or fails.  If the operation fails,
         | 
| 6489 | 
            -
               * the symtab is unchanged, false is returned, and status indicates the
         | 
| 6490 | 
            -
               * error.  The caller passes a ref on all defs to the symtab (even if the
         | 
| 6491 | 
            -
               * operation fails).
         | 
| 6492 | 
            -
               *
         | 
| 6493 | 
            -
               * TODO(haberman): currently failure will leave the symtab unchanged, but may
         | 
| 6494 | 
            -
               * leave the defs themselves partially resolved.  Does this matter?  If so we
         | 
| 6495 | 
            -
               * could do a prepass that ensures that all symbols are resolvable and bail
         | 
| 6496 | 
            -
               * if not, so we don't mutate anything until we know the operation will
         | 
| 6497 | 
            -
               * succeed.
         | 
| 6498 | 
            -
               *
         | 
| 6499 | 
            -
               * TODO(haberman): since the defs must be mutable, refining a frozen def
         | 
| 6500 | 
            -
               * requires making mutable copies of the entire tree.  This is wasteful if
         | 
| 6501 | 
            -
               * only a few messages are changing.  We may want to add a way of adding a
         | 
| 6502 | 
            -
               * tree of frozen defs to the symtab (perhaps an alternate constructor where
         | 
| 6503 | 
            -
               * you pass the root of the tree?) */
         | 
| 6504 | 
            -
              bool Add(Def*const* defs, size_t n, void* ref_donor, Status* status);
         | 
| 6597 | 
            +
            /* A union representing all possible protobuf values.  Used for generic get/set
         | 
| 6598 | 
            +
             * operations. */
         | 
| 6505 6599 |  | 
| 6506 | 
            -
             | 
| 6507 | 
            -
             | 
| 6600 | 
            +
            typedef union {
         | 
| 6601 | 
            +
              bool b;
         | 
| 6602 | 
            +
              float flt;
         | 
| 6603 | 
            +
              double dbl;
         | 
| 6604 | 
            +
              int32_t i32;
         | 
| 6605 | 
            +
              int64_t i64;
         | 
| 6606 | 
            +
              uint32_t u32;
         | 
| 6607 | 
            +
              uint64_t u64;
         | 
| 6608 | 
            +
              const upb_map* map;
         | 
| 6609 | 
            +
              const upb_msg* msg;
         | 
| 6610 | 
            +
              const upb_array* arr;
         | 
| 6611 | 
            +
              const void* ptr;
         | 
| 6612 | 
            +
              struct {
         | 
| 6613 | 
            +
                const char *ptr;
         | 
| 6614 | 
            +
                size_t len;
         | 
| 6615 | 
            +
              } str;
         | 
| 6616 | 
            +
            } upb_msgval;
         | 
| 6617 | 
            +
             | 
| 6618 | 
            +
            #define ACCESSORS(name, membername, ctype) \
         | 
| 6619 | 
            +
              UPB_INLINE ctype upb_msgval_get ## name(upb_msgval v) { \
         | 
| 6620 | 
            +
                return v.membername; \
         | 
| 6621 | 
            +
              } \
         | 
| 6622 | 
            +
              UPB_INLINE void upb_msgval_set ## name(upb_msgval *v, ctype cval) { \
         | 
| 6623 | 
            +
                v->membername = cval; \
         | 
| 6624 | 
            +
              } \
         | 
| 6625 | 
            +
              UPB_INLINE upb_msgval upb_msgval_ ## name(ctype v) { \
         | 
| 6626 | 
            +
                upb_msgval ret; \
         | 
| 6627 | 
            +
                ret.membername = v; \
         | 
| 6628 | 
            +
                return ret; \
         | 
| 6508 6629 | 
             
              }
         | 
| 6509 6630 |  | 
| 6510 | 
            -
             | 
| 6511 | 
            -
             | 
| 6512 | 
            -
             | 
| 6513 | 
            -
             | 
| 6631 | 
            +
            ACCESSORS(bool,   b,   bool)
         | 
| 6632 | 
            +
            ACCESSORS(float,  flt, float)
         | 
| 6633 | 
            +
            ACCESSORS(double, dbl, double)
         | 
| 6634 | 
            +
            ACCESSORS(int32,  i32, int32_t)
         | 
| 6635 | 
            +
            ACCESSORS(int64,  i64, int64_t)
         | 
| 6636 | 
            +
            ACCESSORS(uint32, u32, uint32_t)
         | 
| 6637 | 
            +
            ACCESSORS(uint64, u64, uint64_t)
         | 
| 6638 | 
            +
            ACCESSORS(map,    map, const upb_map*)
         | 
| 6639 | 
            +
            ACCESSORS(msg,    msg, const upb_msg*)
         | 
| 6640 | 
            +
            ACCESSORS(ptr,    ptr, const void*)
         | 
| 6641 | 
            +
            ACCESSORS(arr,    arr, const upb_array*)
         | 
| 6642 | 
            +
             | 
| 6643 | 
            +
            #undef ACCESSORS
         | 
| 6644 | 
            +
             | 
| 6645 | 
            +
            UPB_INLINE upb_msgval upb_msgval_str(const char *ptr, size_t len) {
         | 
| 6646 | 
            +
              upb_msgval ret;
         | 
| 6647 | 
            +
              ret.str.ptr = ptr;
         | 
| 6648 | 
            +
              ret.str.len = len;
         | 
| 6649 | 
            +
              return ret;
         | 
| 6650 | 
            +
            }
         | 
| 6514 6651 |  | 
| 6515 | 
            -
              | 
| 6516 | 
            -
               | 
| 6517 | 
            -
            } | 
| 6652 | 
            +
            UPB_INLINE const char* upb_msgval_getstr(upb_msgval val) {
         | 
| 6653 | 
            +
              return val.str.ptr;
         | 
| 6654 | 
            +
            }
         | 
| 6518 6655 |  | 
| 6519 | 
            -
             | 
| 6656 | 
            +
            UPB_INLINE size_t upb_msgval_getstrlen(upb_msgval val) {
         | 
| 6657 | 
            +
              return val.str.len;
         | 
| 6658 | 
            +
            }
         | 
| 6520 6659 |  | 
| 6521 | 
            -
            UPB_BEGIN_EXTERN_C
         | 
| 6522 6660 |  | 
| 6523 | 
            -
             | 
| 6661 | 
            +
            /** upb_msg *******************************************************************/
         | 
| 6524 6662 |  | 
| 6525 | 
            -
            /*  | 
| 6526 | 
            -
             | 
| 6663 | 
            +
            /* A upb_msg represents a protobuf message.  It always corresponds to a specific
         | 
| 6664 | 
            +
             * upb_msglayout, which describes how it is laid out in memory.
         | 
| 6665 | 
            +
             *
         | 
| 6666 | 
            +
             * The message will have a fixed size, as returned by upb_msg_sizeof(), which
         | 
| 6667 | 
            +
             * will be used to store fixed-length fields.  The upb_msg may also allocate
         | 
| 6668 | 
            +
             * dynamic memory internally to store data such as:
         | 
| 6669 | 
            +
             *
         | 
| 6670 | 
            +
             * - extensions
         | 
| 6671 | 
            +
             * - unknown fields
         | 
| 6672 | 
            +
             */
         | 
| 6527 6673 |  | 
| 6528 | 
            -
             | 
| 6529 | 
            -
             | 
| 6530 | 
            -
            const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
         | 
| 6531 | 
            -
                                              const char *sym);
         | 
| 6532 | 
            -
            const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
         | 
| 6533 | 
            -
            const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
         | 
| 6534 | 
            -
            const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
         | 
| 6535 | 
            -
            bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, size_t n,
         | 
| 6536 | 
            -
                                void *ref_donor, upb_status *status);
         | 
| 6537 | 
            -
            bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status* status);
         | 
| 6674 | 
            +
            /* Returns the size of a message given this layout. */
         | 
| 6675 | 
            +
            size_t upb_msg_sizeof(const upb_msglayout *l);
         | 
| 6538 6676 |  | 
| 6539 | 
            -
            /*  | 
| 6540 | 
            -
             *  | 
| 6541 | 
            -
             * | 
| 6542 | 
            -
             * | 
| 6543 | 
            -
             *    // ...
         | 
| 6544 | 
            -
             * }
         | 
| 6677 | 
            +
            /* upb_msg_init() / upb_msg_uninit() allow the user to use a pre-allocated
         | 
| 6678 | 
            +
             * block of memory as a message.  The block's size should be upb_msg_sizeof().
         | 
| 6679 | 
            +
             * upb_msg_uninit() must be called to release internally-allocated memory
         | 
| 6680 | 
            +
             * unless the allocator is an arena that does not require freeing.
         | 
| 6545 6681 | 
             
             *
         | 
| 6546 | 
            -
             *  | 
| 6547 | 
            -
             *  | 
| 6548 | 
            -
             *  | 
| 6549 | 
            -
            void  | 
| 6550 | 
            -
             | 
| 6551 | 
            -
             | 
| 6552 | 
            -
             | 
| 6553 | 
            -
             | 
| 6682 | 
            +
             * Please note that upb_msg_uninit() does *not* free any submessages, maps,
         | 
| 6683 | 
            +
             * or arrays referred to by this message's fields.  You must free them manually
         | 
| 6684 | 
            +
             * yourself. */
         | 
| 6685 | 
            +
            void upb_msg_init(upb_msg *msg, const upb_msglayout *l, upb_alloc *a);
         | 
| 6686 | 
            +
            void upb_msg_uninit(upb_msg *msg, const upb_msglayout *l);
         | 
| 6687 | 
            +
             | 
| 6688 | 
            +
            /* Like upb_msg_init() / upb_msg_uninit(), except the message's memory is
         | 
| 6689 | 
            +
             * allocated / freed from the given upb_alloc. */
         | 
| 6690 | 
            +
            upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a);
         | 
| 6691 | 
            +
            void upb_msg_free(upb_msg *msg, const upb_msglayout *l);
         | 
| 6692 | 
            +
             | 
| 6693 | 
            +
            /* Returns the upb_alloc for the given message. */
         | 
| 6694 | 
            +
            upb_alloc *upb_msg_alloc(const upb_msg *msg, const upb_msglayout *l);
         | 
| 6695 | 
            +
             | 
| 6696 | 
            +
            /* Packs the tree of messages rooted at "msg" into a single hunk of memory,
         | 
| 6697 | 
            +
             * allocated from the given allocator. */
         | 
| 6698 | 
            +
            void *upb_msg_pack(const upb_msg *msg, const upb_msglayout *l,
         | 
| 6699 | 
            +
                               void *p, size_t *ofs, size_t size);
         | 
| 6700 | 
            +
             | 
| 6701 | 
            +
            /* Read-only message API.  Can be safely called by anyone. */
         | 
| 6702 | 
            +
             | 
| 6703 | 
            +
            /* Returns the value associated with this field:
         | 
| 6704 | 
            +
             *   - for scalar fields (including strings), the value directly.
         | 
| 6705 | 
            +
             *   - return upb_msg*, or upb_map* for msg/map.
         | 
| 6706 | 
            +
             *     If the field is unset for these field types, returns NULL.
         | 
| 6707 | 
            +
             *
         | 
| 6708 | 
            +
             * TODO(haberman): should we let users store cached array/map/msg
         | 
| 6709 | 
            +
             * pointers here for fields that are unset?  Could be useful for the
         | 
| 6710 | 
            +
             * strongly-owned submessage model (ie. generated C API that doesn't use
         | 
| 6711 | 
            +
             * arenas).
         | 
| 6712 | 
            +
             */
         | 
| 6713 | 
            +
            upb_msgval upb_msg_get(const upb_msg *msg,
         | 
| 6714 | 
            +
                                   const upb_fielddef *f,
         | 
| 6715 | 
            +
                                   const upb_msglayout *l);
         | 
| 6554 6716 |  | 
| 6555 | 
            -
             | 
| 6717 | 
            +
            /* May only be called for fields where upb_fielddef_haspresence(f) == true. */
         | 
| 6718 | 
            +
            bool upb_msg_has(const upb_msg *msg,
         | 
| 6719 | 
            +
                             const upb_fielddef *f,
         | 
| 6720 | 
            +
                             const upb_msglayout *l);
         | 
| 6556 6721 |  | 
| 6557 | 
            -
             | 
| 6558 | 
            -
             | 
| 6559 | 
            -
             | 
| 6560 | 
            -
             | 
| 6561 | 
            -
              upb_symtab *s = upb_symtab_new(&s);
         | 
| 6562 | 
            -
              return reffed_ptr<SymbolTable>(s, &s);
         | 
| 6563 | 
            -
            }
         | 
| 6722 | 
            +
            /* Returns NULL if no field in the oneof is set. */
         | 
| 6723 | 
            +
            const upb_fielddef *upb_msg_getoneofcase(const upb_msg *msg,
         | 
| 6724 | 
            +
                                                     const upb_oneofdef *o,
         | 
| 6725 | 
            +
                                                     const upb_msglayout *l);
         | 
| 6564 6726 |  | 
| 6565 | 
            -
             | 
| 6566 | 
            -
             | 
| 6567 | 
            -
             | 
| 6568 | 
            -
             | 
| 6569 | 
            -
             | 
| 6570 | 
            -
             | 
| 6571 | 
            -
             | 
| 6572 | 
            -
             | 
| 6573 | 
            -
             | 
| 6574 | 
            -
             | 
| 6575 | 
            -
             | 
| 6576 | 
            -
             | 
| 6577 | 
            -
             | 
| 6578 | 
            -
             | 
| 6579 | 
            -
             | 
| 6580 | 
            -
             | 
| 6581 | 
            -
             | 
| 6582 | 
            -
             | 
| 6583 | 
            -
             | 
| 6584 | 
            -
             | 
| 6585 | 
            -
             | 
| 6586 | 
            -
             | 
| 6727 | 
            +
            /* Returns true if any field in the oneof is set. */
         | 
| 6728 | 
            +
            bool upb_msg_hasoneof(const upb_msg *msg,
         | 
| 6729 | 
            +
                                  const upb_oneofdef *o,
         | 
| 6730 | 
            +
                                  const upb_msglayout *l);
         | 
| 6731 | 
            +
             | 
| 6732 | 
            +
             | 
| 6733 | 
            +
            /* Mutable message API.  May only be called by the owner of the message who
         | 
| 6734 | 
            +
             * knows its ownership scheme and how to keep it consistent. */
         | 
| 6735 | 
            +
             | 
| 6736 | 
            +
            /* Sets the given field to the given value.  Does not perform any memory
         | 
| 6737 | 
            +
             * management: if you overwrite a pointer to a msg/array/map/string without
         | 
| 6738 | 
            +
             * cleaning it up (or using an arena) it will leak.
         | 
| 6739 | 
            +
             */
         | 
| 6740 | 
            +
            bool upb_msg_set(upb_msg *msg,
         | 
| 6741 | 
            +
                             const upb_fielddef *f,
         | 
| 6742 | 
            +
                             upb_msgval val,
         | 
| 6743 | 
            +
                             const upb_msglayout *l);
         | 
| 6744 | 
            +
             | 
| 6745 | 
            +
            /* For a primitive field, set it back to its default. For repeated, string, and
         | 
| 6746 | 
            +
             * submessage fields set it back to NULL.  This could involve releasing some
         | 
| 6747 | 
            +
             * internal memory (for example, from an extension dictionary), but it is not
         | 
| 6748 | 
            +
             * recursive in any way and will not recover any memory that may be used by
         | 
| 6749 | 
            +
             * arrays/maps/strings/msgs that this field may have pointed to.
         | 
| 6750 | 
            +
             */
         | 
| 6751 | 
            +
            bool upb_msg_clearfield(upb_msg *msg,
         | 
| 6752 | 
            +
                                    const upb_fielddef *f,
         | 
| 6753 | 
            +
                                    const upb_msglayout *l);
         | 
| 6754 | 
            +
             | 
| 6755 | 
            +
            /* Clears all fields in the oneof such that none of them are set. */
         | 
| 6756 | 
            +
            bool upb_msg_clearoneof(upb_msg *msg,
         | 
| 6757 | 
            +
                                    const upb_oneofdef *o,
         | 
| 6758 | 
            +
                                    const upb_msglayout *l);
         | 
| 6759 | 
            +
             | 
| 6760 | 
            +
            /* TODO(haberman): copyfrom()/mergefrom()? */
         | 
| 6761 | 
            +
             | 
| 6762 | 
            +
             | 
| 6763 | 
            +
            /** upb_array *****************************************************************/
         | 
| 6764 | 
            +
             | 
| 6765 | 
            +
            /* A upb_array stores data for a repeated field.  The memory management
         | 
| 6766 | 
            +
             * semantics are the same as upb_msg.  A upb_array allocates dynamic
         | 
| 6767 | 
            +
             * memory internally for the array elements. */
         | 
| 6768 | 
            +
             | 
| 6769 | 
            +
            size_t upb_array_sizeof(upb_fieldtype_t type);
         | 
| 6770 | 
            +
            void upb_array_init(upb_array *arr, upb_fieldtype_t type, upb_alloc *a);
         | 
| 6771 | 
            +
            void upb_array_uninit(upb_array *arr);
         | 
| 6772 | 
            +
            upb_array *upb_array_new(upb_fieldtype_t type, upb_alloc *a);
         | 
| 6773 | 
            +
            void upb_array_free(upb_array *arr);
         | 
| 6774 | 
            +
             | 
| 6775 | 
            +
            /* Read-only interface.  Safe for anyone to call. */
         | 
| 6776 | 
            +
             | 
| 6777 | 
            +
            size_t upb_array_size(const upb_array *arr);
         | 
| 6778 | 
            +
            upb_fieldtype_t upb_array_type(const upb_array *arr);
         | 
| 6779 | 
            +
            upb_msgval upb_array_get(const upb_array *arr, size_t i);
         | 
| 6780 | 
            +
             | 
| 6781 | 
            +
            /* Write interface.  May only be called by the message's owner who can enforce
         | 
| 6782 | 
            +
             * its memory management invariants. */
         | 
| 6783 | 
            +
             | 
| 6784 | 
            +
            bool upb_array_set(upb_array *arr, size_t i, upb_msgval val);
         | 
| 6785 | 
            +
             | 
| 6786 | 
            +
             | 
| 6787 | 
            +
            /** upb_map *******************************************************************/
         | 
| 6788 | 
            +
             | 
| 6789 | 
            +
            /* A upb_map stores data for a map field.  The memory management semantics are
         | 
| 6790 | 
            +
             * the same as upb_msg, with one notable exception.  upb_map will internally
         | 
| 6791 | 
            +
             * store a copy of all string keys, but *not* any string values or submessages.
         | 
| 6792 | 
            +
             * So you must ensure that any string or message values outlive the map, and you
         | 
| 6793 | 
            +
             * must delete them manually when they are no longer required. */
         | 
| 6794 | 
            +
             | 
| 6795 | 
            +
            size_t upb_map_sizeof(upb_fieldtype_t ktype, upb_fieldtype_t vtype);
         | 
| 6796 | 
            +
            bool upb_map_init(upb_map *map, upb_fieldtype_t ktype, upb_fieldtype_t vtype,
         | 
| 6797 | 
            +
                              upb_alloc *a);
         | 
| 6798 | 
            +
            void upb_map_uninit(upb_map *map);
         | 
| 6799 | 
            +
            upb_map *upb_map_new(upb_fieldtype_t ktype, upb_fieldtype_t vtype, upb_alloc *a);
         | 
| 6800 | 
            +
            void upb_map_free(upb_map *map);
         | 
| 6801 | 
            +
             | 
| 6802 | 
            +
            /* Read-only interface.  Safe for anyone to call. */
         | 
| 6803 | 
            +
             | 
| 6804 | 
            +
            size_t upb_map_size(const upb_map *map);
         | 
| 6805 | 
            +
            upb_fieldtype_t upb_map_keytype(const upb_map *map);
         | 
| 6806 | 
            +
            upb_fieldtype_t upb_map_valuetype(const upb_map *map);
         | 
| 6807 | 
            +
            bool upb_map_get(const upb_map *map, upb_msgval key, upb_msgval *val);
         | 
| 6808 | 
            +
             | 
| 6809 | 
            +
            /* Write interface.  May only be called by the message's owner who can enforce
         | 
| 6810 | 
            +
             * its memory management invariants. */
         | 
| 6811 | 
            +
             | 
| 6812 | 
            +
            /* Sets or overwrites an entry in the map.  Return value indicates whether
         | 
| 6813 | 
            +
             * the operation succeeded or failed with OOM, and also whether an existing
         | 
| 6814 | 
            +
             * key was replaced or not. */
         | 
| 6815 | 
            +
            bool upb_map_set(upb_map *map,
         | 
| 6816 | 
            +
                             upb_msgval key, upb_msgval val,
         | 
| 6817 | 
            +
                             upb_msgval *valremoved);
         | 
| 6818 | 
            +
             | 
| 6819 | 
            +
            /* Deletes an entry in the map.  Returns true if the key was present. */
         | 
| 6820 | 
            +
            bool upb_map_del(upb_map *map, upb_msgval key);
         | 
| 6821 | 
            +
             | 
| 6822 | 
            +
             | 
| 6823 | 
            +
            /** upb_mapiter ***************************************************************/
         | 
| 6824 | 
            +
             | 
| 6825 | 
            +
            /* For iterating over a map.  Map iterators are invalidated by mutations to the
         | 
| 6826 | 
            +
             * map, but an invalidated iterator will never return junk or crash the process.
         | 
| 6827 | 
            +
             * An invalidated iterator may return entries that were already returned though,
         | 
| 6828 | 
            +
             * and if you keep invalidating the iterator during iteration, the program may
         | 
| 6829 | 
            +
             * enter an infinite loop. */
         | 
| 6830 | 
            +
             | 
| 6831 | 
            +
            size_t upb_mapiter_sizeof();
         | 
| 6832 | 
            +
             | 
| 6833 | 
            +
            void upb_mapiter_begin(upb_mapiter *i, const upb_map *t);
         | 
| 6834 | 
            +
            upb_mapiter *upb_mapiter_new(const upb_map *t, upb_alloc *a);
         | 
| 6835 | 
            +
            void upb_mapiter_free(upb_mapiter *i, upb_alloc *a);
         | 
| 6836 | 
            +
            void upb_mapiter_next(upb_mapiter *i);
         | 
| 6837 | 
            +
            bool upb_mapiter_done(const upb_mapiter *i);
         | 
| 6838 | 
            +
             | 
| 6839 | 
            +
            upb_msgval upb_mapiter_key(const upb_mapiter *i);
         | 
| 6840 | 
            +
            upb_msgval upb_mapiter_value(const upb_mapiter *i);
         | 
| 6841 | 
            +
            void upb_mapiter_setdone(upb_mapiter *i);
         | 
| 6842 | 
            +
            bool upb_mapiter_isequal(const upb_mapiter *i1, const upb_mapiter *i2);
         | 
| 6843 | 
            +
             | 
| 6844 | 
            +
             | 
| 6845 | 
            +
            /** Handlers ******************************************************************/
         | 
| 6846 | 
            +
             | 
| 6847 | 
            +
            /* These are the handlers used internally by upb_msgfactory_getmergehandlers().
         | 
| 6848 | 
            +
             * They write scalar data to a known offset from the message pointer.
         | 
| 6849 | 
            +
             *
         | 
| 6850 | 
            +
             * These would be trivial for anyone to implement themselves, but it's better
         | 
| 6851 | 
            +
             * to use these because some JITs will recognize and specialize these instead
         | 
| 6852 | 
            +
             * of actually calling the function. */
         | 
| 6853 | 
            +
             | 
| 6854 | 
            +
            /* Sets a handler for the given primitive field that will write the data at the
         | 
| 6855 | 
            +
             * given offset.  If hasbit > 0, also sets a hasbit at the given bit offset
         | 
| 6856 | 
            +
             * (addressing each byte low to high). */
         | 
| 6857 | 
            +
            bool upb_msg_setscalarhandler(upb_handlers *h,
         | 
| 6858 | 
            +
                                          const upb_fielddef *f,
         | 
| 6859 | 
            +
                                          size_t offset,
         | 
| 6860 | 
            +
                                          int32_t hasbit);
         | 
| 6861 | 
            +
             | 
| 6862 | 
            +
            /* If the given handler is a msghandlers_primitive field, returns true and sets
         | 
| 6863 | 
            +
             * *type, *offset and *hasbit.  Otherwise returns false. */
         | 
| 6864 | 
            +
            bool upb_msg_getscalarhandlerdata(const upb_handlers *h,
         | 
| 6865 | 
            +
                                              upb_selector_t s,
         | 
| 6866 | 
            +
                                              upb_fieldtype_t *type,
         | 
| 6867 | 
            +
                                              size_t *offset,
         | 
| 6868 | 
            +
                                              int32_t *hasbit);
         | 
| 6869 | 
            +
             | 
| 6870 | 
            +
            UPB_END_EXTERN_C
         | 
| 6587 6871 |  | 
| 6588 | 
            -
            #endif | 
| 6872 | 
            +
            #endif /* UPB_MSG_H_ */
         | 
| 6589 6873 | 
             
            /*
         | 
| 6590 6874 | 
             
            ** upb::descriptor::Reader (upb_descreader)
         | 
| 6591 6875 | 
             
            **
         | 
| @@ -6853,111 +7137,111 @@ UPB_INLINE bool upbdefs_google_protobuf_FileOptions_OptimizeMode_is(const upb_en | |
| 6853 7137 |  | 
| 6854 7138 |  | 
| 6855 7139 | 
             
            /* Functions to get a fielddef from a msgdef reference. */
         | 
| 6856 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_end(const upb_msgdef *m) {  | 
| 6857 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_start(const upb_msgdef *m) {  | 
| 6858 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_end(const upb_msgdef *m) {  | 
| 6859 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_start(const upb_msgdef *m) {  | 
| 6860 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_enum_type(const upb_msgdef *m) {  | 
| 6861 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension(const upb_msgdef *m) {  | 
| 6862 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension_range(const upb_msgdef *m) {  | 
| 6863 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_field(const upb_msgdef *m) {  | 
| 6864 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6865 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_nested_type(const upb_msgdef *m) {  | 
| 6866 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_oneof_decl(const upb_msgdef *m) {  | 
| 6867 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6868 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_name(const upb_msgdef *m) {  | 
| 6869 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_range(const upb_msgdef *m) {  | 
| 6870 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6871 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6872 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_value(const upb_msgdef *m) {  | 
| 6873 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_allow_alias(const upb_msgdef *m) {  | 
| 6874 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6875 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6876 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6877 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_number(const upb_msgdef *m) {  | 
| 6878 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6879 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6880 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6881 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_default_value(const upb_msgdef *m) {  | 
| 6882 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_extendee(const upb_msgdef *m) {  | 
| 6883 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_json_name(const upb_msgdef *m) {  | 
| 6884 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_label(const upb_msgdef *m) {  | 
| 6885 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6886 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_number(const upb_msgdef *m) {  | 
| 6887 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_oneof_index(const upb_msgdef *m) {  | 
| 6888 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6889 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type(const upb_msgdef *m) {  | 
| 6890 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type_name(const upb_msgdef *m) {  | 
| 6891 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_ctype(const upb_msgdef *m) {  | 
| 6892 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6893 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_jstype(const upb_msgdef *m) {  | 
| 6894 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_lazy(const upb_msgdef *m) {  | 
| 6895 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_packed(const upb_msgdef *m) {  | 
| 6896 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6897 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_weak(const upb_msgdef *m) {  | 
| 6898 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_dependency(const upb_msgdef *m) {  | 
| 6899 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_enum_type(const upb_msgdef *m) {  | 
| 6900 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_extension(const upb_msgdef *m) {  | 
| 6901 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_message_type(const upb_msgdef *m) {  | 
| 6902 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6903 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6904 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_package(const upb_msgdef *m) {  | 
| 6905 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_public_dependency(const upb_msgdef *m) {  | 
| 6906 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_service(const upb_msgdef *m) {  | 
| 6907 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_source_code_info(const upb_msgdef *m) {  | 
| 6908 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_syntax(const upb_msgdef *m) {  | 
| 6909 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_weak_dependency(const upb_msgdef *m) {  | 
| 6910 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_f_file(const upb_msgdef *m) {  | 
| 6911 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_enable_arenas(const upb_msgdef *m) {  | 
| 6912 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_generic_services(const upb_msgdef *m) {  | 
| 6913 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_csharp_namespace(const upb_msgdef *m) {  | 
| 6914 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6915 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_go_package(const upb_msgdef *m) {  | 
| 6916 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generate_equals_and_hash(const upb_msgdef *m) {  | 
| 6917 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generic_services(const upb_msgdef *m) {  | 
| 6918 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_multiple_files(const upb_msgdef *m) {  | 
| 6919 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_outer_classname(const upb_msgdef *m) {  | 
| 6920 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_package(const upb_msgdef *m) {  | 
| 6921 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_string_check_utf8(const upb_msgdef *m) {  | 
| 6922 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_javanano_use_deprecated_package(const upb_msgdef *m) {  | 
| 6923 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_objc_class_prefix(const upb_msgdef *m) {  | 
| 6924 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_optimize_for(const upb_msgdef *m) {  | 
| 6925 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_py_generic_services(const upb_msgdef *m) {  | 
| 6926 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6927 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6928 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_map_entry(const upb_msgdef *m) {  | 
| 6929 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_message_set_wire_format(const upb_msgdef *m) {  | 
| 6930 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_no_standard_descriptor_accessor(const upb_msgdef *m) {  | 
| 6931 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6932 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_client_streaming(const upb_msgdef *m) {  | 
| 6933 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_input_type(const upb_msgdef *m) {  | 
| 6934 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6935 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6936 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_output_type(const upb_msgdef *m) {  | 
| 6937 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_server_streaming(const upb_msgdef *m) {  | 
| 6938 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6939 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6940 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_OneofDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6941 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_method(const upb_msgdef *m) {  | 
| 6942 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_name(const upb_msgdef *m) {  | 
| 6943 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_options(const upb_msgdef *m) {  | 
| 6944 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_deprecated(const upb_msgdef *m) {  | 
| 6945 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_uninterpreted_option(const upb_msgdef *m) {  | 
| 6946 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_comments(const upb_msgdef *m) {  | 
| 6947 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_detached_comments(const upb_msgdef *m) {  | 
| 6948 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_path(const upb_msgdef *m) {  | 
| 6949 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_span(const upb_msgdef *m) {  | 
| 6950 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_trailing_comments(const upb_msgdef *m) {  | 
| 6951 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_f_location(const upb_msgdef *m) {  | 
| 6952 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_is_extension(const upb_msgdef *m) {  | 
| 6953 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_name_part(const upb_msgdef *m) {  | 
| 6954 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_aggregate_value(const upb_msgdef *m) {  | 
| 6955 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_double_value(const upb_msgdef *m) {  | 
| 6956 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_identifier_value(const upb_msgdef *m) {  | 
| 6957 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_name(const upb_msgdef *m) {  | 
| 6958 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_negative_int_value(const upb_msgdef *m) {  | 
| 6959 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_positive_int_value(const upb_msgdef *m) {  | 
| 6960 | 
            -
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_string_value(const upb_msgdef *m) {  | 
| 7140 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_end(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7141 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_f_start(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7142 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_end(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7143 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ReservedRange_f_start(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7144 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_enum_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
         | 
| 7145 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7146 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_extension_range(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
         | 
| 7147 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_field(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7148 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7149 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_nested_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7150 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_oneof_decl(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
         | 
| 7151 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
         | 
| 7152 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
         | 
| 7153 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_f_reserved_range(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
         | 
| 7154 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7155 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7156 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_f_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7157 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_allow_alias(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7158 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7159 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7160 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7161 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_number(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7162 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7163 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7164 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7165 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_default_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
         | 
| 7166 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_extendee(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7167 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_json_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
         | 
| 7168 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_label(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
         | 
| 7169 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7170 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_number(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7171 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_oneof_index(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
         | 
| 7172 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
         | 
| 7173 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
         | 
| 7174 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_f_type_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7175 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_ctype(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7176 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7177 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_jstype(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7178 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_lazy(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 5); }
         | 
| 7179 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_packed(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7180 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7181 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_f_weak(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m)); return upb_msgdef_itof(m, 10); }
         | 
| 7182 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7183 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_enum_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
         | 
| 7184 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 7); }
         | 
| 7185 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_message_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
         | 
| 7186 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7187 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 8); }
         | 
| 7188 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7189 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_public_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 10); }
         | 
| 7190 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_service(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7191 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_source_code_info(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 9); }
         | 
| 7192 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_syntax(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 12); }
         | 
| 7193 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_f_weak_dependency(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m)); return upb_msgdef_itof(m, 11); }
         | 
| 7194 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_f_file(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorSet_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7195 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_enable_arenas(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 31); }
         | 
| 7196 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_cc_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 16); }
         | 
| 7197 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_csharp_namespace(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 37); }
         | 
| 7198 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 23); }
         | 
| 7199 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_go_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 11); }
         | 
| 7200 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generate_equals_and_hash(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 20); }
         | 
| 7201 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 17); }
         | 
| 7202 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_multiple_files(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 10); }
         | 
| 7203 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_outer_classname(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 8); }
         | 
| 7204 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7205 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_java_string_check_utf8(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 27); }
         | 
| 7206 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_javanano_use_deprecated_package(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 38); }
         | 
| 7207 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_objc_class_prefix(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 36); }
         | 
| 7208 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_optimize_for(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 9); }
         | 
| 7209 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_py_generic_services(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 18); }
         | 
| 7210 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7211 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7212 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_map_entry(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 7); }
         | 
| 7213 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_message_set_wire_format(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7214 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_no_standard_descriptor_accessor(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7215 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7216 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_client_streaming(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 5); }
         | 
| 7217 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_input_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7218 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7219 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 4); }
         | 
| 7220 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_output_type(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7221 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_f_server_streaming(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7222 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 33); }
         | 
| 7223 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7224 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_OneofDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_OneofDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7225 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_method(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7226 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7227 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_f_options(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7228 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_deprecated(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 33); }
         | 
| 7229 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_f_uninterpreted_option(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m)); return upb_msgdef_itof(m, 999); }
         | 
| 7230 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7231 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_leading_detached_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7232 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_path(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7233 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_span(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7234 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_f_trailing_comments(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m)); return upb_msgdef_itof(m, 4); }
         | 
| 7235 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_f_location(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7236 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_is_extension(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7237 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_f_name_part(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m)); return upb_msgdef_itof(m, 1); }
         | 
| 7238 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_aggregate_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 8); }
         | 
| 7239 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_double_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 6); }
         | 
| 7240 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_identifier_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 3); }
         | 
| 7241 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_name(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 2); }
         | 
| 7242 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_negative_int_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 5); }
         | 
| 7243 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_positive_int_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 4); }
         | 
| 7244 | 
            +
            UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_f_string_value(const upb_msgdef *m) { UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m)); return upb_msgdef_itof(m, 7); }
         | 
| 6961 7245 |  | 
| 6962 7246 | 
             
            UPB_END_EXTERN_C
         | 
| 6963 7247 |  | 
| @@ -6971,7 +7255,7 @@ class DescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 6971 7255 | 
             
             public:
         | 
| 6972 7256 | 
             
              DescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 6973 7257 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 6974 | 
            -
                 | 
| 7258 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_is(m));
         | 
| 6975 7259 | 
             
              }
         | 
| 6976 7260 |  | 
| 6977 7261 | 
             
              static DescriptorProto get() {
         | 
| @@ -6983,7 +7267,7 @@ class DescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 6983 7267 | 
             
               public:
         | 
| 6984 7268 | 
             
                ExtensionRange(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 6985 7269 | 
             
                    : reffed_ptr(m, ref_donor) {
         | 
| 6986 | 
            -
                   | 
| 7270 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ExtensionRange_is(m));
         | 
| 6987 7271 | 
             
                }
         | 
| 6988 7272 |  | 
| 6989 7273 | 
             
                static ExtensionRange get() {
         | 
| @@ -6996,7 +7280,7 @@ class DescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 6996 7280 | 
             
               public:
         | 
| 6997 7281 | 
             
                ReservedRange(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 6998 7282 | 
             
                    : reffed_ptr(m, ref_donor) {
         | 
| 6999 | 
            -
                   | 
| 7283 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_DescriptorProto_ReservedRange_is(m));
         | 
| 7000 7284 | 
             
                }
         | 
| 7001 7285 |  | 
| 7002 7286 | 
             
                static ReservedRange get() {
         | 
| @@ -7010,7 +7294,7 @@ class EnumDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7010 7294 | 
             
             public:
         | 
| 7011 7295 | 
             
              EnumDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7012 7296 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7013 | 
            -
                 | 
| 7297 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_EnumDescriptorProto_is(m));
         | 
| 7014 7298 | 
             
              }
         | 
| 7015 7299 |  | 
| 7016 7300 | 
             
              static EnumDescriptorProto get() {
         | 
| @@ -7023,7 +7307,7 @@ class EnumOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7023 7307 | 
             
             public:
         | 
| 7024 7308 | 
             
              EnumOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7025 7309 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7026 | 
            -
                 | 
| 7310 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_EnumOptions_is(m));
         | 
| 7027 7311 | 
             
              }
         | 
| 7028 7312 |  | 
| 7029 7313 | 
             
              static EnumOptions get() {
         | 
| @@ -7036,7 +7320,7 @@ class EnumValueDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDe | |
| 7036 7320 | 
             
             public:
         | 
| 7037 7321 | 
             
              EnumValueDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7038 7322 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7039 | 
            -
                 | 
| 7323 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_EnumValueDescriptorProto_is(m));
         | 
| 7040 7324 | 
             
              }
         | 
| 7041 7325 |  | 
| 7042 7326 | 
             
              static EnumValueDescriptorProto get() {
         | 
| @@ -7049,7 +7333,7 @@ class EnumValueOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7049 7333 | 
             
             public:
         | 
| 7050 7334 | 
             
              EnumValueOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7051 7335 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7052 | 
            -
                 | 
| 7336 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_EnumValueOptions_is(m));
         | 
| 7053 7337 | 
             
              }
         | 
| 7054 7338 |  | 
| 7055 7339 | 
             
              static EnumValueOptions get() {
         | 
| @@ -7062,7 +7346,7 @@ class FieldDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7062 7346 | 
             
             public:
         | 
| 7063 7347 | 
             
              FieldDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7064 7348 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7065 | 
            -
                 | 
| 7349 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_is(m));
         | 
| 7066 7350 | 
             
              }
         | 
| 7067 7351 |  | 
| 7068 7352 | 
             
              static FieldDescriptorProto get() {
         | 
| @@ -7074,7 +7358,7 @@ class FieldDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7074 7358 | 
             
               public:
         | 
| 7075 7359 | 
             
                Label(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         | 
| 7076 7360 | 
             
                    : reffed_ptr(e, ref_donor) {
         | 
| 7077 | 
            -
                   | 
| 7361 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_Label_is(e));
         | 
| 7078 7362 | 
             
                }
         | 
| 7079 7363 | 
             
                static Label get() {
         | 
| 7080 7364 | 
             
                  const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldDescriptorProto_Label_get(&e);
         | 
| @@ -7086,7 +7370,7 @@ class FieldDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7086 7370 | 
             
               public:
         | 
| 7087 7371 | 
             
                Type(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         | 
| 7088 7372 | 
             
                    : reffed_ptr(e, ref_donor) {
         | 
| 7089 | 
            -
                   | 
| 7373 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_FieldDescriptorProto_Type_is(e));
         | 
| 7090 7374 | 
             
                }
         | 
| 7091 7375 | 
             
                static Type get() {
         | 
| 7092 7376 | 
             
                  const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldDescriptorProto_Type_get(&e);
         | 
| @@ -7099,7 +7383,7 @@ class FieldOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7099 7383 | 
             
             public:
         | 
| 7100 7384 | 
             
              FieldOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7101 7385 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7102 | 
            -
                 | 
| 7386 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_is(m));
         | 
| 7103 7387 | 
             
              }
         | 
| 7104 7388 |  | 
| 7105 7389 | 
             
              static FieldOptions get() {
         | 
| @@ -7111,7 +7395,7 @@ class FieldOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7111 7395 | 
             
               public:
         | 
| 7112 7396 | 
             
                CType(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         | 
| 7113 7397 | 
             
                    : reffed_ptr(e, ref_donor) {
         | 
| 7114 | 
            -
                   | 
| 7398 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_CType_is(e));
         | 
| 7115 7399 | 
             
                }
         | 
| 7116 7400 | 
             
                static CType get() {
         | 
| 7117 7401 | 
             
                  const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldOptions_CType_get(&e);
         | 
| @@ -7123,7 +7407,7 @@ class FieldOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7123 7407 | 
             
               public:
         | 
| 7124 7408 | 
             
                JSType(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         | 
| 7125 7409 | 
             
                    : reffed_ptr(e, ref_donor) {
         | 
| 7126 | 
            -
                   | 
| 7410 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_FieldOptions_JSType_is(e));
         | 
| 7127 7411 | 
             
                }
         | 
| 7128 7412 | 
             
                static JSType get() {
         | 
| 7129 7413 | 
             
                  const ::upb::EnumDef* e = upbdefs_google_protobuf_FieldOptions_JSType_get(&e);
         | 
| @@ -7136,7 +7420,7 @@ class FileDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7136 7420 | 
             
             public:
         | 
| 7137 7421 | 
             
              FileDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7138 7422 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7139 | 
            -
                 | 
| 7423 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorProto_is(m));
         | 
| 7140 7424 | 
             
              }
         | 
| 7141 7425 |  | 
| 7142 7426 | 
             
              static FileDescriptorProto get() {
         | 
| @@ -7149,7 +7433,7 @@ class FileDescriptorSet : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7149 7433 | 
             
             public:
         | 
| 7150 7434 | 
             
              FileDescriptorSet(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7151 7435 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7152 | 
            -
                 | 
| 7436 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_FileDescriptorSet_is(m));
         | 
| 7153 7437 | 
             
              }
         | 
| 7154 7438 |  | 
| 7155 7439 | 
             
              static FileDescriptorSet get() {
         | 
| @@ -7162,7 +7446,7 @@ class FileOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7162 7446 | 
             
             public:
         | 
| 7163 7447 | 
             
              FileOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7164 7448 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7165 | 
            -
                 | 
| 7449 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_FileOptions_is(m));
         | 
| 7166 7450 | 
             
              }
         | 
| 7167 7451 |  | 
| 7168 7452 | 
             
              static FileOptions get() {
         | 
| @@ -7174,7 +7458,7 @@ class FileOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7174 7458 | 
             
               public:
         | 
| 7175 7459 | 
             
                OptimizeMode(const ::upb::EnumDef* e, const void *ref_donor = NULL)
         | 
| 7176 7460 | 
             
                    : reffed_ptr(e, ref_donor) {
         | 
| 7177 | 
            -
                   | 
| 7461 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_FileOptions_OptimizeMode_is(e));
         | 
| 7178 7462 | 
             
                }
         | 
| 7179 7463 | 
             
                static OptimizeMode get() {
         | 
| 7180 7464 | 
             
                  const ::upb::EnumDef* e = upbdefs_google_protobuf_FileOptions_OptimizeMode_get(&e);
         | 
| @@ -7187,7 +7471,7 @@ class MessageOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7187 7471 | 
             
             public:
         | 
| 7188 7472 | 
             
              MessageOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7189 7473 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7190 | 
            -
                 | 
| 7474 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_MessageOptions_is(m));
         | 
| 7191 7475 | 
             
              }
         | 
| 7192 7476 |  | 
| 7193 7477 | 
             
              static MessageOptions get() {
         | 
| @@ -7200,7 +7484,7 @@ class MethodDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> | |
| 7200 7484 | 
             
             public:
         | 
| 7201 7485 | 
             
              MethodDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7202 7486 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7203 | 
            -
                 | 
| 7487 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_MethodDescriptorProto_is(m));
         | 
| 7204 7488 | 
             
              }
         | 
| 7205 7489 |  | 
| 7206 7490 | 
             
              static MethodDescriptorProto get() {
         | 
| @@ -7213,7 +7497,7 @@ class MethodOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7213 7497 | 
             
             public:
         | 
| 7214 7498 | 
             
              MethodOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7215 7499 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7216 | 
            -
                 | 
| 7500 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_MethodOptions_is(m));
         | 
| 7217 7501 | 
             
              }
         | 
| 7218 7502 |  | 
| 7219 7503 | 
             
              static MethodOptions get() {
         | 
| @@ -7226,7 +7510,7 @@ class OneofDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7226 7510 | 
             
             public:
         | 
| 7227 7511 | 
             
              OneofDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7228 7512 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7229 | 
            -
                 | 
| 7513 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_OneofDescriptorProto_is(m));
         | 
| 7230 7514 | 
             
              }
         | 
| 7231 7515 |  | 
| 7232 7516 | 
             
              static OneofDescriptorProto get() {
         | 
| @@ -7239,7 +7523,7 @@ class ServiceDescriptorProto : public ::upb::reffed_ptr<const ::upb::MessageDef> | |
| 7239 7523 | 
             
             public:
         | 
| 7240 7524 | 
             
              ServiceDescriptorProto(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7241 7525 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7242 | 
            -
                 | 
| 7526 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_ServiceDescriptorProto_is(m));
         | 
| 7243 7527 | 
             
              }
         | 
| 7244 7528 |  | 
| 7245 7529 | 
             
              static ServiceDescriptorProto get() {
         | 
| @@ -7252,7 +7536,7 @@ class ServiceOptions : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7252 7536 | 
             
             public:
         | 
| 7253 7537 | 
             
              ServiceOptions(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7254 7538 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7255 | 
            -
                 | 
| 7539 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_ServiceOptions_is(m));
         | 
| 7256 7540 | 
             
              }
         | 
| 7257 7541 |  | 
| 7258 7542 | 
             
              static ServiceOptions get() {
         | 
| @@ -7265,7 +7549,7 @@ class SourceCodeInfo : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7265 7549 | 
             
             public:
         | 
| 7266 7550 | 
             
              SourceCodeInfo(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7267 7551 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7268 | 
            -
                 | 
| 7552 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_is(m));
         | 
| 7269 7553 | 
             
              }
         | 
| 7270 7554 |  | 
| 7271 7555 | 
             
              static SourceCodeInfo get() {
         | 
| @@ -7277,7 +7561,7 @@ class SourceCodeInfo : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7277 7561 | 
             
               public:
         | 
| 7278 7562 | 
             
                Location(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7279 7563 | 
             
                    : reffed_ptr(m, ref_donor) {
         | 
| 7280 | 
            -
                   | 
| 7564 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_SourceCodeInfo_Location_is(m));
         | 
| 7281 7565 | 
             
                }
         | 
| 7282 7566 |  | 
| 7283 7567 | 
             
                static Location get() {
         | 
| @@ -7291,7 +7575,7 @@ class UninterpretedOption : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7291 7575 | 
             
             public:
         | 
| 7292 7576 | 
             
              UninterpretedOption(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7293 7577 | 
             
                  : reffed_ptr(m, ref_donor) {
         | 
| 7294 | 
            -
                 | 
| 7578 | 
            +
                UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_is(m));
         | 
| 7295 7579 | 
             
              }
         | 
| 7296 7580 |  | 
| 7297 7581 | 
             
              static UninterpretedOption get() {
         | 
| @@ -7303,7 +7587,7 @@ class UninterpretedOption : public ::upb::reffed_ptr<const ::upb::MessageDef> { | |
| 7303 7587 | 
             
               public:
         | 
| 7304 7588 | 
             
                NamePart(const ::upb::MessageDef* m, const void *ref_donor = NULL)
         | 
| 7305 7589 | 
             
                    : reffed_ptr(m, ref_donor) {
         | 
| 7306 | 
            -
                   | 
| 7590 | 
            +
                  UPB_ASSERT(upbdefs_google_protobuf_UninterpretedOption_NamePart_is(m));
         | 
| 7307 7591 | 
             
                }
         | 
| 7308 7592 |  | 
| 7309 7593 | 
             
                static NamePart get() {
         | 
| @@ -8112,9 +8396,9 @@ UPB_INLINE uint64_t upb_vencode32(uint32_t val) { | |
| 8112 8396 | 
             
              char buf[UPB_PB_VARINT_MAX_LEN];
         | 
| 8113 8397 | 
             
              size_t bytes = upb_vencode64(val, buf);
         | 
| 8114 8398 | 
             
              uint64_t ret = 0;
         | 
| 8115 | 
            -
               | 
| 8399 | 
            +
              UPB_ASSERT(bytes <= 5);
         | 
| 8116 8400 | 
             
              memcpy(&ret, buf, bytes);
         | 
| 8117 | 
            -
               | 
| 8401 | 
            +
              UPB_ASSERT(ret <= 0xffffffffffU);
         | 
| 8118 8402 | 
             
              return ret;
         | 
| 8119 8403 | 
             
            }
         | 
| 8120 8404 |  |