diff --git a/ruby/ext/google/protobuf_c/extconf.rb b/ruby/ext/google/protobuf_c/extconf.rb
index 74203b0..9675f57 100644
--- a/ruby/ext/google/protobuf_c/extconf.rb
+++ b/ruby/ext/google/protobuf_c/extconf.rb
@@ -2,9 +2,7 @@
 
 require 'mkmf'
 
-$CFLAGS += " -O3 -std=c99 -Wno-unused-function " +
-           "-Wno-declaration-after-statement -Wno-unused-variable " +
-           "-Wno-sign-compare -DNDEBUG "
+$CFLAGS += " -O3 -DNDEBUG"
 
 $objs = ["protobuf.o", "defs.o", "storage.o", "message.o",
          "repeated_field.o", "map.o", "encode_decode.o", "upb.o"]
diff --git a/ruby/ext/google/protobuf_c/map.c b/ruby/ext/google/protobuf_c/map.c
index 12e7a9d..3436e09 100644
--- a/ruby/ext/google/protobuf_c/map.c
+++ b/ruby/ext/google/protobuf_c/map.c
@@ -120,7 +120,7 @@
 }
 
 static void* value_memory(upb_value* v) {
-  return (void*)(&v->val.uint64);
+  return (void*)(&v->val);
 }
 
 // -----------------------------------------------------------------------------
diff --git a/ruby/ext/google/protobuf_c/upb.c b/ruby/ext/google/protobuf_c/upb.c
index 55a99cf..f50ff6a 100644
--- a/ruby/ext/google/protobuf_c/upb.c
+++ b/ruby/ext/google/protobuf_c/upb.c
@@ -13,7 +13,7 @@
 
 typedef struct {
   size_t len;
-  char str[1];  // Null-terminated string data follows.
+  char str[1];  /* Null-terminated string data follows. */
 } str_t;
 
 static str_t *newstr(const char *data, size_t len) {
@@ -27,7 +27,7 @@
 
 static void freestr(str_t *s) { free(s); }
 
-// isalpha() etc. from <ctype.h> are locale-dependent, which we don't want.
+/* isalpha() etc. from <ctype.h> are locale-dependent, which we don't want. */
 static bool upb_isbetween(char c, char low, char high) {
   return c >= low && c <= high;
 }
@@ -42,7 +42,8 @@
 
 static bool upb_isident(const char *str, size_t len, bool full, upb_status *s) {
   bool start = true;
-  for (size_t i = 0; i < len; i++) {
+  size_t i;
+  for (i = 0; i < len; i++) {
     char c = str[i];
     if (c == '.') {
       if (start || !full) {
@@ -87,39 +88,22 @@
 upb_def *upb_def_dup(const upb_def *def, const void *o) {
   switch (def->type) {
     case UPB_DEF_MSG:
-      return UPB_UPCAST(upb_msgdef_dup(upb_downcast_msgdef(def), o));
+      return upb_msgdef_upcast_mutable(
+          upb_msgdef_dup(upb_downcast_msgdef(def), o));
     case UPB_DEF_FIELD:
-      return UPB_UPCAST(upb_fielddef_dup(upb_downcast_fielddef(def), o));
+      return upb_fielddef_upcast_mutable(
+          upb_fielddef_dup(upb_downcast_fielddef(def), o));
     case UPB_DEF_ENUM:
-      return UPB_UPCAST(upb_enumdef_dup(upb_downcast_enumdef(def), o));
+      return upb_enumdef_upcast_mutable(
+          upb_enumdef_dup(upb_downcast_enumdef(def), o));
     default: assert(false); return NULL;
   }
 }
 
-bool upb_def_isfrozen(const upb_def *def) {
-  return upb_refcounted_isfrozen(UPB_UPCAST(def));
-}
-
-void upb_def_ref(const upb_def *def, const void *owner) {
-  upb_refcounted_ref(UPB_UPCAST(def), owner);
-}
-
-void upb_def_unref(const upb_def *def, const void *owner) {
-  upb_refcounted_unref(UPB_UPCAST(def), owner);
-}
-
-void upb_def_donateref(const upb_def *def, const void *from, const void *to) {
-  upb_refcounted_donateref(UPB_UPCAST(def), from, to);
-}
-
-void upb_def_checkref(const upb_def *def, const void *owner) {
-  upb_refcounted_checkref(UPB_UPCAST(def), owner);
-}
-
 static bool upb_def_init(upb_def *def, upb_deftype_t type,
                          const struct upb_refcounted_vtbl *vtbl,
                          const void *owner) {
-  if (!upb_refcounted_init(UPB_UPCAST(def), vtbl, owner)) return false;
+  if (!upb_refcounted_init(upb_def_upcast_mutable(def), vtbl, owner)) return false;
   def->type = type;
   def->fullname = NULL;
   def->came_from_user = false;
@@ -131,7 +115,7 @@
 }
 
 static const char *msgdef_name(const upb_msgdef *m) {
-  const char *name = upb_def_fullname(UPB_UPCAST(m));
+  const char *name = upb_def_fullname(upb_msgdef_upcast(m));
   return name ? name : "(anonymous)";
 }
 
@@ -154,13 +138,15 @@
   }
 
   if (upb_fielddef_hassubdef(f)) {
+    const upb_def *subdef;
+
     if (f->subdef_is_symbolic) {
       upb_status_seterrf(s, "field '%s.%s' has not been resolved",
                          msgdef_name(f->msg.def), upb_fielddef_name(f));
       return false;
     }
 
-    const upb_def *subdef = upb_fielddef_subdef(f);
+    subdef = upb_fielddef_subdef(f);
     if (subdef == NULL) {
       upb_status_seterrf(s, "field %s.%s is missing required subdef",
                          msgdef_name(f->msg.def), upb_fielddef_name(f));
@@ -179,14 +165,14 @@
     bool has_default_name = upb_fielddef_enumhasdefaultstr(f);
     bool has_default_number = upb_fielddef_enumhasdefaultint32(f);
 
-    // Previously verified by upb_validate_enumdef().
+    /* Previously verified by upb_validate_enumdef(). */
     assert(upb_enumdef_numvals(upb_fielddef_enumsubdef(f)) > 0);
 
-    // We've already validated that we have an associated enumdef and that it
-    // has at least one member, so at least one of these should be true.
-    // Because if the user didn't set anything, we'll pick up the enum's
-    // default, but if the user *did* set something we should at least pick up
-    // the one they set (int32 or string).
+    /* We've already validated that we have an associated enumdef and that it
+     * has at least one member, so at least one of these should be true.
+     * Because if the user didn't set anything, we'll pick up the enum's
+     * default, but if the user *did* set something we should at least pick up
+     * the one they set (int32 or string). */
     assert(has_default_name || has_default_number);
 
     if (!has_default_name) {
@@ -205,13 +191,13 @@
       return false;
     }
 
-    // Lift the effective numeric default into the field's default slot, in case
-    // we were only getting it "by reference" from the enumdef.
+    /* Lift the effective numeric default into the field's default slot, in case
+     * we were only getting it "by reference" from the enumdef. */
     upb_fielddef_setdefaultint32(f, upb_fielddef_defaultint32(f));
   }
 
-  // Ensure that MapEntry submessages only appear as repeated fields, not
-  // optional/required (singular) fields.
+  /* Ensure that MapEntry submessages only appear as repeated fields, not
+   * optional/required (singular) fields. */
   if (upb_fielddef_type(f) == UPB_TYPE_MESSAGE &&
       upb_fielddef_msgsubdef(f) != NULL) {
     const upb_msgdef *subdef = upb_fielddef_msgsubdef(f);
@@ -238,8 +224,8 @@
   return true;
 }
 
-// All submessage fields are lower than all other fields.
-// Secondly, fields are increasing in order.
+/* All submessage fields are lower than all other fields.
+ * Secondly, fields are increasing in order. */
 uint32_t field_rank(const upb_fielddef *f) {
   uint32_t ret = upb_fielddef_number(f);
   const uint32_t high_bit = 1 << 30;
@@ -256,14 +242,15 @@
 }
 
 static bool assign_msg_indices(upb_msgdef *m, upb_status *s) {
-  // Sort fields.  upb internally relies on UPB_TYPE_MESSAGE fields having the
-  // lowest indexes, but we do not publicly guarantee this.
+  /* Sort fields.  upb internally relies on UPB_TYPE_MESSAGE fields having the
+   * lowest indexes, but we do not publicly guarantee this. */
+  upb_msg_field_iter j;
+  int i;
+  uint32_t selector;
   int n = upb_msgdef_numfields(m);
   upb_fielddef **fields = malloc(n * sizeof(*fields));
   if (!fields) return false;
 
-  upb_msg_field_iter j;
-  int i;
   m->submsg_field_count = 0;
   for(i = 0, upb_msg_field_begin(&j, m);
       !upb_msg_field_done(&j);
@@ -282,7 +269,7 @@
 
   qsort(fields, n, sizeof(*fields), cmp_fields);
 
-  uint32_t selector = UPB_STATIC_SELECTOR_COUNT + m->submsg_field_count;
+  selector = UPB_STATIC_SELECTOR_COUNT + m->submsg_field_count;
   for (i = 0; i < n; i++) {
     upb_fielddef *f = fields[i];
     f->index_ = i;
@@ -292,38 +279,42 @@
   m->selector_count = selector;
 
 #ifndef NDEBUG
-  // Verify that all selectors for the message are distinct.
-  //
+  {
+    /* Verify that all selectors for the message are distinct. */
 #define TRY(type) \
-  if (upb_handlers_getselector(f, type, &sel)) upb_inttable_insert(&t, sel, v);
+    if (upb_handlers_getselector(f, type, &sel)) upb_inttable_insert(&t, sel, v);
 
-  upb_inttable t;
-  upb_inttable_init(&t, UPB_CTYPE_BOOL);
-  upb_value v = upb_value_bool(true);
-  upb_selector_t sel;
-  upb_inttable_insert(&t, UPB_STARTMSG_SELECTOR, v);
-  upb_inttable_insert(&t, UPB_ENDMSG_SELECTOR, v);
-  for(upb_msg_field_begin(&j, m);
-      !upb_msg_field_done(&j);
-      upb_msg_field_next(&j)) {
-    upb_fielddef *f = upb_msg_iter_field(&j);
-    // These calls will assert-fail in upb_table if the value already exists.
-    TRY(UPB_HANDLER_INT32);
-    TRY(UPB_HANDLER_INT64)
-    TRY(UPB_HANDLER_UINT32)
-    TRY(UPB_HANDLER_UINT64)
-    TRY(UPB_HANDLER_FLOAT)
-    TRY(UPB_HANDLER_DOUBLE)
-    TRY(UPB_HANDLER_BOOL)
-    TRY(UPB_HANDLER_STARTSTR)
-    TRY(UPB_HANDLER_STRING)
-    TRY(UPB_HANDLER_ENDSTR)
-    TRY(UPB_HANDLER_STARTSUBMSG)
-    TRY(UPB_HANDLER_ENDSUBMSG)
-    TRY(UPB_HANDLER_STARTSEQ)
-    TRY(UPB_HANDLER_ENDSEQ)
+    upb_inttable t;
+    upb_value v;
+    upb_selector_t sel;
+
+    upb_inttable_init(&t, UPB_CTYPE_BOOL);
+    v = upb_value_bool(true);
+    upb_inttable_insert(&t, UPB_STARTMSG_SELECTOR, v);
+    upb_inttable_insert(&t, UPB_ENDMSG_SELECTOR, v);
+    for(upb_msg_field_begin(&j, m);
+        !upb_msg_field_done(&j);
+        upb_msg_field_next(&j)) {
+      upb_fielddef *f = upb_msg_iter_field(&j);
+      /* These calls will assert-fail in upb_table if the value already
+       * exists. */
+      TRY(UPB_HANDLER_INT32);
+      TRY(UPB_HANDLER_INT64)
+      TRY(UPB_HANDLER_UINT32)
+      TRY(UPB_HANDLER_UINT64)
+      TRY(UPB_HANDLER_FLOAT)
+      TRY(UPB_HANDLER_DOUBLE)
+      TRY(UPB_HANDLER_BOOL)
+      TRY(UPB_HANDLER_STARTSTR)
+      TRY(UPB_HANDLER_STRING)
+      TRY(UPB_HANDLER_ENDSTR)
+      TRY(UPB_HANDLER_STARTSUBMSG)
+      TRY(UPB_HANDLER_ENDSUBMSG)
+      TRY(UPB_HANDLER_STARTSEQ)
+      TRY(UPB_HANDLER_ENDSEQ)
+    }
+    upb_inttable_uninit(&t);
   }
-  upb_inttable_uninit(&t);
 #undef TRY
 #endif
 
@@ -332,14 +323,17 @@
 }
 
 bool upb_def_freeze(upb_def *const* defs, int n, upb_status *s) {
+  int i;
+  int maxdepth;
+  bool ret;
   upb_status_clear(s);
 
-  // First perform validation, in two passes so we can check that we have a
-  // transitive closure without needing to search.
-  for (int i = 0; i < n; i++) {
+  /* First perform validation, in two passes so we can check that we have a
+   * transitive closure without needing to search. */
+  for (i = 0; i < n; i++) {
     upb_def *def = defs[i];
     if (upb_def_isfrozen(def)) {
-      // Could relax this requirement if it's annoying.
+      /* Could relax this requirement if it's annoying. */
       upb_status_seterrmsg(s, "def is already frozen");
       goto err;
     } else if (def->type == UPB_DEF_FIELD) {
@@ -350,14 +344,14 @@
         goto err;
       }
     } else {
-      // Set now to detect transitive closure in the second pass.
+      /* Set now to detect transitive closure in the second pass. */
       def->came_from_user = true;
     }
   }
 
-  // Second pass of validation.  Also assign selector bases and indexes, and
-  // compact tables.
-  for (int i = 0; i < n; i++) {
+  /* Second pass of validation.  Also assign selector bases and indexes, and
+   * compact tables. */
+  for (i = 0; i < n; i++) {
     upb_msgdef *m = upb_dyncast_msgdef_mutable(defs[i]);
     upb_enumdef *e = upb_dyncast_enumdef_mutable(defs[i]);
     if (m) {
@@ -370,17 +364,17 @@
     }
   }
 
-  // Def graph contains FieldDefs between each MessageDef, so double the limit.
-  int maxdepth = UPB_MAX_MESSAGE_DEPTH * 2;
+  /* Def graph contains FieldDefs between each MessageDef, so double the
+   * limit. */
+  maxdepth = UPB_MAX_MESSAGE_DEPTH * 2;
 
-  // Validation all passed; freeze the defs.
-  bool ret =
-      upb_refcounted_freeze((upb_refcounted * const *)defs, n, s, maxdepth);
+  /* Validation all passed; freeze the defs. */
+  ret = upb_refcounted_freeze((upb_refcounted * const *)defs, n, s, maxdepth);
   assert(!(s && ret != upb_ok(s)));
   return ret;
 
 err:
-  for (int i = 0; i < n; i++) {
+  for (i = 0; i < n; i++) {
     defs[i]->came_from_user = false;
   }
   assert(!(s && upb_ok(s)));
@@ -395,12 +389,12 @@
   upb_inttable_iter i;
   upb_inttable_begin(&i, &e->iton);
   for( ; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    // To clean up the upb_strdup() from upb_enumdef_addval().
+    /* To clean up the upb_strdup() from upb_enumdef_addval(). */
     free(upb_value_getcstr(upb_inttable_iter_value(&i)));
   }
   upb_strtable_uninit(&e->ntoi);
   upb_inttable_uninit(&e->iton);
-  upb_def_uninit(UPB_UPCAST(e));
+  upb_def_uninit(upb_enumdef_upcast_mutable(e));
   free(e);
 }
 
@@ -408,7 +402,8 @@
   static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_enumdef_free};
   upb_enumdef *e = malloc(sizeof(*e));
   if (!e) return NULL;
-  if (!upb_def_init(UPB_UPCAST(e), UPB_DEF_ENUM, &vtbl, owner)) goto err2;
+  if (!upb_def_init(upb_enumdef_upcast_mutable(e), UPB_DEF_ENUM, &vtbl, owner))
+    goto err2;
   if (!upb_strtable_init(&e->ntoi, UPB_CTYPE_INT32)) goto err2;
   if (!upb_inttable_init(&e->iton, UPB_CTYPE_CSTR)) goto err1;
   return e;
@@ -421,9 +416,9 @@
 }
 
 upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner) {
+  upb_enum_iter i;
   upb_enumdef *new_e = upb_enumdef_new(owner);
   if (!new_e) return NULL;
-  upb_enum_iter i;
   for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) {
     bool success = upb_enumdef_addval(
         new_e, upb_enum_iter_name(&i),upb_enum_iter_number(&i), NULL);
@@ -435,39 +430,18 @@
   return new_e;
 }
 
-bool upb_enumdef_isfrozen(const upb_enumdef *e) {
-  return upb_def_isfrozen(UPB_UPCAST(e));
-}
-
-void upb_enumdef_ref(const upb_enumdef *e, const void *owner) {
-  upb_def_ref(UPB_UPCAST(e), owner);
-}
-
-void upb_enumdef_unref(const upb_enumdef *e, const void *owner) {
-  upb_def_unref(UPB_UPCAST(e), owner);
-}
-
-void upb_enumdef_donateref(
-    const upb_enumdef *e, const void *from, const void *to) {
-  upb_def_donateref(UPB_UPCAST(e), from, to);
-}
-
-void upb_enumdef_checkref(const upb_enumdef *e, const void *owner) {
-  upb_def_checkref(UPB_UPCAST(e), owner);
-}
-
 bool upb_enumdef_freeze(upb_enumdef *e, upb_status *status) {
-  upb_def *d = UPB_UPCAST(e);
+  upb_def *d = upb_enumdef_upcast_mutable(e);
   return upb_def_freeze(&d, 1, status);
 }
 
 const char *upb_enumdef_fullname(const upb_enumdef *e) {
-  return upb_def_fullname(UPB_UPCAST(e));
+  return upb_def_fullname(upb_enumdef_upcast(e));
 }
 
 bool upb_enumdef_setfullname(upb_enumdef *e, const char *fullname,
                              upb_status *s) {
-  return upb_def_setfullname(UPB_UPCAST(e), fullname, s);
+  return upb_def_setfullname(upb_enumdef_upcast_mutable(e), fullname, s);
 }
 
 bool upb_enumdef_addval(upb_enumdef *e, const char *name, int32_t num,
@@ -516,7 +490,7 @@
 }
 
 void upb_enum_begin(upb_enum_iter *i, const upb_enumdef *e) {
-  // We iterate over the ntoi table, to account for duplicate numbers.
+  /* We iterate over the ntoi table, to account for duplicate numbers. */
   upb_strtable_begin(i, &e->ntoi);
 }
 
@@ -561,13 +535,13 @@
                        void *closure) {
   const upb_fielddef *f = (const upb_fielddef*)r;
   if (upb_fielddef_containingtype(f)) {
-    visit(r, UPB_UPCAST2(upb_fielddef_containingtype(f)), closure);
+    visit(r, upb_msgdef_upcast2(upb_fielddef_containingtype(f)), closure);
   }
   if (upb_fielddef_containingoneof(f)) {
-    visit(r, UPB_UPCAST2(upb_fielddef_containingoneof(f)), closure);
+    visit(r, upb_oneofdef_upcast2(upb_fielddef_containingoneof(f)), closure);
   }
   if (upb_fielddef_subdef(f)) {
-    visit(r, UPB_UPCAST(upb_fielddef_subdef(f)), closure);
+    visit(r, upb_def_upcast(upb_fielddef_subdef(f)), closure);
   }
 }
 
@@ -576,26 +550,27 @@
   upb_fielddef_uninit_default(f);
   if (f->subdef_is_symbolic)
     free(f->sub.name);
-  upb_def_uninit(UPB_UPCAST(f));
+  upb_def_uninit(upb_fielddef_upcast_mutable(f));
   free(f);
 }
 
 static const char *enumdefaultstr(const upb_fielddef *f) {
+  const upb_enumdef *e;
   assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
-  const upb_enumdef *e = upb_fielddef_enumsubdef(f);
+  e = upb_fielddef_enumsubdef(f);
   if (f->default_is_string && f->defaultval.bytes) {
-    // Default was explicitly set as a string.
+    /* Default was explicitly set as a string. */
     str_t *s = f->defaultval.bytes;
     return s->str;
   } else if (e) {
     if (!f->default_is_string) {
-      // Default was explicitly set as an integer; look it up in enumdef.
+      /* Default was explicitly set as an integer; look it up in enumdef. */
       const char *name = upb_enumdef_iton(e, f->defaultval.sint);
       if (name) {
         return name;
       }
     } else {
-      // Default is completely unset; pull enumdef default.
+      /* Default is completely unset; pull enumdef default. */
       if (upb_enumdef_numvals(e) > 0) {
         const char *name = upb_enumdef_iton(e, upb_enumdef_default(e));
         assert(name);
@@ -607,21 +582,22 @@
 }
 
 static bool enumdefaultint32(const upb_fielddef *f, int32_t *val) {
+  const upb_enumdef *e;
   assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
-  const upb_enumdef *e = upb_fielddef_enumsubdef(f);
+  e = upb_fielddef_enumsubdef(f);
   if (!f->default_is_string) {
-    // Default was explicitly set as an integer.
+    /* Default was explicitly set as an integer. */
     *val = f->defaultval.sint;
     return true;
   } else if (e) {
     if (f->defaultval.bytes) {
-      // Default was explicitly set as a str; try to lookup corresponding int.
+      /* Default was explicitly set as a str; try to lookup corresponding int. */
       str_t *s = f->defaultval.bytes;
       if (upb_enumdef_ntoiz(e, s->str, val)) {
         return true;
       }
     } else {
-      // Default is unset; try to pull in enumdef default.
+      /* Default is unset; try to pull in enumdef default. */
       if (upb_enumdef_numvals(e) > 0) {
         *val = upb_enumdef_default(e);
         return true;
@@ -631,11 +607,11 @@
   return false;
 }
 
-upb_fielddef *upb_fielddef_new(const void *owner) {
+upb_fielddef *upb_fielddef_new(const void *o) {
   static const struct upb_refcounted_vtbl vtbl = {visitfield, freefield};
   upb_fielddef *f = malloc(sizeof(*f));
   if (!f) return NULL;
-  if (!upb_def_init(UPB_UPCAST(f), UPB_DEF_FIELD, &vtbl, owner)) {
+  if (!upb_def_init(upb_fielddef_upcast_mutable(f), UPB_DEF_FIELD, &vtbl, o)) {
     free(f);
     return NULL;
   }
@@ -653,19 +629,20 @@
   f->lazy_ = false;
   f->packed_ = true;
 
-  // For the moment we default this to UPB_INTFMT_VARIABLE, since it will work
-  // with all integer types and is in some since more "default" since the most
-  // normal-looking proto2 types int32/int64/uint32/uint64 use variable.
-  //
-  // Other options to consider:
-  // - there is no default; users must set this manually (like type).
-  // - default signed integers to UPB_INTFMT_ZIGZAG, since it's more likely to
-  //   be an optimal default for signed integers.
+  /* For the moment we default this to UPB_INTFMT_VARIABLE, since it will work
+   * with all integer types and is in some since more "default" since the most
+   * normal-looking proto2 types int32/int64/uint32/uint64 use variable.
+   *
+   * Other options to consider:
+   * - there is no default; users must set this manually (like type).
+   * - default signed integers to UPB_INTFMT_ZIGZAG, since it's more likely to
+   *   be an optimal default for signed integers. */
   f->intfmt = UPB_INTFMT_VARIABLE;
   return f;
 }
 
 upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner) {
+  const char *srcname;
   upb_fielddef *newf = upb_fielddef_new(owner);
   if (!newf) return NULL;
   upb_fielddef_settype(newf, upb_fielddef_type(f));
@@ -680,9 +657,8 @@
     newf->defaultval = f->defaultval;
   }
 
-  const char *srcname;
   if (f->subdef_is_symbolic) {
-    srcname = f->sub.name;  // Might be NULL.
+    srcname = f->sub.name;  /* Might be NULL. */
   } else {
     srcname = f->sub.def ? upb_def_fullname(f->sub.def) : NULL;
   }
@@ -701,27 +677,6 @@
   return newf;
 }
 
-bool upb_fielddef_isfrozen(const upb_fielddef *f) {
-  return upb_def_isfrozen(UPB_UPCAST(f));
-}
-
-void upb_fielddef_ref(const upb_fielddef *f, const void *owner) {
-  upb_def_ref(UPB_UPCAST(f), owner);
-}
-
-void upb_fielddef_unref(const upb_fielddef *f, const void *owner) {
-  upb_def_unref(UPB_UPCAST(f), owner);
-}
-
-void upb_fielddef_donateref(
-    const upb_fielddef *f, const void *from, const void *to) {
-  upb_def_donateref(UPB_UPCAST(f), from, to);
-}
-
-void upb_fielddef_checkref(const upb_fielddef *f, const void *owner) {
-  upb_def_checkref(UPB_UPCAST(f), owner);
-}
-
 bool upb_fielddef_typeisset(const upb_fielddef *f) {
   return f->type_is_set_;
 }
@@ -764,7 +719,7 @@
 }
 
 const char *upb_fielddef_name(const upb_fielddef *f) {
-  return upb_def_fullname(UPB_UPCAST(f));
+  return upb_def_fullname(upb_fielddef_upcast(f));
 }
 
 const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f) {
@@ -794,8 +749,8 @@
     upb_status_seterrmsg(s, "field has already been added to a message.");
     return false;
   }
-  // TODO: validate name (upb_isident() doesn't quite work atm because this name
-  // may have a leading ".").
+  /* TODO: validate name (upb_isident() doesn't quite work atm because this name
+   * may have a leading "."). */
   release_containingtype(f);
   f->msg.name = upb_strdup(name);
   f->msg_is_symbolic = true;
@@ -807,7 +762,7 @@
     upb_status_seterrmsg(s, "Already added to message or oneof");
     return false;
   }
-  return upb_def_setfullname(UPB_UPCAST(f), name, s);
+  return upb_def_setfullname(upb_fielddef_upcast_mutable(f), name, s);
 }
 
 static void chkdefaulttype(const upb_fielddef *f, upb_fieldtype_t type) {
@@ -867,7 +822,7 @@
   if (upb_fielddef_type(f) == UPB_TYPE_ENUM) {
     const char *ret = enumdefaultstr(f);
     assert(ret);
-    // Enum defaults can't have embedded NULLs.
+    /* Enum defaults can't have embedded NULLs. */
     if (len) *len = strlen(ret);
     return ret;
   }
@@ -898,7 +853,7 @@
       break;
     case UPB_TYPE_MESSAGE: break;
     case UPB_TYPE_ENUM:
-      // This is our special sentinel that indicates "not set" for an enum.
+      /* This is our special sentinel that indicates "not set" for an enum. */
       f->default_is_string = true;
       f->defaultval.bytes = NULL;
       break;
@@ -1144,6 +1099,7 @@
 
 bool upb_fielddef_setdefaultstr(upb_fielddef *f, const void *str, size_t len,
                                 upb_status *s) {
+  str_t *str2;
   assert(upb_fielddef_isstring(f) || f->type_ == UPB_TYPE_ENUM);
   if (f->type_ == UPB_TYPE_ENUM && !upb_isident(str, len, false, s))
     return false;
@@ -1156,7 +1112,7 @@
     assert(f->type_ == UPB_TYPE_ENUM);
   }
 
-  str_t *str2 = newstr(str, len);
+  str2 = newstr(str, len);
   f->defaultval.bytes = str2;
   f->default_is_string = true;
   return true;
@@ -1169,8 +1125,8 @@
 }
 
 bool upb_fielddef_enumhasdefaultint32(const upb_fielddef *f) {
-  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   int32_t val;
+  assert(f->type_is_set_ && f->type_ == UPB_TYPE_ENUM);
   return enumdefaultint32(f, &val);
 }
 
@@ -1217,12 +1173,12 @@
 
 bool upb_fielddef_setmsgsubdef(upb_fielddef *f, const upb_msgdef *subdef,
                                upb_status *s) {
-  return upb_fielddef_setsubdef(f, UPB_UPCAST(subdef), s);
+  return upb_fielddef_setsubdef(f, upb_msgdef_upcast(subdef), s);
 }
 
 bool upb_fielddef_setenumsubdef(upb_fielddef *f, const upb_enumdef *subdef,
                                 upb_status *s) {
-  return upb_fielddef_setsubdef(f, UPB_UPCAST(subdef), s);
+  return upb_fielddef_setsubdef(f, upb_enumdef_upcast(subdef), s);
 }
 
 bool upb_fielddef_setsubdefname(upb_fielddef *f, const char *name,
@@ -1232,8 +1188,8 @@
     upb_status_seterrmsg(s, "field type does not accept a subdef");
     return false;
   }
-  // TODO: validate name (upb_isident() doesn't quite work atm because this name
-  // may have a leading ".").
+  /* TODO: validate name (upb_isident() doesn't quite work atm because this name
+   * may have a leading "."). */
   release_subdef(f);
   f->sub.name = upb_strdup(name);
   f->subdef_is_symbolic = true;
@@ -1282,20 +1238,20 @@
 
 static void visitmsg(const upb_refcounted *r, upb_refcounted_visit *visit,
                      void *closure) {
+  upb_msg_oneof_iter o;
   const upb_msgdef *m = (const upb_msgdef*)r;
   upb_msg_field_iter i;
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
     upb_fielddef *f = upb_msg_iter_field(&i);
-    visit(r, UPB_UPCAST2(f), closure);
+    visit(r, upb_fielddef_upcast2(f), closure);
   }
-  upb_msg_oneof_iter o;
   for(upb_msg_oneof_begin(&o, m);
       !upb_msg_oneof_done(&o);
       upb_msg_oneof_next(&o)) {
     upb_oneofdef *f = upb_msg_iter_oneof(&o);
-    visit(r, UPB_UPCAST2(f), closure);
+    visit(r, upb_oneofdef_upcast2(f), closure);
   }
 }
 
@@ -1304,7 +1260,7 @@
   upb_strtable_uninit(&m->ntoo);
   upb_strtable_uninit(&m->ntof);
   upb_inttable_uninit(&m->itof);
-  upb_def_uninit(UPB_UPCAST(m));
+  upb_def_uninit(upb_msgdef_upcast_mutable(m));
   free(m);
 }
 
@@ -1312,7 +1268,8 @@
   static const struct upb_refcounted_vtbl vtbl = {visitmsg, freemsg};
   upb_msgdef *m = malloc(sizeof(*m));
   if (!m) return NULL;
-  if (!upb_def_init(UPB_UPCAST(m), UPB_DEF_MSG, &vtbl, owner)) goto err2;
+  if (!upb_def_init(upb_msgdef_upcast_mutable(m), UPB_DEF_MSG, &vtbl, owner))
+    goto err2;
   if (!upb_inttable_init(&m->itof, UPB_CTYPE_PTR)) goto err3;
   if (!upb_strtable_init(&m->ntof, UPB_CTYPE_PTR)) goto err2;
   if (!upb_strtable_init(&m->ntoo, UPB_CTYPE_PTR)) goto err1;
@@ -1329,25 +1286,28 @@
 }
 
 upb_msgdef *upb_msgdef_dup(const upb_msgdef *m, const void *owner) {
+  bool ok;
+  upb_msg_field_iter i;
+  upb_msg_oneof_iter o;
+
   upb_msgdef *newm = upb_msgdef_new(owner);
   if (!newm) return NULL;
-  bool ok = upb_def_setfullname(UPB_UPCAST(newm),
-                                upb_def_fullname(UPB_UPCAST(m)), NULL);
+  ok = upb_def_setfullname(upb_msgdef_upcast_mutable(newm),
+                           upb_def_fullname(upb_msgdef_upcast(m)),
+                           NULL);
   newm->map_entry = m->map_entry;
   UPB_ASSERT_VAR(ok, ok);
-  upb_msg_field_iter i;
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
     upb_fielddef *f = upb_fielddef_dup(upb_msg_iter_field(&i), &f);
-    // Fields in oneofs are dup'd below.
+    /* Fields in oneofs are dup'd below. */
     if (upb_fielddef_containingoneof(f)) continue;
     if (!f || !upb_msgdef_addfield(newm, f, &f, NULL)) {
       upb_msgdef_unref(newm, owner);
       return NULL;
     }
   }
-  upb_msg_oneof_iter o;
   for(upb_msg_oneof_begin(&o, m);
       !upb_msg_oneof_done(&o);
       upb_msg_oneof_next(&o)) {
@@ -1360,43 +1320,22 @@
   return newm;
 }
 
-bool upb_msgdef_isfrozen(const upb_msgdef *m) {
-  return upb_def_isfrozen(UPB_UPCAST(m));
-}
-
-void upb_msgdef_ref(const upb_msgdef *m, const void *owner) {
-  upb_def_ref(UPB_UPCAST(m), owner);
-}
-
-void upb_msgdef_unref(const upb_msgdef *m, const void *owner) {
-  upb_def_unref(UPB_UPCAST(m), owner);
-}
-
-void upb_msgdef_donateref(
-    const upb_msgdef *m, const void *from, const void *to) {
-  upb_def_donateref(UPB_UPCAST(m), from, to);
-}
-
-void upb_msgdef_checkref(const upb_msgdef *m, const void *owner) {
-  upb_def_checkref(UPB_UPCAST(m), owner);
-}
-
 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status) {
-  upb_def *d = UPB_UPCAST(m);
+  upb_def *d = upb_msgdef_upcast_mutable(m);
   return upb_def_freeze(&d, 1, status);
 }
 
 const char *upb_msgdef_fullname(const upb_msgdef *m) {
-  return upb_def_fullname(UPB_UPCAST(m));
+  return upb_def_fullname(upb_msgdef_upcast(m));
 }
 
 bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname,
                             upb_status *s) {
-  return upb_def_setfullname(UPB_UPCAST(m), fullname, s);
+  return upb_def_setfullname(upb_msgdef_upcast_mutable(m), fullname, s);
 }
 
-// Helper: check that the field |f| is safe to add to msgdef |m|. Set an error
-// on status |s| and return false if not.
+/* Helper: check that the field |f| is safe to add to msgdef |m|. Set an error
+ * on status |s| and return false if not. */
 static bool check_field_add(const upb_msgdef *m, const upb_fielddef *f,
                             upb_status *s) {
   if (upb_fielddef_containingtype(f) != NULL) {
@@ -1426,40 +1365,42 @@
 
 bool upb_msgdef_addfield(upb_msgdef *m, upb_fielddef *f, const void *ref_donor,
                          upb_status *s) {
-  // TODO: extensions need to have a separate namespace, because proto2 allows a
-  // top-level extension (ie. one not in any package) to have the same name as a
-  // field from the message.
-  //
-  // This also implies that there needs to be a separate lookup-by-name method
-  // for extensions.  It seems desirable for iteration to return both extensions
-  // and non-extensions though.
-  //
-  // We also need to validate that the field number is in an extension range iff
-  // it is an extension.
-
-  // This method is idempotent. Check if |f| is already part of this msgdef and
-  // return immediately if so.
+  /* TODO: extensions need to have a separate namespace, because proto2 allows a
+   * top-level extension (ie. one not in any package) to have the same name as a
+   * field from the message.
+   *
+   * This also implies that there needs to be a separate lookup-by-name method
+   * for extensions.  It seems desirable for iteration to return both extensions
+   * and non-extensions though.
+   *
+   * We also need to validate that the field number is in an extension range iff
+   * it is an extension.
+   *
+   * This method is idempotent. Check if |f| is already part of this msgdef and
+   * return immediately if so. */
   if (upb_fielddef_containingtype(f) == m) {
     return true;
   }
 
-  // Check constraints for all fields before performing any action.
+  /* Check constraints for all fields before performing any action. */
   if (!check_field_add(m, f, s)) {
     return false;
   } else if (upb_fielddef_containingoneof(f) != NULL) {
-    // Fields in a oneof can only be added by adding the oneof to the msgdef.
+    /* Fields in a oneof can only be added by adding the oneof to the msgdef. */
     upb_status_seterrmsg(s, "fielddef is part of a oneof");
     return false;
   }
 
-  // Constraint checks ok, perform the action.
+  /* Constraint checks ok, perform the action. */
   add_field(m, f, ref_donor);
   return true;
 }
 
 bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor,
                          upb_status *s) {
-  // Check various conditions that would prevent this oneof from being added.
+  upb_oneof_iter it;
+
+  /* Check various conditions that would prevent this oneof from being added. */
   if (upb_oneofdef_containingtype(o)) {
     upb_status_seterrmsg(s, "oneofdef already belongs to a message");
     return false;
@@ -1471,9 +1412,8 @@
     return false;
   }
 
-  // Check that all of the oneof's fields do not conflict with names or numbers
-  // of fields already in the message.
-  upb_oneof_iter it;
+  /* Check that all of the oneof's fields do not conflict with names or numbers
+   * of fields already in the message. */
   for (upb_oneof_begin(&it, o); !upb_oneof_done(&it); upb_oneof_next(&it)) {
     const upb_fielddef *f = upb_oneof_iter_field(&it);
     if (!check_field_add(m, f, s)) {
@@ -1481,15 +1421,15 @@
     }
   }
 
-  // Everything checks out -- commit now.
+  /* Everything checks out -- commit now. */
 
-  // Add oneof itself first.
+  /* Add oneof itself first. */
   o->parent = m;
   upb_strtable_insert(&m->ntoo, upb_oneofdef_name(o), upb_value_ptr(o));
   upb_ref2(o, m);
   upb_ref2(m, o);
 
-  // Add each field of the oneof directly to the msgdef.
+  /* Add each field of the oneof directly to the msgdef. */
   for (upb_oneof_begin(&it, o); !upb_oneof_done(&it); upb_oneof_next(&it)) {
     upb_fielddef *f = upb_oneof_iter_field(&it);
     add_field(m, f, NULL);
@@ -1581,10 +1521,10 @@
   upb_oneof_iter i;
   for (upb_oneof_begin(&i, o); !upb_oneof_done(&i); upb_oneof_next(&i)) {
     const upb_fielddef *f = upb_oneof_iter_field(&i);
-    visit(r, UPB_UPCAST2(f), closure);
+    visit(r, upb_fielddef_upcast2(f), closure);
   }
   if (o->parent) {
-    visit(r, UPB_UPCAST2(o->parent), closure);
+    visit(r, upb_msgdef_upcast2(o->parent), closure);
   }
 }
 
@@ -1592,7 +1532,7 @@
   upb_oneofdef *o = (upb_oneofdef*)r;
   upb_strtable_uninit(&o->ntof);
   upb_inttable_uninit(&o->itof);
-  upb_def_uninit(UPB_UPCAST(o));
+  upb_def_uninit(upb_oneofdef_upcast_mutable(o));
   free(o);
 }
 
@@ -1601,7 +1541,9 @@
   upb_oneofdef *o = malloc(sizeof(*o));
   o->parent = NULL;
   if (!o) return NULL;
-  if (!upb_def_init(UPB_UPCAST(o), UPB_DEF_ONEOF, &vtbl, owner)) goto err2;
+  if (!upb_def_init(upb_oneofdef_upcast_mutable(o), UPB_DEF_ONEOF, &vtbl,
+                    owner))
+    goto err2;
   if (!upb_inttable_init(&o->itof, UPB_CTYPE_PTR)) goto err2;
   if (!upb_strtable_init(&o->ntof, UPB_CTYPE_PTR)) goto err1;
   return o;
@@ -1614,12 +1556,13 @@
 }
 
 upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner) {
+  bool ok;
+  upb_oneof_iter i;
   upb_oneofdef *newo = upb_oneofdef_new(owner);
   if (!newo) return NULL;
-  bool ok = upb_def_setfullname(UPB_UPCAST(newo),
-                                upb_def_fullname(UPB_UPCAST(o)), NULL);
+  ok = upb_def_setfullname(upb_oneofdef_upcast_mutable(newo),
+                           upb_def_fullname(upb_oneofdef_upcast(o)), NULL);
   UPB_ASSERT_VAR(ok, ok);
-  upb_oneof_iter i;
   for (upb_oneof_begin(&i, o); !upb_oneof_done(&i); upb_oneof_next(&i)) {
     upb_fielddef *f = upb_fielddef_dup(upb_oneof_iter_field(&i), &f);
     if (!f || !upb_oneofdef_addfield(newo, f, &f, NULL)) {
@@ -1630,29 +1573,8 @@
   return newo;
 }
 
-bool upb_oneofdef_isfrozen(const upb_oneofdef *o) {
-  return upb_def_isfrozen(UPB_UPCAST(o));
-}
-
-void upb_oneofdef_ref(const upb_oneofdef *o, const void *owner) {
-  upb_def_ref(UPB_UPCAST(o), owner);
-}
-
-void upb_oneofdef_unref(const upb_oneofdef *o, const void *owner) {
-  upb_def_unref(UPB_UPCAST(o), owner);
-}
-
-void upb_oneofdef_donateref(const upb_oneofdef *o, const void *from,
-                           const void *to) {
-  upb_def_donateref(UPB_UPCAST(o), from, to);
-}
-
-void upb_oneofdef_checkref(const upb_oneofdef *o, const void *owner) {
-  upb_def_checkref(UPB_UPCAST(o), owner);
-}
-
 const char *upb_oneofdef_name(const upb_oneofdef *o) {
-  return upb_def_fullname(UPB_UPCAST(o));
+  return upb_def_fullname(upb_oneofdef_upcast(o));
 }
 
 bool upb_oneofdef_setname(upb_oneofdef *o, const char *fullname,
@@ -1661,7 +1583,7 @@
     upb_status_seterrmsg(s, "oneof already added to a message");
     return false;
   }
-  return upb_def_setfullname(UPB_UPCAST(o), fullname, s);
+  return upb_def_setfullname(upb_oneofdef_upcast_mutable(o), fullname, s);
 }
 
 const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o) {
@@ -1678,20 +1600,20 @@
   assert(!upb_oneofdef_isfrozen(o));
   assert(!o->parent || !upb_msgdef_isfrozen(o->parent));
 
-  // This method is idempotent. Check if |f| is already part of this oneofdef
-  // and return immediately if so.
+  /* This method is idempotent. Check if |f| is already part of this oneofdef
+   * and return immediately if so. */
   if (upb_fielddef_containingoneof(f) == o) {
     return true;
   }
 
-  // The field must have an OPTIONAL label.
+  /* The field must have an OPTIONAL label. */
   if (upb_fielddef_label(f) != UPB_LABEL_OPTIONAL) {
     upb_status_seterrmsg(s, "fields in oneof must have OPTIONAL label");
     return false;
   }
 
-  // Check that no field with this name or number exists already in the oneof.
-  // Also check that the field is not already part of a oneof.
+  /* Check that no field with this name or number exists already in the oneof.
+   * Also check that the field is not already part of a oneof. */
   if (upb_fielddef_name(f) == NULL || upb_fielddef_number(f) == 0) {
     upb_status_seterrmsg(s, "field name or number were not set");
     return false;
@@ -1704,21 +1626,21 @@
     return false;
   }
 
-  // We allow adding a field to the oneof either if the field is not part of a
-  // msgdef, or if it is and we are also part of the same msgdef.
+  /* We allow adding a field to the oneof either if the field is not part of a
+   * msgdef, or if it is and we are also part of the same msgdef. */
   if (o->parent == NULL) {
-    // If we're not in a msgdef, the field cannot be either. Otherwise we would
-    // need to magically add this oneof to a msgdef to remain consistent, which
-    // is surprising behavior.
+    /* If we're not in a msgdef, the field cannot be either. Otherwise we would
+     * need to magically add this oneof to a msgdef to remain consistent, which
+     * is surprising behavior. */
     if (upb_fielddef_containingtype(f) != NULL) {
       upb_status_seterrmsg(s, "fielddef already belongs to a message, but "
                               "oneof does not");
       return false;
     }
   } else {
-    // If we're in a msgdef, the user can add fields that either aren't in any
-    // msgdef (in which case they're added to our msgdef) or already a part of
-    // our msgdef.
+    /* If we're in a msgdef, the user can add fields that either aren't in any
+     * msgdef (in which case they're added to our msgdef) or already a part of
+     * our msgdef. */
     if (upb_fielddef_containingtype(f) != NULL &&
         upb_fielddef_containingtype(f) != o->parent) {
       upb_status_seterrmsg(s, "fielddef belongs to a different message "
@@ -1727,8 +1649,8 @@
     }
   }
 
-  // Commit phase. First add the field to our parent msgdef, if any, because
-  // that may fail; then add the field to our own tables.
+  /* Commit phase. First add the field to our parent msgdef, if any, because
+   * that may fail; then add the field to our own tables. */
 
   if (o->parent != NULL && upb_fielddef_containingtype(f) == NULL) {
     if (!upb_msgdef_addfield((upb_msgdef*)o->parent, f, NULL, s)) {
@@ -1801,18 +1723,17 @@
 
 /* Default allocator **********************************************************/
 
-// Just use realloc, keeping all allocated blocks in a linked list to destroy at
-// the end.
+/* Just use realloc, keeping all allocated blocks in a linked list to destroy at
+ * the end. */
 
 typedef struct mem_block {
-  // List is doubly-linked, because in cases where realloc() moves an existing
-  // block, we need to be able to remove the old pointer from the list
-  // efficiently.
+  /* List is doubly-linked, because in cases where realloc() moves an existing
+   * block, we need to be able to remove the old pointer from the list
+   * efficiently. */
   struct mem_block *prev, *next;
 #ifndef NDEBUG
-  size_t size;  // Doesn't include mem_block structure.
+  size_t size;  /* Doesn't include mem_block structure. */
 #endif
-  char data[];
 } mem_block;
 
 typedef struct {
@@ -1820,10 +1741,12 @@
 } default_alloc_ud;
 
 static void *default_alloc(void *_ud, void *ptr, size_t oldsize, size_t size) {
-  UPB_UNUSED(oldsize);
   default_alloc_ud *ud = _ud;
+  mem_block *from, *block;
+  void *ret;
+  UPB_UNUSED(oldsize);
 
-  mem_block *from = ptr ? (void*)((char*)ptr - sizeof(mem_block)) : NULL;
+  from = ptr ? (void*)((char*)ptr - sizeof(mem_block)) : NULL;
 
 #ifndef NDEBUG
   if (from) {
@@ -1831,8 +1754,11 @@
   }
 #endif
 
-  mem_block *block = realloc(from, size + sizeof(mem_block));
+  /* TODO(haberman): we probably need to provide even better alignment here,
+   * like 16-byte alignment of the returned data pointer. */
+  block = realloc(from, size + sizeof(mem_block));
   if (!block) return NULL;
+  ret = (char*)block + sizeof(*block);
 
 #ifndef NDEBUG
   block->size = size;
@@ -1840,20 +1766,20 @@
 
   if (from) {
     if (block != from) {
-      // The block was moved, so pointers in next and prev blocks must be
-      // updated to its new location.
+      /* The block was moved, so pointers in next and prev blocks must be
+       * updated to its new location. */
       if (block->next) block->next->prev = block;
       if (block->prev) block->prev->next = block;
     }
   } else {
-    // Insert at head of linked list.
+    /* Insert at head of linked list. */
     block->prev = NULL;
     block->next = ud->head;
     if (block->next) block->next->prev = block;
     ud->head = block;
   }
 
-  return &block->data;
+  return ret;
 }
 
 static void default_alloc_cleanup(void *_ud) {
@@ -1886,14 +1812,14 @@
 /* upb_env ********************************************************************/
 
 void upb_env_init(upb_env *e) {
+  default_alloc_ud *ud = (default_alloc_ud*)&e->default_alloc_ud;
   e->ok_ = true;
   e->bytes_allocated = 0;
   e->cleanup_head = NULL;
 
-  default_alloc_ud *ud = (default_alloc_ud*)&e->default_alloc_ud;
   ud->head = NULL;
 
-  // Set default functions.
+  /* Set default functions. */
   upb_env_setallocfunc(e, default_alloc, ud);
   upb_env_seterrorfunc(e, default_err, NULL);
 }
@@ -1906,8 +1832,8 @@
     ent = ent->next;
   }
 
-  // Must do this after running cleanup functions, because this will delete
-  // the memory we store our cleanup entries in!
+  /* Must do this after running cleanup functions, because this will delete
+     the memory we store our cleanup entries in! */
   if (e->alloc == default_alloc) {
     default_alloc_cleanup(e->alloc_ud);
   }
@@ -1954,8 +1880,8 @@
 void *upb_env_malloc(upb_env *e, size_t size) {
   e->bytes_allocated += size;
   if (e->alloc == seeded_alloc) {
-    // This is equivalent to the next branch, but allows inlining for a
-    // measurable perf benefit.
+    /* This is equivalent to the next branch, but allows inlining for a
+     * measurable perf benefit. */
     return seeded_alloc(e->alloc_ud, NULL, 0, size);
   } else {
     return e->alloc(e->alloc_ud, NULL, 0, size);
@@ -1963,12 +1889,13 @@
 }
 
 void *upb_env_realloc(upb_env *e, void *ptr, size_t oldsize, size_t size) {
+  char *ret;
   assert(oldsize <= size);
-  char *ret = e->alloc(e->alloc_ud, ptr, oldsize, size);
+  ret = e->alloc(e->alloc_ud, ptr, oldsize, size);
 
 #ifndef NDEBUG
-  // Overwrite non-preserved memory to ensure callers are passing the oldsize
-  // that they truly require.
+  /* Overwrite non-preserved memory to ensure callers are passing the oldsize
+   * that they truly require. */
   memset(ret + oldsize, 0xff, size - oldsize);
 #endif
 
@@ -1982,7 +1909,7 @@
 
 /* upb_seededalloc ************************************************************/
 
-// Be conservative and choose 16 in case anyone is using SSE.
+/* Be conservative and choose 16 in case anyone is using SSE. */
 static const size_t maxalign = 16;
 
 static size_t align_up(size_t size) {
@@ -1991,24 +1918,24 @@
 
 UPB_FORCEINLINE static void *seeded_alloc(void *ud, void *ptr, size_t oldsize,
                                           size_t size) {
+  upb_seededalloc *a = ud;
   UPB_UNUSED(ptr);
 
-  upb_seededalloc *a = ud;
   size = align_up(size);
 
   assert(a->mem_limit >= a->mem_ptr);
 
   if (oldsize == 0 && size <= (size_t)(a->mem_limit - a->mem_ptr)) {
-    // Fast path: we can satisfy from the initial allocation.
+    /* Fast path: we can satisfy from the initial allocation. */
     void *ret = a->mem_ptr;
     a->mem_ptr += size;
     return ret;
   } else {
-    // Slow path: fallback to other allocator.
-    a->need_cleanup = true;
-    // Is `ptr` part of the user-provided initial block? Don't pass it to the
-    // default allocator if so; otherwise, it may try to realloc() the block.
     char *chptr = ptr;
+    /* Slow path: fallback to other allocator. */
+    a->need_cleanup = true;
+    /* Is `ptr` part of the user-provided initial block? Don't pass it to the
+     * default allocator if so; otherwise, it may try to realloc() the block. */
     if (chptr >= a->mem_base && chptr < a->mem_limit) {
       return a->alloc(a->alloc_ud, NULL, 0, size);
     } else {
@@ -2018,13 +1945,13 @@
 }
 
 void upb_seededalloc_init(upb_seededalloc *a, void *mem, size_t len) {
+  default_alloc_ud *ud = (default_alloc_ud*)&a->default_alloc_ud;
   a->mem_base = mem;
   a->mem_ptr = mem;
   a->mem_limit = (char*)mem + len;
   a->need_cleanup = false;
   a->returned_allocfunc = false;
 
-  default_alloc_ud *ud = (default_alloc_ud*)&a->default_alloc_ud;
   ud->head = NULL;
 
   upb_seededalloc_setfallbackalloc(a, default_alloc, ud);
@@ -2063,8 +1990,9 @@
 #include <string.h>
 
 
-// Defined for the sole purpose of having a unique pointer value for
-// UPB_NO_CLOSURE.
+
+/* Defined for the sole purpose of having a unique pointer value for
+ * UPB_NO_CLOSURE. */
 char _upb_noclosure;
 
 static void freehandlers(upb_refcounted *r) {
@@ -2093,42 +2021,45 @@
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
     upb_fielddef *f = upb_msg_iter_field(&i);
+    const upb_handlers *sub;
     if (!upb_fielddef_issubmsg(f)) continue;
-    const upb_handlers *sub = upb_handlers_getsubhandlers(h, f);
-    if (sub) visit(r, UPB_UPCAST(sub), closure);
+    sub = upb_handlers_getsubhandlers(h, f);
+    if (sub) visit(r, upb_handlers_upcast(sub), closure);
   }
 }
 
 static const struct upb_refcounted_vtbl vtbl = {visithandlers, freehandlers};
 
 typedef struct {
-  upb_inttable tab;  // maps upb_msgdef* -> upb_handlers*.
+  upb_inttable tab;  /* maps upb_msgdef* -> upb_handlers*. */
   upb_handlers_callback *callback;
   const void *closure;
 } dfs_state;
 
-// TODO(haberman): discard upb_handlers* objects that do not actually have any
-// handlers set and cannot reach any upb_handlers* object that does.  This is
-// slightly tricky to do correctly.
+/* TODO(haberman): discard upb_handlers* objects that do not actually have any
+ * handlers set and cannot reach any upb_handlers* object that does.  This is
+ * slightly tricky to do correctly. */
 static upb_handlers *newformsg(const upb_msgdef *m, const void *owner,
                                dfs_state *s) {
+  upb_msg_field_iter i;
   upb_handlers *h = upb_handlers_new(m, owner);
   if (!h) return NULL;
   if (!upb_inttable_insertptr(&s->tab, m, upb_value_ptr(h))) goto oom;
 
   s->callback(s->closure, h);
 
-  // For each submessage field, get or create a handlers object and set it as
-  // the subhandlers.
-  upb_msg_field_iter i;
+  /* For each submessage field, get or create a handlers object and set it as
+   * the subhandlers. */
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
     upb_fielddef *f = upb_msg_iter_field(&i);
+    const upb_msgdef *subdef;
+    upb_value subm_ent;
+
     if (!upb_fielddef_issubmsg(f)) continue;
 
-    const upb_msgdef *subdef = upb_downcast_msgdef(upb_fielddef_subdef(f));
-    upb_value subm_ent;
+    subdef = upb_downcast_msgdef(upb_fielddef_subdef(f));
     if (upb_inttable_lookupptr(&s->tab, subdef, &subm_ent)) {
       upb_handlers_setsubhandlers(h, f, upb_value_getptr(subm_ent));
     } else {
@@ -2145,11 +2076,11 @@
   return NULL;
 }
 
-// Given a selector for a STARTSUBMSG handler, resolves to a pointer to the
-// subhandlers for this submessage field.
+/* Given a selector for a STARTSUBMSG handler, resolves to a pointer to the
+ * subhandlers for this submessage field. */
 #define SUBH(h, selector) (h->sub[selector])
 
-// The selector for a submessage field is the field index.
+/* The selector for a submessage field is the field index. */
 #define SUBH_F(h, f) SUBH(h, f->index_)
 
 static int32_t trygetsel(upb_handlers *h, const upb_fielddef *f,
@@ -2187,6 +2118,10 @@
 static bool doset(upb_handlers *h, int32_t sel, const upb_fielddef *f,
                   upb_handlertype_t type, upb_func *func,
                   upb_handlerattr *attr) {
+  upb_handlerattr set_attr = UPB_HANDLERATTR_INITIALIZER;
+  const void *closure_type;
+  const void **context_closure_type;
+
   assert(!upb_handlers_isfrozen(h));
 
   if (sel < 0) {
@@ -2201,15 +2136,13 @@
     return false;
   }
 
-  upb_handlerattr set_attr = UPB_HANDLERATTR_INITIALIZER;
   if (attr) {
     set_attr = *attr;
   }
 
-  // Check that the given closure type matches the closure type that has been
-  // established for this context (if any).
-  const void *closure_type = upb_handlerattr_closuretype(&set_attr);
-  const void **context_closure_type;
+  /* Check that the given closure type matches the closure type that has been
+   * established for this context (if any). */
+  closure_type = upb_handlerattr_closuretype(&set_attr);
 
   if (type == UPB_HANDLER_STRING) {
     context_closure_type = returntype(h, f, UPB_HANDLER_STARTSTR);
@@ -2223,7 +2156,7 @@
 
   if (closure_type && *context_closure_type &&
       closure_type != *context_closure_type) {
-    // TODO(haberman): better message for debugging.
+    /* TODO(haberman): better message for debugging. */
     if (f) {
       upb_status_seterrf(&h->status_,
                          "closure type does not match for field %s",
@@ -2238,8 +2171,8 @@
   if (closure_type)
     *context_closure_type = closure_type;
 
-  // If this is a STARTSEQ or STARTSTR handler, check that the returned pointer
-  // matches any pre-existing expectations about what type is expected.
+  /* If this is a STARTSEQ or STARTSTR handler, check that the returned pointer
+   * matches any pre-existing expectations about what type is expected. */
   if (type == UPB_HANDLER_STARTSEQ || type == UPB_HANDLER_STARTSTR) {
     const void *return_type = upb_handlerattr_returnclosuretype(&set_attr);
     const void *table_return_type =
@@ -2258,17 +2191,20 @@
   return true;
 }
 
-// Returns the effective closure type for this handler (which will propagate
-// from outer frames if this frame has no START* handler).  Not implemented for
-// UPB_HANDLER_STRING at the moment since this is not needed.  Returns NULL is
-// the effective closure type is unspecified (either no handler was registered
-// to specify it or the handler that was registered did not specify the closure
-// type).
+/* Returns the effective closure type for this handler (which will propagate
+ * from outer frames if this frame has no START* handler).  Not implemented for
+ * UPB_HANDLER_STRING at the moment since this is not needed.  Returns NULL is
+ * the effective closure type is unspecified (either no handler was registered
+ * to specify it or the handler that was registered did not specify the closure
+ * type). */
 const void *effective_closure_type(upb_handlers *h, const upb_fielddef *f,
                                    upb_handlertype_t type) {
-  assert(type != UPB_HANDLER_STRING);
-  const void *ret = h->top_closure_type;
+  const void *ret;
   upb_selector_t sel;
+
+  assert(type != UPB_HANDLER_STRING);
+  ret = h->top_closure_type;
+
   if (upb_fielddef_isseq(f) &&
       type != UPB_HANDLER_STARTSEQ &&
       type != UPB_HANDLER_ENDSEQ &&
@@ -2281,26 +2217,30 @@
     ret = upb_handlerattr_returnclosuretype(&h->table[sel].attr);
   }
 
-  // The effective type of the submessage; not used yet.
-  // if (type == SUBMESSAGE &&
-  //     h->table[sel = handlers_getsel(h, f, UPB_HANDLER_STARTSUBMSG)].func) {
-  //   ret = upb_handlerattr_returnclosuretype(&h->table[sel].attr);
-  // }
+  /* The effective type of the submessage; not used yet.
+   * if (type == SUBMESSAGE &&
+   *     h->table[sel = handlers_getsel(h, f, UPB_HANDLER_STARTSUBMSG)].func) {
+   *   ret = upb_handlerattr_returnclosuretype(&h->table[sel].attr);
+   * } */
 
   return ret;
 }
 
-// Checks whether the START* handler specified by f & type is missing even
-// though it is required to convert the established type of an outer frame
-// ("closure_type") into the established type of an inner frame (represented in
-// the return closure type of this handler's attr.
+/* Checks whether the START* handler specified by f & type is missing even
+ * though it is required to convert the established type of an outer frame
+ * ("closure_type") into the established type of an inner frame (represented in
+ * the return closure type of this handler's attr. */
 bool checkstart(upb_handlers *h, const upb_fielddef *f, upb_handlertype_t type,
                 upb_status *status) {
+  const void *closure_type;
+  const upb_handlerattr *attr;
+  const void *return_closure_type;
+
   upb_selector_t sel = handlers_getsel(h, f, type);
   if (h->table[sel].func) return true;
-  const void *closure_type = effective_closure_type(h, f, type);
-  const upb_handlerattr *attr = &h->table[sel].attr;
-  const void *return_closure_type = upb_handlerattr_returnclosuretype(attr);
+  closure_type = effective_closure_type(h, f, type);
+  attr = &h->table[sel].attr;
+  return_closure_type = upb_handlerattr_returnclosuretype(attr);
   if (closure_type && return_closure_type &&
       closure_type != return_closure_type) {
     upb_status_seterrf(status,
@@ -2313,32 +2253,14 @@
 
 /* Public interface ***********************************************************/
 
-bool upb_handlers_isfrozen(const upb_handlers *h) {
-  return upb_refcounted_isfrozen(UPB_UPCAST(h));
-}
-
-void upb_handlers_ref(const upb_handlers *h, const void *owner) {
-  upb_refcounted_ref(UPB_UPCAST(h), owner);
-}
-
-void upb_handlers_unref(const upb_handlers *h, const void *owner) {
-  upb_refcounted_unref(UPB_UPCAST(h), owner);
-}
-
-void upb_handlers_donateref(
-    const upb_handlers *h, const void *from, const void *to) {
-  upb_refcounted_donateref(UPB_UPCAST(h), from, to);
-}
-
-void upb_handlers_checkref(const upb_handlers *h, const void *owner) {
-  upb_refcounted_checkref(UPB_UPCAST(h), owner);
-}
-
 upb_handlers *upb_handlers_new(const upb_msgdef *md, const void *owner) {
+  int extra;
+  upb_handlers *h;
+
   assert(upb_msgdef_isfrozen(md));
 
-  int extra = sizeof(upb_handlers_tabent) * (md->selector_count - 1);
-  upb_handlers *h = calloc(sizeof(*h) + extra, 1);
+  extra = sizeof(upb_handlers_tabent) * (md->selector_count - 1);
+  h = calloc(sizeof(*h) + extra, 1);
   if (!h) return NULL;
 
   h->msg = md;
@@ -2346,14 +2268,15 @@
   upb_status_clear(&h->status_);
   h->sub = calloc(md->submsg_field_count, sizeof(*h->sub));
   if (!h->sub) goto oom;
-  if (!upb_refcounted_init(UPB_UPCAST(h), &vtbl, owner)) goto oom;
+  if (!upb_refcounted_init(upb_handlers_upcast_mutable(h), &vtbl, owner))
+    goto oom;
   if (!upb_inttable_init(&h->cleanup_, UPB_CTYPE_FPTR)) goto oom;
 
-  // calloc() above initialized all handlers to NULL.
+  /* calloc() above initialized all handlers to NULL. */
   return h;
 
 oom:
-  freehandlers(UPB_UPCAST(h));
+  freehandlers(upb_handlers_upcast_mutable(h));
   return NULL;
 }
 
@@ -2362,17 +2285,21 @@
                                            upb_handlers_callback *callback,
                                            const void *closure) {
   dfs_state state;
+  upb_handlers *ret;
+  bool ok;
+  upb_refcounted *r;
+
   state.callback = callback;
   state.closure = closure;
   if (!upb_inttable_init(&state.tab, UPB_CTYPE_PTR)) return NULL;
 
-  upb_handlers *ret = newformsg(m, owner, &state);
+  ret = newformsg(m, owner, &state);
 
   upb_inttable_uninit(&state.tab);
   if (!ret) return NULL;
 
-  upb_refcounted *r = UPB_UPCAST(ret);
-  bool ok = upb_refcounted_freeze(&r, 1, NULL, UPB_MAX_HANDLER_DEPTH);
+  r = upb_handlers_upcast_mutable(ret);
+  ok = upb_refcounted_freeze(&r, 1, NULL, UPB_MAX_HANDLER_DEPTH);
   UPB_ASSERT_VAR(ok, ok);
 
   return ret;
@@ -2395,20 +2322,20 @@
     return doset(h, sel, f, handlertype, (upb_func*)func, attr); \
   }
 
-SETTER(int32,       upb_int32_handlerfunc*,       UPB_HANDLER_INT32);
-SETTER(int64,       upb_int64_handlerfunc*,       UPB_HANDLER_INT64);
-SETTER(uint32,      upb_uint32_handlerfunc*,      UPB_HANDLER_UINT32);
-SETTER(uint64,      upb_uint64_handlerfunc*,      UPB_HANDLER_UINT64);
-SETTER(float,       upb_float_handlerfunc*,       UPB_HANDLER_FLOAT);
-SETTER(double,      upb_double_handlerfunc*,      UPB_HANDLER_DOUBLE);
-SETTER(bool,        upb_bool_handlerfunc*,        UPB_HANDLER_BOOL);
-SETTER(startstr,    upb_startstr_handlerfunc*,    UPB_HANDLER_STARTSTR);
-SETTER(string,      upb_string_handlerfunc*,      UPB_HANDLER_STRING);
-SETTER(endstr,      upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSTR);
-SETTER(startseq,    upb_startfield_handlerfunc*,  UPB_HANDLER_STARTSEQ);
-SETTER(startsubmsg, upb_startfield_handlerfunc*,  UPB_HANDLER_STARTSUBMSG);
-SETTER(endsubmsg,   upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSUBMSG);
-SETTER(endseq,      upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSEQ);
+SETTER(int32,       upb_int32_handlerfunc*,       UPB_HANDLER_INT32)
+SETTER(int64,       upb_int64_handlerfunc*,       UPB_HANDLER_INT64)
+SETTER(uint32,      upb_uint32_handlerfunc*,      UPB_HANDLER_UINT32)
+SETTER(uint64,      upb_uint64_handlerfunc*,      UPB_HANDLER_UINT64)
+SETTER(float,       upb_float_handlerfunc*,       UPB_HANDLER_FLOAT)
+SETTER(double,      upb_double_handlerfunc*,      UPB_HANDLER_DOUBLE)
+SETTER(bool,        upb_bool_handlerfunc*,        UPB_HANDLER_BOOL)
+SETTER(startstr,    upb_startstr_handlerfunc*,    UPB_HANDLER_STARTSTR)
+SETTER(string,      upb_string_handlerfunc*,      UPB_HANDLER_STRING)
+SETTER(endstr,      upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSTR)
+SETTER(startseq,    upb_startfield_handlerfunc*,  UPB_HANDLER_STARTSEQ)
+SETTER(startsubmsg, upb_startfield_handlerfunc*,  UPB_HANDLER_STARTSUBMSG)
+SETTER(endsubmsg,   upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSUBMSG)
+SETTER(endseq,      upb_endfield_handlerfunc*,    UPB_HANDLER_ENDSEQ)
 
 #undef SETTER
 
@@ -2430,8 +2357,8 @@
   assert(sub);
   assert(!upb_handlers_isfrozen(h));
   assert(upb_fielddef_issubmsg(f));
-  if (SUBH_F(h, f)) return false;  // Can't reset.
-  if (UPB_UPCAST(upb_handlers_msgdef(sub)) != upb_fielddef_subdef(f)) {
+  if (SUBH_F(h, f)) return false;  /* Can't reset. */
+  if (upb_msgdef_upcast(upb_handlers_msgdef(sub)) != upb_fielddef_subdef(f)) {
     return false;
   }
   SUBH_F(h, f) = sub;
@@ -2455,17 +2382,18 @@
 
 const upb_handlers *upb_handlers_getsubhandlers_sel(const upb_handlers *h,
                                                     upb_selector_t sel) {
-  // STARTSUBMSG selector in sel is the field's selector base.
+  /* STARTSUBMSG selector in sel is the field's selector base. */
   return SUBH(h, sel - UPB_STATIC_SELECTOR_COUNT);
 }
 
 const upb_msgdef *upb_handlers_msgdef(const upb_handlers *h) { return h->msg; }
 
 bool upb_handlers_addcleanup(upb_handlers *h, void *p, upb_handlerfree *func) {
+  bool ok;
   if (upb_inttable_lookupptr(&h->cleanup_, p, NULL)) {
     return false;
   }
-  bool ok = upb_inttable_insertptr(&h->cleanup_, p, upb_value_fptr(func));
+  ok = upb_inttable_insertptr(&h->cleanup_, p, upb_value_fptr(func));
   UPB_ASSERT_VAR(ok, ok);
   return true;
 }
@@ -2474,8 +2402,10 @@
 /* "Static" methods ***********************************************************/
 
 bool upb_handlers_freeze(upb_handlers *const*handlers, int n, upb_status *s) {
-  // TODO: verify we have a transitive closure.
-  for (int i = 0; i < n; i++) {
+  /* TODO: verify we have a transitive closure. */
+  int i;
+  for (i = 0; i < n; i++) {
+    upb_msg_field_iter j;
     upb_handlers *h = handlers[i];
 
     if (!upb_ok(&h->status_)) {
@@ -2485,9 +2415,8 @@
       return false;
     }
 
-    // Check that there are no closure mismatches due to missing Start* handlers
-    // or subhandlers with different type-level types.
-    upb_msg_field_iter j;
+    /* Check that there are no closure mismatches due to missing Start* handlers
+     * or subhandlers with different type-level types. */
     for(upb_msg_field_begin(&j, h->msg);
         !upb_msg_field_done(&j);
         upb_msg_field_next(&j)) {
@@ -2521,29 +2450,29 @@
         }
 
         if (hashandler && !upb_handlers_getsubhandlers(h, f)) {
-          // For now we add an empty subhandlers in this case.  It makes the
-          // decoder code generator simpler, because it only has to handle two
-          // cases (submessage has handlers or not) as opposed to three
-          // (submessage has handlers in enclosing message but no subhandlers).
-          //
-          // This makes parsing less efficient in the case that we want to
-          // notice a submessage but skip its contents (like if we're testing
-          // for submessage presence or counting the number of repeated
-          // submessages).  In this case we will end up parsing the submessage
-          // field by field and throwing away the results for each, instead of
-          // skipping the whole delimited thing at once.  If this is an issue we
-          // can revisit it, but do remember that this only arises when you have
-          // handlers (startseq/startsubmsg/endsubmsg/endseq) set for the
-          // submessage but no subhandlers.  The uses cases for this are
-          // limited.
+          /* For now we add an empty subhandlers in this case.  It makes the
+           * decoder code generator simpler, because it only has to handle two
+           * cases (submessage has handlers or not) as opposed to three
+           * (submessage has handlers in enclosing message but no subhandlers).
+           *
+           * This makes parsing less efficient in the case that we want to
+           * notice a submessage but skip its contents (like if we're testing
+           * for submessage presence or counting the number of repeated
+           * submessages).  In this case we will end up parsing the submessage
+           * field by field and throwing away the results for each, instead of
+           * skipping the whole delimited thing at once.  If this is an issue we
+           * can revisit it, but do remember that this only arises when you have
+           * handlers (startseq/startsubmsg/endsubmsg/endseq) set for the
+           * submessage but no subhandlers.  The uses cases for this are
+           * limited. */
           upb_handlers *sub = upb_handlers_new(upb_fielddef_msgsubdef(f), &sub);
           upb_handlers_setsubhandlers(h, f, sub);
           upb_handlers_unref(sub, &sub);
         }
 
-        // TODO(haberman): check type of submessage.
-        // This is slightly tricky; also consider whether we should check that
-        // they match at setsubhandlers time.
+        /* TODO(haberman): check type of submessage.
+         * This is slightly tricky; also consider whether we should check that
+         * they match at setsubhandlers time. */
       }
     }
   }
@@ -2566,7 +2495,7 @@
     case UPB_TYPE_FLOAT: return UPB_HANDLER_FLOAT;
     case UPB_TYPE_DOUBLE: return UPB_HANDLER_DOUBLE;
     case UPB_TYPE_BOOL: return UPB_HANDLER_BOOL;
-    default: assert(false); return -1;  // Invalid input.
+    default: assert(false); return -1;  /* Invalid input. */
   }
 }
 
@@ -2618,10 +2547,10 @@
       break;
     case UPB_HANDLER_STARTSUBMSG:
       if (!upb_fielddef_issubmsg(f)) return false;
-      // Selectors for STARTSUBMSG are at the beginning of the table so that the
-      // selector can also be used as an index into the "sub" array of
-      // subhandlers.  The indexes for the two into these two tables are the
-      // same, except that in the handler table the static selectors come first.
+      /* Selectors for STARTSUBMSG are at the beginning of the table so that the
+       * selector can also be used as an index into the "sub" array of
+       * subhandlers.  The indexes for the two into these two tables are the
+       * same, except that in the handler table the static selectors come first. */
       *s = f->index_ + UPB_STATIC_SELECTOR_COUNT;
       break;
     case UPB_HANDLER_ENDSUBMSG:
@@ -2639,13 +2568,13 @@
 
 uint32_t upb_handlers_selectorcount(const upb_fielddef *f) {
   uint32_t ret = 1;
-  if (upb_fielddef_isseq(f)) ret += 2;    // STARTSEQ/ENDSEQ
-  if (upb_fielddef_isstring(f)) ret += 2; // [STRING]/STARTSTR/ENDSTR
+  if (upb_fielddef_isseq(f)) ret += 2;    /* STARTSEQ/ENDSEQ */
+  if (upb_fielddef_isstring(f)) ret += 2; /* [STRING]/STARTSTR/ENDSTR */
   if (upb_fielddef_issubmsg(f)) {
-    // ENDSUBMSG (STARTSUBMSG is at table beginning)
+    /* ENDSUBMSG (STARTSUBMSG is at table beginning) */
     ret += 0;
     if (upb_fielddef_lazy(f)) {
-      // STARTSTR/ENDSTR/STRING (for lazy)
+      /* STARTSTR/ENDSTR/STRING (for lazy) */
       ret += 3;
     }
   }
@@ -2709,7 +2638,7 @@
   memset(h, 0, sizeof(*h));
 }
 
-// For when we support handlerfree callbacks.
+/* For when we support handlerfree callbacks. */
 void upb_byteshandler_uninit(upb_byteshandler* h) {
   UPB_UNUSED(h);
 }
@@ -2765,17 +2694,17 @@
 
 /* arch-specific atomic primitives  *******************************************/
 
-#ifdef UPB_THREAD_UNSAFE  //////////////////////////////////////////////////////
+#ifdef UPB_THREAD_UNSAFE /*---------------------------------------------------*/
 
 static void atomic_inc(uint32_t *a) { (*a)++; }
 static bool atomic_dec(uint32_t *a) { return --(*a) == 0; }
 
-#elif defined(__GNUC__) || defined(__clang__) //////////////////////////////////
+#elif defined(__GNUC__) || defined(__clang__) /*------------------------------*/
 
 static void atomic_inc(uint32_t *a) { __sync_fetch_and_add(a, 1); }
 static bool atomic_dec(uint32_t *a) { return __sync_sub_and_fetch(a, 1) == 0; }
 
-#elif defined(WIN32) ///////////////////////////////////////////////////////////
+#elif defined(WIN32) /*-------------------------------------------------------*/
 
 #include <Windows.h>
 
@@ -2789,13 +2718,13 @@
        Implement them or compile with UPB_THREAD_UNSAFE.
 #endif
 
-// All static objects point to this refcount.
-// It is special-cased in ref/unref below.
+/* All static objects point to this refcount.
+ * It is special-cased in ref/unref below.  */
 uint32_t static_refcount = -1;
 
-// We can avoid atomic ops for statically-declared objects.
-// This is a minor optimization but nice since we can avoid degrading under
-// contention in this case.
+/* We can avoid atomic ops for statically-declared objects.
+ * This is a minor optimization but nice since we can avoid degrading under
+ * contention in this case. */
 
 static void refgroup(uint32_t *group) {
   if (group != &static_refcount)
@@ -2822,21 +2751,21 @@
 
 #else
 
-// User must define functions that lock/unlock a global mutex and link this
-// file against them.
+/* User must define functions that lock/unlock a global mutex and link this
+ * file against them. */
 void upb_lock();
 void upb_unlock();
 
 #endif
 
-// UPB_DEBUG_REFS mode counts on being able to malloc() memory in some
-// code-paths that can normally never fail, like upb_refcounted_ref().  Since
-// we have no way to propagage out-of-memory errors back to the user, and since
-// these errors can only occur in UPB_DEBUG_REFS mode, we immediately fail.
+/* UPB_DEBUG_REFS mode counts on being able to malloc() memory in some
+ * code-paths that can normally never fail, like upb_refcounted_ref().  Since
+ * we have no way to propagage out-of-memory errors back to the user, and since
+ * these errors can only occur in UPB_DEBUG_REFS mode, we immediately fail. */
 #define CHECK_OOM(predicate) if (!(predicate)) { assert(predicate); exit(1); }
 
 typedef struct {
-  int count;  // How many refs there are (duplicates only allowed for ref2).
+  int count;  /* How many refs there are (duplicates only allowed for ref2). */
   bool is_ref2;
 } trackedref;
 
@@ -2849,18 +2778,19 @@
 }
 
 static void track(const upb_refcounted *r, const void *owner, bool ref2) {
+  upb_value v;
+
   assert(owner);
   if (owner == UPB_UNTRACKED_REF) return;
 
   upb_lock();
-  upb_value v;
   if (upb_inttable_lookupptr(r->refs, owner, &v)) {
     trackedref *ref = upb_value_getptr(v);
-    // Since we allow multiple ref2's for the same to/from pair without
-    // allocating separate memory for each one, we lose the fine-grained
-    // tracking behavior we get with regular refs.  Since ref2s only happen
-    // inside upb, we'll accept this limitation until/unless there is a really
-    // difficult upb-internal bug that can't be figured out without it.
+    /* Since we allow multiple ref2's for the same to/from pair without
+     * allocating separate memory for each one, we lose the fine-grained
+     * tracking behavior we get with regular refs.  Since ref2s only happen
+     * inside upb, we'll accept this limitation until/unless there is a really
+     * difficult upb-internal bug that can't be figured out without it. */
     assert(ref2);
     assert(ref->is_ref2);
     ref->count++;
@@ -2869,8 +2799,8 @@
     bool ok = upb_inttable_insertptr(r->refs, owner, upb_value_ptr(ref));
     CHECK_OOM(ok);
     if (ref2) {
-      // We know this cast is safe when it is a ref2, because it's coming from
-      // another refcounted object.
+      /* We know this cast is safe when it is a ref2, because it's coming from
+       * another refcounted object. */
       const upb_refcounted *from = owner;
       assert(!upb_inttable_lookupptr(from->ref2s, r, NULL));
       ok = upb_inttable_insertptr(from->ref2s, r, upb_value_ptr(NULL));
@@ -2881,22 +2811,25 @@
 }
 
 static void untrack(const upb_refcounted *r, const void *owner, bool ref2) {
+  upb_value v;
+  bool found;
+  trackedref *ref;
+
   assert(owner);
   if (owner == UPB_UNTRACKED_REF) return;
 
   upb_lock();
-  upb_value v;
-  bool found = upb_inttable_lookupptr(r->refs, owner, &v);
-  // This assert will fail if an owner attempts to release a ref it didn't have.
+  found = upb_inttable_lookupptr(r->refs, owner, &v);
+  /* This assert will fail if an owner attempts to release a ref it didn't have. */
   UPB_ASSERT_VAR(found, found);
-  trackedref *ref = upb_value_getptr(v);
+  ref = upb_value_getptr(v);
   assert(ref->is_ref2 == ref2);
   if (--ref->count == 0) {
     free(ref);
     upb_inttable_removeptr(r->refs, owner, NULL);
     if (ref2) {
-      // We know this cast is safe when it is a ref2, because it's coming from
-      // another refcounted object.
+      /* We know this cast is safe when it is a ref2, because it's coming from
+       * another refcounted object. */
       const upb_refcounted *from = owner;
       bool removed = upb_inttable_removeptr(from->ref2s, r, NULL);
       assert(removed);
@@ -2906,32 +2839,41 @@
 }
 
 static void checkref(const upb_refcounted *r, const void *owner, bool ref2) {
-  upb_lock();
   upb_value v;
-  bool found = upb_inttable_lookupptr(r->refs, owner, &v);
+  bool found;
+  trackedref *ref;
+
+  upb_lock();
+  found = upb_inttable_lookupptr(r->refs, owner, &v);
   UPB_ASSERT_VAR(found, found);
-  trackedref *ref = upb_value_getptr(v);
+  ref = upb_value_getptr(v);
   assert(ref->is_ref2 == ref2);
   upb_unlock();
 }
 
-// Populates the given UPB_CTYPE_INT32 inttable with counts of ref2's that
-// originate from the given owner.
+/* Populates the given UPB_CTYPE_INT32 inttable with counts of ref2's that
+ * originate from the given owner. */
 static void getref2s(const upb_refcounted *owner, upb_inttable *tab) {
-  upb_lock();
   upb_inttable_iter i;
+
+  upb_lock();
   upb_inttable_begin(&i, owner->ref2s);
   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
+    upb_value v;
+    upb_value count;
+    trackedref *ref;
+    bool ok;
+    bool found;
+
     upb_refcounted *to = (upb_refcounted*)upb_inttable_iter_key(&i);
 
-    // To get the count we need to look in the target's table.
-    upb_value v;
-    bool found = upb_inttable_lookupptr(to->refs, owner, &v);
+    /* To get the count we need to look in the target's table. */
+    found = upb_inttable_lookupptr(to->refs, owner, &v);
     assert(found);
-    trackedref *ref = upb_value_getptr(v);
-    upb_value count = upb_value_int32(ref->count);
+    ref = upb_value_getptr(v);
+    count = upb_value_int32(ref->count);
 
-    bool ok = upb_inttable_insertptr(tab, to, count);
+    ok = upb_inttable_insertptr(tab, to, count);
     CHECK_OOM(ok);
   }
   upb_unlock();
@@ -2945,15 +2887,18 @@
 static void visit_check(const upb_refcounted *obj, const upb_refcounted *subobj,
                         void *closure) {
   check_state *s = closure;
-  assert(obj == s->obj);
-  assert(subobj);
   upb_inttable *ref2 = &s->ref2;
   upb_value v;
-  bool removed = upb_inttable_removeptr(ref2, subobj, &v);
-  // The following assertion will fail if the visit() function visits a subobj
-  // that it did not have a ref2 on, or visits the same subobj too many times.
+  bool removed;
+  int32_t newcount;
+
+  assert(obj == s->obj);
+  assert(subobj);
+  removed = upb_inttable_removeptr(ref2, subobj, &v);
+  /* The following assertion will fail if the visit() function visits a subobj
+   * that it did not have a ref2 on, or visits the same subobj too many times. */
   assert(removed);
-  int32_t newcount = upb_value_getint32(v) - 1;
+  newcount = upb_value_getint32(v) - 1;
   if (newcount > 0) {
     upb_inttable_insert(ref2, (uintptr_t)subobj, upb_value_int32(newcount));
   }
@@ -2961,19 +2906,21 @@
 
 static void visit(const upb_refcounted *r, upb_refcounted_visit *v,
                   void *closure) {
-  // In DEBUG_REFS mode we know what existing ref2 refs there are, so we know
-  // exactly the set of nodes that visit() should visit.  So we verify visit()'s
-  // correctness here.
+  bool ok;
+
+  /* In DEBUG_REFS mode we know what existing ref2 refs there are, so we know
+   * exactly the set of nodes that visit() should visit.  So we verify visit()'s
+   * correctness here. */
   check_state state;
   state.obj = r;
-  bool ok = upb_inttable_init(&state.ref2, UPB_CTYPE_INT32);
+  ok = upb_inttable_init(&state.ref2, UPB_CTYPE_INT32);
   CHECK_OOM(ok);
   getref2s(r, &state.ref2);
 
-  // This should visit any children in the ref2 table.
+  /* This should visit any children in the ref2 table. */
   if (r->vtbl->visit) r->vtbl->visit(r, visit_check, &state);
 
-  // This assertion will fail if the visit() function missed any children.
+  /* This assertion will fail if the visit() function missed any children. */
   assert(upb_inttable_count(&state.ref2) == 0);
   upb_inttable_uninit(&state.ref2);
   if (r->vtbl->visit) r->vtbl->visit(r, v, closure);
@@ -3037,27 +2984,27 @@
   if (r->vtbl->visit) r->vtbl->visit(r, v, closure);
 }
 
-#endif  // UPB_DEBUG_REFS
+#endif  /* UPB_DEBUG_REFS */
 
 
 /* freeze() *******************************************************************/
 
-// The freeze() operation is by far the most complicated part of this scheme.
-// We compute strongly-connected components and then mutate the graph such that
-// we preserve the invariants documented at the top of this file.  And we must
-// handle out-of-memory errors gracefully (without leaving the graph
-// inconsistent), which adds to the fun.
+/* The freeze() operation is by far the most complicated part of this scheme.
+ * We compute strongly-connected components and then mutate the graph such that
+ * we preserve the invariants documented at the top of this file.  And we must
+ * handle out-of-memory errors gracefully (without leaving the graph
+ * inconsistent), which adds to the fun. */
 
-// The state used by the freeze operation (shared across many functions).
+/* The state used by the freeze operation (shared across many functions). */
 typedef struct {
   int depth;
   int maxdepth;
   uint64_t index;
-  // Maps upb_refcounted* -> attributes (color, etc).  attr layout varies by
-  // color.
+  /* Maps upb_refcounted* -> attributes (color, etc).  attr layout varies by
+   * color. */
   upb_inttable objattr;
-  upb_inttable stack;   // stack of upb_refcounted* for Tarjan's algorithm.
-  upb_inttable groups;  // array of uint32_t*, malloc'd refcounts for new groups
+  upb_inttable stack;   /* stack of upb_refcounted* for Tarjan's algorithm. */
+  upb_inttable groups;  /* array of uint32_t*, malloc'd refcounts for new groups */
   upb_status *status;
   jmp_buf err;
 } tarjan;
@@ -3066,15 +3013,15 @@
                          const upb_refcounted *subobj,
                          void *closure);
 
-// Node attributes /////////////////////////////////////////////////////////////
+/* Node attributes -----------------------------------------------------------*/
 
-// After our analysis phase all nodes will be either GRAY or WHITE.
+/* After our analysis phase all nodes will be either GRAY or WHITE. */
 
 typedef enum {
-  BLACK = 0,  // Object has not been seen.
-  GRAY,   // Object has been found via a refgroup but may not be reachable.
-  GREEN,  // Object is reachable and is currently on the Tarjan stack.
-  WHITE,  // Object is reachable and has been assigned a group (SCC).
+  BLACK = 0,  /* Object has not been seen. */
+  GRAY,   /* Object has been found via a refgroup but may not be reachable. */
+  GREEN,  /* Object is reachable and is currently on the Tarjan stack. */
+  WHITE   /* Object is reachable and has been assigned a group (SCC). */
 } color_t;
 
 UPB_NORETURN static void err(tarjan *t) { longjmp(t->err, 1); }
@@ -3102,7 +3049,7 @@
 }
 
 static color_t color(tarjan *t, const upb_refcounted *r) {
-  return trygetattr(t, r) & 0x3;  // Color is always stored in the low 2 bits.
+  return trygetattr(t, r) & 0x3;  /* Color is always stored in the low 2 bits. */
 }
 
 static void set_gray(tarjan *t, const upb_refcounted *r) {
@@ -3110,11 +3057,11 @@
   setattr(t, r, GRAY);
 }
 
-// Pushes an obj onto the Tarjan stack and sets it to GREEN.
+/* Pushes an obj onto the Tarjan stack and sets it to GREEN. */
 static void push(tarjan *t, const upb_refcounted *r) {
   assert(color(t, r) == BLACK || color(t, r) == GRAY);
-  // This defines the attr layout for the GREEN state.  "index" and "lowlink"
-  // get 31 bits, which is plenty (limit of 2B objects frozen at a time).
+  /* This defines the attr layout for the GREEN state.  "index" and "lowlink"
+   * get 31 bits, which is plenty (limit of 2B objects frozen at a time). */
   setattr(t, r, GREEN | (t->index << 2) | (t->index << 33));
   if (++t->index == 0x80000000) {
     upb_status_seterrmsg(t->status, "too many objects to freeze");
@@ -3123,13 +3070,13 @@
   upb_inttable_push(&t->stack, upb_value_ptr((void*)r));
 }
 
-// Pops an obj from the Tarjan stack and sets it to WHITE, with a ptr to its
-// SCC group.
+/* Pops an obj from the Tarjan stack and sets it to WHITE, with a ptr to its
+ * SCC group. */
 static upb_refcounted *pop(tarjan *t) {
   upb_refcounted *r = upb_value_getptr(upb_inttable_pop(&t->stack));
   assert(color(t, r) == GREEN);
-  // This defines the attr layout for nodes in the WHITE state.
-  // Top of group stack is [group, NULL]; we point at group.
+  /* This defines the attr layout for nodes in the WHITE state.
+   * Top of group stack is [group, NULL]; we point at group. */
   setattr(t, r, WHITE | (upb_inttable_count(&t->groups) - 2) << 8);
   return r;
 }
@@ -3137,7 +3084,7 @@
 static void tarjan_newgroup(tarjan *t) {
   uint32_t *group = malloc(sizeof(*group));
   if (!group) oom(t);
-  // Push group and empty group leader (we'll fill in leader later).
+  /* Push group and empty group leader (we'll fill in leader later). */
   if (!upb_inttable_push(&t->groups, upb_value_ptr(group)) ||
       !upb_inttable_push(&t->groups, upb_value_ptr(NULL))) {
     free(group);
@@ -3165,21 +3112,27 @@
 }
 
 static uint32_t *group(tarjan *t, upb_refcounted *r) {
-  assert(color(t, r) == WHITE);
-  uint64_t groupnum = getattr(t, r) >> 8;
+  uint64_t groupnum;
   upb_value v;
-  bool found = upb_inttable_lookup(&t->groups, groupnum, &v);
+  bool found;
+
+  assert(color(t, r) == WHITE);
+  groupnum = getattr(t, r) >> 8;
+  found = upb_inttable_lookup(&t->groups, groupnum, &v);
   UPB_ASSERT_VAR(found, found);
   return upb_value_getptr(v);
 }
 
-// If the group leader for this object's group has not previously been set,
-// the given object is assigned to be its leader.
+/* If the group leader for this object's group has not previously been set,
+ * the given object is assigned to be its leader. */
 static upb_refcounted *groupleader(tarjan *t, upb_refcounted *r) {
-  assert(color(t, r) == WHITE);
-  uint64_t leader_slot = (getattr(t, r) >> 8) + 1;
+  uint64_t leader_slot;
   upb_value v;
-  bool found = upb_inttable_lookup(&t->groups, leader_slot, &v);
+  bool found;
+
+  assert(color(t, r) == WHITE);
+  leader_slot = (getattr(t, r) >> 8) + 1;
+  found = upb_inttable_lookup(&t->groups, leader_slot, &v);
   UPB_ASSERT_VAR(found, found);
   if (upb_value_getptr(v)) {
     return upb_value_getptr(v);
@@ -3191,10 +3144,10 @@
 }
 
 
-// Tarjan's algorithm //////////////////////////////////////////////////////////
+/* Tarjan's algorithm --------------------------------------------------------*/
 
-// See:
-//   http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+/* See:
+ *   http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm */
 static void do_tarjan(const upb_refcounted *obj, tarjan *t);
 
 static void tarjan_visit(const upb_refcounted *obj,
@@ -3205,14 +3158,14 @@
     upb_status_seterrf(t->status, "graph too deep to freeze (%d)", t->maxdepth);
     err(t);
   } else if (subobj->is_frozen || color(t, subobj) == WHITE) {
-    // Do nothing: we don't want to visit or color already-frozen nodes,
-    // and WHITE nodes have already been assigned a SCC.
+    /* Do nothing: we don't want to visit or color already-frozen nodes,
+     * and WHITE nodes have already been assigned a SCC. */
   } else if (color(t, subobj) < GREEN) {
-    // Subdef has not yet been visited; recurse on it.
+    /* Subdef has not yet been visited; recurse on it. */
     do_tarjan(subobj, t);
     set_lowlink(t, obj, UPB_MIN(lowlink(t, obj), lowlink(t, subobj)));
   } else if (color(t, subobj) == GREEN) {
-    // Subdef is in the stack and hence in the current SCC.
+    /* Subdef is in the stack and hence in the current SCC. */
     set_lowlink(t, obj, UPB_MIN(lowlink(t, obj), idx(t, subobj)));
   }
   --t->depth;
@@ -3220,7 +3173,7 @@
 
 static void do_tarjan(const upb_refcounted *obj, tarjan *t) {
   if (color(t, obj) == BLACK) {
-    // We haven't seen this object's group; mark the whole group GRAY.
+    /* We haven't seen this object's group; mark the whole group GRAY. */
     const upb_refcounted *o = obj;
     do { set_gray(t, o); } while ((o = o->next) != obj);
   }
@@ -3235,15 +3188,15 @@
 }
 
 
-// freeze() ////////////////////////////////////////////////////////////////////
+/* freeze() ------------------------------------------------------------------*/
 
 static void crossref(const upb_refcounted *r, const upb_refcounted *subobj,
                      void *_t) {
   tarjan *t = _t;
   assert(color(t, r) > BLACK);
   if (color(t, subobj) > BLACK && r->group != subobj->group) {
-    // Previously this ref was not reflected in subobj->group because they
-    // were in the same group; now that they are split a ref must be taken.
+    /* Previously this ref was not reflected in subobj->group because they
+     * were in the same group; now that they are split a ref must be taken. */
     refgroup(subobj->group);
   }
 }
@@ -3251,10 +3204,12 @@
 static bool freeze(upb_refcounted *const*roots, int n, upb_status *s,
                    int maxdepth) {
   volatile bool ret = false;
+  int i;
+  upb_inttable_iter iter;
 
-  // We run in two passes so that we can allocate all memory before performing
-  // any mutation of the input -- this allows us to leave the input unchanged
-  // in the case of memory allocation failure.
+  /* We run in two passes so that we can allocate all memory before performing
+   * any mutation of the input -- this allows us to leave the input unchanged
+   * in the case of memory allocation failure. */
   tarjan t;
   t.index = 0;
   t.depth = 0;
@@ -3266,64 +3221,65 @@
   if (setjmp(t.err) != 0) goto err4;
 
 
-  for (int i = 0; i < n; i++) {
+  for (i = 0; i < n; i++) {
     if (color(&t, roots[i]) < GREEN) {
       do_tarjan(roots[i], &t);
     }
   }
 
-  // If we've made it this far, no further errors are possible so it's safe to
-  // mutate the objects without risk of leaving them in an inconsistent state.
+  /* If we've made it this far, no further errors are possible so it's safe to
+   * mutate the objects without risk of leaving them in an inconsistent state. */
   ret = true;
 
-  // The transformation that follows requires care.  The preconditions are:
-  // - all objects in attr map are WHITE or GRAY, and are in mutable groups
-  //   (groups of all mutable objs)
-  // - no ref2(to, from) refs have incremented count(to) if both "to" and
-  //   "from" are in our attr map (this follows from invariants (2) and (3))
+  /* The transformation that follows requires care.  The preconditions are:
+   * - all objects in attr map are WHITE or GRAY, and are in mutable groups
+   *   (groups of all mutable objs)
+   * - no ref2(to, from) refs have incremented count(to) if both "to" and
+   *   "from" are in our attr map (this follows from invariants (2) and (3)) */
 
-  // Pass 1: we remove WHITE objects from their mutable groups, and add them to
-  // new groups  according to the SCC's we computed.  These new groups will
-  // consist of only frozen objects.  None will be immediately collectible,
-  // because WHITE objects are by definition reachable from one of "roots",
-  // which the caller must own refs on.
-  upb_inttable_iter i;
-  upb_inttable_begin(&i, &t.objattr);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&i);
-    // Since removal from a singly-linked list requires access to the object's
-    // predecessor, we consider obj->next instead of obj for moving.  With the
-    // while() loop we guarantee that we will visit every node's predecessor.
-    // Proof:
-    //  1. every node's predecessor is in our attr map.
-    //  2. though the loop body may change a node's predecessor, it will only
-    //     change it to be the node we are currently operating on, so with a
-    //     while() loop we guarantee ourselves the chance to remove each node.
+  /* Pass 1: we remove WHITE objects from their mutable groups, and add them to
+   * new groups  according to the SCC's we computed.  These new groups will
+   * consist of only frozen objects.  None will be immediately collectible,
+   * because WHITE objects are by definition reachable from one of "roots",
+   * which the caller must own refs on. */
+  upb_inttable_begin(&iter, &t.objattr);
+  for(; !upb_inttable_done(&iter); upb_inttable_next(&iter)) {
+    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&iter);
+    /* Since removal from a singly-linked list requires access to the object's
+     * predecessor, we consider obj->next instead of obj for moving.  With the
+     * while() loop we guarantee that we will visit every node's predecessor.
+     * Proof:
+     *  1. every node's predecessor is in our attr map.
+     *  2. though the loop body may change a node's predecessor, it will only
+     *     change it to be the node we are currently operating on, so with a
+     *     while() loop we guarantee ourselves the chance to remove each node. */
     while (color(&t, obj->next) == WHITE &&
            group(&t, obj->next) != obj->next->group) {
-      // Remove from old group.
+      upb_refcounted *leader;
+
+      /* Remove from old group. */
       upb_refcounted *move = obj->next;
       if (obj == move) {
-        // Removing the last object from a group.
+        /* Removing the last object from a group. */
         assert(*obj->group == obj->individual_count);
         free(obj->group);
       } else {
         obj->next = move->next;
-        // This may decrease to zero; we'll collect GRAY objects (if any) that
-        // remain in the group in the third pass.
+        /* This may decrease to zero; we'll collect GRAY objects (if any) that
+         * remain in the group in the third pass. */
         assert(*move->group >= move->individual_count);
         *move->group -= move->individual_count;
       }
 
-      // Add to new group.
-      upb_refcounted *leader = groupleader(&t, move);
+      /* Add to new group. */
+      leader = groupleader(&t, move);
       if (move == leader) {
-        // First object added to new group is its leader.
+        /* First object added to new group is its leader. */
         move->group = group(&t, move);
         move->next = move;
         *move->group = move->individual_count;
       } else {
-        // Group already has at least one object in it.
+        /* Group already has at least one object in it. */
         assert(leader->group == group(&t, move));
         move->group = group(&t, move);
         move->next = leader->next;
@@ -3335,40 +3291,42 @@
     }
   }
 
-  // Pass 2: GRAY and WHITE objects "obj" with ref2(to, obj) references must
-  // increment count(to) if group(obj) != group(to) (which could now be the
-  // case if "to" was just frozen).
-  upb_inttable_begin(&i, &t.objattr);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&i);
+  /* Pass 2: GRAY and WHITE objects "obj" with ref2(to, obj) references must
+   * increment count(to) if group(obj) != group(to) (which could now be the
+   * case if "to" was just frozen). */
+  upb_inttable_begin(&iter, &t.objattr);
+  for(; !upb_inttable_done(&iter); upb_inttable_next(&iter)) {
+    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&iter);
     visit(obj, crossref, &t);
   }
 
-  // Pass 3: GRAY objects are collected if their group's refcount dropped to
-  // zero when we removed its white nodes.  This can happen if they had only
-  // been kept alive by virtue of sharing a group with an object that was just
-  // frozen.
-  //
-  // It is important that we do this last, since the GRAY object's free()
-  // function could call unref2() on just-frozen objects, which will decrement
-  // refs that were added in pass 2.
-  upb_inttable_begin(&i, &t.objattr);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&i);
+  /* Pass 3: GRAY objects are collected if their group's refcount dropped to
+   * zero when we removed its white nodes.  This can happen if they had only
+   * been kept alive by virtue of sharing a group with an object that was just
+   * frozen.
+   *
+   * It is important that we do this last, since the GRAY object's free()
+   * function could call unref2() on just-frozen objects, which will decrement
+   * refs that were added in pass 2. */
+  upb_inttable_begin(&iter, &t.objattr);
+  for(; !upb_inttable_done(&iter); upb_inttable_next(&iter)) {
+    upb_refcounted *obj = (upb_refcounted*)upb_inttable_iter_key(&iter);
     if (obj->group == NULL || *obj->group == 0) {
       if (obj->group) {
-        // We eagerly free() the group's count (since we can't easily determine
-        // the group's remaining size it's the easiest way to ensure it gets
-        // done).
+        upb_refcounted *o;
+
+        /* We eagerly free() the group's count (since we can't easily determine
+         * the group's remaining size it's the easiest way to ensure it gets
+         * done). */
         free(obj->group);
 
-        // Visit to release ref2's (done in a separate pass since release_ref2
-        // depends on o->group being unmodified so it can test merged()).
-        upb_refcounted *o = obj;
+        /* Visit to release ref2's (done in a separate pass since release_ref2
+         * depends on o->group being unmodified so it can test merged()). */
+        o = obj;
         do { visit(o, release_ref2, NULL); } while ((o = o->next) != obj);
 
-        // Mark "group" fields as NULL so we know to free the objects later in
-        // this loop, but also don't try to delete the group twice.
+        /* Mark "group" fields as NULL so we know to free the objects later in
+         * this loop, but also don't try to delete the group twice. */
         o = obj;
         do { o->group = NULL; } while ((o = o->next) != obj);
       }
@@ -3378,9 +3336,9 @@
 
 err4:
   if (!ret) {
-    upb_inttable_begin(&i, &t.groups);
-    for(; !upb_inttable_done(&i); upb_inttable_next(&i))
-      free(upb_value_getptr(upb_inttable_iter_value(&i)));
+    upb_inttable_begin(&iter, &t.groups);
+    for(; !upb_inttable_done(&iter); upb_inttable_next(&iter))
+      free(upb_value_getptr(upb_inttable_iter_value(&iter)));
   }
   upb_inttable_uninit(&t.groups);
 err3:
@@ -3399,21 +3357,24 @@
 }
 
 static void merge(upb_refcounted *r, upb_refcounted *from) {
+  upb_refcounted *base;
+  upb_refcounted *tmp;
+
   if (merged(r, from)) return;
   *r->group += *from->group;
   free(from->group);
-  upb_refcounted *base = from;
+  base = from;
 
-  // Set all refcount pointers in the "from" chain to the merged refcount.
-  //
-  // TODO(haberman): this linear algorithm can result in an overall O(n^2) bound
-  // if the user continuously extends a group by one object.  Prevent this by
-  // using one of the techniques in this paper:
-  //     ftp://www.ncedc.org/outgoing/geomorph/dino/orals/p245-tarjan.pdf
+  /* Set all refcount pointers in the "from" chain to the merged refcount.
+   *
+   * TODO(haberman): this linear algorithm can result in an overall O(n^2) bound
+   * if the user continuously extends a group by one object.  Prevent this by
+   * using one of the techniques in this paper:
+   *     ftp://www.ncedc.org/outgoing/geomorph/dino/orals/p245-tarjan.pdf */
   do { from->group = r->group; } while ((from = from->next) != base);
 
-  // Merge the two circularly linked lists by swapping their next pointers.
-  upb_refcounted *tmp = r->next;
+  /* Merge the two circularly linked lists by swapping their next pointers. */
+  tmp = r->next;
   r->next = base->next;
   base->next = tmp;
 }
@@ -3433,11 +3394,13 @@
 
 static void unref(const upb_refcounted *r) {
   if (unrefgroup(r->group)) {
+    const upb_refcounted *o;
+
     free(r->group);
 
-    // In two passes, since release_ref2 needs a guarantee that any subobjs
-    // are alive.
-    const upb_refcounted *o = r;
+    /* In two passes, since release_ref2 needs a guarantee that any subobjs
+     * are alive. */
+    o = r;
     do { visit(o, release_ref2, NULL); } while((o = o->next) != r);
 
     o = r;
@@ -3461,6 +3424,18 @@
 bool upb_refcounted_init(upb_refcounted *r,
                          const struct upb_refcounted_vtbl *vtbl,
                          const void *owner) {
+#ifndef NDEBUG
+  /* Endianness check.  This is unrelated to upb_refcounted, it's just a
+   * convenient place to put the check that we can be assured will run for
+   * basically every program using upb. */
+  const int x = 1;
+#ifdef UPB_BIG_ENDIAN
+  assert(*(char*)&x != 1);
+#else
+  assert(*(char*)&x == 1);
+#endif
+#endif
+
   r->next = r;
   r->vtbl = vtbl;
   r->individual_count = 0;
@@ -3495,7 +3470,7 @@
 }
 
 void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from) {
-  assert(!from->is_frozen);  // Non-const pointer implies this.
+  assert(!from->is_frozen);  /* Non-const pointer implies this. */
   track(r, from, true);
   if (r->is_frozen) {
     refgroup(r->group);
@@ -3505,7 +3480,7 @@
 }
 
 void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from) {
-  assert(!from->is_frozen);  // Non-const pointer implies this.
+  assert(!from->is_frozen);  /* Non-const pointer implies this. */
   untrack(r, from, true);
   if (r->is_frozen) {
     unref(r);
@@ -3529,7 +3504,8 @@
 
 bool upb_refcounted_freeze(upb_refcounted *const*roots, int n, upb_status *s,
                            int maxdepth) {
-  for (int i = 0; i < n; i++) {
+  int i;
+  for (i = 0; i < n; i++) {
     assert(!roots[i]->is_frozen);
   }
   return freeze(roots, n, s, maxdepth);
@@ -3544,7 +3520,7 @@
 
 #include <stdlib.h>
 
-// Fallback implementation if the shim is not specialized by the JIT.
+/* Fallback implementation if the shim is not specialized by the JIT. */
 #define SHIM_WRITER(type, ctype)                                              \
   bool upb_shim_set ## type (void *c, const void *hd, ctype val) {            \
     uint8_t *m = c;                                                           \
@@ -3566,12 +3542,14 @@
 
 bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
                   int32_t hasbit) {
+  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
+  bool ok;
+
   upb_shim_data *d = malloc(sizeof(*d));
   if (!d) return false;
   d->offset = offset;
   d->hasbit = hasbit;
 
-  upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
   upb_handlerattr_sethandlerdata(&attr, d);
   upb_handlerattr_setalwaysok(&attr, true);
   upb_handlers_addcleanup(h, d, free);
@@ -3580,7 +3558,7 @@
   case UPB_TYPE_##u: \
     ok = upb_handlers_set##l(h, f, upb_shim_set##l, &attr); break;
 
-  bool ok = false;
+  ok = false;
 
   switch (upb_fielddef_type(f)) {
     TYPE(INT64,  int64);
@@ -3634,27 +3612,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-bool upb_symtab_isfrozen(const upb_symtab *s) {
-  return upb_refcounted_isfrozen(UPB_UPCAST(s));
-}
-
-void upb_symtab_ref(const upb_symtab *s, const void *owner) {
-  upb_refcounted_ref(UPB_UPCAST(s), owner);
-}
-
-void upb_symtab_unref(const upb_symtab *s, const void *owner) {
-  upb_refcounted_unref(UPB_UPCAST(s), owner);
-}
-
-void upb_symtab_donateref(
-    const upb_symtab *s, const void *from, const void *to) {
-  upb_refcounted_donateref(UPB_UPCAST(s), from, to);
-}
-
-void upb_symtab_checkref(const upb_symtab *s, const void *owner) {
-  upb_refcounted_checkref(UPB_UPCAST(s), owner);
-}
-
 static void upb_symtab_free(upb_refcounted *r) {
   upb_symtab *s = (upb_symtab*)r;
   upb_strtable_iter i;
@@ -3671,18 +3628,21 @@
 upb_symtab *upb_symtab_new(const void *owner) {
   static const struct upb_refcounted_vtbl vtbl = {NULL, &upb_symtab_free};
   upb_symtab *s = malloc(sizeof(*s));
-  upb_refcounted_init(UPB_UPCAST(s), &vtbl, owner);
+  upb_refcounted_init(upb_symtab_upcast_mutable(s), &vtbl, owner);
   upb_strtable_init(&s->symtab, UPB_CTYPE_PTR);
   return s;
 }
 
 void upb_symtab_freeze(upb_symtab *s) {
+  upb_refcounted *r;
+  bool ok;
+
   assert(!upb_symtab_isfrozen(s));
-  upb_refcounted *r = UPB_UPCAST(s);
-  // The symtab does not take ref2's (see refcounted.h) on the defs, because
-  // defs cannot refer back to the table and therefore cannot create cycles.  So
-  // 0 will suffice for maxdepth here.
-  bool ok = upb_refcounted_freeze(&r, 1, NULL, 0);
+  r = upb_symtab_upcast_mutable(s);
+  /* The symtab does not take ref2's (see refcounted.h) on the defs, because
+   * defs cannot refer back to the table and therefore cannot create cycles.  So
+   * 0 will suffice for maxdepth here. */
+  ok = upb_refcounted_freeze(&r, 1, NULL, 0);
   UPB_ASSERT_VAR(ok, ok);
 }
 
@@ -3707,19 +3667,19 @@
   return def ? upb_dyncast_enumdef(def) : NULL;
 }
 
-// Given a symbol and the base symbol inside which it is defined, find the
-// symbol's definition in t.
+/* Given a symbol and the base symbol inside which it is defined, find the
+ * symbol's definition in t. */
 static upb_def *upb_resolvename(const upb_strtable *t,
                                 const char *base, const char *sym) {
   if(strlen(sym) == 0) return NULL;
   if(sym[0] == '.') {
-    // Symbols starting with '.' are absolute, so we do a single lookup.
-    // Slice to omit the leading '.'
+    /* Symbols starting with '.' are absolute, so we do a single lookup.
+     * Slice to omit the leading '.' */
     upb_value v;
     return upb_strtable_lookup(t, sym + 1, &v) ? upb_value_getptr(v) : NULL;
   } else {
-    // Remove components from base until we find an entry or run out.
-    // TODO: This branch is totally broken, but currently not used.
+    /* Remove components from base until we find an entry or run out.
+     * TODO: This branch is totally broken, but currently not used. */
     (void)base;
     assert(false);
     return NULL;
@@ -3732,36 +3692,41 @@
   return ret;
 }
 
-// Searches def and its children to find defs that have the same name as any
-// def in "addtab."  Returns true if any where found, and as a side-effect adds
-// duplicates of these defs into addtab.
-//
-// We use a modified depth-first traversal that traverses each SCC (which we
-// already computed) as if it were a single node.  This allows us to traverse
-// the possibly-cyclic graph as if it were a DAG and to dup the correct set of
-// nodes with O(n) time.
+/* Searches def and its children to find defs that have the same name as any
+ * def in "addtab."  Returns true if any where found, and as a side-effect adds
+ * duplicates of these defs into addtab.
+ *
+ * We use a modified depth-first traversal that traverses each SCC (which we
+ * already computed) as if it were a single node.  This allows us to traverse
+ * the possibly-cyclic graph as if it were a DAG and to dup the correct set of
+ * nodes with O(n) time. */
 static bool upb_resolve_dfs(const upb_def *def, upb_strtable *addtab,
                             const void *new_owner, upb_inttable *seen,
                             upb_status *s) {
-  // Memoize results of this function for efficiency (since we're traversing a
-  // DAG this is not needed to limit the depth of the search).
+  /* Memoize results of this function for efficiency (since we're traversing a
+   * DAG this is not needed to limit the depth of the search). */
   upb_value v;
+  bool need_dup;
+  const upb_def *base;
+
   if (upb_inttable_lookup(seen, (uintptr_t)def, &v))
     return upb_value_getbool(v);
 
-  // Visit submessages for all messages in the SCC.
-  bool need_dup = false;
-  const upb_def *base = def;
+  /* Visit submessages for all messages in the SCC. */
+  need_dup = false;
+  base = def;
   do {
+    upb_value v;
+    const upb_msgdef *m;
+
     assert(upb_def_isfrozen(def));
     if (def->type == UPB_DEF_FIELD) continue;
-    upb_value v;
     if (upb_strtable_lookup(addtab, upb_def_fullname(def), &v)) {
       need_dup = true;
     }
 
-    // For messages, continue the recursion by visiting all subdefs.
-    const upb_msgdef *m = upb_dyncast_msgdef(def);
+    /* For messages, continue the recursion by visiting all subdefs. */
+    m = upb_dyncast_msgdef(def);
     if (m) {
       upb_msg_field_iter i;
       for(upb_msg_field_begin(&i, m);
@@ -3769,7 +3734,7 @@
           upb_msg_field_next(&i)) {
         upb_fielddef *f = upb_msg_iter_field(&i);
         if (!upb_fielddef_hassubdef(f)) continue;
-        // |= to avoid short-circuit; we need its side-effects.
+        /* |= to avoid short-circuit; we need its side-effects. */
         need_dup |= upb_resolve_dfs(
             upb_fielddef_subdef(f), addtab, new_owner, seen, s);
         if (!upb_ok(s)) return false;
@@ -3778,11 +3743,13 @@
   } while ((def = (upb_def*)def->base.next) != base);
 
   if (need_dup) {
-    // Dup any defs that don't already have entries in addtab.
+    /* Dup any defs that don't already have entries in addtab. */
     def = base;
     do {
+      const char *name;
+
       if (def->type == UPB_DEF_FIELD) continue;
-      const char *name = upb_def_fullname(def);
+      name = upb_def_fullname(def);
       if (!upb_strtable_lookup(addtab, name, NULL)) {
         upb_def *newdef = upb_def_dup(def, new_owner);
         if (!newdef) goto oom;
@@ -3801,34 +3768,41 @@
   return false;
 }
 
-// TODO(haberman): we need a lot more testing of error conditions.
-// The came_from_user stuff in particular is not tested.
+/* TODO(haberman): we need a lot more testing of error conditions.
+ * The came_from_user stuff in particular is not tested. */
 bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
                     upb_status *status) {
-  assert(!upb_symtab_isfrozen(s));
+  int i;
+  upb_strtable_iter iter;
   upb_def **add_defs = NULL;
   upb_strtable addtab;
+  upb_inttable seen;
+
+  assert(!upb_symtab_isfrozen(s));
   if (!upb_strtable_init(&addtab, UPB_CTYPE_PTR)) {
     upb_status_seterrmsg(status, "out of memory");
     return false;
   }
 
-  // Add new defs to our "add" set.
-  for (int i = 0; i < n; i++) {
+  /* Add new defs to our "add" set. */
+  for (i = 0; i < n; i++) {
     upb_def *def = defs[i];
+    const char *fullname;
+    upb_fielddef *f;
+
     if (upb_def_isfrozen(def)) {
       upb_status_seterrmsg(status, "added defs must be mutable");
       goto err;
     }
     assert(!upb_def_isfrozen(def));
-    const char *fullname = upb_def_fullname(def);
+    fullname = upb_def_fullname(def);
     if (!fullname) {
       upb_status_seterrmsg(
           status, "Anonymous defs cannot be added to a symtab");
       goto err;
     }
 
-    upb_fielddef *f = upb_dyncast_fielddef_mutable(def);
+    f = upb_dyncast_fielddef_mutable(def);
 
     if (f) {
       if (!upb_fielddef_containingtypename(f)) {
@@ -3842,8 +3816,8 @@
         upb_status_seterrf(status, "Conflicting defs named '%s'", fullname);
         goto err;
       }
-      // We need this to back out properly, because if there is a failure we
-      // need to donate the ref back to the caller.
+      /* We need this to back out properly, because if there is a failure we
+       * need to donate the ref back to the caller. */
       def->came_from_user = true;
       upb_def_donateref(def, ref_donor, s);
       if (!upb_strtable_insert(&addtab, fullname, upb_value_ptr(def)))
@@ -3851,31 +3825,33 @@
     }
   }
 
-  // Add standalone fielddefs (ie. extensions) to the appropriate messages.
-  // If the appropriate message only exists in the existing symtab, duplicate
-  // it so we have a mutable copy we can add the fields to.
-  for (int i = 0; i < n; i++) {
+  /* Add standalone fielddefs (ie. extensions) to the appropriate messages.
+   * If the appropriate message only exists in the existing symtab, duplicate
+   * it so we have a mutable copy we can add the fields to. */
+  for (i = 0; i < n; i++) {
     upb_def *def = defs[i];
     upb_fielddef *f = upb_dyncast_fielddef_mutable(def);
+    const char *msgname;
+    upb_value v;
+    upb_msgdef *m;
+
     if (!f) continue;
-    const char *msgname = upb_fielddef_containingtypename(f);
-    // We validated this earlier in this function.
+    msgname = upb_fielddef_containingtypename(f);
+    /* We validated this earlier in this function. */
     assert(msgname);
 
-    // If the extendee name is absolutely qualified, move past the initial ".".
-    // TODO(haberman): it is not obvious what it would mean if this was not
-    // absolutely qualified.
+    /* If the extendee name is absolutely qualified, move past the initial ".".
+     * TODO(haberman): it is not obvious what it would mean if this was not
+     * absolutely qualified. */
     if (msgname[0] == '.') {
       msgname++;
     }
 
-    upb_value v;
-    upb_msgdef *m;
     if (upb_strtable_lookup(&addtab, msgname, &v)) {
-      // Extendee is in the set of defs the user asked us to add.
+      /* Extendee is in the set of defs the user asked us to add. */
       m = upb_value_getptr(v);
     } else {
-      // Need to find and dup the extendee from the existing symtab.
+      /* Need to find and dup the extendee from the existing symtab. */
       const upb_msgdef *frozen_m = upb_symtab_lookupmsg(s, msgname);
       if (!frozen_m) {
         upb_status_seterrf(status,
@@ -3897,37 +3873,37 @@
     }
   }
 
-  // Add dups of any existing def that can reach a def with the same name as
-  // anything in our "add" set.
-  upb_inttable seen;
+  /* Add dups of any existing def that can reach a def with the same name as
+   * anything in our "add" set. */
   if (!upb_inttable_init(&seen, UPB_CTYPE_BOOL)) goto oom_err;
-  upb_strtable_iter i;
-  upb_strtable_begin(&i, &s->symtab);
-  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
+  upb_strtable_begin(&iter, &s->symtab);
+  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
     upb_resolve_dfs(def, &addtab, s, &seen, status);
     if (!upb_ok(status)) goto err;
   }
   upb_inttable_uninit(&seen);
 
-  // Now using the table, resolve symbolic references for subdefs.
-  upb_strtable_begin(&i, &addtab);
-  for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
+  /* Now using the table, resolve symbolic references for subdefs. */
+  upb_strtable_begin(&iter, &addtab);
+  for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    const char *base;
+    upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
     upb_msgdef *m = upb_dyncast_msgdef_mutable(def);
-    if (!m) continue;
-    // Type names are resolved relative to the message in which they appear.
-    const char *base = upb_msgdef_fullname(m);
-
     upb_msg_field_iter j;
+
+    if (!m) continue;
+    /* Type names are resolved relative to the message in which they appear. */
+    base = upb_msgdef_fullname(m);
+
     for(upb_msg_field_begin(&j, m);
         !upb_msg_field_done(&j);
         upb_msg_field_next(&j)) {
       upb_fielddef *f = upb_msg_iter_field(&j);
       const char *name = upb_fielddef_subdefname(f);
       if (name && !upb_fielddef_subdef(f)) {
-        // Try the lookup in the current set of to-be-added defs first. If not
-        // there, try existing defs.
+        /* Try the lookup in the current set of to-be-added defs first. If not
+         * there, try existing defs. */
         upb_def *subdef = upb_resolvename(&addtab, base, name);
         if (subdef == NULL) {
           subdef = upb_resolvename(&s->symtab, base, name);
@@ -3943,31 +3919,33 @@
     }
   }
 
-  // We need an array of the defs in addtab, for passing to upb_def_freeze.
+  /* We need an array of the defs in addtab, for passing to upb_def_freeze. */
   add_defs = malloc(sizeof(void*) * upb_strtable_count(&addtab));
   if (add_defs == NULL) goto oom_err;
-  upb_strtable_begin(&i, &addtab);
-  for (n = 0; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-    add_defs[n++] = upb_value_getptr(upb_strtable_iter_value(&i));
+  upb_strtable_begin(&iter, &addtab);
+  for (n = 0; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+    add_defs[n++] = upb_value_getptr(upb_strtable_iter_value(&iter));
   }
 
   if (!upb_def_freeze(add_defs, n, status)) goto err;
 
-  // This must be delayed until all errors have been detected, since error
-  // recovery code uses this table to cleanup defs.
+  /* This must be delayed until all errors have been detected, since error
+   * recovery code uses this table to cleanup defs. */
   upb_strtable_uninit(&addtab);
 
-  // TODO(haberman) we don't properly handle errors after this point (like
-  // OOM in upb_strtable_insert() below).
-  for (int i = 0; i < n; i++) {
+  /* TODO(haberman) we don't properly handle errors after this point (like
+   * OOM in upb_strtable_insert() below). */
+  for (i = 0; i < n; i++) {
     upb_def *def = add_defs[i];
     const char *name = upb_def_fullname(def);
     upb_value v;
+    bool success;
+
     if (upb_strtable_remove(&s->symtab, name, &v)) {
       const upb_def *def = upb_value_getptr(v);
       upb_def_unref(def, s);
     }
-    bool success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));
+    success = upb_strtable_insert(&s->symtab, name, upb_value_ptr(def));
     UPB_ASSERT_VAR(success, success == true);
   }
   free(add_defs);
@@ -3976,12 +3954,11 @@
 oom_err:
   upb_status_seterrmsg(status, "out of memory");
 err: {
-    // For defs the user passed in, we need to donate the refs back.  For defs
-    // we dup'd, we need to just unref them.
-    upb_strtable_iter i;
-    upb_strtable_begin(&i, &addtab);
-    for (; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&i));
+    /* For defs the user passed in, we need to donate the refs back.  For defs
+     * we dup'd, we need to just unref them. */
+    upb_strtable_begin(&iter, &addtab);
+    for (; !upb_strtable_done(&iter); upb_strtable_next(&iter)) {
+      upb_def *def = upb_value_getptr(upb_strtable_iter_value(&iter));
       bool came_from_user = def->came_from_user;
       def->came_from_user = false;
       if (came_from_user) {
@@ -3997,7 +3974,7 @@
   return false;
 }
 
-// Iteration.
+/* Iteration. */
 
 static void advance_to_matching(upb_symtab_iter *iter) {
   if (iter->type == UPB_DEF_ANY)
@@ -4041,17 +4018,17 @@
 #include <stdlib.h>
 #include <string.h>
 
-#define UPB_MAXARRSIZE 16  // 64k.
+#define UPB_MAXARRSIZE 16  /* 64k. */
 
-// From Chromium.
+/* From Chromium. */
 #define ARRAY_SIZE(x) \
     ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
 
 static const double MAX_LOAD = 0.85;
 
-// The minimum utilization of the array part of a mixed hash/array table.  This
-// is a speed/memory-usage tradeoff (though it's not straightforward because of
-// cache effects).  The lower this is, the more memory we'll use.
+/* The minimum utilization of the array part of a mixed hash/array table.  This
+ * is a speed/memory-usage tradeoff (though it's not straightforward because of
+ * cache effects).  The lower this is, the more memory we'll use. */
 static const double MIN_DENSITY = 0.1;
 
 bool is_pow2(uint64_t v) { return v == 0 || (v & (v - 1)) == 0; }
@@ -4060,7 +4037,7 @@
   int ret = 0;
   bool pow2 = is_pow2(v);
   while (v >>= 1) ret++;
-  ret = pow2 ? ret : ret + 1;  // Ceiling.
+  ret = pow2 ? ret : ret + 1;  /* Ceiling. */
   return UPB_MIN(UPB_MAXARRSIZE, ret);
 }
 
@@ -4069,12 +4046,15 @@
 }
 
 char *upb_strdup2(const char *s, size_t len) {
-  // Prevent overflow errors.
+  size_t n;
+  char *p;
+
+  /* Prevent overflow errors. */
   if (len == SIZE_MAX) return NULL;
-  // Always null-terminate, even if binary data; but don't rely on the input to
-  // have a null-terminating byte since it may be a raw binary buffer.
-  size_t n = len + 1;
-  char *p = malloc(n);
+  /* Always null-terminate, even if binary data; but don't rely on the input to
+   * have a null-terminating byte since it may be a raw binary buffer. */
+  n = len + 1;
+  p = malloc(n);
   if (p) {
     memcpy(p, s, len);
     p[len] = 0;
@@ -4082,21 +4062,25 @@
   return p;
 }
 
-// A type to represent the lookup key of either a strtable or an inttable.
-typedef struct {
-  upb_tabkey key;
+/* A type to represent the lookup key of either a strtable or an inttable. */
+typedef union {
+  uintptr_t num;
+  struct {
+    const char *str;
+    size_t len;
+  } str;
 } lookupkey_t;
 
 static lookupkey_t strkey2(const char *str, size_t len) {
   lookupkey_t k;
-  k.key.s.str = (char*)str;
-  k.key.s.length = len;
+  k.str.str = str;
+  k.str.len = len;
   return k;
 }
 
 static lookupkey_t intkey(uintptr_t key) {
   lookupkey_t k;
-  k.key = upb_intkey(key);
+  k.num = key;
   return k;
 }
 
@@ -4105,7 +4089,7 @@
 
 /* Base table (shared code) ***************************************************/
 
-// For when we need to cast away const.
+/* For when we need to cast away const. */
 static upb_tabent *mutable_entries(upb_table *t) {
   return (upb_tabent*)t->entries;
 }
@@ -4115,11 +4099,13 @@
 }
 
 static bool init(upb_table *t, upb_ctype_t ctype, uint8_t size_lg2) {
+  size_t bytes;
+
   t->count = 0;
   t->ctype = ctype;
   t->size_lg2 = size_lg2;
   t->mask = upb_table_size(t) ? upb_table_size(t) - 1 : 0;
-  size_t bytes = upb_table_size(t) * sizeof(upb_tabent);
+  bytes = upb_table_size(t) * sizeof(upb_tabent);
   if (bytes > 0) {
     t->entries = malloc(bytes);
     if (!t->entries) return false;
@@ -4143,8 +4129,10 @@
 
 static const upb_tabent *findentry(const upb_table *t, lookupkey_t key,
                                    uint32_t hash, eqlfunc_t *eql) {
+  const upb_tabent *e;
+
   if (t->size_lg2 == 0) return NULL;
-  const upb_tabent *e = upb_getentry(t, hash);
+  e = upb_getentry(t, hash);
   if (upb_tabent_isempty(e)) return NULL;
   while (1) {
     if (eql(e->key, key)) return e;
@@ -4162,7 +4150,7 @@
   const upb_tabent *e = findentry(t, key, hash, eql);
   if (e) {
     if (v) {
-      _upb_value_setval(v, e->val, t->ctype);
+      _upb_value_setval(v, e->val.val, t->ctype);
     }
     return true;
   } else {
@@ -4170,34 +4158,41 @@
   }
 }
 
-// The given key must not already exist in the table.
-static void insert(upb_table *t, lookupkey_t key, upb_value val,
-                   uint32_t hash, hashfunc_t *hashfunc, eqlfunc_t *eql) {
+/* The given key must not already exist in the table. */
+static void insert(upb_table *t, lookupkey_t key, upb_tabkey tabkey,
+                   upb_value val, uint32_t hash,
+                   hashfunc_t *hashfunc, eqlfunc_t *eql) {
+  upb_tabent *mainpos_e;
+  upb_tabent *our_e;
+
   UPB_UNUSED(eql);
+  UPB_UNUSED(key);
   assert(findentry(t, key, hash, eql) == NULL);
   assert(val.ctype == t->ctype);
+
   t->count++;
-  upb_tabent *mainpos_e = getentry_mutable(t, hash);
-  upb_tabent *our_e = mainpos_e;
+  mainpos_e = getentry_mutable(t, hash);
+  our_e = mainpos_e;
+
   if (upb_tabent_isempty(mainpos_e)) {
-    // Our main position is empty; use it.
+    /* Our main position is empty; use it. */
     our_e->next = NULL;
   } else {
-    // Collision.
+    /* Collision. */
     upb_tabent *new_e = emptyent(t);
-    // Head of collider's chain.
+    /* Head of collider's chain. */
     upb_tabent *chain = getentry_mutable(t, hashfunc(mainpos_e->key));
     if (chain == mainpos_e) {
-      // Existing ent is in its main posisiton (it has the same hash as us, and
-      // is the head of our chain).  Insert to new ent and append to this chain.
+      /* Existing ent is in its main posisiton (it has the same hash as us, and
+       * is the head of our chain).  Insert to new ent and append to this chain. */
       new_e->next = mainpos_e->next;
       mainpos_e->next = new_e;
       our_e = new_e;
     } else {
-      // Existing ent is not in its main position (it is a node in some other
-      // chain).  This implies that no existing ent in the table has our hash.
-      // Evict it (updating its chain) and use its ent for head of our chain.
-      *new_e = *mainpos_e;  // copies next.
+      /* Existing ent is not in its main position (it is a node in some other
+       * chain).  This implies that no existing ent in the table has our hash.
+       * Evict it (updating its chain) and use its ent for head of our chain. */
+      *new_e = *mainpos_e;  /* copies next. */
       while (chain->next != mainpos_e) {
         chain = (upb_tabent*)chain->next;
         assert(chain);
@@ -4207,8 +4202,8 @@
       our_e->next = NULL;
     }
   }
-  our_e->key = key.key;
-  our_e->val = val.val;
+  our_e->key = tabkey;
+  our_e->val.val = val.val;
   assert(findentry(t, key, hash, eql) == our_e);
 }
 
@@ -4217,33 +4212,36 @@
   upb_tabent *chain = getentry_mutable(t, hash);
   if (upb_tabent_isempty(chain)) return false;
   if (eql(chain->key, key)) {
-    // Element to remove is at the head of its chain.
+    /* Element to remove is at the head of its chain. */
     t->count--;
     if (val) {
-      _upb_value_setval(val, chain->val, t->ctype);
+      _upb_value_setval(val, chain->val.val, t->ctype);
     }
     if (chain->next) {
       upb_tabent *move = (upb_tabent*)chain->next;
       *chain = *move;
       if (removed) *removed = move->key;
-      move->key.num = 0;  // Make the slot empty.
+      move->key = 0;  /* Make the slot empty. */
     } else {
       if (removed) *removed = chain->key;
-      chain->key.num = 0;  // Make the slot empty.
+      chain->key = 0;  /* Make the slot empty. */
     }
     return true;
   } else {
-    // Element to remove is either in a non-head position or not in the table.
+    /* Element to remove is either in a non-head position or not in the
+     * table. */
     while (chain->next && !eql(chain->next->key, key))
       chain = (upb_tabent*)chain->next;
     if (chain->next) {
-      // Found element to remove.
+      /* Found element to remove. */
+      upb_tabent *rm;
+
       if (val) {
-        _upb_value_setval(val, chain->next->val, t->ctype);
+        _upb_value_setval(val, chain->next->val.val, t->ctype);
       }
-      upb_tabent *rm = (upb_tabent*)chain->next;
+      rm = (upb_tabent*)chain->next;
       if (removed) *removed = rm->key;
-      rm->key.num = 0;
+      rm->key = 0;
       chain->next = rm->next;
       t->count--;
       return true;
@@ -4269,15 +4267,26 @@
 
 /* upb_strtable ***************************************************************/
 
-// A simple "subclass" of upb_table that only adds a hash function for strings.
+/* A simple "subclass" of upb_table that only adds a hash function for strings. */
+
+static upb_tabkey strcopy(lookupkey_t k2) {
+  char *str = malloc(k2.str.len + sizeof(uint32_t) + 1);
+  if (str == NULL) return 0;
+  memcpy(str, &k2.str.len, sizeof(uint32_t));
+  memcpy(str + sizeof(uint32_t), k2.str.str, k2.str.len + 1);
+  return (uintptr_t)str;
+}
 
 static uint32_t strhash(upb_tabkey key) {
-  return MurmurHash2(key.s.str, key.s.length, 0);
+  uint32_t len;
+  char *str = upb_tabstr(key, &len);
+  return MurmurHash2(str, len, 0);
 }
 
 static bool streql(upb_tabkey k1, lookupkey_t k2) {
-  return k1.s.length == k2.key.s.length &&
-         memcmp(k1.s.str, k2.key.s.str, k1.s.length) == 0;
+  uint32_t len;
+  char *str = upb_tabstr(k1, &len);
+  return len == k2.str.len && memcmp(str, k2.str.str, len) == 0;
 }
 
 bool upb_strtable_init(upb_strtable *t, upb_ctype_t ctype) {
@@ -4285,16 +4294,18 @@
 }
 
 void upb_strtable_uninit(upb_strtable *t) {
-  for (size_t i = 0; i < upb_table_size(&t->t); i++)
-    free((void*)t->t.entries[i].key.s.str);
+  size_t i;
+  for (i = 0; i < upb_table_size(&t->t); i++)
+    free((void*)t->t.entries[i].key);
   uninit(&t->t);
 }
 
 bool upb_strtable_resize(upb_strtable *t, size_t size_lg2) {
   upb_strtable new_table;
+  upb_strtable_iter i;
+
   if (!init(&new_table.t, t->t.ctype, size_lg2))
     return false;
-  upb_strtable_iter i;
   upb_strtable_begin(&i, t);
   for ( ; !upb_strtable_done(&i); upb_strtable_next(&i)) {
     upb_strtable_insert2(
@@ -4310,17 +4321,23 @@
 
 bool upb_strtable_insert2(upb_strtable *t, const char *k, size_t len,
                           upb_value v) {
+  lookupkey_t key;
+  upb_tabkey tabkey;
+  uint32_t hash;
+
   if (isfull(&t->t)) {
-    // Need to resize.  New table of double the size, add old elements to it.
+    /* Need to resize.  New table of double the size, add old elements to it. */
     if (!upb_strtable_resize(t, t->t.size_lg2 + 1)) {
       return false;
     }
   }
-  if ((k = upb_strdup2(k, len)) == NULL) return false;
 
-  lookupkey_t key = strkey2(k, len);
-  uint32_t hash = MurmurHash2(key.key.s.str, key.key.s.length, 0);
-  insert(&t->t, key, v, hash, &strhash, &streql);
+  key = strkey2(k, len);
+  tabkey = strcopy(key);
+  if (tabkey == 0) return false;
+
+  hash = MurmurHash2(key.str.str, key.str.len, 0);
+  insert(&t->t, key, tabkey, v, hash, &strhash, &streql);
   return true;
 }
 
@@ -4335,14 +4352,14 @@
   uint32_t hash = MurmurHash2(key, strlen(key), 0);
   upb_tabkey tabkey;
   if (rm(&t->t, strkey2(key, len), val, &tabkey, hash, &streql)) {
-    free((void*)tabkey.s.str);
+    free((void*)tabkey);
     return true;
   } else {
     return false;
   }
 }
 
-// Iteration
+/* Iteration */
 
 static const upb_tabent *str_tabent(const upb_strtable_iter *i) {
   return &i->t->t.entries[i->index];
@@ -4364,17 +4381,19 @@
 
 const char *upb_strtable_iter_key(upb_strtable_iter *i) {
   assert(!upb_strtable_done(i));
-  return str_tabent(i)->key.s.str;
+  return upb_tabstr(str_tabent(i)->key, NULL);
 }
 
 size_t upb_strtable_iter_keylength(upb_strtable_iter *i) {
+  uint32_t len;
   assert(!upb_strtable_done(i));
-  return str_tabent(i)->key.s.length;
+  upb_tabstr(str_tabent(i)->key, &len);
+  return len;
 }
 
 upb_value upb_strtable_iter_value(const upb_strtable_iter *i) {
   assert(!upb_strtable_done(i));
-  return _upb_value_val(str_tabent(i)->val, i->t->t.ctype);
+  return _upb_value_val(str_tabent(i)->val.val, i->t->t.ctype);
 }
 
 void upb_strtable_iter_setdone(upb_strtable_iter *i) {
@@ -4391,20 +4410,20 @@
 
 /* upb_inttable ***************************************************************/
 
-// For inttables we use a hybrid structure where small keys are kept in an
-// array and large keys are put in the hash table.
+/* For inttables we use a hybrid structure where small keys are kept in an
+ * array and large keys are put in the hash table. */
 
-static uint32_t inthash(upb_tabkey key) { return upb_inthash(key.num); }
+static uint32_t inthash(upb_tabkey key) { return upb_inthash(key); }
 
 static bool inteql(upb_tabkey k1, lookupkey_t k2) {
-  return k1.num == k2.key.num;
+  return k1 == k2.num;
 }
 
-static _upb_value *mutable_array(upb_inttable *t) {
-  return (_upb_value*)t->array;
+static upb_tabval *mutable_array(upb_inttable *t) {
+  return (upb_tabval*)t->array;
 }
 
-static _upb_value *inttable_val(upb_inttable *t, uintptr_t key) {
+static upb_tabval *inttable_val(upb_inttable *t, uintptr_t key) {
   if (key < t->array_size) {
     return upb_arrhas(t->array[key]) ? &(mutable_array(t)[key]) : NULL;
   } else {
@@ -4414,7 +4433,7 @@
   }
 }
 
-static const _upb_value *inttable_val_const(const upb_inttable *t,
+static const upb_tabval *inttable_val_const(const upb_inttable *t,
                                             uintptr_t key) {
   return inttable_val((upb_inttable*)t, key);
 }
@@ -4426,25 +4445,29 @@
 static void check(upb_inttable *t) {
   UPB_UNUSED(t);
 #if defined(UPB_DEBUG_TABLE) && !defined(NDEBUG)
-  // This check is very expensive (makes inserts/deletes O(N)).
-  size_t count = 0;
-  upb_inttable_iter i;
-  upb_inttable_begin(&i, t);
-  for(; !upb_inttable_done(&i); upb_inttable_next(&i), count++) {
-    assert(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));
+  {
+    /* This check is very expensive (makes inserts/deletes O(N)). */
+    size_t count = 0;
+    upb_inttable_iter i;
+    upb_inttable_begin(&i, t);
+    for(; !upb_inttable_done(&i); upb_inttable_next(&i), count++) {
+      assert(upb_inttable_lookup(t, upb_inttable_iter_key(&i), NULL));
+    }
+    assert(count == upb_inttable_count(t));
   }
-  assert(count == upb_inttable_count(t));
 #endif
 }
 
 bool upb_inttable_sizedinit(upb_inttable *t, upb_ctype_t ctype,
                             size_t asize, int hsize_lg2) {
+  size_t array_bytes;
+
   if (!init(&t->t, ctype, hsize_lg2)) return false;
-  // Always make the array part at least 1 long, so that we know key 0
-  // won't be in the hash part, which simplifies things.
+  /* Always make the array part at least 1 long, so that we know key 0
+   * won't be in the hash part, which simplifies things. */
   t->array_size = UPB_MAX(1, asize);
   t->array_count = 0;
-  size_t array_bytes = t->array_size * sizeof(upb_value);
+  array_bytes = t->array_size * sizeof(upb_value);
   t->array = malloc(array_bytes);
   if (!t->array) {
     uninit(&t->t);
@@ -4465,24 +4488,32 @@
 }
 
 bool upb_inttable_insert(upb_inttable *t, uintptr_t key, upb_value val) {
-  assert(upb_arrhas(val.val));
+  /* XXX: Table can't store value (uint64_t)-1.  Need to somehow statically
+   * guarantee that this is not necessary, or fix the limitation. */
+  upb_tabval tabval;
+  tabval.val = val.val;
+  UPB_UNUSED(tabval);
+  assert(upb_arrhas(tabval));
+
   if (key < t->array_size) {
     assert(!upb_arrhas(t->array[key]));
     t->array_count++;
-    mutable_array(t)[key] = val.val;
+    mutable_array(t)[key].val = val.val;
   } else {
     if (isfull(&t->t)) {
-      // Need to resize the hash part, but we re-use the array part.
+      /* Need to resize the hash part, but we re-use the array part. */
+      size_t i;
       upb_table new_table;
       if (!init(&new_table, t->t.ctype, t->t.size_lg2 + 1))
         return false;
-      size_t i;
       for (i = begin(&t->t); i < upb_table_size(&t->t); i = next(&t->t, i)) {
         const upb_tabent *e = &t->t.entries[i];
+        uint32_t hash;
         upb_value v;
-        _upb_value_setval(&v, e->val, t->t.ctype);
-        uint32_t hash = upb_inthash(e->key.num);
-        insert(&new_table, intkey(e->key.num), v, hash, &inthash, &inteql);
+
+        _upb_value_setval(&v, e->val.val, t->t.ctype);
+        hash = upb_inthash(e->key);
+        insert(&new_table, intkey(e->key), e->key, v, hash, &inthash, &inteql);
       }
 
       assert(t->t.count == new_table.count);
@@ -4490,23 +4521,23 @@
       uninit(&t->t);
       t->t = new_table;
     }
-    insert(&t->t, intkey(key), val, upb_inthash(key), &inthash, &inteql);
+    insert(&t->t, intkey(key), key, val, upb_inthash(key), &inthash, &inteql);
   }
   check(t);
   return true;
 }
 
 bool upb_inttable_lookup(const upb_inttable *t, uintptr_t key, upb_value *v) {
-  const _upb_value *table_v = inttable_val_const(t, key);
+  const upb_tabval *table_v = inttable_val_const(t, key);
   if (!table_v) return false;
-  if (v) _upb_value_setval(v, *table_v, t->t.ctype);
+  if (v) _upb_value_setval(v, table_v->val, t->t.ctype);
   return true;
 }
 
 bool upb_inttable_replace(upb_inttable *t, uintptr_t key, upb_value val) {
-  _upb_value *table_v = inttable_val(t, key);
+  upb_tabval *table_v = inttable_val(t, key);
   if (!table_v) return false;
-  *table_v = val.val;
+  table_v->val = val.val;
   return true;
 }
 
@@ -4514,11 +4545,11 @@
   bool success;
   if (key < t->array_size) {
     if (upb_arrhas(t->array[key])) {
+      upb_tabval empty = UPB_TABVALUE_EMPTY_INIT;
       t->array_count--;
       if (val) {
-        _upb_value_setval(val, t->array[key], t->t.ctype);
+        _upb_value_setval(val, t->array[key].val, t->t.ctype);
       }
-      _upb_value empty = UPB_ARRAY_EMPTYENT;
       mutable_array(t)[key] = empty;
       success = true;
     } else {
@@ -4558,10 +4589,14 @@
 }
 
 void upb_inttable_compact(upb_inttable *t) {
-  // Create a power-of-two histogram of the table keys.
+  /* Create a power-of-two histogram of the table keys. */
   int counts[UPB_MAXARRSIZE + 1] = {0};
   uintptr_t max_key = 0;
   upb_inttable_iter i;
+  size_t arr_size;
+  int arr_count;
+  upb_inttable new_t;
+
   upb_inttable_begin(&i, t);
   for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {
     uintptr_t key = upb_inttable_iter_key(&i);
@@ -4571,15 +4606,17 @@
     counts[log2ceil(key)]++;
   }
 
-  size_t arr_size = 1;
-  int arr_count = upb_inttable_count(t);
+  arr_size = 1;
+  arr_count = upb_inttable_count(t);
 
   if (upb_inttable_count(t) >= max_key * MIN_DENSITY) {
-    // We can put 100% of the entries in the array part.
+    /* We can put 100% of the entries in the array part. */
     arr_size = max_key + 1;
   } else {
-    // Find the largest power of two that satisfies the MIN_DENSITY definition.
-    for (int size_lg2 = ARRAY_SIZE(counts) - 1; size_lg2 > 1; size_lg2--) {
+    /* Find the largest power of two that satisfies the MIN_DENSITY
+     * definition. */
+    int size_lg2;
+    for (size_lg2 = ARRAY_SIZE(counts) - 1; size_lg2 > 1; size_lg2--) {
       arr_size = 1 << size_lg2;
       arr_count -= counts[size_lg2];
       if (arr_count >= arr_size * MIN_DENSITY) {
@@ -4588,38 +4625,39 @@
     }
   }
 
-  // Array part must always be at least 1 entry large to catch lookups of key
-  // 0.  Key 0 must always be in the array part because "0" in the hash part
-  // denotes an empty entry.
+  /* Array part must always be at least 1 entry large to catch lookups of key
+   * 0.  Key 0 must always be in the array part because "0" in the hash part
+   * denotes an empty entry. */
   arr_size = UPB_MAX(arr_size, 1);
 
-  // Insert all elements into new, perfectly-sized table.
-  int hash_count = upb_inttable_count(t) - arr_count;
-  int hash_size = hash_count ? (hash_count / MAX_LOAD) + 1 : 0;
-  int hashsize_lg2 = log2ceil(hash_size);
-  assert(hash_count >= 0);
+  {
+    /* Insert all elements into new, perfectly-sized table. */
+    int hash_count = upb_inttable_count(t) - arr_count;
+    int hash_size = hash_count ? (hash_count / MAX_LOAD) + 1 : 0;
+    int hashsize_lg2 = log2ceil(hash_size);
 
-  upb_inttable new_t;
-  upb_inttable_sizedinit(&new_t, t->t.ctype, arr_size, hashsize_lg2);
-  upb_inttable_begin(&i, t);
-  for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-    uintptr_t k = upb_inttable_iter_key(&i);
-    upb_inttable_insert(&new_t, k, upb_inttable_iter_value(&i));
+    assert(hash_count >= 0);
+    upb_inttable_sizedinit(&new_t, t->t.ctype, arr_size, hashsize_lg2);
+    upb_inttable_begin(&i, t);
+    for (; !upb_inttable_done(&i); upb_inttable_next(&i)) {
+      uintptr_t k = upb_inttable_iter_key(&i);
+      upb_inttable_insert(&new_t, k, upb_inttable_iter_value(&i));
+    }
+    assert(new_t.array_size == arr_size);
+    assert(new_t.t.size_lg2 == hashsize_lg2);
   }
-  assert(new_t.array_size == arr_size);
-  assert(new_t.t.size_lg2 == hashsize_lg2);
   upb_inttable_uninit(t);
   *t = new_t;
 }
 
-// Iteration.
+/* Iteration. */
 
 static const upb_tabent *int_tabent(const upb_inttable_iter *i) {
   assert(!i->array_part);
   return &i->t->t.entries[i->index];
 }
 
-static _upb_value int_arrent(const upb_inttable_iter *i) {
+static upb_tabval int_arrent(const upb_inttable_iter *i) {
   assert(i->array_part);
   return i->t->array[i->index];
 }
@@ -4658,13 +4696,13 @@
 
 uintptr_t upb_inttable_iter_key(const upb_inttable_iter *i) {
   assert(!upb_inttable_done(i));
-  return i->array_part ? i->index : int_tabent(i)->key.num;
+  return i->array_part ? i->index : int_tabent(i)->key;
 }
 
 upb_value upb_inttable_iter_value(const upb_inttable_iter *i) {
   assert(!upb_inttable_done(i));
   return _upb_value_val(
-      i->array_part ? i->t->array[i->index] : int_tabent(i)->val,
+      i->array_part ? i->t->array[i->index].val : int_tabent(i)->val.val,
       i->t->t.ctype);
 }
 
@@ -4682,26 +4720,26 @@
 }
 
 #ifdef UPB_UNALIGNED_READS_OK
-//-----------------------------------------------------------------------------
-// MurmurHash2, by Austin Appleby (released as public domain).
-// Reformatted and C99-ified by Joshua Haberman.
-// Note - This code makes a few assumptions about how your machine behaves -
-//   1. We can read a 4-byte value from any address without crashing
-//   2. sizeof(int) == 4 (in upb this limitation is removed by using uint32_t
-// And it has a few limitations -
-//   1. It will not work incrementally.
-//   2. It will not produce the same results on little-endian and big-endian
-//      machines.
+/* -----------------------------------------------------------------------------
+ * MurmurHash2, by Austin Appleby (released as public domain).
+ * Reformatted and C99-ified by Joshua Haberman.
+ * Note - This code makes a few assumptions about how your machine behaves -
+ *   1. We can read a 4-byte value from any address without crashing
+ *   2. sizeof(int) == 4 (in upb this limitation is removed by using uint32_t
+ * And it has a few limitations -
+ *   1. It will not work incrementally.
+ *   2. It will not produce the same results on little-endian and big-endian
+ *      machines. */
 uint32_t MurmurHash2(const void *key, size_t len, uint32_t seed) {
-  // 'm' and 'r' are mixing constants generated offline.
-  // They're not really 'magic', they just happen to work well.
+  /* 'm' and 'r' are mixing constants generated offline.
+   * They're not really 'magic', they just happen to work well. */
   const uint32_t m = 0x5bd1e995;
   const int32_t r = 24;
 
-  // Initialize the hash to a 'random' value
+  /* Initialize the hash to a 'random' value */
   uint32_t h = seed ^ len;
 
-  // Mix 4 bytes at a time into the hash
+  /* Mix 4 bytes at a time into the hash */
   const uint8_t * data = (const uint8_t *)key;
   while(len >= 4) {
     uint32_t k = *(uint32_t *)data;
@@ -4717,15 +4755,15 @@
     len -= 4;
   }
 
-  // Handle the last few bytes of the input array
+  /* Handle the last few bytes of the input array */
   switch(len) {
     case 3: h ^= data[2] << 16;
     case 2: h ^= data[1] << 8;
     case 1: h ^= data[0]; h *= m;
   };
 
-  // Do a few final mixes of the hash to ensure the last few
-  // bytes are well-incorporated.
+  /* Do a few final mixes of the hash to ensure the last few
+   * bytes are well-incorporated. */
   h ^= h >> 13;
   h *= m;
   h ^= h >> 15;
@@ -4733,13 +4771,13 @@
   return h;
 }
 
-#else // !UPB_UNALIGNED_READS_OK
+#else /* !UPB_UNALIGNED_READS_OK */
 
-//-----------------------------------------------------------------------------
-// MurmurHashAligned2, by Austin Appleby
-// Same algorithm as MurmurHash2, but only does aligned reads - should be safer
-// on certain platforms.
-// Performance will be lower than MurmurHash2
+/* -----------------------------------------------------------------------------
+ * MurmurHashAligned2, by Austin Appleby
+ * Same algorithm as MurmurHash2, but only does aligned reads - should be safer
+ * on certain platforms.
+ * Performance will be lower than MurmurHash2 */
 
 #define MIX(h,k,m) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; }
 
@@ -4751,8 +4789,10 @@
   uint8_t align = (uintptr_t)data & 3;
 
   if(align && (len >= 4)) {
-    // Pre-load the temp registers
+    /* Pre-load the temp registers */
     uint32_t t = 0, d = 0;
+    int32_t sl;
+    int32_t sr;
 
     switch(align) {
       case 1: t |= data[2] << 16;
@@ -4765,16 +4805,18 @@
     data += 4-align;
     len -= 4-align;
 
-    int32_t sl = 8 * (4-align);
-    int32_t sr = 8 * align;
+    sl = 8 * (4-align);
+    sr = 8 * align;
 
-    // Mix
+    /* Mix */
 
     while(len >= 4) {
+      uint32_t k;
+
       d = *(uint32_t *)data;
       t = (t >> sr) | (d << sl);
 
-      uint32_t k = t;
+      k = t;
 
       MIX(h,k,m);
 
@@ -4784,25 +4826,27 @@
       len -= 4;
     }
 
-    // Handle leftover data in temp registers
+    /* Handle leftover data in temp registers */
 
     d = 0;
 
     if(len >= align) {
+      uint32_t k;
+
       switch(align) {
         case 3: d |= data[2] << 16;
         case 2: d |= data[1] << 8;
         case 1: d |= data[0];
       }
 
-      uint32_t k = (t >> sr) | (d << sl);
+      k = (t >> sr) | (d << sl);
       MIX(h,k,m);
 
       data += align;
       len -= align;
 
-      //----------
-      // Handle tail bytes
+      /* ----------
+       * Handle tail bytes */
 
       switch(len) {
         case 3: h ^= data[2] << 16;
@@ -4833,8 +4877,8 @@
       len -= 4;
     }
 
-    //----------
-    // Handle tail bytes
+    /* ----------
+     * Handle tail bytes */
 
     switch(len) {
       case 3: h ^= data[2] << 16;
@@ -4851,7 +4895,7 @@
 }
 #undef MIX
 
-#endif // UPB_UNALIGNED_READS_OK
+#endif /* UPB_UNALIGNED_READS_OK */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -4873,10 +4917,10 @@
   return false;
 }
 
-// Guarantee null-termination and provide ellipsis truncation.
-// It may be tempting to "optimize" this by initializing these final
-// four bytes up-front and then being careful never to overwrite them,
-// this is safer and simpler.
+/* Guarantee null-termination and provide ellipsis truncation.
+ * It may be tempting to "optimize" this by initializing these final
+ * four bytes up-front and then being careful never to overwrite them,
+ * this is safer and simpler. */
 static void nullz(upb_status *status) {
   const char *ellipsis = "...";
   size_t len = strlen(ellipsis);
@@ -4918,7 +4962,7 @@
 void upb_status_vseterrf(upb_status *status, const char *fmt, va_list args) {
   if (!status) return;
   status->ok_ = false;
-  vsnprintf(status->msg, sizeof(status->msg), fmt, args);
+  _upb_vsnprintf(status->msg, sizeof(status->msg), fmt, args);
   nullz(status);
 }
 
@@ -4935,9 +4979,9 @@
   if (!to) return;
   *to = *from;
 }
-// This file was generated by upbc (the upb compiler).
-// Do not edit -- your changes will be discarded when the file is
-// regenerated.
+/* This file was generated by upbc (the upb compiler).
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
 
 
 static const upb_msgdef msgs[20];
@@ -4945,7 +4989,7 @@
 static const upb_enumdef enums[4];
 static const upb_tabent strentries[236];
 static const upb_tabent intentries[14];
-static const _upb_value arrays[232];
+static const upb_tabval arrays[232];
 
 #ifdef UPB_DEBUG_REFS
 static upb_inttable reftables[212];
@@ -4978,21 +5022,21 @@
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[18], NULL, 15, 6, {0},&reftables[40], &reftables[41]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[3], NULL, 6, 1, {0},&reftables[42], &reftables[43]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[10], NULL, 17, 6, {0},&reftables[44], &reftables[45]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[7], UPB_UPCAST(&enums[2]), 6, 1, {0},&reftables[46], &reftables[47]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[7], (const upb_def*)(&enums[2]), 6, 1, {0},&reftables[46], &reftables[47]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[6], NULL, 16, 7, {0},&reftables[48], &reftables[49]),
   UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[8], NULL, 30, 8, {0},&reftables[50], &reftables[51]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[7], NULL, 8, 3, {0},&reftables[52], &reftables[53]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[18], NULL, 11, 4, {0},&reftables[54], &reftables[55]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 3, 1, {0},&reftables[56], &reftables[57]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], UPB_UPCAST(&msgs[2]), 16, 2, {0},&reftables[58], &reftables[59]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[8], UPB_UPCAST(&msgs[2]), 13, 1, {0},&reftables[60], &reftables[61]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[2]), 16, 2, {0},&reftables[58], &reftables[59]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[8], (const upb_def*)(&msgs[2]), 13, 1, {0},&reftables[60], &reftables[61]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "experimental_map_key", 9, &msgs[7], NULL, 10, 5, {0},&reftables[62], &reftables[63]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[6], NULL, 7, 2, {0},&reftables[64], &reftables[65]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[8], UPB_UPCAST(&msgs[6]), 19, 3, {0},&reftables[66], &reftables[67]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], UPB_UPCAST(&msgs[6]), 22, 4, {0},&reftables[68], &reftables[69]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], UPB_UPCAST(&msgs[1]), 19, 3, {0},&reftables[70], &reftables[71]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], UPB_UPCAST(&msgs[6]), 10, 0, {0},&reftables[72], &reftables[73]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[9], UPB_UPCAST(&msgs[8]), 5, 0, {0},&reftables[74], &reftables[75]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[8], (const upb_def*)(&msgs[6]), 19, 3, {0},&reftables[66], &reftables[67]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[6]), 22, 4, {0},&reftables[68], &reftables[69]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 19, 3, {0},&reftables[70], &reftables[71]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[6]), 10, 0, {0},&reftables[72], &reftables[73]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[9], (const upb_def*)(&msgs[8]), 5, 0, {0},&reftables[74], &reftables[75]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[10], NULL, 14, 5, {0},&reftables[76], &reftables[77]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[18], NULL, 6, 1, {0},&reftables[78], &reftables[79]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[12], NULL, 7, 2, {0},&reftables[80], &reftables[81]),
@@ -5002,16 +5046,16 @@
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[10], NULL, 13, 4, {0},&reftables[88], &reftables[89]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[10], NULL, 9, 2, {0},&reftables[90], &reftables[91]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[10], NULL, 6, 1, {0},&reftables[92], &reftables[93]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[6], UPB_UPCAST(&enums[0]), 11, 4, {0},&reftables[94], &reftables[95]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[6], (const upb_def*)(&enums[0]), 11, 4, {0},&reftables[94], &reftables[95]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[7], NULL, 9, 4, {0},&reftables[96], &reftables[97]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[17], NULL, 8, 2, {0},&reftables[98], &reftables[99]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[16], UPB_UPCAST(&msgs[17]), 5, 0, {0},&reftables[100], &reftables[101]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[16], (const upb_def*)(&msgs[17]), 5, 0, {0},&reftables[100], &reftables[101]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[11], NULL, 6, 1, {0},&reftables[102], &reftables[103]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[8], UPB_UPCAST(&msgs[0]), 10, 0, {0},&reftables[104], &reftables[105]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[14], UPB_UPCAST(&msgs[12]), 6, 0, {0},&reftables[106], &reftables[107]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[8], (const upb_def*)(&msgs[0]), 10, 0, {0},&reftables[104], &reftables[105]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[14], (const upb_def*)(&msgs[12]), 6, 0, {0},&reftables[106], &reftables[107]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[8], NULL, 22, 6, {0},&reftables[108], &reftables[109]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[14], NULL, 8, 2, {0},&reftables[110], &reftables[111]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[18], UPB_UPCAST(&msgs[19]), 5, 0, {0},&reftables[112], &reftables[113]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[18], (const upb_def*)(&msgs[19]), 5, 0, {0},&reftables[112], &reftables[113]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[4], NULL, 4, 1, {0},&reftables[114], &reftables[115]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 24, 6, {0},&reftables[116], &reftables[117]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[12], NULL, 4, 1, {0},&reftables[118], &reftables[119]),
@@ -5019,18 +5063,18 @@
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[6], NULL, 4, 1, {0},&reftables[122], &reftables[123]),
   UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[19], NULL, 2, 0, {0},&reftables[124], &reftables[125]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[18], NULL, 10, 3, {0},&reftables[126], &reftables[127]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], UPB_UPCAST(&msgs[0]), 13, 1, {0},&reftables[128], &reftables[129]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 13, 1, {0},&reftables[128], &reftables[129]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[11], NULL, 7, 2, {0},&reftables[130], &reftables[131]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[6], NULL, 10, 3, {0},&reftables[132], &reftables[133]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[4], NULL, 7, 2, {0},&reftables[134], &reftables[135]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[10], UPB_UPCAST(&enums[3]), 12, 3, {0},&reftables[136], &reftables[137]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], UPB_UPCAST(&msgs[11]), 23, 5, {0},&reftables[138], &reftables[139]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[2], UPB_UPCAST(&msgs[3]), 7, 1, {0},&reftables[140], &reftables[141]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[6], UPB_UPCAST(&msgs[7]), 3, 0, {0},&reftables[142], &reftables[143]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[4], UPB_UPCAST(&msgs[5]), 3, 0, {0},&reftables[144], &reftables[145]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[8], UPB_UPCAST(&msgs[10]), 20, 4, {0},&reftables[146], &reftables[147]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[14], UPB_UPCAST(&msgs[15]), 7, 1, {0},&reftables[148], &reftables[149]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[12], UPB_UPCAST(&msgs[13]), 3, 0, {0},&reftables[150], &reftables[151]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[10], (const upb_def*)(&enums[3]), 12, 3, {0},&reftables[136], &reftables[137]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[11]), 23, 5, {0},&reftables[138], &reftables[139]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[2], (const upb_def*)(&msgs[3]), 7, 1, {0},&reftables[140], &reftables[141]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[6], (const upb_def*)(&msgs[7]), 3, 0, {0},&reftables[142], &reftables[143]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[4], (const upb_def*)(&msgs[5]), 3, 0, {0},&reftables[144], &reftables[145]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[8], (const upb_def*)(&msgs[10]), 20, 4, {0},&reftables[146], &reftables[147]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[14], (const upb_def*)(&msgs[15]), 7, 1, {0},&reftables[148], &reftables[149]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[12], (const upb_def*)(&msgs[13]), 3, 0, {0},&reftables[150], &reftables[151]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[12], NULL, 10, 3, {0},&reftables[152], &reftables[153]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[8], NULL, 25, 7, {0},&reftables[154], &reftables[155]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[7], NULL, 7, 2, {0},&reftables[156], &reftables[157]),
@@ -5038,22 +5082,22 @@
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[18], NULL, 9, 2, {0},&reftables[160], &reftables[161]),
   UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[8], NULL, 35, 9, {0},&reftables[162], &reftables[163]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[10], NULL, 19, 8, {0},&reftables[164], &reftables[165]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[8], UPB_UPCAST(&msgs[14]), 16, 2, {0},&reftables[166], &reftables[167]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[8], UPB_UPCAST(&msgs[16]), 21, 5, {0},&reftables[168], &reftables[169]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[8], (const upb_def*)(&msgs[14]), 16, 2, {0},&reftables[166], &reftables[167]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[8], (const upb_def*)(&msgs[16]), 21, 5, {0},&reftables[168], &reftables[169]),
   UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[17], NULL, 7, 1, {0},&reftables[170], &reftables[171]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 2, 0, {0},&reftables[172], &reftables[173]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[18], NULL, 12, 5, {0},&reftables[174], &reftables[175]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[17], NULL, 11, 3, {0},&reftables[176], &reftables[177]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[6], UPB_UPCAST(&enums[1]), 12, 5, {0},&reftables[178], &reftables[179]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[6], (const upb_def*)(&enums[1]), 12, 5, {0},&reftables[178], &reftables[179]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[6], NULL, 13, 6, {0},&reftables[180], &reftables[181]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[5], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[182], &reftables[183]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[15], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[184], &reftables[185]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[3], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[186], &reftables[187]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[13], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[188], &reftables[189]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[10], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[190], &reftables[191]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[192], &reftables[193]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[7], UPB_UPCAST(&msgs[18]), 5, 0, {0},&reftables[194], &reftables[195]),
-  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[2], UPB_UPCAST(&msgs[4]), 6, 0, {0},&reftables[196], &reftables[197]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[5], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[182], &reftables[183]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[15], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[184], &reftables[185]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[3], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[186], &reftables[187]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[13], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[188], &reftables[189]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[10], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[190], &reftables[191]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[192], &reftables[193]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[7], (const upb_def*)(&msgs[18]), 5, 0, {0},&reftables[194], &reftables[195]),
+  UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[2], (const upb_def*)(&msgs[4]), 6, 0, {0},&reftables[196], &reftables[197]),
   UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[7], NULL, 13, 6, {0},&reftables[198], &reftables[199]),
   UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[8], NULL, 38, 10, {0},&reftables[200], &reftables[201]),
 };
@@ -5066,494 +5110,494 @@
 };
 
 static const upb_tabent strentries[236] = {
-  {UPB_TABKEY_STR("extension"), UPB_VALUE_INIT_CONSTPTR(&fields[14]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[38]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("field"), UPB_VALUE_INIT_CONSTPTR(&fields[16]), NULL},
-  {UPB_TABKEY_STR("extension_range"), UPB_VALUE_INIT_CONSTPTR(&fields[15]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("nested_type"), UPB_VALUE_INIT_CONSTPTR(&fields[44]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[49]), NULL},
-  {UPB_TABKEY_STR("enum_type"), UPB_VALUE_INIT_CONSTPTR(&fields[9]), &strentries[14]},
-  {UPB_TABKEY_STR("start"), UPB_VALUE_INIT_CONSTPTR(&fields[66]), NULL},
-  {UPB_TABKEY_STR("end"), UPB_VALUE_INIT_CONSTPTR(&fields[8]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("value"), UPB_VALUE_INIT_CONSTPTR(&fields[78]), NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[50]), NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[40]), &strentries[22]},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[73]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("allow_alias"), UPB_VALUE_INIT_CONSTPTR(&fields[1]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("number"), UPB_VALUE_INIT_CONSTPTR(&fields[47]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[52]), NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[37]), &strentries[30]},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[71]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("label"), UPB_VALUE_INIT_CONSTPTR(&fields[27]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[41]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("number"), UPB_VALUE_INIT_CONSTPTR(&fields[46]), &strentries[49]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("type_name"), UPB_VALUE_INIT_CONSTPTR(&fields[70]), NULL},
-  {UPB_TABKEY_STR("extendee"), UPB_VALUE_INIT_CONSTPTR(&fields[12]), NULL},
-  {UPB_TABKEY_STR("type"), UPB_VALUE_INIT_CONSTPTR(&fields[69]), &strentries[48]},
-  {UPB_TABKEY_STR("default_value"), UPB_VALUE_INIT_CONSTPTR(&fields[4]), NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[51]), NULL},
-  {UPB_TABKEY_STR("experimental_map_key"), UPB_VALUE_INIT_CONSTPTR(&fields[11]), &strentries[67]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("weak"), UPB_VALUE_INIT_CONSTPTR(&fields[79]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("packed"), UPB_VALUE_INIT_CONSTPTR(&fields[58]), NULL},
-  {UPB_TABKEY_STR("lazy"), UPB_VALUE_INIT_CONSTPTR(&fields[28]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("ctype"), UPB_VALUE_INIT_CONSTPTR(&fields[3]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("deprecated"), UPB_VALUE_INIT_CONSTPTR(&fields[6]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[77]), NULL},
-  {UPB_TABKEY_STR("extension"), UPB_VALUE_INIT_CONSTPTR(&fields[13]), NULL},
-  {UPB_TABKEY_STR("weak_dependency"), UPB_VALUE_INIT_CONSTPTR(&fields[80]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[34]), NULL},
-  {UPB_TABKEY_STR("service"), UPB_VALUE_INIT_CONSTPTR(&fields[63]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("source_code_info"), UPB_VALUE_INIT_CONSTPTR(&fields[64]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("dependency"), UPB_VALUE_INIT_CONSTPTR(&fields[5]), NULL},
-  {UPB_TABKEY_STR("message_type"), UPB_VALUE_INIT_CONSTPTR(&fields[32]), NULL},
-  {UPB_TABKEY_STR("package"), UPB_VALUE_INIT_CONSTPTR(&fields[57]), NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[53]), &strentries[82]},
-  {UPB_TABKEY_STR("enum_type"), UPB_VALUE_INIT_CONSTPTR(&fields[10]), NULL},
-  {UPB_TABKEY_STR("public_dependency"), UPB_VALUE_INIT_CONSTPTR(&fields[61]), &strentries[81]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("file"), UPB_VALUE_INIT_CONSTPTR(&fields[17]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[75]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("cc_generic_services"), UPB_VALUE_INIT_CONSTPTR(&fields[2]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("java_multiple_files"), UPB_VALUE_INIT_CONSTPTR(&fields[24]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("java_generic_services"), UPB_VALUE_INIT_CONSTPTR(&fields[23]), &strentries[102]},
-  {UPB_TABKEY_STR("java_generate_equals_and_hash"), UPB_VALUE_INIT_CONSTPTR(&fields[22]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("go_package"), UPB_VALUE_INIT_CONSTPTR(&fields[18]), NULL},
-  {UPB_TABKEY_STR("java_package"), UPB_VALUE_INIT_CONSTPTR(&fields[26]), NULL},
-  {UPB_TABKEY_STR("optimize_for"), UPB_VALUE_INIT_CONSTPTR(&fields[48]), NULL},
-  {UPB_TABKEY_STR("py_generic_services"), UPB_VALUE_INIT_CONSTPTR(&fields[62]), NULL},
-  {UPB_TABKEY_STR("java_outer_classname"), UPB_VALUE_INIT_CONSTPTR(&fields[25]), NULL},
-  {UPB_TABKEY_STR("message_set_wire_format"), UPB_VALUE_INIT_CONSTPTR(&fields[31]), &strentries[106]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[76]), NULL},
-  {UPB_TABKEY_STR("no_standard_descriptor_accessor"), UPB_VALUE_INIT_CONSTPTR(&fields[45]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[39]), NULL},
-  {UPB_TABKEY_STR("input_type"), UPB_VALUE_INIT_CONSTPTR(&fields[20]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("output_type"), UPB_VALUE_INIT_CONSTPTR(&fields[56]), NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[55]), NULL},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[74]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("options"), UPB_VALUE_INIT_CONSTPTR(&fields[54]), &strentries[122]},
-  {UPB_TABKEY_STR("method"), UPB_VALUE_INIT_CONSTPTR(&fields[33]), NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[35]), &strentries[121]},
-  {UPB_TABKEY_STR("uninterpreted_option"), UPB_VALUE_INIT_CONSTPTR(&fields[72]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("location"), UPB_VALUE_INIT_CONSTPTR(&fields[30]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("span"), UPB_VALUE_INIT_CONSTPTR(&fields[65]), &strentries[139]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("trailing_comments"), UPB_VALUE_INIT_CONSTPTR(&fields[68]), NULL},
-  {UPB_TABKEY_STR("leading_comments"), UPB_VALUE_INIT_CONSTPTR(&fields[29]), &strentries[137]},
-  {UPB_TABKEY_STR("path"), UPB_VALUE_INIT_CONSTPTR(&fields[59]), NULL},
-  {UPB_TABKEY_STR("double_value"), UPB_VALUE_INIT_CONSTPTR(&fields[7]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("name"), UPB_VALUE_INIT_CONSTPTR(&fields[36]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("negative_int_value"), UPB_VALUE_INIT_CONSTPTR(&fields[43]), NULL},
-  {UPB_TABKEY_STR("aggregate_value"), UPB_VALUE_INIT_CONSTPTR(&fields[0]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("positive_int_value"), UPB_VALUE_INIT_CONSTPTR(&fields[60]), NULL},
-  {UPB_TABKEY_STR("identifier_value"), UPB_VALUE_INIT_CONSTPTR(&fields[19]), NULL},
-  {UPB_TABKEY_STR("string_value"), UPB_VALUE_INIT_CONSTPTR(&fields[67]), &strentries[154]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("is_extension"), UPB_VALUE_INIT_CONSTPTR(&fields[21]), NULL},
-  {UPB_TABKEY_STR("name_part"), UPB_VALUE_INIT_CONSTPTR(&fields[42]), NULL},
-  {UPB_TABKEY_STR("LABEL_REQUIRED"), UPB_VALUE_INIT_INT32(2), &strentries[162]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("LABEL_REPEATED"), UPB_VALUE_INIT_INT32(3), NULL},
-  {UPB_TABKEY_STR("LABEL_OPTIONAL"), UPB_VALUE_INIT_INT32(1), NULL},
-  {UPB_TABKEY_STR("TYPE_FIXED64"), UPB_VALUE_INIT_INT32(6), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_STRING"), UPB_VALUE_INIT_INT32(9), NULL},
-  {UPB_TABKEY_STR("TYPE_FLOAT"), UPB_VALUE_INIT_INT32(2), &strentries[193]},
-  {UPB_TABKEY_STR("TYPE_DOUBLE"), UPB_VALUE_INIT_INT32(1), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_INT32"), UPB_VALUE_INIT_INT32(5), NULL},
-  {UPB_TABKEY_STR("TYPE_SFIXED32"), UPB_VALUE_INIT_INT32(15), NULL},
-  {UPB_TABKEY_STR("TYPE_FIXED32"), UPB_VALUE_INIT_INT32(7), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_MESSAGE"), UPB_VALUE_INIT_INT32(11), &strentries[194]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_INT64"), UPB_VALUE_INIT_INT32(3), &strentries[191]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_ENUM"), UPB_VALUE_INIT_INT32(14), NULL},
-  {UPB_TABKEY_STR("TYPE_UINT32"), UPB_VALUE_INIT_INT32(13), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_UINT64"), UPB_VALUE_INIT_INT32(4), &strentries[190]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("TYPE_SFIXED64"), UPB_VALUE_INIT_INT32(16), NULL},
-  {UPB_TABKEY_STR("TYPE_BYTES"), UPB_VALUE_INIT_INT32(12), NULL},
-  {UPB_TABKEY_STR("TYPE_SINT64"), UPB_VALUE_INIT_INT32(18), NULL},
-  {UPB_TABKEY_STR("TYPE_BOOL"), UPB_VALUE_INIT_INT32(8), NULL},
-  {UPB_TABKEY_STR("TYPE_GROUP"), UPB_VALUE_INIT_INT32(10), NULL},
-  {UPB_TABKEY_STR("TYPE_SINT32"), UPB_VALUE_INIT_INT32(17), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("CORD"), UPB_VALUE_INIT_INT32(1), NULL},
-  {UPB_TABKEY_STR("STRING"), UPB_VALUE_INIT_INT32(0), &strentries[197]},
-  {UPB_TABKEY_STR("STRING_PIECE"), UPB_VALUE_INIT_INT32(2), NULL},
-  {UPB_TABKEY_STR("CODE_SIZE"), UPB_VALUE_INIT_INT32(2), NULL},
-  {UPB_TABKEY_STR("SPEED"), UPB_VALUE_INIT_INT32(1), &strentries[203]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("LITE_RUNTIME"), UPB_VALUE_INIT_INT32(3), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("google.protobuf.SourceCodeInfo.Location"), UPB_VALUE_INIT_CONSTPTR(&msgs[17]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.UninterpretedOption"), UPB_VALUE_INIT_CONSTPTR(&msgs[18]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FileDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[8]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.MethodDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[12]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("google.protobuf.EnumValueOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[5]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("google.protobuf.DescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[0]), &strentries[228]},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("google.protobuf.SourceCodeInfo"), UPB_VALUE_INIT_CONSTPTR(&msgs[16]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FieldDescriptorProto.Type"), UPB_VALUE_INIT_CONSTPTR(&enums[1]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.DescriptorProto.ExtensionRange"), UPB_VALUE_INIT_CONSTPTR(&msgs[1]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_STR("google.protobuf.EnumValueDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[4]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FieldOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[7]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FileOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[10]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.EnumDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[2]), &strentries[233]},
-  {UPB_TABKEY_STR("google.protobuf.FieldDescriptorProto.Label"), UPB_VALUE_INIT_CONSTPTR(&enums[0]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.ServiceDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[14]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FieldOptions.CType"), UPB_VALUE_INIT_CONSTPTR(&enums[2]), &strentries[229]},
-  {UPB_TABKEY_STR("google.protobuf.FileDescriptorSet"), UPB_VALUE_INIT_CONSTPTR(&msgs[9]), &strentries[235]},
-  {UPB_TABKEY_STR("google.protobuf.EnumOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[3]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FieldDescriptorProto"), UPB_VALUE_INIT_CONSTPTR(&msgs[6]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.FileOptions.OptimizeMode"), UPB_VALUE_INIT_CONSTPTR(&enums[3]), &strentries[221]},
-  {UPB_TABKEY_STR("google.protobuf.ServiceOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[15]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.MessageOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[11]), NULL},
-  {UPB_TABKEY_STR("google.protobuf.MethodOptions"), UPB_VALUE_INIT_CONSTPTR(&msgs[13]), &strentries[226]},
-  {UPB_TABKEY_STR("google.protobuf.UninterpretedOption.NamePart"), UPB_VALUE_INIT_CONSTPTR(&msgs[19]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[14]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[38]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "field"), UPB_TABVALUE_PTR_INIT(&fields[16]), NULL},
+  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "extension_range"), UPB_TABVALUE_PTR_INIT(&fields[15]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "nested_type"), UPB_TABVALUE_PTR_INIT(&fields[44]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[49]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[9]), &strentries[14]},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "start"), UPB_TABVALUE_PTR_INIT(&fields[66]), NULL},
+  {UPB_TABKEY_STR("\003", "\000", "\000", "\000", "end"), UPB_TABVALUE_PTR_INIT(&fields[8]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "value"), UPB_TABVALUE_PTR_INIT(&fields[78]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[50]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[40]), &strentries[22]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "allow_alias"), UPB_TABVALUE_PTR_INIT(&fields[1]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[47]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[52]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[37]), &strentries[30]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "label"), UPB_TABVALUE_PTR_INIT(&fields[27]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[41]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "number"), UPB_TABVALUE_PTR_INIT(&fields[46]), &strentries[49]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "type_name"), UPB_TABVALUE_PTR_INIT(&fields[70]), NULL},
+  {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "extendee"), UPB_TABVALUE_PTR_INIT(&fields[12]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "type"), UPB_TABVALUE_PTR_INIT(&fields[69]), &strentries[48]},
+  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "default_value"), UPB_TABVALUE_PTR_INIT(&fields[4]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[51]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "experimental_map_key"), UPB_TABVALUE_PTR_INIT(&fields[11]), &strentries[67]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "weak"), UPB_TABVALUE_PTR_INIT(&fields[79]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "packed"), UPB_TABVALUE_PTR_INIT(&fields[58]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "lazy"), UPB_TABVALUE_PTR_INIT(&fields[28]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "ctype"), UPB_TABVALUE_PTR_INIT(&fields[3]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "deprecated"), UPB_TABVALUE_PTR_INIT(&fields[6]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[77]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "extension"), UPB_TABVALUE_PTR_INIT(&fields[13]), NULL},
+  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "weak_dependency"), UPB_TABVALUE_PTR_INIT(&fields[80]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[34]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "service"), UPB_TABVALUE_PTR_INIT(&fields[63]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "source_code_info"), UPB_TABVALUE_PTR_INIT(&fields[64]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "dependency"), UPB_TABVALUE_PTR_INIT(&fields[5]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "message_type"), UPB_TABVALUE_PTR_INIT(&fields[32]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "package"), UPB_TABVALUE_PTR_INIT(&fields[57]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[53]), &strentries[82]},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "enum_type"), UPB_TABVALUE_PTR_INIT(&fields[10]), NULL},
+  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "public_dependency"), UPB_TABVALUE_PTR_INIT(&fields[61]), &strentries[81]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "file"), UPB_TABVALUE_PTR_INIT(&fields[17]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "cc_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[2]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "java_multiple_files"), UPB_TABVALUE_PTR_INIT(&fields[24]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\025", "\000", "\000", "\000", "java_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[23]), &strentries[102]},
+  {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "java_generate_equals_and_hash"), UPB_TABVALUE_PTR_INIT(&fields[22]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "go_package"), UPB_TABVALUE_PTR_INIT(&fields[18]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "java_package"), UPB_TABVALUE_PTR_INIT(&fields[26]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "optimize_for"), UPB_TABVALUE_PTR_INIT(&fields[48]), NULL},
+  {UPB_TABKEY_STR("\023", "\000", "\000", "\000", "py_generic_services"), UPB_TABVALUE_PTR_INIT(&fields[62]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "java_outer_classname"), UPB_TABVALUE_PTR_INIT(&fields[25]), NULL},
+  {UPB_TABKEY_STR("\027", "\000", "\000", "\000", "message_set_wire_format"), UPB_TABVALUE_PTR_INIT(&fields[31]), &strentries[106]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL},
+  {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "no_standard_descriptor_accessor"), UPB_TABVALUE_PTR_INIT(&fields[45]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[39]), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "input_type"), UPB_TABVALUE_PTR_INIT(&fields[20]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "output_type"), UPB_TABVALUE_PTR_INIT(&fields[56]), NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[55]), NULL},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\007", "\000", "\000", "\000", "options"), UPB_TABVALUE_PTR_INIT(&fields[54]), &strentries[122]},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "method"), UPB_TABVALUE_PTR_INIT(&fields[33]), NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[35]), &strentries[121]},
+  {UPB_TABKEY_STR("\024", "\000", "\000", "\000", "uninterpreted_option"), UPB_TABVALUE_PTR_INIT(&fields[72]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\010", "\000", "\000", "\000", "location"), UPB_TABVALUE_PTR_INIT(&fields[30]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "span"), UPB_TABVALUE_PTR_INIT(&fields[65]), &strentries[139]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\021", "\000", "\000", "\000", "trailing_comments"), UPB_TABVALUE_PTR_INIT(&fields[68]), NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "leading_comments"), UPB_TABVALUE_PTR_INIT(&fields[29]), &strentries[137]},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "path"), UPB_TABVALUE_PTR_INIT(&fields[59]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "double_value"), UPB_TABVALUE_PTR_INIT(&fields[7]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "name"), UPB_TABVALUE_PTR_INIT(&fields[36]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "negative_int_value"), UPB_TABVALUE_PTR_INIT(&fields[43]), NULL},
+  {UPB_TABKEY_STR("\017", "\000", "\000", "\000", "aggregate_value"), UPB_TABVALUE_PTR_INIT(&fields[0]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\022", "\000", "\000", "\000", "positive_int_value"), UPB_TABVALUE_PTR_INIT(&fields[60]), NULL},
+  {UPB_TABKEY_STR("\020", "\000", "\000", "\000", "identifier_value"), UPB_TABVALUE_PTR_INIT(&fields[19]), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "string_value"), UPB_TABVALUE_PTR_INIT(&fields[67]), &strentries[154]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "is_extension"), UPB_TABVALUE_PTR_INIT(&fields[21]), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "name_part"), UPB_TABVALUE_PTR_INIT(&fields[42]), NULL},
+  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REQUIRED"), UPB_TABVALUE_INT_INIT(2), &strentries[162]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_REPEATED"), UPB_TABVALUE_INT_INIT(3), NULL},
+  {UPB_TABKEY_STR("\016", "\000", "\000", "\000", "LABEL_OPTIONAL"), UPB_TABVALUE_INT_INIT(1), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_FIXED64"), UPB_TABVALUE_INT_INIT(6), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_STRING"), UPB_TABVALUE_INT_INIT(9), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_FLOAT"), UPB_TABVALUE_INT_INIT(2), &strentries[193]},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_DOUBLE"), UPB_TABVALUE_INT_INIT(1), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT32"), UPB_TABVALUE_INT_INIT(5), NULL},
+  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "TYPE_SFIXED32"), UPB_TABVALUE_INT_INIT(15), NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_FIXED32"), UPB_TABVALUE_INT_INIT(7), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "TYPE_MESSAGE"), UPB_TABVALUE_INT_INIT(11), &strentries[194]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_INT64"), UPB_TABVALUE_INT_INIT(3), &strentries[191]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "TYPE_ENUM"), UPB_TABVALUE_INT_INIT(14), NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT32"), UPB_TABVALUE_INT_INIT(13), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_UINT64"), UPB_TABVALUE_INT_INIT(4), &strentries[190]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\015", "\000", "\000", "\000", "TYPE_SFIXED64"), UPB_TABVALUE_INT_INIT(16), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_BYTES"), UPB_TABVALUE_INT_INIT(12), NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_SINT64"), UPB_TABVALUE_INT_INIT(18), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "TYPE_BOOL"), UPB_TABVALUE_INT_INIT(8), NULL},
+  {UPB_TABKEY_STR("\012", "\000", "\000", "\000", "TYPE_GROUP"), UPB_TABVALUE_INT_INIT(10), NULL},
+  {UPB_TABKEY_STR("\013", "\000", "\000", "\000", "TYPE_SINT32"), UPB_TABVALUE_INT_INIT(17), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\004", "\000", "\000", "\000", "CORD"), UPB_TABVALUE_INT_INIT(1), NULL},
+  {UPB_TABKEY_STR("\006", "\000", "\000", "\000", "STRING"), UPB_TABVALUE_INT_INIT(0), &strentries[197]},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "STRING_PIECE"), UPB_TABVALUE_INT_INIT(2), NULL},
+  {UPB_TABKEY_STR("\011", "\000", "\000", "\000", "CODE_SIZE"), UPB_TABVALUE_INT_INIT(2), NULL},
+  {UPB_TABKEY_STR("\005", "\000", "\000", "\000", "SPEED"), UPB_TABVALUE_INT_INIT(1), &strentries[203]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\014", "\000", "\000", "\000", "LITE_RUNTIME"), UPB_TABVALUE_INT_INIT(3), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\047", "\000", "\000", "\000", "google.protobuf.SourceCodeInfo.Location"), UPB_TABVALUE_PTR_INIT(&msgs[17]), NULL},
+  {UPB_TABKEY_STR("\043", "\000", "\000", "\000", "google.protobuf.UninterpretedOption"), UPB_TABVALUE_PTR_INIT(&msgs[18]), NULL},
+  {UPB_TABKEY_STR("\043", "\000", "\000", "\000", "google.protobuf.FileDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[8]), NULL},
+  {UPB_TABKEY_STR("\045", "\000", "\000", "\000", "google.protobuf.MethodDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[12]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\040", "\000", "\000", "\000", "google.protobuf.EnumValueOptions"), UPB_TABVALUE_PTR_INIT(&msgs[5]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\037", "\000", "\000", "\000", "google.protobuf.DescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[0]), &strentries[228]},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\036", "\000", "\000", "\000", "google.protobuf.SourceCodeInfo"), UPB_TABVALUE_PTR_INIT(&msgs[16]), NULL},
+  {UPB_TABKEY_STR("\051", "\000", "\000", "\000", "google.protobuf.FieldDescriptorProto.Type"), UPB_TABVALUE_PTR_INIT(&enums[1]), NULL},
+  {UPB_TABKEY_STR("\056", "\000", "\000", "\000", "google.protobuf.DescriptorProto.ExtensionRange"), UPB_TABVALUE_PTR_INIT(&msgs[1]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_STR("\050", "\000", "\000", "\000", "google.protobuf.EnumValueDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[4]), NULL},
+  {UPB_TABKEY_STR("\034", "\000", "\000", "\000", "google.protobuf.FieldOptions"), UPB_TABVALUE_PTR_INIT(&msgs[7]), NULL},
+  {UPB_TABKEY_STR("\033", "\000", "\000", "\000", "google.protobuf.FileOptions"), UPB_TABVALUE_PTR_INIT(&msgs[10]), NULL},
+  {UPB_TABKEY_STR("\043", "\000", "\000", "\000", "google.protobuf.EnumDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[2]), &strentries[233]},
+  {UPB_TABKEY_STR("\052", "\000", "\000", "\000", "google.protobuf.FieldDescriptorProto.Label"), UPB_TABVALUE_PTR_INIT(&enums[0]), NULL},
+  {UPB_TABKEY_STR("\046", "\000", "\000", "\000", "google.protobuf.ServiceDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[14]), NULL},
+  {UPB_TABKEY_STR("\042", "\000", "\000", "\000", "google.protobuf.FieldOptions.CType"), UPB_TABVALUE_PTR_INIT(&enums[2]), &strentries[229]},
+  {UPB_TABKEY_STR("\041", "\000", "\000", "\000", "google.protobuf.FileDescriptorSet"), UPB_TABVALUE_PTR_INIT(&msgs[9]), &strentries[235]},
+  {UPB_TABKEY_STR("\033", "\000", "\000", "\000", "google.protobuf.EnumOptions"), UPB_TABVALUE_PTR_INIT(&msgs[3]), NULL},
+  {UPB_TABKEY_STR("\044", "\000", "\000", "\000", "google.protobuf.FieldDescriptorProto"), UPB_TABVALUE_PTR_INIT(&msgs[6]), NULL},
+  {UPB_TABKEY_STR("\050", "\000", "\000", "\000", "google.protobuf.FileOptions.OptimizeMode"), UPB_TABVALUE_PTR_INIT(&enums[3]), &strentries[221]},
+  {UPB_TABKEY_STR("\036", "\000", "\000", "\000", "google.protobuf.ServiceOptions"), UPB_TABVALUE_PTR_INIT(&msgs[15]), NULL},
+  {UPB_TABKEY_STR("\036", "\000", "\000", "\000", "google.protobuf.MessageOptions"), UPB_TABVALUE_PTR_INIT(&msgs[11]), NULL},
+  {UPB_TABKEY_STR("\035", "\000", "\000", "\000", "google.protobuf.MethodOptions"), UPB_TABVALUE_PTR_INIT(&msgs[13]), &strentries[226]},
+  {UPB_TABKEY_STR("\054", "\000", "\000", "\000", "google.protobuf.UninterpretedOption.NamePart"), UPB_TABVALUE_PTR_INIT(&msgs[19]), NULL},
 };
 
 static const upb_tabent intentries[14] = {
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[73]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[71]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[77]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[75]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[76]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[74]), NULL},
-  {UPB_TABKEY_NONE, UPB__VALUE_INIT_NONE, NULL},
-  {UPB_TABKEY_NUM(999), UPB_VALUE_INIT_CONSTPTR(&fields[72]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[73]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[71]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[77]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[75]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[76]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[74]), NULL},
+  {UPB_TABKEY_NONE, UPB_TABVALUE_EMPTY_INIT, NULL},
+  {UPB_TABKEY_NUM(999), UPB_TABVALUE_PTR_INIT(&fields[72]), NULL},
 };
 
-static const _upb_value arrays[232] = {
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[38]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[16]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[44]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[9]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[15]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[14]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[49]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[66]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[8]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[40]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[78]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[50]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[1]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[37]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[47]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[52]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[41]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[12]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[46]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[27]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[69]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[70]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[4]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[51]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[3]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[58]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[6]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[28]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[11]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[79]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[34]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[57]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[5]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[32]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[10]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[63]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[13]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[53]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[64]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[61]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[80]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[17]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[26]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[25]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[48]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[24]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[18]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[2]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[23]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[62]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[22]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[31]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[45]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[39]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[20]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[56]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[55]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[35]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[33]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[54]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[30]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[59]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[65]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[29]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[68]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[36]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[19]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[60]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[43]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[7]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[67]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[0]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR(&fields[42]),
-  UPB_VALUE_INIT_CONSTPTR(&fields[21]),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR("LABEL_OPTIONAL"),
-  UPB_VALUE_INIT_CONSTPTR("LABEL_REQUIRED"),
-  UPB_VALUE_INIT_CONSTPTR("LABEL_REPEATED"),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR("TYPE_DOUBLE"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_FLOAT"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_INT64"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_UINT64"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_INT32"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_FIXED64"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_FIXED32"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_BOOL"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_STRING"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_GROUP"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_MESSAGE"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_BYTES"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_UINT32"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_ENUM"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_SFIXED32"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_SFIXED64"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_SINT32"),
-  UPB_VALUE_INIT_CONSTPTR("TYPE_SINT64"),
-  UPB_VALUE_INIT_CONSTPTR("STRING"),
-  UPB_VALUE_INIT_CONSTPTR("CORD"),
-  UPB_VALUE_INIT_CONSTPTR("STRING_PIECE"),
-  UPB_ARRAY_EMPTYENT,
-  UPB_VALUE_INIT_CONSTPTR("SPEED"),
-  UPB_VALUE_INIT_CONSTPTR("CODE_SIZE"),
-  UPB_VALUE_INIT_CONSTPTR("LITE_RUNTIME"),
+static const upb_tabval arrays[232] = {
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[38]),
+  UPB_TABVALUE_PTR_INIT(&fields[16]),
+  UPB_TABVALUE_PTR_INIT(&fields[44]),
+  UPB_TABVALUE_PTR_INIT(&fields[9]),
+  UPB_TABVALUE_PTR_INIT(&fields[15]),
+  UPB_TABVALUE_PTR_INIT(&fields[14]),
+  UPB_TABVALUE_PTR_INIT(&fields[49]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[66]),
+  UPB_TABVALUE_PTR_INIT(&fields[8]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[40]),
+  UPB_TABVALUE_PTR_INIT(&fields[78]),
+  UPB_TABVALUE_PTR_INIT(&fields[50]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[1]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[37]),
+  UPB_TABVALUE_PTR_INIT(&fields[47]),
+  UPB_TABVALUE_PTR_INIT(&fields[52]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[41]),
+  UPB_TABVALUE_PTR_INIT(&fields[12]),
+  UPB_TABVALUE_PTR_INIT(&fields[46]),
+  UPB_TABVALUE_PTR_INIT(&fields[27]),
+  UPB_TABVALUE_PTR_INIT(&fields[69]),
+  UPB_TABVALUE_PTR_INIT(&fields[70]),
+  UPB_TABVALUE_PTR_INIT(&fields[4]),
+  UPB_TABVALUE_PTR_INIT(&fields[51]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[3]),
+  UPB_TABVALUE_PTR_INIT(&fields[58]),
+  UPB_TABVALUE_PTR_INIT(&fields[6]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[28]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[11]),
+  UPB_TABVALUE_PTR_INIT(&fields[79]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[34]),
+  UPB_TABVALUE_PTR_INIT(&fields[57]),
+  UPB_TABVALUE_PTR_INIT(&fields[5]),
+  UPB_TABVALUE_PTR_INIT(&fields[32]),
+  UPB_TABVALUE_PTR_INIT(&fields[10]),
+  UPB_TABVALUE_PTR_INIT(&fields[63]),
+  UPB_TABVALUE_PTR_INIT(&fields[13]),
+  UPB_TABVALUE_PTR_INIT(&fields[53]),
+  UPB_TABVALUE_PTR_INIT(&fields[64]),
+  UPB_TABVALUE_PTR_INIT(&fields[61]),
+  UPB_TABVALUE_PTR_INIT(&fields[80]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[17]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[26]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[25]),
+  UPB_TABVALUE_PTR_INIT(&fields[48]),
+  UPB_TABVALUE_PTR_INIT(&fields[24]),
+  UPB_TABVALUE_PTR_INIT(&fields[18]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[2]),
+  UPB_TABVALUE_PTR_INIT(&fields[23]),
+  UPB_TABVALUE_PTR_INIT(&fields[62]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[22]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[31]),
+  UPB_TABVALUE_PTR_INIT(&fields[45]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[39]),
+  UPB_TABVALUE_PTR_INIT(&fields[20]),
+  UPB_TABVALUE_PTR_INIT(&fields[56]),
+  UPB_TABVALUE_PTR_INIT(&fields[55]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[35]),
+  UPB_TABVALUE_PTR_INIT(&fields[33]),
+  UPB_TABVALUE_PTR_INIT(&fields[54]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[30]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[59]),
+  UPB_TABVALUE_PTR_INIT(&fields[65]),
+  UPB_TABVALUE_PTR_INIT(&fields[29]),
+  UPB_TABVALUE_PTR_INIT(&fields[68]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[36]),
+  UPB_TABVALUE_PTR_INIT(&fields[19]),
+  UPB_TABVALUE_PTR_INIT(&fields[60]),
+  UPB_TABVALUE_PTR_INIT(&fields[43]),
+  UPB_TABVALUE_PTR_INIT(&fields[7]),
+  UPB_TABVALUE_PTR_INIT(&fields[67]),
+  UPB_TABVALUE_PTR_INIT(&fields[0]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT(&fields[42]),
+  UPB_TABVALUE_PTR_INIT(&fields[21]),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT("LABEL_OPTIONAL"),
+  UPB_TABVALUE_PTR_INIT("LABEL_REQUIRED"),
+  UPB_TABVALUE_PTR_INIT("LABEL_REPEATED"),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT("TYPE_DOUBLE"),
+  UPB_TABVALUE_PTR_INIT("TYPE_FLOAT"),
+  UPB_TABVALUE_PTR_INIT("TYPE_INT64"),
+  UPB_TABVALUE_PTR_INIT("TYPE_UINT64"),
+  UPB_TABVALUE_PTR_INIT("TYPE_INT32"),
+  UPB_TABVALUE_PTR_INIT("TYPE_FIXED64"),
+  UPB_TABVALUE_PTR_INIT("TYPE_FIXED32"),
+  UPB_TABVALUE_PTR_INIT("TYPE_BOOL"),
+  UPB_TABVALUE_PTR_INIT("TYPE_STRING"),
+  UPB_TABVALUE_PTR_INIT("TYPE_GROUP"),
+  UPB_TABVALUE_PTR_INIT("TYPE_MESSAGE"),
+  UPB_TABVALUE_PTR_INIT("TYPE_BYTES"),
+  UPB_TABVALUE_PTR_INIT("TYPE_UINT32"),
+  UPB_TABVALUE_PTR_INIT("TYPE_ENUM"),
+  UPB_TABVALUE_PTR_INIT("TYPE_SFIXED32"),
+  UPB_TABVALUE_PTR_INIT("TYPE_SFIXED64"),
+  UPB_TABVALUE_PTR_INIT("TYPE_SINT32"),
+  UPB_TABVALUE_PTR_INIT("TYPE_SINT64"),
+  UPB_TABVALUE_PTR_INIT("STRING"),
+  UPB_TABVALUE_PTR_INIT("CORD"),
+  UPB_TABVALUE_PTR_INIT("STRING_PIECE"),
+  UPB_TABVALUE_EMPTY_INIT,
+  UPB_TABVALUE_PTR_INIT("SPEED"),
+  UPB_TABVALUE_PTR_INIT("CODE_SIZE"),
+  UPB_TABVALUE_PTR_INIT("LITE_RUNTIME"),
 };
 
 static const upb_symtab symtab = UPB_SYMTAB_INIT(UPB_STRTABLE_INIT(24, 31, UPB_CTYPE_PTR, 5, &strentries[204]), &reftables[210], &reftables[211]);
@@ -5798,8 +5842,8 @@
 #include <stdlib.h>
 #include <string.h>
 
-// upb_deflist is an internal-only dynamic array for storing a growing list of
-// upb_defs.
+/* upb_deflist is an internal-only dynamic array for storing a growing list of
+ * upb_defs. */
 typedef struct {
   upb_def **defs;
   size_t len;
@@ -5807,27 +5851,27 @@
   bool owned;
 } upb_deflist;
 
-// We keep a stack of all the messages scopes we are currently in, as well as
-// the top-level file scope.  This is necessary to correctly qualify the
-// definitions that are contained inside.  "name" tracks the name of the
-// message or package (a bare name -- not qualified by any enclosing scopes).
+/* We keep a stack of all the messages scopes we are currently in, as well as
+ * the top-level file scope.  This is necessary to correctly qualify the
+ * definitions that are contained inside.  "name" tracks the name of the
+ * message or package (a bare name -- not qualified by any enclosing scopes). */
 typedef struct {
   char *name;
-  // Index of the first def that is under this scope.  For msgdefs, the
-  // msgdef itself is at start-1.
+  /* Index of the first def that is under this scope.  For msgdefs, the
+   * msgdef itself is at start-1. */
   int start;
 } upb_descreader_frame;
 
-// The maximum number of nested declarations that are allowed, ie.
-// message Foo {
-//   message Bar {
-//     message Baz {
-//     }
-//   }
-// }
-//
-// This is a resource limit that affects how big our runtime stack can grow.
-// TODO: make this a runtime-settable property of the Reader instance.
+/* The maximum number of nested declarations that are allowed, ie.
+ * message Foo {
+ *   message Bar {
+ *     message Baz {
+ *     }
+ *   }
+ * }
+ *
+ * This is a resource limit that affects how big our runtime stack can grow.
+ * TODO: make this a runtime-settable property of the Reader instance. */
 #define UPB_MAX_MESSAGE_NESTING 64
 
 struct upb_descreader {
@@ -5854,11 +5898,11 @@
   return ret;
 }
 
-// Returns a newly allocated string that joins input strings together, for
-// example:
-//   join("Foo.Bar", "Baz") -> "Foo.Bar.Baz"
-//   join("", "Baz") -> "Baz"
-// Caller owns a ref on the returned string.
+/* Returns a newly allocated string that joins input strings together, for
+ * example:
+ *   join("Foo.Bar", "Baz") -> "Foo.Bar.Baz"
+ *   join("", "Baz") -> "Baz"
+ * Caller owns a ref on the returned string. */
 static char *upb_join(const char *base, const char *name) {
   if (!base || strlen(base) == 0) {
     return upb_strdup(name);
@@ -5883,8 +5927,9 @@
 }
 
 void upb_deflist_uninit(upb_deflist *l) {
+  size_t i;
   if (l->owned)
-    for(size_t i = 0; i < l->len; i++)
+    for(i = 0; i < l->len; i++)
       upb_def_unref(l->defs[i], l);
   free(l->defs);
 }
@@ -5902,8 +5947,9 @@
 }
 
 void upb_deflist_donaterefs(upb_deflist *l, void *owner) {
+  size_t i;
   assert(l->owned);
-  for (size_t i = 0; i < l->len; i++)
+  for (i = 0; i < l->len; i++)
     upb_def_donateref(l->defs[i], l, owner);
   l->owned = false;
 }
@@ -5912,9 +5958,10 @@
   return l->defs[l->len-1];
 }
 
-// Qualify the defname for all defs starting with offset "start" with "str".
+/* Qualify the defname for all defs starting with offset "start" with "str". */
 static void upb_deflist_qualify(upb_deflist *l, char *str, int32_t start) {
-  for (uint32_t i = start; i < l->len; i++) {
+  uint32_t i;
+  for (i = start; i < l->len; i++) {
     upb_def *def = l->defs[i];
     char *name = upb_join(str, upb_def_fullname(def));
     upb_def_setfullname(def, name, NULL);
@@ -5926,8 +5973,9 @@
 /* upb_descreader  ************************************************************/
 
 static upb_msgdef *upb_descreader_top(upb_descreader *r) {
+  int index;
   assert(r->stack_len > 1);
-  int index = r->stack[r->stack_len-1].start - 1;
+  index = r->stack[r->stack_len-1].start - 1;
   assert(index >= 0);
   return upb_downcast_msgdef_mutable(r->defs.defs[index]);
 }
@@ -5936,8 +5984,8 @@
   return upb_deflist_last(&r->defs);
 }
 
-// Start/end handlers for FileDescriptorProto and DescriptorProto (the two
-// entities that have names and can contain sub-definitions.
+/* Start/end handlers for FileDescriptorProto and DescriptorProto (the two
+ * entities that have names and can contain sub-definitions. */
 void upb_descreader_startcontainer(upb_descreader *r) {
   upb_descreader_frame *f = &r->stack[r->stack_len++];
   f->start = r->defs.len;
@@ -5957,7 +6005,7 @@
   f->name = str;
 }
 
-// Handlers for google.protobuf.FileDescriptorProto.
+/* Handlers for google.protobuf.FileDescriptorProto. */
 static bool file_startmsg(void *r, const void *hd) {
   UPB_UNUSED(hd);
   upb_descreader_startcontainer(r);
@@ -5965,27 +6013,27 @@
 }
 
 static bool file_endmsg(void *closure, const void *hd, upb_status *status) {
+  upb_descreader *r = closure;
   UPB_UNUSED(hd);
   UPB_UNUSED(status);
-  upb_descreader *r = closure;
   upb_descreader_endcontainer(r);
   return true;
 }
 
 static size_t file_onpackage(void *closure, const void *hd, const char *buf,
                              size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // XXX: see comment at the top of the file.
+  /* XXX: see comment at the top of the file. */
   upb_descreader_setscopename(r, upb_strndup(buf, n));
   return n;
 }
 
-// Handlers for google.protobuf.EnumValueDescriptorProto.
+/* Handlers for google.protobuf.EnumValueDescriptorProto. */
 static bool enumval_startmsg(void *closure, const void *hd) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
   r->saw_number = false;
   r->saw_name = false;
   return true;
@@ -5993,10 +6041,10 @@
 
 static size_t enumval_onname(void *closure, const void *hd, const char *buf,
                              size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // XXX: see comment at the top of the file.
+  /* XXX: see comment at the top of the file. */
   free(r->name);
   r->name = upb_strndup(buf, n);
   r->saw_name = true;
@@ -6004,21 +6052,23 @@
 }
 
 static bool enumval_onnumber(void *closure, const void *hd, int32_t val) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
   r->number = val;
   r->saw_number = true;
   return true;
 }
 
 static bool enumval_endmsg(void *closure, const void *hd, upb_status *status) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  upb_enumdef *e;
+  UPB_UNUSED(hd);
+
   if(!r->saw_number || !r->saw_name) {
     upb_status_seterrmsg(status, "Enum value missing name or number.");
     return false;
   }
-  upb_enumdef *e = upb_downcast_enumdef_mutable(upb_descreader_last(r));
+  e = upb_downcast_enumdef_mutable(upb_descreader_last(r));
   upb_enumdef_addval(e, r->name, r->number, status);
   free(r->name);
   r->name = NULL;
@@ -6026,18 +6076,21 @@
 }
 
 
-// Handlers for google.protobuf.EnumDescriptorProto.
+/* Handlers for google.protobuf.EnumDescriptorProto. */
 static bool enum_startmsg(void *closure, const void *hd) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
-  upb_deflist_push(&r->defs, UPB_UPCAST(upb_enumdef_new(&r->defs)));
+  UPB_UNUSED(hd);
+  upb_deflist_push(&r->defs,
+                   upb_enumdef_upcast_mutable(upb_enumdef_new(&r->defs)));
   return true;
 }
 
 static bool enum_endmsg(void *closure, const void *hd, upb_status *status) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
-  upb_enumdef *e = upb_downcast_enumdef_mutable(upb_descreader_last(r));
+  upb_enumdef *e;
+  UPB_UNUSED(hd);
+
+  e = upb_downcast_enumdef_mutable(upb_descreader_last(r));
   if (upb_def_fullname(upb_descreader_last(r)) == NULL) {
     upb_status_seterrmsg(status, "Enum had no name.");
     return false;
@@ -6051,31 +6104,31 @@
 
 static size_t enum_onname(void *closure, const void *hd, const char *buf,
                           size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
+  char *fullname = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // XXX: see comment at the top of the file.
-  char *fullname = upb_strndup(buf, n);
+  /* XXX: see comment at the top of the file. */
   upb_def_setfullname(upb_descreader_last(r), fullname, NULL);
   free(fullname);
   return n;
 }
 
-// Handlers for google.protobuf.FieldDescriptorProto
+/* Handlers for google.protobuf.FieldDescriptorProto */
 static bool field_startmsg(void *closure, const void *hd) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
   r->f = upb_fielddef_new(&r->defs);
   free(r->default_string);
   r->default_string = NULL;
 
-  // fielddefs default to packed, but descriptors default to non-packed.
+  /* fielddefs default to packed, but descriptors default to non-packed. */
   upb_fielddef_setpacked(r->f, false);
   return true;
 }
 
-// Converts the default value in string "str" into "d".  Passes a ref on str.
-// Returns true on success.
+/* Converts the default value in string "str" into "d".  Passes a ref on str.
+ * Returns true on success. */
 static bool parse_default(char *str, upb_fielddef *f) {
   bool success = true;
   char *end;
@@ -6089,7 +6142,8 @@
       break;
     }
     case UPB_TYPE_INT64: {
-      long long val = strtoll(str, &end, 0);
+      /* XXX: Need to write our own strtoll, since it's not available in c89. */
+      long long val = strtol(str, &end, 0);
       if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || *end)
         success = false;
       else
@@ -6105,7 +6159,8 @@
       break;
     }
     case UPB_TYPE_UINT64: {
-      unsigned long long val = strtoull(str, &end, 0);
+      /* XXX: Need to write our own strtoull, since it's not available in c89. */
+      unsigned long long val = strtoul(str, &end, 0);
       if (val > UINT64_MAX || errno == ERANGE || *end)
         success = false;
       else
@@ -6121,7 +6176,8 @@
       break;
     }
     case UPB_TYPE_FLOAT: {
-      float val = strtof(str, &end);
+      /* XXX: Need to write our own strtof, since it's not available in c89. */
+      float val = strtod(str, &end);
       if (errno == ERANGE || *end)
         success = false;
       else
@@ -6143,10 +6199,11 @@
 }
 
 static bool field_endmsg(void *closure, const void *hd, upb_status *status) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
   upb_fielddef *f = r->f;
-  // TODO: verify that all required fields were present.
+  UPB_UNUSED(hd);
+
+  /* TODO: verify that all required fields were present. */
   assert(upb_fielddef_number(f) != 0);
   assert(upb_fielddef_name(f) != NULL);
   assert((upb_fielddef_subdefname(f) != NULL) == upb_fielddef_hassubdef(f));
@@ -6160,8 +6217,8 @@
       upb_fielddef_setdefaultcstr(f, r->default_string, NULL);
     } else {
       if (r->default_string && !parse_default(r->default_string, f)) {
-        // We don't worry too much about giving a great error message since the
-        // compiler should have ensured this was correct.
+        /* We don't worry too much about giving a great error message since the
+         * compiler should have ensured this was correct. */
         upb_status_seterrmsg(status, "Error converting default value.");
         return false;
       }
@@ -6171,48 +6228,54 @@
 }
 
 static bool field_onlazy(void *closure, const void *hd, bool val) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
+
   upb_fielddef_setlazy(r->f, val);
   return true;
 }
 
 static bool field_onpacked(void *closure, const void *hd, bool val) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
+
   upb_fielddef_setpacked(r->f, val);
   return true;
 }
 
 static bool field_ontype(void *closure, const void *hd, int32_t val) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
+
   upb_fielddef_setdescriptortype(r->f, val);
   return true;
 }
 
 static bool field_onlabel(void *closure, const void *hd, int32_t val) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
+
   upb_fielddef_setlabel(r->f, val);
   return true;
 }
 
 static bool field_onnumber(void *closure, const void *hd, int32_t val) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
   bool ok = upb_fielddef_setnumber(r->f, val, NULL);
+  UPB_UNUSED(hd);
+
   UPB_ASSERT_VAR(ok, ok);
   return true;
 }
 
 static size_t field_onname(void *closure, const void *hd, const char *buf,
                            size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // XXX: see comment at the top of the file.
-  char *name = upb_strndup(buf, n);
+
+  /* XXX: see comment at the top of the file. */
   upb_fielddef_setname(r->f, name, NULL);
   free(name);
   return n;
@@ -6220,11 +6283,12 @@
 
 static size_t field_ontypename(void *closure, const void *hd, const char *buf,
                                size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // XXX: see comment at the top of the file.
-  char *name = upb_strndup(buf, n);
+
+  /* XXX: see comment at the top of the file. */
   upb_fielddef_setsubdefname(r->f, name, NULL);
   free(name);
   return n;
@@ -6232,11 +6296,12 @@
 
 static size_t field_onextendee(void *closure, const void *hd, const char *buf,
                                size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
+  char *name = upb_strndup(buf, n);
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // XXX: see comment at the top of the file.
-  char *name = upb_strndup(buf, n);
+
+  /* XXX: see comment at the top of the file. */
   upb_fielddef_setcontainingtypename(r->f, name, NULL);
   free(name);
   return n;
@@ -6244,31 +6309,35 @@
 
 static size_t field_ondefaultval(void *closure, const void *hd, const char *buf,
                                  size_t n, const upb_bufhandle *handle) {
+  upb_descreader *r = closure;
   UPB_UNUSED(hd);
   UPB_UNUSED(handle);
-  upb_descreader *r = closure;
-  // Have to convert from string to the correct type, but we might not know the
-  // type yet, so we save it as a string until the end of the field.
-  // XXX: see comment at the top of the file.
+
+  /* Have to convert from string to the correct type, but we might not know the
+   * type yet, so we save it as a string until the end of the field.
+   * XXX: see comment at the top of the file. */
   free(r->default_string);
   r->default_string = upb_strndup(buf, n);
   return n;
 }
 
-// Handlers for google.protobuf.DescriptorProto (representing a message).
+/* Handlers for google.protobuf.DescriptorProto (representing a message). */
 static bool msg_startmsg(void *closure, const void *hd) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
-  upb_deflist_push(&r->defs, UPB_UPCAST(upb_msgdef_new(&r->defs)));
+  UPB_UNUSED(hd);
+
+  upb_deflist_push(&r->defs,
+                   upb_msgdef_upcast_mutable(upb_msgdef_new(&r->defs)));
   upb_descreader_startcontainer(r);
   return true;
 }
 
 static bool msg_endmsg(void *closure, const void *hd, upb_status *status) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
-  if(!upb_def_fullname(UPB_UPCAST(m))) {
+  UPB_UNUSED(hd);
+
+  if(!upb_def_fullname(upb_msgdef_upcast_mutable(m))) {
     upb_status_seterrmsg(status, "Encountered message with no name.");
     return false;
   }
@@ -6278,32 +6347,35 @@
 
 static size_t msg_onname(void *closure, const void *hd, const char *buf,
                          size_t n, const upb_bufhandle *handle) {
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
-  // XXX: see comment at the top of the file.
+  /* XXX: see comment at the top of the file. */
   char *name = upb_strndup(buf, n);
-  upb_def_setfullname(UPB_UPCAST(m), name, NULL);
-  upb_descreader_setscopename(r, name);  // Passes ownership of name.
+  UPB_UNUSED(hd);
+  UPB_UNUSED(handle);
+
+  upb_def_setfullname(upb_msgdef_upcast_mutable(m), name, NULL);
+  upb_descreader_setscopename(r, name);  /* Passes ownership of name. */
   return n;
 }
 
 static bool msg_onendfield(void *closure, const void *hd) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
   upb_msgdef *m = upb_descreader_top(r);
+  UPB_UNUSED(hd);
+
   upb_msgdef_addfield(m, r->f, &r->defs, NULL);
   r->f = NULL;
   return true;
 }
 
 static bool pushextension(void *closure, const void *hd) {
-  UPB_UNUSED(hd);
   upb_descreader *r = closure;
+  UPB_UNUSED(hd);
+
   assert(upb_fielddef_containingtypename(r->f));
   upb_fielddef_setisextension(r->f, true);
-  upb_deflist_push(&r->defs, UPB_UPCAST(r->f));
+  upb_deflist_push(&r->defs, upb_fielddef_upcast_mutable(r->f));
   r->f = NULL;
   return true;
 }
@@ -6455,14 +6527,14 @@
   upb_inttable_begin(&i, &g->methods);
   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
     upb_pbdecodermethod *method = upb_value_getptr(upb_inttable_iter_value(&i));
-    visit(r, UPB_UPCAST(method), closure);
+    visit(r, upb_pbdecodermethod_upcast(method), closure);
   }
 }
 
 mgroup *newgroup(const void *owner) {
   mgroup *g = malloc(sizeof(*g));
   static const struct upb_refcounted_vtbl vtbl = {visitgroup, freegroup};
-  upb_refcounted_init(UPB_UPCAST(g), &vtbl, owner);
+  upb_refcounted_init(mgroup_upcast_mutable(g), &vtbl, owner);
   upb_inttable_init(&g->methods, UPB_CTYPE_PTR);
   g->bytecode = NULL;
   g->bytecode_end = NULL;
@@ -6493,18 +6565,18 @@
                                       mgroup *group) {
   static const struct upb_refcounted_vtbl vtbl = {visitmethod, freemethod};
   upb_pbdecodermethod *ret = malloc(sizeof(*ret));
-  upb_refcounted_init(UPB_UPCAST(ret), &vtbl, &ret);
+  upb_refcounted_init(upb_pbdecodermethod_upcast_mutable(ret), &vtbl, &ret);
   upb_byteshandler_init(&ret->input_handler_);
 
-  // The method references the group and vice-versa, in a circular reference.
+  /* The method references the group and vice-versa, in a circular reference. */
   upb_ref2(ret, group);
   upb_ref2(group, ret);
   upb_inttable_insertptr(&group->methods, dest_handlers, upb_value_ptr(ret));
-  upb_refcounted_unref(UPB_UPCAST(ret), &ret);
+  upb_pbdecodermethod_unref(ret, &ret);
 
-  ret->group = UPB_UPCAST(group);
+  ret->group = mgroup_upcast_mutable(group);
   ret->dest_handlers_ = dest_handlers;
-  ret->is_native_ = false;  // If we JIT, it will update this later.
+  ret->is_native_ = false;  /* If we JIT, it will update this later. */
   upb_inttable_init(&ret->dispatch, UPB_CTYPE_UINT64);
 
   if (ret->dest_handlers_) {
@@ -6513,25 +6585,6 @@
   return ret;
 }
 
-void upb_pbdecodermethod_ref(const upb_pbdecodermethod *m, const void *owner) {
-  upb_refcounted_ref(UPB_UPCAST(m), owner);
-}
-
-void upb_pbdecodermethod_unref(const upb_pbdecodermethod *m,
-                               const void *owner) {
-  upb_refcounted_unref(UPB_UPCAST(m), owner);
-}
-
-void upb_pbdecodermethod_donateref(const upb_pbdecodermethod *m,
-                                   const void *from, const void *to) {
-  upb_refcounted_donateref(UPB_UPCAST(m), from, to);
-}
-
-void upb_pbdecodermethod_checkref(const upb_pbdecodermethod *m,
-                                  const void *owner) {
-  upb_refcounted_checkref(UPB_UPCAST(m), owner);
-}
-
 const upb_handlers *upb_pbdecodermethod_desthandlers(
     const upb_pbdecodermethod *m) {
   return m->dest_handlers_;
@@ -6548,10 +6601,11 @@
 
 const upb_pbdecodermethod *upb_pbdecodermethod_new(
     const upb_pbdecodermethodopts *opts, const void *owner) {
+  const upb_pbdecodermethod *ret;
   upb_pbcodecache cache;
+
   upb_pbcodecache_init(&cache);
-  const upb_pbdecodermethod *ret =
-      upb_pbcodecache_getdecodermethod(&cache, opts);
+  ret = upb_pbcodecache_getdecodermethod(&cache, opts);
   upb_pbdecodermethod_ref(ret, owner);
   upb_pbcodecache_uninit(&cache);
   return ret;
@@ -6560,7 +6614,7 @@
 
 /* bytecode compiler **********************************************************/
 
-// Data used only at compilation time.
+/* Data used only at compilation time. */
 typedef struct {
   mgroup *group;
 
@@ -6568,15 +6622,17 @@
   int fwd_labels[MAXLABEL];
   int back_labels[MAXLABEL];
 
-  // For fields marked "lazy", parse them lazily or eagerly?
+  /* For fields marked "lazy", parse them lazily or eagerly? */
   bool lazy;
 } compiler;
 
 static compiler *newcompiler(mgroup *group, bool lazy) {
   compiler *ret = malloc(sizeof(*ret));
+  int i;
+
   ret->group = group;
   ret->lazy = lazy;
-  for (int i = 0; i < MAXLABEL; i++) {
+  for (i = 0; i < MAXLABEL; i++) {
     ret->fwd_labels[i] = EMPTYLABEL;
     ret->back_labels[i] = EMPTYLABEL;
   }
@@ -6589,7 +6645,7 @@
 
 const size_t ptr_words = sizeof(void*) / sizeof(uint32_t);
 
-// How many words an instruction is.
+/* How many words an instruction is. */
 static int instruction_len(uint32_t instr) {
   switch (getop(instr)) {
     case OP_SETDISPATCH: return 1 + ptr_words;
@@ -6605,8 +6661,8 @@
     case OP_BRANCH:
     case OP_CHECKDELIM:
       return true;
-    // The "tag" instructions only have 8 bytes available for the jump target,
-    // but that is ok because these opcodes only require short jumps.
+    /* The "tag" instructions only have 8 bytes available for the jump target,
+     * but that is ok because these opcodes only require short jumps. */
     case OP_TAG1:
     case OP_TAG2:
     case OP_TAGN:
@@ -6631,18 +6687,21 @@
   } else {
     *instruction = (*instruction & ~0xff00) | ((ofs & 0xff) << 8);
   }
-  assert(getofs(*instruction) == ofs);  // Would fail in cases of overflow.
+  assert(getofs(*instruction) == ofs);  /* Would fail in cases of overflow. */
 }
 
 static uint32_t pcofs(compiler *c) { return c->pc - c->group->bytecode; }
 
-// Defines a local label at the current PC location.  All previous forward
-// references are updated to point to this location.  The location is noted
-// for any future backward references.
+/* Defines a local label at the current PC location.  All previous forward
+ * references are updated to point to this location.  The location is noted
+ * for any future backward references. */
 static void label(compiler *c, unsigned int label) {
+  int val;
+  uint32_t *codep;
+
   assert(label < MAXLABEL);
-  int val = c->fwd_labels[label];
-  uint32_t *codep = (val == EMPTYLABEL) ? NULL : c->group->bytecode + val;
+  val = c->fwd_labels[label];
+  codep = (val == EMPTYLABEL) ? NULL : c->group->bytecode + val;
   while (codep) {
     int ofs = getofs(*codep);
     setofs(codep, c->pc - codep - instruction_len(*codep));
@@ -6652,24 +6711,25 @@
   c->back_labels[label] = pcofs(c);
 }
 
-// Creates a reference to a numbered label; either a forward reference
-// (positive arg) or backward reference (negative arg).  For forward references
-// the value returned now is actually a "next" pointer into a linked list of all
-// instructions that use this label and will be patched later when the label is
-// defined with label().
-//
-// The returned value is the offset that should be written into the instruction.
+/* Creates a reference to a numbered label; either a forward reference
+ * (positive arg) or backward reference (negative arg).  For forward references
+ * the value returned now is actually a "next" pointer into a linked list of all
+ * instructions that use this label and will be patched later when the label is
+ * defined with label().
+ *
+ * The returned value is the offset that should be written into the instruction.
+ */
 static int32_t labelref(compiler *c, int label) {
   assert(label < MAXLABEL);
   if (label == LABEL_DISPATCH) {
-    // No resolving required.
+    /* No resolving required. */
     return 0;
   } else if (label < 0) {
-    // Backward local label.  Relative to the next instruction.
+    /* Backward local label.  Relative to the next instruction. */
     uint32_t from = (c->pc + 1) - c->group->bytecode;
     return c->back_labels[-label] - from;
   } else {
-    // Forward local label: prepend to (possibly-empty) linked list.
+    /* Forward local label: prepend to (possibly-empty) linked list. */
     int *lptr = &c->fwd_labels[label];
     int32_t ret = (*lptr == EMPTYLABEL) ? 0 : *lptr - pcofs(c);
     *lptr = pcofs(c);
@@ -6683,7 +6743,7 @@
     int ofs = pcofs(c);
     size_t oldsize = g->bytecode_end - g->bytecode;
     size_t newsize = UPB_MAX(oldsize * 2, 64);
-    // TODO(haberman): handle OOM.
+    /* TODO(haberman): handle OOM. */
     g->bytecode = realloc(g->bytecode, newsize * sizeof(uint32_t));
     g->bytecode_end = g->bytecode + newsize;
     c->pc = g->bytecode + ofs;
@@ -6782,19 +6842,22 @@
 #if defined(UPB_USE_JIT_X64) || defined(UPB_DUMP_BYTECODE)
 
 const char *upb_pbdecoder_getopname(unsigned int op) {
-#define OP(op) [OP_ ## op] = "OP_" #op
-#define T(op) OP(PARSE_##op)
-  static const char *names[] = {
-    "<no opcode>",
-    T(DOUBLE), T(FLOAT), T(INT64), T(UINT64), T(INT32), T(FIXED64), T(FIXED32),
-    T(BOOL), T(UINT32), T(SFIXED32), T(SFIXED64), T(SINT32), T(SINT64),
-    OP(STARTMSG), OP(ENDMSG), OP(STARTSEQ), OP(ENDSEQ), OP(STARTSUBMSG),
-    OP(ENDSUBMSG), OP(STARTSTR), OP(STRING), OP(ENDSTR), OP(CALL), OP(RET),
-    OP(PUSHLENDELIM), OP(PUSHTAGDELIM), OP(SETDELIM), OP(CHECKDELIM),
-    OP(BRANCH), OP(TAG1), OP(TAG2), OP(TAGN), OP(SETDISPATCH), OP(POP),
-    OP(SETBIGGROUPNUM), OP(DISPATCH), OP(HALT),
-  };
-  return op > OP_HALT ? names[0] : names[op];
+#define QUOTE(x) #x
+#define EXPAND_AND_QUOTE(x) QUOTE(x)
+#define OPNAME(x) OP_##x
+#define OP(x) case OPNAME(x): return EXPAND_AND_QUOTE(OPNAME(x));
+#define T(x) OP(PARSE_##x)
+  /* Keep in sync with list in decoder.int.h. */
+  switch ((opcode)op) {
+    T(DOUBLE) T(FLOAT) T(INT64) T(UINT64) T(INT32) T(FIXED64) T(FIXED32)
+    T(BOOL) T(UINT32) T(SFIXED32) T(SFIXED64) T(SINT32) T(SINT64)
+    OP(STARTMSG) OP(ENDMSG) OP(STARTSEQ) OP(ENDSEQ) OP(STARTSUBMSG)
+    OP(ENDSUBMSG) OP(STARTSTR) OP(STRING) OP(ENDSTR) OP(CALL) OP(RET)
+    OP(PUSHLENDELIM) OP(PUSHTAGDELIM) OP(SETDELIM) OP(CHECKDELIM)
+    OP(BRANCH) OP(TAG1) OP(TAG2) OP(TAGN) OP(SETDISPATCH) OP(POP)
+    OP(SETBIGGROUPNUM) OP(DISPATCH) OP(HALT)
+  }
+  return "<unknown op>";
 #undef OP
 #undef T
 }
@@ -6892,7 +6955,7 @@
 static uint64_t get_encoded_tag(const upb_fielddef *f, int wire_type) {
   uint32_t tag = (upb_fielddef_number(f) << 3) | wire_type;
   uint64_t encoded_tag = upb_vencode32(tag);
-  // No tag should be greater than 5 bytes.
+  /* No tag should be greater than 5 bytes. */
   assert(encoded_tag <= 0xffffffffff);
   return encoded_tag;
 }
@@ -6920,29 +6983,29 @@
   return selector;
 }
 
-// Takes an existing, primary dispatch table entry and repacks it with a
-// different alternate wire type.  Called when we are inserting a secondary
-// dispatch table entry for an alternate wire type.
+/* Takes an existing, primary dispatch table entry and repacks it with a
+ * different alternate wire type.  Called when we are inserting a secondary
+ * dispatch table entry for an alternate wire type. */
 static uint64_t repack(uint64_t dispatch, int new_wt2) {
   uint64_t ofs;
   uint8_t wt1;
   uint8_t old_wt2;
   upb_pbdecoder_unpackdispatch(dispatch, &ofs, &wt1, &old_wt2);
-  assert(old_wt2 == NO_WIRE_TYPE);  // wt2 should not be set yet.
+  assert(old_wt2 == NO_WIRE_TYPE);  /* wt2 should not be set yet. */
   return upb_pbdecoder_packdispatch(ofs, wt1, new_wt2);
 }
 
-// Marks the current bytecode position as the dispatch target for this message,
-// field, and wire type.
+/* Marks the current bytecode position as the dispatch target for this message,
+ * field, and wire type. */
 static void dispatchtarget(compiler *c, upb_pbdecodermethod *method,
                            const upb_fielddef *f, int wire_type) {
-  // Offset is relative to msg base.
+  /* Offset is relative to msg base. */
   uint64_t ofs = pcofs(c) - method->code_base.ofs;
   uint32_t fn = upb_fielddef_number(f);
   upb_inttable *d = &method->dispatch;
   upb_value v;
   if (upb_inttable_remove(d, fn, &v)) {
-    // TODO: prioritize based on packed setting in .proto file.
+    /* TODO: prioritize based on packed setting in .proto file. */
     uint64_t repacked = repack(upb_value_getuint64(v), wire_type);
     upb_inttable_insert(d, fn, upb_value_uint64(repacked));
     upb_inttable_insert(d, fn + UPB_MAX_FIELDNUMBER, upb_value_uint64(ofs));
@@ -6984,8 +7047,8 @@
   }
 }
 
-// Puts an opcode to call a callback, but only if a callback actually exists for
-// this field and handler type.
+/* Puts an opcode to call a callback, but only if a callback actually exists for
+ * this field and handler type. */
 static void maybeput(compiler *c, opcode op, const upb_handlers *h,
                      const upb_fielddef *f, upb_handlertype_t type) {
   putsel(c, op, getsel(f, type), h);
@@ -7003,27 +7066,28 @@
 
 /* bytecode compiler code generation ******************************************/
 
-// Symbolic names for our local labels.
-#define LABEL_LOOPSTART 1  // Top of a repeated field loop.
-#define LABEL_LOOPBREAK 2  // To jump out of a repeated loop
-#define LABEL_FIELD     3  // Jump backward to find the most recent field.
-#define LABEL_ENDMSG    4  // To reach the OP_ENDMSG instr for this msg.
+/* Symbolic names for our local labels. */
+#define LABEL_LOOPSTART 1  /* Top of a repeated field loop. */
+#define LABEL_LOOPBREAK 2  /* To jump out of a repeated loop */
+#define LABEL_FIELD     3  /* Jump backward to find the most recent field. */
+#define LABEL_ENDMSG    4  /* To reach the OP_ENDMSG instr for this msg. */
 
-// Generates bytecode to parse a single non-lazy message field.
+/* Generates bytecode to parse a single non-lazy message field. */
 static void generate_msgfield(compiler *c, const upb_fielddef *f,
                               upb_pbdecodermethod *method) {
   const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);
   const upb_pbdecodermethod *sub_m = find_submethod(c, method, f);
+  int wire_type;
 
   if (!sub_m) {
-    // Don't emit any code for this field at all; it will be parsed as an
-    // unknown field.
+    /* Don't emit any code for this field at all; it will be parsed as an
+     * unknown field. */
     return;
   }
 
   label(c, LABEL_FIELD);
 
-  int wire_type =
+  wire_type =
       (upb_fielddef_descriptortype(f) == UPB_DESCRIPTOR_TYPE_MESSAGE)
           ? UPB_WIRE_TYPE_DELIMITED
           : UPB_WIRE_TYPE_START_GROUP;
@@ -7064,7 +7128,7 @@
   }
 }
 
-// Generates bytecode to parse a single string or lazy submessage field.
+/* Generates bytecode to parse a single string or lazy submessage field. */
 static void generate_delimfield(compiler *c, const upb_fielddef *f,
                                 upb_pbdecodermethod *method) {
   const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);
@@ -7079,7 +7143,7 @@
    label(c, LABEL_LOOPSTART);
     putop(c, OP_PUSHLENDELIM);
     putop(c, OP_STARTSTR, getsel(f, UPB_HANDLER_STARTSTR));
-    // Need to emit even if no handler to skip past the string.
+    /* Need to emit even if no handler to skip past the string. */
     putop(c, OP_STRING, getsel(f, UPB_HANDLER_STRING));
     putop(c, OP_POP);
     maybeput(c, OP_ENDSTR, h, f, UPB_HANDLER_ENDSTR);
@@ -7103,49 +7167,52 @@
   }
 }
 
-// Generates bytecode to parse a single primitive field.
+/* Generates bytecode to parse a single primitive field. */
 static void generate_primitivefield(compiler *c, const upb_fielddef *f,
                                     upb_pbdecodermethod *method) {
-  label(c, LABEL_FIELD);
-
   const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);
   upb_descriptortype_t descriptor_type = upb_fielddef_descriptortype(f);
+  opcode parse_type;
+  upb_selector_t sel;
+  int wire_type;
 
-  // From a decoding perspective, ENUM is the same as INT32.
+  label(c, LABEL_FIELD);
+
+  /* From a decoding perspective, ENUM is the same as INT32. */
   if (descriptor_type == UPB_DESCRIPTOR_TYPE_ENUM)
     descriptor_type = UPB_DESCRIPTOR_TYPE_INT32;
 
-  opcode parse_type = (opcode)descriptor_type;
+  parse_type = (opcode)descriptor_type;
 
-  // TODO(haberman): generate packed or non-packed first depending on "packed"
-  // setting in the fielddef.  This will favor (in speed) whichever was
-  // specified.
+  /* TODO(haberman): generate packed or non-packed first depending on "packed"
+   * setting in the fielddef.  This will favor (in speed) whichever was
+   * specified. */
 
   assert((int)parse_type >= 0 && parse_type <= OP_MAX);
-  upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
-  int wire_type = upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];
+  sel = getsel(f, upb_handlers_getprimitivehandlertype(f));
+  wire_type = upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];
   if (upb_fielddef_isseq(f)) {
     putop(c, OP_CHECKDELIM, LABEL_ENDMSG);
     putchecktag(c, f, UPB_WIRE_TYPE_DELIMITED, LABEL_DISPATCH);
    dispatchtarget(c, method, f, UPB_WIRE_TYPE_DELIMITED);
     putop(c, OP_PUSHLENDELIM);
-    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));  // Packed
+    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));  /* Packed */
    label(c, LABEL_LOOPSTART);
     putop(c, parse_type, sel);
     putop(c, OP_CHECKDELIM, LABEL_LOOPBREAK);
     putop(c, OP_BRANCH, -LABEL_LOOPSTART);
    dispatchtarget(c, method, f, wire_type);
     putop(c, OP_PUSHTAGDELIM, 0);
-    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));  // Non-packed
+    putop(c, OP_STARTSEQ, getsel(f, UPB_HANDLER_STARTSEQ));  /* Non-packed */
    label(c, LABEL_LOOPSTART);
     putop(c, parse_type, sel);
     putop(c, OP_CHECKDELIM, LABEL_LOOPBREAK);
     putchecktag(c, f, wire_type, LABEL_LOOPBREAK);
     putop(c, OP_BRANCH, -LABEL_LOOPSTART);
    label(c, LABEL_LOOPBREAK);
-    putop(c, OP_POP);  // Packed and non-packed join.
+    putop(c, OP_POP);  /* Packed and non-packed join. */
     maybeput(c, OP_ENDSEQ, h, f, UPB_HANDLER_ENDSEQ);
-    putop(c, OP_SETDELIM);  // Could remove for non-packed by dup ENDSEQ.
+    putop(c, OP_SETDELIM);  /* Could remove for non-packed by dup ENDSEQ. */
   } else {
     putop(c, OP_CHECKDELIM, LABEL_ENDMSG);
     putchecktag(c, f, wire_type, LABEL_DISPATCH);
@@ -7154,24 +7221,29 @@
   }
 }
 
-// Adds bytecode for parsing the given message to the given decoderplan,
-// while adding all dispatch targets to this message's dispatch table.
+/* Adds bytecode for parsing the given message to the given decoderplan,
+ * while adding all dispatch targets to this message's dispatch table. */
 static void compile_method(compiler *c, upb_pbdecodermethod *method) {
+  const upb_handlers *h;
+  const upb_msgdef *md;
+  uint32_t* start_pc;
+  upb_msg_field_iter i;
+  upb_value val;
+
   assert(method);
 
-  // Clear all entries in the dispatch table.
+  /* Clear all entries in the dispatch table. */
   upb_inttable_uninit(&method->dispatch);
   upb_inttable_init(&method->dispatch, UPB_CTYPE_UINT64);
 
-  const upb_handlers *h = upb_pbdecodermethod_desthandlers(method);
-  const upb_msgdef *md = upb_handlers_msgdef(h);
+  h = upb_pbdecodermethod_desthandlers(method);
+  md = upb_handlers_msgdef(h);
 
  method->code_base.ofs = pcofs(c);
   putop(c, OP_SETDISPATCH, &method->dispatch);
   putsel(c, OP_STARTMSG, UPB_STARTMSG_SELECTOR, h);
  label(c, LABEL_FIELD);
-  uint32_t* start_pc = c->pc;
-  upb_msg_field_iter i;
+  start_pc = c->pc;
   for(upb_msg_field_begin(&i, md);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
@@ -7188,23 +7260,23 @@
     }
   }
 
-  // If there were no fields, or if no handlers were defined, we need to
-  // generate a non-empty loop body so that we can at least dispatch for unknown
-  // fields and check for the end of the message.
+  /* If there were no fields, or if no handlers were defined, we need to
+   * generate a non-empty loop body so that we can at least dispatch for unknown
+   * fields and check for the end of the message. */
   if (c->pc == start_pc) {
-    // Check for end-of-message.
+    /* Check for end-of-message. */
     putop(c, OP_CHECKDELIM, LABEL_ENDMSG);
-    // Unconditionally dispatch.
+    /* Unconditionally dispatch. */
     putop(c, OP_DISPATCH, 0);
   }
 
-  // For now we just loop back to the last field of the message (or if none,
-  // the DISPATCH opcode for the message).
+  /* For now we just loop back to the last field of the message (or if none,
+   * the DISPATCH opcode for the message). */
   putop(c, OP_BRANCH, -LABEL_FIELD);
 
-  // Insert both a label and a dispatch table entry for this end-of-msg.
+  /* Insert both a label and a dispatch table entry for this end-of-msg. */
  label(c, LABEL_ENDMSG);
-  upb_value val = upb_value_uint64(pcofs(c) - method->code_base.ofs);
+  val = upb_value_uint64(pcofs(c) - method->code_base.ofs);
   upb_inttable_insert(&method->dispatch, DISPATCH_ENDMSG, val);
 
   putsel(c, OP_ENDMSG, UPB_ENDMSG_SELECTOR, h);
@@ -7213,19 +7285,21 @@
   upb_inttable_compact(&method->dispatch);
 }
 
-// Populate "methods" with new upb_pbdecodermethod objects reachable from "h".
-// Returns the method for these handlers.
-//
-// Generates a new method for every destination handlers reachable from "h".
+/* Populate "methods" with new upb_pbdecodermethod objects reachable from "h".
+ * Returns the method for these handlers.
+ *
+ * Generates a new method for every destination handlers reachable from "h". */
 static void find_methods(compiler *c, const upb_handlers *h) {
   upb_value v;
+  upb_msg_field_iter i;
+  const upb_msgdef *md;
+
   if (upb_inttable_lookupptr(&c->group->methods, h, &v))
     return;
   newmethod(h, c->group);
 
-  // Find submethods.
-  upb_msg_field_iter i;
-  const upb_msgdef *md = upb_handlers_msgdef(h);
+  /* Find submethods. */
+  md = upb_handlers_msgdef(h);
   for(upb_msg_field_begin(&i, md);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
@@ -7233,20 +7307,21 @@
     const upb_handlers *sub_h;
     if (upb_fielddef_type(f) == UPB_TYPE_MESSAGE &&
         (sub_h = upb_handlers_getsubhandlers(h, f)) != NULL) {
-      // We only generate a decoder method for submessages with handlers.
-      // Others will be parsed as unknown fields.
+      /* We only generate a decoder method for submessages with handlers.
+       * Others will be parsed as unknown fields. */
       find_methods(c, sub_h);
     }
   }
 }
 
-// (Re-)compile bytecode for all messages in "msgs."
-// Overwrites any existing bytecode in "c".
+/* (Re-)compile bytecode for all messages in "msgs."
+ * Overwrites any existing bytecode in "c". */
 static void compile_methods(compiler *c) {
-  // Start over at the beginning of the bytecode.
+  upb_inttable_iter i;
+
+  /* Start over at the beginning of the bytecode. */
   c->pc = c->group->bytecode;
 
-  upb_inttable_iter i;
   upb_inttable_begin(&i, &c->group->methods);
   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
     upb_pbdecodermethod *method = upb_value_getptr(upb_inttable_iter_value(&i));
@@ -7259,10 +7334,10 @@
   upb_inttable_begin(&i, &g->methods);
   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
     upb_pbdecodermethod *m = upb_value_getptr(upb_inttable_iter_value(&i));
+    upb_byteshandler *h = &m->input_handler_;
 
     m->code_base.ptr = g->bytecode + m->code_base.ofs;
 
-    upb_byteshandler *h = &m->input_handler_;
     upb_byteshandler_setstartstr(h, upb_pbdecoder_startbc, m->code_base.ptr);
     upb_byteshandler_setstring(h, upb_pbdecoder_decode, g);
     upb_byteshandler_setendstr(h, upb_pbdecoder_end, m);
@@ -7277,53 +7352,58 @@
 static void sethandlers(mgroup *g, bool allowjit) {
   g->jit_code = NULL;
   if (allowjit) {
-    // Compile byte-code into machine code, create handlers.
+    /* Compile byte-code into machine code, create handlers. */
     upb_pbdecoder_jit(g);
   } else {
     set_bytecode_handlers(g);
   }
 }
 
-#else  // UPB_USE_JIT_X64
+#else  /* UPB_USE_JIT_X64 */
 
 static void sethandlers(mgroup *g, bool allowjit) {
-  // No JIT compiled in; use bytecode handlers unconditionally.
+  /* No JIT compiled in; use bytecode handlers unconditionally. */
   UPB_UNUSED(allowjit);
   set_bytecode_handlers(g);
 }
 
-#endif  // UPB_USE_JIT_X64
+#endif  /* UPB_USE_JIT_X64 */
 
 
-// TODO(haberman): allow this to be constructed for an arbitrary set of dest
-// handlers and other mgroups (but verify we have a transitive closure).
+/* TODO(haberman): allow this to be constructed for an arbitrary set of dest
+ * handlers and other mgroups (but verify we have a transitive closure). */
 const mgroup *mgroup_new(const upb_handlers *dest, bool allowjit, bool lazy,
                          const void *owner) {
+  mgroup *g;
+  compiler *c;
+
   UPB_UNUSED(allowjit);
   assert(upb_handlers_isfrozen(dest));
 
-  mgroup *g = newgroup(owner);
-  compiler *c = newcompiler(g, lazy);
+  g = newgroup(owner);
+  c = newcompiler(g, lazy);
   find_methods(c, dest);
 
-  // We compile in two passes:
-  // 1. all messages are assigned relative offsets from the beginning of the
-  //    bytecode (saved in method->code_base).
-  // 2. forwards OP_CALL instructions can be correctly linked since message
-  //    offsets have been previously assigned.
-  //
-  // Could avoid the second pass by linking OP_CALL instructions somehow.
+  /* We compile in two passes:
+   * 1. all messages are assigned relative offsets from the beginning of the
+   *    bytecode (saved in method->code_base).
+   * 2. forwards OP_CALL instructions can be correctly linked since message
+   *    offsets have been previously assigned.
+   *
+   * Could avoid the second pass by linking OP_CALL instructions somehow. */
   compile_methods(c);
   compile_methods(c);
   g->bytecode_end = c->pc;
   freecompiler(c);
 
 #ifdef UPB_DUMP_BYTECODE
-  FILE *f = fopen("/tmp/upb-bytecode", "wb");
-  assert(f);
-  dumpbc(g->bytecode, g->bytecode_end, stderr);
-  dumpbc(g->bytecode, g->bytecode_end, f);
-  fclose(f);
+  {
+    FILE *f = fopen("/tmp/upb-bytecode", "wb");
+    assert(f);
+    dumpbc(g->bytecode, g->bytecode_end, stderr);
+    dumpbc(g->bytecode, g->bytecode_end, f);
+    fclose(f);
+  }
 #endif
 
   sethandlers(g, allowjit);
@@ -7343,7 +7423,7 @@
   upb_inttable_begin(&i, &c->groups);
   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
     const mgroup *group = upb_value_getconstptr(upb_inttable_iter_value(&i));
-    upb_refcounted_unref(UPB_UPCAST(group), c);
+    mgroup_unref(group, c);
   }
   upb_inttable_uninit(&c->groups);
 }
@@ -7361,13 +7441,15 @@
 
 const upb_pbdecodermethod *upb_pbcodecache_getdecodermethod(
     upb_pbcodecache *c, const upb_pbdecodermethodopts *opts) {
-  // Right now we build a new DecoderMethod every time.
-  // TODO(haberman): properly cache methods by their true key.
+  upb_value v;
+  bool ok;
+
+  /* Right now we build a new DecoderMethod every time.
+   * TODO(haberman): properly cache methods by their true key. */
   const mgroup *g = mgroup_new(opts->handlers, c->allow_jit_, opts->lazy, c);
   upb_inttable_push(&c->groups, upb_value_constptr(g));
 
-  upb_value v;
-  bool ok = upb_inttable_lookupptr(&g->methods, opts->handlers, &v);
+  ok = upb_inttable_lookupptr(&g->methods, opts->handlers, &v);
   UPB_ASSERT_VAR(ok, ok);
   return upb_value_getptr(v);
 }
@@ -7413,17 +7495,17 @@
 
 #define CHECK_SUSPEND(x) if (!(x)) return upb_pbdecoder_suspend(d);
 
-// Error messages that are shared between the bytecode and JIT decoders.
+/* Error messages that are shared between the bytecode and JIT decoders. */
 const char *kPbDecoderStackOverflow = "Nesting too deep.";
 
-// Error messages shared within this file.
+/* Error messages shared within this file. */
 static const char *kUnterminatedVarint = "Unterminated varint.";
 
 /* upb_pbdecoder **************************************************************/
 
 static opcode halt = OP_HALT;
 
-// Whether an op consumes any of the input buffer.
+/* Whether an op consumes any of the input buffer. */
 static bool consumes_input(opcode op) {
   switch (op) {
     case OP_SETDISPATCH:
@@ -7451,12 +7533,12 @@
 
 static bool in_residual_buf(const upb_pbdecoder *d, const char *p);
 
-// It's unfortunate that we have to micro-manage the compiler with
-// UPB_FORCEINLINE and UPB_NOINLINE, especially since this tuning is necessarily
-// specific to one hardware configuration.  But empirically on a Core i7,
-// performance increases 30-50% with these annotations.  Every instance where
-// these appear, gcc 4.2.1 made the wrong decision and degraded performance in
-// benchmarks.
+/* It's unfortunate that we have to micro-manage the compiler with
+ * UPB_FORCEINLINE and UPB_NOINLINE, especially since this tuning is necessarily
+ * specific to one hardware configuration.  But empirically on a Core i7,
+ * performance increases 30-50% with these annotations.  Every instance where
+ * these appear, gcc 4.2.1 made the wrong decision and degraded performance in
+ * benchmarks. */
 
 static void seterr(upb_pbdecoder *d, const char *msg) {
   upb_status status = UPB_STATUS_INIT;
@@ -7471,22 +7553,22 @@
 
 /* Buffering ******************************************************************/
 
-// We operate on one buffer at a time, which is either the user's buffer passed
-// to our "decode" callback or some residual bytes from the previous buffer.
+/* We operate on one buffer at a time, which is either the user's buffer passed
+ * to our "decode" callback or some residual bytes from the previous buffer. */
 
-// How many bytes can be safely read from d->ptr without reading past end-of-buf
-// or past the current delimited end.
+/* How many bytes can be safely read from d->ptr without reading past end-of-buf
+ * or past the current delimited end. */
 static size_t curbufleft(const upb_pbdecoder *d) {
   assert(d->data_end >= d->ptr);
   return d->data_end - d->ptr;
 }
 
-// Overall stream offset of d->ptr.
+/* Overall stream offset of d->ptr. */
 uint64_t offset(const upb_pbdecoder *d) {
   return d->bufstart_ofs + (d->ptr - d->buf);
 }
 
-// Advances d->ptr.
+/* Advances d->ptr. */
 static void advance(upb_pbdecoder *d, size_t len) {
   assert(curbufleft(d) >= len);
   d->ptr += len;
@@ -7500,8 +7582,8 @@
   return in_buf(p, d->residual, d->residual_end);
 }
 
-// Calculates the delim_end value, which is affected by both the current buffer
-// and the parsing stack, so must be called whenever either is updated.
+/* Calculates the delim_end value, which is affected by both the current buffer
+ * and the parsing stack, so must be called whenever either is updated. */
 static void set_delim_end(upb_pbdecoder *d) {
   size_t delim_ofs = d->top->end_ofs - d->bufstart_ofs;
   if (delim_ofs <= (size_t)(d->end - d->buf)) {
@@ -7527,22 +7609,22 @@
 }
 
 static void checkpoint(upb_pbdecoder *d) {
-  // The assertion here is in the interests of efficiency, not correctness.
-  // We are trying to ensure that we don't checkpoint() more often than
-  // necessary.
+  /* The assertion here is in the interests of efficiency, not correctness.
+   * We are trying to ensure that we don't checkpoint() more often than
+   * necessary. */
   assert(d->checkpoint != d->ptr);
   d->checkpoint = d->ptr;
 }
 
-// Resumes the decoder from an initial state or from a previous suspend.
+/* Resumes the decoder from an initial state or from a previous suspend. */
 int32_t upb_pbdecoder_resume(upb_pbdecoder *d, void *p, const char *buf,
                              size_t size, const upb_bufhandle *handle) {
-  UPB_UNUSED(p);  // Useless; just for the benefit of the JIT.
+  UPB_UNUSED(p);  /* Useless; just for the benefit of the JIT. */
   d->buf_param = buf;
   d->size_param = size;
   d->handle = handle;
   if (d->residual_end > d->residual) {
-    // We have residual bytes from the last buffer.
+    /* We have residual bytes from the last buffer. */
     assert(d->ptr == d->residual);
   } else {
     switchtobuf(d, buf, buf + size);
@@ -7555,18 +7637,20 @@
   return DECODE_OK;
 }
 
-// Suspends the decoder at the last checkpoint, without saving any residual
-// bytes.  If there are any unconsumed bytes, returns a short byte count.
+/* Suspends the decoder at the last checkpoint, without saving any residual
+ * bytes.  If there are any unconsumed bytes, returns a short byte count. */
 size_t upb_pbdecoder_suspend(upb_pbdecoder *d) {
   d->pc = d->last;
   if (d->checkpoint == d->residual) {
-    // Checkpoint was in residual buf; no user bytes were consumed.
+    /* Checkpoint was in residual buf; no user bytes were consumed. */
     d->ptr = d->residual;
     return 0;
   } else {
+    size_t consumed;
     assert(!in_residual_buf(d, d->checkpoint));
     assert(d->buf == d->buf_param);
-    size_t consumed = d->checkpoint - d->buf;
+
+    consumed = d->checkpoint - d->buf;
     d->bufstart_ofs += consumed;
     d->residual_end = d->residual;
     switchtobuf(d, d->residual, d->residual_end);
@@ -7574,17 +7658,17 @@
   }
 }
 
-// Suspends the decoder at the last checkpoint, and saves any unconsumed
-// bytes in our residual buffer.  This is necessary if we need more user
-// bytes to form a complete value, which might not be contiguous in the
-// user's buffers.  Always consumes all user bytes.
+/* Suspends the decoder at the last checkpoint, and saves any unconsumed
+ * bytes in our residual buffer.  This is necessary if we need more user
+ * bytes to form a complete value, which might not be contiguous in the
+ * user's buffers.  Always consumes all user bytes. */
 static size_t suspend_save(upb_pbdecoder *d) {
-  // We hit end-of-buffer before we could parse a full value.
-  // Save any unconsumed bytes (if any) to the residual buffer.
+  /* We hit end-of-buffer before we could parse a full value.
+   * Save any unconsumed bytes (if any) to the residual buffer. */
   d->pc = d->last;
 
   if (d->checkpoint == d->residual) {
-    // Checkpoint was in residual buf; append user byte(s) to residual buf.
+    /* Checkpoint was in residual buf; append user byte(s) to residual buf. */
     assert((d->residual_end - d->residual) + d->size_param <=
            sizeof(d->residual));
     if (!in_residual_buf(d, d->ptr)) {
@@ -7593,10 +7677,12 @@
     memcpy(d->residual_end, d->buf_param, d->size_param);
     d->residual_end += d->size_param;
   } else {
-    // Checkpoint was in user buf; old residual bytes not needed.
+    /* Checkpoint was in user buf; old residual bytes not needed. */
+    size_t save;
     assert(!in_residual_buf(d, d->checkpoint));
+
     d->ptr = d->checkpoint;
-    size_t save = curbufleft(d);
+    save = curbufleft(d);
     assert(save <= sizeof(d->residual));
     memcpy(d->residual, d->ptr, save);
     d->residual_end = d->residual + save;
@@ -7607,19 +7693,21 @@
   return d->size_param;
 }
 
-// Skips "bytes" bytes in the stream, which may be more than available.  If we
-// skip more bytes than are available, we return a long read count to the caller
-// indicating how many bytes the caller should skip before passing a new buffer.
+/* Skips "bytes" bytes in the stream, which may be more than available.  If we
+ * skip more bytes than are available, we return a long read count to the caller
+ * indicating how many bytes the caller should skip before passing a new buffer.
+ */
 static int32_t skip(upb_pbdecoder *d, size_t bytes) {
   assert(!in_residual_buf(d, d->ptr) || d->size_param == 0);
   if (curbufleft(d) >= bytes) {
-    // Skipped data is all in current buffer.
+    /* Skipped data is all in current buffer. */
     advance(d, bytes);
     return DECODE_OK;
   } else {
-    // Skipped data extends beyond currently available buffers.
+    /* Skipped data extends beyond currently available buffers. */
+    size_t skip;
     d->pc = d->last;
-    size_t skip = bytes - curbufleft(d);
+    skip = bytes - curbufleft(d);
     d->bufstart_ofs += (d->end - d->buf) + skip;
     d->residual_end = d->residual;
     switchtobuf(d, d->residual, d->residual_end);
@@ -7627,8 +7715,8 @@
   }
 }
 
-// Copies the next "bytes" bytes into "buf" and advances the stream.
-// Requires that this many bytes are available in the current buffer.
+/* Copies the next "bytes" bytes into "buf" and advances the stream.
+ * Requires that this many bytes are available in the current buffer. */
 UPB_FORCEINLINE static void consumebytes(upb_pbdecoder *d, void *buf,
                                          size_t bytes) {
   assert(bytes <= curbufleft(d));
@@ -7636,9 +7724,9 @@
   advance(d, bytes);
 }
 
-// Slow path for getting the next "bytes" bytes, regardless of whether they are
-// available in the current buffer or not.  Returns a status code as described
-// in decoder.int.h.
+/* Slow path for getting the next "bytes" bytes, regardless of whether they are
+ * available in the current buffer or not.  Returns a status code as described
+ * in decoder.int.h. */
 UPB_NOINLINE static int32_t getbytes_slow(upb_pbdecoder *d, void *buf,
                                           size_t bytes) {
   const size_t avail = curbufleft(d);
@@ -7659,12 +7747,13 @@
   }
 }
 
-// Gets the next "bytes" bytes, regardless of whether they are available in the
-// current buffer or not.  Returns a status code as described in decoder.int.h.
+/* Gets the next "bytes" bytes, regardless of whether they are available in the
+ * current buffer or not.  Returns a status code as described in decoder.int.h.
+ */
 UPB_FORCEINLINE static int32_t getbytes(upb_pbdecoder *d, void *buf,
                                         size_t bytes) {
   if (curbufleft(d) >= bytes) {
-    // Buffer has enough data to satisfy.
+    /* Buffer has enough data to satisfy. */
     consumebytes(d, buf, bytes);
     return DECODE_OK;
   } else {
@@ -7697,13 +7786,13 @@
 
 /* Decoding of wire types *****************************************************/
 
-// Slow path for decoding a varint from the current buffer position.
-// Returns a status code as described in decoder.int.h.
+/* Slow path for decoding a varint from the current buffer position.
+ * Returns a status code as described in decoder.int.h. */
 UPB_NOINLINE int32_t upb_pbdecoder_decode_varint_slow(upb_pbdecoder *d,
                                                       uint64_t *u64) {
-  *u64 = 0;
   uint8_t byte = 0x80;
   int bitpos;
+  *u64 = 0;
   for(bitpos = 0; bitpos < 70 && (byte & 0x80); bitpos += 7) {
     int32_t ret = getbytes(d, &byte, 1);
     if (ret >= 0) return ret;
@@ -7716,15 +7805,15 @@
   return DECODE_OK;
 }
 
-// Decodes a varint from the current buffer position.
-// Returns a status code as described in decoder.int.h.
+/* Decodes a varint from the current buffer position.
+ * Returns a status code as described in decoder.int.h. */
 UPB_FORCEINLINE static int32_t decode_varint(upb_pbdecoder *d, uint64_t *u64) {
   if (curbufleft(d) > 0 && !(*d->ptr & 0x80)) {
     *u64 = *d->ptr;
     advance(d, 1);
     return DECODE_OK;
   } else if (curbufleft(d) >= 10) {
-    // Fast case.
+    /* Fast case. */
     upb_decoderet r = upb_vdecode_fast(d->ptr);
     if (r.p == NULL) {
       seterr(d, kUnterminatedVarint);
@@ -7734,22 +7823,23 @@
     *u64 = r.val;
     return DECODE_OK;
   } else {
-    // Slow case -- varint spans buffer seam.
+    /* Slow case -- varint spans buffer seam. */
     return upb_pbdecoder_decode_varint_slow(d, u64);
   }
 }
 
-// Decodes a 32-bit varint from the current buffer position.
-// Returns a status code as described in decoder.int.h.
+/* Decodes a 32-bit varint from the current buffer position.
+ * Returns a status code as described in decoder.int.h. */
 UPB_FORCEINLINE static int32_t decode_v32(upb_pbdecoder *d, uint32_t *u32) {
   uint64_t u64;
   int32_t ret = decode_varint(d, &u64);
   if (ret >= 0) return ret;
   if (u64 > UINT32_MAX) {
     seterr(d, "Unterminated 32-bit varint");
-    // TODO(haberman) guarantee that this function return is >= 0 somehow,
-    // so we know this path will always be treated as error by our caller.
-    // Right now the size_t -> int32_t can overflow and produce negative values.
+    /* TODO(haberman) guarantee that this function return is >= 0 somehow,
+     * so we know this path will always be treated as error by our caller.
+     * Right now the size_t -> int32_t can overflow and produce negative values.
+     */
     *u32 = 0;
     return upb_pbdecoder_suspend(d);
   }
@@ -7757,22 +7847,22 @@
   return DECODE_OK;
 }
 
-// Decodes a fixed32 from the current buffer position.
-// Returns a status code as described in decoder.int.h.
-// TODO: proper byte swapping for big-endian machines.
+/* Decodes a fixed32 from the current buffer position.
+ * Returns a status code as described in decoder.int.h.
+ * TODO: proper byte swapping for big-endian machines. */
 UPB_FORCEINLINE static int32_t decode_fixed32(upb_pbdecoder *d, uint32_t *u32) {
   return getbytes(d, u32, 4);
 }
 
-// Decodes a fixed64 from the current buffer position.
-// Returns a status code as described in decoder.int.h.
-// TODO: proper byte swapping for big-endian machines.
+/* Decodes a fixed64 from the current buffer position.
+ * Returns a status code as described in decoder.int.h.
+ * TODO: proper byte swapping for big-endian machines. */
 UPB_FORCEINLINE static int32_t decode_fixed64(upb_pbdecoder *d, uint64_t *u64) {
   return getbytes(d, u64, 8);
 }
 
-// Non-static versions of the above functions.
-// These are called by the JIT for fallback paths.
+/* Non-static versions of the above functions.
+ * These are called by the JIT for fallback paths. */
 int32_t upb_pbdecoder_decode_f32(upb_pbdecoder *d, uint32_t *u32) {
   return decode_fixed32(d, u32);
 }
@@ -7784,7 +7874,7 @@
 static double as_double(uint64_t n) { double d; memcpy(&d, &n, 8); return d; }
 static float  as_float(uint32_t n)  { float  f; memcpy(&f, &n, 4); return f; }
 
-// Pushes a frame onto the decoder stack.
+/* Pushes a frame onto the decoder stack. */
 static bool decoder_push(upb_pbdecoder *d, uint64_t end) {
   upb_pbdecoder_frame *fr = d->top;
 
@@ -7805,17 +7895,17 @@
 }
 
 static bool pushtagdelim(upb_pbdecoder *d, uint32_t arg) {
-  // While we expect to see an "end" tag (either ENDGROUP or a non-sequence
-  // field number) prior to hitting any enclosing submessage end, pushing our
-  // existing delim end prevents us from continuing to parse values from a
-  // corrupt proto that doesn't give us an END tag in time.
+  /* While we expect to see an "end" tag (either ENDGROUP or a non-sequence
+   * field number) prior to hitting any enclosing submessage end, pushing our
+   * existing delim end prevents us from continuing to parse values from a
+   * corrupt proto that doesn't give us an END tag in time. */
   if (!decoder_push(d, d->top->end_ofs))
     return false;
   d->top->groupnum = arg;
   return true;
 }
 
-// Pops a frame from the decoder stack.
+/* Pops a frame from the decoder stack. */
 static void decoder_pop(upb_pbdecoder *d) { d->top--; }
 
 UPB_NOINLINE int32_t upb_pbdecoder_checktag_slow(upb_pbdecoder *d,
@@ -7824,7 +7914,7 @@
   size_t bytes = upb_value_size(expected);
   size_t read = peekbytes(d, &data, bytes);
   if (read == bytes && data == expected) {
-    // Advance past matched bytes.
+    /* Advance past matched bytes. */
     int32_t ok = getbytes(d, &data, read);
     UPB_ASSERT_VAR(ok, ok < 0);
     return DECODE_OK;
@@ -7852,7 +7942,7 @@
       return upb_pbdecoder_suspend(d);
     }
 
-    // TODO: deliver to unknown field callback.
+    /* TODO: deliver to unknown field callback. */
     switch (wire_type) {
       case UPB_WIRE_TYPE_32BIT:
         CHECK_RETURN(skip(d, 4));
@@ -7895,29 +7985,29 @@
 
     if (d->ptr == d->delim_end) {
       seterr(d, "Enclosing submessage ended in the middle of value or group");
-      // Unlike most errors we notice during parsing, right now we have consumed
-      // all of the user's input.
-      //
-      // There are three different options for how to handle this case:
-      //
-      //   1. decode() = short count, error = set
-      //   2. decode() = full count, error = set
-      //   3. decode() = full count, error NOT set, short count and error will
-      //      be reported on next call to decode() (or end())
-      //
-      // (1) and (3) have the advantage that they preserve the invariant that an
-      // error occurs iff decode() returns a short count.
-      //
-      // (2) and (3) have the advantage of reflecting the fact that all of the
-      // bytes were in fact parsed (and possibly delivered to the unknown field
-      // handler, in the future when that is supported).
-      //
-      // (3) requires extra state in the decode (a place to store the "permanent
-      // error" that we should return for all subsequent attempts to decode).
-      // But we likely want this anyway.
-      //
-      // Right now we do (1), thanks to the fact that we checkpoint *after* this
-      // check.  (3) may be a better choice long term; unclear at the moment.
+      /* Unlike most errors we notice during parsing, right now we have consumed
+       * all of the user's input.
+       *
+       * There are three different options for how to handle this case:
+       *
+       *   1. decode() = short count, error = set
+       *   2. decode() = full count, error = set
+       *   3. decode() = full count, error NOT set, short count and error will
+       *      be reported on next call to decode() (or end())
+       *
+       * (1) and (3) have the advantage that they preserve the invariant that an
+       * error occurs iff decode() returns a short count.
+       *
+       * (2) and (3) have the advantage of reflecting the fact that all of the
+       * bytes were in fact parsed (and possibly delivered to the unknown field
+       * handler, in the future when that is supported).
+       *
+       * (3) requires extra state in the decode (a place to store the "permanent
+       * error" that we should return for all subsequent attempts to decode).
+       * But we likely want this anyway.
+       *
+       * Right now we do (1), thanks to the fact that we checkpoint *after* this
+       * check.  (3) may be a better choice long term; unclear at the moment. */
       return upb_pbdecoder_suspend(d);
     }
 
@@ -7932,24 +8022,27 @@
   d->pc = d->top->base + upb_value_getuint64(v);
 }
 
-// Parses a tag and jumps to the corresponding bytecode instruction for this
-// field.
-//
-// If the tag is unknown (or the wire type doesn't match), parses the field as
-// unknown.  If the tag is a valid ENDGROUP tag, jumps to the bytecode
-// instruction for the end of message.
+/* Parses a tag and jumps to the corresponding bytecode instruction for this
+ * field.
+ *
+ * If the tag is unknown (or the wire type doesn't match), parses the field as
+ * unknown.  If the tag is a valid ENDGROUP tag, jumps to the bytecode
+ * instruction for the end of message. */
 static int32_t dispatch(upb_pbdecoder *d) {
   upb_inttable *dispatch = d->top->dispatch;
-
-  // Decode tag.
   uint32_t tag;
-  CHECK_RETURN(decode_v32(d, &tag));
-  uint8_t wire_type = tag & 0x7;
-  uint32_t fieldnum = tag >> 3;
-
-  // Lookup tag.  Because of packed/non-packed compatibility, we have to
-  // check the wire type against two possibilities.
+  uint8_t wire_type;
+  uint32_t fieldnum;
   upb_value val;
+  int32_t ret;
+
+  /* Decode tag. */
+  CHECK_RETURN(decode_v32(d, &tag));
+  wire_type = tag & 0x7;
+  fieldnum = tag >> 3;
+
+  /* Lookup tag.  Because of packed/non-packed compatibility, we have to
+   * check the wire type against two possibilities. */
   if (fieldnum != DISPATCH_ENDMSG &&
       upb_inttable_lookup32(dispatch, fieldnum, &val)) {
     uint64_t v = upb_value_getuint64(val);
@@ -7965,17 +8058,17 @@
     }
   }
 
-  // Unknown field or ENDGROUP.
-  int32_t ret = upb_pbdecoder_skipunknown(d, fieldnum, wire_type);
+  /* Unknown field or ENDGROUP. */
+  ret = upb_pbdecoder_skipunknown(d, fieldnum, wire_type);
 
   if (ret == DECODE_ENDGROUP) {
     goto_endmsg(d);
     return DECODE_OK;
   } else if (ret == DECODE_OK) {
-    // We just consumed some input, so we might now have consumed all the data
-    // in the delmited region.  Since every opcode that can trigger dispatch is
-    // directly preceded by OP_CHECKDELIM, rewind to it now to re-check the
-    // delimited end.
+    /* We just consumed some input, so we might now have consumed all the data
+     * in the delmited region.  Since every opcode that can trigger dispatch is
+     * directly preceded by OP_CHECKDELIM, rewind to it now to re-check the
+     * delimited end. */
     d->pc = d->last - 1;
     assert(getop(*d->pc) == OP_CHECKDELIM);
     return DECODE_OK;
@@ -7984,8 +8077,8 @@
   return ret;
 }
 
-// Callers know that the stack is more than one deep because the opcodes that
-// call this only occur after PUSH operations.
+/* Callers know that the stack is more than one deep because the opcodes that
+ * call this only occur after PUSH operations. */
 upb_pbdecoder_frame *outer_frame(upb_pbdecoder *d) {
   assert(d->top != d->stack);
   return d->top - 1;
@@ -7994,14 +8087,15 @@
 
 /* The main decoding loop *****************************************************/
 
-// The main decoder VM function.  Uses traditional bytecode dispatch loop with a
-// switch() statement.
+/* The main decoder VM function.  Uses traditional bytecode dispatch loop with a
+ * switch() statement. */
 size_t upb_pbdecoder_decode(void *closure, const void *hd, const char *buf,
                             size_t size, const upb_bufhandle *handle) {
   upb_pbdecoder *d = closure;
   const mgroup *group = hd;
+  int32_t result;
   assert(buf);
-  int32_t result = upb_pbdecoder_resume(d, NULL, buf, size, handle);
+  result = upb_pbdecoder_resume(d, NULL, buf, size, handle);
   if (result == DECODE_ENDGROUP) {
     goto_endmsg(d);
   }
@@ -8018,11 +8112,16 @@
   })
 
   while(1) {
+    int32_t instruction;
+    opcode op;
+    uint32_t arg;
+    int32_t longofs;
+
     d->last = d->pc;
-    int32_t instruction = *d->pc++;
-    opcode op = getop(instruction);
-    uint32_t arg = instruction >> 8;
-    int32_t longofs = arg;
+    instruction = *d->pc++;
+    op = getop(instruction);
+    arg = instruction >> 8;
+    longofs = arg;
     assert(d->ptr != d->residual_end);
 #ifdef UPB_DUMP_BYTECODE
     fprintf(stderr, "s_ofs=%d buf_ofs=%d data_rem=%d buf_rem=%d delim_rem=%d "
@@ -8037,9 +8136,9 @@
             arg);
 #endif
     switch (op) {
-      // Technically, we are losing data if we see a 32-bit varint that is not
-      // properly sign-extended.  We could detect this and error about the data
-      // loss, but proto2 does not do this, so we pass.
+      /* Technically, we are losing data if we see a 32-bit varint that is not
+       * properly sign-extended.  We could detect this and error about the data
+       * loss, but proto2 does not do this, so we pass. */
       PRIMITIVE_OP(INT32,    varint,  int32,  int32_t,      uint64_t)
       PRIMITIVE_OP(INT64,    varint,  int64,  int64_t,      uint64_t)
       PRIMITIVE_OP(UINT32,   varint,  uint32, uint32_t,     uint64_t)
@@ -8084,7 +8183,7 @@
         upb_pbdecoder_frame *outer = outer_frame(d);
         CHECK_SUSPEND(upb_sink_startstr(&outer->sink, arg, len, &d->top->sink));
         if (len == 0) {
-          d->pc++;  // Skip OP_STRING.
+          d->pc++;  /* Skip OP_STRING. */
         }
       )
       VMCASE(OP_STRING,
@@ -8096,15 +8195,15 @@
             return upb_pbdecoder_suspend(d);
           } else {
             int32_t ret = skip(d, n);
-            // This shouldn't return DECODE_OK, because n > len.
+            /* This shouldn't return DECODE_OK, because n > len. */
             assert(ret >= 0);
             return ret;
           }
         }
         advance(d, n);
         if (n < len || d->delim_end == NULL) {
-          // We aren't finished with this string yet.
-          d->pc--;  // Repeat OP_STRING.
+          /* We aren't finished with this string yet. */
+          d->pc--;  /* Repeat OP_STRING. */
           if (n > 0) checkpoint(d);
           return upb_pbdecoder_suspend(d);
         }
@@ -8132,8 +8231,9 @@
         set_delim_end(d);
       )
       VMCASE(OP_CHECKDELIM,
-        // We are guaranteed of this assert because we never allow ourselves to
-        // consume bytes beyond data_end, which covers delim_end when non-NULL.
+        /* We are guaranteed of this assert because we never allow ourselves to
+         * consume bytes beyond data_end, which covers delim_end when non-NULL.
+         */
         assert(!(d->delim_end && d->ptr > d->delim_end));
         if (d->ptr == d->delim_end)
           d->pc += longofs;
@@ -8150,8 +8250,9 @@
         d->pc += longofs;
       )
       VMCASE(OP_TAG1,
+        uint8_t expected;
         CHECK_SUSPEND(curbufleft(d) > 0);
-        uint8_t expected = (arg >> 8) & 0xff;
+        expected = (arg >> 8) & 0xff;
         if (*d->ptr == expected) {
           advance(d, 1);
         } else {
@@ -8162,13 +8263,14 @@
             CHECK_RETURN(dispatch(d));
           } else {
             d->pc += shortofs;
-            break; // Avoid checkpoint().
+            break; /* Avoid checkpoint(). */
           }
         }
       )
       VMCASE(OP_TAG2,
+        uint16_t expected;
         CHECK_SUSPEND(curbufleft(d) > 0);
-        uint16_t expected = (arg >> 8) & 0xffff;
+        expected = (arg >> 8) & 0xffff;
         if (curbufleft(d) >= 2) {
           uint16_t actual;
           memcpy(&actual, d->ptr, 2);
@@ -8185,9 +8287,10 @@
       )
       VMCASE(OP_TAGN, {
         uint64_t expected;
+        int32_t result;
         memcpy(&expected, d->pc, 8);
         d->pc += 2;
-        int32_t result = upb_pbdecoder_checktag_slow(d, expected);
+        result = upb_pbdecoder_checktag_slow(d, expected);
         if (result == DECODE_MISMATCH) goto badtag;
         if (result >= 0) return result;
       })
@@ -8213,9 +8316,9 @@
 }
 
 void *upb_pbdecoder_startjit(void *closure, const void *hd, size_t size_hint) {
+  upb_pbdecoder *d = closure;
   UPB_UNUSED(hd);
   UPB_UNUSED(size_hint);
-  upb_pbdecoder *d = closure;
   d->top->end_ofs = UINT64_MAX;
   d->bufstart_ofs = 0;
   d->call_len = 0;
@@ -8225,6 +8328,11 @@
 bool upb_pbdecoder_end(void *closure, const void *handler_data) {
   upb_pbdecoder *d = closure;
   const upb_pbdecodermethod *method = handler_data;
+  uint64_t end;
+  char dummy;
+#ifdef UPB_USE_JIT_X64
+  const mgroup *group = (const mgroup*)method->group;
+#endif
 
   if (d->residual_end > d->residual) {
     seterr(d, "Unexpected EOF");
@@ -8236,35 +8344,32 @@
     return false;
   }
 
-  // Message ends here.
-  uint64_t end = offset(d);
+  /* Message ends here. */
+  end = offset(d);
   d->top->end_ofs = end;
 
-  char dummy;
 #ifdef UPB_USE_JIT_X64
-  const mgroup *group = (const mgroup*)method->group;
   if (group->jit_code) {
     if (d->top != d->stack)
       d->stack->end_ofs = 0;
     group->jit_code(closure, method->code_base.ptr, &dummy, 0, NULL);
-  } else {
+  } else
 #endif
-    d->stack->end_ofs = end;
+  {
     const uint32_t *p = d->pc;
-    // Check the previous bytecode, but guard against beginning.
+    d->stack->end_ofs = end;
+    /* Check the previous bytecode, but guard against beginning. */
     if (p != method->code_base.ptr) p--;
     if (getop(*p) == OP_CHECKDELIM) {
-      // Rewind from OP_TAG* to OP_CHECKDELIM.
+      /* Rewind from OP_TAG* to OP_CHECKDELIM. */
       assert(getop(*d->pc) == OP_TAG1 ||
              getop(*d->pc) == OP_TAG2 ||
              getop(*d->pc) == OP_TAGN ||
-             getop(*d->pc == OP_DISPATCH));
+             getop(*d->pc) == OP_DISPATCH);
       d->pc = p;
     }
     upb_pbdecoder_decode(closure, handler_data, &dummy, 0, NULL);
-#ifdef UPB_USE_JIT_X64
   }
-#endif
 
   if (d->call_len != 0) {
     seterr(d, "Unexpected EOF");
@@ -8293,8 +8398,8 @@
 
 #ifdef UPB_USE_JIT_X64
   if (d->method_->is_native_) {
-    // Each native stack frame needs two pointers, plus we need a few frames for
-    // the enter/exit trampolines.
+    /* Each native stack frame needs two pointers, plus we need a few frames for
+     * the enter/exit trampolines. */
     size_t ret = entries * sizeof(void*) * 2;
     ret += sizeof(void*) * 10;
     return ret;
@@ -8335,7 +8440,7 @@
   }
   upb_sink_reset(&d->top->sink, sink->handlers, sink->closure);
 
-  // If this fails, increase the value in decoder.h.
+  /* If this fails, increase the value in decoder.h. */
   assert(upb_env_bytesallocated(e) - size_before <= UPB_PB_DECODER_SIZE);
   return d;
 }
@@ -8360,12 +8465,12 @@
   assert(d->top >= d->stack);
 
   if (max < (size_t)(d->top - d->stack)) {
-    // Can't set a limit smaller than what we are currently at.
+    /* Can't set a limit smaller than what we are currently at. */
     return false;
   }
 
   if (max > d->stack_size) {
-    // Need to reallocate stack and callstack to accommodate.
+    /* Need to reallocate stack and callstack to accommodate. */
     size_t old_size = stacksize(d, d->stack_size);
     size_t new_size = stacksize(d, max);
     void *p = upb_env_realloc(d->env, d->stack, old_size, new_size);
@@ -8450,73 +8555,74 @@
 
 #include <stdlib.h>
 
-// The output buffer is divided into segments; a segment is a string of data
-// that is "ready to go" -- it does not need any varint lengths inserted into
-// the middle.  The seams between segments are where varints will be inserted
-// once they are known.
-//
-// We also use the concept of a "run", which is a range of encoded bytes that
-// occur at a single submessage level.  Every segment contains one or more runs.
-//
-// A segment can span messages.  Consider:
-//
-//                  .--Submessage lengths---------.
-//                  |       |                     |
-//                  |       V                     V
-//                  V      | |---------------    | |-----------------
-// Submessages:    | |-----------------------------------------------
-// Top-level msg: ------------------------------------------------------------
-//
-// Segments:          -----   -------------------   -----------------
-// Runs:              *----   *--------------*---   *----------------
-// (* marks the start)
-//
-// Note that the top-level menssage is not in any segment because it does not
-// have any length preceding it.
-//
-// A segment is only interrupted when another length needs to be inserted.  So
-// observe how the second segment spans both the inner submessage and part of
-// the next enclosing message.
+/* The output buffer is divided into segments; a segment is a string of data
+ * that is "ready to go" -- it does not need any varint lengths inserted into
+ * the middle.  The seams between segments are where varints will be inserted
+ * once they are known.
+ *
+ * We also use the concept of a "run", which is a range of encoded bytes that
+ * occur at a single submessage level.  Every segment contains one or more runs.
+ *
+ * A segment can span messages.  Consider:
+ *
+ *                  .--Submessage lengths---------.
+ *                  |       |                     |
+ *                  |       V                     V
+ *                  V      | |---------------    | |-----------------
+ * Submessages:    | |-----------------------------------------------
+ * Top-level msg: ------------------------------------------------------------
+ *
+ * Segments:          -----   -------------------   -----------------
+ * Runs:              *----   *--------------*---   *----------------
+ * (* marks the start)
+ *
+ * Note that the top-level menssage is not in any segment because it does not
+ * have any length preceding it.
+ *
+ * A segment is only interrupted when another length needs to be inserted.  So
+ * observe how the second segment spans both the inner submessage and part of
+ * the next enclosing message. */
 typedef struct {
-  uint32_t msglen;  // The length to varint-encode before this segment.
-  uint32_t seglen;  // Length of the segment.
+  uint32_t msglen;  /* The length to varint-encode before this segment. */
+  uint32_t seglen;  /* Length of the segment. */
 } upb_pb_encoder_segment;
 
 struct upb_pb_encoder {
   upb_env *env;
 
-  // Our input and output.
+  /* Our input and output. */
   upb_sink input_;
   upb_bytessink *output_;
 
-  // The "subclosure" -- used as the inner closure as part of the bytessink
-  // protocol.
+  /* The "subclosure" -- used as the inner closure as part of the bytessink
+   * protocol. */
   void *subc;
 
-  // The output buffer and limit, and our current write position.  "buf"
-  // initially points to "initbuf", but is dynamically allocated if we need to
-  // grow beyond the initial size.
+  /* The output buffer and limit, and our current write position.  "buf"
+   * initially points to "initbuf", but is dynamically allocated if we need to
+   * grow beyond the initial size. */
   char *buf, *ptr, *limit;
 
-  // The beginning of the current run, or undefined if we are at the top level.
+  /* The beginning of the current run, or undefined if we are at the top
+   * level. */
   char *runbegin;
 
-  // The list of segments we are accumulating.
+  /* The list of segments we are accumulating. */
   upb_pb_encoder_segment *segbuf, *segptr, *seglimit;
 
-  // The stack of enclosing submessages.  Each entry in the stack points to the
-  // segment where this submessage's length is being accumulated.
+  /* The stack of enclosing submessages.  Each entry in the stack points to the
+   * segment where this submessage's length is being accumulated. */
   int *stack, *top, *stacklimit;
 
-  // Depth of startmsg/endmsg calls.
+  /* Depth of startmsg/endmsg calls. */
   int depth;
 };
 
 /* low-level buffering ********************************************************/
 
-// Low-level functions for interacting with the output buffer.
+/* Low-level functions for interacting with the output buffer. */
 
-// TODO(haberman): handle pushback
+/* TODO(haberman): handle pushback */
 static void putbuf(upb_pb_encoder *e, const char *buf, size_t len) {
   size_t n = upb_bytessink_putbuf(e->output_, e->subc, buf, len, NULL);
   UPB_ASSERT_VAR(n, n == len);
@@ -8526,11 +8632,12 @@
   return &e->segbuf[*e->top];
 }
 
-// Call to ensure that at least "bytes" bytes are available for writing at
-// e->ptr.  Returns false if the bytes could not be allocated.
+/* Call to ensure that at least "bytes" bytes are available for writing at
+ * e->ptr.  Returns false if the bytes could not be allocated. */
 static bool reserve(upb_pb_encoder *e, size_t bytes) {
   if ((size_t)(e->limit - e->ptr) < bytes) {
-    // Grow buffer.
+    /* Grow buffer. */
+    char *new_buf;
     size_t needed = bytes + (e->ptr - e->buf);
     size_t old_size = e->limit - e->buf;
 
@@ -8540,7 +8647,7 @@
       new_size *= 2;
     }
 
-    char *new_buf = upb_env_realloc(e->env, e->buf, old_size, new_size);
+    new_buf = upb_env_realloc(e->env, e->buf, old_size, new_size);
 
     if (new_buf == NULL) {
       return false;
@@ -8555,22 +8662,22 @@
   return true;
 }
 
-// Call when "bytes" bytes have been writte at e->ptr.  The caller *must* have
-// previously called reserve() with at least this many bytes.
+/* Call when "bytes" bytes have been writte at e->ptr.  The caller *must* have
+ * previously called reserve() with at least this many bytes. */
 static void encoder_advance(upb_pb_encoder *e, size_t bytes) {
   assert((size_t)(e->limit - e->ptr) >= bytes);
   e->ptr += bytes;
 }
 
-// Call when all of the bytes for a handler have been written.  Flushes the
-// bytes if possible and necessary, returning false if this failed.
+/* Call when all of the bytes for a handler have been written.  Flushes the
+ * bytes if possible and necessary, returning false if this failed. */
 static bool commit(upb_pb_encoder *e) {
   if (!e->top) {
-    // We aren't inside a delimited region.  Flush our accumulated bytes to
-    // the output.
-    //
-    // TODO(haberman): in the future we may want to delay flushing for
-    // efficiency reasons.
+    /* We aren't inside a delimited region.  Flush our accumulated bytes to
+     * the output.
+     *
+     * TODO(haberman): in the future we may want to delay flushing for
+     * efficiency reasons. */
     putbuf(e, e->buf, e->ptr - e->buf);
     e->ptr = e->buf;
   }
@@ -8578,7 +8685,7 @@
   return true;
 }
 
-// Writes the given bytes to the buffer, handling reserve/advance.
+/* Writes the given bytes to the buffer, handling reserve/advance. */
 static bool encode_bytes(upb_pb_encoder *e, const void *data, size_t len) {
   if (!reserve(e, len)) {
     return false;
@@ -8589,32 +8696,33 @@
   return true;
 }
 
-// Finish the current run by adding the run totals to the segment and message
-// length.
+/* Finish the current run by adding the run totals to the segment and message
+ * length. */
 static void accumulate(upb_pb_encoder *e) {
+  size_t run_len;
   assert(e->ptr >= e->runbegin);
-  size_t run_len = e->ptr - e->runbegin;
+  run_len = e->ptr - e->runbegin;
   e->segptr->seglen += run_len;
   top(e)->msglen += run_len;
   e->runbegin = e->ptr;
 }
 
-// Call to indicate the start of delimited region for which the full length is
-// not yet known.  All data will be buffered until the length is known.
-// Delimited regions may be nested; their lengths will all be tracked properly.
+/* Call to indicate the start of delimited region for which the full length is
+ * not yet known.  All data will be buffered until the length is known.
+ * Delimited regions may be nested; their lengths will all be tracked properly. */
 static bool start_delim(upb_pb_encoder *e) {
   if (e->top) {
-    // We are already buffering, advance to the next segment and push it on the
-    // stack.
+    /* We are already buffering, advance to the next segment and push it on the
+     * stack. */
     accumulate(e);
 
     if (++e->top == e->stacklimit) {
-      // TODO(haberman): grow stack?
+      /* TODO(haberman): grow stack? */
       return false;
     }
 
     if (++e->segptr == e->seglimit) {
-      // Grow segment buffer.
+      /* Grow segment buffer. */
       size_t old_size =
           (e->seglimit - e->segbuf) * sizeof(upb_pb_encoder_segment);
       size_t new_size = old_size * 2;
@@ -8630,7 +8738,7 @@
       e->segbuf = new_buf;
     }
   } else {
-    // We were previously at the top level, start buffering.
+    /* We were previously at the top level, start buffering. */
     e->segptr = e->segbuf;
     e->top = e->stack;
     e->runbegin = e->ptr;
@@ -8643,15 +8751,16 @@
   return true;
 }
 
-// Call to indicate the end of a delimited region.  We now know the length of
-// the delimited region.  If we are not nested inside any other delimited
-// regions, we can now emit all of the buffered data we accumulated.
+/* Call to indicate the end of a delimited region.  We now know the length of
+ * the delimited region.  If we are not nested inside any other delimited
+ * regions, we can now emit all of the buffered data we accumulated. */
 static bool end_delim(upb_pb_encoder *e) {
+  size_t msglen;
   accumulate(e);
-  size_t msglen = top(e)->msglen;
+  msglen = top(e)->msglen;
 
   if (e->top == e->stack) {
-    // All lengths are now available, emit all buffered data.
+    /* All lengths are now available, emit all buffered data. */
     char buf[UPB_PB_VARINT_MAX_LEN];
     upb_pb_encoder_segment *s;
     const char *ptr = e->buf;
@@ -8665,7 +8774,8 @@
     e->ptr = e->buf;
     e->top = NULL;
   } else {
-    // Need to keep buffering; propagate length info into enclosing submessages.
+    /* Need to keep buffering; propagate length info into enclosing
+     * submessages. */
     --e->top;
     top(e)->msglen += msglen + upb_varint_size(msglen);
   }
@@ -8676,14 +8786,14 @@
 
 /* tag_t **********************************************************************/
 
-// A precomputed (pre-encoded) tag and length.
+/* A precomputed (pre-encoded) tag and length. */
 
 typedef struct {
   uint8_t bytes;
   char tag[7];
 } tag_t;
 
-// Allocates a new tag for this field, and sets it in these handlerattr.
+/* Allocates a new tag for this field, and sets it in these handlerattr. */
 static void new_tag(upb_handlers *h, const upb_fielddef *f, upb_wiretype_t wt,
                     upb_handlerattr *attr) {
   uint32_t n = upb_fielddef_number(f);
@@ -8704,12 +8814,12 @@
 /* encoding of wire types *****************************************************/
 
 static bool encode_fixed64(upb_pb_encoder *e, uint64_t val) {
-  // TODO(haberman): byte-swap for big endian.
+  /* TODO(haberman): byte-swap for big endian. */
   return encode_bytes(e, &val, sizeof(uint64_t));
 }
 
 static bool encode_fixed32(upb_pb_encoder *e, uint32_t val) {
-  // TODO(haberman): byte-swap for big endian.
+  /* TODO(haberman): byte-swap for big endian. */
   return encode_bytes(e, &val, sizeof(uint32_t));
 }
 
@@ -8796,19 +8906,19 @@
   }
 
 T(double,   double,   dbl2uint64,   encode_fixed64)
-T(float,    float,    flt2uint32,   encode_fixed32);
-T(int64,    int64_t,  uint64_t,     encode_varint);
-T(int32,    int32_t,  uint32_t,     encode_varint);
-T(fixed64,  uint64_t, uint64_t,     encode_fixed64);
-T(fixed32,  uint32_t, uint32_t,     encode_fixed32);
-T(bool,     bool,     bool,         encode_varint);
-T(uint32,   uint32_t, uint32_t,     encode_varint);
-T(uint64,   uint64_t, uint64_t,     encode_varint);
-T(enum,     int32_t,  uint32_t,     encode_varint);
-T(sfixed32, int32_t,  uint32_t,     encode_fixed32);
-T(sfixed64, int64_t,  uint64_t,     encode_fixed64);
-T(sint32,   int32_t,  upb_zzenc_32, encode_varint);
-T(sint64,   int64_t,  upb_zzenc_64, encode_varint);
+T(float,    float,    flt2uint32,   encode_fixed32)
+T(int64,    int64_t,  uint64_t,     encode_varint)
+T(int32,    int32_t,  uint32_t,     encode_varint)
+T(fixed64,  uint64_t, uint64_t,     encode_fixed64)
+T(fixed32,  uint32_t, uint32_t,     encode_fixed32)
+T(bool,     bool,     bool,         encode_varint)
+T(uint32,   uint32_t, uint32_t,     encode_varint)
+T(uint64,   uint64_t, uint64_t,     encode_varint)
+T(enum,     int32_t,  uint32_t,     encode_varint)
+T(sfixed32, int32_t,  uint32_t,     encode_fixed32)
+T(sfixed64, int64_t,  uint64_t,     encode_fixed64)
+T(sint32,   int32_t,  upb_zzenc_32, encode_varint)
+T(sint64,   int64_t,  upb_zzenc_64, encode_varint)
 
 #undef T
 
@@ -8816,13 +8926,15 @@
 /* code to build the handlers *************************************************/
 
 static void newhandlers_callback(const void *closure, upb_handlers *h) {
+  const upb_msgdef *m;
+  upb_msg_field_iter i;
+
   UPB_UNUSED(closure);
 
   upb_handlers_setstartmsg(h, startmsg, NULL);
   upb_handlers_setendmsg(h, endmsg, NULL);
 
-  const upb_msgdef *m = upb_handlers_msgdef(h);
-  upb_msg_field_iter i;
+  m = upb_handlers_msgdef(h);
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
@@ -8834,7 +8946,7 @@
         packed ? UPB_WIRE_TYPE_DELIMITED
                : upb_pb_native_wire_types[upb_fielddef_descriptortype(f)];
 
-    // Pre-encode the tag for this field.
+    /* Pre-encode the tag for this field. */
     new_tag(h, f, wt, &attr);
 
     if (packed) {
@@ -8877,7 +8989,7 @@
         upb_handlers_setendsubmsg(h, f, encode_enddelimfield, &attr);
         break;
       case UPB_DESCRIPTOR_TYPE_GROUP: {
-        // Endgroup takes a different tag (wire_type = END_GROUP).
+        /* Endgroup takes a different tag (wire_type = END_GROUP). */
         upb_handlerattr attr2;
         new_tag(h, f, UPB_WIRE_TYPE_END_GROUP, &attr2);
 
@@ -8913,7 +9025,7 @@
                                       upb_bytessink *output) {
   const size_t initial_bufsize = 256;
   const size_t initial_segbufsize = 16;
-  // TODO(haberman): make this configurable.
+  /* TODO(haberman): make this configurable. */
   const size_t stack_size = 64;
 #ifndef NDEBUG
   const size_t size_before = upb_env_bytesallocated(env);
@@ -8942,7 +9054,7 @@
   e->subc = output->closure;
   e->ptr = e->buf;
 
-  // If this fails, increase the value in encoder.h.
+  /* If this fails, increase the value in encoder.h. */
   assert(upb_env_bytesallocated(env) - size_before <= UPB_PB_ENCODER_SIZE);
   return e;
 }
@@ -8962,28 +9074,31 @@
 
 upb_def **upb_load_defs_from_descriptor(const char *str, size_t len, int *n,
                                         void *owner, upb_status *status) {
-  // Create handlers.
+  /* Create handlers. */
+  const upb_pbdecodermethod *decoder_m;
   const upb_handlers *reader_h = upb_descreader_newhandlers(&reader_h);
-  upb_pbdecodermethodopts opts;
-  upb_pbdecodermethodopts_init(&opts, reader_h);
-  const upb_pbdecodermethod *decoder_m =
-      upb_pbdecodermethod_new(&opts, &decoder_m);
-
   upb_env env;
+  upb_pbdecodermethodopts opts;
+  upb_pbdecoder *decoder;
+  upb_descreader *reader;
+  bool ok;
+  upb_def **ret = NULL;
+  upb_def **defs;
+
+  upb_pbdecodermethodopts_init(&opts, reader_h);
+  decoder_m = upb_pbdecodermethod_new(&opts, &decoder_m);
+
   upb_env_init(&env);
   upb_env_reporterrorsto(&env, status);
 
-  upb_descreader *reader = upb_descreader_create(&env, reader_h);
-  upb_pbdecoder *decoder =
-      upb_pbdecoder_create(&env, decoder_m, upb_descreader_input(reader));
+  reader = upb_descreader_create(&env, reader_h);
+  decoder = upb_pbdecoder_create(&env, decoder_m, upb_descreader_input(reader));
 
-  // Push input data.
-  bool ok = upb_bufsrc_putbuf(str, len, upb_pbdecoder_input(decoder));
-
-  upb_def **ret = NULL;
+  /* Push input data. */
+  ok = upb_bufsrc_putbuf(str, len, upb_pbdecoder_input(decoder));
 
   if (!ok) goto cleanup;
-  upb_def **defs = upb_descreader_getdefs(reader, owner, n);
+  defs = upb_descreader_getdefs(reader, owner, n);
   ret = malloc(sizeof(upb_def*) * (*n));
   memcpy(ret, defs, sizeof(upb_def*) * (*n));
 
@@ -8997,21 +9112,24 @@
 bool upb_load_descriptor_into_symtab(upb_symtab *s, const char *str, size_t len,
                                      upb_status *status) {
   int n;
+  bool success;
   upb_def **defs = upb_load_defs_from_descriptor(str, len, &n, &defs, status);
   if (!defs) return false;
-  bool success = upb_symtab_add(s, defs, n, &defs, status);
+  success = upb_symtab_add(s, defs, n, &defs, status);
   free(defs);
   return success;
 }
 
 char *upb_readfile(const char *filename, size_t *len) {
+  long size;
+  char *buf;
   FILE *f = fopen(filename, "rb");
   if(!f) return NULL;
   if(fseek(f, 0, SEEK_END) != 0) goto error;
-  long size = ftell(f);
+  size = ftell(f);
   if(size < 0) goto error;
   if(fseek(f, 0, SEEK_SET) != 0) goto error;
-  char *buf = malloc(size + 1);
+  buf = malloc(size + 1);
   if(size && fread(buf, size, 1, f) != 1) goto error;
   fclose(f);
   if (len) *len = size;
@@ -9025,12 +9143,13 @@
 bool upb_load_descriptor_file_into_symtab(upb_symtab *symtab, const char *fname,
                                           upb_status *status) {
   size_t len;
+  bool success;
   char *data = upb_readfile(fname, &len);
   if (!data) {
     if (status) upb_status_seterrf(status, "Couldn't read file: %s", fname);
     return false;
   }
-  bool success = upb_load_descriptor_into_symtab(symtab, data, len, status);
+  success = upb_load_descriptor_into_symtab(symtab, data, len, status);
   free(data);
   return success;
 }
@@ -9048,6 +9167,7 @@
 #include <ctype.h>
 #include <float.h>
 #include <inttypes.h>
+#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -9084,22 +9204,24 @@
 
 static int putescaped(upb_textprinter *p, const char *buf, size_t len,
                       bool preserve_utf8) {
-  // Based on CEscapeInternal() from Google's protobuf release.
+  /* Based on CEscapeInternal() from Google's protobuf release. */
   char dstbuf[4096], *dst = dstbuf, *dstend = dstbuf + sizeof(dstbuf);
   const char *end = buf + len;
 
-  // I think hex is prettier and more useful, but proto2 uses octal; should
-  // investigate whether it can parse hex also.
+  /* I think hex is prettier and more useful, but proto2 uses octal; should
+   * investigate whether it can parse hex also. */
   const bool use_hex = false;
-  bool last_hex_escape = false; // true if last output char was \xNN
+  bool last_hex_escape = false; /* true if last output char was \xNN */
 
   for (; buf < end; buf++) {
+    bool is_hex_escape;
+
     if (dstend - dst < 4) {
       upb_bytessink_putbuf(p->output_, p->subc, dstbuf, dst - dstbuf, NULL);
       dst = dstbuf;
     }
 
-    bool is_hex_escape = false;
+    is_hex_escape = false;
     switch (*buf) {
       case '\n': *(dst++) = '\\'; *(dst++) = 'n';  break;
       case '\r': *(dst++) = '\\'; *(dst++) = 'r';  break;
@@ -9108,9 +9230,9 @@
       case '\'': *(dst++) = '\\'; *(dst++) = '\''; break;
       case '\\': *(dst++) = '\\'; *(dst++) = '\\'; break;
       default:
-        // Note that if we emit \xNN and the buf character after that is a hex
-        // digit then that digit must be escaped too to prevent it being
-        // interpreted as part of the character code by C.
+        /* Note that if we emit \xNN and the buf character after that is a hex
+         * digit then that digit must be escaped too to prevent it being
+         * interpreted as part of the character code by C. */
         if ((!preserve_utf8 || (uint8_t)*buf < 0x80) &&
             (!isprint(*buf) || (last_hex_escape && isxdigit(*buf)))) {
           sprintf(dst, (use_hex ? "\\x%02x" : "\\%03o"), (uint8_t)*buf);
@@ -9122,29 +9244,34 @@
     }
     last_hex_escape = is_hex_escape;
   }
-  // Flush remaining data.
+  /* Flush remaining data. */
   upb_bytessink_putbuf(p->output_, p->subc, dstbuf, dst - dstbuf, NULL);
   return 0;
 }
 
 bool putf(upb_textprinter *p, const char *fmt, ...) {
   va_list args;
+  va_list args_copy;
+  char *str;
+  int written;
+  int len;
+  bool ok;
+
   va_start(args, fmt);
 
-  // Run once to get the length of the string.
-  va_list args_copy;
-  va_copy(args_copy, args);
-  int len = vsnprintf(NULL, 0, fmt, args_copy);
+  /* Run once to get the length of the string. */
+  _upb_va_copy(args_copy, args);
+  len = _upb_vsnprintf(NULL, 0, fmt, args_copy);
   va_end(args_copy);
 
-  // + 1 for NULL terminator (vsnprintf() requires it even if we don't).
-  char *str = malloc(len + 1);
+  /* + 1 for NULL terminator (vsprintf() requires it even if we don't). */
+  str = malloc(len + 1);
   if (!str) return false;
-  int written = vsnprintf(str, len + 1, fmt, args);
+  written = vsprintf(str, fmt, args);
   va_end(args);
   UPB_ASSERT_VAR(written, written == len);
 
-  bool ok = upb_bytessink_putbuf(p->output_, p->subc, str, len, NULL);
+  ok = upb_bytessink_putbuf(p->output_, p->subc, str, len, NULL);
   free(str);
   return ok;
 }
@@ -9153,8 +9280,8 @@
 /* handlers *******************************************************************/
 
 static bool textprinter_startmsg(void *c, const void *hd) {
-  UPB_UNUSED(hd);
   upb_textprinter *p = c;
+  UPB_UNUSED(hd);
   if (p->indent_depth_ == 0) {
     upb_bytessink_start(p->output_, 0, &p->subc);
   }
@@ -9162,9 +9289,9 @@
 }
 
 static bool textprinter_endmsg(void *c, const void *hd, upb_status *s) {
+  upb_textprinter *p = c;
   UPB_UNUSED(hd);
   UPB_UNUSED(s);
-  upb_textprinter *p = c;
   if (p->indent_depth_ == 0) {
     upb_bytessink_end(p->output_);
   }
@@ -9201,14 +9328,14 @@
 
 TYPE(int32,  int32_t,  "%" PRId32)
 TYPE(int64,  int64_t,  "%" PRId64)
-TYPE(uint32, uint32_t, "%" PRIu32);
+TYPE(uint32, uint32_t, "%" PRIu32)
 TYPE(uint64, uint64_t, "%" PRIu64)
 TYPE(float,  float,    "%." STRINGIFY_MACROVAL(FLT_DIG) "g")
 TYPE(double, double,   "%." STRINGIFY_MACROVAL(DBL_DIG) "g")
 
 #undef TYPE
 
-// Output a symbolic value from the enum if found, else just print as int32.
+/* Output a symbolic value from the enum if found, else just print as int32. */
 static bool textprinter_putenum(void *closure, const void *handler_data,
                                 int32_t val) {
   upb_textprinter *p = closure;
@@ -9228,17 +9355,17 @@
 
 static void *textprinter_startstr(void *closure, const void *handler_data,
                       size_t size_hint) {
+  upb_textprinter *p = closure;
   const upb_fielddef *f = handler_data;
   UPB_UNUSED(size_hint);
-  upb_textprinter *p = closure;
   indent(p);
   putf(p, "%s: \"", upb_fielddef_name(f));
   return p;
 }
 
 static bool textprinter_endstr(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_textprinter *p = closure;
+  UPB_UNUSED(handler_data);
   putf(p, "\"");
   endfield(p);
   return true;
@@ -9246,9 +9373,9 @@
 
 static size_t textprinter_putstr(void *closure, const void *hd, const char *buf,
                                  size_t len, const upb_bufhandle *handle) {
-  UPB_UNUSED(handle);
   upb_textprinter *p = closure;
   const upb_fielddef *f = hd;
+  UPB_UNUSED(handle);
   CHECK(putescaped(p, buf, len, upb_fielddef_type(f) == UPB_TYPE_STRING));
   return len;
 err:
@@ -9267,8 +9394,8 @@
 }
 
 static bool textprinter_endsubmsg(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_textprinter *p = closure;
+  UPB_UNUSED(handler_data);
   p->indent_depth_--;
   CHECK(indent(p));
   upb_bytessink_putbuf(p->output_, p->subc, "}", 1, NULL);
@@ -9279,13 +9406,13 @@
 }
 
 static void onmreg(const void *c, upb_handlers *h) {
-  UPB_UNUSED(c);
   const upb_msgdef *m = upb_handlers_msgdef(h);
+  upb_msg_field_iter i;
+  UPB_UNUSED(c);
 
   upb_handlers_setstartmsg(h, textprinter_startmsg, NULL);
   upb_handlers_setendmsg(h, textprinter_endmsg, NULL);
 
-  upb_msg_field_iter i;
   for(upb_msg_field_begin(&i, m);
       !upb_msg_field_done(&i);
       upb_msg_field_next(&i)) {
@@ -9375,32 +9502,33 @@
  */
 
 
-// Index is descriptor type.
+/* Index is descriptor type. */
 const uint8_t upb_pb_native_wire_types[] = {
-  UPB_WIRE_TYPE_END_GROUP,     // ENDGROUP
-  UPB_WIRE_TYPE_64BIT,         // DOUBLE
-  UPB_WIRE_TYPE_32BIT,         // FLOAT
-  UPB_WIRE_TYPE_VARINT,        // INT64
-  UPB_WIRE_TYPE_VARINT,        // UINT64
-  UPB_WIRE_TYPE_VARINT,        // INT32
-  UPB_WIRE_TYPE_64BIT,         // FIXED64
-  UPB_WIRE_TYPE_32BIT,         // FIXED32
-  UPB_WIRE_TYPE_VARINT,        // BOOL
-  UPB_WIRE_TYPE_DELIMITED,     // STRING
-  UPB_WIRE_TYPE_START_GROUP,   // GROUP
-  UPB_WIRE_TYPE_DELIMITED,     // MESSAGE
-  UPB_WIRE_TYPE_DELIMITED,     // BYTES
-  UPB_WIRE_TYPE_VARINT,        // UINT32
-  UPB_WIRE_TYPE_VARINT,        // ENUM
-  UPB_WIRE_TYPE_32BIT,         // SFIXED32
-  UPB_WIRE_TYPE_64BIT,         // SFIXED64
-  UPB_WIRE_TYPE_VARINT,        // SINT32
-  UPB_WIRE_TYPE_VARINT,        // SINT64
+  UPB_WIRE_TYPE_END_GROUP,     /* ENDGROUP */
+  UPB_WIRE_TYPE_64BIT,         /* DOUBLE */
+  UPB_WIRE_TYPE_32BIT,         /* FLOAT */
+  UPB_WIRE_TYPE_VARINT,        /* INT64 */
+  UPB_WIRE_TYPE_VARINT,        /* UINT64 */
+  UPB_WIRE_TYPE_VARINT,        /* INT32 */
+  UPB_WIRE_TYPE_64BIT,         /* FIXED64 */
+  UPB_WIRE_TYPE_32BIT,         /* FIXED32 */
+  UPB_WIRE_TYPE_VARINT,        /* BOOL */
+  UPB_WIRE_TYPE_DELIMITED,     /* STRING */
+  UPB_WIRE_TYPE_START_GROUP,   /* GROUP */
+  UPB_WIRE_TYPE_DELIMITED,     /* MESSAGE */
+  UPB_WIRE_TYPE_DELIMITED,     /* BYTES */
+  UPB_WIRE_TYPE_VARINT,        /* UINT32 */
+  UPB_WIRE_TYPE_VARINT,        /* ENUM */
+  UPB_WIRE_TYPE_32BIT,         /* SFIXED32 */
+  UPB_WIRE_TYPE_64BIT,         /* SFIXED64 */
+  UPB_WIRE_TYPE_VARINT,        /* SINT32 */
+  UPB_WIRE_TYPE_VARINT,        /* SINT64 */
 };
 
-// A basic branch-based decoder, uses 32-bit values to get good performance
-// on 32-bit architectures (but performs well on 64-bits also).
-// This scheme comes from the original Google Protobuf implementation (proto2).
+/* A basic branch-based decoder, uses 32-bit values to get good performance
+ * on 32-bit architectures (but performs well on 64-bits also).
+ * This scheme comes from the original Google Protobuf implementation
+ * (proto2). */
 upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r) {
   upb_decoderet err = {NULL, 0};
   const char *p = r.p;
@@ -9424,7 +9552,7 @@
   return r;
 }
 
-// Like the previous, but uses 64-bit values.
+/* Like the previous, but uses 64-bit values. */
 upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r) {
   const char *p = r.p;
   uint64_t val = r.val;
@@ -9446,50 +9574,54 @@
   return r;
 }
 
-// Given an encoded varint v, returns an integer with a single bit set that
-// indicates the end of the varint.  Subtracting one from this value will
-// yield a mask that leaves only bits that are part of the varint.  Returns
-// 0 if the varint is unterminated.
+/* Given an encoded varint v, returns an integer with a single bit set that
+ * indicates the end of the varint.  Subtracting one from this value will
+ * yield a mask that leaves only bits that are part of the varint.  Returns
+ * 0 if the varint is unterminated. */
 static uint64_t upb_get_vstopbit(uint64_t v) {
   uint64_t cbits = v | 0x7f7f7f7f7f7f7f7fULL;
   return ~cbits & (cbits+1);
 }
 
-// A branchless decoder.  Credit to Pascal Massimino for the bit-twiddling.
+/* A branchless decoder.  Credit to Pascal Massimino for the bit-twiddling. */
 upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r) {
   uint64_t b;
+  uint64_t stop_bit;
+  upb_decoderet my_r;
   memcpy(&b, r.p, sizeof(b));
-  uint64_t stop_bit = upb_get_vstopbit(b);
+  stop_bit = upb_get_vstopbit(b);
   b =  (b & 0x7f7f7f7f7f7f7f7fULL) & (stop_bit - 1);
   b +=       b & 0x007f007f007f007fULL;
   b +=  3 * (b & 0x0000ffff0000ffffULL);
   b += 15 * (b & 0x00000000ffffffffULL);
   if (stop_bit == 0) {
-    // Error: unterminated varint.
+    /* Error: unterminated varint. */
     upb_decoderet err_r = {(void*)0, 0};
     return err_r;
   }
-  upb_decoderet my_r = {r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
-                        r.val | (b << 7)};
+  my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
+                            r.val | (b << 7));
   return my_r;
 }
 
-// A branchless decoder.  Credit to Daniel Wright for the bit-twiddling.
+/* A branchless decoder.  Credit to Daniel Wright for the bit-twiddling. */
 upb_decoderet upb_vdecode_max8_wright(upb_decoderet r) {
   uint64_t b;
+  uint64_t stop_bit;
+  upb_decoderet my_r;
   memcpy(&b, r.p, sizeof(b));
-  uint64_t stop_bit = upb_get_vstopbit(b);
+  stop_bit = upb_get_vstopbit(b);
   b &= (stop_bit - 1);
   b = ((b & 0x7f007f007f007f00ULL) >> 1) | (b & 0x007f007f007f007fULL);
   b = ((b & 0xffff0000ffff0000ULL) >> 2) | (b & 0x0000ffff0000ffffULL);
   b = ((b & 0xffffffff00000000ULL) >> 4) | (b & 0x00000000ffffffffULL);
   if (stop_bit == 0) {
-    // Error: unterminated varint.
+    /* Error: unterminated varint. */
     upb_decoderet err_r = {(void*)0, 0};
     return err_r;
   }
-  upb_decoderet my_r = {r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
-                        r.val | (b << 14)};
+  my_r = upb_decoderet_make(r.p + ((__builtin_ctzll(stop_bit) + 1) / 8),
+                            r.val | (b << 14));
   return my_r;
 }
 
@@ -9531,26 +9663,26 @@
 typedef struct {
   upb_sink sink;
 
-  // The current message in which we're parsing, and the field whose value we're
-  // expecting next.
+  /* The current message in which we're parsing, and the field whose value we're
+   * expecting next. */
   const upb_msgdef *m;
   const upb_fielddef *f;
 
-  // We are in a repeated-field context, ready to emit mapentries as
-  // submessages. This flag alters the start-of-object (open-brace) behavior to
-  // begin a sequence of mapentry messages rather than a single submessage.
+  /* We are in a repeated-field context, ready to emit mapentries as
+   * submessages. This flag alters the start-of-object (open-brace) behavior to
+   * begin a sequence of mapentry messages rather than a single submessage. */
   bool is_map;
 
-  // We are in a map-entry message context. This flag is set when parsing the
-  // value field of a single map entry and indicates to all value-field parsers
-  // (subobjects, strings, numbers, and bools) that the map-entry submessage
-  // should end as soon as the value is parsed.
+  /* We are in a map-entry message context. This flag is set when parsing the
+   * value field of a single map entry and indicates to all value-field parsers
+   * (subobjects, strings, numbers, and bools) that the map-entry submessage
+   * should end as soon as the value is parsed. */
   bool is_mapentry;
 
-  // If |is_map| or |is_mapentry| is true, |mapfield| refers to the parent
-  // message's map field that we're currently parsing. This differs from |f|
-  // because |f| is the field in the *current* message (i.e., the map-entry
-  // message itself), not the parent's field that leads to this map.
+  /* If |is_map| or |is_mapentry| is true, |mapfield| refers to the parent
+   * message's map field that we're currently parsing. This differs from |f|
+   * because |f| is the field in the *current* message (i.e., the map-entry
+   * message itself), not the parent's field that leads to this map. */
   const upb_fielddef *mapfield;
 } upb_jsonparser_frame;
 
@@ -9559,41 +9691,41 @@
   upb_byteshandler input_handler_;
   upb_bytessink input_;
 
-  // Stack to track the JSON scopes we are in.
+  /* Stack to track the JSON scopes we are in. */
   upb_jsonparser_frame stack[UPB_JSON_MAX_DEPTH];
   upb_jsonparser_frame *top;
   upb_jsonparser_frame *limit;
 
   upb_status *status;
 
-  // Ragel's internal parsing stack for the parsing state machine.
+  /* Ragel's internal parsing stack for the parsing state machine. */
   int current_state;
   int parser_stack[UPB_JSON_MAX_DEPTH];
   int parser_top;
 
-  // The handle for the current buffer.
+  /* The handle for the current buffer. */
   const upb_bufhandle *handle;
 
-  // Accumulate buffer.  See details in parser.rl.
+  /* Accumulate buffer.  See details in parser.rl. */
   const char *accumulated;
   size_t accumulated_len;
   char *accumulate_buf;
   size_t accumulate_buf_size;
 
-  // Multi-part text data.  See details in parser.rl.
+  /* Multi-part text data.  See details in parser.rl. */
   int multipart_state;
   upb_selector_t string_selector;
 
-  // Input capture.  See details in parser.rl.
+  /* Input capture.  See details in parser.rl. */
   const char *capture;
 
-  // Intermediate result of parsing a unicode escape sequence.
+  /* Intermediate result of parsing a unicode escape sequence. */
   uint32_t digit;
 };
 
 #define PARSER_CHECK_RETURN(x) if (!(x)) return false
 
-// Used to signal that a capture has been suspended.
+/* Used to signal that a capture has been suspended. */
 static char suspend_capture;
 
 static upb_selector_t getsel_for_handlertype(upb_json_parser *p,
@@ -9618,8 +9750,8 @@
   return true;
 }
 
-// There are GCC/Clang built-ins for overflow checking which we could start
-// using if there was any performance benefit to it.
+/* There are GCC/Clang built-ins for overflow checking which we could start
+ * using if there was any performance benefit to it. */
 
 static bool checked_add(size_t a, size_t b, size_t *c) {
   if (SIZE_MAX - a < b) return false;
@@ -9628,7 +9760,7 @@
 }
 
 static size_t saturating_multiply(size_t a, size_t b) {
-  // size_t is unsigned, so this is defined behavior even on overflow.
+  /* size_t is unsigned, so this is defined behavior even on overflow. */
   size_t ret = a * b;
   if (b != 0 && ret / b != a) {
     ret = SIZE_MAX;
@@ -9639,7 +9771,7 @@
 
 /* Base64 decoding ************************************************************/
 
-// TODO(haberman): make this streaming.
+/* TODO(haberman): make this streaming. */
 
 static const signed char b64table[] = {
   -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1,
@@ -9676,19 +9808,22 @@
   -1,      -1,      -1,      -1,      -1,      -1,      -1,      -1
 };
 
-// Returns the table value sign-extended to 32 bits.  Knowing that the upper
-// bits will be 1 for unrecognized characters makes it easier to check for
-// this error condition later (see below).
+/* Returns the table value sign-extended to 32 bits.  Knowing that the upper
+ * bits will be 1 for unrecognized characters makes it easier to check for
+ * this error condition later (see below). */
 int32_t b64lookup(unsigned char ch) { return b64table[ch]; }
 
-// Returns true if the given character is not a valid base64 character or
-// padding.
+/* Returns true if the given character is not a valid base64 character or
+ * padding. */
 bool nonbase64(unsigned char ch) { return b64lookup(ch) == -1 && ch != '='; }
 
 static bool base64_push(upb_json_parser *p, upb_selector_t sel, const char *ptr,
                         size_t len) {
   const char *limit = ptr + len;
   for (; ptr < limit; ptr += 4) {
+    uint32_t val;
+    char output[3];
+
     if (limit - ptr < 4) {
       upb_status_seterrf(p->status,
                          "Base64 input for bytes field not a multiple of 4: %s",
@@ -9696,17 +9831,16 @@
       return false;
     }
 
-    uint32_t val = b64lookup(ptr[0]) << 18 |
-                   b64lookup(ptr[1]) << 12 |
-                   b64lookup(ptr[2]) << 6  |
-                   b64lookup(ptr[3]);
+    val = b64lookup(ptr[0]) << 18 |
+          b64lookup(ptr[1]) << 12 |
+          b64lookup(ptr[2]) << 6  |
+          b64lookup(ptr[3]);
 
-    // Test the upper bit; returns true if any of the characters returned -1.
+    /* Test the upper bit; returns true if any of the characters returned -1. */
     if (val & 0x80000000) {
       goto otherchar;
     }
 
-    char output[3];
     output[0] = val >> 16;
     output[1] = (val >> 8) & 0xff;
     output[2] = val & 0xff;
@@ -9722,29 +9856,34 @@
                        upb_fielddef_name(p->top->f));
     return false;
   } if (ptr[2] == '=') {
-    // Last group contains only two input bytes, one output byte.
+    uint32_t val;
+    char output;
+
+    /* Last group contains only two input bytes, one output byte. */
     if (ptr[0] == '=' || ptr[1] == '=' || ptr[3] != '=') {
       goto badpadding;
     }
 
-    uint32_t val = b64lookup(ptr[0]) << 18 |
-                   b64lookup(ptr[1]) << 12;
+    val = b64lookup(ptr[0]) << 18 |
+          b64lookup(ptr[1]) << 12;
 
     assert(!(val & 0x80000000));
-    char output = val >> 16;
+    output = val >> 16;
     upb_sink_putstring(&p->top->sink, sel, &output, 1, NULL);
     return true;
   } else {
-    // Last group contains only three input bytes, two output bytes.
+    uint32_t val;
+    char output[2];
+
+    /* Last group contains only three input bytes, two output bytes. */
     if (ptr[0] == '=' || ptr[1] == '=' || ptr[2] == '=') {
       goto badpadding;
     }
 
-    uint32_t val = b64lookup(ptr[0]) << 18 |
-                   b64lookup(ptr[1]) << 12 |
-                   b64lookup(ptr[2]) << 6;
+    val = b64lookup(ptr[0]) << 18 |
+          b64lookup(ptr[1]) << 12 |
+          b64lookup(ptr[2]) << 6;
 
-    char output[2];
     output[0] = val >> 16;
     output[1] = (val >> 8) & 0xff;
     upb_sink_putstring(&p->top->sink, sel, output, 2, NULL);
@@ -9762,23 +9901,23 @@
 
 /* Accumulate buffer **********************************************************/
 
-// Functionality for accumulating a buffer.
-//
-// Some parts of the parser need an entire value as a contiguous string.  For
-// example, to look up a member name in a hash table, or to turn a string into
-// a number, the relevant library routines need the input string to be in
-// contiguous memory, even if the value spanned two or more buffers in the
-// input.  These routines handle that.
-//
-// In the common case we can just point to the input buffer to get this
-// contiguous string and avoid any actual copy.  So we optimistically begin
-// this way.  But there are a few cases where we must instead copy into a
-// separate buffer:
-//
-//   1. The string was not contiguous in the input (it spanned buffers).
-//
-//   2. The string included escape sequences that need to be interpreted to get
-//      the true value in a contiguous buffer.
+/* Functionality for accumulating a buffer.
+ *
+ * Some parts of the parser need an entire value as a contiguous string.  For
+ * example, to look up a member name in a hash table, or to turn a string into
+ * a number, the relevant library routines need the input string to be in
+ * contiguous memory, even if the value spanned two or more buffers in the
+ * input.  These routines handle that.
+ *
+ * In the common case we can just point to the input buffer to get this
+ * contiguous string and avoid any actual copy.  So we optimistically begin
+ * this way.  But there are a few cases where we must instead copy into a
+ * separate buffer:
+ *
+ *   1. The string was not contiguous in the input (it spanned buffers).
+ *
+ *   2. The string included escape sequences that need to be interpreted to get
+ *      the true value in a contiguous buffer. */
 
 static void assert_accumulate_empty(upb_json_parser *p) {
   UPB_UNUSED(p);
@@ -9791,15 +9930,16 @@
   p->accumulated_len = 0;
 }
 
-// Used internally by accumulate_append().
+/* Used internally by accumulate_append(). */
 static bool accumulate_realloc(upb_json_parser *p, size_t need) {
+  void *mem;
   size_t old_size = p->accumulate_buf_size;
   size_t new_size = UPB_MAX(old_size, 128);
   while (new_size < need) {
     new_size = saturating_multiply(new_size, 2);
   }
 
-  void *mem = upb_env_realloc(p->env, p->accumulate_buf, old_size, new_size);
+  mem = upb_env_realloc(p->env, p->accumulate_buf, old_size, new_size);
   if (!mem) {
     upb_status_seterrmsg(p->status, "Out of memory allocating buffer.");
     return false;
@@ -9810,18 +9950,19 @@
   return true;
 }
 
-// Logically appends the given data to the append buffer.
-// If "can_alias" is true, we will try to avoid actually copying, but the buffer
-// must be valid until the next accumulate_append() call (if any).
+/* Logically appends the given data to the append buffer.
+ * If "can_alias" is true, we will try to avoid actually copying, but the buffer
+ * must be valid until the next accumulate_append() call (if any). */
 static bool accumulate_append(upb_json_parser *p, const char *buf, size_t len,
                               bool can_alias) {
+  size_t need;
+
   if (!p->accumulated && can_alias) {
     p->accumulated = buf;
     p->accumulated_len = len;
     return true;
   }
 
-  size_t need;
   if (!checked_add(p->accumulated_len, len, &need)) {
     upb_status_seterrmsg(p->status, "Integer overflow.");
     return false;
@@ -9841,9 +9982,9 @@
   return true;
 }
 
-// Returns a pointer to the data accumulated since the last accumulate_clear()
-// call, and writes the length to *len.  This with point either to the input
-// buffer or a temporary accumulate buffer.
+/* Returns a pointer to the data accumulated since the last accumulate_clear()
+ * call, and writes the length to *len.  This with point either to the input
+ * buffer or a temporary accumulate buffer. */
 static const char *accumulate_getptr(upb_json_parser *p, size_t *len) {
   assert(p->accumulated);
   *len = p->accumulated_len;
@@ -9853,42 +9994,42 @@
 
 /* Mult-part text data ********************************************************/
 
-// When we have text data in the input, it can often come in multiple segments.
-// For example, there may be some raw string data followed by an escape
-// sequence.  The two segments are processed with different logic.  Also buffer
-// seams in the input can cause multiple segments.
-//
-// As we see segments, there are two main cases for how we want to process them:
-//
-//  1. we want to push the captured input directly to string handlers.
-//
-//  2. we need to accumulate all the parts into a contiguous buffer for further
-//     processing (field name lookup, string->number conversion, etc).
+/* When we have text data in the input, it can often come in multiple segments.
+ * For example, there may be some raw string data followed by an escape
+ * sequence.  The two segments are processed with different logic.  Also buffer
+ * seams in the input can cause multiple segments.
+ *
+ * As we see segments, there are two main cases for how we want to process them:
+ *
+ *  1. we want to push the captured input directly to string handlers.
+ *
+ *  2. we need to accumulate all the parts into a contiguous buffer for further
+ *     processing (field name lookup, string->number conversion, etc). */
 
-// This is the set of states for p->multipart_state.
+/* This is the set of states for p->multipart_state. */
 enum {
-  // We are not currently processing multipart data.
+  /* We are not currently processing multipart data. */
   MULTIPART_INACTIVE = 0,
 
-  // We are processing multipart data by accumulating it into a contiguous
-  // buffer.
+  /* We are processing multipart data by accumulating it into a contiguous
+   * buffer. */
   MULTIPART_ACCUMULATE = 1,
 
-  // We are processing multipart data by pushing each part directly to the
-  // current string handlers.
+  /* We are processing multipart data by pushing each part directly to the
+   * current string handlers. */
   MULTIPART_PUSHEAGERLY = 2
 };
 
-// Start a multi-part text value where we accumulate the data for processing at
-// the end.
+/* Start a multi-part text value where we accumulate the data for processing at
+ * the end. */
 static void multipart_startaccum(upb_json_parser *p) {
   assert_accumulate_empty(p);
   assert(p->multipart_state == MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_ACCUMULATE;
 }
 
-// Start a multi-part text value where we immediately push text data to a string
-// value with the given selector.
+/* Start a multi-part text value where we immediately push text data to a string
+ * value with the given selector. */
 static void multipart_start(upb_json_parser *p, upb_selector_t sel) {
   assert_accumulate_empty(p);
   assert(p->multipart_state == MULTIPART_INACTIVE);
@@ -9920,8 +10061,8 @@
   return true;
 }
 
-// Note: this invalidates the accumulate buffer!  Call only after reading its
-// contents.
+/* Note: this invalidates the accumulate buffer!  Call only after reading its
+ * contents. */
 static void multipart_end(upb_json_parser *p) {
   assert(p->multipart_state != MULTIPART_INACTIVE);
   p->multipart_state = MULTIPART_INACTIVE;
@@ -9931,9 +10072,9 @@
 
 /* Input capture **************************************************************/
 
-// Functionality for capturing a region of the input as text.  Gracefully
-// handles the case where a buffer seam occurs in the middle of the captured
-// region.
+/* Functionality for capturing a region of the input as text.  Gracefully
+ * handles the case where a buffer seam occurs in the middle of the captured
+ * region. */
 
 static void capture_begin(upb_json_parser *p, const char *ptr) {
   assert(p->multipart_state != MULTIPART_INACTIVE);
@@ -9951,24 +10092,24 @@
   }
 }
 
-// This is called at the end of each input buffer (ie. when we have hit a
-// buffer seam).  If we are in the middle of capturing the input, this
-// processes the unprocessed capture region.
+/* This is called at the end of each input buffer (ie. when we have hit a
+ * buffer seam).  If we are in the middle of capturing the input, this
+ * processes the unprocessed capture region. */
 static void capture_suspend(upb_json_parser *p, const char **ptr) {
   if (!p->capture) return;
 
   if (multipart_text(p, p->capture, *ptr - p->capture, false)) {
-    // We use this as a signal that we were in the middle of capturing, and
-    // that capturing should resume at the beginning of the next buffer.
-    //
-    // We can't use *ptr here, because we have no guarantee that this pointer
-    // will be valid when we resume (if the underlying memory is freed, then
-    // using the pointer at all, even to compare to NULL, is likely undefined
-    // behavior).
+    /* We use this as a signal that we were in the middle of capturing, and
+     * that capturing should resume at the beginning of the next buffer.
+     * 
+     * We can't use *ptr here, because we have no guarantee that this pointer
+     * will be valid when we resume (if the underlying memory is freed, then
+     * using the pointer at all, even to compare to NULL, is likely undefined
+     * behavior). */
     p->capture = &suspend_capture;
   } else {
-    // Need to back up the pointer to the beginning of the capture, since
-    // we were not able to actually preserve it.
+    /* Need to back up the pointer to the beginning of the capture, since
+     * we were not able to actually preserve it. */
     *ptr = p->capture;
   }
 }
@@ -9983,8 +10124,8 @@
 
 /* Callbacks from the parser **************************************************/
 
-// These are the functions called directly from the parser itself.
-// We define these in the same order as their declarations in the parser.
+/* These are the functions called directly from the parser itself.
+ * We define these in the same order as their declarations in the parser. */
 
 static char escape_char(char in) {
   switch (in) {
@@ -10029,8 +10170,8 @@
 static bool end_hex(upb_json_parser *p) {
   uint32_t codepoint = p->digit;
 
-  // emit the codepoint as UTF-8.
-  char utf8[3]; // support \u0000 -- \uFFFF -- need only three bytes.
+  /* emit the codepoint as UTF-8. */
+  char utf8[3]; /* support \u0000 -- \uFFFF -- need only three bytes. */
   int length = 0;
   if (codepoint <= 0x7F) {
     utf8[0] = codepoint;
@@ -10048,8 +10189,8 @@
     utf8[0] = (codepoint & 0x0F) | 0xE0;
     length = 3;
   }
-  // TODO(haberman): Handle high surrogates: if codepoint is a high surrogate
-  // we have to wait for the next escape to get the full code point).
+  /* TODO(haberman): Handle high surrogates: if codepoint is a high surrogate
+   * we have to wait for the next escape to get the full code point). */
 
   return multipart_text(p, utf8, length, false);
 }
@@ -10078,17 +10219,29 @@
 }
 
 static bool parse_number(upb_json_parser *p) {
-  // strtol() and friends unfortunately do not support specifying the length of
-  // the input string, so we need to force a copy into a NULL-terminated buffer.
+  size_t len;
+  const char *buf;
+  const char *myend;
+  char *end;
+
+  /* strtol() and friends unfortunately do not support specifying the length of
+   * the input string, so we need to force a copy into a NULL-terminated buffer. */
   if (!multipart_text(p, "\0", 1, false)) {
     return false;
   }
 
-  size_t len;
-  const char *buf = accumulate_getptr(p, &len);
-  const char *myend = buf + len - 1;  // One for NULL.
+  buf = accumulate_getptr(p, &len);
+  myend = buf + len - 1;  /* One for NULL. */
 
-  char *end;
+  /* XXX: We are using strtol to parse integers, but this is wrong as even
+   * integers can be represented as 1e6 (for example), which strtol can't
+   * handle correctly.
+   *
+   * XXX: Also, we can't handle large integers properly because strto[u]ll
+   * isn't in C89.
+   *
+   * XXX: Also, we don't properly check floats for overflow, since strtof
+   * isn't in C89. */
   switch (upb_fielddef_type(p->top->f)) {
     case UPB_TYPE_ENUM:
     case UPB_TYPE_INT32: {
@@ -10100,7 +10253,7 @@
       break;
     }
     case UPB_TYPE_INT64: {
-      long long val = strtoll(p->accumulated, &end, 0);
+      long long val = strtol(p->accumulated, &end, 0);
       if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || end != myend)
         goto err;
       else
@@ -10116,7 +10269,7 @@
       break;
     }
     case UPB_TYPE_UINT64: {
-      unsigned long long val = strtoull(p->accumulated, &end, 0);
+      unsigned long long val = strtoul(p->accumulated, &end, 0);
       if (val > UINT64_MAX || errno == ERANGE || end != myend)
         goto err;
       else
@@ -10132,7 +10285,7 @@
       break;
     }
     case UPB_TYPE_FLOAT: {
-      float val = strtof(p->accumulated, &end);
+      float val = strtod(p->accumulated, &end);
       if (errno == ERANGE || end != myend)
         goto err;
       else
@@ -10154,6 +10307,8 @@
 }
 
 static bool parser_putbool(upb_json_parser *p, bool val) {
+  bool ok;
+
   if (upb_fielddef_type(p->top->f) != UPB_TYPE_BOOL) {
     upb_status_seterrf(p->status,
                        "Boolean value specified for non-bool field: %s",
@@ -10161,7 +10316,7 @@
     return false;
   }
 
-  bool ok = upb_sink_putbool(&p->top->sink, parser_getsel(p), val);
+  ok = upb_sink_putbool(&p->top->sink, parser_getsel(p), val);
   UPB_ASSERT_VAR(ok, ok);
 
   return true;
@@ -10171,12 +10326,15 @@
   assert(p->top->f);
 
   if (upb_fielddef_isstring(p->top->f)) {
+    upb_jsonparser_frame *inner;
+    upb_selector_t sel;
+
     if (!check_stack(p)) return false;
 
-    // Start a new parser frame: parser frames correspond one-to-one with
-    // handler frames, and string events occur in a sub-frame.
-    upb_jsonparser_frame *inner = p->top + 1;
-    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);
+    /* Start a new parser frame: parser frames correspond one-to-one with
+     * handler frames, and string events occur in a sub-frame. */
+    inner = p->top + 1;
+    sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);
     upb_sink_startstr(&p->top->sink, sel, 0, &inner->sink);
     inner->m = p->top->m;
     inner->f = p->top->f;
@@ -10185,11 +10343,11 @@
     p->top = inner;
 
     if (upb_fielddef_type(p->top->f) == UPB_TYPE_STRING) {
-      // For STRING fields we push data directly to the handlers as it is
-      // parsed.  We don't do this yet for BYTES fields, because our base64
-      // decoder is not streaming.
-      //
-      // TODO(haberman): make base64 decoding streaming also.
+      /* For STRING fields we push data directly to the handlers as it is
+       * parsed.  We don't do this yet for BYTES fields, because our base64
+       * decoder is not streaming.
+       *
+       * TODO(haberman): make base64 decoding streaming also. */
       multipart_start(p, getsel_for_handlertype(p, UPB_HANDLER_STRING));
       return true;
     } else {
@@ -10197,11 +10355,11 @@
       return true;
     }
   } else if (upb_fielddef_type(p->top->f) == UPB_TYPE_ENUM) {
-    // No need to push a frame -- symbolic enum names in quotes remain in the
-    // current parser frame.
-    //
-    // Enum string values must accumulate so we can look up the value in a table
-    // once it is complete.
+    /* No need to push a frame -- symbolic enum names in quotes remain in the
+     * current parser frame.
+     *
+     * Enum string values must accumulate so we can look up the value in a table
+     * once it is complete. */
     multipart_startaccum(p);
     return true;
   } else {
@@ -10221,7 +10379,7 @@
                        p->accumulated, p->accumulated_len)) {
         return false;
       }
-      // Fall through.
+      /* Fall through. */
 
     case UPB_TYPE_STRING: {
       upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSTR);
@@ -10231,7 +10389,7 @@
     }
 
     case UPB_TYPE_ENUM: {
-      // Resolve enum symbolic name to integer value.
+      /* Resolve enum symbolic name to integer value. */
       const upb_enumdef *enumdef =
           (const upb_enumdef*)upb_fielddef_subdef(p->top->f);
 
@@ -10268,18 +10426,18 @@
   multipart_startaccum(p);
 }
 
-// Helper: invoked during parse_mapentry() to emit the mapentry message's key
-// field based on the current contents of the accumulate buffer.
+/* Helper: invoked during parse_mapentry() to emit the mapentry message's key
+ * field based on the current contents of the accumulate buffer. */
 static bool parse_mapentry_key(upb_json_parser *p) {
 
   size_t len;
   const char *buf = accumulate_getptr(p, &len);
 
-  // Emit the key field. We do a bit of ad-hoc parsing here because the
-  // parser state machine has already decided that this is a string field
-  // name, and we are reinterpreting it as some arbitrary key type. In
-  // particular, integer and bool keys are quoted, so we need to parse the
-  // quoted string contents here.
+  /* Emit the key field. We do a bit of ad-hoc parsing here because the
+   * parser state machine has already decided that this is a string field
+   * name, and we are reinterpreting it as some arbitrary key type. In
+   * particular, integer and bool keys are quoted, so we need to parse the
+   * quoted string contents here. */
 
   p->top->f = upb_msgdef_itof(p->top->m, UPB_MAPENTRY_KEY);
   if (p->top->f == NULL) {
@@ -10291,7 +10449,7 @@
     case UPB_TYPE_INT64:
     case UPB_TYPE_UINT32:
     case UPB_TYPE_UINT64:
-      // Invoke end_number. The accum buffer has the number's text already.
+      /* Invoke end_number. The accum buffer has the number's text already. */
       if (!parse_number(p)) {
         return false;
       }
@@ -10332,47 +10490,52 @@
   return true;
 }
 
-// Helper: emit one map entry (as a submessage in the map field sequence). This
-// is invoked from end_membername(), at the end of the map entry's key string,
-// with the map key in the accumulate buffer. It parses the key from that
-// buffer, emits the handler calls to start the mapentry submessage (setting up
-// its subframe in the process), and sets up state in the subframe so that the
-// value parser (invoked next) will emit the mapentry's value field and then
-// end the mapentry message.
+/* Helper: emit one map entry (as a submessage in the map field sequence). This
+ * is invoked from end_membername(), at the end of the map entry's key string,
+ * with the map key in the accumulate buffer. It parses the key from that
+ * buffer, emits the handler calls to start the mapentry submessage (setting up
+ * its subframe in the process), and sets up state in the subframe so that the
+ * value parser (invoked next) will emit the mapentry's value field and then
+ * end the mapentry message. */
 
 static bool handle_mapentry(upb_json_parser *p) {
-  // Map entry: p->top->sink is the seq frame, so we need to start a frame
-  // for the mapentry itself, and then set |f| in that frame so that the map
-  // value field is parsed, and also set a flag to end the frame after the
-  // map-entry value is parsed.
+  const upb_fielddef *mapfield;
+  const upb_msgdef *mapentrymsg;
+  upb_jsonparser_frame *inner;
+  upb_selector_t sel;
+
+  /* Map entry: p->top->sink is the seq frame, so we need to start a frame
+   * for the mapentry itself, and then set |f| in that frame so that the map
+   * value field is parsed, and also set a flag to end the frame after the
+   * map-entry value is parsed. */
   if (!check_stack(p)) return false;
 
-  const upb_fielddef *mapfield = p->top->mapfield;
-  const upb_msgdef *mapentrymsg = upb_fielddef_msgsubdef(mapfield);
+  mapfield = p->top->mapfield;
+  mapentrymsg = upb_fielddef_msgsubdef(mapfield);
 
-  upb_jsonparser_frame *inner = p->top + 1;
+  inner = p->top + 1;
   p->top->f = mapfield;
-  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
+  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
   upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
   inner->m = mapentrymsg;
   inner->mapfield = mapfield;
   inner->is_map = false;
 
-  // Don't set this to true *yet* -- we reuse parsing handlers below to push
-  // the key field value to the sink, and these handlers will pop the frame
-  // if they see is_mapentry (when invoked by the parser state machine, they
-  // would have just seen the map-entry value, not key).
+  /* Don't set this to true *yet* -- we reuse parsing handlers below to push
+   * the key field value to the sink, and these handlers will pop the frame
+   * if they see is_mapentry (when invoked by the parser state machine, they
+   * would have just seen the map-entry value, not key). */
   inner->is_mapentry = false;
   p->top = inner;
 
-  // send STARTMSG in submsg frame.
+  /* send STARTMSG in submsg frame. */
   upb_sink_startmsg(&p->top->sink);
 
   parse_mapentry_key(p);
 
-  // Set up the value field to receive the map-entry value.
+  /* Set up the value field to receive the map-entry value. */
   p->top->f = upb_msgdef_itof(p->top->m, UPB_MAPENTRY_VALUE);
-  p->top->is_mapentry = true;  // set up to pop frame after value is parsed.
+  p->top->is_mapentry = true;  /* set up to pop frame after value is parsed. */
   p->top->mapfield = mapfield;
   if (p->top->f == NULL) {
     upb_status_seterrmsg(p->status, "mapentry message has no value");
@@ -10393,7 +10556,8 @@
     const upb_fielddef *f = upb_msgdef_ntof(p->top->m, buf, len);
 
     if (!f) {
-      // TODO(haberman): Ignore unknown fields if requested/configured to do so.
+      /* TODO(haberman): Ignore unknown fields if requested/configured to do
+       * so. */
       upb_status_seterrf(p->status, "No such field: %.*s\n", (int)len, buf);
       return false;
     }
@@ -10406,19 +10570,21 @@
 }
 
 static void end_member(upb_json_parser *p) {
-  // If we just parsed a map-entry value, end that frame too.
+  /* If we just parsed a map-entry value, end that frame too. */
   if (p->top->is_mapentry) {
-    assert(p->top > p->stack);
-    // send ENDMSG on submsg.
     upb_status s = UPB_STATUS_INIT;
-    upb_sink_endmsg(&p->top->sink, &s);
-    const upb_fielddef* mapfield = p->top->mapfield;
-
-    // send ENDSUBMSG in repeated-field-of-mapentries frame.
-    p->top--;
     upb_selector_t sel;
-    bool ok = upb_handlers_getselector(mapfield,
-                                       UPB_HANDLER_ENDSUBMSG, &sel);
+    bool ok;
+    const upb_fielddef *mapfield;
+
+    assert(p->top > p->stack);
+    /* send ENDMSG on submsg. */
+    upb_sink_endmsg(&p->top->sink, &s);
+    mapfield = p->top->mapfield;
+
+    /* send ENDSUBMSG in repeated-field-of-mapentries frame. */
+    p->top--;
+    ok = upb_handlers_getselector(mapfield, UPB_HANDLER_ENDSUBMSG, &sel);
     UPB_ASSERT_VAR(ok, ok);
     upb_sink_endsubmsg(&p->top->sink, sel);
   }
@@ -10430,12 +10596,15 @@
   assert(p->top->f);
 
   if (upb_fielddef_ismap(p->top->f)) {
-    // Beginning of a map. Start a new parser frame in a repeated-field
-    // context.
+    upb_jsonparser_frame *inner;
+    upb_selector_t sel;
+
+    /* Beginning of a map. Start a new parser frame in a repeated-field
+     * context. */
     if (!check_stack(p)) return false;
 
-    upb_jsonparser_frame *inner = p->top + 1;
-    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
+    inner = p->top + 1;
+    sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
     upb_sink_startseq(&p->top->sink, sel, &inner->sink);
     inner->m = upb_fielddef_msgsubdef(p->top->f);
     inner->mapfield = p->top->f;
@@ -10446,13 +10615,16 @@
 
     return true;
   } else if (upb_fielddef_issubmsg(p->top->f)) {
-    // Beginning of a subobject. Start a new parser frame in the submsg
-    // context.
+    upb_jsonparser_frame *inner;
+    upb_selector_t sel;
+
+    /* Beginning of a subobject. Start a new parser frame in the submsg
+     * context. */
     if (!check_stack(p)) return false;
 
-    upb_jsonparser_frame *inner = p->top + 1;
+    inner = p->top + 1;
 
-    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
+    sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
     upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
     inner->m = upb_fielddef_msgsubdef(p->top->f);
     inner->f = NULL;
@@ -10471,17 +10643,22 @@
 
 static void end_subobject(upb_json_parser *p) {
   if (p->top->is_map) {
+    upb_selector_t sel;
     p->top--;
-    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
+    sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
     upb_sink_endseq(&p->top->sink, sel);
   } else {
+    upb_selector_t sel;
     p->top--;
-    upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSUBMSG);
+    sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSUBMSG);
     upb_sink_endsubmsg(&p->top->sink, sel);
   }
 }
 
 static bool start_array(upb_json_parser *p) {
+  upb_jsonparser_frame *inner;
+  upb_selector_t sel;
+
   assert(p->top->f);
 
   if (!upb_fielddef_isseq(p->top->f)) {
@@ -10493,8 +10670,8 @@
 
   if (!check_stack(p)) return false;
 
-  upb_jsonparser_frame *inner = p->top + 1;
-  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
+  inner = p->top + 1;
+  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
   upb_sink_startseq(&p->top->sink, sel, &inner->sink);
   inner->m = p->top->m;
   inner->f = p->top->f;
@@ -10506,10 +10683,12 @@
 }
 
 static void end_array(upb_json_parser *p) {
+  upb_selector_t sel;
+
   assert(p->top > p->stack);
 
   p->top--;
-  upb_selector_t sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
+  sel = getsel_for_handlertype(p, UPB_HANDLER_ENDSEQ);
   upb_sink_endseq(&p->top->sink, sel);
 }
 
@@ -10532,27 +10711,27 @@
 
 /* The actual parser **********************************************************/
 
-// What follows is the Ragel parser itself.  The language is specified in Ragel
-// and the actions call our C functions above.
-//
-// Ragel has an extensive set of functionality, and we use only a small part of
-// it.  There are many action types but we only use a few:
-//
-//   ">" -- transition into a machine
-//   "%" -- transition out of a machine
-//   "@" -- transition into a final state of a machine.
-//
-// "@" transitions are tricky because a machine can transition into a final
-// state repeatedly.  But in some cases we know this can't happen, for example
-// a string which is delimited by a final '"' can only transition into its
-// final state once, when the closing '"' is seen.
+/* What follows is the Ragel parser itself.  The language is specified in Ragel
+ * and the actions call our C functions above.
+ *
+ * Ragel has an extensive set of functionality, and we use only a small part of
+ * it.  There are many action types but we only use a few:
+ *
+ *   ">" -- transition into a machine
+ *   "%" -- transition out of a machine
+ *   "@" -- transition into a final state of a machine.
+ *
+ * "@" transitions are tricky because a machine can transition into a final
+ * state repeatedly.  But in some cases we know this can't happen, for example
+ * a string which is delimited by a final '"' can only transition into its
+ * final state once, when the closing '"' is seen. */
 
 
-#line 1151 "upb/json/parser.rl"
+#line 1198 "upb/json/parser.rl"
 
 
 
-#line 1063 "upb/json/parser.c"
+#line 1110 "upb/json/parser.c"
 static const char _json_actions[] = {
 	0, 1, 0, 1, 2, 1, 3, 1, 
 	5, 1, 6, 1, 7, 1, 8, 1, 
@@ -10701,16 +10880,13 @@
 static const int json_en_main = 1;
 
 
-#line 1154 "upb/json/parser.rl"
+#line 1201 "upb/json/parser.rl"
 
 size_t parse(void *closure, const void *hd, const char *buf, size_t size,
              const upb_bufhandle *handle) {
-  UPB_UNUSED(hd);
-  UPB_UNUSED(handle);
   upb_json_parser *parser = closure;
-  parser->handle = handle;
 
-  // Variables used by Ragel's generated code.
+  /* Variables used by Ragel's generated code. */
   int cs = parser->current_state;
   int *stack = parser->parser_stack;
   int top = parser->parser_top;
@@ -10718,10 +10894,15 @@
   const char *p = buf;
   const char *pe = buf + size;
 
+  parser->handle = handle;
+
+  UPB_UNUSED(hd);
+  UPB_UNUSED(handle);
+
   capture_resume(parser, buf);
 
   
-#line 1232 "upb/json/parser.c"
+#line 1281 "upb/json/parser.c"
 	{
 	int _klen;
 	unsigned int _trans;
@@ -10796,118 +10977,118 @@
 		switch ( *_acts++ )
 		{
 	case 0:
-#line 1066 "upb/json/parser.rl"
+#line 1113 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
 	case 1:
-#line 1067 "upb/json/parser.rl"
+#line 1114 "upb/json/parser.rl"
 	{ p--; {stack[top++] = cs; cs = 10; goto _again;} }
 	break;
 	case 2:
-#line 1071 "upb/json/parser.rl"
+#line 1118 "upb/json/parser.rl"
 	{ start_text(parser, p); }
 	break;
 	case 3:
-#line 1072 "upb/json/parser.rl"
+#line 1119 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_text(parser, p)); }
 	break;
 	case 4:
-#line 1078 "upb/json/parser.rl"
+#line 1125 "upb/json/parser.rl"
 	{ start_hex(parser); }
 	break;
 	case 5:
-#line 1079 "upb/json/parser.rl"
+#line 1126 "upb/json/parser.rl"
 	{ hexdigit(parser, p); }
 	break;
 	case 6:
-#line 1080 "upb/json/parser.rl"
+#line 1127 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_hex(parser)); }
 	break;
 	case 7:
-#line 1086 "upb/json/parser.rl"
+#line 1133 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(escape(parser, p)); }
 	break;
 	case 8:
-#line 1092 "upb/json/parser.rl"
+#line 1139 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
 	case 9:
-#line 1095 "upb/json/parser.rl"
+#line 1142 "upb/json/parser.rl"
 	{ {stack[top++] = cs; cs = 19; goto _again;} }
 	break;
 	case 10:
-#line 1097 "upb/json/parser.rl"
+#line 1144 "upb/json/parser.rl"
 	{ p--; {stack[top++] = cs; cs = 27; goto _again;} }
 	break;
 	case 11:
-#line 1102 "upb/json/parser.rl"
+#line 1149 "upb/json/parser.rl"
 	{ start_member(parser); }
 	break;
 	case 12:
-#line 1103 "upb/json/parser.rl"
+#line 1150 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_membername(parser)); }
 	break;
 	case 13:
-#line 1106 "upb/json/parser.rl"
+#line 1153 "upb/json/parser.rl"
 	{ end_member(parser); }
 	break;
 	case 14:
-#line 1112 "upb/json/parser.rl"
+#line 1159 "upb/json/parser.rl"
 	{ start_object(parser); }
 	break;
 	case 15:
-#line 1115 "upb/json/parser.rl"
+#line 1162 "upb/json/parser.rl"
 	{ end_object(parser); }
 	break;
 	case 16:
-#line 1121 "upb/json/parser.rl"
+#line 1168 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_array(parser)); }
 	break;
 	case 17:
-#line 1125 "upb/json/parser.rl"
+#line 1172 "upb/json/parser.rl"
 	{ end_array(parser); }
 	break;
 	case 18:
-#line 1130 "upb/json/parser.rl"
+#line 1177 "upb/json/parser.rl"
 	{ start_number(parser, p); }
 	break;
 	case 19:
-#line 1131 "upb/json/parser.rl"
+#line 1178 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_number(parser, p)); }
 	break;
 	case 20:
-#line 1133 "upb/json/parser.rl"
+#line 1180 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_stringval(parser)); }
 	break;
 	case 21:
-#line 1134 "upb/json/parser.rl"
+#line 1181 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(end_stringval(parser)); }
 	break;
 	case 22:
-#line 1136 "upb/json/parser.rl"
+#line 1183 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(parser_putbool(parser, true)); }
 	break;
 	case 23:
-#line 1138 "upb/json/parser.rl"
+#line 1185 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(parser_putbool(parser, false)); }
 	break;
 	case 24:
-#line 1140 "upb/json/parser.rl"
+#line 1187 "upb/json/parser.rl"
 	{ /* null value */ }
 	break;
 	case 25:
-#line 1142 "upb/json/parser.rl"
+#line 1189 "upb/json/parser.rl"
 	{ CHECK_RETURN_TOP(start_subobject(parser)); }
 	break;
 	case 26:
-#line 1143 "upb/json/parser.rl"
+#line 1190 "upb/json/parser.rl"
 	{ end_subobject(parser); }
 	break;
 	case 27:
-#line 1148 "upb/json/parser.rl"
+#line 1195 "upb/json/parser.rl"
 	{ p--; {cs = stack[--top]; goto _again;} }
 	break;
-#line 1418 "upb/json/parser.c"
+#line 1467 "upb/json/parser.c"
 		}
 	}
 
@@ -10920,7 +11101,7 @@
 	_out: {}
 	}
 
-#line 1173 "upb/json/parser.rl"
+#line 1222 "upb/json/parser.rl"
 
   if (p != pe) {
     upb_status_seterrf(parser->status, "Parse error at %s\n", p);
@@ -10929,7 +11110,7 @@
   }
 
 error:
-  // Save parsing state back to parser.
+  /* Save parsing state back to parser. */
   parser->current_state = cs;
   parser->parser_top = top;
 
@@ -10940,7 +11121,7 @@
   UPB_UNUSED(closure);
   UPB_UNUSED(hd);
 
-  // Prevent compile warning on unused static constants.
+  /* Prevent compile warning on unused static constants. */
   UPB_UNUSED(json_start);
   UPB_UNUSED(json_en_number_machine);
   UPB_UNUSED(json_en_string_machine);
@@ -10950,22 +11131,23 @@
 }
 
 static void json_parser_reset(upb_json_parser *p) {
+  int cs;
+  int top;
+
   p->top = p->stack;
   p->top->f = NULL;
   p->top->is_map = false;
   p->top->is_mapentry = false;
 
-  int cs;
-  int top;
-  // Emit Ragel initialization of the parser.
+  /* Emit Ragel initialization of the parser. */
   
-#line 1470 "upb/json/parser.c"
+#line 1520 "upb/json/parser.c"
 	{
 	cs = json_start;
 	top = 0;
 	}
 
-#line 1211 "upb/json/parser.rl"
+#line 1261 "upb/json/parser.rl"
   p->current_state = cs;
   p->parser_top = top;
   accumulate_clear(p);
@@ -10997,8 +11179,8 @@
   upb_sink_reset(&p->top->sink, output->handlers, output->closure);
   p->top->m = upb_handlers_msgdef(output->handlers);
 
-  // If this fails, uncomment and increase the value in parser.h.
-  // fprintf(stderr, "%zd\n", upb_env_bytesallocated(env) - size_before);
+  /* If this fails, uncomment and increase the value in parser.h.
+   * fprintf(stderr, "%zd\n", upb_env_bytesallocated(env) - size_before); */
   assert(upb_env_bytesallocated(env) - size_before <= UPB_JSON_PARSER_SIZE);
   return p;
 }
@@ -11024,26 +11206,26 @@
 
 struct upb_json_printer {
   upb_sink input_;
-  // BytesSink closure.
+  /* BytesSink closure. */
   void *subc_;
   upb_bytessink *output_;
 
-  // We track the depth so that we know when to emit startstr/endstr on the
-  // output.
+  /* We track the depth so that we know when to emit startstr/endstr on the
+   * output. */
   int depth_;
 
-  // Have we emitted the first element? This state is necessary to emit commas
-  // without leaving a trailing comma in arrays/maps. We keep this state per
-  // frame depth.
-  //
-  // Why max_depth * 2? UPB_MAX_HANDLER_DEPTH counts depth as nested messages.
-  // We count frames (contexts in which we separate elements by commas) as both
-  // repeated fields and messages (maps), and the worst case is a
-  // message->repeated field->submessage->repeated field->... nesting.
+  /* Have we emitted the first element? This state is necessary to emit commas
+   * without leaving a trailing comma in arrays/maps. We keep this state per
+   * frame depth.
+   *
+   * Why max_depth * 2? UPB_MAX_HANDLER_DEPTH counts depth as nested messages.
+   * We count frames (contexts in which we separate elements by commas) as both
+   * repeated fields and messages (maps), and the worst case is a
+   * message->repeated field->submessage->repeated field->... nesting. */
   bool first_elem_[UPB_MAX_HANDLER_DEPTH * 2];
 };
 
-// StringPiece; a pointer plus a length.
+/* StringPiece; a pointer plus a length. */
 typedef struct {
   const char *ptr;
   size_t len;
@@ -11057,11 +11239,11 @@
   return ret;
 }
 
-// ------------ JSON string printing: values, maps, arrays --------------------
+/* ------------ JSON string printing: values, maps, arrays ------------------ */
 
 static void print_data(
     upb_json_printer *p, const char *buf, unsigned int len) {
-  // TODO: Will need to change if we support pushback from the sink.
+  /* TODO: Will need to change if we support pushback from the sink. */
   size_t n = upb_bytessink_putbuf(p->output_, p->subc_, buf, len, NULL);
   UPB_ASSERT_VAR(n, n == len);
 }
@@ -11073,18 +11255,18 @@
   p->first_elem_[p->depth_] = false;
 }
 
-// Helpers that print properly formatted elements to the JSON output stream.
+/* Helpers that print properly formatted elements to the JSON output stream. */
 
-// Used for escaping control chars in strings.
+/* Used for escaping control chars in strings. */
 static const char kControlCharLimit = 0x20;
 
-static inline bool is_json_escaped(char c) {
-  // See RFC 4627.
+UPB_INLINE bool is_json_escaped(char c) {
+  /* See RFC 4627. */
   unsigned char uc = (unsigned char)c;
   return uc < kControlCharLimit || uc == '"' || uc == '\\';
 }
 
-static inline char* json_nice_escape(char c) {
+UPB_INLINE char* json_nice_escape(char c) {
   switch (c) {
     case '"':  return "\\\"";
     case '\\': return "\\\\";
@@ -11097,46 +11279,47 @@
   }
 }
 
-// Write a properly escaped string chunk. The surrounding quotes are *not*
-// printed; this is so that the caller has the option of emitting the string
-// content in chunks.
+/* Write a properly escaped string chunk. The surrounding quotes are *not*
+ * printed; this is so that the caller has the option of emitting the string
+ * content in chunks. */
 static void putstring(upb_json_printer *p, const char *buf, unsigned int len) {
   const char* unescaped_run = NULL;
-  for (unsigned int i = 0; i < len; i++) {
+  unsigned int i;
+  for (i = 0; i < len; i++) {
     char c = buf[i];
-    // Handle escaping.
+    /* Handle escaping. */
     if (is_json_escaped(c)) {
-      // Use a "nice" escape, like \n, if one exists for this character.
+      /* Use a "nice" escape, like \n, if one exists for this character. */
       const char* escape = json_nice_escape(c);
-      // If we don't have a specific 'nice' escape code, use a \uXXXX-style
-      // escape.
+      /* If we don't have a specific 'nice' escape code, use a \uXXXX-style
+       * escape. */
       char escape_buf[8];
       if (!escape) {
         unsigned char byte = (unsigned char)c;
-        snprintf(escape_buf, sizeof(escape_buf), "\\u%04x", (int)byte);
+        _upb_snprintf(escape_buf, sizeof(escape_buf), "\\u%04x", (int)byte);
         escape = escape_buf;
       }
 
-      // N.B. that we assume that the input encoding is equal to the output
-      // encoding (both UTF-8 for  now), so for chars >= 0x20 and != \, ", we
-      // can simply pass the bytes through.
+      /* N.B. that we assume that the input encoding is equal to the output
+       * encoding (both UTF-8 for  now), so for chars >= 0x20 and != \, ", we
+       * can simply pass the bytes through. */
 
-      // If there's a current run of unescaped chars, print that run first.
+      /* If there's a current run of unescaped chars, print that run first. */
       if (unescaped_run) {
         print_data(p, unescaped_run, &buf[i] - unescaped_run);
         unescaped_run = NULL;
       }
-      // Then print the escape code.
+      /* Then print the escape code. */
       print_data(p, escape, strlen(escape));
     } else {
-      // Add to the current unescaped run of characters.
+      /* Add to the current unescaped run of characters. */
       if (unescaped_run == NULL) {
         unescaped_run = &buf[i];
       }
     }
   }
 
-  // If the string ended in a run of unescaped characters, print that last run.
+  /* If the string ended in a run of unescaped characters, print that last run. */
   if (unescaped_run) {
     print_data(p, unescaped_run, &buf[len] - unescaped_run);
   }
@@ -11144,42 +11327,42 @@
 
 #define CHKLENGTH(x) if (!(x)) return -1;
 
-// Helpers that format floating point values according to our custom formats.
-// Right now we use %.8g and %.17g for float/double, respectively, to match
-// proto2::util::JsonFormat's defaults.  May want to change this later.
+/* Helpers that format floating point values according to our custom formats.
+ * Right now we use %.8g and %.17g for float/double, respectively, to match
+ * proto2::util::JsonFormat's defaults.  May want to change this later. */
 
 static size_t fmt_double(double val, char* buf, size_t length) {
-  size_t n = snprintf(buf, length, "%.17g", val);
+  size_t n = _upb_snprintf(buf, length, "%.17g", val);
   CHKLENGTH(n > 0 && n < length);
   return n;
 }
 
 static size_t fmt_float(float val, char* buf, size_t length) {
-  size_t n = snprintf(buf, length, "%.8g", val);
+  size_t n = _upb_snprintf(buf, length, "%.8g", val);
   CHKLENGTH(n > 0 && n < length);
   return n;
 }
 
 static size_t fmt_bool(bool val, char* buf, size_t length) {
-  size_t n = snprintf(buf, length, "%s", (val ? "true" : "false"));
+  size_t n = _upb_snprintf(buf, length, "%s", (val ? "true" : "false"));
   CHKLENGTH(n > 0 && n < length);
   return n;
 }
 
 static size_t fmt_int64(long val, char* buf, size_t length) {
-  size_t n = snprintf(buf, length, "%ld", val);
+  size_t n = _upb_snprintf(buf, length, "%ld", val);
   CHKLENGTH(n > 0 && n < length);
   return n;
 }
 
 static size_t fmt_uint64(unsigned long long val, char* buf, size_t length) {
-  size_t n = snprintf(buf, length, "%llu", val);
+  size_t n = _upb_snprintf(buf, length, "%llu", val);
   CHKLENGTH(n > 0 && n < length);
   return n;
 }
 
-// Print a map key given a field name. Called by scalar field handlers and by
-// startseq for repeated fields.
+/* Print a map key given a field name. Called by scalar field handlers and by
+ * startseq for repeated fields. */
 static bool putkey(void *closure, const void *handler_data) {
   upb_json_printer *p = closure;
   const strpc *key = handler_data;
@@ -11196,9 +11379,9 @@
 #define TYPE_HANDLERS(type, fmt_func)                                        \
   static bool put##type(void *closure, const void *handler_data, type val) { \
     upb_json_printer *p = closure;                                           \
-    UPB_UNUSED(handler_data);                                                \
     char data[64];                                                           \
     size_t length = fmt_func(val, data, sizeof(data));                       \
+    UPB_UNUSED(handler_data);                                                \
     CHKFMT(length);                                                          \
     print_data(p, data, length);                                             \
     return true;                                                             \
@@ -11227,20 +11410,20 @@
     return true;                                                             \
   }
 
-TYPE_HANDLERS(double,   fmt_double);
-TYPE_HANDLERS(float,    fmt_float);
-TYPE_HANDLERS(bool,     fmt_bool);
-TYPE_HANDLERS(int32_t,  fmt_int64);
-TYPE_HANDLERS(uint32_t, fmt_int64);
-TYPE_HANDLERS(int64_t,  fmt_int64);
-TYPE_HANDLERS(uint64_t, fmt_uint64);
+TYPE_HANDLERS(double,   fmt_double)
+TYPE_HANDLERS(float,    fmt_float)
+TYPE_HANDLERS(bool,     fmt_bool)
+TYPE_HANDLERS(int32_t,  fmt_int64)
+TYPE_HANDLERS(uint32_t, fmt_int64)
+TYPE_HANDLERS(int64_t,  fmt_int64)
+TYPE_HANDLERS(uint64_t, fmt_uint64)
 
-// double and float are not allowed to be map keys.
-TYPE_HANDLERS_MAPKEY(bool,     fmt_bool);
-TYPE_HANDLERS_MAPKEY(int32_t,  fmt_int64);
-TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64);
-TYPE_HANDLERS_MAPKEY(int64_t,  fmt_int64);
-TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64);
+/* double and float are not allowed to be map keys. */
+TYPE_HANDLERS_MAPKEY(bool,     fmt_bool)
+TYPE_HANDLERS_MAPKEY(int32_t,  fmt_int64)
+TYPE_HANDLERS_MAPKEY(uint32_t, fmt_int64)
+TYPE_HANDLERS_MAPKEY(int64_t,  fmt_int64)
+TYPE_HANDLERS_MAPKEY(uint64_t, fmt_uint64)
 
 #undef TYPE_HANDLERS
 #undef TYPE_HANDLERS_MAPKEY
@@ -11254,9 +11437,11 @@
                         int32_t val) {
   const EnumHandlerData *hd = handler_data;
   upb_json_printer *p = closure;
+  const char *symbolic_name;
+
   CHK(putkey(closure, hd->keyname));
 
-  const char *symbolic_name = upb_enumdef_iton(hd->enumdef, val);
+  symbolic_name = upb_enumdef_iton(hd->enumdef, val);
   if (symbolic_name) {
     print_data(p, "\"", 1);
     putstring(p, symbolic_name, strlen(symbolic_name));
@@ -11307,8 +11492,8 @@
 }
 
 static void *repeated_startsubmsg(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_comma(p);
   return closure;
 }
@@ -11325,8 +11510,8 @@
 }
 
 static bool printer_startmsg(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   if (p->depth_ == 0) {
     upb_bytessink_start(p->output_, 0, &p->subc_);
   }
@@ -11335,9 +11520,9 @@
 }
 
 static bool printer_endmsg(void *closure, const void *handler_data, upb_status *s) {
+  upb_json_printer *p = closure;
   UPB_UNUSED(handler_data);
   UPB_UNUSED(s);
-  upb_json_printer *p = closure;
   end_frame(p);
   if (p->depth_ == 0) {
     upb_bytessink_end(p->output_);
@@ -11355,8 +11540,8 @@
 }
 
 static bool endseq(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_data(p, "]", 1);
   p->depth_--;
   return true;
@@ -11372,8 +11557,8 @@
 }
 
 static bool endmap(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_data(p, "}", 1);
   p->depth_--;
   return true;
@@ -11381,32 +11566,35 @@
 
 static size_t putstr(void *closure, const void *handler_data, const char *str,
                      size_t len, const upb_bufhandle *handle) {
+  upb_json_printer *p = closure;
   UPB_UNUSED(handler_data);
   UPB_UNUSED(handle);
-  upb_json_printer *p = closure;
   putstring(p, str, len);
   return len;
 }
 
-// This has to Base64 encode the bytes, because JSON has no "bytes" type.
+/* This has to Base64 encode the bytes, because JSON has no "bytes" type. */
 static size_t putbytes(void *closure, const void *handler_data, const char *str,
                        size_t len, const upb_bufhandle *handle) {
-  UPB_UNUSED(handler_data);
-  UPB_UNUSED(handle);
   upb_json_printer *p = closure;
 
-  // This is the regular base64, not the "web-safe" version.
+  /* This is the regular base64, not the "web-safe" version. */
   static const char base64[] =
       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-  // Base64-encode.
+  /* Base64-encode. */
   char data[16000];
   const char *limit = data + sizeof(data);
   const unsigned char *from = (const unsigned char*)str;
   char *to = data;
   size_t remaining = len;
+  size_t bytes;
+
+  UPB_UNUSED(handler_data);
+  UPB_UNUSED(handle);
+
   while (remaining > 2) {
-    // TODO(haberman): handle encoded lengths > sizeof(data)
+    /* TODO(haberman): handle encoded lengths > sizeof(data) */
     UPB_ASSERT_VAR(limit, (limit - to) >= 4);
 
     to[0] = base64[from[0] >> 2];
@@ -11438,7 +11626,7 @@
       break;
   }
 
-  size_t bytes = to - data;
+  bytes = to - data;
   print_data(p, "\"", 1);
   putstring(p, data, bytes);
   print_data(p, "\"", 1);
@@ -11447,9 +11635,9 @@
 
 static void *scalar_startstr(void *closure, const void *handler_data,
                              size_t size_hint) {
+  upb_json_printer *p = closure;
   UPB_UNUSED(handler_data);
   UPB_UNUSED(size_hint);
-  upb_json_printer *p = closure;
   CHK(putkey(closure, handler_data));
   print_data(p, "\"", 1);
   return p;
@@ -11463,17 +11651,17 @@
 }
 
 static bool scalar_endstr(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_data(p, "\"", 1);
   return true;
 }
 
 static void *repeated_startstr(void *closure, const void *handler_data,
                                size_t size_hint) {
+  upb_json_printer *p = closure;
   UPB_UNUSED(handler_data);
   UPB_UNUSED(size_hint);
-  upb_json_printer *p = closure;
   print_comma(p);
   print_data(p, "\"", 1);
   return p;
@@ -11487,17 +11675,17 @@
 }
 
 static bool repeated_endstr(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_data(p, "\"", 1);
   return true;
 }
 
 static void *mapkeyval_startstr(void *closure, const void *handler_data,
                                 size_t size_hint) {
+  upb_json_printer *p = closure;
   UPB_UNUSED(handler_data);
   UPB_UNUSED(size_hint);
-  upb_json_printer *p = closure;
   print_data(p, "\"", 1);
   return p;
 }
@@ -11510,15 +11698,15 @@
 }
 
 static bool mapkey_endstr(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_data(p, "\":", 2);
   return true;
 }
 
 static bool mapvalue_endstr(void *closure, const void *handler_data) {
-  UPB_UNUSED(handler_data);
   upb_json_printer *p = closure;
+  UPB_UNUSED(handler_data);
   print_data(p, "\"", 1);
   return true;
 }
@@ -11559,30 +11747,31 @@
   upb_handlerattr_sethandlerdata(attr, hd);
 }
 
-// Set up handlers for a mapentry submessage (i.e., an individual key/value pair
-// in a map).
-//
-// TODO: Handle missing key, missing value, out-of-order key/value, or repeated
-// key or value cases properly. The right way to do this is to allocate a
-// temporary structure at the start of a mapentry submessage, store key and
-// value data in it as key and value handlers are called, and then print the
-// key/value pair once at the end of the submessage. If we don't do this, we
-// should at least detect the case and throw an error. However, so far all of
-// our sources that emit mapentry messages do so canonically (with one key
-// field, and then one value field), so this is not a pressing concern at the
-// moment.
+/* Set up handlers for a mapentry submessage (i.e., an individual key/value pair
+ * in a map).
+ *
+ * TODO: Handle missing key, missing value, out-of-order key/value, or repeated
+ * key or value cases properly. The right way to do this is to allocate a
+ * temporary structure at the start of a mapentry submessage, store key and
+ * value data in it as key and value handlers are called, and then print the
+ * key/value pair once at the end of the submessage. If we don't do this, we
+ * should at least detect the case and throw an error. However, so far all of
+ * our sources that emit mapentry messages do so canonically (with one key
+ * field, and then one value field), so this is not a pressing concern at the
+ * moment. */
 void printer_sethandlers_mapentry(const void *closure, upb_handlers *h) {
-  UPB_UNUSED(closure);
   const upb_msgdef *md = upb_handlers_msgdef(h);
 
-  // A mapentry message is printed simply as '"key": value'. Rather than
-  // special-case key and value for every type below, we just handle both
-  // fields explicitly here.
+  /* A mapentry message is printed simply as '"key": value'. Rather than
+   * special-case key and value for every type below, we just handle both
+   * fields explicitly here. */
   const upb_fielddef* key_field = upb_msgdef_itof(md, UPB_MAPENTRY_KEY);
   const upb_fielddef* value_field = upb_msgdef_itof(md, UPB_MAPENTRY_VALUE);
 
   upb_handlerattr empty_attr = UPB_HANDLERATTR_INITIALIZER;
 
+  UPB_UNUSED(closure);
+
   switch (upb_fielddef_type(key_field)) {
     case UPB_TYPE_INT32:
       upb_handlers_setint32(h, key_field, putmapkey_int32_t, &empty_attr);
@@ -11650,8 +11839,8 @@
       break;
     }
     case UPB_TYPE_MESSAGE:
-      // No handler necessary -- the submsg handlers will print the message
-      // as appropriate.
+      /* No handler necessary -- the submsg handlers will print the message
+       * as appropriate. */
       break;
   }
 
@@ -11659,14 +11848,16 @@
 }
 
 void printer_sethandlers(const void *closure, upb_handlers *h) {
-  UPB_UNUSED(closure);
   const upb_msgdef *md = upb_handlers_msgdef(h);
   bool is_mapentry = upb_msgdef_mapentry(md);
   upb_handlerattr empty_attr = UPB_HANDLERATTR_INITIALIZER;
+  upb_msg_field_iter i;
+
+  UPB_UNUSED(closure);
 
   if (is_mapentry) {
-    // mapentry messages are sufficiently different that we handle them
-    // separately.
+    /* mapentry messages are sufficiently different that we handle them
+     * separately. */
     printer_sethandlers_mapentry(closure, h);
     return;
   }
@@ -11683,7 +11874,6 @@
     }                                                                         \
     break;
 
-  upb_msg_field_iter i;
   upb_msg_field_begin(&i, md);
   for(; !upb_msg_field_done(&i); upb_msg_field_next(&i)) {
     const upb_fielddef *f = upb_msg_iter_field(&i);
@@ -11708,9 +11898,9 @@
       TYPE(UPB_TYPE_INT64,  int64,  int64_t);
       TYPE(UPB_TYPE_UINT64, uint64, uint64_t);
       case UPB_TYPE_ENUM: {
-        // For now, we always emit symbolic names for enums. We may want an
-        // option later to control this behavior, but we will wait for a real
-        // need first.
+        /* For now, we always emit symbolic names for enums. We may want an
+         * option later to control this behavior, but we will wait for a real
+         * need first. */
         upb_handlerattr enum_attr = UPB_HANDLERATTR_INITIALIZER;
         set_enum_hd(h, f, &enum_attr);
 
@@ -11735,8 +11925,8 @@
         }
         break;
       case UPB_TYPE_BYTES:
-        // XXX: this doesn't support strings that span buffers yet. The base64
-        // encoder will need to be made resumable for this to work properly.
+        /* XXX: this doesn't support strings that span buffers yet. The base64
+         * encoder will need to be made resumable for this to work properly. */
         if (upb_fielddef_isseq(f)) {
           upb_handlers_setstring(h, f, repeated_bytes, &empty_attr);
         } else {
@@ -11779,7 +11969,7 @@
   json_printer_reset(p);
   upb_sink_reset(&p->input_, h, p);
 
-  // If this fails, increase the value in printer.h.
+  /* If this fails, increase the value in printer.h. */
   assert(upb_env_bytesallocated(e) - size_before <= UPB_JSON_PRINTER_SIZE);
   return p;
 }
diff --git a/ruby/ext/google/protobuf_c/upb.h b/ruby/ext/google/protobuf_c/upb.h
index 97df943..4855e75 100644
--- a/ruby/ext/google/protobuf_c/upb.h
+++ b/ruby/ext/google/protobuf_c/upb.h
@@ -92,31 +92,61 @@
 #include <stdbool.h>
 #include <stddef.h>
 
-// inline if possible, emit standalone code if required.
+/* UPB_INLINE: inline if possible, emit standalone code if required. */
 #ifdef __cplusplus
 #define UPB_INLINE inline
+#elif defined (__GNUC__)
+#define UPB_INLINE static __inline__
 #else
-#define UPB_INLINE static inline
+#define UPB_INLINE static
 #endif
 
-// For use in C/C++ source files (not headers), forces inlining within the file.
+/* Define UPB_BIG_ENDIAN manually if you're on big endian and your compiler
+ * doesn't provide these preprocessor symbols. */
+#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define UPB_BIG_ENDIAN
+#endif
+
+/* Macros for function attributes on compilers that support them. */
 #ifdef __GNUC__
-#define UPB_FORCEINLINE inline __attribute__((always_inline))
+#define UPB_FORCEINLINE __inline__ __attribute__((always_inline))
 #define UPB_NOINLINE __attribute__((noinline))
-#else
+#define UPB_NORETURN __attribute__((__noreturn__))
+#else  /* !defined(__GNUC__) */
 #define UPB_FORCEINLINE
 #define UPB_NOINLINE
+#define UPB_NORETURN
 #endif
 
-#if __STDC_VERSION__ >= 199901L
-#define UPB_C99
+/* A few hacky workarounds for functions not in C89.
+ * For internal use only!
+ * TODO(haberman): fix these by including our own implementations, or finding
+ * another workaround.
+ */
+#ifdef __GNUC__
+#define _upb_snprintf __builtin_snprintf
+#define _upb_vsnprintf __builtin_vsnprintf
+#define _upb_va_copy(a, b) __va_copy(a, b)
+#elif __STDC_VERSION__ >= 199901L
+/* C99 versions. */
+#define _upb_snprintf snprintf
+#define _upb_vsnprintf vsnprintf
+#define _upb_va_copy(a, b) va_copy(a, b)
+#else
+#error Need implementations of [v]snprintf and va_copy
 #endif
 
+
 #if ((defined(__cplusplus) && __cplusplus >= 201103L) || \
       defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(UPB_NO_CXX11)
 #define UPB_CXX11
 #endif
 
+/* UPB_DISALLOW_COPY_AND_ASSIGN()
+ * UPB_DISALLOW_POD_OPS()
+ *
+ * Declare these in the "private" section of a C++ class to forbid copy/assign
+ * or all POD ops (construct, destruct, copy, assign) on that class. */
 #ifdef UPB_CXX11
 #include <type_traits>
 #define UPB_DISALLOW_COPY_AND_ASSIGN(class_name) \
@@ -125,51 +155,53 @@
 #define UPB_DISALLOW_POD_OPS(class_name, full_class_name) \
   class_name() = delete; \
   ~class_name() = delete; \
-  /* Friend Pointer<T> so it can access base class. */ \
-  friend class Pointer<full_class_name>; \
-  friend class Pointer<const full_class_name>; \
   UPB_DISALLOW_COPY_AND_ASSIGN(class_name)
 #define UPB_ASSERT_STDLAYOUT(type) \
   static_assert(std::is_standard_layout<type>::value, \
                 #type " must be standard layout");
-#else  // !defined(UPB_CXX11)
+#else  /* !defined(UPB_CXX11) */
 #define UPB_DISALLOW_COPY_AND_ASSIGN(class_name) \
   class_name(const class_name&); \
   void operator=(const class_name&);
 #define UPB_DISALLOW_POD_OPS(class_name, full_class_name) \
   class_name(); \
   ~class_name(); \
-  /* Friend Pointer<T> so it can access base class. */ \
-  friend class Pointer<full_class_name>; \
-  friend class Pointer<const full_class_name>; \
   UPB_DISALLOW_COPY_AND_ASSIGN(class_name)
 #define UPB_ASSERT_STDLAYOUT(type)
 #endif
 
+/* UPB_DECLARE_TYPE()
+ * UPB_DECLARE_DERIVED_TYPE()
+ * UPB_DECLARE_DERIVED_TYPE2()
+ *
+ * Macros for declaring C and C++ types both, including inheritance.
+ * The inheritance doesn't use real C++ inheritance, to stay compatible with C.
+ *
+ * These macros also provide upcasts:
+ *  - in C: types-specific functions (ie. upb_foo_upcast(foo))
+ *  - in C++: upb::upcast(foo) along with implicit conversions
+ *
+ * Downcasts are not provided, but upb/def.h defines downcasts for upb::Def. */
+
+#define UPB_C_UPCASTS(ty, base)                                      \
+  UPB_INLINE base *ty ## _upcast_mutable(ty *p) { return (base*)p; } \
+  UPB_INLINE const base *ty ## _upcast(const ty *p) { return (const base*)p; }
+
+#define UPB_C_UPCASTS2(ty, base, base2)                                 \
+  UPB_C_UPCASTS(ty, base)                                               \
+  UPB_INLINE base2 *ty ## _upcast2_mutable(ty *p) { return (base2*)p; } \
+  UPB_INLINE const base2 *ty ## _upcast2(const ty *p) { return (const base2*)p; }
 
 #ifdef __cplusplus
 
-#define UPB_PRIVATE_FOR_CPP private:
-#define UPB_DECLARE_TYPE(cppname, cname) typedef cppname cname;
 #define UPB_BEGIN_EXTERN_C extern "C" {
 #define UPB_END_EXTERN_C }
-#define UPB_DEFINE_STRUCT0(cname, members) members;
-#define UPB_DEFINE_STRUCT(cname, cbase, members) \
- public:                                         \
-  cbase* base() { return &base_; }               \
-  const cbase* base() const { return &base_; }   \
-                                                 \
- private:                                        \
-  cbase base_;                                   \
-  members;
-#define UPB_DEFINE_CLASS0(cppname, cppmethods, members) \
-  class cppname {                                      \
-    cppmethods                                         \
-    members                                            \
-  };                                                   \
-  UPB_ASSERT_STDLAYOUT(cppname);
-#define UPB_DEFINE_CLASS1(cppname, cppbase, cppmethods, members)   \
-  UPB_DEFINE_CLASS0(cppname, cppmethods, members)                  \
+#define UPB_PRIVATE_FOR_CPP private:
+#define UPB_DECLARE_TYPE(cppname, cname) typedef cppname cname;
+
+#define UPB_DECLARE_DERIVED_TYPE(cppname, cppbase, cname, cbase)  \
+  UPB_DECLARE_TYPE(cppname, cname)                                \
+  UPB_C_UPCASTS(cname, cbase)                                     \
   namespace upb {                                                 \
   template <>                                                     \
   class Pointer<cppname> : public PointerBase<cppname, cppbase> { \
@@ -183,8 +215,11 @@
     explicit Pointer(const cppname* ptr) : PointerBase(ptr) {}    \
   };                                                              \
   }
-#define UPB_DEFINE_CLASS2(cppname, cppbase, cppbase2, cppmethods, members)    \
-  UPB_DEFINE_CLASS0(cppname, UPB_QUOTE(cppmethods), members)                  \
+
+#define UPB_DECLARE_DERIVED_TYPE2(cppname, cppbase, cppbase2, cname, cbase,  \
+                                  cbase2)                                    \
+  UPB_DECLARE_TYPE(cppname, cname)                                           \
+  UPB_C_UPCASTS2(cname, cbase, cbase2)                                       \
   namespace upb {                                                            \
   template <>                                                                \
   class Pointer<cppname> : public PointerBase2<cppname, cppbase, cppbase2> { \
@@ -199,96 +234,97 @@
   };                                                                         \
   }
 
-#else  // !defined(__cplusplus)
+#else  /* !defined(__cplusplus) */
 
+#define UPB_BEGIN_EXTERN_C
+#define UPB_END_EXTERN_C
 #define UPB_PRIVATE_FOR_CPP
 #define UPB_DECLARE_TYPE(cppname, cname) \
   struct cname;                          \
   typedef struct cname cname;
-#define UPB_BEGIN_EXTERN_C
-#define UPB_END_EXTERN_C
-#define UPB_DEFINE_STRUCT0(cname, members) \
-  struct cname {                           \
-    members;                               \
-  };
-#define UPB_DEFINE_STRUCT(cname, cbase, members) \
-  struct cname {                                 \
-    cbase base;                                  \
-    members;                                     \
-  };
-#define UPB_DEFINE_CLASS0(cppname, cppmethods, members) members
-#define UPB_DEFINE_CLASS1(cppname, cppbase, cppmethods, members) members
-#define UPB_DEFINE_CLASS2(cppname, cppbase, cppbase2, cppmethods, members) \
-  members
+#define UPB_DECLARE_DERIVED_TYPE(cppname, cppbase, cname, cbase) \
+  UPB_DECLARE_TYPE(cppname, cname)                               \
+  UPB_C_UPCASTS(cname, cbase)
+#define UPB_DECLARE_DERIVED_TYPE2(cppname, cppbase, cppbase2,    \
+                                  cname, cbase, cbase2)          \
+  UPB_DECLARE_TYPE(cppname, cname)                               \
+  UPB_C_UPCASTS2(cname, cbase, cbase2)
 
-#endif  // defined(__cplusplus)
-
-#ifdef __GNUC__
-#define UPB_NORETURN __attribute__((__noreturn__))
-#else
-#define UPB_NORETURN
-#endif
+#endif  /* defined(__cplusplus) */
 
 #define UPB_MAX(x, y) ((x) > (y) ? (x) : (y))
 #define UPB_MIN(x, y) ((x) < (y) ? (x) : (y))
 
 #define UPB_UNUSED(var) (void)var
 
-// Code with commas confuses the preprocessor when passed as arguments, whether
-// C++ type names with commas (eg. Foo<int, int>) or code blocks that declare
-// variables (ie. int foo, bar).
-#define UPB_QUOTE(...) __VA_ARGS__
-
-// For asserting something about a variable when the variable is not used for
-// anything else.  This prevents "unused variable" warnings when compiling in
-// debug mode.
+/* For asserting something about a variable when the variable is not used for
+ * anything else.  This prevents "unused variable" warnings when compiling in
+ * debug mode. */
 #define UPB_ASSERT_VAR(var, predicate) UPB_UNUSED(var); assert(predicate)
 
-// Generic function type.
+/* Generic function type. */
 typedef void upb_func();
 
-/* Casts **********************************************************************/
-
-// Upcasts for C.  For downcasts see the definitions of the subtypes.
-#define UPB_UPCAST(obj) (&(obj)->base)
-#define UPB_UPCAST2(obj) UPB_UPCAST(UPB_UPCAST(obj))
+/* C++ Casts ******************************************************************/
 
 #ifdef __cplusplus
 
-// Downcasts for C++.  We can't use C++ inheritance directly and maintain
-// compatibility with C.  So our inheritance is undeclared in C++.
-// Specializations of these casting functions are defined for appropriate type
-// pairs, and perform the necessary checks.
-//
-// Example:
-//   upb::Def* def = <...>;
-//   upb::MessageDef* = upb::dyn_cast<upb::MessageDef*>(def);
-
 namespace upb {
 
-// Casts to a direct subclass.  The caller must know that cast is correct; an
-// incorrect cast will throw an assertion failure in debug mode.
-template<class To, class From> To down_cast(From* f);
-
-// Casts to a direct subclass.  If the class does not actually match the given
-// subtype, returns NULL.
-template<class To, class From> To dyn_cast(From* f);
-
-// Pointer<T> is a simple wrapper around a T*.  It is only constructed for
-// upcast() below, and its sole purpose is to be implicitly convertable to T* or
-// pointers to base classes, just as a pointer would be in regular C++ if the
-// inheritance were directly expressed as C++ inheritance.
 template <class T> class Pointer;
 
-// Casts to any base class, or the type itself (ie. can be a no-op).
+/* Casts to a subclass.  The caller must know that cast is correct; an
+ * incorrect cast will throw an assertion failure in debug mode.
+ *
+ * Example:
+ *   upb::Def* def = GetDef();
+ *   // Assert-fails if this was not actually a MessageDef.
+ *   upb::MessgeDef* md = upb::down_cast<upb::MessageDef>(def);
+ *
+ * Note that downcasts are only defined for some types (at the moment you can
+ * only downcast from a upb::Def to a specific Def type). */
+template<class To, class From> To down_cast(From* f);
+
+/* Casts to a subclass.  If the class does not actually match the given To type,
+ * returns NULL.
+ *
+ * Example:
+ *   upb::Def* def = GetDef();
+ *   // md will be NULL if this was not actually a MessageDef.
+ *   upb::MessgeDef* md = upb::down_cast<upb::MessageDef>(def);
+ *
+ * Note that dynamic casts are only defined for some types (at the moment you
+ * can only downcast from a upb::Def to a specific Def type).. */
+template<class To, class From> To dyn_cast(From* f);
+
+/* Casts to any base class, or the type itself (ie. can be a no-op).
+ *
+ * Example:
+ *   upb::MessageDef* md = GetDef();
+ *   // This will fail to compile if this wasn't actually a base class.
+ *   upb::Def* def = upb::upcast(md);
+ */
 template <class T> inline Pointer<T> upcast(T *f) { return Pointer<T>(f); }
 
+/* Attempt upcast to specific base class.
+ *
+ * Example:
+ *   upb::MessageDef* md = GetDef();
+ *   upb::upcast_to<upb::Def>(md)->MethodOnDef();
+ */
+template <class T, class F> inline T* upcast_to(F *f) {
+  return static_cast<T*>(upcast(f));
+}
+
+/* PointerBase<T>: implementation detail of upb::upcast().
+ * It is implicitly convertable to pointers to the Base class(es).
+ */
 template <class T, class Base>
 class PointerBase {
  public:
   explicit PointerBase(T* ptr) : ptr_(ptr) {}
   operator T*() { return ptr_; }
-  operator Base*() { return ptr_->base(); }
+  operator Base*() { return (Base*)ptr_; }
 
  private:
   T* ptr_;
@@ -310,17 +346,17 @@
 
 #ifdef __cplusplus
 
-#include <algorithm>  // For std::swap().
+#include <algorithm>  /* For std::swap(). */
 
 namespace upb {
 
-// Provides RAII semantics for upb refcounted objects.  Each reffed_ptr owns a
-// ref on whatever object it points to (if any).
+/* Provides RAII semantics for upb refcounted objects.  Each reffed_ptr owns a
+ * ref on whatever object it points to (if any). */
 template <class T> class reffed_ptr {
  public:
   reffed_ptr() : ptr_(NULL) {}
 
-  // If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor.
+  /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */
   template <class U>
   reffed_ptr(U* val, const void* ref_donor = NULL)
       : ptr_(upb::upcast(val)) {
@@ -351,8 +387,8 @@
     return *this;
   }
 
-  // TODO(haberman): add C++11 move construction/assignment for greater
-  // efficiency.
+  /* TODO(haberman): add C++11 move construction/assignment for greater
+   * efficiency. */
 
   void swap(reffed_ptr& other) {
     if (ptr_ == other.ptr_) {
@@ -376,7 +412,7 @@
 
   T* get() const { return ptr_; }
 
-  // If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor.
+  /* If ref_donor is NULL, takes a new ref, otherwise adopts from ref_donor. */
   template <class U>
   void reset(U* ptr = NULL, const void* ref_donor = NULL) {
     reffed_ptr(ptr, ref_donor).swap(*this);
@@ -392,8 +428,8 @@
     return reffed_ptr<U>(upb::dyn_cast<U*>(get()));
   }
 
-  // Plain release() is unsafe; if we were the only owner, it would leak the
-  // object.  Instead we provide this:
+  /* Plain release() is unsafe; if we were the only owner, it would leak the
+   * object.  Instead we provide this: */
   T* ReleaseTo(const void* new_owner) {
     T* ret = NULL;
     ptr_->DonateRef(this, new_owner);
@@ -405,9 +441,9 @@
   T* ptr_;
 };
 
-}  // namespace upb
+}  /* namespace upb */
 
-#endif  // __cplusplus
+#endif  /* __cplusplus */
 
 
 /* upb::Status ****************************************************************/
@@ -419,70 +455,76 @@
 }
 #endif
 
-UPB_DECLARE_TYPE(upb::ErrorSpace, upb_errorspace);
-UPB_DECLARE_TYPE(upb::Status, upb_status);
+UPB_DECLARE_TYPE(upb::ErrorSpace, upb_errorspace)
+UPB_DECLARE_TYPE(upb::Status, upb_status)
 
-// The maximum length of an error message before it will get truncated.
+/* The maximum length of an error message before it will get truncated. */
 #define UPB_STATUS_MAX_MESSAGE 128
 
-// An error callback function is used to report errors from some component.
-// The function can return "true" to indicate that the component should try
-// to recover and proceed, but this is not always possible.
+/* An error callback function is used to report errors from some component.
+ * The function can return "true" to indicate that the component should try
+ * to recover and proceed, but this is not always possible. */
 typedef bool upb_errcb_t(void *closure, const upb_status* status);
 
-UPB_DEFINE_CLASS0(upb::ErrorSpace,
-,
-UPB_DEFINE_STRUCT0(upb_errorspace,
+#ifdef __cplusplus
+class upb::ErrorSpace {
+#else
+struct upb_errorspace {
+#endif
   const char *name;
-  // Should the error message in the status object according to this code.
+  /* Should the error message in the status object according to this code. */
   void (*set_message)(upb_status* status, int code);
-));
+};
 
-// Object representing a success or failure status.
-// It owns no resources and allocates no memory, so it should work
-// even in OOM situations.
-UPB_DEFINE_CLASS0(upb::Status,
+#ifdef __cplusplus
+
+/* Object representing a success or failure status.
+ * It owns no resources and allocates no memory, so it should work
+ * even in OOM situations. */
+
+class upb::Status {
  public:
   Status();
 
-  // Returns true if there is no error.
+  /* Returns true if there is no error. */
   bool ok() const;
 
-  // Optional error space and code, useful if the caller wants to
-  // programmatically check the specific kind of error.
+  /* Optional error space and code, useful if the caller wants to
+   * programmatically check the specific kind of error. */
   ErrorSpace* error_space();
   int code() const;
 
   const char *error_message() const;
 
-  // The error message will be truncated if it is longer than
-  // UPB_STATUS_MAX_MESSAGE-4.
+  /* The error message will be truncated if it is longer than
+   * UPB_STATUS_MAX_MESSAGE-4. */
   void SetErrorMessage(const char* msg);
   void SetFormattedErrorMessage(const char* fmt, ...);
 
-  // If there is no error message already, this will use the ErrorSpace to
-  // populate the error message for this code.  The caller can still call
-  // SetErrorMessage() to give a more specific message.
+  /* If there is no error message already, this will use the ErrorSpace to
+   * populate the error message for this code.  The caller can still call
+   * SetErrorMessage() to give a more specific message. */
   void SetErrorCode(ErrorSpace* space, int code);
 
-  // Resets the status to a successful state with no message.
+  /* Resets the status to a successful state with no message. */
   void Clear();
 
   void CopyFrom(const Status& other);
 
  private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(Status);
-,
-UPB_DEFINE_STRUCT0(upb_status,
+  UPB_DISALLOW_COPY_AND_ASSIGN(Status)
+#else
+struct upb_status {
+#endif
   bool ok_;
 
-  // Specific status code defined by some error space (optional).
+  /* Specific status code defined by some error space (optional). */
   int code_;
   upb_errorspace *error_space_;
 
-  // Error message; NULL-terminated.
+  /* Error message; NULL-terminated. */
   char msg[UPB_STATUS_MAX_MESSAGE];
-));
+};
 
 #define UPB_STATUS_INIT {true, 0, NULL, {0}}
 
@@ -490,15 +532,15 @@
 extern "C" {
 #endif
 
-// The returned string is invalidated by any other call into the status.
+/* The returned string is invalidated by any other call into the status. */
 const char *upb_status_errmsg(const upb_status *status);
 bool upb_ok(const upb_status *status);
 upb_errorspace *upb_status_errspace(const upb_status *status);
 int upb_status_errcode(const upb_status *status);
 
-// Any of the functions that write to a status object allow status to be NULL,
-// to support use cases where the function's caller does not care about the
-// status message.
+/* Any of the functions that write to a status object allow status to be NULL,
+ * to support use cases where the function's caller does not care about the
+ * status message. */
 void upb_status_clear(upb_status *status);
 void upb_status_seterrmsg(upb_status *status, const char *msg);
 void upb_status_seterrf(upb_status *status, const char *fmt, ...);
@@ -507,11 +549,11 @@
 void upb_status_copy(upb_status *to, const upb_status *from);
 
 #ifdef __cplusplus
-}  // extern "C"
+}  /* extern "C" */
 
 namespace upb {
 
-// C++ Wrappers
+/* C++ Wrappers */
 inline Status::Status() { Clear(); }
 inline bool Status::ok() const { return upb_ok(this); }
 inline const char* Status::error_message() const {
@@ -534,7 +576,7 @@
   upb_status_copy(this, &other);
 }
 
-}  // namespace upb
+}  /* namespace upb */
 
 #endif
 
@@ -547,9 +589,9 @@
 
 /* upb_value ******************************************************************/
 
-// A tagged union (stored untagged inside the table) so that we can check that
-// clients calling table accessors are correctly typed without having to have
-// an explosion of accessors.
+/* A tagged union (stored untagged inside the table) so that we can check that
+ * clients calling table accessors are correctly typed without having to have
+ * an explosion of accessors. */
 typedef enum {
   UPB_CTYPE_INT32    = 1,
   UPB_CTYPE_INT64    = 2,
@@ -559,85 +601,54 @@
   UPB_CTYPE_CSTR     = 6,
   UPB_CTYPE_PTR      = 7,
   UPB_CTYPE_CONSTPTR = 8,
-  UPB_CTYPE_FPTR     = 9,
+  UPB_CTYPE_FPTR     = 9
 } upb_ctype_t;
 
-typedef union {
-  int32_t  int32;
-  int64_t  int64;
-  uint64_t uint64;
-  uint32_t uint32;
-  bool     _bool;
-  char     *cstr;
-  void     *ptr;
-  const void *constptr;
-  upb_func *fptr;
-} _upb_value;
-
 typedef struct {
-  _upb_value val;
+  uint64_t val;
 #ifndef NDEBUG
-  // In debug mode we carry the value type around also so we can check accesses
-  // to be sure the right member is being read.
+  /* In debug mode we carry the value type around also so we can check accesses
+   * to be sure the right member is being read. */
   upb_ctype_t ctype;
 #endif
 } upb_value;
 
-#ifdef UPB_C99
-#define UPB_VALUE_INIT(v, member) {.member = v}
-#endif
-#define UPB__VALUE_INIT_NONE      UPB_VALUE_INIT(NULL, ptr)
-
 #ifdef NDEBUG
 #define SET_TYPE(dest, val)      UPB_UNUSED(val)
-#define UPB_VALUE_INIT_NONE      {UPB__VALUE_INIT_NONE}
 #else
 #define SET_TYPE(dest, val) dest = val
-// Non-existent type, all reads will fail.
-#define UPB_VALUE_INIT_NONE      {UPB__VALUE_INIT_NONE, -1}
 #endif
 
-#define UPB_VALUE_INIT_INT32(v)  UPB_VALUE_INIT(v, int32)
-#define UPB_VALUE_INIT_INT64(v)  UPB_VALUE_INIT(v, int64)
-#define UPB_VALUE_INIT_UINT32(v) UPB_VALUE_INIT(v, uint32)
-#define UPB_VALUE_INIT_UINT64(v) UPB_VALUE_INIT(v, uint64)
-#define UPB_VALUE_INIT_BOOL(v)   UPB_VALUE_INIT(v, _bool)
-#define UPB_VALUE_INIT_CSTR(v)   UPB_VALUE_INIT(v, cstr)
-#define UPB_VALUE_INIT_PTR(v)    UPB_VALUE_INIT(v, ptr)
-#define UPB_VALUE_INIT_CONSTPTR(v) UPB_VALUE_INIT(v, constptr)
-#define UPB_VALUE_INIT_FPTR(v)   UPB_VALUE_INIT(v, fptr)
-
-// Like strdup(), which isn't always available since it's not ANSI C.
+/* Like strdup(), which isn't always available since it's not ANSI C. */
 char *upb_strdup(const char *s);
-// Variant that works with a length-delimited rather than NULL-delimited string,
-// as supported by strtable.
+/* Variant that works with a length-delimited rather than NULL-delimited string,
+ * as supported by strtable. */
 char *upb_strdup2(const char *s, size_t len);
 
-UPB_INLINE void _upb_value_setval(upb_value *v, _upb_value val,
+UPB_INLINE void _upb_value_setval(upb_value *v, uint64_t val,
                                   upb_ctype_t ctype) {
   v->val = val;
   SET_TYPE(v->ctype, ctype);
 }
 
-UPB_INLINE upb_value _upb_value_val(_upb_value val, upb_ctype_t ctype) {
+UPB_INLINE upb_value _upb_value_val(uint64_t val, upb_ctype_t ctype) {
   upb_value ret;
   _upb_value_setval(&ret, val, ctype);
   return ret;
 }
 
-// For each value ctype, define the following set of functions:
-//
-// // Get/set an int32 from a upb_value.
-// int32_t upb_value_getint32(upb_value val);
-// void upb_value_setint32(upb_value *val, int32_t cval);
-//
-// // Construct a new upb_value from an int32.
-// upb_value upb_value_int32(int32_t val);
-#define FUNCS(name, membername, type_t, proto_type) \
+/* For each value ctype, define the following set of functions:
+ *
+ * // Get/set an int32 from a upb_value.
+ * int32_t upb_value_getint32(upb_value val);
+ * void upb_value_setint32(upb_value *val, int32_t cval);
+ *
+ * // Construct a new upb_value from an int32.
+ * upb_value upb_value_int32(int32_t val); */
+#define FUNCS(name, membername, type_t, converter, proto_type) \
   UPB_INLINE void upb_value_set ## name(upb_value *val, type_t cval) { \
-    val->val.uint64 = 0; \
+    val->val = (converter)cval; \
     SET_TYPE(val->ctype, proto_type); \
-    val->val.membername = cval; \
   } \
   UPB_INLINE upb_value upb_value_ ## name(type_t val) { \
     upb_value ret; \
@@ -646,69 +657,148 @@
   } \
   UPB_INLINE type_t upb_value_get ## name(upb_value val) { \
     assert(val.ctype == proto_type); \
-    return val.val.membername; \
+    return (type_t)(converter)val.val; \
   }
 
-FUNCS(int32,    int32,        int32_t,      UPB_CTYPE_INT32);
-FUNCS(int64,    int64,        int64_t,      UPB_CTYPE_INT64);
-FUNCS(uint32,   uint32,       uint32_t,     UPB_CTYPE_UINT32);
-FUNCS(uint64,   uint64,       uint64_t,     UPB_CTYPE_UINT64);
-FUNCS(bool,     _bool,        bool,         UPB_CTYPE_BOOL);
-FUNCS(cstr,     cstr,         char*,        UPB_CTYPE_CSTR);
-FUNCS(ptr,      ptr,          void*,        UPB_CTYPE_PTR);
-FUNCS(constptr, constptr,     const void*,  UPB_CTYPE_CONSTPTR);
-FUNCS(fptr,     fptr,         upb_func*,    UPB_CTYPE_FPTR);
+FUNCS(int32,    int32,        int32_t,      int32_t,    UPB_CTYPE_INT32)
+FUNCS(int64,    int64,        int64_t,      int64_t,    UPB_CTYPE_INT64)
+FUNCS(uint32,   uint32,       uint32_t,     uint32_t,   UPB_CTYPE_UINT32)
+FUNCS(uint64,   uint64,       uint64_t,     uint64_t,   UPB_CTYPE_UINT64)
+FUNCS(bool,     _bool,        bool,         bool,       UPB_CTYPE_BOOL)
+FUNCS(cstr,     cstr,         char*,        uintptr_t,  UPB_CTYPE_CSTR)
+FUNCS(ptr,      ptr,          void*,        uintptr_t,  UPB_CTYPE_PTR)
+FUNCS(constptr, constptr,     const void*,  uintptr_t,  UPB_CTYPE_CONSTPTR)
+FUNCS(fptr,     fptr,         upb_func*,    uintptr_t,  UPB_CTYPE_FPTR)
 
 #undef FUNCS
+#undef SET_TYPE
+
+
+/* upb_tabkey *****************************************************************/
+
+/* Either:
+ *   1. an actual integer key, or
+ *   2. a pointer to a string prefixed by its uint32_t length, owned by us.
+ *
+ * ...depending on whether this is a string table or an int table.  We would
+ * make this a union of those two types, but C89 doesn't support statically
+ * initializing a non-first union member. */
+typedef uintptr_t upb_tabkey;
+
+#define UPB_TABKEY_NUM(n) n
+#define UPB_TABKEY_NONE 0
+/* The preprocessor isn't quite powerful enough to turn the compile-time string
+ * length into a byte-wise string representation, so code generation needs to
+ * help it along.
+ *
+ * "len1" is the low byte and len4 is the high byte. */
+#ifdef UPB_BIG_ENDIAN
+#define UPB_TABKEY_STR(len1, len2, len3, len4, strval) \
+    (uintptr_t)(len4 len3 len2 len1 strval)
+#else
+#define UPB_TABKEY_STR(len1, len2, len3, len4, strval) \
+    (uintptr_t)(len1 len2 len3 len4 strval)
+#endif
+
+UPB_INLINE char *upb_tabstr(upb_tabkey key, uint32_t *len) {
+  char* mem = (char*)key;
+  if (len) memcpy(len, mem, sizeof(*len));
+  return mem + sizeof(*len);
+}
+
+
+/* upb_tabval *****************************************************************/
+
+#ifdef __cplusplus
+
+/* Status initialization not supported.
+ *
+ * This separate definition is necessary because in C++, UINTPTR_MAX isn't
+ * reliably available. */
+typedef struct {
+  uint64_t val;
+} upb_tabval;
+
+#else
+
+/* C -- supports static initialization, but to support static initialization of
+ * both integers and points for both 32 and 64 bit targets, it takes a little
+ * bit of doing. */
+
+#if UINTPTR_MAX == 0xffffffffffffffffULL
+#define UPB_PTR_IS_64BITS
+#elif UINTPTR_MAX != 0xffffffff
+#error Could not determine how many bits pointers are.
+#endif
+
+typedef union {
+  /* For static initialization.
+   *
+   * Unfortunately this ugliness is necessary -- it is the only way that we can,
+   * with -std=c89 -pedantic, statically initialize this to either a pointer or
+   * an integer on 32-bit platforms. */
+  struct {
+#ifdef UPB_PTR_IS_64BITS
+    uintptr_t val;
+#else
+    uintptr_t val1;
+    uintptr_t val2;
+#endif
+  } staticinit;
+
+  /* The normal accessor that we use for everything at runtime. */
+  uint64_t val;
+} upb_tabval;
+
+#ifdef UPB_PTR_IS_64BITS
+#define UPB_TABVALUE_INT_INIT(v) {{v}}
+#define UPB_TABVALUE_EMPTY_INIT  {{-1}}
+#else
+
+/* 32-bit pointers */
+
+#ifdef UPB_BIG_ENDIAN
+#define UPB_TABVALUE_INT_INIT(v) {{0, v}}
+#define UPB_TABVALUE_EMPTY_INIT  {{-1, -1}}
+#else
+#define UPB_TABVALUE_INT_INIT(v) {{v, 0}}
+#define UPB_TABVALUE_EMPTY_INIT  {{-1, -1}}
+#endif
+
+#endif
+
+#define UPB_TABVALUE_PTR_INIT(v) UPB_TABVALUE_INT_INIT((uintptr_t)v)
+
+#undef UPB_PTR_IS_64BITS
+
+#endif  /* __cplusplus */
 
 
 /* upb_table ******************************************************************/
 
-typedef union {
-  uintptr_t num;
-  struct {
-    // We own this. NULL-terminated but may also contain binary data; see
-    // explicit length below.
-    // TODO: move the length to the start of the string in order to reduce
-    // tabkey's size (to one machine word) in a way that supports static
-    // initialization.
-    const char *str;
-    size_t length;
-  } s;
-} upb_tabkey;
-
-#define UPB_TABKEY_NUM(n) {n}
-#ifdef UPB_C99
-// Given that |s| is a string literal, sizeof(s) gives us a
-// compile-time-constant strlen(). We must ensure that this works for static
-// data initializers.
-#define UPB_TABKEY_STR(strval) { .s = { .str = strval,                    \
-                                        .length = sizeof(strval) - 1 } }
-#endif
-// TODO(haberman): C++
-#define UPB_TABKEY_NONE {0}
-
 typedef struct _upb_tabent {
   upb_tabkey key;
-  _upb_value val;
-  // Internal chaining.  This is const so we can create static initializers for
-  // tables.  We cast away const sometimes, but *only* when the containing
-  // upb_table is known to be non-const.  This requires a bit of care, but
-  // the subtlety is confined to table.c.
+  upb_tabval val;
+
+  /* Internal chaining.  This is const so we can create static initializers for
+   * tables.  We cast away const sometimes, but *only* when the containing
+   * upb_table is known to be non-const.  This requires a bit of care, but
+   * the subtlety is confined to table.c. */
   const struct _upb_tabent *next;
 } upb_tabent;
 
 typedef struct {
-  size_t count;          // Number of entries in the hash part.
-  size_t mask;           // Mask to turn hash value -> bucket.
-  upb_ctype_t ctype;     // Type of all values.
-  uint8_t size_lg2;      // Size of the hash table part is 2^size_lg2 entries.
+  size_t count;          /* Number of entries in the hash part. */
+  size_t mask;           /* Mask to turn hash value -> bucket. */
+  upb_ctype_t ctype;     /* Type of all values. */
+  uint8_t size_lg2;      /* Size of the hashtable part is 2^size_lg2 entries. */
 
-  // Hash table entries.
-  // Making this const isn't entirely accurate; what we really want is for it to
-  // have the same const-ness as the table it's inside.  But there's no way to
-  // declare that in C.  So we have to make it const so that we can statically
-  // initialize const hash tables.  Then we cast away const when we have to.
+  /* Hash table entries.
+   * Making this const isn't entirely accurate; what we really want is for it to
+   * have the same const-ness as the table it's inside.  But there's no way to
+   * declare that in C.  So we have to make it const so that we can statically
+   * initialize const hash tables.  Then we cast away const when we have to.
+   */
   const upb_tabent *entries;
 } upb_table;
 
@@ -723,10 +813,10 @@
   UPB_STRTABLE_INIT(0, 0, ctype, 0, NULL)
 
 typedef struct {
-  upb_table t;              // For entries that don't fit in the array part.
-  const _upb_value *array;  // Array part of the table.  See const note above.
-  size_t array_size;        // Array part size.
-  size_t array_count;       // Array part number of elements.
+  upb_table t;              /* For entries that don't fit in the array part. */
+  const upb_tabval *array;  /* Array part of the table. See const note above. */
+  size_t array_size;        /* Array part size. */
+  size_t array_count;       /* Array part number of elements. */
 } upb_inttable;
 
 #define UPB_INTTABLE_INIT(count, mask, ctype, size_lg2, ent, a, asize, acount) \
@@ -735,8 +825,7 @@
 #define UPB_EMPTY_INTTABLE_INIT(ctype) \
   UPB_INTTABLE_INIT(0, 0, ctype, 0, NULL, NULL, 0, 0)
 
-#define UPB_ARRAY_EMPTYVAL -1
-#define UPB_ARRAY_EMPTYENT UPB_VALUE_INIT_INT64(UPB_ARRAY_EMPTYVAL)
+#define UPB_ARRAY_EMPTYENT -1
 
 UPB_INLINE size_t upb_table_size(const upb_table *t) {
   if (t->size_lg2 == 0)
@@ -745,18 +834,16 @@
     return 1 << t->size_lg2;
 }
 
-// Internal-only functions, in .h file only out of necessity.
+/* Internal-only functions, in .h file only out of necessity. */
 UPB_INLINE bool upb_tabent_isempty(const upb_tabent *e) {
-  return e->key.num == 0;
+  return e->key == 0;
 }
 
-// Used by some of the unit tests for generic hashing functionality.
+/* Used by some of the unit tests for generic hashing functionality. */
 uint32_t MurmurHash2(const void * key, size_t len, uint32_t seed);
 
-UPB_INLINE upb_tabkey upb_intkey(uintptr_t key) {
-  upb_tabkey k;
-  k.num = key;
-  return k;
+UPB_INLINE uintptr_t upb_intkey(uintptr_t key) {
+  return key;
 }
 
 UPB_INLINE uint32_t upb_inthash(uintptr_t key) {
@@ -767,93 +854,94 @@
   return t->entries + (hash & t->mask);
 }
 
-UPB_INLINE bool upb_arrhas(_upb_value v) {
-  return v.uint64 != (uint64_t)UPB_ARRAY_EMPTYVAL;
+UPB_INLINE bool upb_arrhas(upb_tabval key) {
+  return key.val != (uint64_t)-1;
 }
 
-// Initialize and uninitialize a table, respectively.  If memory allocation
-// failed, false is returned that the table is uninitialized.
+/* Initialize and uninitialize a table, respectively.  If memory allocation
+ * failed, false is returned that the table is uninitialized. */
 bool upb_inttable_init(upb_inttable *table, upb_ctype_t ctype);
 bool upb_strtable_init(upb_strtable *table, upb_ctype_t ctype);
 void upb_inttable_uninit(upb_inttable *table);
 void upb_strtable_uninit(upb_strtable *table);
 
-// Returns the number of values in the table.
+/* Returns the number of values in the table. */
 size_t upb_inttable_count(const upb_inttable *t);
 UPB_INLINE size_t upb_strtable_count(const upb_strtable *t) {
   return t->t.count;
 }
 
-// Inserts the given key into the hashtable with the given value.  The key must
-// not already exist in the hash table.  For string tables, the key must be
-// NULL-terminated, and the table will make an internal copy of the key.
-// Inttables must not insert a value of UINTPTR_MAX.
-//
-// If a table resize was required but memory allocation failed, false is
-// returned and the table is unchanged.
+/* Inserts the given key into the hashtable with the given value.  The key must
+ * not already exist in the hash table.  For string tables, the key must be
+ * NULL-terminated, and the table will make an internal copy of the key.
+ * Inttables must not insert a value of UINTPTR_MAX.
+ *
+ * If a table resize was required but memory allocation failed, false is
+ * returned and the table is unchanged. */
 bool upb_inttable_insert(upb_inttable *t, uintptr_t key, upb_value val);
 bool upb_strtable_insert2(upb_strtable *t, const char *key, size_t len,
                           upb_value val);
 
-// For NULL-terminated strings.
+/* For NULL-terminated strings. */
 UPB_INLINE bool upb_strtable_insert(upb_strtable *t, const char *key,
                                     upb_value val) {
   return upb_strtable_insert2(t, key, strlen(key), val);
 }
 
-// Looks up key in this table, returning "true" if the key was found.
-// If v is non-NULL, copies the value for this key into *v.
+/* Looks up key in this table, returning "true" if the key was found.
+ * If v is non-NULL, copies the value for this key into *v. */
 bool upb_inttable_lookup(const upb_inttable *t, uintptr_t key, upb_value *v);
 bool upb_strtable_lookup2(const upb_strtable *t, const char *key, size_t len,
                           upb_value *v);
 
-// For NULL-terminated strings.
+/* For NULL-terminated strings. */
 UPB_INLINE bool upb_strtable_lookup(const upb_strtable *t, const char *key,
                                     upb_value *v) {
   return upb_strtable_lookup2(t, key, strlen(key), v);
 }
 
-// Removes an item from the table.  Returns true if the remove was successful,
-// and stores the removed item in *val if non-NULL.
+/* Removes an item from the table.  Returns true if the remove was successful,
+ * and stores the removed item in *val if non-NULL. */
 bool upb_inttable_remove(upb_inttable *t, uintptr_t key, upb_value *val);
 bool upb_strtable_remove2(upb_strtable *t, const char *key, size_t len,
                           upb_value *val);
 
-// For NULL-terminated strings.
+/* For NULL-terminated strings. */
 UPB_INLINE bool upb_strtable_remove(upb_strtable *t, const char *key,
                                     upb_value *v) {
   return upb_strtable_remove2(t, key, strlen(key), v);
 }
 
-// Updates an existing entry in an inttable.  If the entry does not exist,
-// returns false and does nothing.  Unlike insert/remove, this does not
-// invalidate iterators.
+/* Updates an existing entry in an inttable.  If the entry does not exist,
+ * returns false and does nothing.  Unlike insert/remove, this does not
+ * invalidate iterators. */
 bool upb_inttable_replace(upb_inttable *t, uintptr_t key, upb_value val);
 
-// Handy routines for treating an inttable like a stack.  May not be mixed with
-// other insert/remove calls.
+/* Handy routines for treating an inttable like a stack.  May not be mixed with
+ * other insert/remove calls. */
 bool upb_inttable_push(upb_inttable *t, upb_value val);
 upb_value upb_inttable_pop(upb_inttable *t);
 
-// Convenience routines for inttables with pointer keys.
+/* Convenience routines for inttables with pointer keys. */
 bool upb_inttable_insertptr(upb_inttable *t, const void *key, upb_value val);
 bool upb_inttable_removeptr(upb_inttable *t, const void *key, upb_value *val);
 bool upb_inttable_lookupptr(
     const upb_inttable *t, const void *key, upb_value *val);
 
-// Optimizes the table for the current set of entries, for both memory use and
-// lookup time.  Client should call this after all entries have been inserted;
-// inserting more entries is legal, but will likely require a table resize.
+/* Optimizes the table for the current set of entries, for both memory use and
+ * lookup time.  Client should call this after all entries have been inserted;
+ * inserting more entries is legal, but will likely require a table resize. */
 void upb_inttable_compact(upb_inttable *t);
 
-// A special-case inlinable version of the lookup routine for 32-bit integers.
+/* A special-case inlinable version of the lookup routine for 32-bit
+ * integers. */
 UPB_INLINE bool upb_inttable_lookup32(const upb_inttable *t, uint32_t key,
                                       upb_value *v) {
-  *v = upb_value_int32(0);  // Silence compiler warnings.
+  *v = upb_value_int32(0);  /* Silence compiler warnings. */
   if (key < t->array_size) {
-    _upb_value arrval = t->array[key];
+    upb_tabval arrval = t->array[key];
     if (upb_arrhas(arrval)) {
-      _upb_value_setval(v, arrval, t->t.ctype);
+      _upb_value_setval(v, arrval.val, t->t.ctype);
       return true;
     } else {
       return false;
@@ -862,8 +950,8 @@
     const upb_tabent *e;
     if (t->t.entries == NULL) return false;
     for (e = upb_getentry(&t->t, upb_inthash(key)); true; e = e->next) {
-      if ((uint32_t)e->key.num == key) {
-        _upb_value_setval(v, e->val, t->t.ctype);
+      if ((uint32_t)e->key == key) {
+        _upb_value_setval(v, e->val.val, t->t.ctype);
         return true;
       }
       if (e->next == NULL) return false;
@@ -871,42 +959,43 @@
   }
 }
 
-// Exposed for testing only.
+/* Exposed for testing only. */
 bool upb_strtable_resize(upb_strtable *t, size_t size_lg2);
 
 /* Iterators ******************************************************************/
 
-// Iterators for int and string tables.  We are subject to some kind of unusual
-// design constraints:
-//
-// For high-level languages:
-//  - we must be able to guarantee that we don't crash or corrupt memory even if
-//    the program accesses an invalidated iterator.
-//
-// For C++11 range-based for:
-//  - iterators must be copyable
-//  - iterators must be comparable
-//  - it must be possible to construct an "end" value.
-//
-// Iteration order is undefined.
-//
-// Modifying the table invalidates iterators.  upb_{str,int}table_done() is
-// guaranteed to work even on an invalidated iterator, as long as the table it
-// is iterating over has not been freed.  Calling next() or accessing data from
-// an invalidated iterator yields unspecified elements from the table, but it is
-// guaranteed not to crash and to return real table elements (except when done()
-// is true).
+/* Iterators for int and string tables.  We are subject to some kind of unusual
+ * design constraints:
+ *
+ * For high-level languages:
+ *  - we must be able to guarantee that we don't crash or corrupt memory even if
+ *    the program accesses an invalidated iterator.
+ *
+ * For C++11 range-based for:
+ *  - iterators must be copyable
+ *  - iterators must be comparable
+ *  - it must be possible to construct an "end" value.
+ *
+ * Iteration order is undefined.
+ *
+ * Modifying the table invalidates iterators.  upb_{str,int}table_done() is
+ * guaranteed to work even on an invalidated iterator, as long as the table it
+ * is iterating over has not been freed.  Calling next() or accessing data from
+ * an invalidated iterator yields unspecified elements from the table, but it is
+ * guaranteed not to crash and to return real table elements (except when done()
+ * is true). */
 
 
 /* upb_strtable_iter **********************************************************/
 
-//   upb_strtable_iter i;
-//   upb_strtable_begin(&i, t);
-//   for(; !upb_strtable_done(&i); upb_strtable_next(&i)) {
-//     const char *key = upb_strtable_iter_key(&i);
-//     const upb_value val = upb_strtable_iter_value(&i);
-//     // ...
-//   }
+/*   upb_strtable_iter i;
+ *   upb_strtable_begin(&i, t);
+ *   for(; !upb_strtable_done(&i); upb_strtable_next(&i)) {
+ *     const char *key = upb_strtable_iter_key(&i);
+ *     const upb_value val = upb_strtable_iter_value(&i);
+ *     // ...
+ *   }
+ */
 
 typedef struct {
   const upb_strtable *t;
@@ -926,13 +1015,14 @@
 
 /* upb_inttable_iter **********************************************************/
 
-//   upb_inttable_iter i;
-//   upb_inttable_begin(&i, t);
-//   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
-//     uintptr_t key = upb_inttable_iter_key(&i);
-//     upb_value val = upb_inttable_iter_value(&i);
-//     // ...
-//   }
+/*   upb_inttable_iter i;
+ *   upb_inttable_begin(&i, t);
+ *   for(; !upb_inttable_done(&i); upb_inttable_next(&i)) {
+ *     uintptr_t key = upb_inttable_iter_key(&i);
+ *     upb_value val = upb_inttable_iter_value(&i);
+ *     // ...
+ *   }
+ */
 
 typedef struct {
   const upb_inttable *t;
@@ -956,151 +1046,86 @@
 
 #endif  /* UPB_TABLE_H_ */
 
-// Reference tracking will check ref()/unref() operations to make sure the
-// ref ownership is correct.  Where possible it will also make tools like
-// Valgrind attribute ref leaks to the code that took the leaked ref, not
-// the code that originally created the object.
-//
-// Enabling this requires the application to define upb_lock()/upb_unlock()
-// functions that acquire/release a global mutex (or #define UPB_THREAD_UNSAFE).
-#ifndef NDEBUG
-#define UPB_DEBUG_REFS
-#endif
+/* Reference tracking will check ref()/unref() operations to make sure the
+ * ref ownership is correct.  Where possible it will also make tools like
+ * Valgrind attribute ref leaks to the code that took the leaked ref, not
+ * the code that originally created the object.
+ *
+ * Enabling this requires the application to define upb_lock()/upb_unlock()
+ * functions that acquire/release a global mutex (or #define UPB_THREAD_UNSAFE).
+ * For this reason we don't enable it by default, even in debug builds.
+ */
+
+/* #define UPB_DEBUG_REFS */
 
 #ifdef __cplusplus
 namespace upb { class RefCounted; }
 #endif
 
-UPB_DECLARE_TYPE(upb::RefCounted, upb_refcounted);
+UPB_DECLARE_TYPE(upb::RefCounted, upb_refcounted)
 
 struct upb_refcounted_vtbl;
 
-UPB_DEFINE_CLASS0(upb::RefCounted,
+#ifdef __cplusplus
+
+class upb::RefCounted {
  public:
-  // Returns true if the given object is frozen.
+  /* Returns true if the given object is frozen. */
   bool IsFrozen() const;
 
-  // Increases the ref count, the new ref is owned by "owner" which must not
-  // already own a ref (and should not itself be a refcounted object if the ref
-  // could possibly be circular; see below).
-  // Thread-safe iff "this" is frozen.
+  /* Increases the ref count, the new ref is owned by "owner" which must not
+   * already own a ref (and should not itself be a refcounted object if the ref
+   * could possibly be circular; see below).
+   * Thread-safe iff "this" is frozen. */
   void Ref(const void *owner) const;
 
-  // Release a ref that was acquired from upb_refcounted_ref() and collects any
-  // objects it can.
+  /* Release a ref that was acquired from upb_refcounted_ref() and collects any
+   * objects it can. */
   void Unref(const void *owner) const;
 
-  // Moves an existing ref from "from" to "to", without changing the overall
-  // ref count.  DonateRef(foo, NULL, owner) is the same as Ref(foo, owner),
-  // but "to" may not be NULL.
+  /* Moves an existing ref from "from" to "to", without changing the overall
+   * ref count.  DonateRef(foo, NULL, owner) is the same as Ref(foo, owner),
+   * but "to" may not be NULL. */
   void DonateRef(const void *from, const void *to) const;
 
-  // Verifies that a ref to the given object is currently held by the given
-  // owner.  Only effective in UPB_DEBUG_REFS builds.
+  /* Verifies that a ref to the given object is currently held by the given
+   * owner.  Only effective in UPB_DEBUG_REFS builds. */
   void CheckRef(const void *owner) const;
 
  private:
-  UPB_DISALLOW_POD_OPS(RefCounted, upb::RefCounted);
-,
-UPB_DEFINE_STRUCT0(upb_refcounted,
-  // A single reference count shared by all objects in the group.
+  UPB_DISALLOW_POD_OPS(RefCounted, upb::RefCounted)
+#else
+struct upb_refcounted {
+#endif
+  /* TODO(haberman): move the actual structure definition to structdefs.int.h.
+   * The only reason they are here is because inline functions need to see the
+   * definition of upb_handlers, which needs to see this definition.  But we
+   * can change the upb_handlers inline functions to deal in raw offsets
+   * instead.
+   */
+
+  /* A single reference count shared by all objects in the group. */
   uint32_t *group;
 
-  // A singly-linked list of all objects in the group.
+  /* A singly-linked list of all objects in the group. */
   upb_refcounted *next;
 
-  // Table of function pointers for this type.
+  /* Table of function pointers for this type. */
   const struct upb_refcounted_vtbl *vtbl;
 
-  // Maintained only when mutable, this tracks the number of refs (but not
-  // ref2's) to this object.  *group should be the sum of all individual_count
-  // in the group.
+  /* Maintained only when mutable, this tracks the number of refs (but not
+   * ref2's) to this object.  *group should be the sum of all individual_count
+   * in the group. */
   uint32_t individual_count;
 
   bool is_frozen;
 
 #ifdef UPB_DEBUG_REFS
-  upb_inttable *refs;  // Maps owner -> trackedref for incoming refs.
-  upb_inttable *ref2s; // Set of targets for outgoing ref2s.
+  upb_inttable *refs;  /* Maps owner -> trackedref for incoming refs. */
+  upb_inttable *ref2s; /* Set of targets for outgoing ref2s. */
 #endif
-));
-
-UPB_BEGIN_EXTERN_C  // {
-
-// It is better to use tracked refs when possible, for the extra debugging
-// capability.  But if this is not possible (because you don't have easy access
-// to a stable pointer value that is associated with the ref), you can pass
-// UPB_UNTRACKED_REF instead.
-extern const void *UPB_UNTRACKED_REF;
-
-// Native C API.
-bool upb_refcounted_isfrozen(const upb_refcounted *r);
-void upb_refcounted_ref(const upb_refcounted *r, const void *owner);
-void upb_refcounted_unref(const upb_refcounted *r, const void *owner);
-void upb_refcounted_donateref(
-    const upb_refcounted *r, const void *from, const void *to);
-void upb_refcounted_checkref(const upb_refcounted *r, const void *owner);
-
-
-// Internal-to-upb Interface ///////////////////////////////////////////////////
-
-typedef void upb_refcounted_visit(const upb_refcounted *r,
-                                  const upb_refcounted *subobj,
-                                  void *closure);
-
-struct upb_refcounted_vtbl {
-  // Must visit all subobjects that are currently ref'd via upb_refcounted_ref2.
-  // Must be longjmp()-safe.
-  void (*visit)(const upb_refcounted *r, upb_refcounted_visit *visit, void *c);
-
-  // Must free the object and release all references to other objects.
-  void (*free)(upb_refcounted *r);
 };
 
-// Initializes the refcounted with a single ref for the given owner.  Returns
-// false if memory could not be allocated.
-bool upb_refcounted_init(upb_refcounted *r,
-                         const struct upb_refcounted_vtbl *vtbl,
-                         const void *owner);
-
-// Adds a ref from one refcounted object to another ("from" must not already
-// own a ref).  These refs may be circular; cycles will be collected correctly
-// (if conservatively).  These refs do not need to be freed in from's free()
-// function.
-void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from);
-
-// Removes a ref that was acquired from upb_refcounted_ref2(), and collects any
-// object it can.  This is only necessary when "from" no longer points to "r",
-// and not from from's "free" function.
-void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from);
-
-#define upb_ref2(r, from) \
-    upb_refcounted_ref2((const upb_refcounted*)r, (upb_refcounted*)from)
-#define upb_unref2(r, from) \
-    upb_refcounted_unref2((const upb_refcounted*)r, (upb_refcounted*)from)
-
-// Freezes all mutable object reachable by ref2() refs from the given roots.
-// This will split refcounting groups into precise SCC groups, so that
-// refcounting of frozen objects can be more aggressive.  If memory allocation
-// fails, or if more than 2**31 mutable objects are reachable from "roots", or
-// if the maximum depth of the graph exceeds "maxdepth", false is returned and
-// the objects are unchanged.
-//
-// After this operation succeeds, the objects are frozen/const, and may not be
-// used through non-const pointers.  In particular, they may not be passed as
-// the second parameter of upb_refcounted_{ref,unref}2().  On the upside, all
-// operations on frozen refcounteds are threadsafe, and objects will be freed
-// at the precise moment that they become unreachable.
-//
-// Caller must own refs on each object in the "roots" list.
-bool upb_refcounted_freeze(upb_refcounted *const*roots, int n, upb_status *s,
-                           int maxdepth);
-
-// Shared by all compiled-in refcounted objects.
-extern uint32_t static_refcount;
-
-UPB_END_EXTERN_C  // }
-
 #ifdef UPB_DEBUG_REFS
 #define UPB_REFCOUNT_INIT(refs, ref2s) \
     {&static_refcount, NULL, NULL, 0, true, refs, ref2s}
@@ -1108,8 +1133,117 @@
 #define UPB_REFCOUNT_INIT(refs, ref2s) {&static_refcount, NULL, NULL, 0, true}
 #endif
 
+UPB_BEGIN_EXTERN_C
+
+/* It is better to use tracked refs when possible, for the extra debugging
+ * capability.  But if this is not possible (because you don't have easy access
+ * to a stable pointer value that is associated with the ref), you can pass
+ * UPB_UNTRACKED_REF instead.  */
+extern const void *UPB_UNTRACKED_REF;
+
+/* Native C API. */
+bool upb_refcounted_isfrozen(const upb_refcounted *r);
+void upb_refcounted_ref(const upb_refcounted *r, const void *owner);
+void upb_refcounted_unref(const upb_refcounted *r, const void *owner);
+void upb_refcounted_donateref(
+    const upb_refcounted *r, const void *from, const void *to);
+void upb_refcounted_checkref(const upb_refcounted *r, const void *owner);
+
+#define UPB_REFCOUNTED_CMETHODS(type, upcastfunc) \
+  UPB_INLINE bool type ## _isfrozen(const type *v) { \
+    return upb_refcounted_isfrozen(upcastfunc(v)); \
+  } \
+  UPB_INLINE void type ## _ref(const type *v, const void *owner) { \
+    upb_refcounted_ref(upcastfunc(v), owner); \
+  } \
+  UPB_INLINE void type ## _unref(const type *v, const void *owner) { \
+    upb_refcounted_unref(upcastfunc(v), owner); \
+  } \
+  UPB_INLINE void type ## _donateref(const type *v, const void *from, const void *to) { \
+    upb_refcounted_donateref(upcastfunc(v), from, to); \
+  } \
+  UPB_INLINE void type ## _checkref(const type *v, const void *owner) { \
+    upb_refcounted_checkref(upcastfunc(v), owner); \
+  }
+
+#define UPB_REFCOUNTED_CPPMETHODS \
+  bool IsFrozen() const { \
+    return upb::upcast_to<const upb::RefCounted>(this)->IsFrozen(); \
+  } \
+  void Ref(const void *owner) const { \
+    return upb::upcast_to<const upb::RefCounted>(this)->Ref(owner); \
+  } \
+  void Unref(const void *owner) const { \
+    return upb::upcast_to<const upb::RefCounted>(this)->Unref(owner); \
+  } \
+  void DonateRef(const void *from, const void *to) const { \
+    return upb::upcast_to<const upb::RefCounted>(this)->DonateRef(from, to); \
+  } \
+  void CheckRef(const void *owner) const { \
+    return upb::upcast_to<const upb::RefCounted>(this)->CheckRef(owner); \
+  }
+
+/* Internal-to-upb Interface **************************************************/
+
+typedef void upb_refcounted_visit(const upb_refcounted *r,
+                                  const upb_refcounted *subobj,
+                                  void *closure);
+
+struct upb_refcounted_vtbl {
+  /* Must visit all subobjects that are currently ref'd via upb_refcounted_ref2.
+   * Must be longjmp()-safe. */
+  void (*visit)(const upb_refcounted *r, upb_refcounted_visit *visit, void *c);
+
+  /* Must free the object and release all references to other objects. */
+  void (*free)(upb_refcounted *r);
+};
+
+/* Initializes the refcounted with a single ref for the given owner.  Returns
+ * false if memory could not be allocated. */
+bool upb_refcounted_init(upb_refcounted *r,
+                         const struct upb_refcounted_vtbl *vtbl,
+                         const void *owner);
+
+/* Adds a ref from one refcounted object to another ("from" must not already
+ * own a ref).  These refs may be circular; cycles will be collected correctly
+ * (if conservatively).  These refs do not need to be freed in from's free()
+ * function. */
+void upb_refcounted_ref2(const upb_refcounted *r, upb_refcounted *from);
+
+/* Removes a ref that was acquired from upb_refcounted_ref2(), and collects any
+ * object it can.  This is only necessary when "from" no longer points to "r",
+ * and not from from's "free" function. */
+void upb_refcounted_unref2(const upb_refcounted *r, upb_refcounted *from);
+
+#define upb_ref2(r, from) \
+    upb_refcounted_ref2((const upb_refcounted*)r, (upb_refcounted*)from)
+#define upb_unref2(r, from) \
+    upb_refcounted_unref2((const upb_refcounted*)r, (upb_refcounted*)from)
+
+/* Freezes all mutable object reachable by ref2() refs from the given roots.
+ * This will split refcounting groups into precise SCC groups, so that
+ * refcounting of frozen objects can be more aggressive.  If memory allocation
+ * fails, or if more than 2**31 mutable objects are reachable from "roots", or
+ * if the maximum depth of the graph exceeds "maxdepth", false is returned and
+ * the objects are unchanged.
+ *
+ * After this operation succeeds, the objects are frozen/const, and may not be
+ * used through non-const pointers.  In particular, they may not be passed as
+ * the second parameter of upb_refcounted_{ref,unref}2().  On the upside, all
+ * operations on frozen refcounteds are threadsafe, and objects will be freed
+ * at the precise moment that they become unreachable.
+ *
+ * Caller must own refs on each object in the "roots" list. */
+bool upb_refcounted_freeze(upb_refcounted *const*roots, int n, upb_status *s,
+                           int maxdepth);
+
+/* Shared by all compiled-in refcounted objects. */
+extern uint32_t static_refcount;
+
+UPB_END_EXTERN_C
+
 #ifdef __cplusplus
-// C++ Wrappers.
+/* C++ Wrappers. */
 namespace upb {
 inline bool RefCounted::IsFrozen() const {
   return upb_refcounted_isfrozen(this);
@@ -1126,10 +1260,10 @@
 inline void RefCounted::CheckRef(const void *owner) const {
   upb_refcounted_checkref(this, owner);
 }
-}  // namespace upb
+}  /* namespace upb */
 #endif
 
-#endif  // UPB_REFCOUNT_H_
+#endif  /* UPB_REFCOUNT_H_ */
 
 #ifdef __cplusplus
 #include <cstring>
@@ -1145,114 +1279,90 @@
 }
 #endif
 
-UPB_DECLARE_TYPE(upb::Def, upb_def);
-UPB_DECLARE_TYPE(upb::EnumDef, upb_enumdef);
-UPB_DECLARE_TYPE(upb::FieldDef, upb_fielddef);
-UPB_DECLARE_TYPE(upb::MessageDef, upb_msgdef);
-UPB_DECLARE_TYPE(upb::OneofDef, upb_oneofdef);
+UPB_DECLARE_DERIVED_TYPE(upb::Def, upb::RefCounted, upb_def, upb_refcounted)
 
-// Maximum field number allowed for FieldDefs.  This is an inherent limit of the
-// protobuf wire format.
-#define UPB_MAX_FIELDNUMBER ((1 << 29) - 1)
-
-// The maximum message depth that the type graph can have.  This is a resource
-// limit for the C stack since we sometimes need to recursively traverse the
-// graph.  Cycles are ok; the traversal will stop when it detects a cycle, but
-// we must hit the cycle before the maximum depth is reached.
-//
-// If having a single static limit is too inflexible, we can add another variant
-// of Def::Freeze that allows specifying this as a parameter.
+/* The maximum message depth that the type graph can have.  This is a resource
+ * limit for the C stack since we sometimes need to recursively traverse the
+ * graph.  Cycles are ok; the traversal will stop when it detects a cycle, but
+ * we must hit the cycle before the maximum depth is reached.
+ *
+ * If having a single static limit is too inflexible, we can add another variant
+ * of Def::Freeze that allows specifying this as a parameter. */
 #define UPB_MAX_MESSAGE_DEPTH 64
 
 
 /* upb::Def: base class for defs  *********************************************/
 
-// All the different kind of defs we support.  These correspond 1:1 with
-// declarations in a .proto file.
+/* All the different kind of defs we support.  These correspond 1:1 with
+ * declarations in a .proto file. */
 typedef enum {
   UPB_DEF_MSG,
   UPB_DEF_FIELD,
   UPB_DEF_ENUM,
   UPB_DEF_ONEOF,
-  UPB_DEF_SERVICE,   // Not yet implemented.
-  UPB_DEF_ANY = -1,  // Wildcard for upb_symtab_get*()
+  UPB_DEF_SERVICE,   /* Not yet implemented. */
+  UPB_DEF_ANY = -1   /* Wildcard for upb_symtab_get*() */
 } upb_deftype_t;
 
-// The base class of all defs.  Its base is upb::RefCounted (use upb::upcast()
-// to convert).
-UPB_DEFINE_CLASS1(upb::Def, upb::RefCounted,
+#ifdef __cplusplus
+
+/* The base class of all defs.  Its base is upb::RefCounted (use upb::upcast()
+ * to convert). */
+class upb::Def {
  public:
   typedef upb_deftype_t Type;
 
   Def* Dup(const void *owner) const;
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void* from, const void* to) const;
-  void CheckRef(const void* owner) const;
+  /* upb::RefCounted methods like Ref()/Unref(). */
+  UPB_REFCOUNTED_CPPMETHODS
 
   Type def_type() const;
 
-  // "fullname" is the def's fully-qualified name (eg. foo.bar.Message).
+  /* "fullname" is the def's fully-qualified name (eg. foo.bar.Message). */
   const char *full_name() const;
 
-  // The def must be mutable.  Caller retains ownership of fullname.  Defs are
-  // not required to have a name; if a def has no name when it is frozen, it
-  // will remain an anonymous def.  On failure, returns false and details in "s"
-  // if non-NULL.
+  /* The def must be mutable.  Caller retains ownership of fullname.  Defs are
+   * not required to have a name; if a def has no name when it is frozen, it
+   * will remain an anonymous def.  On failure, returns false and details in "s"
+   * if non-NULL. */
   bool set_full_name(const char* fullname, upb::Status* s);
   bool set_full_name(const std::string &fullname, upb::Status* s);
 
-  // Freezes the given defs; this validates all constraints and marks the defs
-  // as frozen (read-only).  "defs" may not contain any fielddefs, but fields
-  // of any msgdefs will be frozen.
-  //
-  // Symbolic references to sub-types and enum defaults must have already been
-  // resolved.  Any mutable defs reachable from any of "defs" must also be in
-  // the list; more formally, "defs" must be a transitive closure of mutable
-  // defs.
-  //
-  // After this operation succeeds, the finalized defs must only be accessed
-  // through a const pointer!
+  /* Freezes the given defs; this validates all constraints and marks the defs
+   * as frozen (read-only).  "defs" may not contain any fielddefs, but fields
+   * of any msgdefs will be frozen.
+   *
+   * Symbolic references to sub-types and enum defaults must have already been
+   * resolved.  Any mutable defs reachable from any of "defs" must also be in
+   * the list; more formally, "defs" must be a transitive closure of mutable
+   * defs.
+   *
+   * After this operation succeeds, the finalized defs must only be accessed
+   * through a const pointer! */
   static bool Freeze(Def* const* defs, int n, Status* status);
   static bool Freeze(const std::vector<Def*>& defs, Status* status);
 
  private:
-  UPB_DISALLOW_POD_OPS(Def, upb::Def);
-,
-UPB_DEFINE_STRUCT(upb_def, upb_refcounted,
-  const char *fullname;
-  upb_deftype_t type : 8;
-  // Used as a flag during the def's mutable stage.  Must be false unless
-  // it is currently being used by a function on the stack.  This allows
-  // us to easily determine which defs were passed into the function's
-  // current invocation.
-  bool came_from_user;
-));
+  UPB_DISALLOW_POD_OPS(Def, upb::Def)
+};
 
-#define UPB_DEF_INIT(name, type, refs, ref2s) \
-    { UPB_REFCOUNT_INIT(refs, ref2s), name, type, false }
+#endif  /* __cplusplus */
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
-// Native C API.
+/* Native C API. */
 upb_def *upb_def_dup(const upb_def *def, const void *owner);
 
-// From upb_refcounted.
-bool upb_def_isfrozen(const upb_def *def);
-void upb_def_ref(const upb_def *def, const void *owner);
-void upb_def_unref(const upb_def *def, const void *owner);
-void upb_def_donateref(const upb_def *def, const void *from, const void *to);
-void upb_def_checkref(const upb_def *def, const void *owner);
+/* Include upb_refcounted methods like upb_def_ref()/upb_def_unref(). */
+UPB_REFCOUNTED_CMETHODS(upb_def, upb_def_upcast)
 
 upb_deftype_t upb_def_type(const upb_def *d);
 const char *upb_def_fullname(const upb_def *d);
 bool upb_def_setfullname(upb_def *def, const char *fullname, upb_status *s);
 bool upb_def_freeze(upb_def *const *defs, int n, upb_status *s);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 
 /* upb::Def casts *************************************************************/
@@ -1285,14 +1395,14 @@
   inline const cpptype *dyn_cast<const cpptype *, Def>(Def * def) {            \
     return upb_dyncast_##cname(def);                                           \
   }                                                                            \
-  }  // namespace upb
+  }  /* namespace upb */
 #else
 #define UPB_CPP_CASTS(cname, cpptype)
-#endif
+#endif  /* __cplusplus */
 
-// Dynamic casts, for determining if a def is of a particular type at runtime.
-// Downcasts, for when some wants to assert that a def is of a particular type.
-// These are only checked if we are building debug.
+/* Dynamic casts, for determining if a def is of a particular type at runtime.
+ * Downcasts, for when some wants to assert that a def is of a particular type.
+ * These are only checked if we are building debug. */
 #define UPB_DEF_CASTS(lower, upper, cpptype)                               \
   UPB_INLINE const upb_##lower *upb_dyncast_##lower(const upb_def *def) {  \
     if (upb_def_type(def) != UPB_DEF_##upper) return NULL;                 \
@@ -1311,16 +1421,30 @@
   UPB_CPP_CASTS(lower, cpptype)
 
 #define UPB_DEFINE_DEF(cppname, lower, upper, cppmethods, members)             \
-  UPB_DEFINE_CLASS2(cppname, upb::Def, upb::RefCounted, UPB_QUOTE(cppmethods), \
+  UPB_DEFINE_CLASS2(cppname, upb::Def, upb::RefCounted, cppmethods,            \
                    members)                                                    \
   UPB_DEF_CASTS(lower, upper, cppname)
 
+#define UPB_DECLARE_DEF_TYPE(cppname, lower, upper) \
+  UPB_DECLARE_DERIVED_TYPE2(cppname, upb::Def, upb::RefCounted, \
+                            upb_ ## lower, upb_def, upb_refcounted) \
+  UPB_DEF_CASTS(lower, upper, cppname)
+
+UPB_DECLARE_DEF_TYPE(upb::FieldDef, fielddef, FIELD)
+UPB_DECLARE_DEF_TYPE(upb::MessageDef, msgdef, MSG)
+UPB_DECLARE_DEF_TYPE(upb::EnumDef, enumdef, ENUM)
+UPB_DECLARE_DEF_TYPE(upb::OneofDef, oneofdef, ONEOF)
+
+#undef UPB_DECLARE_DEF_TYPE
+#undef UPB_DEF_CASTS
+#undef UPB_CPP_CASTS
+
 
 /* upb::FieldDef **************************************************************/
 
-// The types a field can have.  Note that this list is not identical to the
-// types defined in descriptor.proto, which gives INT32 and SINT32 separate
-// types (we distinguish the two with the "integer encoding" enum below).
+/* The types a field can have.  Note that this list is not identical to the
+ * types defined in descriptor.proto, which gives INT32 and SINT32 separate
+ * types (we distinguish the two with the "integer encoding" enum below). */
 typedef enum {
   UPB_TYPE_FLOAT    = 1,
   UPB_TYPE_DOUBLE   = 2,
@@ -1328,29 +1452,29 @@
   UPB_TYPE_STRING   = 4,
   UPB_TYPE_BYTES    = 5,
   UPB_TYPE_MESSAGE  = 6,
-  UPB_TYPE_ENUM     = 7,  // Enum values are int32.
+  UPB_TYPE_ENUM     = 7,  /* Enum values are int32. */
   UPB_TYPE_INT32    = 8,
   UPB_TYPE_UINT32   = 9,
   UPB_TYPE_INT64    = 10,
-  UPB_TYPE_UINT64   = 11,
+  UPB_TYPE_UINT64   = 11
 } upb_fieldtype_t;
 
-// The repeated-ness of each field; this matches descriptor.proto.
+/* The repeated-ness of each field; this matches descriptor.proto. */
 typedef enum {
   UPB_LABEL_OPTIONAL = 1,
   UPB_LABEL_REQUIRED = 2,
-  UPB_LABEL_REPEATED = 3,
+  UPB_LABEL_REPEATED = 3
 } upb_label_t;
 
-// How integers should be encoded in serializations that offer multiple
-// integer encoding methods.
+/* How integers should be encoded in serializations that offer multiple
+ * integer encoding methods. */
 typedef enum {
   UPB_INTFMT_VARIABLE = 1,
   UPB_INTFMT_FIXED = 2,
-  UPB_INTFMT_ZIGZAG = 3,  // Only for signed types (INT32/INT64).
+  UPB_INTFMT_ZIGZAG = 3   /* Only for signed types (INT32/INT64). */
 } upb_intfmt_t;
 
-// Descriptor types, as defined in descriptor.proto.
+/* Descriptor types, as defined in descriptor.proto. */
 typedef enum {
   UPB_DESCRIPTOR_TYPE_DOUBLE   = 1,
   UPB_DESCRIPTOR_TYPE_FLOAT    = 2,
@@ -1369,128 +1493,129 @@
   UPB_DESCRIPTOR_TYPE_SFIXED32 = 15,
   UPB_DESCRIPTOR_TYPE_SFIXED64 = 16,
   UPB_DESCRIPTOR_TYPE_SINT32   = 17,
-  UPB_DESCRIPTOR_TYPE_SINT64   = 18,
+  UPB_DESCRIPTOR_TYPE_SINT64   = 18
 } upb_descriptortype_t;
 
+/* Maximum field number allowed for FieldDefs.  This is an inherent limit of the
+ * protobuf wire format. */
+#define UPB_MAX_FIELDNUMBER ((1 << 29) - 1)
 
-// A upb_fielddef describes a single field in a message.  It is most often
-// found as a part of a upb_msgdef, but can also stand alone to represent
-// an extension.
-//
-// Its base class is upb::Def (use upb::upcast() to convert).
-UPB_DEFINE_DEF(upb::FieldDef, fielddef, FIELD,
+#ifdef __cplusplus
+
+/* A upb_fielddef describes a single field in a message.  It is most often
+ * found as a part of a upb_msgdef, but can also stand alone to represent
+ * an extension.
+ *
+ * Its base class is upb::Def (use upb::upcast() to convert). */
+class upb::FieldDef {
  public:
   typedef upb_fieldtype_t Type;
   typedef upb_label_t Label;
   typedef upb_intfmt_t IntegerFormat;
   typedef upb_descriptortype_t DescriptorType;
 
-  // These return true if the given value is a valid member of the enumeration.
+  /* These return true if the given value is a valid member of the enumeration. */
   static bool CheckType(int32_t val);
   static bool CheckLabel(int32_t val);
   static bool CheckDescriptorType(int32_t val);
   static bool CheckIntegerFormat(int32_t val);
 
-  // These convert to the given enumeration; they require that the value is
-  // valid.
+  /* These convert to the given enumeration; they require that the value is
+   * valid. */
   static Type ConvertType(int32_t val);
   static Label ConvertLabel(int32_t val);
   static DescriptorType ConvertDescriptorType(int32_t val);
   static IntegerFormat ConvertIntegerFormat(int32_t val);
 
-  // Returns NULL if memory allocation failed.
+  /* Returns NULL if memory allocation failed. */
   static reffed_ptr<FieldDef> New();
 
-  // Duplicates the given field, returning NULL if memory allocation failed.
-  // When a fielddef is duplicated, the subdef (if any) is made symbolic if it
-  // wasn't already.  If the subdef is set but has no name (which is possible
-  // since msgdefs are not required to have a name) the new fielddef's subdef
-  // will be unset.
+  /* Duplicates the given field, returning NULL if memory allocation failed.
+   * When a fielddef is duplicated, the subdef (if any) is made symbolic if it
+   * wasn't already.  If the subdef is set but has no name (which is possible
+   * since msgdefs are not required to have a name) the new fielddef's subdef
+   * will be unset. */
   FieldDef* Dup(const void* owner) const;
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void* from, const void* to) const;
-  void CheckRef(const void* owner) const;
+  /* upb::RefCounted methods like Ref()/Unref(). */
+  UPB_REFCOUNTED_CPPMETHODS
 
-  // Functionality from upb::Def.
+  /* Functionality from upb::Def. */
   const char* full_name() const;
 
-  bool type_is_set() const;  // Whether set_[descriptor_]type() has been called.
-  Type type() const;         // Requires that type_is_set() == true.
-  Label label() const;       // Defaults to UPB_LABEL_OPTIONAL.
-  const char* name() const;  // NULL if uninitialized.
-  uint32_t number() const;   // Returns 0 if uninitialized.
+  bool type_is_set() const;  /* set_[descriptor_]type() has been called? */
+  Type type() const;         /* Requires that type_is_set() == true. */
+  Label label() const;       /* Defaults to UPB_LABEL_OPTIONAL. */
+  const char* name() const;  /* NULL if uninitialized. */
+  uint32_t number() const;   /* Returns 0 if uninitialized. */
   bool is_extension() const;
 
-  // For UPB_TYPE_MESSAGE fields only where is_tag_delimited() == false,
-  // indicates whether this field should have lazy parsing handlers that yield
-  // the unparsed string for the submessage.
-  //
-  // TODO(haberman): I think we want to move this into a FieldOptions container
-  // when we add support for custom options (the FieldOptions struct will
-  // contain both regular FieldOptions like "lazy" *and* custom options).
+  /* For UPB_TYPE_MESSAGE fields only where is_tag_delimited() == false,
+   * indicates whether this field should have lazy parsing handlers that yield
+   * the unparsed string for the submessage.
+   *
+   * TODO(haberman): I think we want to move this into a FieldOptions container
+   * when we add support for custom options (the FieldOptions struct will
+   * contain both regular FieldOptions like "lazy" *and* custom options). */
   bool lazy() const;
 
-  // For non-string, non-submessage fields, this indicates whether binary
-  // protobufs are encoded in packed or non-packed format.
-  //
-  // TODO(haberman): see note above about putting options like this into a
-  // FieldOptions container.
+  /* For non-string, non-submessage fields, this indicates whether binary
+   * protobufs are encoded in packed or non-packed format.
+   *
+   * TODO(haberman): see note above about putting options like this into a
+   * FieldOptions container. */
   bool packed() const;
 
-  // An integer that can be used as an index into an array of fields for
-  // whatever message this field belongs to.  Guaranteed to be less than
-  // f->containing_type()->field_count().  May only be accessed once the def has
-  // been finalized.
+  /* An integer that can be used as an index into an array of fields for
+   * whatever message this field belongs to.  Guaranteed to be less than
+   * f->containing_type()->field_count().  May only be accessed once the def has
+   * been finalized. */
   int index() const;
 
-  // The MessageDef to which this field belongs.
-  //
-  // If this field has been added to a MessageDef, that message can be retrieved
-  // directly (this is always the case for frozen FieldDefs).
-  //
-  // If the field has not yet been added to a MessageDef, you can set the name
-  // of the containing type symbolically instead.  This is mostly useful for
-  // extensions, where the extension is declared separately from the message.
+  /* The MessageDef to which this field belongs.
+   *
+   * If this field has been added to a MessageDef, that message can be retrieved
+   * directly (this is always the case for frozen FieldDefs).
+   *
+   * If the field has not yet been added to a MessageDef, you can set the name
+   * of the containing type symbolically instead.  This is mostly useful for
+   * extensions, where the extension is declared separately from the message. */
   const MessageDef* containing_type() const;
   const char* containing_type_name();
 
-  // The OneofDef to which this field belongs, or NULL if this field is not part
-  // of a oneof.
+  /* The OneofDef to which this field belongs, or NULL if this field is not part
+   * of a oneof. */
   const OneofDef* containing_oneof() const;
 
-  // The field's type according to the enum in descriptor.proto.  This is not
-  // the same as UPB_TYPE_*, because it distinguishes between (for example)
-  // INT32 and SINT32, whereas our "type" enum does not.  This return of
-  // descriptor_type() is a function of type(), integer_format(), and
-  // is_tag_delimited().  Likewise set_descriptor_type() sets all three
-  // appropriately.
+  /* The field's type according to the enum in descriptor.proto.  This is not
+   * the same as UPB_TYPE_*, because it distinguishes between (for example)
+   * INT32 and SINT32, whereas our "type" enum does not.  This return of
+   * descriptor_type() is a function of type(), integer_format(), and
+   * is_tag_delimited().  Likewise set_descriptor_type() sets all three
+   * appropriately. */
   DescriptorType descriptor_type() const;
 
-  // Convenient field type tests.
+  /* Convenient field type tests. */
   bool IsSubMessage() const;
   bool IsString() const;
   bool IsSequence() const;
   bool IsPrimitive() const;
   bool IsMap() const;
 
-  // How integers are encoded.  Only meaningful for integer types.
-  // Defaults to UPB_INTFMT_VARIABLE, and is reset when "type" changes.
+  /* How integers are encoded.  Only meaningful for integer types.
+   * Defaults to UPB_INTFMT_VARIABLE, and is reset when "type" changes. */
   IntegerFormat integer_format() const;
 
-  // Whether a submessage field is tag-delimited or not (if false, then
-  // length-delimited).  May only be set when type() == UPB_TYPE_MESSAGE.
+  /* Whether a submessage field is tag-delimited or not (if false, then
+   * length-delimited).  May only be set when type() == UPB_TYPE_MESSAGE. */
   bool is_tag_delimited() const;
 
-  // Returns the non-string default value for this fielddef, which may either
-  // be something the client set explicitly or the "default default" (0 for
-  // numbers, empty for strings).  The field's type indicates the type of the
-  // returned value, except for enum fields that are still mutable.
-  //
-  // Requires that the given function matches the field's current type.
+  /* Returns the non-string default value for this fielddef, which may either
+   * be something the client set explicitly or the "default default" (0 for
+   * numbers, empty for strings).  The field's type indicates the type of the
+   * returned value, except for enum fields that are still mutable.
+   *
+   * Requires that the given function matches the field's current type. */
   int64_t default_int64() const;
   int32_t default_int32() const;
   uint64_t default_uint64() const;
@@ -1499,83 +1624,81 @@
   float default_float() const;
   double default_double() const;
 
-  // The resulting string is always NULL-terminated.  If non-NULL, the length
-  // will be stored in *len.
+  /* The resulting string is always NULL-terminated.  If non-NULL, the length
+   * will be stored in *len. */
   const char *default_string(size_t* len) const;
 
-  // For frozen UPB_TYPE_ENUM fields, enum defaults can always be read as either
-  // string or int32, and both of these methods will always return true.
-  //
-  // For mutable UPB_TYPE_ENUM fields, the story is a bit more complicated.
-  // Enum defaults are unusual. They can be specified either as string or int32,
-  // but to be valid the enum must have that value as a member.  And if no
-  // default is specified, the "default default" comes from the EnumDef.
-  //
-  // We allow reading the default as either an int32 or a string, but only if
-  // we have a meaningful value to report.  We have a meaningful value if it was
-  // set explicitly, or if we could get the "default default" from the EnumDef.
-  // Also if you explicitly set the name and we find the number in the EnumDef
+  /* For frozen UPB_TYPE_ENUM fields, enum defaults can always be read as either
+   * string or int32, and both of these methods will always return true.
+   *
+   * For mutable UPB_TYPE_ENUM fields, the story is a bit more complicated.
+   * Enum defaults are unusual. They can be specified either as string or int32,
+   * but to be valid the enum must have that value as a member.  And if no
+   * default is specified, the "default default" comes from the EnumDef.
+   *
+   * We allow reading the default as either an int32 or a string, but only if
+   * we have a meaningful value to report.  We have a meaningful value if it was
+   * set explicitly, or if we could get the "default default" from the EnumDef.
+   * Also if you explicitly set the name and we find the number in the EnumDef */
   bool EnumHasStringDefault() const;
   bool EnumHasInt32Default() const;
 
-  // Submessage and enum fields must reference a "subdef", which is the
-  // upb::MessageDef or upb::EnumDef that defines their type.  Note that when
-  // the FieldDef is mutable it may not have a subdef *yet*, but this function
-  // still returns true to indicate that the field's type requires a subdef.
+  /* Submessage and enum fields must reference a "subdef", which is the
+   * upb::MessageDef or upb::EnumDef that defines their type.  Note that when
+   * the FieldDef is mutable it may not have a subdef *yet*, but this function
+   * still returns true to indicate that the field's type requires a subdef. */
   bool HasSubDef() const;
 
-  // Returns the enum or submessage def for this field, if any.  The field's
-  // type must match (ie. you may only call enum_subdef() for fields where
-  // type() == UPB_TYPE_ENUM).  Returns NULL if the subdef has not been set or
-  // is currently set symbolically.
+  /* Returns the enum or submessage def for this field, if any.  The field's
+   * type must match (ie. you may only call enum_subdef() for fields where
+   * type() == UPB_TYPE_ENUM).  Returns NULL if the subdef has not been set or
+   * is currently set symbolically. */
   const EnumDef* enum_subdef() const;
   const MessageDef* message_subdef() const;
 
-  // Returns the generic subdef for this field.  Requires that HasSubDef() (ie.
-  // only works for UPB_TYPE_ENUM and UPB_TYPE_MESSAGE fields).
+  /* Returns the generic subdef for this field.  Requires that HasSubDef() (ie.
+   * only works for UPB_TYPE_ENUM and UPB_TYPE_MESSAGE fields). */
   const Def* subdef() const;
 
-  // Returns the symbolic name of the subdef.  If the subdef is currently set
-  // unresolved (ie. set symbolically) returns the symbolic name.  If it has
-  // been resolved to a specific subdef, returns the name from that subdef.
+  /* Returns the symbolic name of the subdef.  If the subdef is currently set
+   * unresolved (ie. set symbolically) returns the symbolic name.  If it has
+   * been resolved to a specific subdef, returns the name from that subdef. */
   const char* subdef_name() const;
 
-  //////////////////////////////////////////////////////////////////////////////
-  // Setters (non-const methods), only valid for mutable FieldDefs!
-  //////////////////////////////////////////////////////////////////////////////
+  /* Setters (non-const methods), only valid for mutable FieldDefs! ***********/
 
   bool set_full_name(const char* fullname, upb::Status* s);
   bool set_full_name(const std::string& fullname, upb::Status* s);
 
-  // This may only be called if containing_type() == NULL (ie. the field has not
-  // been added to a message yet).
+  /* This may only be called if containing_type() == NULL (ie. the field has not
+   * been added to a message yet). */
   bool set_containing_type_name(const char *name, Status* status);
   bool set_containing_type_name(const std::string& name, Status* status);
 
-  // Defaults to false.  When we freeze, we ensure that this can only be true
-  // for length-delimited message fields.  Prior to freezing this can be true or
-  // false with no restrictions.
+  /* Defaults to false.  When we freeze, we ensure that this can only be true
+   * for length-delimited message fields.  Prior to freezing this can be true or
+   * false with no restrictions. */
   void set_lazy(bool lazy);
 
-  // Defaults to true.  Sets whether this field is encoded in packed format.
+  /* Defaults to true.  Sets whether this field is encoded in packed format. */
   void set_packed(bool packed);
 
-  // "type" or "descriptor_type" MUST be set explicitly before the fielddef is
-  // finalized.  These setters require that the enum value is valid; if the
-  // value did not come directly from an enum constant, the caller should
-  // validate it first with the functions above (CheckFieldType(), etc).
+  /* "type" or "descriptor_type" MUST be set explicitly before the fielddef is
+   * finalized.  These setters require that the enum value is valid; if the
+   * value did not come directly from an enum constant, the caller should
+   * validate it first with the functions above (CheckFieldType(), etc). */
   void set_type(Type type);
   void set_label(Label label);
   void set_descriptor_type(DescriptorType type);
   void set_is_extension(bool is_extension);
 
-  // "number" and "name" must be set before the FieldDef is added to a
-  // MessageDef, and may not be set after that.
-  //
-  // "name" is the same as full_name()/set_full_name(), but since fielddefs
-  // most often use simple, non-qualified names, we provide this accessor
-  // also.  Generally only extensions will want to think of this name as
-  // fully-qualified.
+  /* "number" and "name" must be set before the FieldDef is added to a
+   * MessageDef, and may not be set after that.
+   *
+   * "name" is the same as full_name()/set_full_name(), but since fielddefs
+   * most often use simple, non-qualified names, we provide this accessor
+   * also.  Generally only extensions will want to think of this name as
+   * fully-qualified. */
   bool set_number(uint32_t number, upb::Status* s);
   bool set_name(const char* name, upb::Status* s);
   bool set_name(const std::string& name, upb::Status* s);
@@ -1583,12 +1706,12 @@
   void set_integer_format(IntegerFormat format);
   bool set_tag_delimited(bool tag_delimited, upb::Status* s);
 
-  // Sets default value for the field.  The call must exactly match the type
-  // of the field.  Enum fields may use either setint32 or setstring to set
-  // the default numerically or symbolically, respectively, but symbolic
-  // defaults must be resolved before finalizing (see ResolveEnumDefault()).
-  //
-  // Changing the type of a field will reset its default.
+  /* Sets default value for the field.  The call must exactly match the type
+   * of the field.  Enum fields may use either setint32 or setstring to set
+   * the default numerically or symbolically, respectively, but symbolic
+   * defaults must be resolved before finalizing (see ResolveEnumDefault()).
+   *
+   * Changing the type of a field will reset its default. */
   void set_default_int64(int64_t val);
   void set_default_int32(int32_t val);
   void set_default_uint64(uint64_t val);
@@ -1600,15 +1723,15 @@
   bool set_default_string(const std::string &str, Status *s);
   void set_default_cstr(const char *str, Status *s);
 
-  // Before a fielddef is frozen, its subdef may be set either directly (with a
-  // upb::Def*) or symbolically.  Symbolic refs must be resolved before the
-  // containing msgdef can be frozen (see upb_resolve() above).  upb always
-  // guarantees that any def reachable from a live def will also be kept alive.
-  //
-  // Both methods require that upb_hassubdef(f) (so the type must be set prior
-  // to calling these methods).  Returns false if this is not the case, or if
-  // the given subdef is not of the correct type.  The subdef is reset if the
-  // field's type is changed.  The subdef can be set to NULL to clear it.
+  /* Before a fielddef is frozen, its subdef may be set either directly (with a
+   * upb::Def*) or symbolically.  Symbolic refs must be resolved before the
+   * containing msgdef can be frozen (see upb_resolve() above).  upb always
+   * guarantees that any def reachable from a live def will also be kept alive.
+   *
+   * Both methods require that upb_hassubdef(f) (so the type must be set prior
+   * to calling these methods).  Returns false if this is not the case, or if
+   * the given subdef is not of the correct type.  The subdef is reset if the
+   * field's type is changed.  The subdef can be set to NULL to clear it. */
   bool set_subdef(const Def* subdef, Status* s);
   bool set_enum_subdef(const EnumDef* subdef, Status* s);
   bool set_message_subdef(const MessageDef* subdef, Status* s);
@@ -1616,66 +1739,21 @@
   bool set_subdef_name(const std::string &name, Status* s);
 
  private:
-  UPB_DISALLOW_POD_OPS(FieldDef, upb::FieldDef);
-,
-UPB_DEFINE_STRUCT(upb_fielddef, upb_def,
-  union {
-    int64_t sint;
-    uint64_t uint;
-    double dbl;
-    float flt;
-    void *bytes;
-  } defaultval;
-  union {
-    const upb_msgdef *def;  // If !msg_is_symbolic.
-    char *name;             // If msg_is_symbolic.
-  } msg;
-  union {
-    const upb_def *def;  // If !subdef_is_symbolic.
-    char *name;          // If subdef_is_symbolic.
-  } sub;  // The msgdef or enumdef for this field, if upb_hassubdef(f).
-  bool subdef_is_symbolic;
-  bool msg_is_symbolic;
-  const upb_oneofdef *oneof;
-  bool default_is_string;
-  bool type_is_set_;     // False until type is explicitly set.
-  bool is_extension_;
-  bool lazy_;
-  bool packed_;
-  upb_intfmt_t intfmt;
-  bool tagdelim;
-  upb_fieldtype_t type_;
-  upb_label_t label_;
-  uint32_t number_;
-  uint32_t selector_base;  // Used to index into a upb::Handlers table.
-  uint32_t index_;
-));
+  UPB_DISALLOW_POD_OPS(FieldDef, upb::FieldDef)
+};
 
-#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy,   \
-                          packed, name, num, msgdef, subdef, selector_base,    \
-                          index, defaultval, refs, ref2s)                      \
-  {                                                                            \
-    UPB_DEF_INIT(name, UPB_DEF_FIELD, refs, ref2s), defaultval, {msgdef},      \
-        {subdef}, NULL, false, false,                                          \
-        type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
-        lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
-  }
+# endif  /* defined(__cplusplus) */
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
-// Native C API.
+/* Native C API. */
 upb_fielddef *upb_fielddef_new(const void *owner);
 upb_fielddef *upb_fielddef_dup(const upb_fielddef *f, const void *owner);
 
-// From upb_refcounted.
-bool upb_fielddef_isfrozen(const upb_fielddef *f);
-void upb_fielddef_ref(const upb_fielddef *f, const void *owner);
-void upb_fielddef_unref(const upb_fielddef *f, const void *owner);
-void upb_fielddef_donateref(const upb_fielddef *f, const void *from,
-                            const void *to);
-void upb_fielddef_checkref(const upb_fielddef *f, const void *owner);
+/* Include upb_refcounted methods like upb_fielddef_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_fielddef, upb_fielddef_upcast2)
 
-// From upb_def.
+/* Methods from upb_def. */
 const char *upb_fielddef_fullname(const upb_fielddef *f);
 bool upb_fielddef_setfullname(upb_fielddef *f, const char *fullname,
                               upb_status *s);
@@ -1754,7 +1832,7 @@
 bool upb_fielddef_checkdescriptortype(int32_t type);
 bool upb_fielddef_checkintfmt(int32_t fmt);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 
 /* upb::MessageDef ************************************************************/
@@ -1762,66 +1840,64 @@
 typedef upb_inttable_iter upb_msg_field_iter;
 typedef upb_strtable_iter upb_msg_oneof_iter;
 
-// Structure that describes a single .proto message type.
-//
-// Its base class is upb::Def (use upb::upcast() to convert).
-UPB_DEFINE_DEF(upb::MessageDef, msgdef, MSG, UPB_QUOTE(
+#ifdef __cplusplus
+
+/* Structure that describes a single .proto message type.
+ *
+ * Its base class is upb::Def (use upb::upcast() to convert). */
+class upb::MessageDef {
  public:
-  // Returns NULL if memory allocation failed.
+  /* Returns NULL if memory allocation failed. */
   static reffed_ptr<MessageDef> New();
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void* from, const void* to) const;
-  void CheckRef(const void* owner) const;
+  /* upb::RefCounted methods like Ref()/Unref(). */
+  UPB_REFCOUNTED_CPPMETHODS
 
-  // Functionality from upb::Def.
+  /* Functionality from upb::Def. */
   const char* full_name() const;
   bool set_full_name(const char* fullname, Status* s);
   bool set_full_name(const std::string& fullname, Status* s);
 
-  // Call to freeze this MessageDef.
-  // WARNING: this will fail if this message has any unfrozen submessages!
-  // Messages with cycles must be frozen as a batch using upb::Def::Freeze().
+  /* Call to freeze this MessageDef.
+   * WARNING: this will fail if this message has any unfrozen submessages!
+   * Messages with cycles must be frozen as a batch using upb::Def::Freeze(). */
   bool Freeze(Status* s);
 
-  // The number of fields that belong to the MessageDef.
+  /* The number of fields that belong to the MessageDef. */
   int field_count() const;
 
-  // The number of oneofs that belong to the MessageDef.
+  /* The number of oneofs that belong to the MessageDef. */
   int oneof_count() const;
 
-  // Adds a field (upb_fielddef object) to a msgdef.  Requires that the msgdef
-  // and the fielddefs are mutable.  The fielddef's name and number must be
-  // set, and the message may not already contain any field with this name or
-  // number, and this fielddef may not be part of another message.  In error
-  // cases false is returned and the msgdef is unchanged.
-  //
-  // If the given field is part of a oneof, this call succeeds if and only if
-  // that oneof is already part of this msgdef. (Note that adding a oneof to a
-  // msgdef automatically adds all of its fields to the msgdef at the time that
-  // the oneof is added, so it is usually more idiomatic to add the oneof's
-  // fields first then add the oneof to the msgdef. This case is supported for
-  // convenience.)
-  //
-  // If |f| is already part of this MessageDef, this method performs no action
-  // and returns true (success). Thus, this method is idempotent.
+  /* Adds a field (upb_fielddef object) to a msgdef.  Requires that the msgdef
+   * and the fielddefs are mutable.  The fielddef's name and number must be
+   * set, and the message may not already contain any field with this name or
+   * number, and this fielddef may not be part of another message.  In error
+   * cases false is returned and the msgdef is unchanged.
+   *
+   * If the given field is part of a oneof, this call succeeds if and only if
+   * that oneof is already part of this msgdef. (Note that adding a oneof to a
+   * msgdef automatically adds all of its fields to the msgdef at the time that
+   * the oneof is added, so it is usually more idiomatic to add the oneof's
+   * fields first then add the oneof to the msgdef. This case is supported for
+   * convenience.)
+   *
+   * If |f| is already part of this MessageDef, this method performs no action
+   * and returns true (success). Thus, this method is idempotent. */
   bool AddField(FieldDef* f, Status* s);
   bool AddField(const reffed_ptr<FieldDef>& f, Status* s);
 
-  // Adds a oneof (upb_oneofdef object) to a msgdef. Requires that the msgdef,
-  // oneof, and any fielddefs are mutable, that the fielddefs contained in the
-  // oneof do not have any name or number conflicts with existing fields in the
-  // msgdef, and that the oneof's name is unique among all oneofs in the msgdef.
-  // If the oneof is added successfully, all of its fields will be added
-  // directly to the msgdef as well. In error cases, false is returned and the
-  // msgdef is unchanged.
+  /* Adds a oneof (upb_oneofdef object) to a msgdef. Requires that the msgdef,
+   * oneof, and any fielddefs are mutable, that the fielddefs contained in the
+   * oneof do not have any name or number conflicts with existing fields in the
+   * msgdef, and that the oneof's name is unique among all oneofs in the msgdef.
+   * If the oneof is added successfully, all of its fields will be added
+   * directly to the msgdef as well. In error cases, false is returned and the
+   * msgdef is unchanged. */
   bool AddOneof(OneofDef* o, Status* s);
   bool AddOneof(const reffed_ptr<OneofDef>& o, Status* s);
 
-  // These return NULL if the field is not found.
+  /* These return NULL if the field is not found. */
   FieldDef* FindFieldByNumber(uint32_t number);
   FieldDef* FindFieldByName(const char *name, size_t len);
   const FieldDef* FindFieldByNumber(uint32_t number) const;
@@ -1863,21 +1939,21 @@
     return FindOneofByName(str.c_str(), str.size());
   }
 
-  // Returns a new msgdef that is a copy of the given msgdef (and a copy of all
-  // the fields) but with any references to submessages broken and replaced
-  // with just the name of the submessage.  Returns NULL if memory allocation
-  // failed.
-  //
-  // TODO(haberman): which is more useful, keeping fields resolved or
-  // unresolving them?  If there's no obvious answer, Should this functionality
-  // just be moved into symtab.c?
+  /* Returns a new msgdef that is a copy of the given msgdef (and a copy of all
+   * the fields) but with any references to submessages broken and replaced
+   * with just the name of the submessage.  Returns NULL if memory allocation
+   * failed.
+   *
+   * TODO(haberman): which is more useful, keeping fields resolved or
+   * unresolving them?  If there's no obvious answer, Should this functionality
+   * just be moved into symtab.c? */
   MessageDef* Dup(const void* owner) const;
 
-  // Is this message a map entry?
+  /* Is this message a map entry? */
   void setmapentry(bool map_entry);
   bool mapentry() const;
 
-  // Iteration over fields.  The order is undefined.
+  /* Iteration over fields.  The order is undefined. */
   class field_iterator
       : public std::iterator<std::forward_iterator_tag, FieldDef*> {
    public:
@@ -1908,7 +1984,7 @@
     upb_msg_field_iter iter_;
   };
 
-  // Iteration over oneofs. The order is undefined.
+  /* Iteration over oneofs. The order is undefined. */
   class oneof_iterator
       : public std::iterator<std::forward_iterator_tag, FieldDef*> {
    public:
@@ -1991,52 +2067,21 @@
   ConstOneofAccessor oneofs() const { return ConstOneofAccessor(this); }
 
  private:
-  UPB_DISALLOW_POD_OPS(MessageDef, upb::MessageDef);
-),
-UPB_DEFINE_STRUCT(upb_msgdef, upb_def,
-  size_t selector_count;
-  uint32_t submsg_field_count;
+  UPB_DISALLOW_POD_OPS(MessageDef, upb::MessageDef)
+};
 
-  // Tables for looking up fields by number and name.
-  upb_inttable itof;  // int to field
-  upb_strtable ntof;  // name to field
+#endif  /* __cplusplus */
 
-  // Tables for looking up oneofs by name.
-  upb_strtable ntoo;  // name to oneof
+UPB_BEGIN_EXTERN_C
 
-  // Is this a map-entry message?
-  // TODO: set this flag properly for static descriptors; regenerate
-  // descriptor.upb.c.
-  bool map_entry;
-
-  // TODO(haberman): proper extension ranges (there can be multiple).
-));
-
-// TODO: also support static initialization of the oneofs table. This will be
-// needed if we compile in descriptors that contain oneofs.
-#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
-                        refs, ref2s)                                          \
-  {                                                                           \
-    UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count,             \
-        submsg_field_count, itof, ntof,                                       \
-        UPB_EMPTY_STRTABLE_INIT(UPB_CTYPE_PTR), false                         \
-  }
-
-UPB_BEGIN_EXTERN_C  // {
-
-// Returns NULL if memory allocation failed.
+/* Returns NULL if memory allocation failed. */
 upb_msgdef *upb_msgdef_new(const void *owner);
 
-// From upb_refcounted.
-bool upb_msgdef_isfrozen(const upb_msgdef *m);
-void upb_msgdef_ref(const upb_msgdef *m, const void *owner);
-void upb_msgdef_unref(const upb_msgdef *m, const void *owner);
-void upb_msgdef_donateref(const upb_msgdef *m, const void *from,
-                          const void *to);
-void upb_msgdef_checkref(const upb_msgdef *m, const void *owner);
+/* Include upb_refcounted methods like upb_msgdef_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_msgdef, upb_msgdef_upcast2)
+
 bool upb_msgdef_freeze(upb_msgdef *m, upb_status *status);
 
-// From upb_def.
 const char *upb_msgdef_fullname(const upb_msgdef *m);
 bool upb_msgdef_setfullname(upb_msgdef *m, const char *fullname, upb_status *s);
 
@@ -2046,10 +2091,10 @@
 bool upb_msgdef_addoneof(upb_msgdef *m, upb_oneofdef *o, const void *ref_donor,
                          upb_status *s);
 
-// Field lookup in a couple of different variations:
-//   - itof = int to field
-//   - ntof = name to field
-//   - ntofz = name to field, null-terminated string.
+/* Field lookup in a couple of different variations:
+ *   - itof = int to field
+ *   - ntof = name to field
+ *   - ntofz = name to field, null-terminated string. */
 const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i);
 const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name,
                                     size_t len);
@@ -2069,9 +2114,9 @@
   return (upb_fielddef *)upb_msgdef_ntof(m, name, len);
 }
 
-// Oneof lookup:
-//   - ntoo = name to oneof
-//   - ntooz = name to oneof, null-terminated string.
+/* Oneof lookup:
+ *   - ntoo = name to oneof
+ *   - ntooz = name to oneof, null-terminated string. */
 const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name,
                                     size_t len);
 int upb_msgdef_numoneofs(const upb_msgdef *m);
@@ -2089,7 +2134,7 @@
 void upb_msgdef_setmapentry(upb_msgdef *m, bool map_entry);
 bool upb_msgdef_mapentry(const upb_msgdef *m);
 
-// Well-known field tag numbers for map-entry messages.
+/* Well-known field tag numbers for map-entry messages. */
 #define UPB_MAPENTRY_KEY   1
 #define UPB_MAPENTRY_VALUE 2
 
@@ -2097,95 +2142,94 @@
                                           const char *name);
 int upb_msgdef_numoneofs(const upb_msgdef *m);
 
-// upb_msg_field_iter i;
-// for(upb_msg_field_begin(&i, m);
-//     !upb_msg_field_done(&i);
-//     upb_msg_field_next(&i)) {
-//   upb_fielddef *f = upb_msg_iter_field(&i);
-//   // ...
-// }
-//
-// For C we don't have separate iterators for const and non-const.
-// It is the caller's responsibility to cast the upb_fielddef* to
-// const if the upb_msgdef* is const.
+/* upb_msg_field_iter i;
+ * for(upb_msg_field_begin(&i, m);
+ *     !upb_msg_field_done(&i);
+ *     upb_msg_field_next(&i)) {
+ *   upb_fielddef *f = upb_msg_iter_field(&i);
+ *   // ...
+ * }
+ *
+ * For C we don't have separate iterators for const and non-const.
+ * It is the caller's responsibility to cast the upb_fielddef* to
+ * const if the upb_msgdef* is const. */
 void upb_msg_field_begin(upb_msg_field_iter *iter, const upb_msgdef *m);
 void upb_msg_field_next(upb_msg_field_iter *iter);
 bool upb_msg_field_done(const upb_msg_field_iter *iter);
 upb_fielddef *upb_msg_iter_field(const upb_msg_field_iter *iter);
 void upb_msg_field_iter_setdone(upb_msg_field_iter *iter);
 
-// Similar to above, we also support iterating through the oneofs in a msgdef.
+/* Similar to above, we also support iterating through the oneofs in a
+ * msgdef. */
 void upb_msg_oneof_begin(upb_msg_oneof_iter *iter, const upb_msgdef *m);
 void upb_msg_oneof_next(upb_msg_oneof_iter *iter);
 bool upb_msg_oneof_done(const upb_msg_oneof_iter *iter);
 upb_oneofdef *upb_msg_iter_oneof(const upb_msg_oneof_iter *iter);
 void upb_msg_oneof_iter_setdone(upb_msg_oneof_iter *iter);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 
 /* upb::EnumDef ***************************************************************/
 
 typedef upb_strtable_iter upb_enum_iter;
 
-// Class that represents an enum.  Its base class is upb::Def (convert with
-// upb::upcast()).
-UPB_DEFINE_DEF(upb::EnumDef, enumdef, ENUM,
+#ifdef __cplusplus
+
+/* Class that represents an enum.  Its base class is upb::Def (convert with
+ * upb::upcast()). */
+class upb::EnumDef {
  public:
-  // Returns NULL if memory allocation failed.
+  /* Returns NULL if memory allocation failed. */
   static reffed_ptr<EnumDef> New();
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void* from, const void* to) const;
-  void CheckRef(const void* owner) const;
+  /* upb::RefCounted methods like Ref()/Unref(). */
+  UPB_REFCOUNTED_CPPMETHODS
 
-  // Functionality from upb::Def.
+  /* Functionality from upb::Def. */
   const char* full_name() const;
   bool set_full_name(const char* fullname, Status* s);
   bool set_full_name(const std::string& fullname, Status* s);
 
-  // Call to freeze this EnumDef.
+  /* Call to freeze this EnumDef. */
   bool Freeze(Status* s);
 
-  // The value that is used as the default when no field default is specified.
-  // If not set explicitly, the first value that was added will be used.
-  // The default value must be a member of the enum.
-  // Requires that value_count() > 0.
+  /* The value that is used as the default when no field default is specified.
+   * If not set explicitly, the first value that was added will be used.
+   * The default value must be a member of the enum.
+   * Requires that value_count() > 0. */
   int32_t default_value() const;
 
-  // Sets the default value.  If this value is not valid, returns false and an
-  // error message in status.
+  /* Sets the default value.  If this value is not valid, returns false and an
+   * error message in status. */
   bool set_default_value(int32_t val, Status* status);
 
-  // Returns the number of values currently defined in the enum.  Note that
-  // multiple names can refer to the same number, so this may be greater than
-  // the total number of unique numbers.
+  /* Returns the number of values currently defined in the enum.  Note that
+   * multiple names can refer to the same number, so this may be greater than
+   * the total number of unique numbers. */
   int value_count() const;
 
-  // Adds a single name/number pair to the enum.  Fails if this name has
-  // already been used by another value.
+  /* Adds a single name/number pair to the enum.  Fails if this name has
+   * already been used by another value. */
   bool AddValue(const char* name, int32_t num, Status* status);
   bool AddValue(const std::string& name, int32_t num, Status* status);
 
-  // Lookups from name to integer, returning true if found.
+  /* Lookups from name to integer, returning true if found. */
   bool FindValueByName(const char* name, int32_t* num) const;
 
-  // Finds the name corresponding to the given number, or NULL if none was
-  // found.  If more than one name corresponds to this number, returns the
-  // first one that was added.
+  /* Finds the name corresponding to the given number, or NULL if none was
+   * found.  If more than one name corresponds to this number, returns the
+   * first one that was added. */
   const char* FindValueByNumber(int32_t num) const;
 
-  // Returns a new EnumDef with all the same values.  The new EnumDef will be
-  // owned by the given owner.
+  /* Returns a new EnumDef with all the same values.  The new EnumDef will be
+   * owned by the given owner. */
   EnumDef* Dup(const void* owner) const;
 
-  // Iteration over name/value pairs.  The order is undefined.
-  // Adding an enum val invalidates any iterators.
-  //
-  // TODO: make compatible with range-for, with elements as pairs?
+  /* Iteration over name/value pairs.  The order is undefined.
+   * Adding an enum val invalidates any iterators.
+   *
+   * TODO: make compatible with range-for, with elements as pairs? */
   class Iterator {
    public:
     explicit Iterator(const EnumDef*);
@@ -2200,33 +2244,23 @@
   };
 
  private:
-  UPB_DISALLOW_POD_OPS(EnumDef, upb::EnumDef);
-,
-UPB_DEFINE_STRUCT(upb_enumdef, upb_def,
-  upb_strtable ntoi;
-  upb_inttable iton;
-  int32_t defaultval;
-));
+  UPB_DISALLOW_POD_OPS(EnumDef, upb::EnumDef)
+};
 
-#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
-  { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntoi, iton, defaultval }
+#endif  /* __cplusplus */
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
-// Native C API.
+/* Native C API. */
 upb_enumdef *upb_enumdef_new(const void *owner);
 upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner);
 
-// From upb_refcounted.
-void upb_enumdef_unref(const upb_enumdef *e, const void *owner);
-bool upb_enumdef_isfrozen(const upb_enumdef *e);
-void upb_enumdef_ref(const upb_enumdef *e, const void *owner);
-void upb_enumdef_donateref(const upb_enumdef *m, const void *from,
-                           const void *to);
-void upb_enumdef_checkref(const upb_enumdef *e, const void *owner);
+/* Include upb_refcounted methods like upb_enumdef_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_enumdef, upb_enumdef_upcast2)
+
 bool upb_enumdef_freeze(upb_enumdef *e, upb_status *status);
 
-// From upb_def.
+/* From upb_def. */
 const char *upb_enumdef_fullname(const upb_enumdef *e);
 bool upb_enumdef_setfullname(upb_enumdef *e, const char *fullname,
                              upb_status *s);
@@ -2237,10 +2271,11 @@
 bool upb_enumdef_addval(upb_enumdef *e, const char *name, int32_t num,
                         upb_status *status);
 
-// Enum lookups:
-// - ntoi:  look up a name with specified length.
-// - ntoiz: look up a name provided as a null-terminated string.
-// - iton:  look up an integer, returning the name as a null-terminated string.
+/* Enum lookups:
+ * - ntoi:  look up a name with specified length.
+ * - ntoiz: look up a name provided as a null-terminated string.
+ * - iton:  look up an integer, returning the name as a null-terminated
+ *          string. */
 bool upb_enumdef_ntoi(const upb_enumdef *e, const char *name, size_t len,
                       int32_t *num);
 UPB_INLINE bool upb_enumdef_ntoiz(const upb_enumdef *e,
@@ -2249,66 +2284,65 @@
 }
 const char *upb_enumdef_iton(const upb_enumdef *e, int32_t num);
 
-//  upb_enum_iter i;
-//  for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) {
-//    // ...
-//  }
+/*  upb_enum_iter i;
+ *  for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) {
+ *    // ...
+ *  }
+ */
 void upb_enum_begin(upb_enum_iter *iter, const upb_enumdef *e);
 void upb_enum_next(upb_enum_iter *iter);
 bool upb_enum_done(upb_enum_iter *iter);
 const char *upb_enum_iter_name(upb_enum_iter *iter);
 int32_t upb_enum_iter_number(upb_enum_iter *iter);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 /* upb::OneofDef **************************************************************/
 
 typedef upb_inttable_iter upb_oneof_iter;
 
-// Class that represents a oneof.  Its base class is upb::Def (convert with
-// upb::upcast()).
-UPB_DEFINE_DEF(upb::OneofDef, oneofdef, ONEOF, UPB_QUOTE(
+#ifdef __cplusplus
+
+/* Class that represents a oneof.  Its base class is upb::Def (convert with
+ * upb::upcast()). */
+class upb::OneofDef {
  public:
-  // Returns NULL if memory allocation failed.
+  /* Returns NULL if memory allocation failed. */
   static reffed_ptr<OneofDef> New();
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void* from, const void* to) const;
-  void CheckRef(const void* owner) const;
+  /* upb::RefCounted methods like Ref()/Unref(). */
+  UPB_REFCOUNTED_CPPMETHODS
 
-  // Functionality from upb::Def.
+  /* Functionality from upb::Def. */
   const char* full_name() const;
 
-  // Returns the MessageDef that owns this OneofDef.
+  /* Returns the MessageDef that owns this OneofDef. */
   const MessageDef* containing_type() const;
 
-  // Returns the name of this oneof. This is the name used to look up the oneof
-  // by name once added to a message def.
+  /* Returns the name of this oneof. This is the name used to look up the oneof
+   * by name once added to a message def. */
   const char* name() const;
   bool set_name(const char* name, Status* s);
 
-  // Returns the number of fields currently defined in the oneof.
+  /* Returns the number of fields currently defined in the oneof. */
   int field_count() const;
 
-  // Adds a field to the oneof. The field must not have been added to any other
-  // oneof or msgdef. If the oneof is not yet part of a msgdef, then when the
-  // oneof is eventually added to a msgdef, all fields added to the oneof will
-  // also be added to the msgdef at that time. If the oneof is already part of a
-  // msgdef, the field must either be a part of that msgdef already, or must not
-  // be a part of any msgdef; in the latter case, the field is added to the
-  // msgdef as a part of this operation.
-  //
-  // The field may only have an OPTIONAL label, never REQUIRED or REPEATED.
-  //
-  // If |f| is already part of this MessageDef, this method performs no action
-  // and returns true (success). Thus, this method is idempotent.
+  /* Adds a field to the oneof. The field must not have been added to any other
+   * oneof or msgdef. If the oneof is not yet part of a msgdef, then when the
+   * oneof is eventually added to a msgdef, all fields added to the oneof will
+   * also be added to the msgdef at that time. If the oneof is already part of a
+   * msgdef, the field must either be a part of that msgdef already, or must not
+   * be a part of any msgdef; in the latter case, the field is added to the
+   * msgdef as a part of this operation.
+   *
+   * The field may only have an OPTIONAL label, never REQUIRED or REPEATED.
+   *
+   * If |f| is already part of this MessageDef, this method performs no action
+   * and returns true (success). Thus, this method is idempotent. */
   bool AddField(FieldDef* field, Status* s);
   bool AddField(const reffed_ptr<FieldDef>& field, Status* s);
 
-  // Looks up by name.
+  /* Looks up by name. */
   const FieldDef* FindFieldByName(const char* name, size_t len) const;
   FieldDef* FindFieldByName(const char* name, size_t len);
   const FieldDef* FindFieldByName(const char* name) const {
@@ -2327,14 +2361,14 @@
     return FindFieldByName(str.c_str(), str.size());
   }
 
-  // Looks up by tag number.
+  /* Looks up by tag number. */
   const FieldDef* FindFieldByNumber(uint32_t num) const;
 
-  // Returns a new OneofDef with all the same fields. The OneofDef will be owned
-  // by the given owner.
+  /* Returns a new OneofDef with all the same fields. The OneofDef will be owned
+   * by the given owner. */
   OneofDef* Dup(const void* owner) const;
 
-  // Iteration over fields.  The order is undefined.
+  /* Iteration over fields.  The order is undefined. */
   class iterator : public std::iterator<std::forward_iterator_tag, FieldDef*> {
    public:
     explicit iterator(OneofDef* md);
@@ -2370,30 +2404,19 @@
   const_iterator end() const;
 
  private:
-  UPB_DISALLOW_POD_OPS(OneofDef, upb::OneofDef);
-),
-UPB_DEFINE_STRUCT(upb_oneofdef, upb_def,
-  upb_strtable ntof;
-  upb_inttable itof;
-  const upb_msgdef *parent;
-));
+  UPB_DISALLOW_POD_OPS(OneofDef, upb::OneofDef)
+};
 
-#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
-  { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntof, itof }
+#endif  /* __cplusplus */
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
-// Native C API.
+/* Native C API. */
 upb_oneofdef *upb_oneofdef_new(const void *owner);
 upb_oneofdef *upb_oneofdef_dup(const upb_oneofdef *o, const void *owner);
 
-// From upb_refcounted.
-void upb_oneofdef_unref(const upb_oneofdef *o, const void *owner);
-bool upb_oneofdef_isfrozen(const upb_oneofdef *e);
-void upb_oneofdef_ref(const upb_oneofdef *o, const void *owner);
-void upb_oneofdef_donateref(const upb_oneofdef *m, const void *from,
-                           const void *to);
-void upb_oneofdef_checkref(const upb_oneofdef *o, const void *owner);
+/* Include upb_refcounted methods like upb_oneofdef_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_oneofdef, upb_oneofdef_upcast2)
 
 const char *upb_oneofdef_name(const upb_oneofdef *o);
 bool upb_oneofdef_setname(upb_oneofdef *o, const char *name, upb_status *s);
@@ -2404,10 +2427,10 @@
                            const void *ref_donor,
                            upb_status *s);
 
-// Oneof lookups:
-// - ntof:  look up a field by name.
-// - ntofz: look up a field by name (as a null-terminated string).
-// - itof:  look up a field by number.
+/* Oneof lookups:
+ * - ntof:  look up a field by name.
+ * - ntofz: look up a field by name (as a null-terminated string).
+ * - itof:  look up a field by number. */
 const upb_fielddef *upb_oneofdef_ntof(const upb_oneofdef *o,
                                       const char *name, size_t length);
 UPB_INLINE const upb_fielddef *upb_oneofdef_ntofz(const upb_oneofdef *o,
@@ -2416,17 +2439,18 @@
 }
 const upb_fielddef *upb_oneofdef_itof(const upb_oneofdef *o, uint32_t num);
 
-//  upb_oneof_iter i;
-//  for(upb_oneof_begin(&i, e); !upb_oneof_done(&i); upb_oneof_next(&i)) {
-//    // ...
-//  }
+/*  upb_oneof_iter i;
+ *  for(upb_oneof_begin(&i, e); !upb_oneof_done(&i); upb_oneof_next(&i)) {
+ *    // ...
+ *  }
+ */
 void upb_oneof_begin(upb_oneof_iter *iter, const upb_oneofdef *o);
 void upb_oneof_next(upb_oneof_iter *iter);
 bool upb_oneof_done(upb_oneof_iter *iter);
 upb_fielddef *upb_oneof_iter_field(const upb_oneof_iter *iter);
 void upb_oneof_iter_setdone(upb_oneof_iter *iter);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 #ifdef __cplusplus
 
@@ -2435,21 +2459,12 @@
   return str.c_str();
 }
 
-// Inline C++ wrappers.
+/* Inline C++ wrappers. */
 namespace upb {
 
 inline Def* Def::Dup(const void* owner) const {
   return upb_def_dup(this, owner);
 }
-inline bool Def::IsFrozen() const { return upb_def_isfrozen(this); }
-inline void Def::Ref(const void* owner) const { upb_def_ref(this, owner); }
-inline void Def::Unref(const void* owner) const { upb_def_unref(this, owner); }
-inline void Def::DonateRef(const void* from, const void* to) const {
-  upb_def_donateref(this, from, to);
-}
-inline void Def::CheckRef(const void* owner) const {
-  upb_def_checkref(this, owner);
-}
 inline Def::Type Def::def_type() const { return upb_def_type(this); }
 inline const char* Def::full_name() const { return upb_def_fullname(this); }
 inline bool Def::set_full_name(const char* fullname, Status* s) {
@@ -2501,19 +2516,6 @@
 inline FieldDef* FieldDef::Dup(const void* owner) const {
   return upb_fielddef_dup(this, owner);
 }
-inline bool FieldDef::IsFrozen() const { return upb_fielddef_isfrozen(this); }
-inline void FieldDef::Ref(const void* owner) const {
-  upb_fielddef_ref(this, owner);
-}
-inline void FieldDef::Unref(const void* owner) const {
-  upb_fielddef_unref(this, owner);
-}
-inline void FieldDef::DonateRef(const void* from, const void* to) const {
-  upb_fielddef_donateref(this, from, to);
-}
-inline void FieldDef::CheckRef(const void* owner) const {
-  upb_fielddef_checkref(this, owner);
-}
 inline const char* FieldDef::full_name() const {
   return upb_fielddef_fullname(this);
 }
@@ -2679,19 +2681,6 @@
   upb_msgdef *m = upb_msgdef_new(&m);
   return reffed_ptr<MessageDef>(m, &m);
 }
-inline bool MessageDef::IsFrozen() const { return upb_msgdef_isfrozen(this); }
-inline void MessageDef::Ref(const void* owner) const {
-  return upb_msgdef_ref(this, owner);
-}
-inline void MessageDef::Unref(const void* owner) const {
-  return upb_msgdef_unref(this, owner);
-}
-inline void MessageDef::DonateRef(const void* from, const void* to) const {
-  return upb_msgdef_donateref(this, from, to);
-}
-inline void MessageDef::CheckRef(const void* owner) const {
-  return upb_msgdef_checkref(this, owner);
-}
 inline const char *MessageDef::full_name() const {
   return upb_msgdef_fullname(this);
 }
@@ -2879,19 +2868,6 @@
   upb_enumdef *e = upb_enumdef_new(&e);
   return reffed_ptr<EnumDef>(e, &e);
 }
-inline bool EnumDef::IsFrozen() const { return upb_enumdef_isfrozen(this); }
-inline void EnumDef::Ref(const void* owner) const {
-  return upb_enumdef_ref(this, owner);
-}
-inline void EnumDef::Unref(const void* owner) const {
-  return upb_enumdef_unref(this, owner);
-}
-inline void EnumDef::DonateRef(const void* from, const void* to) const {
-  return upb_enumdef_donateref(this, from, to);
-}
-inline void EnumDef::CheckRef(const void* owner) const {
-  return upb_enumdef_checkref(this, owner);
-}
 inline const char* EnumDef::full_name() const {
   return upb_enumdef_fullname(this);
 }
@@ -2944,19 +2920,6 @@
   upb_oneofdef *o = upb_oneofdef_new(&o);
   return reffed_ptr<OneofDef>(o, &o);
 }
-inline bool OneofDef::IsFrozen() const { return upb_oneofdef_isfrozen(this); }
-inline void OneofDef::Ref(const void* owner) const {
-  return upb_oneofdef_ref(this, owner);
-}
-inline void OneofDef::Unref(const void* owner) const {
-  return upb_oneofdef_unref(this, owner);
-}
-inline void OneofDef::DonateRef(const void* from, const void* to) const {
-  return upb_oneofdef_donateref(this, from, to);
-}
-inline void OneofDef::CheckRef(const void* owner) const {
-  return upb_oneofdef_checkref(this, owner);
-}
 inline const char* OneofDef::full_name() const {
   return upb_oneofdef_name(this);
 }
@@ -3038,1027 +3001,185 @@
   return !(*this == other);
 }
 
-}  // namespace upb
+}  /* namespace upb */
 #endif
 
-#undef UPB_DEFINE_DEF
-#undef UPB_DEF_CASTS
-#undef UPB_CPP_CASTS
-
 #endif /* UPB_DEF_H_ */
-// This file contains accessors for a set of compiled-in defs.
-// Note that unlike Google's protobuf, it does *not* define
-// generated classes or any other kind of data structure for
-// actually storing protobufs.  It only contains *defs* which
-// let you reflect over a protobuf *schema*.
-//
-// This file was generated by upbc (the upb compiler).
-// Do not edit -- your changes will be discarded when the file is
-// regenerated.
-
-#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
-#define GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
-
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
- * Copyright (c) 2009-2012 Google Inc.  See LICENSE for details.
+ * Copyright (c) 2015 Google Inc.  See LICENSE for details.
  * Author: Josh Haberman <jhaberman@gmail.com>
  *
- * A symtab (symbol table) stores a name->def map of upb_defs.  Clients could
- * always create such tables themselves, but upb_symtab has logic for resolving
- * symbolic references, and in particular, for keeping a whole set of consistent
- * defs when replacing some subset of those defs.  This logic is nontrivial.
+ * This file contains definitions of structs that should be considered private
+ * and NOT stable across versions of upb.
  *
- * This is a mixed C/C++ interface that offers a full API to both languages.
- * See the top-level README for more information.
+ * The only reason they are declared here and not in .c files is to allow upb
+ * and the application (if desired) to embed statically-initialized instances
+ * of structures like defs.
+ *
+ * If you include this file, all guarantees of ABI compatibility go out the
+ * window!  Any code that includes this file needs to recompile against the
+ * exact same version of upb that they are linking against.
+ *
+ * You also need to recompile if you change the value of the UPB_DEBUG_REFS
+ * flag.
  */
 
-#ifndef UPB_SYMTAB_H_
-#define UPB_SYMTAB_H_
 
+#ifndef UPB_STATICINIT_H_
+#define UPB_STATICINIT_H_
 
 #ifdef __cplusplus
-#include <vector>
-namespace upb { class SymbolTable; }
+/* Because of how we do our typedefs, this header can't be included from C++. */
+#error This file cannot be included from C++
 #endif
 
-UPB_DECLARE_TYPE(upb::SymbolTable, upb_symtab);
+/* upb_refcounted *************************************************************/
 
-typedef struct {
- UPB_PRIVATE_FOR_CPP
-  upb_strtable_iter iter;
-  upb_deftype_t type;
-} upb_symtab_iter;
 
-// Non-const methods in upb::SymbolTable are NOT thread-safe.
-UPB_DEFINE_CLASS1(upb::SymbolTable, upb::RefCounted,
- public:
-  // Returns a new symbol table with a single ref owned by "owner."
-  // Returns NULL if memory allocation failed.
-  static reffed_ptr<SymbolTable> New();
+/* upb_def ********************************************************************/
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void *from, const void *to) const;
-  void CheckRef(const void *owner) const;
+struct upb_def {
+  upb_refcounted base;
 
-  // For all lookup functions, the returned pointer is not owned by the
-  // caller; it may be invalidated by any non-const call or unref of the
-  // SymbolTable!  To protect against this, take a ref if desired.
+  const char *fullname;
+  char type;  /* A upb_deftype_t (char to save space) */
 
-  // Freezes the symbol table: prevents further modification of it.
-  // After the Freeze() operation is successful, the SymbolTable must only be
-  // accessed via a const pointer.
-  //
-  // Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
-  // a necessary step in using a SymbolTable.  If you have no need for it to be
-  // immutable, there is no need to freeze it ever.  However sometimes it is
-  // useful, and SymbolTables that are statically compiled into the binary are
-  // always frozen by nature.
-  void Freeze();
+  /* Used as a flag during the def's mutable stage.  Must be false unless
+   * it is currently being used by a function on the stack.  This allows
+   * us to easily determine which defs were passed into the function's
+   * current invocation. */
+  bool came_from_user;
+};
 
-  // Resolves the given symbol using the rules described in descriptor.proto,
-  // namely:
-  //
-  //    If the name starts with a '.', it is fully-qualified.  Otherwise,
-  //    C++-like scoping rules are used to find the type (i.e. first the nested
-  //    types within this message are searched, then within the parent, on up
-  //    to the root namespace).
-  //
-  // If not found, returns NULL.
-  const Def* Resolve(const char* base, const char* sym) const;
+#define UPB_DEF_INIT(name, type, refs, ref2s) \
+    { UPB_REFCOUNT_INIT(refs, ref2s), name, type, false }
 
-  // Finds an entry in the symbol table with this exact name.  If not found,
-  // returns NULL.
-  const Def* Lookup(const char *sym) const;
-  const MessageDef* LookupMessage(const char *sym) const;
-  const EnumDef* LookupEnum(const char *sym) const;
 
-  // TODO: introduce a C++ iterator, but make it nice and templated so that if
-  // you ask for an iterator of MessageDef the iterated elements are strongly
-  // typed as MessageDef*.
+/* upb_fielddef ***************************************************************/
 
-  // Adds the given mutable defs to the symtab, resolving all symbols
-  // (including enum default values) and finalizing the defs.  Only one def per
-  // name may be in the list, but defs can replace existing defs in the symtab.
-  // All defs must have a name -- anonymous defs are not allowed.  Anonymous
-  // defs can still be frozen by calling upb_def_freeze() directly.
-  //
-  // Any existing defs that can reach defs that are being replaced will
-  // themselves be replaced also, so that the resulting set of defs is fully
-  // consistent.
-  //
-  // This logic implemented in this method is a convenience; ultimately it
-  // calls some combination of upb_fielddef_setsubdef(), upb_def_dup(), and
-  // upb_freeze(), any of which the client could call themself.  However, since
-  // the logic for doing so is nontrivial, we provide it here.
-  //
-  // The entire operation either succeeds or fails.  If the operation fails,
-  // the symtab is unchanged, false is returned, and status indicates the
-  // error.  The caller passes a ref on all defs to the symtab (even if the
-  // operation fails).
-  //
-  // TODO(haberman): currently failure will leave the symtab unchanged, but may
-  // leave the defs themselves partially resolved.  Does this matter?  If so we
-  // could do a prepass that ensures that all symbols are resolvable and bail
-  // if not, so we don't mutate anything until we know the operation will
-  // succeed.
-  //
-  // TODO(haberman): since the defs must be mutable, refining a frozen def
-  // requires making mutable copies of the entire tree.  This is wasteful if
-  // only a few messages are changing.  We may want to add a way of adding a
-  // tree of frozen defs to the symtab (perhaps an alternate constructor where
-  // you pass the root of the tree?)
-  bool Add(Def*const* defs, int n, void* ref_donor, upb_status* status);
+struct upb_fielddef {
+  upb_def base;
 
-  bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
-    return Add((Def*const*)&defs[0], defs.size(), owner, status);
+  union {
+    int64_t sint;
+    uint64_t uint;
+    double dbl;
+    float flt;
+    void *bytes;
+  } defaultval;
+  union {
+    const upb_msgdef *def;  /* If !msg_is_symbolic. */
+    char *name;             /* If msg_is_symbolic. */
+  } msg;
+  union {
+    const upb_def *def;  /* If !subdef_is_symbolic. */
+    char *name;          /* If subdef_is_symbolic. */
+  } sub;  /* The msgdef or enumdef for this field, if upb_hassubdef(f). */
+  bool subdef_is_symbolic;
+  bool msg_is_symbolic;
+  const upb_oneofdef *oneof;
+  bool default_is_string;
+  bool type_is_set_;     /* False until type is explicitly set. */
+  bool is_extension_;
+  bool lazy_;
+  bool packed_;
+  upb_intfmt_t intfmt;
+  bool tagdelim;
+  upb_fieldtype_t type_;
+  upb_label_t label_;
+  uint32_t number_;
+  uint32_t selector_base;  /* Used to index into a upb::Handlers table. */
+  uint32_t index_;
+};
+
+#define UPB_FIELDDEF_INIT(label, type, intfmt, tagdelim, is_extension, lazy,   \
+                          packed, name, num, msgdef, subdef, selector_base,    \
+                          index, defaultval, refs, ref2s)                      \
+  {                                                                            \
+    UPB_DEF_INIT(name, UPB_DEF_FIELD, refs, ref2s), defaultval, {msgdef},      \
+        {subdef}, NULL, false, false,                                          \
+        type == UPB_TYPE_STRING || type == UPB_TYPE_BYTES, true, is_extension, \
+        lazy, packed, intfmt, tagdelim, type, label, num, selector_base, index \
   }
 
- private:
-  UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable);
-,
-UPB_DEFINE_STRUCT(upb_symtab, upb_refcounted,
+
+/* upb_msgdef *****************************************************************/
+
+struct upb_msgdef {
+  upb_def base;
+
+  size_t selector_count;
+  uint32_t submsg_field_count;
+
+  /* Tables for looking up fields by number and name. */
+  upb_inttable itof;  /* int to field */
+  upb_strtable ntof;  /* name to field */
+
+  /* Tables for looking up oneofs by name. */
+  upb_strtable ntoo;  /* name to oneof */
+
+  /* Is this a map-entry message?
+   * TODO: set this flag properly for static descriptors; regenerate
+   * descriptor.upb.c. */
+  bool map_entry;
+
+  /* TODO(haberman): proper extension ranges (there can be multiple). */
+};
+
+/* TODO: also support static initialization of the oneofs table. This will be
+ * needed if we compile in descriptors that contain oneofs. */
+#define UPB_MSGDEF_INIT(name, selector_count, submsg_field_count, itof, ntof, \
+                        refs, ref2s)                                          \
+  {                                                                           \
+    UPB_DEF_INIT(name, UPB_DEF_MSG, refs, ref2s), selector_count,             \
+        submsg_field_count, itof, ntof,                                       \
+        UPB_EMPTY_STRTABLE_INIT(UPB_CTYPE_PTR), false                         \
+  }
+
+
+/* upb_enumdef ****************************************************************/
+
+struct upb_enumdef {
+  upb_def base;
+
+  upb_strtable ntoi;
+  upb_inttable iton;
+  int32_t defaultval;
+};
+
+#define UPB_ENUMDEF_INIT(name, ntoi, iton, defaultval, refs, ref2s) \
+  { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntoi, iton, defaultval }
+
+
+/* upb_oneofdef ***************************************************************/
+
+struct upb_oneofdef {
+  upb_def base;
+
+  upb_strtable ntof;
+  upb_inttable itof;
+  const upb_msgdef *parent;
+};
+
+#define UPB_ONEOFDEF_INIT(name, ntof, itof, refs, ref2s) \
+  { UPB_DEF_INIT(name, UPB_DEF_ENUM, refs, ref2s), ntof, itof }
+
+
+/* upb_symtab *****************************************************************/
+
+struct upb_symtab {
+  upb_refcounted base;
+
   upb_strtable symtab;
-));
+};
 
 #define UPB_SYMTAB_INIT(symtab, refs, ref2s) \
   { UPB_REFCOUNT_INIT(refs, ref2s), symtab }
 
-UPB_BEGIN_EXTERN_C  // {
 
-// Native C API.
-// From upb_refcounted.
-bool upb_symtab_isfrozen(const upb_symtab *s);
-void upb_symtab_ref(const upb_symtab *s, const void *owner);
-void upb_symtab_unref(const upb_symtab *s, const void *owner);
-void upb_symtab_donateref(
-    const upb_symtab *s, const void *from, const void *to);
-void upb_symtab_checkref(const upb_symtab *s, const void *owner);
-
-upb_symtab *upb_symtab_new(const void *owner);
-void upb_symtab_freeze(upb_symtab *s);
-const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
-                                  const char *sym);
-const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
-const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
-const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
-bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
-                    upb_status *status);
-
-// upb_symtab_iter i;
-// for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
-//     upb_symtab_next(&i)) {
-//   const upb_def *def = upb_symtab_iter_def(&i);
-//   // ...
-// }
-//
-// For C we don't have separate iterators for const and non-const.
-// It is the caller's responsibility to cast the upb_fielddef* to
-// const if the upb_msgdef* is const.
-void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
-                      upb_deftype_t type);
-void upb_symtab_next(upb_symtab_iter *iter);
-bool upb_symtab_done(const upb_symtab_iter *iter);
-const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
-
-UPB_END_EXTERN_C  // }
-
-#ifdef __cplusplus
-// C++ inline wrappers.
-namespace upb {
-inline reffed_ptr<SymbolTable> SymbolTable::New() {
-  upb_symtab *s = upb_symtab_new(&s);
-  return reffed_ptr<SymbolTable>(s, &s);
-}
-
-inline bool SymbolTable::IsFrozen() const {
-  return upb_symtab_isfrozen(this);
-}
-inline void SymbolTable::Ref(const void *owner) const {
-  upb_symtab_ref(this, owner);
-}
-inline void SymbolTable::Unref(const void *owner) const {
-  upb_symtab_unref(this, owner);
-}
-inline void SymbolTable::DonateRef(const void *from, const void *to) const {
-  upb_symtab_donateref(this, from, to);
-}
-inline void SymbolTable::CheckRef(const void *owner) const {
-  upb_symtab_checkref(this, owner);
-}
-
-inline void SymbolTable::Freeze() {
-  return upb_symtab_freeze(this);
-}
-inline const Def *SymbolTable::Resolve(const char *base,
-                                       const char *sym) const {
-  return upb_symtab_resolve(this, base, sym);
-}
-inline const Def* SymbolTable::Lookup(const char *sym) const {
-  return upb_symtab_lookup(this, sym);
-}
-inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
-  return upb_symtab_lookupmsg(this, sym);
-}
-inline bool SymbolTable::Add(
-    Def*const* defs, int n, void* ref_donor, upb_status* status) {
-  return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
-}
-}  // namespace upb
-#endif
-
-#endif  /* UPB_SYMTAB_H_ */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Enums
-
-typedef enum {
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_OPTIONAL = 1,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REQUIRED = 2,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REPEATED = 3,
-} google_protobuf_FieldDescriptorProto_Label;
-
-typedef enum {
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_DOUBLE = 1,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FLOAT = 2,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT64 = 3,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT64 = 4,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 = 5,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED64 = 6,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED32 = 7,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BOOL = 8,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_STRING = 9,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_GROUP = 10,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_MESSAGE = 11,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BYTES = 12,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT32 = 13,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_ENUM = 14,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED32 = 15,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED64 = 16,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT32 = 17,
-  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT64 = 18,
-} google_protobuf_FieldDescriptorProto_Type;
-
-typedef enum {
-  GOOGLE_PROTOBUF_FIELDOPTIONS_STRING = 0,
-  GOOGLE_PROTOBUF_FIELDOPTIONS_CORD = 1,
-  GOOGLE_PROTOBUF_FIELDOPTIONS_STRING_PIECE = 2,
-} google_protobuf_FieldOptions_CType;
-
-typedef enum {
-  GOOGLE_PROTOBUF_FILEOPTIONS_SPEED = 1,
-  GOOGLE_PROTOBUF_FILEOPTIONS_CODE_SIZE = 2,
-  GOOGLE_PROTOBUF_FILEOPTIONS_LITE_RUNTIME = 3,
-} google_protobuf_FileOptions_OptimizeMode;
-
-// Selectors
-
-// google.protobuf.DescriptorProto
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 4
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSUBMSG 6
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_STARTSUBMSG 7
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSEQ 8
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSEQ 9
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSUBMSG 10
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSEQ 11
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSEQ 12
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSUBMSG 13
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 14
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 15
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 16
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSEQ 17
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSEQ 18
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSUBMSG 19
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSEQ 20
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSEQ 21
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSUBMSG 22
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_ENDSUBMSG 23
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STRING 24
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STARTSTR 25
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_ENDSTR 26
-
-// google.protobuf.DescriptorProto.ExtensionRange
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_START_INT32 2
-#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_END_INT32 3
-
-// google.protobuf.EnumDescriptorProto
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSEQ 4
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSEQ 5
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSUBMSG 6
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STRING 8
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STARTSTR 9
-#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_ENDSTR 10
-
-// google.protobuf.EnumOptions
-#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_ALLOW_ALIAS_BOOL 6
-
-// google.protobuf.EnumValueDescriptorProto
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STRING 4
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STARTSTR 5
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_ENDSTR 6
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_INT32 7
-
-// google.protobuf.EnumValueOptions
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-
-// google.protobuf.FieldDescriptorProto
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STRING 4
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STARTSTR 5
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_ENDSTR 6
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STRING 7
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STARTSTR 8
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_ENDSTR 9
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NUMBER_INT32 10
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_INT32 11
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 12
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STRING 13
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STARTSTR 14
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_ENDSTR 15
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STRING 16
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STARTSTR 17
-#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_ENDSTR 18
-
-// google.protobuf.FieldOptions
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_CTYPE_INT32 6
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_PACKED_BOOL 7
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_DEPRECATED_BOOL 8
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_LAZY_BOOL 9
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STRING 10
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STARTSTR 11
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_ENDSTR 12
-#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_WEAK_BOOL 13
-
-// google.protobuf.FileDescriptorProto
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSUBMSG 4
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 6
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_STARTSUBMSG 7
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSEQ 8
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSEQ 9
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSUBMSG 10
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 11
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 12
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 13
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSEQ 14
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSEQ 15
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSUBMSG 16
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSEQ 17
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSEQ 18
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSUBMSG 19
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 20
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_ENDSUBMSG 21
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STRING 22
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STARTSTR 23
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_ENDSTR 24
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STRING 25
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STARTSTR 26
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_ENDSTR 27
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSEQ 28
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSEQ 29
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STRING 30
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSTR 31
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSTR 32
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_STARTSEQ 33
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_ENDSEQ 34
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_INT32 35
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_STARTSEQ 36
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_ENDSEQ 37
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_INT32 38
-
-// google.protobuf.FileDescriptorSet
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSUBMSG 5
-
-// google.protobuf.FileOptions
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STRING 6
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STARTSTR 7
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_ENDSTR 8
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STRING 9
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STARTSTR 10
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_ENDSTR 11
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OPTIMIZE_FOR_INT32 12
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_MULTIPLE_FILES_BOOL 13
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STRING 14
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STARTSTR 15
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_ENDSTR 16
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CC_GENERIC_SERVICES_BOOL 17
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERIC_SERVICES_BOOL 18
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_PY_GENERIC_SERVICES_BOOL 19
-#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERATE_EQUALS_AND_HASH_BOOL 20
-
-// google.protobuf.MessageOptions
-#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MESSAGE_SET_WIRE_FORMAT_BOOL 6
-#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_NO_STANDARD_DESCRIPTOR_ACCESSOR_BOOL 7
-
-// google.protobuf.MethodDescriptorProto
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STRING 4
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STARTSTR 5
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_ENDSTR 6
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STRING 7
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STARTSTR 8
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_ENDSTR 9
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STRING 10
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STARTSTR 11
-#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_ENDSTR 12
-
-// google.protobuf.MethodOptions
-#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-
-// google.protobuf.ServiceDescriptorProto
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSEQ 4
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSEQ 5
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSUBMSG 6
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STRING 8
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STARTSTR 9
-#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_ENDSTR 10
-
-// google.protobuf.ServiceOptions
-#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
-
-// google.protobuf.SourceCodeInfo
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSUBMSG 5
-
-// google.protobuf.SourceCodeInfo.Location
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_STARTSEQ 2
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_ENDSEQ 3
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_INT32 4
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_STARTSEQ 5
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_ENDSEQ 6
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_INT32 7
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STRING 8
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STARTSTR 9
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_ENDSTR 10
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STRING 11
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STARTSTR 12
-#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_ENDSTR 13
-
-// google.protobuf.UninterpretedOption
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSUBMSG 2
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSEQ 3
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSEQ 4
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSUBMSG 5
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STRING 6
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STARTSTR 7
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_ENDSTR 8
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_POSITIVE_INT_VALUE_UINT64 9
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NEGATIVE_INT_VALUE_INT64 10
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_DOUBLE_VALUE_DOUBLE 11
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STRING 12
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STARTSTR 13
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_ENDSTR 14
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STRING 15
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STARTSTR 16
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_ENDSTR 17
-
-// google.protobuf.UninterpretedOption.NamePart
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STRING 2
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STARTSTR 3
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_ENDSTR 4
-#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_IS_EXTENSION_BOOL 5
-
-const upb_symtab *upbdefs_google_protobuf_descriptor(const void *owner);
-
-// MessageDefs
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto.ExtensionRange");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumDescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueDescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldDescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorSet");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MessageOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MessageOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodDescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceDescriptorProto");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceOptions(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceOptions");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo.Location");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOption");
-  assert(m);
-  return m;
-}
-UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePart(const upb_symtab *s) {
-  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOption.NamePart");
-  assert(m);
-  return m;
-}
-
-
-// EnumDefs
-UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label(const upb_symtab *s) {
-  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescriptorProto.Label");
-  assert(e);
-  return e;
-}
-UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type(const upb_symtab *s) {
-  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescriptorProto.Type");
-  assert(e);
-  return e;
-}
-UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType(const upb_symtab *s) {
-  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldOptions.CType");
-  assert(e);
-  return e;
-}
-UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(const upb_symtab *s) {
-  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FileOptions.OptimizeMode");
-  assert(e);
-  return e;
-}
-
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_field(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_nested_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_allow_alias(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_default_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_extendee(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_label(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_ctype(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_experimental_map_key(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_lazy(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_packed(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_weak(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 7); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_message_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_public_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_service(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_source_code_info(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_weak_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 11); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_file(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorSet(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 16); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_go_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 11); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 20); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 17); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_multiple_files(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 10); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_outer_classname(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_optimize_for(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 9); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_py_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 18); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_message_set_wire_format(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_input_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_output_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_method(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceOptions(s), 999); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_path(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_span(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_location(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption_NamePart(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption_NamePart(s), 1); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_aggregate_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 8); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_double_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 6); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_identifier_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 3); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 2); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_negative_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 5); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_positive_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 4); }
-UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_string_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 7); }
-
-#ifdef __cplusplus
-};  // extern "C"
-#endif
-
-#ifdef __cplusplus
-
-namespace upbdefs {
-namespace google {
-namespace protobuf {
-namespace descriptor {
-inline upb::reffed_ptr<const upb::SymbolTable> SymbolTable() {
-  const upb::SymbolTable* s = upbdefs_google_protobuf_descriptor(&s);
-  return upb::reffed_ptr<const upb::SymbolTable>(s, &s);
-}
-}  // namespace descriptor
-}  // namespace protobuf
-}  // namespace google
-
-#define RETURN_REFFED(type, func) \
-    const type* obj = func(upbdefs::google::protobuf::descriptor::SymbolTable().get()); \
-    return upb::reffed_ptr<const type>(obj);
-
-namespace google {
-namespace protobuf {
-namespace DescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_enum_type) }
-inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension) }
-inline upb::reffed_ptr<const upb::FieldDef> extension_range() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension_range) }
-inline upb::reffed_ptr<const upb::FieldDef> field() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_field) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> nested_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_nested_type) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_options) }
-}  // namespace DescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace DescriptorProto {
-namespace ExtensionRange {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange) }
-inline upb::reffed_ptr<const upb::FieldDef> end() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end) }
-inline upb::reffed_ptr<const upb::FieldDef> start() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start) }
-}  // namespace ExtensionRange
-}  // namespace DescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace EnumDescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumDescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_options) }
-inline upb::reffed_ptr<const upb::FieldDef> value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_value) }
-}  // namespace EnumDescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace EnumOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> allow_alias() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_allow_alias) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_uninterpreted_option) }
-}  // namespace EnumOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace EnumValueDescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueDescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_number) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_options) }
-}  // namespace EnumValueDescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace EnumValueOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option) }
-}  // namespace EnumValueOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace FieldDescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldDescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> default_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_default_value) }
-inline upb::reffed_ptr<const upb::FieldDef> extendee() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_extendee) }
-inline upb::reffed_ptr<const upb::FieldDef> label() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_label) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_number) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_options) }
-inline upb::reffed_ptr<const upb::FieldDef> type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type) }
-inline upb::reffed_ptr<const upb::FieldDef> type_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type_name) }
-inline upb::reffed_ptr<const upb::EnumDef> Label() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldDescriptorProto_Label) }
-inline upb::reffed_ptr<const upb::EnumDef> Type() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldDescriptorProto_Type) }
-}  // namespace FieldDescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace FieldOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> ctype() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_ctype) }
-inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_deprecated) }
-inline upb::reffed_ptr<const upb::FieldDef> experimental_map_key() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_experimental_map_key) }
-inline upb::reffed_ptr<const upb::FieldDef> lazy() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_lazy) }
-inline upb::reffed_ptr<const upb::FieldDef> packed() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_packed) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_uninterpreted_option) }
-inline upb::reffed_ptr<const upb::FieldDef> weak() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_weak) }
-inline upb::reffed_ptr<const upb::EnumDef> CType() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldOptions_CType) }
-}  // namespace FieldOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace FileDescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileDescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_dependency) }
-inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_enum_type) }
-inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_extension) }
-inline upb::reffed_ptr<const upb::FieldDef> message_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_message_type) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_options) }
-inline upb::reffed_ptr<const upb::FieldDef> package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_package) }
-inline upb::reffed_ptr<const upb::FieldDef> public_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_public_dependency) }
-inline upb::reffed_ptr<const upb::FieldDef> service() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_service) }
-inline upb::reffed_ptr<const upb::FieldDef> source_code_info() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_source_code_info) }
-inline upb::reffed_ptr<const upb::FieldDef> weak_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_weak_dependency) }
-}  // namespace FileDescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace FileDescriptorSet {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileDescriptorSet) }
-inline upb::reffed_ptr<const upb::FieldDef> file() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorSet_file) }
-}  // namespace FileDescriptorSet
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace FileOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> cc_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_generic_services) }
-inline upb::reffed_ptr<const upb::FieldDef> go_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_go_package) }
-inline upb::reffed_ptr<const upb::FieldDef> java_generate_equals_and_hash() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash) }
-inline upb::reffed_ptr<const upb::FieldDef> java_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generic_services) }
-inline upb::reffed_ptr<const upb::FieldDef> java_multiple_files() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_multiple_files) }
-inline upb::reffed_ptr<const upb::FieldDef> java_outer_classname() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_outer_classname) }
-inline upb::reffed_ptr<const upb::FieldDef> java_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_package) }
-inline upb::reffed_ptr<const upb::FieldDef> optimize_for() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_optimize_for) }
-inline upb::reffed_ptr<const upb::FieldDef> py_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_py_generic_services) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_uninterpreted_option) }
-inline upb::reffed_ptr<const upb::EnumDef> OptimizeMode() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FileOptions_OptimizeMode) }
-}  // namespace FileOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace MessageOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MessageOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> message_set_wire_format() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_message_set_wire_format) }
-inline upb::reffed_ptr<const upb::FieldDef> no_standard_descriptor_accessor() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_uninterpreted_option) }
-}  // namespace MessageOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace MethodDescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodDescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> input_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_input_type) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_options) }
-inline upb::reffed_ptr<const upb::FieldDef> output_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_output_type) }
-}  // namespace MethodDescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace MethodOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_uninterpreted_option) }
-}  // namespace MethodOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace ServiceDescriptorProto {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceDescriptorProto) }
-inline upb::reffed_ptr<const upb::FieldDef> method() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_method) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_name) }
-inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_options) }
-}  // namespace ServiceDescriptorProto
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace ServiceOptions {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceOptions) }
-inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_uninterpreted_option) }
-}  // namespace ServiceOptions
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace SourceCodeInfo {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo) }
-inline upb::reffed_ptr<const upb::FieldDef> location() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_location) }
-}  // namespace SourceCodeInfo
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace SourceCodeInfo {
-namespace Location {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo_Location) }
-inline upb::reffed_ptr<const upb::FieldDef> leading_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments) }
-inline upb::reffed_ptr<const upb::FieldDef> path() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_path) }
-inline upb::reffed_ptr<const upb::FieldDef> span() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_span) }
-inline upb::reffed_ptr<const upb::FieldDef> trailing_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments) }
-}  // namespace Location
-}  // namespace SourceCodeInfo
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace UninterpretedOption {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_UninterpretedOption) }
-inline upb::reffed_ptr<const upb::FieldDef> aggregate_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_aggregate_value) }
-inline upb::reffed_ptr<const upb::FieldDef> double_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_double_value) }
-inline upb::reffed_ptr<const upb::FieldDef> identifier_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_identifier_value) }
-inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_name) }
-inline upb::reffed_ptr<const upb::FieldDef> negative_int_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_negative_int_value) }
-inline upb::reffed_ptr<const upb::FieldDef> positive_int_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_positive_int_value) }
-inline upb::reffed_ptr<const upb::FieldDef> string_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_string_value) }
-}  // namespace UninterpretedOption
-}  // namespace protobuf
-}  // namespace google
-
-namespace google {
-namespace protobuf {
-namespace UninterpretedOption {
-namespace NamePart {
-inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_UninterpretedOption_NamePart) }
-inline upb::reffed_ptr<const upb::FieldDef> is_extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension) }
-inline upb::reffed_ptr<const upb::FieldDef> name_part() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part) }
-}  // namespace NamePart
-}  // namespace UninterpretedOption
-}  // namespace protobuf
-}  // namespace google
-
-}  // namespace upbdefs
-
-
-#undef RETURN_REFFED
-#endif // __cplusplus
-
-#endif  // GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
+#endif  /* UPB_STATICINIT_H_ */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -4092,25 +3213,26 @@
 class Handlers;
 template <class T> class Handler;
 template <class T> struct CanonicalType;
-}  // namespace upb
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::BufferHandle, upb_bufhandle);
-UPB_DECLARE_TYPE(upb::BytesHandler, upb_byteshandler);
-UPB_DECLARE_TYPE(upb::HandlerAttributes, upb_handlerattr);
-UPB_DECLARE_TYPE(upb::Handlers, upb_handlers);
+UPB_DECLARE_TYPE(upb::BufferHandle, upb_bufhandle)
+UPB_DECLARE_TYPE(upb::BytesHandler, upb_byteshandler)
+UPB_DECLARE_TYPE(upb::HandlerAttributes, upb_handlerattr)
+UPB_DECLARE_DERIVED_TYPE(upb::Handlers, upb::RefCounted,
+                         upb_handlers, upb_refcounted)
 
-// The maximum depth that the handler graph can have.  This is a resource limit
-// for the C stack since we sometimes need to recursively traverse the graph.
-// Cycles are ok; the traversal will stop when it detects a cycle, but we must
-// hit the cycle before the maximum depth is reached.
-//
-// If having a single static limit is too inflexible, we can add another variant
-// of Handlers::Freeze that allows specifying this as a parameter.
+/* The maximum depth that the handler graph can have.  This is a resource limit
+ * for the C stack since we sometimes need to recursively traverse the graph.
+ * Cycles are ok; the traversal will stop when it detects a cycle, but we must
+ * hit the cycle before the maximum depth is reached.
+ *
+ * If having a single static limit is too inflexible, we can add another variant
+ * of Handlers::Freeze that allows specifying this as a parameter. */
 #define UPB_MAX_HANDLER_DEPTH 64
 
-// All the different types of handlers that can be registered.
-// Only needed for the advanced functions in upb::Handlers.
+/* All the different types of handlers that can be registered.
+ * Only needed for the advanced functions in upb::Handlers. */
 typedef enum {
   UPB_HANDLER_INT32,
   UPB_HANDLER_INT64,
@@ -4125,25 +3247,25 @@
   UPB_HANDLER_STARTSUBMSG,
   UPB_HANDLER_ENDSUBMSG,
   UPB_HANDLER_STARTSEQ,
-  UPB_HANDLER_ENDSEQ,
+  UPB_HANDLER_ENDSEQ
 } upb_handlertype_t;
 
 #define UPB_HANDLER_MAX (UPB_HANDLER_ENDSEQ+1)
 
 #define UPB_BREAK NULL
 
-// A convenient definition for when no closure is needed.
+/* A convenient definition for when no closure is needed. */
 extern char _upb_noclosure;
 #define UPB_NO_CLOSURE &_upb_noclosure
 
-// A selector refers to a specific field handler in the Handlers object
-// (for example: the STARTSUBMSG handler for field "field15").
+/* A selector refers to a specific field handler in the Handlers object
+ * (for example: the STARTSUBMSG handler for field "field15"). */
 typedef int32_t upb_selector_t;
 
 UPB_BEGIN_EXTERN_C
 
-// Forward-declares for C inline accessors.  We need to declare these here
-// so we can "friend" them in the class declarations in C++.
+/* Forward-declares for C inline accessors.  We need to declare these here
+ * so we can "friend" them in the class declarations in C++. */
 UPB_INLINE upb_func *upb_handlers_gethandler(const upb_handlers *h,
                                              upb_selector_t s);
 UPB_INLINE const void *upb_handlerattr_handlerdata(const upb_handlerattr *attr);
@@ -4162,104 +3284,111 @@
 UPB_END_EXTERN_C
 
 
-// Static selectors for upb::Handlers.
+/* Static selectors for upb::Handlers. */
 #define UPB_STARTMSG_SELECTOR 0
 #define UPB_ENDMSG_SELECTOR 1
 #define UPB_STATIC_SELECTOR_COUNT 2
 
-// Static selectors for upb::BytesHandler.
+/* Static selectors for upb::BytesHandler. */
 #define UPB_STARTSTR_SELECTOR 0
 #define UPB_STRING_SELECTOR 1
 #define UPB_ENDSTR_SELECTOR 2
 
 typedef void upb_handlerfree(void *d);
 
-// A set of attributes that accompanies a handler's function pointer.
-UPB_DEFINE_CLASS0(upb::HandlerAttributes,
+#ifdef __cplusplus
+
+/* A set of attributes that accompanies a handler's function pointer. */
+class upb::HandlerAttributes {
  public:
   HandlerAttributes();
   ~HandlerAttributes();
 
-  // Sets the handler data that will be passed as the second parameter of the
-  // handler.  To free this pointer when the handlers are freed, call
-  // Handlers::AddCleanup().
+  /* Sets the handler data that will be passed as the second parameter of the
+   * handler.  To free this pointer when the handlers are freed, call
+   * Handlers::AddCleanup(). */
   bool SetHandlerData(const void *handler_data);
   const void* handler_data() const;
 
-  // Use this to specify the type of the closure.  This will be checked against
-  // all other closure types for handler that use the same closure.
-  // Registration will fail if this does not match all other non-NULL closure
-  // types.
+  /* Use this to specify the type of the closure.  This will be checked against
+   * all other closure types for handler that use the same closure.
+   * Registration will fail if this does not match all other non-NULL closure
+   * types. */
   bool SetClosureType(const void *closure_type);
   const void* closure_type() const;
 
-  // Use this to specify the type of the returned closure.  Only used for
-  // Start*{String,SubMessage,Sequence} handlers.  This must match the closure
-  // type of any handlers that use it (for example, the StringBuf handler must
-  // match the closure returned from StartString).
+  /* Use this to specify the type of the returned closure.  Only used for
+   * Start*{String,SubMessage,Sequence} handlers.  This must match the closure
+   * type of any handlers that use it (for example, the StringBuf handler must
+   * match the closure returned from StartString). */
   bool SetReturnClosureType(const void *return_closure_type);
   const void* return_closure_type() const;
 
-  // Set to indicate that the handler always returns "ok" (either "true" or a
-  // non-NULL closure).  This is a hint that can allow code generators to
-  // generate more efficient code.
+  /* Set to indicate that the handler always returns "ok" (either "true" or a
+   * non-NULL closure).  This is a hint that can allow code generators to
+   * generate more efficient code. */
   bool SetAlwaysOk(bool always_ok);
   bool always_ok() const;
 
  private:
   friend UPB_INLINE const void * ::upb_handlerattr_handlerdata(
       const upb_handlerattr *attr);
-,
-UPB_DEFINE_STRUCT0(upb_handlerattr,
+#else
+struct upb_handlerattr {
+#endif
   const void *handler_data_;
   const void *closure_type_;
   const void *return_closure_type_;
   bool alwaysok_;
-));
+};
 
 #define UPB_HANDLERATTR_INITIALIZER {NULL, NULL, NULL, false}
 
 typedef struct {
   upb_func *func;
-  // It is wasteful to include the entire attributes here:
-  //
-  // * Some of the information is redundant (like storing the closure type
-  //   separately for each handler that must match).
-  // * Some of the info is only needed prior to freeze() (like closure types).
-  // * alignment padding wastes a lot of space for alwaysok_.
-  //
-  // If/when the size and locality of handlers is an issue, we can optimize this
-  // not to store the entire attr like this.  We do not expose the table's
-  // layout to allow this optimization in the future.
+
+  /* It is wasteful to include the entire attributes here:
+   *
+   * * Some of the information is redundant (like storing the closure type
+   *   separately for each handler that must match).
+   * * Some of the info is only needed prior to freeze() (like closure types).
+   * * alignment padding wastes a lot of space for alwaysok_.
+   *
+   * If/when the size and locality of handlers is an issue, we can optimize this
+   * not to store the entire attr like this.  We do not expose the table's
+   * layout to allow this optimization in the future. */
   upb_handlerattr attr;
 } upb_handlers_tabent;
 
-// Extra information about a buffer that is passed to a StringBuf handler.
-// TODO(haberman): allow the handle to be pinned so that it will outlive
-// the handler invocation.
-UPB_DEFINE_CLASS0(upb::BufferHandle,
+#ifdef __cplusplus
+
+/* Extra information about a buffer that is passed to a StringBuf handler.
+ * TODO(haberman): allow the handle to be pinned so that it will outlive
+ * the handler invocation. */
+class upb::BufferHandle {
  public:
   BufferHandle();
   ~BufferHandle();
 
-  // The beginning of the buffer.  This may be different than the pointer
-  // passed to a StringBuf handler because the handler may receive data
-  // that is from the middle or end of a larger buffer.
+  /* The beginning of the buffer.  This may be different than the pointer
+   * passed to a StringBuf handler because the handler may receive data
+   * that is from the middle or end of a larger buffer. */
   const char* buffer() const;
 
-  // The offset within the attached object where this buffer begins.  Only
-  // meaningful if there is an attached object.
+  /* The offset within the attached object where this buffer begins.  Only
+   * meaningful if there is an attached object. */
   size_t object_offset() const;
 
-  // Note that object_offset is the offset of "buf" within the attached object.
+  /* Note that object_offset is the offset of "buf" within the attached
+   * object. */
   void SetBuffer(const char* buf, size_t object_offset);
 
-  // The BufferHandle can have an "attached object", which can be used to
-  // tunnel through a pointer to the buffer's underlying representation.
+  /* The BufferHandle can have an "attached object", which can be used to
+   * tunnel through a pointer to the buffer's underlying representation. */
   template <class T>
   void SetAttachedObject(const T* obj);
 
-  // Returns NULL if the attached object is not of this type.
+  /* Returns NULL if the attached object is not of this type. */
   template <class T>
   const T* GetAttachedObject() const;
 
@@ -4274,26 +3403,29 @@
   friend UPB_INLINE const void* ::upb_bufhandle_objtype(
       const upb_bufhandle *h);
   friend UPB_INLINE const char* ::upb_bufhandle_buf(const upb_bufhandle *h);
-,
-UPB_DEFINE_STRUCT0(upb_bufhandle,
+#else
+struct upb_bufhandle {
+#endif
   const char *buf_;
   const void *obj_;
   const void *objtype_;
   size_t objofs_;
-));
+};
 
-// A upb::Handlers object represents the set of handlers associated with a
-// message in the graph of messages.  You can think of it as a big virtual
-// table with functions corresponding to all the events that can fire while
-// parsing or visiting a message of a specific type.
-//
-// Any handlers that are not set behave as if they had successfully consumed
-// the value.  Any unset Start* handlers will propagate their closure to the
-// inner frame.
-//
-// The easiest way to create the *Handler objects needed by the Set* methods is
-// with the UpbBind() and UpbMakeHandler() macros; see below.
-UPB_DEFINE_CLASS1(upb::Handlers, upb::RefCounted,
+#ifdef __cplusplus
+
+/* A upb::Handlers object represents the set of handlers associated with a
+ * message in the graph of messages.  You can think of it as a big virtual
+ * table with functions corresponding to all the events that can fire while
+ * parsing or visiting a message of a specific type.
+ *
+ * Any handlers that are not set behave as if they had successfully consumed
+ * the value.  Any unset Start* handlers will propagate their closure to the
+ * inner frame.
+ *
+ * The easiest way to create the *Handler objects needed by the Set* methods is
+ * with the UpbBind() and UpbMakeHandler() macros; see below. */
+class upb::Handlers {
  public:
   typedef upb_selector_t Selector;
   typedef upb_handlertype_t Type;
@@ -4318,95 +3450,94 @@
   typedef ValueHandler<double>::H      DoubleHandler;
   typedef ValueHandler<bool>::H        BoolHandler;
 
-  // Any function pointer can be converted to this and converted back to its
-  // correct type.
+  /* Any function pointer can be converted to this and converted back to its
+   * correct type. */
   typedef void GenericFunction();
 
   typedef void HandlersCallback(const void *closure, upb_handlers *h);
 
-  // Returns a new handlers object for the given frozen msgdef.
-  // Returns NULL if memory allocation failed.
+  /* Returns a new handlers object for the given frozen msgdef.
+   * Returns NULL if memory allocation failed. */
   static reffed_ptr<Handlers> New(const MessageDef *m);
 
-  // Convenience function for registering a graph of handlers that mirrors the
-  // graph of msgdefs for some message.  For "m" and all its children a new set
-  // of handlers will be created and the given callback will be invoked,
-  // allowing the client to register handlers for this message.  Note that any
-  // subhandlers set by the callback will be overwritten.
+  /* Convenience function for registering a graph of handlers that mirrors the
+   * graph of msgdefs for some message.  For "m" and all its children a new set
+   * of handlers will be created and the given callback will be invoked,
+   * allowing the client to register handlers for this message.  Note that any
+   * subhandlers set by the callback will be overwritten. */
   static reffed_ptr<const Handlers> NewFrozen(const MessageDef *m,
                                               HandlersCallback *callback,
                                               const void *closure);
 
-  // Functionality from upb::RefCounted.
-  bool IsFrozen() const;
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void *from, const void *to) const;
-  void CheckRef(const void *owner) const;
+  /* Functionality from upb::RefCounted. */
+  UPB_REFCOUNTED_CPPMETHODS
 
-  // All handler registration functions return bool to indicate success or
-  // failure; details about failures are stored in this status object.  If a
-  // failure does occur, it must be cleared before the Handlers are frozen,
-  // otherwise the freeze() operation will fail.  The functions may *only* be
-  // used while the Handlers are mutable.
+  /* All handler registration functions return bool to indicate success or
+   * failure; details about failures are stored in this status object.  If a
+   * failure does occur, it must be cleared before the Handlers are frozen,
+   * otherwise the freeze() operation will fail.  The functions may *only* be
+   * used while the Handlers are mutable. */
   const Status* status();
   void ClearError();
 
-  // Call to freeze these Handlers.  Requires that any SubHandlers are already
-  // frozen.  For cycles, you must use the static version below and freeze the
-  // whole graph at once.
+  /* Call to freeze these Handlers.  Requires that any SubHandlers are already
+   * frozen.  For cycles, you must use the static version below and freeze the
+   * whole graph at once. */
   bool Freeze(Status* s);
 
-  // Freezes the given set of handlers.  You may not freeze a handler without
-  // also freezing any handlers they point to.
+  /* Freezes the given set of handlers.  You may not freeze a handler without
+   * also freezing any handlers they point to. */
   static bool Freeze(Handlers*const* handlers, int n, Status* s);
   static bool Freeze(const std::vector<Handlers*>& handlers, Status* s);
 
-  // Returns the msgdef associated with this handlers object.
+  /* Returns the msgdef associated with this handlers object. */
   const MessageDef* message_def() const;
 
-  // Adds the given pointer and function to the list of cleanup functions that
-  // will be run when these handlers are freed.  If this pointer has previously
-  // been registered, the function returns false and does nothing.
+  /* Adds the given pointer and function to the list of cleanup functions that
+   * will be run when these handlers are freed.  If this pointer has previously
+   * been registered, the function returns false and does nothing. */
   bool AddCleanup(void *ptr, upb_handlerfree *cleanup);
 
-  // Sets the startmsg handler for the message, which is defined as follows:
-  //
-  //   bool startmsg(MyType* closure) {
-  //     // Called when the message begins.  Returns true if processing should
-  //     // continue.
-  //     return true;
-  //   }
+  /* Sets the startmsg handler for the message, which is defined as follows:
+   *
+   *   bool startmsg(MyType* closure) {
+   *     // Called when the message begins.  Returns true if processing should
+   *     // continue.
+   *     return true;
+   *   }
+   */
   bool SetStartMessageHandler(const StartMessageHandler& handler);
 
-  // Sets the endmsg handler for the message, which is defined as follows:
-  //
-  //   bool endmsg(MyType* closure, upb_status *status) {
-  //     // Called when processing of this message ends, whether in success or
-  //     // failure.  "status" indicates the final status of processing, and
-  //     // can also be modified in-place to update the final status.
-  //   }
+  /* Sets the endmsg handler for the message, which is defined as follows:
+   *
+   *   bool endmsg(MyType* closure, upb_status *status) {
+   *     // Called when processing of this message ends, whether in success or
+   *     // failure.  "status" indicates the final status of processing, and
+   *     // can also be modified in-place to update the final status.
+   *   }
+   */
   bool SetEndMessageHandler(const EndMessageHandler& handler);
 
-  // Sets the value handler for the given field, which is defined as follows
-  // (this is for an int32 field; other field types will pass their native
-  // C/C++ type for "val"):
-  //
-  //   bool OnValue(MyClosure* c, const MyHandlerData* d, int32_t val) {
-  //     // Called when the field's value is encountered.  "d" contains
-  //     // whatever data was bound to this field when it was registered.
-  //     // Returns true if processing should continue.
-  //     return true;
-  //   }
-  //
-  //   handers->SetInt32Handler(f, UpbBind(OnValue, new MyHandlerData(...)));
-  //
-  // The value type must exactly match f->type().
-  // For example, a handler that takes an int32_t parameter may only be used for
-  // fields of type UPB_TYPE_INT32 and UPB_TYPE_ENUM.
-  //
-  // Returns false if the handler failed to register; in this case the cleanup
-  // handler (if any) will be called immediately.
+  /* Sets the value handler for the given field, which is defined as follows
+   * (this is for an int32 field; other field types will pass their native
+   * C/C++ type for "val"):
+   *
+   *   bool OnValue(MyClosure* c, const MyHandlerData* d, int32_t val) {
+   *     // Called when the field's value is encountered.  "d" contains
+   *     // whatever data was bound to this field when it was registered.
+   *     // Returns true if processing should continue.
+   *     return true;
+   *   }
+   *
+   *   handers->SetInt32Handler(f, UpbBind(OnValue, new MyHandlerData(...)));
+   *
+   * The value type must exactly match f->type().
+   * For example, a handler that takes an int32_t parameter may only be used for
+   * fields of type UPB_TYPE_INT32 and UPB_TYPE_ENUM.
+   *
+   * Returns false if the handler failed to register; in this case the cleanup
+   * handler (if any) will be called immediately.
+   */
   bool SetInt32Handler (const FieldDef* f,  const Int32Handler& h);
   bool SetInt64Handler (const FieldDef* f,  const Int64Handler& h);
   bool SetUInt32Handler(const FieldDef* f, const UInt32Handler& h);
@@ -4415,240 +3546,247 @@
   bool SetDoubleHandler(const FieldDef* f, const DoubleHandler& h);
   bool SetBoolHandler  (const FieldDef* f,   const BoolHandler& h);
 
-  // Like the previous, but templated on the type on the value (ie. int32).
-  // This is mostly useful to call from other templates.  To call this you must
-  // specify the template parameter explicitly, ie:
-  //   h->SetValueHandler<T>(f, UpbBind(MyHandler<T>, MyData));
+  /* Like the previous, but templated on the type on the value (ie. int32).
+   * This is mostly useful to call from other templates.  To call this you must
+   * specify the template parameter explicitly, ie:
+   *   h->SetValueHandler<T>(f, UpbBind(MyHandler<T>, MyData)); */
   template <class T>
   bool SetValueHandler(
       const FieldDef *f,
       const typename ValueHandler<typename CanonicalType<T>::Type>::H& handler);
 
-  // Sets handlers for a string field, which are defined as follows:
-  //
-  //   MySubClosure* startstr(MyClosure* c, const MyHandlerData* d,
-  //                          size_t size_hint) {
-  //     // Called when a string value begins.  The return value indicates the
-  //     // closure for the string.  "size_hint" indicates the size of the
-  //     // string if it is known, however if the string is length-delimited
-  //     // and the end-of-string is not available size_hint will be zero.
-  //     // This case is indistinguishable from the case where the size is
-  //     // known to be zero.
-  //     //
-  //     // TODO(haberman): is it important to distinguish these cases?
-  //     // If we had ssize_t as a type we could make -1 "unknown", but
-  //     // ssize_t is POSIX (not ANSI) and therefore less portable.
-  //     // In practice I suspect it won't be important to distinguish.
-  //     return closure;
-  //   }
-  //
-  //   size_t str(MyClosure* closure, const MyHandlerData* d,
-  //              const char *str, size_t len) {
-  //     // Called for each buffer of string data; the multiple physical buffers
-  //     // are all part of the same logical string.  The return value indicates
-  //     // how many bytes were consumed.  If this number is less than "len",
-  //     // this will also indicate that processing should be halted for now,
-  //     // like returning false or UPB_BREAK from any other callback.  If
-  //     // number is greater than "len", the excess bytes will be skipped over
-  //     // and not passed to the callback.
-  //     return len;
-  //   }
-  //
-  //   bool endstr(MyClosure* c, const MyHandlerData* d) {
-  //     // Called when a string value ends.  Return value indicates whether
-  //     // processing should continue.
-  //     return true;
-  //   }
+  /* Sets handlers for a string field, which are defined as follows:
+   *
+   *   MySubClosure* startstr(MyClosure* c, const MyHandlerData* d,
+   *                          size_t size_hint) {
+   *     // Called when a string value begins.  The return value indicates the
+   *     // closure for the string.  "size_hint" indicates the size of the
+   *     // string if it is known, however if the string is length-delimited
+   *     // and the end-of-string is not available size_hint will be zero.
+   *     // This case is indistinguishable from the case where the size is
+   *     // known to be zero.
+   *     //
+   *     // TODO(haberman): is it important to distinguish these cases?
+   *     // If we had ssize_t as a type we could make -1 "unknown", but
+   *     // ssize_t is POSIX (not ANSI) and therefore less portable.
+   *     // In practice I suspect it won't be important to distinguish.
+   *     return closure;
+   *   }
+   *
+   *   size_t str(MyClosure* closure, const MyHandlerData* d,
+   *              const char *str, size_t len) {
+   *     // Called for each buffer of string data; the multiple physical buffers
+   *     // are all part of the same logical string.  The return value indicates
+   *     // how many bytes were consumed.  If this number is less than "len",
+   *     // this will also indicate that processing should be halted for now,
+   *     // like returning false or UPB_BREAK from any other callback.  If
+   *     // number is greater than "len", the excess bytes will be skipped over
+   *     // and not passed to the callback.
+   *     return len;
+   *   }
+   *
+   *   bool endstr(MyClosure* c, const MyHandlerData* d) {
+   *     // Called when a string value ends.  Return value indicates whether
+   *     // processing should continue.
+   *     return true;
+   *   }
+   */
   bool SetStartStringHandler(const FieldDef* f, const StartStringHandler& h);
   bool SetStringHandler(const FieldDef* f, const StringHandler& h);
   bool SetEndStringHandler(const FieldDef* f, const EndFieldHandler& h);
 
-  // Sets the startseq handler, which is defined as follows:
-  //
-  //   MySubClosure *startseq(MyClosure* c, const MyHandlerData* d) {
-  //     // Called when a sequence (repeated field) begins.  The returned
-  //     // pointer indicates the closure for the sequence (or UPB_BREAK
-  //     // to interrupt processing).
-  //     return closure;
-  //   }
-  //
-  //   h->SetStartSequenceHandler(f, UpbBind(startseq, new MyHandlerData(...)));
-  //
-  // Returns "false" if "f" does not belong to this message or is not a
-  // repeated field.
+  /* Sets the startseq handler, which is defined as follows:
+   *
+   *   MySubClosure *startseq(MyClosure* c, const MyHandlerData* d) {
+   *     // Called when a sequence (repeated field) begins.  The returned
+   *     // pointer indicates the closure for the sequence (or UPB_BREAK
+   *     // to interrupt processing).
+   *     return closure;
+   *   }
+   *
+   *   h->SetStartSequenceHandler(f, UpbBind(startseq, new MyHandlerData(...)));
+   *
+   * Returns "false" if "f" does not belong to this message or is not a
+   * repeated field.
+   */
   bool SetStartSequenceHandler(const FieldDef* f, const StartFieldHandler& h);
 
-  // Sets the startsubmsg handler for the given field, which is defined as
-  // follows:
-  //
-  //   MySubClosure* startsubmsg(MyClosure* c, const MyHandlerData* d) {
-  //     // Called when a submessage begins.  The returned pointer indicates the
-  //     // closure for the sequence (or UPB_BREAK to interrupt processing).
-  //     return closure;
-  //   }
-  //
-  //   h->SetStartSubMessageHandler(f, UpbBind(startsubmsg,
-  //                                           new MyHandlerData(...)));
-  //
-  // Returns "false" if "f" does not belong to this message or is not a
-  // submessage/group field.
+  /* Sets the startsubmsg handler for the given field, which is defined as
+   * follows:
+   *
+   *   MySubClosure* startsubmsg(MyClosure* c, const MyHandlerData* d) {
+   *     // Called when a submessage begins.  The returned pointer indicates the
+   *     // closure for the sequence (or UPB_BREAK to interrupt processing).
+   *     return closure;
+   *   }
+   *
+   *   h->SetStartSubMessageHandler(f, UpbBind(startsubmsg,
+   *                                           new MyHandlerData(...)));
+   *
+   * Returns "false" if "f" does not belong to this message or is not a
+   * submessage/group field.
+   */
   bool SetStartSubMessageHandler(const FieldDef* f, const StartFieldHandler& h);
 
-  // Sets the endsubmsg handler for the given field, which is defined as
-  // follows:
-  //
-  //   bool endsubmsg(MyClosure* c, const MyHandlerData* d) {
-  //     // Called when a submessage ends.  Returns true to continue processing.
-  //     return true;
-  //   }
-  //
-  // Returns "false" if "f" does not belong to this message or is not a
-  // submessage/group field.
+  /* Sets the endsubmsg handler for the given field, which is defined as
+   * follows:
+   *
+   *   bool endsubmsg(MyClosure* c, const MyHandlerData* d) {
+   *     // Called when a submessage ends.  Returns true to continue processing.
+   *     return true;
+   *   }
+   *
+   * Returns "false" if "f" does not belong to this message or is not a
+   * submessage/group field.
+   */
   bool SetEndSubMessageHandler(const FieldDef *f, const EndFieldHandler &h);
 
-  // Starts the endsubseq handler for the given field, which is defined as
-  // follows:
-  //
-  //   bool endseq(MyClosure* c, const MyHandlerData* d) {
-  //     // Called when a sequence ends.  Returns true continue processing.
-  //     return true;
-  //   }
-  //
-  // Returns "false" if "f" does not belong to this message or is not a
-  // repeated field.
+  /* Starts the endsubseq handler for the given field, which is defined as
+   * follows:
+   *
+   *   bool endseq(MyClosure* c, const MyHandlerData* d) {
+   *     // Called when a sequence ends.  Returns true continue processing.
+   *     return true;
+   *   }
+   *
+   * Returns "false" if "f" does not belong to this message or is not a
+   * repeated field.
+   */
   bool SetEndSequenceHandler(const FieldDef* f, const EndFieldHandler& h);
 
-  // Sets or gets the object that specifies handlers for the given field, which
-  // must be a submessage or group.  Returns NULL if no handlers are set.
+  /* Sets or gets the object that specifies handlers for the given field, which
+   * must be a submessage or group.  Returns NULL if no handlers are set. */
   bool SetSubHandlers(const FieldDef* f, const Handlers* sub);
   const Handlers* GetSubHandlers(const FieldDef* f) const;
 
-  // Equivalent to GetSubHandlers, but takes the STARTSUBMSG selector for the
-  // field.
+  /* Equivalent to GetSubHandlers, but takes the STARTSUBMSG selector for the
+   * field. */
   const Handlers* GetSubHandlers(Selector startsubmsg) const;
 
-  // A selector refers to a specific field handler in the Handlers object
-  // (for example: the STARTSUBMSG handler for field "field15").
-  // On success, returns true and stores the selector in "s".
-  // If the FieldDef or Type are invalid, returns false.
-  // The returned selector is ONLY valid for Handlers whose MessageDef
-  // contains this FieldDef.
+  /* A selector refers to a specific field handler in the Handlers object
+   * (for example: the STARTSUBMSG handler for field "field15").
+   * On success, returns true and stores the selector in "s".
+   * If the FieldDef or Type are invalid, returns false.
+   * The returned selector is ONLY valid for Handlers whose MessageDef
+   * contains this FieldDef. */
   static bool GetSelector(const FieldDef* f, Type type, Selector* s);
 
-  // Given a START selector of any kind, returns the corresponding END selector.
+  /* Given a START selector of any kind, returns the corresponding END selector. */
   static Selector GetEndSelector(Selector start_selector);
 
-  // Returns the function pointer for this handler.  It is the client's
-  // responsibility to cast to the correct function type before calling it.
+  /* Returns the function pointer for this handler.  It is the client's
+   * responsibility to cast to the correct function type before calling it. */
   GenericFunction* GetHandler(Selector selector);
 
-  // Sets the given attributes to the attributes for this selector.
+  /* Sets the given attributes to the attributes for this selector. */
   bool GetAttributes(Selector selector, HandlerAttributes* attr);
 
-  // Returns the handler data that was registered with this handler.
+  /* Returns the handler data that was registered with this handler. */
   const void* GetHandlerData(Selector selector);
 
-  // Could add any of the following functions as-needed, with some minor
-  // implementation changes:
-  //
-  // const FieldDef* GetFieldDef(Selector selector);
-  // static bool IsSequence(Selector selector);
+  /* Could add any of the following functions as-needed, with some minor
+   * implementation changes:
+   *
+   * const FieldDef* GetFieldDef(Selector selector);
+   * static bool IsSequence(Selector selector); */
 
  private:
-  UPB_DISALLOW_POD_OPS(Handlers, upb::Handlers);
+  UPB_DISALLOW_POD_OPS(Handlers, upb::Handlers)
 
   friend UPB_INLINE GenericFunction *::upb_handlers_gethandler(
       const upb_handlers *h, upb_selector_t s);
   friend UPB_INLINE const void *::upb_handlers_gethandlerdata(
       const upb_handlers *h, upb_selector_t s);
+#else
+struct upb_handlers {
+#endif
+  upb_refcounted base;
 
-,
-UPB_DEFINE_STRUCT(upb_handlers, upb_refcounted,
   const upb_msgdef *msg;
   const upb_handlers **sub;
   const void *top_closure_type;
   upb_inttable cleanup_;
-  upb_status status_;  // Used only when mutable.
-  upb_handlers_tabent table[1];  // Dynamically-sized field handler array.
-));
-
+  upb_status status_;  /* Used only when mutable. */
+  upb_handlers_tabent table[1];  /* Dynamically-sized field handler array. */
+};
 
 #ifdef __cplusplus
 
 namespace upb {
 
-// Convenience macros for creating a Handler object that is wrapped with a
-// type-safe wrapper function that converts the "void*" parameters/returns
-// of the underlying C API into nice C++ function.
-//
-// Sample usage:
-//   void OnValue1(MyClosure* c, const MyHandlerData* d, int32_t val) {
-//     // do stuff ...
-//   }
-//
-//   // Handler that doesn't need any data bound to it.
-//   void OnValue2(MyClosure* c, int32_t val) {
-//     // do stuff ...
-//   }
-//
-//   // Handler that returns bool so it can return failure if necessary.
-//   bool OnValue3(MyClosure* c, int32_t val) {
-//     // do stuff ...
-//     return ok;
-//   }
-//
-//   // Member function handler.
-//   class MyClosure {
-//    public:
-//     void OnValue(int32_t val) {
-//       // do stuff ...
-//     }
-//   };
-//
-//   // Takes ownership of the MyHandlerData.
-//   handlers->SetInt32Handler(f1, UpbBind(OnValue1, new MyHandlerData(...)));
-//   handlers->SetInt32Handler(f2, UpbMakeHandler(OnValue2));
-//   handlers->SetInt32Handler(f1, UpbMakeHandler(OnValue3));
-//   handlers->SetInt32Handler(f2, UpbMakeHandler(&MyClosure::OnValue));
+/* Convenience macros for creating a Handler object that is wrapped with a
+ * type-safe wrapper function that converts the "void*" parameters/returns
+ * of the underlying C API into nice C++ function.
+ *
+ * Sample usage:
+ *   void OnValue1(MyClosure* c, const MyHandlerData* d, int32_t val) {
+ *     // do stuff ...
+ *   }
+ *
+ *   // Handler that doesn't need any data bound to it.
+ *   void OnValue2(MyClosure* c, int32_t val) {
+ *     // do stuff ...
+ *   }
+ *
+ *   // Handler that returns bool so it can return failure if necessary.
+ *   bool OnValue3(MyClosure* c, int32_t val) {
+ *     // do stuff ...
+ *     return ok;
+ *   }
+ *
+ *   // Member function handler.
+ *   class MyClosure {
+ *    public:
+ *     void OnValue(int32_t val) {
+ *       // do stuff ...
+ *     }
+ *   };
+ *
+ *   // Takes ownership of the MyHandlerData.
+ *   handlers->SetInt32Handler(f1, UpbBind(OnValue1, new MyHandlerData(...)));
+ *   handlers->SetInt32Handler(f2, UpbMakeHandler(OnValue2));
+ *   handlers->SetInt32Handler(f1, UpbMakeHandler(OnValue3));
+ *   handlers->SetInt32Handler(f2, UpbMakeHandler(&MyClosure::OnValue));
+ */
 
 #ifdef UPB_CXX11
 
-// In C++11, the "template" disambiguator can appear even outside templates,
-// so all calls can safely use this pair of macros.
+/* In C++11, the "template" disambiguator can appear even outside templates,
+ * so all calls can safely use this pair of macros. */
 
 #define UpbMakeHandler(f) upb::MatchFunc(f).template GetFunc<f>()
 
-// We have to be careful to only evaluate "d" once.
+/* We have to be careful to only evaluate "d" once. */
 #define UpbBind(f, d) upb::MatchFunc(f).template GetFunc<f>((d))
 
 #else
 
-// Prior to C++11, the "template" disambiguator may only appear inside a
-// template, so the regular macro must not use "template"
+/* Prior to C++11, the "template" disambiguator may only appear inside a
+ * template, so the regular macro must not use "template" */
 
 #define UpbMakeHandler(f) upb::MatchFunc(f).GetFunc<f>()
 
 #define UpbBind(f, d) upb::MatchFunc(f).GetFunc<f>((d))
 
-#endif  // UPB_CXX11
+#endif  /* UPB_CXX11 */
 
-// This macro must be used in C++98 for calls from inside a template.  But we
-// define this variant in all cases; code that wants to be compatible with both
-// C++98 and C++11 should always use this macro when calling from a template.
+/* This macro must be used in C++98 for calls from inside a template.  But we
+ * define this variant in all cases; code that wants to be compatible with both
+ * C++98 and C++11 should always use this macro when calling from a template. */
 #define UpbMakeHandlerT(f) upb::MatchFunc(f).template GetFunc<f>()
 
-// We have to be careful to only evaluate "d" once.
+/* We have to be careful to only evaluate "d" once. */
 #define UpbBindT(f, d) upb::MatchFunc(f).template GetFunc<f>((d))
 
-// Handler: a struct that contains the (handler, data, deleter) tuple that is
-// used to register all handlers.  Users can Make() these directly but it's
-// more convenient to use the UpbMakeHandler/UpbBind macros above.
+/* Handler: a struct that contains the (handler, data, deleter) tuple that is
+ * used to register all handlers.  Users can Make() these directly but it's
+ * more convenient to use the UpbMakeHandler/UpbBind macros above. */
 template <class T> class Handler {
  public:
-  // The underlying, handler function signature that upb uses internally.
+  /* The underlying, handler function signature that upb uses internally. */
   typedef T FuncPtr;
 
-  // Intentionally implicit.
+  /* Intentionally implicit. */
   template <class F> Handler(F func);
   ~Handler();
 
@@ -4660,7 +3798,7 @@
     }
   }
 
-  UPB_DISALLOW_COPY_AND_ASSIGN(Handler);
+  UPB_DISALLOW_COPY_AND_ASSIGN(Handler)
   friend class Handlers;
   FuncPtr handler_;
   mutable HandlerAttributes attr_;
@@ -4669,15 +3807,15 @@
   upb_handlerfree *cleanup_func_;
 };
 
-}  // namespace upb
+}  /* namespace upb */
 
-#endif  // __cplusplus
+#endif  /* __cplusplus */
 
 UPB_BEGIN_EXTERN_C
 
-// Native C API.
+/* Native C API. */
 
-// Handler function typedefs.
+/* Handler function typedefs. */
 typedef bool upb_startmsg_handlerfunc(void *c, const void*);
 typedef bool upb_endmsg_handlerfunc(void *c, const void *, upb_status *status);
 typedef void* upb_startfield_handlerfunc(void *c, const void *hd);
@@ -4694,10 +3832,10 @@
 typedef size_t upb_string_handlerfunc(void *c, const void *hd, const char *buf,
                                       size_t n, const upb_bufhandle* handle);
 
-// upb_bufhandle
+/* upb_bufhandle */
 size_t upb_bufhandle_objofs(const upb_bufhandle *h);
 
-// upb_handlerattr
+/* upb_handlerattr */
 void upb_handlerattr_init(upb_handlerattr *attr);
 void upb_handlerattr_uninit(upb_handlerattr *attr);
 
@@ -4715,7 +3853,7 @@
   return attr->handler_data_;
 }
 
-// upb_handlers
+/* upb_handlers */
 typedef void upb_handlers_callback(const void *closure, upb_handlers *h);
 upb_handlers *upb_handlers_new(const upb_msgdef *m,
                                const void *owner);
@@ -4723,12 +3861,9 @@
                                            const void *owner,
                                            upb_handlers_callback *callback,
                                            const void *closure);
-bool upb_handlers_isfrozen(const upb_handlers *h);
-void upb_handlers_ref(const upb_handlers *h, const void *owner);
-void upb_handlers_unref(const upb_handlers *h, const void *owner);
-void upb_handlers_donateref(const upb_handlers *h, const void *from,
-                            const void *to);
-void upb_handlers_checkref(const upb_handlers *h, const void *owner);
+
+/* Include refcounted methods like upb_handlers_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_handlers, upb_handlers_upcast)
 
 const upb_status *upb_handlers_status(upb_handlers *h);
 void upb_handlers_clearerr(upb_handlers *h);
@@ -4799,26 +3934,29 @@
   return upb_handlerattr_handlerdata(&h->table[s].attr);
 }
 
-// Handler types for single fields.
-// Right now we only have one for TYPE_BYTES but ones for other types
-// should follow.
-//
-// These follow the same handlers protocol for fields of a message.
-UPB_DEFINE_CLASS0(upb::BytesHandler,
+#ifdef __cplusplus
+
+/* Handler types for single fields.
+ * Right now we only have one for TYPE_BYTES but ones for other types
+ * should follow.
+ *
+ * These follow the same handlers protocol for fields of a message. */
+class upb::BytesHandler {
  public:
   BytesHandler();
   ~BytesHandler();
-,
-UPB_DEFINE_STRUCT0(upb_byteshandler,
+#else
+struct upb_byteshandler {
+#endif
   upb_handlers_tabent table[3];
-));
+};
 
 void upb_byteshandler_init(upb_byteshandler *h);
 
-// Caller must ensure that "d" outlives the handlers.
-// TODO(haberman): should this have a "freeze" operation?  It's not necessary
-// for memory management, but could be useful to force immutability and provide
-// a convenient moment to verify that all registration succeeded.
+/* Caller must ensure that "d" outlives the handlers.
+ * TODO(haberman): should this have a "freeze" operation?  It's not necessary
+ * for memory management, but could be useful to force immutability and provide
+ * a convenient moment to verify that all registration succeeded. */
 bool upb_byteshandler_setstartstr(upb_byteshandler *h,
                                   upb_startstr_handlerfunc *func, void *d);
 bool upb_byteshandler_setstring(upb_byteshandler *h,
@@ -4826,7 +3964,7 @@
 bool upb_byteshandler_setendstr(upb_byteshandler *h,
                                 upb_endfield_handlerfunc *func, void *d);
 
-// "Static" methods
+/* "Static" methods */
 bool upb_handlers_freeze(upb_handlers *const *handlers, int n, upb_status *s);
 upb_handlertype_t upb_handlers_getprimitivehandlertype(const upb_fielddef *f);
 bool upb_handlers_getselector(const upb_fielddef *f, upb_handlertype_t type,
@@ -4835,7 +3973,7 @@
   return start + 1;
 }
 
-// Internal-only.
+/* Internal-only. */
 uint32_t upb_handlers_selectorbaseoffset(const upb_fielddef *f);
 uint32_t upb_handlers_selectorcount(const upb_fielddef *f);
 
@@ -4856,87 +3994,9 @@
 
 #include <limits.h>
 
-// Type detection and typedefs for integer types.
-// For platforms where there are multiple 32-bit or 64-bit types, we need to be
-// able to enumerate them so we can properly create overloads for all variants.
-//
-// If any platform existed where there were three integer types with the same
-// size, this would have to become more complicated.  For example, short, int,
-// and long could all be 32-bits.  Even more diabolically, short, int, long,
-// and long long could all be 64 bits and still be standard-compliant.
-// However, few platforms are this strange, and it's unlikely that upb will be
-// used on the strangest ones.
+/* C inline methods. */
 
-// Can't count on stdint.h limits like INT32_MAX, because in C++ these are
-// only defined when __STDC_LIMIT_MACROS are defined before the *first* include
-// of stdint.h.  We can't guarantee that someone else didn't include these first
-// without defining __STDC_LIMIT_MACROS.
-#define UPB_INT32_MAX 0x7fffffffLL
-#define UPB_INT32_MIN (-UPB_INT32_MAX - 1)
-#define UPB_INT64_MAX 0x7fffffffffffffffLL
-#define UPB_INT64_MIN (-UPB_INT64_MAX - 1)
-
-#if INT_MAX == UPB_INT32_MAX && INT_MIN == UPB_INT32_MIN
-#define UPB_INT_IS_32BITS 1
-#endif
-
-#if LONG_MAX == UPB_INT32_MAX && LONG_MIN == UPB_INT32_MIN
-#define UPB_LONG_IS_32BITS 1
-#endif
-
-#if LONG_MAX == UPB_INT64_MAX && LONG_MIN == UPB_INT64_MIN
-#define UPB_LONG_IS_64BITS 1
-#endif
-
-#if LLONG_MAX == UPB_INT64_MAX && LLONG_MIN == UPB_INT64_MIN
-#define UPB_LLONG_IS_64BITS 1
-#endif
-
-// We use macros instead of typedefs so we can undefine them later and avoid
-// leaking them outside this header file.
-#if UPB_INT_IS_32BITS
-#define UPB_INT32_T int
-#define UPB_UINT32_T unsigned int
-
-#if UPB_LONG_IS_32BITS
-#define UPB_TWO_32BIT_TYPES 1
-#define UPB_INT32ALT_T long
-#define UPB_UINT32ALT_T unsigned long
-#endif  // UPB_LONG_IS_32BITS
-
-#elif UPB_LONG_IS_32BITS  // && !UPB_INT_IS_32BITS
-#define UPB_INT32_T long
-#define UPB_UINT32_T unsigned long
-#endif  // UPB_INT_IS_32BITS
-
-
-#if UPB_LONG_IS_64BITS
-#define UPB_INT64_T long
-#define UPB_UINT64_T unsigned long
-
-#if UPB_LLONG_IS_64BITS
-#define UPB_TWO_64BIT_TYPES 1
-#define UPB_INT64ALT_T long long
-#define UPB_UINT64ALT_T unsigned long long
-#endif  // UPB_LLONG_IS_64BITS
-
-#elif UPB_LLONG_IS_64BITS  // && !UPB_LONG_IS_64BITS
-#define UPB_INT64_T long long
-#define UPB_UINT64_T unsigned long long
-#endif  // UPB_LONG_IS_64BITS
-
-#undef UPB_INT32_MAX
-#undef UPB_INT32_MIN
-#undef UPB_INT64_MAX
-#undef UPB_INT64_MIN
-#undef UPB_INT_IS_32BITS
-#undef UPB_LONG_IS_32BITS
-#undef UPB_LONG_IS_64BITS
-#undef UPB_LLONG_IS_64BITS
-
-// C inline methods.
-
-// upb_bufhandle
+/* upb_bufhandle */
 UPB_INLINE void upb_bufhandle_init(upb_bufhandle *h) {
   h->obj_ = NULL;
   h->objtype_ = NULL;
@@ -4969,21 +4029,100 @@
 
 #ifdef __cplusplus
 
+/* Type detection and typedefs for integer types.
+ * For platforms where there are multiple 32-bit or 64-bit types, we need to be
+ * able to enumerate them so we can properly create overloads for all variants.
+ *
+ * If any platform existed where there were three integer types with the same
+ * size, this would have to become more complicated.  For example, short, int,
+ * and long could all be 32-bits.  Even more diabolically, short, int, long,
+ * and long long could all be 64 bits and still be standard-compliant.
+ * However, few platforms are this strange, and it's unlikely that upb will be
+ * used on the strangest ones. */
+
+/* Can't count on stdint.h limits like INT32_MAX, because in C++ these are
+ * only defined when __STDC_LIMIT_MACROS are defined before the *first* include
+ * of stdint.h.  We can't guarantee that someone else didn't include these first
+ * without defining __STDC_LIMIT_MACROS. */
+#define UPB_INT32_MAX 0x7fffffffLL
+#define UPB_INT32_MIN (-UPB_INT32_MAX - 1)
+#define UPB_INT64_MAX 0x7fffffffffffffffLL
+#define UPB_INT64_MIN (-UPB_INT64_MAX - 1)
+
+#if INT_MAX == UPB_INT32_MAX && INT_MIN == UPB_INT32_MIN
+#define UPB_INT_IS_32BITS 1
+#endif
+
+#if LONG_MAX == UPB_INT32_MAX && LONG_MIN == UPB_INT32_MIN
+#define UPB_LONG_IS_32BITS 1
+#endif
+
+#if LONG_MAX == UPB_INT64_MAX && LONG_MIN == UPB_INT64_MIN
+#define UPB_LONG_IS_64BITS 1
+#endif
+
+#if LLONG_MAX == UPB_INT64_MAX && LLONG_MIN == UPB_INT64_MIN
+#define UPB_LLONG_IS_64BITS 1
+#endif
+
+/* We use macros instead of typedefs so we can undefine them later and avoid
+ * leaking them outside this header file. */
+#if UPB_INT_IS_32BITS
+#define UPB_INT32_T int
+#define UPB_UINT32_T unsigned int
+
+#if UPB_LONG_IS_32BITS
+#define UPB_TWO_32BIT_TYPES 1
+#define UPB_INT32ALT_T long
+#define UPB_UINT32ALT_T unsigned long
+#endif  /* UPB_LONG_IS_32BITS */
+
+#elif UPB_LONG_IS_32BITS  /* && !UPB_INT_IS_32BITS */
+#define UPB_INT32_T long
+#define UPB_UINT32_T unsigned long
+#endif  /* UPB_INT_IS_32BITS */
+
+
+#if UPB_LONG_IS_64BITS
+#define UPB_INT64_T long
+#define UPB_UINT64_T unsigned long
+
+#if UPB_LLONG_IS_64BITS
+#define UPB_TWO_64BIT_TYPES 1
+#define UPB_INT64ALT_T long long
+#define UPB_UINT64ALT_T unsigned long long
+#endif  /* UPB_LLONG_IS_64BITS */
+
+#elif UPB_LLONG_IS_64BITS  /* && !UPB_LONG_IS_64BITS */
+#define UPB_INT64_T long long
+#define UPB_UINT64_T unsigned long long
+#endif  /* UPB_LONG_IS_64BITS */
+
+#undef UPB_INT32_MAX
+#undef UPB_INT32_MIN
+#undef UPB_INT64_MAX
+#undef UPB_INT64_MIN
+#undef UPB_INT_IS_32BITS
+#undef UPB_LONG_IS_32BITS
+#undef UPB_LONG_IS_64BITS
+#undef UPB_LLONG_IS_64BITS
+
+
 namespace upb {
 
 typedef void CleanupFunc(void *ptr);
 
-// Template to remove "const" from "const T*" and just return "T*".
-//
-// We define a nonsense default because otherwise it will fail to instantiate as
-// a function parameter type even in cases where we don't expect any caller to
-// actually match the overload.
+/* Template to remove "const" from "const T*" and just return "T*".
+ *
+ * We define a nonsense default because otherwise it will fail to instantiate as
+ * a function parameter type even in cases where we don't expect any caller to
+ * actually match the overload. */
 class CouldntRemoveConst {};
 template <class T> struct remove_constptr { typedef CouldntRemoveConst type; };
 template <class T> struct remove_constptr<const T *> { typedef T *type; };
 
-// Template that we use below to remove a template specialization from
-// consideration if it matches a specific type.
+/* Template that we use below to remove a template specialization from
+ * consideration if it matches a specific type. */
 template <class T, class U> struct disable_if_same { typedef void Type; };
 template <class T> struct disable_if_same<T, T> {};
 
@@ -5020,27 +4159,27 @@
 template<class T>
 bool is_same<T, T>::value = true;
 
-// FuncInfo ////////////////////////////////////////////////////////////////////
+/* FuncInfo *******************************************************************/
 
-// Info about the user's original, pre-wrapped function.
+/* Info about the user's original, pre-wrapped function. */
 template <class C, class R = void>
 struct FuncInfo {
-  // The type of the closure that the function takes (its first param).
+  /* The type of the closure that the function takes (its first param). */
   typedef C Closure;
 
-  // The return type.
+  /* The return type. */
   typedef R Return;
 };
 
-// Func ////////////////////////////////////////////////////////////////////////
+/* Func ***********************************************************************/
 
-// Func1, Func2, Func3: Template classes representing a function and its
-// signature.
-//
-// Since the function is a template parameter, calling the function can be
-// inlined at compile-time and does not require a function pointer at runtime.
-// These functions are not bound to a handler data so have no data or cleanup
-// handler.
+/* Func1, Func2, Func3: Template classes representing a function and its
+ * signature.
+ *
+ * Since the function is a template parameter, calling the function can be
+ * inlined at compile-time and does not require a function pointer at runtime.
+ * These functions are not bound to a handler data so have no data or cleanup
+ * handler. */
 struct UnboundFunc {
   CleanupFunc *GetCleanup() { return NULL; }
   void *GetData() { return NULL; }
@@ -5085,13 +4224,13 @@
   }
 };
 
-// BoundFunc ///////////////////////////////////////////////////////////////////
+/* BoundFunc ******************************************************************/
 
-// BoundFunc2, BoundFunc3: Like Func2/Func3 except also contains a value that
-// shall be bound to the function's second parameter.
-//
-// Note that the second parameter is a const pointer, but our stored bound value
-// is non-const so we can free it when the handlers are destroyed.
+/* BoundFunc2, BoundFunc3: Like Func2/Func3 except also contains a value that
+ * shall be bound to the function's second parameter.
+ * 
+ * Note that the second parameter is a const pointer, but our stored bound value
+ * is non-const so we can free it when the handlers are destroyed. */
 template <class T>
 struct BoundFunc {
   typedef typename remove_constptr<T>::type MutableP2;
@@ -5131,13 +4270,13 @@
   explicit BoundFunc5(typename Base::MutableP2 arg) : Base(arg) {}
 };
 
-// FuncSig /////////////////////////////////////////////////////////////////////
+/* FuncSig ********************************************************************/
 
-// FuncSig1, FuncSig2, FuncSig3: template classes reflecting a function
-// *signature*, but without a specific function attached.
-//
-// These classes contain member functions that can be invoked with a
-// specific function to return a Func/BoundFunc class.
+/* FuncSig1, FuncSig2, FuncSig3: template classes reflecting a function
+ * *signature*, but without a specific function attached.
+ *
+ * These classes contain member functions that can be invoked with a
+ * specific function to return a Func/BoundFunc class. */
 template <class R, class P1>
 struct FuncSig1 {
   template <R F(P1)>
@@ -5202,41 +4341,41 @@
   }
 };
 
-// Overloaded template function that can construct the appropriate FuncSig*
-// class given a function pointer by deducing the template parameters.
+/* Overloaded template function that can construct the appropriate FuncSig*
+ * class given a function pointer by deducing the template parameters. */
 template <class R, class P1>
 inline FuncSig1<R, P1> MatchFunc(R (*f)(P1)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return FuncSig1<R, P1>();
 }
 
 template <class R, class P1, class P2>
 inline FuncSig2<R, P1, P2> MatchFunc(R (*f)(P1, P2)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return FuncSig2<R, P1, P2>();
 }
 
 template <class R, class P1, class P2, class P3>
 inline FuncSig3<R, P1, P2, P3> MatchFunc(R (*f)(P1, P2, P3)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return FuncSig3<R, P1, P2, P3>();
 }
 
 template <class R, class P1, class P2, class P3, class P4>
 inline FuncSig4<R, P1, P2, P3, P4> MatchFunc(R (*f)(P1, P2, P3, P4)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return FuncSig4<R, P1, P2, P3, P4>();
 }
 
 template <class R, class P1, class P2, class P3, class P4, class P5>
 inline FuncSig5<R, P1, P2, P3, P4, P5> MatchFunc(R (*f)(P1, P2, P3, P4, P5)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return FuncSig5<R, P1, P2, P3, P4, P5>();
 }
 
-// MethodSig ///////////////////////////////////////////////////////////////////
+/* MethodSig ******************************************************************/
 
-// CallMethod*: a function template that calls a given method.
+/* CallMethod*: a function template that calls a given method. */
 template <class R, class C, R (C::*F)()>
 R CallMethod0(C *obj) {
   return ((*obj).*F)();
@@ -5263,10 +4402,10 @@
   return ((*obj).*F)(arg1, arg2, arg3, arg4);
 }
 
-// MethodSig: like FuncSig, but for member functions.
-//
-// GetFunc() returns a normal FuncN object, so after calling GetFunc() no
-// more logic is required to special-case methods.
+/* MethodSig: like FuncSig, but for member functions.
+ *
+ * GetFunc() returns a normal FuncN object, so after calling GetFunc() no
+ * more logic is required to special-case methods. */
 template <class R, class C>
 struct MethodSig0 {
   template <R (C::*F)()>
@@ -5347,61 +4486,61 @@
 
 template <class R, class C>
 inline MethodSig0<R, C> MatchFunc(R (C::*f)()) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return MethodSig0<R, C>();
 }
 
 template <class R, class C, class P1>
 inline MethodSig1<R, C, P1> MatchFunc(R (C::*f)(P1)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return MethodSig1<R, C, P1>();
 }
 
 template <class R, class C, class P1, class P2>
 inline MethodSig2<R, C, P1, P2> MatchFunc(R (C::*f)(P1, P2)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return MethodSig2<R, C, P1, P2>();
 }
 
 template <class R, class C, class P1, class P2, class P3>
 inline MethodSig3<R, C, P1, P2, P3> MatchFunc(R (C::*f)(P1, P2, P3)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return MethodSig3<R, C, P1, P2, P3>();
 }
 
 template <class R, class C, class P1, class P2, class P3, class P4>
 inline MethodSig4<R, C, P1, P2, P3, P4> MatchFunc(R (C::*f)(P1, P2, P3, P4)) {
-  UPB_UNUSED(f);  // Only used for template parameter deduction.
+  UPB_UNUSED(f);  /* Only used for template parameter deduction. */
   return MethodSig4<R, C, P1, P2, P3, P4>();
 }
 
-// MaybeWrapReturn /////////////////////////////////////////////////////////////
+/* MaybeWrapReturn ************************************************************/
 
-// Template class that attempts to wrap the return value of the function so it
-// matches the expected type.  There are two main adjustments it may make:
-//
-//   1. If the function returns void, make it return the expected type and with
-//      a value that always indicates success.
-//   2. If the function returns bool, make it return the expected type with a
-//      value that indicates success or failure.
-//
-// The "expected type" for return is:
-//   1. void* for start handlers.  If the closure parameter has a different type
-//      we will cast it to void* for the return in the success case.
-//   2. size_t for string buffer handlers.
-//   3. bool for everything else.
+/* Template class that attempts to wrap the return value of the function so it
+ * matches the expected type.  There are two main adjustments it may make:
+ *
+ *   1. If the function returns void, make it return the expected type and with
+ *      a value that always indicates success.
+ *   2. If the function returns bool, make it return the expected type with a
+ *      value that indicates success or failure.
+ *
+ * The "expected type" for return is:
+ *   1. void* for start handlers.  If the closure parameter has a different type
+ *      we will cast it to void* for the return in the success case.
+ *   2. size_t for string buffer handlers.
+ *   3. bool for everything else. */
 
-// Template parameters are FuncN type and desired return type.
+/* Template parameters are FuncN type and desired return type. */
 template <class F, class R, class Enable = void>
 struct MaybeWrapReturn;
 
-// If the return type matches, return the given function unwrapped.
+/* If the return type matches, return the given function unwrapped. */
 template <class F>
 struct MaybeWrapReturn<F, typename F::Return> {
   typedef F Func;
 };
 
-// Function wrapper that munges the return value from void to (bool)true.
+/* Function wrapper that munges the return value from void to (bool)true. */
 template <class P1, class P2, void F(P1, P2)>
 bool ReturnTrue2(P1 p1, P2 p2) {
   F(p1, p2);
@@ -5414,7 +4553,7 @@
   return true;
 }
 
-// Function wrapper that munges the return value from void to (void*)arg1
+/* Function wrapper that munges the return value from void to (void*)arg1  */
 template <class P1, class P2, void F(P1, P2)>
 void *ReturnClosure2(P1 p1, P2 p2) {
   F(p1, p2);
@@ -5427,7 +4566,7 @@
   return p1;
 }
 
-// Function wrapper that munges the return value from R to void*.
+/* Function wrapper that munges the return value from R to void*. */
 template <class R, class P1, class P2, R F(P1, P2)>
 void *CastReturnToVoidPtr2(P1 p1, P2 p2) {
   return F(p1, p2);
@@ -5438,7 +4577,7 @@
   return F(p1, p2, p3);
 }
 
-// Function wrapper that munges the return value from bool to void*.
+/* Function wrapper that munges the return value from bool to void*. */
 template <class P1, class P2, bool F(P1, P2)>
 void *ReturnClosureOrBreak2(P1 p1, P2 p2) {
   return F(p1, p2) ? p1 : UPB_BREAK;
@@ -5449,7 +4588,7 @@
   return F(p1, p2, p3) ? p1 : UPB_BREAK;
 }
 
-// For the string callback, which takes five params, returns the size param.
+/* For the string callback, which takes five params, returns the size param. */
 template <class P1, class P2,
           void F(P1, P2, const char *, size_t, const BufferHandle *)>
 size_t ReturnStringLen(P1 p1, P2 p2, const char *p3, size_t p4,
@@ -5458,8 +4597,8 @@
   return p4;
 }
 
-// For the string callback, which takes five params, returns the size param or
-// zero.
+/* For the string callback, which takes five params, returns the size param or
+ * zero. */
 template <class P1, class P2,
           bool F(P1, P2, const char *, size_t, const BufferHandle *)>
 size_t ReturnNOr0(P1 p1, P2 p2, const char *p3, size_t p4,
@@ -5467,8 +4606,8 @@
   return F(p1, p2, p3, p4, p5) ? p4 : 0;
 }
 
-// If we have a function returning void but want a function returning bool, wrap
-// it in a function that returns true.
+/* If we have a function returning void but want a function returning bool, wrap
+ * it in a function that returns true. */
 template <class P1, class P2, void F(P1, P2), class I>
 struct MaybeWrapReturn<Func2<void, P1, P2, F, I>, bool> {
   typedef Func2<bool, P1, P2, ReturnTrue2<P1, P2, F>, I> Func;
@@ -5479,8 +4618,8 @@
   typedef Func3<bool, P1, P2, P3, ReturnTrue3<P1, P2, P3, F>, I> Func;
 };
 
-// If our function returns void but we want one returning void*, wrap it in a
-// function that returns the first argument.
+/* If our function returns void but we want one returning void*, wrap it in a
+ * function that returns the first argument. */
 template <class P1, class P2, void F(P1, P2), class I>
 struct MaybeWrapReturn<Func2<void, P1, P2, F, I>, void *> {
   typedef Func2<void *, P1, P2, ReturnClosure2<P1, P2, F>, I> Func;
@@ -5491,8 +4630,8 @@
   typedef Func3<void *, P1, P2, P3, ReturnClosure3<P1, P2, P3, F>, I> Func;
 };
 
-// If our function returns R* but we want one returning void*, wrap it in a
-// function that casts to void*.
+/* If our function returns R* but we want one returning void*, wrap it in a
+ * function that casts to void*. */
 template <class R, class P1, class P2, R *F(P1, P2), class I>
 struct MaybeWrapReturn<Func2<R *, P1, P2, F, I>, void *,
                        typename disable_if_same<R *, void *>::Type> {
@@ -5506,8 +4645,8 @@
       Func;
 };
 
-// If our function returns bool but we want one returning void*, wrap it in a
-// function that returns either the first param or UPB_BREAK.
+/* If our function returns bool but we want one returning void*, wrap it in a
+ * function that returns either the first param or UPB_BREAK. */
 template <class P1, class P2, bool F(P1, P2), class I>
 struct MaybeWrapReturn<Func2<bool, P1, P2, F, I>, void *> {
   typedef Func2<void *, P1, P2, ReturnClosureOrBreak2<P1, P2, F>, I> Func;
@@ -5519,8 +4658,8 @@
       Func;
 };
 
-// If our function returns void but we want one returning size_t, wrap it in a
-// function that returns the size argument.
+/* If our function returns void but we want one returning size_t, wrap it in a
+ * function that returns the size argument. */
 template <class P1, class P2,
           void F(P1, P2, const char *, size_t, const BufferHandle *), class I>
 struct MaybeWrapReturn<
@@ -5530,8 +4669,8 @@
                 ReturnStringLen<P1, P2, F>, I> Func;
 };
 
-// If our function returns bool but we want one returning size_t, wrap it in a
-// function that returns either 0 or the buf size.
+/* If our function returns bool but we want one returning size_t, wrap it in a
+ * function that returns either 0 or the buf size. */
 template <class P1, class P2,
           bool F(P1, P2, const char *, size_t, const BufferHandle *), class I>
 struct MaybeWrapReturn<
@@ -5541,16 +4680,16 @@
                 ReturnNOr0<P1, P2, F>, I> Func;
 };
 
-// ConvertParams ///////////////////////////////////////////////////////////////
+/* ConvertParams **************************************************************/
 
-// Template class that converts the function parameters if necessary, and
-// ignores the HandlerData parameter if appropriate.
-//
-// Template parameter is the are FuncN function type.
+/* Template class that converts the function parameters if necessary, and
+ * ignores the HandlerData parameter if appropriate.
+ *
+ * Template parameter is the are FuncN function type. */
 template <class F, class T>
 struct ConvertParams;
 
-// Function that discards the handler data parameter.
+/* Function that discards the handler data parameter. */
 template <class R, class P1, R F(P1)>
 R IgnoreHandlerData2(void *p1, const void *hd) {
   UPB_UNUSED(hd);
@@ -5584,7 +4723,7 @@
   return F(static_cast<P1>(p1), p2, p3);
 }
 
-// Function that casts the handler data parameter.
+/* Function that casts the handler data parameter. */
 template <class R, class P1, class P2, R F(P1, P2)>
 R CastHandlerData2(void *c, const void *hd) {
   return F(static_cast<P1>(c), static_cast<P2>(hd));
@@ -5609,7 +4748,7 @@
   return F(static_cast<P1>(c), static_cast<P2>(hd), p3, p4);
 }
 
-// For unbound functions, ignore the handler data.
+/* For unbound functions, ignore the handler data. */
 template <class R, class P1, R F(P1), class I, class T>
 struct ConvertParams<Func1<R, P1, F, I>, T> {
   typedef Func2<R, void *, const void *, IgnoreHandlerData2<R, P1, F>, I> Func;
@@ -5623,8 +4762,8 @@
                 IgnoreHandlerData3<R, P1, P3_2, P2, F>, I> Func;
 };
 
-// For StringBuffer only; this ignores both the handler data and the
-// BufferHandle.
+/* For StringBuffer only; this ignores both the handler data and the
+ * BufferHandle. */
 template <class R, class P1, R F(P1, const char *, size_t), class I, class T>
 struct ConvertParams<Func3<R, P1, const char *, size_t, F, I>, T> {
   typedef Func5<R, void *, const void *, const char *, size_t,
@@ -5639,7 +4778,7 @@
                 IgnoreHandlerData5<R, P1, P2, P3, P4, F>, I> Func;
 };
 
-// For bound functions, cast the handler data.
+/* For bound functions, cast the handler data. */
 template <class R, class P1, class P2, R F(P1, P2), class I, class T>
 struct ConvertParams<BoundFunc2<R, P1, P2, F, I>, T> {
   typedef Func2<R, void *, const void *, CastHandlerData2<R, P1, P2, F>, I>
@@ -5654,7 +4793,7 @@
                 CastHandlerData3<R, P1, P2, P3_2, P3, F>, I> Func;
 };
 
-// For StringBuffer only; this ignores the BufferHandle.
+/* For StringBuffer only; this ignores the BufferHandle. */
 template <class R, class P1, class P2, R F(P1, P2, const char *, size_t),
           class I, class T>
 struct ConvertParams<BoundFunc4<R, P1, P2, const char *, size_t, F, I>, T> {
@@ -5670,8 +4809,8 @@
                 CastHandlerData5<R, P1, P2, P3, P4, P5, F>, I> Func;
 };
 
-// utype/ltype are upper/lower-case, ctype is canonical C type, vtype is
-// variant C type.
+/* utype/ltype are upper/lower-case, ctype is canonical C type, vtype is
+ * variant C type. */
 #define TYPE_METHODS(utype, ltype, ctype, vtype)                               \
   template <> struct CanonicalType<vtype> {                                    \
     typedef ctype Type;                                                        \
@@ -5686,22 +4825,22 @@
     return upb_handlers_set##ltype(this, f, handler.handler_, &handler.attr_); \
   }                                                                            \
 
-TYPE_METHODS(Double, double, double,   double);
-TYPE_METHODS(Float,  float,  float,    float);
-TYPE_METHODS(UInt64, uint64, uint64_t, UPB_UINT64_T);
-TYPE_METHODS(UInt32, uint32, uint32_t, UPB_UINT32_T);
-TYPE_METHODS(Int64,  int64,  int64_t,  UPB_INT64_T);
-TYPE_METHODS(Int32,  int32,  int32_t,  UPB_INT32_T);
-TYPE_METHODS(Bool,   bool,   bool,     bool);
+TYPE_METHODS(Double, double, double,   double)
+TYPE_METHODS(Float,  float,  float,    float)
+TYPE_METHODS(UInt64, uint64, uint64_t, UPB_UINT64_T)
+TYPE_METHODS(UInt32, uint32, uint32_t, UPB_UINT32_T)
+TYPE_METHODS(Int64,  int64,  int64_t,  UPB_INT64_T)
+TYPE_METHODS(Int32,  int32,  int32_t,  UPB_INT32_T)
+TYPE_METHODS(Bool,   bool,   bool,     bool)
 
 #ifdef UPB_TWO_32BIT_TYPES
-TYPE_METHODS(Int32,  int32,  int32_t,  UPB_INT32ALT_T);
-TYPE_METHODS(UInt32, uint32, uint32_t, UPB_UINT32ALT_T);
+TYPE_METHODS(Int32,  int32,  int32_t,  UPB_INT32ALT_T)
+TYPE_METHODS(UInt32, uint32, uint32_t, UPB_UINT32ALT_T)
 #endif
 
 #ifdef UPB_TWO_64BIT_TYPES
-TYPE_METHODS(Int64,  int64,  int64_t,  UPB_INT64ALT_T);
-TYPE_METHODS(UInt64, uint64, uint64_t, UPB_UINT64ALT_T);
+TYPE_METHODS(Int64,  int64,  int64_t,  UPB_INT64ALT_T)
+TYPE_METHODS(UInt64, uint64, uint64_t, UPB_UINT64ALT_T)
 #endif
 #undef TYPE_METHODS
 
@@ -5709,7 +4848,8 @@
   typedef Status* Type;
 };
 
-// Type methods that are only one-per-canonical-type and not one-per-cvariant.
+/* Type methods that are only one-per-canonical-type and not
+ * one-per-cvariant. */
 
 #define TYPE_METHODS(utype, ctype) \
     inline bool Handlers::Set##utype##Handler(const FieldDef *f, \
@@ -5717,13 +4857,13 @@
       return SetValueHandler<ctype>(f, h); \
     } \
 
-TYPE_METHODS(Double, double);
-TYPE_METHODS(Float,  float);
-TYPE_METHODS(UInt64, uint64_t);
-TYPE_METHODS(UInt32, uint32_t);
-TYPE_METHODS(Int64,  int64_t);
-TYPE_METHODS(Int32,  int32_t);
-TYPE_METHODS(Bool,   bool);
+TYPE_METHODS(Double, double)
+TYPE_METHODS(Float,  float)
+TYPE_METHODS(UInt64, uint64_t)
+TYPE_METHODS(UInt32, uint32_t)
+TYPE_METHODS(Int64,  int64_t)
+TYPE_METHODS(Int32,  int32_t)
+TYPE_METHODS(Bool,   bool)
 #undef TYPE_METHODS
 
 template <class F> struct ReturnOf;
@@ -5766,23 +4906,23 @@
       ReturnWrappedFunc;
   handler_ = ReturnWrappedFunc().Call;
 
-  // Set attributes based on what templates can statically tell us about the
-  // user's function.
+  /* Set attributes based on what templates can statically tell us about the
+   * user's function. */
 
-  // If the original function returns void, then we know that we wrapped it to
-  // always return ok.
+  /* If the original function returns void, then we know that we wrapped it to
+   * always return ok. */
   bool always_ok = is_same<typename F::FuncInfo::Return, void>::value;
   attr_.SetAlwaysOk(always_ok);
 
-  // Closure parameter and return type.
+  /* Closure parameter and return type. */
   attr_.SetClosureType(UniquePtrForType<typename F::FuncInfo::Closure>());
 
-  // We use the closure type (from the first parameter) if the return type is
-  // void or bool, since these are the two cases we wrap to return the closure's
-  // type anyway.
-  //
-  // This is all nonsense for non START* handlers, but it doesn't matter because
-  // in that case the value will be ignored.
+  /* We use the closure type (from the first parameter) if the return type is
+   * void or bool, since these are the two cases we wrap to return the closure's
+   * type anyway.
+   *
+   * This is all nonsense for non START* handlers, but it doesn't matter because
+   * in that case the value will be ignored. */
   typedef typename FirstUnlessVoidOrBool<typename F::FuncInfo::Return,
                                          typename F::FuncInfo::Closure>::value
       EffectiveReturn;
@@ -5853,19 +4993,6 @@
   const upb_handlers *h = upb_handlers_newfrozen(m, &h, callback, closure);
   return reffed_ptr<const Handlers>(h, &h);
 }
-inline bool Handlers::IsFrozen() const { return upb_handlers_isfrozen(this); }
-inline void Handlers::Ref(const void *owner) const {
-  upb_handlers_ref(this, owner);
-}
-inline void Handlers::Unref(const void *owner) const {
-  upb_handlers_unref(this, owner);
-}
-inline void Handlers::DonateRef(const void *from, const void *to) const {
-  upb_handlers_donateref(this, from, to);
-}
-inline void Handlers::CheckRef(const void *owner) const {
-  upb_handlers_checkref(this, owner);
-}
 inline const Status* Handlers::status() {
   return upb_handlers_status(this);
 }
@@ -5981,9 +5108,9 @@
 
 inline BytesHandler::~BytesHandler() {}
 
-}  // namespace upb
+}  /* namespace upb */
 
-#endif  // __cplusplus
+#endif  /* __cplusplus */
 
 
 #undef UPB_TWO_32BIT_TYPES
@@ -5997,9 +5124,9 @@
 #undef UPB_INT64ALT_T
 #undef UPB_UINT64ALT_T
 
-#endif  // UPB_HANDLERS_INL_H_
+#endif  /* UPB_HANDLERS_INL_H_ */
 
-#endif  // UPB_HANDLERS_H
+#endif  /* UPB_HANDLERS_H */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -6028,32 +5155,34 @@
 }
 #endif
 
-UPB_DECLARE_TYPE(upb::Environment, upb_env);
-UPB_DECLARE_TYPE(upb::SeededAllocator, upb_seededalloc);
+UPB_DECLARE_TYPE(upb::Environment, upb_env)
+UPB_DECLARE_TYPE(upb::SeededAllocator, upb_seededalloc)
 
 typedef void *upb_alloc_func(void *ud, void *ptr, size_t oldsize, size_t size);
 typedef void upb_cleanup_func(void *ud);
 typedef bool upb_error_func(void *ud, const upb_status *status);
 
-// An environment is *not* thread-safe.
-UPB_DEFINE_CLASS0(upb::Environment,
+#ifdef __cplusplus
+
+/* An environment is *not* thread-safe. */
+class upb::Environment {
  public:
   Environment();
   ~Environment();
 
-  // Set a custom memory allocation function for the environment.  May ONLY
-  // be called before any calls to Malloc()/Realloc()/AddCleanup() below.
-  // If this is not called, the system realloc() function will be used.
-  // The given user pointer "ud" will be passed to the allocation function.
-  //
-  // The allocation function will not receive corresponding "free" calls.  it
-  // must ensure that the memory is valid for the lifetime of the Environment,
-  // but it may be reclaimed any time thereafter.  The likely usage is that
-  // "ud" points to a stateful allocator, and that the allocator frees all
-  // memory, arena-style, when it is destroyed.  In this case the allocator must
-  // outlive the Environment.  Another possibility is that the allocation
-  // function returns GC-able memory that is guaranteed to be GC-rooted for the
-  // life of the Environment.
+  /* Set a custom memory allocation function for the environment.  May ONLY
+   * be called before any calls to Malloc()/Realloc()/AddCleanup() below.
+   * If this is not called, the system realloc() function will be used.
+   * The given user pointer "ud" will be passed to the allocation function.
+   *
+   * The allocation function will not receive corresponding "free" calls.  it
+   * must ensure that the memory is valid for the lifetime of the Environment,
+   * but it may be reclaimed any time thereafter.  The likely usage is that
+   * "ud" points to a stateful allocator, and that the allocator frees all
+   * memory, arena-style, when it is destroyed.  In this case the allocator must
+   * outlive the Environment.  Another possibility is that the allocation
+   * function returns GC-able memory that is guaranteed to be GC-rooted for the
+   * life of the Environment. */
   void SetAllocationFunction(upb_alloc_func* alloc, void* ud);
 
   template<class T>
@@ -6061,74 +5190,76 @@
     SetAllocationFunction(allocator->GetAllocationFunction(), allocator);
   }
 
-  // Set a custom error reporting function.
+  /* Set a custom error reporting function. */
   void SetErrorFunction(upb_error_func* func, void* ud);
 
-  // Set the error reporting function to simply copy the status to the given
-  // status and abort.
+  /* Set the error reporting function to simply copy the status to the given
+   * status and abort. */
   void ReportErrorsTo(Status* status);
 
-  // Returns true if all allocations and AddCleanup() calls have succeeded,
-  // and no errors were reported with ReportError() (except ones that recovered
-  // successfully).
+  /* Returns true if all allocations and AddCleanup() calls have succeeded,
+   * and no errors were reported with ReportError() (except ones that recovered
+   * successfully). */
   bool ok() const;
 
-  //////////////////////////////////////////////////////////////////////////////
-  // Functions for use by encoders/decoders.
+  /* Functions for use by encoders/decoders. **********************************/
 
-  // Reports an error to this environment's callback, returning true if
-  // the caller should try to recover.
+  /* Reports an error to this environment's callback, returning true if
+   * the caller should try to recover. */
   bool ReportError(const Status* status);
 
-  // Allocate memory.  Uses the environment's allocation function.
-  //
-  // There is no need to free(). All memory will be freed automatically, but is
-  // guaranteed to outlive the Environment.
+  /* Allocate memory.  Uses the environment's allocation function.
+   *
+   * There is no need to free(). All memory will be freed automatically, but is
+   * guaranteed to outlive the Environment. */
   void* Malloc(size_t size);
 
-  // Reallocate memory.  Preserves "oldsize" bytes from the existing buffer
-  // Requires: oldsize <= existing_size.
-  //
-  // TODO(haberman): should we also enforce that oldsize <= size?
+  /* Reallocate memory.  Preserves "oldsize" bytes from the existing buffer
+   * Requires: oldsize <= existing_size.
+   *
+   * TODO(haberman): should we also enforce that oldsize <= size? */
   void* Realloc(void* ptr, size_t oldsize, size_t size);
 
-  // Add a cleanup function to run when the environment is destroyed.
-  // Returns false on out-of-memory.
-  //
-  // The first call to AddCleanup() after SetAllocationFunction() is guaranteed
-  // to return true -- this makes it possible to robustly set a cleanup handler
-  // for a custom allocation function.
+  /* Add a cleanup function to run when the environment is destroyed.
+   * Returns false on out-of-memory.
+   *
+   * The first call to AddCleanup() after SetAllocationFunction() is guaranteed
+   * to return true -- this makes it possible to robustly set a cleanup handler
+   * for a custom allocation function. */
   bool AddCleanup(upb_cleanup_func* func, void* ud);
 
-  // Total number of bytes that have been allocated.  It is undefined what
-  // Realloc() does to this counter.
+  /* Total number of bytes that have been allocated.  It is undefined what
+   * Realloc() does to this counter. */
   size_t BytesAllocated() const;
 
  private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(Environment);
-,
-UPB_DEFINE_STRUCT0(upb_env,
+  UPB_DISALLOW_COPY_AND_ASSIGN(Environment)
+
+#else
+struct upb_env {
+#endif  /* __cplusplus */
+
   bool ok_;
   size_t bytes_allocated;
 
-  // Alloc function.
+  /* Alloc function. */
   upb_alloc_func *alloc;
   void *alloc_ud;
 
-  // Error-reporting function.
+  /* Error-reporting function. */
   upb_error_func *err;
   void *err_ud;
 
-  // Userdata for default alloc func.
+  /* Userdata for default alloc func. */
   void *default_alloc_ud;
 
-  // Cleanup entries.  Pointer to a cleanup_ent, defined in env.c
+  /* Cleanup entries.  Pointer to a cleanup_ent, defined in env.c */
   void *cleanup_head;
 
-  // For future expansion, since the size of this struct is exposed to users.
+  /* For future expansion, since the size of this struct is exposed to users. */
   void *future1;
   void *future2;
-));
+};
 
 UPB_BEGIN_EXTERN_C
 
@@ -6146,46 +5277,51 @@
 
 UPB_END_EXTERN_C
 
-// An allocator that allocates from an initial memory region (likely the stack)
-// before falling back to another allocator.
-UPB_DEFINE_CLASS0(upb::SeededAllocator,
+#ifdef __cplusplus
+
+/* An allocator that allocates from an initial memory region (likely the stack)
+ * before falling back to another allocator. */
+class upb::SeededAllocator {
  public:
   SeededAllocator(void *mem, size_t len);
   ~SeededAllocator();
 
-  // Set a custom fallback memory allocation function for the allocator, to use
-  // once the initial region runs out.
-  //
-  // May ONLY be called before GetAllocationFunction().  If this is not
-  // called, the system realloc() will be the fallback allocator.
+  /* Set a custom fallback memory allocation function for the allocator, to use
+   * once the initial region runs out.
+   *
+   * May ONLY be called before GetAllocationFunction().  If this is not
+   * called, the system realloc() will be the fallback allocator. */
   void SetFallbackAllocator(upb_alloc_func *alloc, void *ud);
 
-  // Gets the allocation function for this allocator.
+  /* Gets the allocation function for this allocator. */
   upb_alloc_func* GetAllocationFunction();
 
  private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(SeededAllocator);
-,
-UPB_DEFINE_STRUCT0(upb_seededalloc,
-  // Fallback alloc function.
+  UPB_DISALLOW_COPY_AND_ASSIGN(SeededAllocator)
+
+#else
+struct upb_seededalloc {
+#endif  /* __cplusplus */
+
+  /* Fallback alloc function.  */
   upb_alloc_func *alloc;
   upb_cleanup_func *alloc_cleanup;
   void *alloc_ud;
   bool need_cleanup;
   bool returned_allocfunc;
 
-  // Userdata for default alloc func.
+  /* Userdata for default alloc func. */
   void *default_alloc_ud;
 
-  // Pointers for the initial memory region.
+  /* Pointers for the initial memory region. */
   char *mem_base;
   char *mem_ptr;
   char *mem_limit;
 
-  // For future expansion, since the size of this struct is exposed to users.
+  /* For future expansion, since the size of this struct is exposed to users. */
   void *future1;
   void *future2;
-));
+};
 
 UPB_BEGIN_EXTERN_C
 
@@ -6250,11 +5386,11 @@
   return upb_seededalloc_getallocfunc(this);
 }
 
-}  // namespace upb
+}  /* namespace upb */
 
-#endif  // __cplusplus
+#endif  /* __cplusplus */
 
-#endif  // UPB_ENV_H_
+#endif  /* UPB_ENV_H_ */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -6286,88 +5422,90 @@
 }
 #endif
 
-UPB_DECLARE_TYPE(upb::BufferSource, upb_bufsrc);
-UPB_DECLARE_TYPE(upb::BytesSink, upb_bytessink);
-UPB_DECLARE_TYPE(upb::Sink, upb_sink);
+UPB_DECLARE_TYPE(upb::BufferSource, upb_bufsrc)
+UPB_DECLARE_TYPE(upb::BytesSink, upb_bytessink)
+UPB_DECLARE_TYPE(upb::Sink, upb_sink)
 
-// A upb::Sink is an object that binds a upb::Handlers object to some runtime
-// state.  It represents an endpoint to which data can be sent.
-//
-// TODO(haberman): right now all of these functions take selectors.  Should they
-// take selectorbase instead?
-//
-// ie. instead of calling:
-//   sink->StartString(FOO_FIELD_START_STRING, ...)
-// a selector base would let you say:
-//   sink->StartString(FOO_FIELD, ...)
-//
-// This would make call sites a little nicer and require emitting fewer selector
-// definitions in .h files.
-//
-// But the current scheme has the benefit that you can retrieve a function
-// pointer for any handler with handlers->GetHandler(selector), without having
-// to have a separate GetHandler() function for each handler type.  The JIT
-// compiler uses this.  To accommodate we'd have to expose a separate
-// GetHandler() for every handler type.
-//
-// Also to ponder: selectors right now are independent of a specific Handlers
-// instance.  In other words, they allocate a number to every possible handler
-// that *could* be registered, without knowing anything about what handlers
-// *are* registered.  That means that using selectors as table offsets prohibits
-// us from compacting the handler table at Freeze() time.  If the table is very
-// sparse, this could be wasteful.
-//
-// Having another selector-like thing that is specific to a Handlers instance
-// would allow this compacting, but then it would be impossible to write code
-// ahead-of-time that can be bound to any Handlers instance at runtime.  For
-// example, a .proto file parser written as straight C will not know what
-// Handlers it will be bound to, so when it calls sink->StartString() what
-// selector will it pass?  It needs a selector like we have today, that is
-// independent of any particular upb::Handlers.
-//
-// Is there a way then to allow Handlers table compaction?
-UPB_DEFINE_CLASS0(upb::Sink,
+#ifdef __cplusplus
+
+/* A upb::Sink is an object that binds a upb::Handlers object to some runtime
+ * state.  It represents an endpoint to which data can be sent.
+ *
+ * TODO(haberman): right now all of these functions take selectors.  Should they
+ * take selectorbase instead?
+ *
+ * ie. instead of calling:
+ *   sink->StartString(FOO_FIELD_START_STRING, ...)
+ * a selector base would let you say:
+ *   sink->StartString(FOO_FIELD, ...)
+ *
+ * This would make call sites a little nicer and require emitting fewer selector
+ * definitions in .h files.
+ *
+ * But the current scheme has the benefit that you can retrieve a function
+ * pointer for any handler with handlers->GetHandler(selector), without having
+ * to have a separate GetHandler() function for each handler type.  The JIT
+ * compiler uses this.  To accommodate we'd have to expose a separate
+ * GetHandler() for every handler type.
+ *
+ * Also to ponder: selectors right now are independent of a specific Handlers
+ * instance.  In other words, they allocate a number to every possible handler
+ * that *could* be registered, without knowing anything about what handlers
+ * *are* registered.  That means that using selectors as table offsets prohibits
+ * us from compacting the handler table at Freeze() time.  If the table is very
+ * sparse, this could be wasteful.
+ *
+ * Having another selector-like thing that is specific to a Handlers instance
+ * would allow this compacting, but then it would be impossible to write code
+ * ahead-of-time that can be bound to any Handlers instance at runtime.  For
+ * example, a .proto file parser written as straight C will not know what
+ * Handlers it will be bound to, so when it calls sink->StartString() what
+ * selector will it pass?  It needs a selector like we have today, that is
+ * independent of any particular upb::Handlers.
+ *
+ * Is there a way then to allow Handlers table compaction? */
+class upb::Sink {
  public:
-  // Constructor with no initialization; must be Reset() before use.
+  /* Constructor with no initialization; must be Reset() before use. */
   Sink() {}
 
-  // Constructs a new sink for the given frozen handlers and closure.
-  //
-  // TODO: once the Handlers know the expected closure type, verify that T
-  // matches it.
+  /* Constructs a new sink for the given frozen handlers and closure.
+   *
+   * TODO: once the Handlers know the expected closure type, verify that T
+   * matches it. */
   template <class T> Sink(const Handlers* handlers, T* closure);
 
-  // Resets the value of the sink.
+  /* Resets the value of the sink. */
   template <class T> void Reset(const Handlers* handlers, T* closure);
 
-  // Returns the top-level object that is bound to this sink.
-  //
-  // TODO: once the Handlers know the expected closure type, verify that T
-  // matches it.
+  /* Returns the top-level object that is bound to this sink.
+   *
+   * TODO: once the Handlers know the expected closure type, verify that T
+   * matches it. */
   template <class T> T* GetObject() const;
 
-  // Functions for pushing data into the sink.
-  //
-  // These return false if processing should stop (either due to error or just
-  // to suspend).
-  //
-  // These may not be called from within one of the same sink's handlers (in
-  // other words, handlers are not re-entrant).
+  /* Functions for pushing data into the sink.
+   *
+   * These return false if processing should stop (either due to error or just
+   * to suspend).
+   *
+   * These may not be called from within one of the same sink's handlers (in
+   * other words, handlers are not re-entrant). */
 
-  // Should be called at the start and end of every message; both the top-level
-  // message and submessages.  This means that submessages should use the
-  // following sequence:
-  //   sink->StartSubMessage(startsubmsg_selector);
-  //   sink->StartMessage();
-  //   // ...
-  //   sink->EndMessage(&status);
-  //   sink->EndSubMessage(endsubmsg_selector);
+  /* Should be called at the start and end of every message; both the top-level
+   * message and submessages.  This means that submessages should use the
+   * following sequence:
+   *   sink->StartSubMessage(startsubmsg_selector);
+   *   sink->StartMessage();
+   *   // ...
+   *   sink->EndMessage(&status);
+   *   sink->EndSubMessage(endsubmsg_selector); */
   bool StartMessage();
   bool EndMessage(Status* status);
 
-  // Putting of individual values.  These work for both repeated and
-  // non-repeated fields, but for repeated fields you must wrap them in
-  // calls to StartSequence()/EndSequence().
+  /* Putting of individual values.  These work for both repeated and
+   * non-repeated fields, but for repeated fields you must wrap them in
+   * calls to StartSequence()/EndSequence(). */
   bool PutInt32(Handlers::Selector s, int32_t val);
   bool PutInt64(Handlers::Selector s, int64_t val);
   bool PutUInt32(Handlers::Selector s, uint32_t val);
@@ -6376,92 +5514,101 @@
   bool PutDouble(Handlers::Selector s, double val);
   bool PutBool(Handlers::Selector s, bool val);
 
-  // Putting of string/bytes values.  Each string can consist of zero or more
-  // non-contiguous buffers of data.
-  //
-  // For StartString(), the function will write a sink for the string to "sub."
-  // The sub-sink must be used for any/all PutStringBuffer() calls.
+  /* Putting of string/bytes values.  Each string can consist of zero or more
+   * non-contiguous buffers of data.
+   *
+   * For StartString(), the function will write a sink for the string to "sub."
+   * The sub-sink must be used for any/all PutStringBuffer() calls. */
   bool StartString(Handlers::Selector s, size_t size_hint, Sink* sub);
   size_t PutStringBuffer(Handlers::Selector s, const char *buf, size_t len,
                          const BufferHandle *handle);
   bool EndString(Handlers::Selector s);
 
-  // For submessage fields.
-  //
-  // For StartSubMessage(), the function will write a sink for the string to
-  // "sub." The sub-sink must be used for any/all handlers called within the
-  // submessage.
+  /* For submessage fields.
+   *
+   * For StartSubMessage(), the function will write a sink for the string to
+   * "sub." The sub-sink must be used for any/all handlers called within the
+   * submessage. */
   bool StartSubMessage(Handlers::Selector s, Sink* sub);
   bool EndSubMessage(Handlers::Selector s);
 
-  // For repeated fields of any type, the sequence of values must be wrapped in
-  // these calls.
-  //
-  // For StartSequence(), the function will write a sink for the string to
-  // "sub." The sub-sink must be used for any/all handlers called within the
-  // sequence.
+  /* For repeated fields of any type, the sequence of values must be wrapped in
+   * these calls.
+   *
+   * For StartSequence(), the function will write a sink for the string to
+   * "sub." The sub-sink must be used for any/all handlers called within the
+   * sequence. */
   bool StartSequence(Handlers::Selector s, Sink* sub);
   bool EndSequence(Handlers::Selector s);
 
-  // Copy and assign specifically allowed.
-  // We don't even bother making these members private because so many
-  // functions need them and this is mainly just a dumb data container anyway.
-,
-UPB_DEFINE_STRUCT0(upb_sink,
+  /* Copy and assign specifically allowed.
+   * We don't even bother making these members private because so many
+   * functions need them and this is mainly just a dumb data container anyway.
+   */
+#else
+struct upb_sink {
+#endif
   const upb_handlers *handlers;
   void *closure;
-));
+};
 
-UPB_DEFINE_CLASS0(upb::BytesSink,
+#ifdef __cplusplus
+class upb::BytesSink {
  public:
   BytesSink() {}
 
-  // Constructs a new sink for the given frozen handlers and closure.
-  //
-  // TODO(haberman): once the Handlers know the expected closure type, verify
-  // that T matches it.
+  /* Constructs a new sink for the given frozen handlers and closure.
+   *
+   * TODO(haberman): once the Handlers know the expected closure type, verify
+   * that T matches it. */
   template <class T> BytesSink(const BytesHandler* handler, T* closure);
 
-  // Resets the value of the sink.
+  /* Resets the value of the sink. */
   template <class T> void Reset(const BytesHandler* handler, T* closure);
 
   bool Start(size_t size_hint, void **subc);
   size_t PutBuffer(void *subc, const char *buf, size_t len,
                    const BufferHandle *handle);
   bool End();
-,
-UPB_DEFINE_STRUCT0(upb_bytessink,
+#else
+struct upb_bytessink {
+#endif
   const upb_byteshandler *handler;
   void *closure;
-));
+};
 
-// A class for pushing a flat buffer of data to a BytesSink.
-// You can construct an instance of this to get a resumable source,
-// or just call the static PutBuffer() to do a non-resumable push all in one go.
-UPB_DEFINE_CLASS0(upb::BufferSource,
+#ifdef __cplusplus
+
+/* A class for pushing a flat buffer of data to a BytesSink.
+ * You can construct an instance of this to get a resumable source,
+ * or just call the static PutBuffer() to do a non-resumable push all in one
+ * go. */
+class upb::BufferSource {
  public:
   BufferSource();
   BufferSource(const char* buf, size_t len, BytesSink* sink);
 
-  // Returns true if the entire buffer was pushed successfully.  Otherwise the
-  // next call to PutNext() will resume where the previous one left off.
-  // TODO(haberman): implement this.
+  /* Returns true if the entire buffer was pushed successfully.  Otherwise the
+   * next call to PutNext() will resume where the previous one left off.
+   * TODO(haberman): implement this. */
   bool PutNext();
 
-  // A static version; with this version is it not possible to resume in the
-  // case of failure or a partially-consumed buffer.
+  /* A static version; with this version is it not possible to resume in the
+   * case of failure or a partially-consumed buffer. */
   static bool PutBuffer(const char* buf, size_t len, BytesSink* sink);
 
   template <class T> static bool PutBuffer(const T& str, BytesSink* sink) {
     return PutBuffer(str.c_str(), str.size(), sink);
   }
-,
-UPB_DEFINE_STRUCT0(upb_bufsrc,
-));
+#else
+struct upb_bufsrc {
+  char dummy;
+#endif
+};
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
-// Inline definitions.
+/* Inline definitions. */
 
 UPB_INLINE void upb_bytessink_reset(upb_bytessink *s, const upb_byteshandler *h,
                                     void *closure) {
@@ -6471,10 +5618,11 @@
 
 UPB_INLINE bool upb_bytessink_start(upb_bytessink *s, size_t size_hint,
                                     void **subc) {
+  typedef upb_startstr_handlerfunc func;
+  func *start;
   *subc = s->closure;
   if (!s->handler) return true;
-  upb_startstr_handlerfunc *start =
-      (upb_startstr_handlerfunc *)s->handler->table[UPB_STARTSTR_SELECTOR].func;
+  start = (func *)s->handler->table[UPB_STARTSTR_SELECTOR].func;
 
   if (!start) return true;
   *subc = start(s->closure, upb_handlerattr_handlerdata(
@@ -6486,9 +5634,10 @@
 UPB_INLINE size_t upb_bytessink_putbuf(upb_bytessink *s, void *subc,
                                        const char *buf, size_t size,
                                        const upb_bufhandle* handle) {
+  typedef upb_string_handlerfunc func;
+  func *putbuf;
   if (!s->handler) return true;
-  upb_string_handlerfunc *putbuf =
-      (upb_string_handlerfunc *)s->handler->table[UPB_STRING_SELECTOR].func;
+  putbuf = (func *)s->handler->table[UPB_STRING_SELECTOR].func;
 
   if (!putbuf) return true;
   return putbuf(subc, upb_handlerattr_handlerdata(
@@ -6497,9 +5646,10 @@
 }
 
 UPB_INLINE bool upb_bytessink_end(upb_bytessink *s) {
+  typedef upb_endfield_handlerfunc func;
+  func *end;
   if (!s->handler) return true;
-  upb_endfield_handlerfunc *end =
-      (upb_endfield_handlerfunc *)s->handler->table[UPB_ENDSTR_SELECTOR].func;
+  end = (func *)s->handler->table[UPB_ENDSTR_SELECTOR].func;
 
   if (!end) return true;
   return end(s->closure,
@@ -6510,10 +5660,11 @@
 UPB_INLINE bool upb_bufsrc_putbuf(const char *buf, size_t len,
                                   upb_bytessink *sink) {
   void *subc;
+  bool ret;
   upb_bufhandle handle;
   upb_bufhandle_init(&handle);
   upb_bufhandle_setbuf(&handle, buf, 0);
-  bool ret = upb_bytessink_start(sink, len, &subc);
+  ret = upb_bytessink_start(sink, len, &subc);
   if (ret && len != 0) {
     ret = (upb_bytessink_putbuf(sink, subc, buf, len, &handle) == len);
   }
@@ -6527,21 +5678,23 @@
 #define PUTVAL(type, ctype)                                                    \
   UPB_INLINE bool upb_sink_put##type(upb_sink *s, upb_selector_t sel,          \
                                      ctype val) {                              \
+    typedef upb_##type##_handlerfunc functype;                                 \
+    functype *func;                                                            \
+    const void *hd;                                                            \
     if (!s->handlers) return true;                                             \
-    upb_##type##_handlerfunc *func =                                           \
-        (upb_##type##_handlerfunc *)upb_handlers_gethandler(s->handlers, sel); \
+    func = (functype *)upb_handlers_gethandler(s->handlers, sel);              \
     if (!func) return true;                                                    \
-    const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);            \
+    hd = upb_handlers_gethandlerdata(s->handlers, sel);                        \
     return func(s->closure, hd, val);                                          \
   }
 
-PUTVAL(int32,  int32_t);
-PUTVAL(int64,  int64_t);
-PUTVAL(uint32, uint32_t);
-PUTVAL(uint64, uint64_t);
-PUTVAL(float,  float);
-PUTVAL(double, double);
-PUTVAL(bool,   bool);
+PUTVAL(int32,  int32_t)
+PUTVAL(int64,  int64_t)
+PUTVAL(uint32, uint32_t)
+PUTVAL(uint64, uint64_t)
+PUTVAL(float,  float)
+PUTVAL(double, double)
+PUTVAL(bool,   bool)
 #undef PUTVAL
 
 UPB_INLINE void upb_sink_reset(upb_sink *s, const upb_handlers *h, void *c) {
@@ -6552,114 +5705,129 @@
 UPB_INLINE size_t upb_sink_putstring(upb_sink *s, upb_selector_t sel,
                                      const char *buf, size_t n,
                                      const upb_bufhandle *handle) {
+  typedef upb_string_handlerfunc func;
+  func *handler;
+  const void *hd;
   if (!s->handlers) return n;
-  upb_string_handlerfunc *handler =
-      (upb_string_handlerfunc *)upb_handlers_gethandler(s->handlers, sel);
+  handler = (func *)upb_handlers_gethandler(s->handlers, sel);
 
   if (!handler) return n;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   return handler(s->closure, hd, buf, n, handle);
 }
 
 UPB_INLINE bool upb_sink_startmsg(upb_sink *s) {
+  typedef upb_startmsg_handlerfunc func;
+  func *startmsg;
+  const void *hd;
   if (!s->handlers) return true;
-  upb_startmsg_handlerfunc *startmsg =
-      (upb_startmsg_handlerfunc *)upb_handlers_gethandler(s->handlers,
-                                                      UPB_STARTMSG_SELECTOR);
+  startmsg = (func*)upb_handlers_gethandler(s->handlers, UPB_STARTMSG_SELECTOR);
+
   if (!startmsg) return true;
-  const void *hd =
-      upb_handlers_gethandlerdata(s->handlers, UPB_STARTMSG_SELECTOR);
+  hd = upb_handlers_gethandlerdata(s->handlers, UPB_STARTMSG_SELECTOR);
   return startmsg(s->closure, hd);
 }
 
 UPB_INLINE bool upb_sink_endmsg(upb_sink *s, upb_status *status) {
+  typedef upb_endmsg_handlerfunc func;
+  func *endmsg;
+  const void *hd;
   if (!s->handlers) return true;
-  upb_endmsg_handlerfunc *endmsg =
-      (upb_endmsg_handlerfunc *)upb_handlers_gethandler(s->handlers,
-                                                        UPB_ENDMSG_SELECTOR);
+  endmsg = (func *)upb_handlers_gethandler(s->handlers, UPB_ENDMSG_SELECTOR);
 
   if (!endmsg) return true;
-  const void *hd =
-      upb_handlers_gethandlerdata(s->handlers, UPB_ENDMSG_SELECTOR);
+  hd = upb_handlers_gethandlerdata(s->handlers, UPB_ENDMSG_SELECTOR);
   return endmsg(s->closure, hd, status);
 }
 
 UPB_INLINE bool upb_sink_startseq(upb_sink *s, upb_selector_t sel,
                                   upb_sink *sub) {
+  typedef upb_startfield_handlerfunc func;
+  func *startseq;
+  const void *hd;
   sub->closure = s->closure;
   sub->handlers = s->handlers;
   if (!s->handlers) return true;
-  upb_startfield_handlerfunc *startseq =
-      (upb_startfield_handlerfunc*)upb_handlers_gethandler(s->handlers, sel);
+  startseq = (func*)upb_handlers_gethandler(s->handlers, sel);
 
   if (!startseq) return true;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   sub->closure = startseq(s->closure, hd);
   return sub->closure ? true : false;
 }
 
 UPB_INLINE bool upb_sink_endseq(upb_sink *s, upb_selector_t sel) {
+  typedef upb_endfield_handlerfunc func;
+  func *endseq;
+  const void *hd;
   if (!s->handlers) return true;
-  upb_endfield_handlerfunc *endseq =
-      (upb_endfield_handlerfunc*)upb_handlers_gethandler(s->handlers, sel);
+  endseq = (func*)upb_handlers_gethandler(s->handlers, sel);
 
   if (!endseq) return true;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   return endseq(s->closure, hd);
 }
 
 UPB_INLINE bool upb_sink_startstr(upb_sink *s, upb_selector_t sel,
                                   size_t size_hint, upb_sink *sub) {
+  typedef upb_startstr_handlerfunc func;
+  func *startstr;
+  const void *hd;
   sub->closure = s->closure;
   sub->handlers = s->handlers;
   if (!s->handlers) return true;
-  upb_startstr_handlerfunc *startstr =
-      (upb_startstr_handlerfunc*)upb_handlers_gethandler(s->handlers, sel);
+  startstr = (func*)upb_handlers_gethandler(s->handlers, sel);
 
   if (!startstr) return true;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   sub->closure = startstr(s->closure, hd, size_hint);
   return sub->closure ? true : false;
 }
 
 UPB_INLINE bool upb_sink_endstr(upb_sink *s, upb_selector_t sel) {
+  typedef upb_endfield_handlerfunc func;
+  func *endstr;
+  const void *hd;
   if (!s->handlers) return true;
-  upb_endfield_handlerfunc *endstr =
-      (upb_endfield_handlerfunc*)upb_handlers_gethandler(s->handlers, sel);
+  endstr = (func*)upb_handlers_gethandler(s->handlers, sel);
 
   if (!endstr) return true;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   return endstr(s->closure, hd);
 }
 
 UPB_INLINE bool upb_sink_startsubmsg(upb_sink *s, upb_selector_t sel,
                                      upb_sink *sub) {
+  typedef upb_startfield_handlerfunc func;
+  func *startsubmsg;
+  const void *hd;
   sub->closure = s->closure;
   if (!s->handlers) {
     sub->handlers = NULL;
     return true;
   }
   sub->handlers = upb_handlers_getsubhandlers_sel(s->handlers, sel);
-  upb_startfield_handlerfunc *startsubmsg =
-      (upb_startfield_handlerfunc*)upb_handlers_gethandler(s->handlers, sel);
+  startsubmsg = (func*)upb_handlers_gethandler(s->handlers, sel);
 
   if (!startsubmsg) return true;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   sub->closure = startsubmsg(s->closure, hd);
   return sub->closure ? true : false;
 }
 
 UPB_INLINE bool upb_sink_endsubmsg(upb_sink *s, upb_selector_t sel) {
+  typedef upb_endfield_handlerfunc func;
+  func *endsubmsg;
+  const void *hd;
   if (!s->handlers) return true;
-  upb_endfield_handlerfunc *endsubmsg =
-      (upb_endfield_handlerfunc*)upb_handlers_gethandler(s->handlers, sel);
+  endsubmsg = (func*)upb_handlers_gethandler(s->handlers, sel);
 
   if (!endsubmsg) return s->closure;
-  const void *hd = upb_handlers_gethandlerdata(s->handlers, sel);
+  hd = upb_handlers_gethandlerdata(s->handlers, sel);
   return endsubmsg(s->closure, hd);
 }
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 #ifdef __cplusplus
 
@@ -6748,7 +5916,7 @@
   return upb_bufsrc_putbuf(buf, len, sink);
 }
 
-}  // namespace upb
+}  /* namespace upb */
 #endif
 
 #endif
@@ -6785,33 +5953,33 @@
 struct Shim {
   typedef upb_shim_data Data;
 
-  // Sets a handler for the given field that writes the value to the given
-  // offset and, if hasbit >= 0, sets a bit at the given bit offset.  Returns
-  // true if the handler was set successfully.
+  /* Sets a handler for the given field that writes the value to the given
+   * offset and, if hasbit >= 0, sets a bit at the given bit offset.  Returns
+   * true if the handler was set successfully. */
   static bool Set(Handlers *h, const FieldDef *f, size_t ofs, int32_t hasbit);
 
-  // If this handler is a shim, returns the corresponding upb::Shim::Data and
-  // stores the type in "type".  Otherwise returns NULL.
+  /* If this handler is a shim, returns the corresponding upb::Shim::Data and
+   * stores the type in "type".  Otherwise returns NULL. */
   static const Data* GetData(const Handlers* h, Handlers::Selector s,
                              FieldDef::Type* type);
 };
 
-}  // namespace upb
+}  /* namespace upb */
 
 #endif
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
-// C API.
+/* C API. */
 bool upb_shim_set(upb_handlers *h, const upb_fielddef *f, size_t offset,
                   int32_t hasbit);
 const upb_shim_data *upb_shim_getdata(const upb_handlers *h, upb_selector_t s,
                                       upb_fieldtype_t *type);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 #ifdef __cplusplus
-// C++ Wrappers.
+/* C++ Wrappers. */
 namespace upb {
 inline bool Shim::Set(Handlers* h, const FieldDef* f, size_t ofs,
                       int32_t hasbit) {
@@ -6821,10 +5989,198 @@
                                        FieldDef::Type* type) {
   return upb_shim_getdata(h, s, type);
 }
-}  // namespace upb
+}  /* namespace upb */
 #endif
 
-#endif  // UPB_SHIM_H
+#endif  /* UPB_SHIM_H */
+/*
+ * upb - a minimalist implementation of protocol buffers.
+ *
+ * Copyright (c) 2009-2012 Google Inc.  See LICENSE for details.
+ * Author: Josh Haberman <jhaberman@gmail.com>
+ *
+ * A symtab (symbol table) stores a name->def map of upb_defs.  Clients could
+ * always create such tables themselves, but upb_symtab has logic for resolving
+ * symbolic references, and in particular, for keeping a whole set of consistent
+ * defs when replacing some subset of those defs.  This logic is nontrivial.
+ *
+ * This is a mixed C/C++ interface that offers a full API to both languages.
+ * See the top-level README for more information.
+ */
+
+#ifndef UPB_SYMTAB_H_
+#define UPB_SYMTAB_H_
+
+
+#ifdef __cplusplus
+#include <vector>
+namespace upb { class SymbolTable; }
+#endif
+
+UPB_DECLARE_DERIVED_TYPE(upb::SymbolTable, upb::RefCounted,
+                         upb_symtab, upb_refcounted)
+
+typedef struct {
+ UPB_PRIVATE_FOR_CPP
+  upb_strtable_iter iter;
+  upb_deftype_t type;
+} upb_symtab_iter;
+
+#ifdef __cplusplus
+
+/* Non-const methods in upb::SymbolTable are NOT thread-safe. */
+class upb::SymbolTable {
+ public:
+  /* Returns a new symbol table with a single ref owned by "owner."
+   * Returns NULL if memory allocation failed. */
+  static reffed_ptr<SymbolTable> New();
+
+  /* Include RefCounted base methods. */
+  UPB_REFCOUNTED_CPPMETHODS
+
+  /* For all lookup functions, the returned pointer is not owned by the
+   * caller; it may be invalidated by any non-const call or unref of the
+   * SymbolTable!  To protect against this, take a ref if desired. */
+
+  /* Freezes the symbol table: prevents further modification of it.
+   * After the Freeze() operation is successful, the SymbolTable must only be
+   * accessed via a const pointer.
+   *
+   * Unlike with upb::MessageDef/upb::EnumDef/etc, freezing a SymbolTable is not
+   * a necessary step in using a SymbolTable.  If you have no need for it to be
+   * immutable, there is no need to freeze it ever.  However sometimes it is
+   * useful, and SymbolTables that are statically compiled into the binary are
+   * always frozen by nature. */
+  void Freeze();
+
+  /* Resolves the given symbol using the rules described in descriptor.proto,
+   * namely:
+   *
+   *    If the name starts with a '.', it is fully-qualified.  Otherwise,
+   *    C++-like scoping rules are used to find the type (i.e. first the nested
+   *    types within this message are searched, then within the parent, on up
+   *    to the root namespace).
+   *
+   * If not found, returns NULL. */
+  const Def* Resolve(const char* base, const char* sym) const;
+
+  /* Finds an entry in the symbol table with this exact name.  If not found,
+   * returns NULL. */
+  const Def* Lookup(const char *sym) const;
+  const MessageDef* LookupMessage(const char *sym) const;
+  const EnumDef* LookupEnum(const char *sym) const;
+
+  /* TODO: introduce a C++ iterator, but make it nice and templated so that if
+   * you ask for an iterator of MessageDef the iterated elements are strongly
+   * typed as MessageDef*. */
+
+  /* Adds the given mutable defs to the symtab, resolving all symbols
+   * (including enum default values) and finalizing the defs.  Only one def per
+   * name may be in the list, but defs can replace existing defs in the symtab.
+   * All defs must have a name -- anonymous defs are not allowed.  Anonymous
+   * defs can still be frozen by calling upb_def_freeze() directly.
+   *
+   * Any existing defs that can reach defs that are being replaced will
+   * themselves be replaced also, so that the resulting set of defs is fully
+   * consistent.
+   *
+   * This logic implemented in this method is a convenience; ultimately it
+   * calls some combination of upb_fielddef_setsubdef(), upb_def_dup(), and
+   * upb_freeze(), any of which the client could call themself.  However, since
+   * the logic for doing so is nontrivial, we provide it here.
+   *
+   * The entire operation either succeeds or fails.  If the operation fails,
+   * the symtab is unchanged, false is returned, and status indicates the
+   * error.  The caller passes a ref on all defs to the symtab (even if the
+   * operation fails).
+   *
+   * TODO(haberman): currently failure will leave the symtab unchanged, but may
+   * leave the defs themselves partially resolved.  Does this matter?  If so we
+   * could do a prepass that ensures that all symbols are resolvable and bail
+   * if not, so we don't mutate anything until we know the operation will
+   * succeed.
+   *
+   * TODO(haberman): since the defs must be mutable, refining a frozen def
+   * requires making mutable copies of the entire tree.  This is wasteful if
+   * only a few messages are changing.  We may want to add a way of adding a
+   * tree of frozen defs to the symtab (perhaps an alternate constructor where
+   * you pass the root of the tree?) */
+  bool Add(Def*const* defs, int n, void* ref_donor, upb_status* status);
+
+  bool Add(const std::vector<Def*>& defs, void *owner, Status* status) {
+    return Add((Def*const*)&defs[0], defs.size(), owner, status);
+  }
+
+ private:
+  UPB_DISALLOW_POD_OPS(SymbolTable, upb::SymbolTable)
+};
+
+#endif  /* __cplusplus */
+
+UPB_BEGIN_EXTERN_C
+
+/* Native C API. */
+
+/* Include refcounted methods like upb_symtab_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_symtab, upb_symtab_upcast)
+
+upb_symtab *upb_symtab_new(const void *owner);
+void upb_symtab_freeze(upb_symtab *s);
+const upb_def *upb_symtab_resolve(const upb_symtab *s, const char *base,
+                                  const char *sym);
+const upb_def *upb_symtab_lookup(const upb_symtab *s, const char *sym);
+const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
+const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
+bool upb_symtab_add(upb_symtab *s, upb_def *const*defs, int n, void *ref_donor,
+                    upb_status *status);
+
+/* upb_symtab_iter i;
+ * for(upb_symtab_begin(&i, s, type); !upb_symtab_done(&i);
+ *     upb_symtab_next(&i)) {
+ *   const upb_def *def = upb_symtab_iter_def(&i);
+ *    // ...
+ * }
+ *
+ * For C we don't have separate iterators for const and non-const.
+ * It is the caller's responsibility to cast the upb_fielddef* to
+ * const if the upb_msgdef* is const. */
+void upb_symtab_begin(upb_symtab_iter *iter, const upb_symtab *s,
+                      upb_deftype_t type);
+void upb_symtab_next(upb_symtab_iter *iter);
+bool upb_symtab_done(const upb_symtab_iter *iter);
+const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter);
+
+UPB_END_EXTERN_C
+
+#ifdef __cplusplus
+/* C++ inline wrappers. */
+namespace upb {
+inline reffed_ptr<SymbolTable> SymbolTable::New() {
+  upb_symtab *s = upb_symtab_new(&s);
+  return reffed_ptr<SymbolTable>(s, &s);
+}
+
+inline void SymbolTable::Freeze() {
+  return upb_symtab_freeze(this);
+}
+inline const Def *SymbolTable::Resolve(const char *base,
+                                       const char *sym) const {
+  return upb_symtab_resolve(this, base, sym);
+}
+inline const Def* SymbolTable::Lookup(const char *sym) const {
+  return upb_symtab_lookup(this, sym);
+}
+inline const MessageDef *SymbolTable::LookupMessage(const char *sym) const {
+  return upb_symtab_lookupmsg(this, sym);
+}
+inline bool SymbolTable::Add(
+    Def*const* defs, int n, void* ref_donor, upb_status* status) {
+  return upb_symtab_add(this, (upb_def*const*)defs, n, ref_donor, status);
+}
+}  /* namespace upb */
+#endif
+
+#endif  /* UPB_SYMTAB_H_ */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -6843,52 +6199,52 @@
 namespace upb {
 namespace descriptor {
 class Reader;
-}  // namespace descriptor
-}  // namespace upb
+}  /* namespace descriptor */
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::descriptor::Reader, upb_descreader);
+UPB_DECLARE_TYPE(upb::descriptor::Reader, upb_descreader)
 
 #ifdef __cplusplus
 
-// Class that receives descriptor data according to the descriptor.proto schema
-// and use it to build upb::Defs corresponding to that schema.
+/* Class that receives descriptor data according to the descriptor.proto schema
+ * and use it to build upb::Defs corresponding to that schema. */
 class upb::descriptor::Reader {
  public:
-  // These handlers must have come from NewHandlers() and must outlive the
-  // Reader.
-  //
-  // TODO: generate the handlers statically (like we do with the
-  // descriptor.proto defs) so that there is no need to pass this parameter (or
-  // to build/memory-manage the handlers at runtime at all).  Unfortunately this
-  // is a bit tricky to implement for Handlers, but necessary to simplify this
-  // interface.
+  /* These handlers must have come from NewHandlers() and must outlive the
+   * Reader.
+   *
+   * TODO: generate the handlers statically (like we do with the
+   * descriptor.proto defs) so that there is no need to pass this parameter (or
+   * to build/memory-manage the handlers at runtime at all).  Unfortunately this
+   * is a bit tricky to implement for Handlers, but necessary to simplify this
+   * interface. */
   static Reader* Create(Environment* env, const Handlers* handlers);
 
-  // The reader's input; this is where descriptor.proto data should be sent.
+  /* The reader's input; this is where descriptor.proto data should be sent. */
   Sink* input();
 
-  // Returns an array of all defs that have been parsed, and transfers ownership
-  // of them to "owner".  The number of defs is stored in *n.  Ownership of the
-  // returned array is retained and is invalidated by any other call into
-  // Reader.
-  //
-  // These defs are not frozen or resolved; they are ready to be added to a
-  // symtab.
+  /* Returns an array of all defs that have been parsed, and transfers ownership
+   * of them to "owner".  The number of defs is stored in *n.  Ownership of the
+   * returned array is retained and is invalidated by any other call into
+   * Reader.
+   *
+   * These defs are not frozen or resolved; they are ready to be added to a
+   * symtab. */
   upb::Def** GetDefs(void* owner, int* n);
 
-  // Builds and returns handlers for the reader, owned by "owner."
+  /* Builds and returns handlers for the reader, owned by "owner." */
   static Handlers* NewHandlers(const void* owner);
 
  private:
-  UPB_DISALLOW_POD_OPS(Reader, upb::descriptor::Reader);
+  UPB_DISALLOW_POD_OPS(Reader, upb::descriptor::Reader)
 };
 
 #endif
 
 UPB_BEGIN_EXTERN_C
 
-// C API.
+/* C API. */
 upb_descreader *upb_descreader_create(upb_env *e, const upb_handlers *h);
 upb_sink *upb_descreader_input(upb_descreader *r);
 upb_def **upb_descreader_getdefs(upb_descreader *r, void *owner, int *n);
@@ -6897,7 +6253,7 @@
 UPB_END_EXTERN_C
 
 #ifdef __cplusplus
-// C++ implementation details. /////////////////////////////////////////////////
+/* C++ implementation details. ************************************************/
 namespace upb {
 namespace descriptor {
 inline Reader* Reader::Create(Environment* e, const Handlers *h) {
@@ -6907,11 +6263,809 @@
 inline upb::Def** Reader::GetDefs(void* owner, int* n) {
   return upb_descreader_getdefs(this, owner, n);
 }
-}  // namespace descriptor
-}  // namespace upb
+}  /* namespace descriptor */
+}  /* namespace upb */
 #endif
 
-#endif  // UPB_DESCRIPTOR_H
+#endif  /* UPB_DESCRIPTOR_H */
+/* This file contains accessors for a set of compiled-in defs.
+ * Note that unlike Google's protobuf, it does *not* define
+ * generated classes or any other kind of data structure for
+ * actually storing protobufs.  It only contains *defs* which
+ * let you reflect over a protobuf *schema*.
+ */
+/* This file was generated by upbc (the upb compiler).
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
+#define GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_
+
+
+#ifdef __cplusplus
+UPB_BEGIN_EXTERN_C
+#endif
+
+/* Enums */
+
+typedef enum {
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_OPTIONAL = 1,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REQUIRED = 2,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_REPEATED = 3
+} google_protobuf_FieldDescriptorProto_Label;
+
+typedef enum {
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_DOUBLE = 1,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FLOAT = 2,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT64 = 3,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT64 = 4,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 = 5,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED64 = 6,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_FIXED32 = 7,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BOOL = 8,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_STRING = 9,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_GROUP = 10,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_MESSAGE = 11,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_BYTES = 12,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_UINT32 = 13,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_ENUM = 14,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED32 = 15,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SFIXED64 = 16,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT32 = 17,
+  GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_SINT64 = 18
+} google_protobuf_FieldDescriptorProto_Type;
+
+typedef enum {
+  GOOGLE_PROTOBUF_FIELDOPTIONS_STRING = 0,
+  GOOGLE_PROTOBUF_FIELDOPTIONS_CORD = 1,
+  GOOGLE_PROTOBUF_FIELDOPTIONS_STRING_PIECE = 2
+} google_protobuf_FieldOptions_CType;
+
+typedef enum {
+  GOOGLE_PROTOBUF_FILEOPTIONS_SPEED = 1,
+  GOOGLE_PROTOBUF_FILEOPTIONS_CODE_SIZE = 2,
+  GOOGLE_PROTOBUF_FILEOPTIONS_LITE_RUNTIME = 3
+} google_protobuf_FileOptions_OptimizeMode;
+
+/* Selectors */
+
+/* google.protobuf.DescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 4
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_STARTSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_STARTSEQ 8
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSEQ 9
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_FIELD_ENDSUBMSG 10
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_STARTSEQ 11
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSEQ 12
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NESTED_TYPE_ENDSUBMSG 13
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 14
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 15
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 16
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_STARTSEQ 17
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSEQ 18
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_RANGE_ENDSUBMSG 19
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_STARTSEQ 20
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSEQ 21
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSION_ENDSUBMSG 22
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_OPTIONS_ENDSUBMSG 23
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STRING 24
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_STARTSTR 25
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_NAME_ENDSTR 26
+
+/* google.protobuf.DescriptorProto.ExtensionRange */
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_START_INT32 2
+#define SEL_GOOGLE_PROTOBUF_DESCRIPTORPROTO_EXTENSIONRANGE_END_INT32 3
+
+/* google.protobuf.EnumDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_STARTSEQ 4
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSEQ 5
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_VALUE_ENDSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STRING 8
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_STARTSTR 9
+#define SEL_GOOGLE_PROTOBUF_ENUMDESCRIPTORPROTO_NAME_ENDSTR 10
+
+/* google.protobuf.EnumOptions */
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_ENUMOPTIONS_ALLOW_ALIAS_BOOL 6
+
+/* google.protobuf.EnumValueDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STRING 4
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_STARTSTR 5
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NAME_ENDSTR 6
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEDESCRIPTORPROTO_NUMBER_INT32 7
+
+/* google.protobuf.EnumValueOptions */
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_ENUMVALUEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+
+/* google.protobuf.FieldDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STRING 4
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_STARTSTR 5
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NAME_ENDSTR 6
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STRING 7
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_STARTSTR 8
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_EXTENDEE_ENDSTR 9
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_NUMBER_INT32 10
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_LABEL_INT32 11
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_INT32 12
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STRING 13
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_STARTSTR 14
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_TYPE_NAME_ENDSTR 15
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STRING 16
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_STARTSTR 17
+#define SEL_GOOGLE_PROTOBUF_FIELDDESCRIPTORPROTO_DEFAULT_VALUE_ENDSTR 18
+
+/* google.protobuf.FieldOptions */
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_CTYPE_INT32 6
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_PACKED_BOOL 7
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_DEPRECATED_BOOL 8
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_LAZY_BOOL 9
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STRING 10
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_STARTSTR 11
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_EXPERIMENTAL_MAP_KEY_ENDSTR 12
+#define SEL_GOOGLE_PROTOBUF_FIELDOPTIONS_WEAK_BOOL 13
+
+/* google.protobuf.FileDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSUBMSG 4
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_STARTSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_STARTSEQ 8
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSEQ 9
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_MESSAGE_TYPE_ENDSUBMSG 10
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_STARTSEQ 11
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSEQ 12
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_ENUM_TYPE_ENDSUBMSG 13
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_STARTSEQ 14
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSEQ 15
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SERVICE_ENDSUBMSG 16
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_STARTSEQ 17
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSEQ 18
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_EXTENSION_ENDSUBMSG 19
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 20
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_SOURCE_CODE_INFO_ENDSUBMSG 21
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STRING 22
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_STARTSTR 23
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_NAME_ENDSTR 24
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STRING 25
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_STARTSTR 26
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PACKAGE_ENDSTR 27
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSEQ 28
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSEQ 29
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STRING 30
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_STARTSTR 31
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_DEPENDENCY_ENDSTR 32
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_STARTSEQ 33
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_ENDSEQ 34
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_PUBLIC_DEPENDENCY_INT32 35
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_STARTSEQ 36
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_ENDSEQ 37
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORPROTO_WEAK_DEPENDENCY_INT32 38
+
+/* google.protobuf.FileDescriptorSet */
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_FILEDESCRIPTORSET_FILE_ENDSUBMSG 5
+
+/* google.protobuf.FileOptions */
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STRING 6
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_STARTSTR 7
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_PACKAGE_ENDSTR 8
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STRING 9
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_STARTSTR 10
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_OUTER_CLASSNAME_ENDSTR 11
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_OPTIMIZE_FOR_INT32 12
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_MULTIPLE_FILES_BOOL 13
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STRING 14
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_STARTSTR 15
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_GO_PACKAGE_ENDSTR 16
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_CC_GENERIC_SERVICES_BOOL 17
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERIC_SERVICES_BOOL 18
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_PY_GENERIC_SERVICES_BOOL 19
+#define SEL_GOOGLE_PROTOBUF_FILEOPTIONS_JAVA_GENERATE_EQUALS_AND_HASH_BOOL 20
+
+/* google.protobuf.MessageOptions */
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_MESSAGE_SET_WIRE_FORMAT_BOOL 6
+#define SEL_GOOGLE_PROTOBUF_MESSAGEOPTIONS_NO_STANDARD_DESCRIPTOR_ACCESSOR_BOOL 7
+
+/* google.protobuf.MethodDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STRING 4
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_STARTSTR 5
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_NAME_ENDSTR 6
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STRING 7
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_STARTSTR 8
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_INPUT_TYPE_ENDSTR 9
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STRING 10
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_STARTSTR 11
+#define SEL_GOOGLE_PROTOBUF_METHODDESCRIPTORPROTO_OUTPUT_TYPE_ENDSTR 12
+
+/* google.protobuf.MethodOptions */
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_METHODOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+
+/* google.protobuf.ServiceDescriptorProto */
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_STARTSUBMSG 3
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_STARTSEQ 4
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSEQ 5
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_METHOD_ENDSUBMSG 6
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_OPTIONS_ENDSUBMSG 7
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STRING 8
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_STARTSTR 9
+#define SEL_GOOGLE_PROTOBUF_SERVICEDESCRIPTORPROTO_NAME_ENDSTR 10
+
+/* google.protobuf.ServiceOptions */
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_SERVICEOPTIONS_UNINTERPRETED_OPTION_ENDSUBMSG 5
+
+/* google.protobuf.SourceCodeInfo */
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_ENDSUBMSG 5
+
+/* google.protobuf.SourceCodeInfo.Location */
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_STARTSEQ 2
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_ENDSEQ 3
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_PATH_INT32 4
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_STARTSEQ 5
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_ENDSEQ 6
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_SPAN_INT32 7
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STRING 8
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_STARTSTR 9
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_LEADING_COMMENTS_ENDSTR 10
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STRING 11
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_STARTSTR 12
+#define SEL_GOOGLE_PROTOBUF_SOURCECODEINFO_LOCATION_TRAILING_COMMENTS_ENDSTR 13
+
+/* google.protobuf.UninterpretedOption */
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSUBMSG 2
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_STARTSEQ 3
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSEQ 4
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAME_ENDSUBMSG 5
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STRING 6
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_STARTSTR 7
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_IDENTIFIER_VALUE_ENDSTR 8
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_POSITIVE_INT_VALUE_UINT64 9
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NEGATIVE_INT_VALUE_INT64 10
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_DOUBLE_VALUE_DOUBLE 11
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STRING 12
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_STARTSTR 13
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_STRING_VALUE_ENDSTR 14
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STRING 15
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_STARTSTR 16
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_AGGREGATE_VALUE_ENDSTR 17
+
+/* google.protobuf.UninterpretedOption.NamePart */
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STRING 2
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_STARTSTR 3
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_NAME_PART_ENDSTR 4
+#define SEL_GOOGLE_PROTOBUF_UNINTERPRETEDOPTION_NAMEPART_IS_EXTENSION_BOOL 5
+
+const upb_symtab *upbdefs_google_protobuf_descriptor(const void *owner);
+
+/* MessageDefs */
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.DescriptorProto.ExtensionRange");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_EnumValueOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.EnumValueOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FieldOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FieldOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileDescriptorSet(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileDescriptorSet");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_FileOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.FileOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MessageOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MessageOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_MethodOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.MethodOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceDescriptorProto(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceDescriptorProto");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_ServiceOptions(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.ServiceOptions");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_SourceCodeInfo_Location(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.SourceCodeInfo.Location");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOption");
+  assert(m);
+  return m;
+}
+UPB_INLINE const upb_msgdef *upbdefs_google_protobuf_UninterpretedOption_NamePart(const upb_symtab *s) {
+  const upb_msgdef *m = upb_symtab_lookupmsg(s, "google.protobuf.UninterpretedOption.NamePart");
+  assert(m);
+  return m;
+}
+
+
+/* EnumDefs */
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Label(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescriptorProto.Label");
+  assert(e);
+  return e;
+}
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldDescriptorProto_Type(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldDescriptorProto.Type");
+  assert(e);
+  return e;
+}
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FieldOptions_CType(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FieldOptions.CType");
+  assert(e);
+  return e;
+}
+UPB_INLINE const upb_enumdef *upbdefs_google_protobuf_FileOptions_OptimizeMode(const upb_symtab *s) {
+  const upb_enumdef *e = upb_symtab_lookupenum(s, "google.protobuf.FileOptions.OptimizeMode");
+  assert(e);
+  return e;
+}
+
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto_ExtensionRange(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_extension_range(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_field(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_nested_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_DescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_DescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumDescriptorProto_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_allow_alias(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_EnumValueOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_default_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_extendee(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_label(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_number(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldDescriptorProto_type_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldDescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_ctype(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_deprecated(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_experimental_map_key(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_lazy(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_packed(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FieldOptions_weak(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FieldOptions(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_enum_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 7); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_message_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_public_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_service(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_source_code_info(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorProto_weak_dependency(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorProto(s), 11); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileDescriptorSet_file(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileDescriptorSet(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_cc_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 16); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_go_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 11); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 20); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 17); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_multiple_files(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 10); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_outer_classname(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_java_package(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_optimize_for(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 9); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_py_generic_services(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 18); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_FileOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_FileOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_message_set_wire_format(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MessageOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MessageOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_input_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodDescriptorProto_output_type(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_MethodOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_MethodOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_method(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceDescriptorProto_options(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceDescriptorProto(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_ServiceOptions_uninterpreted_option(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_ServiceOptions(s), 999); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_path(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_span(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo_Location(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_SourceCodeInfo_location(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_SourceCodeInfo(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption_NamePart(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption_NamePart(s), 1); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_aggregate_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 8); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_double_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 6); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_identifier_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 3); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_name(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 2); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_negative_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 5); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_positive_int_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 4); }
+UPB_INLINE const upb_fielddef *upbdefs_google_protobuf_UninterpretedOption_string_value(const upb_symtab *s) { return upb_msgdef_itof(upbdefs_google_protobuf_UninterpretedOption(s), 7); }
+
+UPB_END_EXTERN_C
+
+#ifdef __cplusplus
+
+namespace upbdefs {
+namespace google {
+namespace protobuf {
+namespace descriptor {
+inline upb::reffed_ptr<const upb::SymbolTable> SymbolTable() {
+  const upb::SymbolTable* s = upbdefs_google_protobuf_descriptor(&s);
+  return upb::reffed_ptr<const upb::SymbolTable>(s, &s);
+}
+}  /* namespace descriptor */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+#define RETURN_REFFED(type, func) \
+    const type* obj = func(upbdefs::google::protobuf::descriptor::SymbolTable().get()); \
+    return upb::reffed_ptr<const type>(obj);
+
+namespace google {
+namespace protobuf {
+namespace DescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_enum_type) }
+inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension) }
+inline upb::reffed_ptr<const upb::FieldDef> extension_range() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_extension_range) }
+inline upb::reffed_ptr<const upb::FieldDef> field() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_field) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> nested_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_nested_type) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_options) }
+}  /* namespace DescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace DescriptorProto {
+namespace ExtensionRange {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange) }
+inline upb::reffed_ptr<const upb::FieldDef> end() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_end) }
+inline upb::reffed_ptr<const upb::FieldDef> start() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_DescriptorProto_ExtensionRange_start) }
+}  /* namespace ExtensionRange */
+}  /* namespace DescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumDescriptorProto_value) }
+}  /* namespace EnumDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> allow_alias() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_allow_alias) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumOptions_uninterpreted_option) }
+}  /* namespace EnumOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumValueDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_number) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueDescriptorProto_options) }
+}  /* namespace EnumValueDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace EnumValueOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_EnumValueOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_EnumValueOptions_uninterpreted_option) }
+}  /* namespace EnumValueOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FieldDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> default_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_default_value) }
+inline upb::reffed_ptr<const upb::FieldDef> extendee() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_extendee) }
+inline upb::reffed_ptr<const upb::FieldDef> label() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_label) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> number() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_number) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type) }
+inline upb::reffed_ptr<const upb::FieldDef> type_name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldDescriptorProto_type_name) }
+inline upb::reffed_ptr<const upb::EnumDef> Label() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldDescriptorProto_Label) }
+inline upb::reffed_ptr<const upb::EnumDef> Type() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldDescriptorProto_Type) }
+}  /* namespace FieldDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FieldOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FieldOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> ctype() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_ctype) }
+inline upb::reffed_ptr<const upb::FieldDef> deprecated() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_deprecated) }
+inline upb::reffed_ptr<const upb::FieldDef> experimental_map_key() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_experimental_map_key) }
+inline upb::reffed_ptr<const upb::FieldDef> lazy() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_lazy) }
+inline upb::reffed_ptr<const upb::FieldDef> packed() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_packed) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_uninterpreted_option) }
+inline upb::reffed_ptr<const upb::FieldDef> weak() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FieldOptions_weak) }
+inline upb::reffed_ptr<const upb::EnumDef> CType() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FieldOptions_CType) }
+}  /* namespace FieldOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FileDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_dependency) }
+inline upb::reffed_ptr<const upb::FieldDef> enum_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_enum_type) }
+inline upb::reffed_ptr<const upb::FieldDef> extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_extension) }
+inline upb::reffed_ptr<const upb::FieldDef> message_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_message_type) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_package) }
+inline upb::reffed_ptr<const upb::FieldDef> public_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_public_dependency) }
+inline upb::reffed_ptr<const upb::FieldDef> service() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_service) }
+inline upb::reffed_ptr<const upb::FieldDef> source_code_info() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_source_code_info) }
+inline upb::reffed_ptr<const upb::FieldDef> weak_dependency() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorProto_weak_dependency) }
+}  /* namespace FileDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FileDescriptorSet {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileDescriptorSet) }
+inline upb::reffed_ptr<const upb::FieldDef> file() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileDescriptorSet_file) }
+}  /* namespace FileDescriptorSet */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace FileOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_FileOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> cc_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_cc_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> go_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_go_package) }
+inline upb::reffed_ptr<const upb::FieldDef> java_generate_equals_and_hash() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generate_equals_and_hash) }
+inline upb::reffed_ptr<const upb::FieldDef> java_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> java_multiple_files() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_multiple_files) }
+inline upb::reffed_ptr<const upb::FieldDef> java_outer_classname() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_outer_classname) }
+inline upb::reffed_ptr<const upb::FieldDef> java_package() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_java_package) }
+inline upb::reffed_ptr<const upb::FieldDef> optimize_for() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_optimize_for) }
+inline upb::reffed_ptr<const upb::FieldDef> py_generic_services() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_py_generic_services) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_FileOptions_uninterpreted_option) }
+inline upb::reffed_ptr<const upb::EnumDef> OptimizeMode() { RETURN_REFFED(upb::EnumDef, upbdefs_google_protobuf_FileOptions_OptimizeMode) }
+}  /* namespace FileOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace MessageOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MessageOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> message_set_wire_format() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_message_set_wire_format) }
+inline upb::reffed_ptr<const upb::FieldDef> no_standard_descriptor_accessor() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_no_standard_descriptor_accessor) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MessageOptions_uninterpreted_option) }
+}  /* namespace MessageOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace MethodDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> input_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_input_type) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_options) }
+inline upb::reffed_ptr<const upb::FieldDef> output_type() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodDescriptorProto_output_type) }
+}  /* namespace MethodDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace MethodOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_MethodOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_MethodOptions_uninterpreted_option) }
+}  /* namespace MethodOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace ServiceDescriptorProto {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceDescriptorProto) }
+inline upb::reffed_ptr<const upb::FieldDef> method() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_method) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_name) }
+inline upb::reffed_ptr<const upb::FieldDef> options() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceDescriptorProto_options) }
+}  /* namespace ServiceDescriptorProto */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace ServiceOptions {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_ServiceOptions) }
+inline upb::reffed_ptr<const upb::FieldDef> uninterpreted_option() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_ServiceOptions_uninterpreted_option) }
+}  /* namespace ServiceOptions */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace SourceCodeInfo {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo) }
+inline upb::reffed_ptr<const upb::FieldDef> location() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_location) }
+}  /* namespace SourceCodeInfo */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace SourceCodeInfo {
+namespace Location {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_SourceCodeInfo_Location) }
+inline upb::reffed_ptr<const upb::FieldDef> leading_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_leading_comments) }
+inline upb::reffed_ptr<const upb::FieldDef> path() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_path) }
+inline upb::reffed_ptr<const upb::FieldDef> span() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_span) }
+inline upb::reffed_ptr<const upb::FieldDef> trailing_comments() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_SourceCodeInfo_Location_trailing_comments) }
+}  /* namespace Location */
+}  /* namespace SourceCodeInfo */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace UninterpretedOption {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_UninterpretedOption) }
+inline upb::reffed_ptr<const upb::FieldDef> aggregate_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_aggregate_value) }
+inline upb::reffed_ptr<const upb::FieldDef> double_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_double_value) }
+inline upb::reffed_ptr<const upb::FieldDef> identifier_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_identifier_value) }
+inline upb::reffed_ptr<const upb::FieldDef> name() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_name) }
+inline upb::reffed_ptr<const upb::FieldDef> negative_int_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_negative_int_value) }
+inline upb::reffed_ptr<const upb::FieldDef> positive_int_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_positive_int_value) }
+inline upb::reffed_ptr<const upb::FieldDef> string_value() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_string_value) }
+}  /* namespace UninterpretedOption */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+namespace google {
+namespace protobuf {
+namespace UninterpretedOption {
+namespace NamePart {
+inline upb::reffed_ptr<const upb::MessageDef> MessageDef() { RETURN_REFFED(upb::MessageDef, upbdefs_google_protobuf_UninterpretedOption_NamePart) }
+inline upb::reffed_ptr<const upb::FieldDef> is_extension() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_is_extension) }
+inline upb::reffed_ptr<const upb::FieldDef> name_part() { RETURN_REFFED(upb::FieldDef, upbdefs_google_protobuf_UninterpretedOption_NamePart_name_part) }
+}  /* namespace NamePart */
+}  /* namespace UninterpretedOption */
+}  /* namespace protobuf */
+}  /* namespace google */
+
+}  /* namespace upbdefs */
+
+
+#undef RETURN_REFFED
+#endif /* __cplusplus */
+
+#endif  /* GOOGLE_PROTOBUF_DESCRIPTOR_UPB_H_ */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -6953,134 +7107,111 @@
 class Decoder;
 class DecoderMethod;
 class DecoderMethodOptions;
-}  // namespace pb
-}  // namespace upb
+}  /* namespace pb */
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::pb::CodeCache, upb_pbcodecache);
-UPB_DECLARE_TYPE(upb::pb::Decoder, upb_pbdecoder);
-UPB_DECLARE_TYPE(upb::pb::DecoderMethod, upb_pbdecodermethod);
-UPB_DECLARE_TYPE(upb::pb::DecoderMethodOptions, upb_pbdecodermethodopts);
+UPB_DECLARE_TYPE(upb::pb::CodeCache, upb_pbcodecache)
+UPB_DECLARE_TYPE(upb::pb::Decoder, upb_pbdecoder)
+UPB_DECLARE_TYPE(upb::pb::DecoderMethodOptions, upb_pbdecodermethodopts)
 
-// The parameters one uses to construct a DecoderMethod.
-// TODO(haberman): move allowjit here?  Seems more convenient for users.
-UPB_DEFINE_CLASS0(upb::pb::DecoderMethodOptions,
+UPB_DECLARE_DERIVED_TYPE(upb::pb::DecoderMethod, upb::RefCounted,
+                         upb_pbdecodermethod, upb_refcounted)
+
+#ifdef __cplusplus
+
+/* The parameters one uses to construct a DecoderMethod.
+ * TODO(haberman): move allowjit here?  Seems more convenient for users.
+ * TODO(haberman): move this to be heap allocated for ABI stability. */
+class upb::pb::DecoderMethodOptions {
  public:
-  // Parameter represents the destination handlers that this method will push
-  // to.
+  /* Parameter represents the destination handlers that this method will push
+   * to. */
   explicit DecoderMethodOptions(const Handlers* dest_handlers);
 
-  // Should the decoder push submessages to lazy handlers for fields that have
-  // them?  The caller should set this iff the lazy handlers expect data that is
-  // in protobuf binary format and the caller wishes to lazy parse it.
+  /* Should the decoder push submessages to lazy handlers for fields that have
+   * them?  The caller should set this iff the lazy handlers expect data that is
+   * in protobuf binary format and the caller wishes to lazy parse it. */
   void set_lazy(bool lazy);
-,
-UPB_DEFINE_STRUCT0(upb_pbdecodermethodopts,
+#else
+struct upb_pbdecodermethodopts {
+#endif
   const upb_handlers *handlers;
   bool lazy;
-));
+};
 
-// Represents the code to parse a protobuf according to a destination Handlers.
-UPB_DEFINE_CLASS1(upb::pb::DecoderMethod, upb::RefCounted,
+#ifdef __cplusplus
+
+/* Represents the code to parse a protobuf according to a destination
+ * Handlers. */
+class upb::pb::DecoderMethod {
  public:
-  // From upb::ReferenceCounted.
-  void Ref(const void* owner) const;
-  void Unref(const void* owner) const;
-  void DonateRef(const void* from, const void* to) const;
-  void CheckRef(const void* owner) const;
+  /* Include base methods from upb::ReferenceCounted. */
+  UPB_REFCOUNTED_CPPMETHODS
 
-  // The destination handlers that are statically bound to this method.
-  // This method is only capable of outputting to a sink that uses these
-  // handlers.
+  /* The destination handlers that are statically bound to this method.
+   * This method is only capable of outputting to a sink that uses these
+   * handlers. */
   const Handlers* dest_handlers() const;
 
-  // The input handlers for this decoder method.
+  /* The input handlers for this decoder method. */
   const BytesHandler* input_handler() const;
 
-  // Whether this method is native.
+  /* Whether this method is native. */
   bool is_native() const;
 
-  // Convenience method for generating a DecoderMethod without explicitly
-  // creating a CodeCache.
+  /* Convenience method for generating a DecoderMethod without explicitly
+   * creating a CodeCache. */
   static reffed_ptr<const DecoderMethod> New(const DecoderMethodOptions& opts);
 
  private:
-  UPB_DISALLOW_POD_OPS(DecoderMethod, upb::pb::DecoderMethod);
-,
-UPB_DEFINE_STRUCT(upb_pbdecodermethod, upb_refcounted,
-  // While compiling, the base is relative in "ofs", after compiling it is
-  // absolute in "ptr".
-  union {
-    uint32_t ofs;     // PC offset of method.
-    void *ptr;        // Pointer to bytecode or machine code for this method.
-  } code_base;
+  UPB_DISALLOW_POD_OPS(DecoderMethod, upb::pb::DecoderMethod)
+};
 
-  // The decoder method group to which this method belongs.  We own a ref.
-  // Owning a ref on the entire group is more coarse-grained than is strictly
-  // necessary; all we truly require is that methods we directly reference
-  // outlive us, while the group could contain many other messages we don't
-  // require.  But the group represents the messages that were
-  // allocated+compiled together, so it makes the most sense to free them
-  // together also.
-  const upb_refcounted *group;
+#endif
 
-  // Whether this method is native code or bytecode.
-  bool is_native_;
-
-  // The handler one calls to invoke this method.
-  upb_byteshandler input_handler_;
-
-  // The destination handlers this method is bound to.  We own a ref.
-  const upb_handlers *dest_handlers_;
-
-  // Dispatch table -- used by both bytecode decoder and JIT when encountering a
-  // field number that wasn't the one we were expecting to see.  See
-  // decoder.int.h for the layout of this table.
-  upb_inttable dispatch;
-));
-
-// Preallocation hint: decoder won't allocate more bytes than this when first
-// constructed.  This hint may be an overestimate for some build configurations.
-// But if the decoder library is upgraded without recompiling the application,
-// it may be an underestimate.
+/* Preallocation hint: decoder won't allocate more bytes than this when first
+ * constructed.  This hint may be an overestimate for some build configurations.
+ * But if the decoder library is upgraded without recompiling the application,
+ * it may be an underestimate. */
 #define UPB_PB_DECODER_SIZE 4400
 
 #ifdef __cplusplus
 
-// A Decoder receives binary protobuf data on its input sink and pushes the
-// decoded data to its output sink.
+/* A Decoder receives binary protobuf data on its input sink and pushes the
+ * decoded data to its output sink. */
 class upb::pb::Decoder {
  public:
-  // Constructs a decoder instance for the given method, which must outlive this
-  // decoder.  Any errors during parsing will be set on the given status, which
-  // must also outlive this decoder.
-  //
-  // The sink must match the given method.
+  /* Constructs a decoder instance for the given method, which must outlive this
+   * decoder.  Any errors during parsing will be set on the given status, which
+   * must also outlive this decoder.
+   *
+   * The sink must match the given method. */
   static Decoder* Create(Environment* env, const DecoderMethod* method,
                          Sink* output);
 
-  // Returns the DecoderMethod this decoder is parsing from.
+  /* Returns the DecoderMethod this decoder is parsing from. */
   const DecoderMethod* method() const;
 
-  // The sink on which this decoder receives input.
+  /* The sink on which this decoder receives input. */
   BytesSink* input();
 
-  // Returns number of bytes successfully parsed.
-  //
-  // This can be useful for determining the stream position where an error
-  // occurred.
-  //
-  // This value may not be up-to-date when called from inside a parsing
-  // callback.
+  /* Returns number of bytes successfully parsed.
+   *
+   * This can be useful for determining the stream position where an error
+   * occurred.
+   *
+   * This value may not be up-to-date when called from inside a parsing
+   * callback. */
   uint64_t BytesParsed() const;
 
-  // Gets/sets the parsing nexting limit.  If the total number of nested
-  // submessages and repeated fields hits this limit, parsing will fail.  This
-  // is a resource limit that controls the amount of memory used by the parsing
-  // stack.
-  //
-  // Setting the limit will fail if the parser is currently suspended at a depth
-  // greater than this, or if memory allocation of the stack fails.
+  /* Gets/sets the parsing nexting limit.  If the total number of nested
+   * submessages and repeated fields hits this limit, parsing will fail.  This
+   * is a resource limit that controls the amount of memory used by the parsing
+   * stack.
+   *
+   * Setting the limit will fail if the parser is currently suspended at a depth
+   * greater than this, or if memory allocation of the stack fails. */
   size_t max_nesting() const;
   bool set_max_nesting(size_t max);
 
@@ -7089,57 +7220,62 @@
   static const size_t kSize = UPB_PB_DECODER_SIZE;
 
  private:
-  UPB_DISALLOW_POD_OPS(Decoder, upb::pb::Decoder);
+  UPB_DISALLOW_POD_OPS(Decoder, upb::pb::Decoder)
 };
 
-#endif  // __cplusplus
+#endif  /* __cplusplus */
 
-// A class for caching protobuf processing code, whether bytecode for the
-// interpreted decoder or machine code for the JIT.
-//
-// This class is not thread-safe.
-UPB_DEFINE_CLASS0(upb::pb::CodeCache,
+#ifdef __cplusplus
+
+/* A class for caching protobuf processing code, whether bytecode for the
+ * interpreted decoder or machine code for the JIT.
+ *
+ * This class is not thread-safe.
+ *
+ * TODO(haberman): move this to be heap allocated for ABI stability. */
+class upb::pb::CodeCache {
  public:
   CodeCache();
   ~CodeCache();
 
-  // Whether the cache is allowed to generate machine code.  Defaults to true.
-  // There is no real reason to turn it off except for testing or if you are
-  // having a specific problem with the JIT.
-  //
-  // Note that allow_jit = true does not *guarantee* that the code will be JIT
-  // compiled.  If this platform is not supported or the JIT was not compiled
-  // in, the code may still be interpreted.
+  /* Whether the cache is allowed to generate machine code.  Defaults to true.
+   * There is no real reason to turn it off except for testing or if you are
+   * having a specific problem with the JIT.
+   *
+   * Note that allow_jit = true does not *guarantee* that the code will be JIT
+   * compiled.  If this platform is not supported or the JIT was not compiled
+   * in, the code may still be interpreted. */
   bool allow_jit() const;
 
-  // This may only be called when the object is first constructed, and prior to
-  // any code generation, otherwise returns false and does nothing.
+  /* This may only be called when the object is first constructed, and prior to
+   * any code generation, otherwise returns false and does nothing. */
   bool set_allow_jit(bool allow);
 
-  // Returns a DecoderMethod that can push data to the given handlers.
-  // If a suitable method already exists, it will be returned from the cache.
-  //
-  // Specifying the destination handlers here allows the DecoderMethod to be
-  // statically bound to the destination handlers if possible, which can allow
-  // more efficient decoding.  However the returned method may or may not
-  // actually be statically bound.  But in all cases, the returned method can
-  // push data to the given handlers.
+  /* Returns a DecoderMethod that can push data to the given handlers.
+   * If a suitable method already exists, it will be returned from the cache.
+   *
+   * Specifying the destination handlers here allows the DecoderMethod to be
+   * statically bound to the destination handlers if possible, which can allow
+   * more efficient decoding.  However the returned method may or may not
+   * actually be statically bound.  But in all cases, the returned method can
+   * push data to the given handlers. */
   const DecoderMethod *GetDecoderMethod(const DecoderMethodOptions& opts);
 
-  // If/when someone needs to explicitly create a dynamically-bound
-  // DecoderMethod*, we can add a method to get it here.
+  /* If/when someone needs to explicitly create a dynamically-bound
+   * DecoderMethod*, we can add a method to get it here. */
 
  private:
-  UPB_DISALLOW_COPY_AND_ASSIGN(CodeCache);
-,
-UPB_DEFINE_STRUCT0(upb_pbcodecache,
+  UPB_DISALLOW_COPY_AND_ASSIGN(CodeCache)
+#else
+struct upb_pbcodecache {
+#endif
   bool allow_jit_;
 
-  // Array of mgroups.
+  /* Array of mgroups. */
   upb_inttable groups;
-));
+};
 
-UPB_BEGIN_EXTERN_C  // {
+UPB_BEGIN_EXTERN_C
 
 upb_pbdecoder *upb_pbdecoder_create(upb_env *e,
                                     const upb_pbdecodermethod *method,
@@ -7155,12 +7291,10 @@
                                   const upb_handlers *h);
 void upb_pbdecodermethodopts_setlazy(upb_pbdecodermethodopts *opts, bool lazy);
 
-void upb_pbdecodermethod_ref(const upb_pbdecodermethod *m, const void *owner);
-void upb_pbdecodermethod_unref(const upb_pbdecodermethod *m, const void *owner);
-void upb_pbdecodermethod_donateref(const upb_pbdecodermethod *m,
-                                   const void *from, const void *to);
-void upb_pbdecodermethod_checkref(const upb_pbdecodermethod *m,
-                                  const void *owner);
+
+/* Include refcounted methods like upb_pbdecodermethod_ref(). */
+UPB_REFCOUNTED_CMETHODS(upb_pbdecodermethod, upb_pbdecodermethod_upcast)
+
 const upb_handlers *upb_pbdecodermethod_desthandlers(
     const upb_pbdecodermethod *m);
 const upb_byteshandler *upb_pbdecodermethod_inputhandler(
@@ -7176,7 +7310,7 @@
 const upb_pbdecodermethod *upb_pbcodecache_getdecodermethod(
     upb_pbcodecache *c, const upb_pbdecodermethodopts *opts);
 
-UPB_END_EXTERN_C  // }
+UPB_END_EXTERN_C
 
 #ifdef __cplusplus
 
@@ -7184,7 +7318,7 @@
 
 namespace pb {
 
-// static
+/* static */
 inline Decoder* Decoder::Create(Environment* env, const DecoderMethod* m,
                                 Sink* sink) {
   return upb_pbdecoder_create(env, m, sink);
@@ -7213,18 +7347,6 @@
   upb_pbdecodermethodopts_setlazy(this, lazy);
 }
 
-inline void DecoderMethod::Ref(const void *owner) const {
-  upb_pbdecodermethod_ref(this, owner);
-}
-inline void DecoderMethod::Unref(const void *owner) const {
-  upb_pbdecodermethod_unref(this, owner);
-}
-inline void DecoderMethod::DonateRef(const void *from, const void *to) const {
-  upb_pbdecodermethod_donateref(this, from, to);
-}
-inline void DecoderMethod::CheckRef(const void *owner) const {
-  upb_pbdecodermethod_checkref(this, owner);
-}
 inline const Handlers* DecoderMethod::dest_handlers() const {
   return upb_pbdecodermethod_desthandlers(this);
 }
@@ -7234,7 +7356,7 @@
 inline bool DecoderMethod::is_native() const {
   return upb_pbdecodermethod_isnative(this);
 }
-// static
+/* static */
 inline reffed_ptr<const DecoderMethod> DecoderMethod::New(
     const DecoderMethodOptions &opts) {
   const upb_pbdecodermethod *m = upb_pbdecodermethod_new(&opts, &m);
@@ -7258,33 +7380,44 @@
   return upb_pbcodecache_getdecodermethod(this, &opts);
 }
 
-}  // namespace pb
-}  // namespace upb
+}  /* namespace pb */
+}  /* namespace upb */
 
-#endif  // __cplusplus
+#endif  /* __cplusplus */
 
 #endif  /* UPB_DECODER_H_ */
 
-// Opcode definitions.  The canonical meaning of each opcode is its
-// implementation in the interpreter (the JIT is written to match this).
-//
-// All instructions have the opcode in the low byte.
-// Instruction format for most instructions is:
-//
-// +-------------------+--------+
-// |     arg (24)      | op (8) |
-// +-------------------+--------+
-//
-// Exceptions are indicated below.  A few opcodes are multi-word.
+/* C++ names are not actually used since this type isn't exposed to users. */
+#ifdef __cplusplus
+namespace upb {
+namespace pb {
+class MessageGroup;
+}  /* namespace pb */
+}  /* namespace upb */
+#endif
+UPB_DECLARE_DERIVED_TYPE(upb::pb::MessageGroup, upb::RefCounted,
+                         mgroup, upb_refcounted)
+
+/* Opcode definitions.  The canonical meaning of each opcode is its
+ * implementation in the interpreter (the JIT is written to match this).
+ *
+ * All instructions have the opcode in the low byte.
+ * Instruction format for most instructions is:
+ *
+ * +-------------------+--------+
+ * |     arg (24)      | op (8) |
+ * +-------------------+--------+
+ *
+ * Exceptions are indicated below.  A few opcodes are multi-word. */
 typedef enum {
-  // Opcodes 1-8, 13, 15-18 parse their respective descriptor types.
-  // Arg for all of these is the upb selector for this field.
+  /* Opcodes 1-8, 13, 15-18 parse their respective descriptor types.
+   * Arg for all of these is the upb selector for this field. */
 #define T(type) OP_PARSE_ ## type = UPB_DESCRIPTOR_TYPE_ ## type
   T(DOUBLE), T(FLOAT), T(INT64), T(UINT64), T(INT32), T(FIXED64), T(FIXED32),
   T(BOOL), T(UINT32), T(SFIXED32), T(SFIXED64), T(SINT32), T(SINT64),
 #undef T
-  OP_STARTMSG       = 9,   // No arg.
-  OP_ENDMSG         = 10,  // No arg.
+  OP_STARTMSG       = 9,   /* No arg. */
+  OP_ENDMSG         = 10,  /* No arg. */
   OP_STARTSEQ       = 11,
   OP_ENDSEQ         = 12,
   OP_STARTSUBMSG    = 14,
@@ -7293,148 +7426,185 @@
   OP_STRING         = 21,
   OP_ENDSTR         = 22,
 
-  OP_PUSHTAGDELIM   = 23,  // No arg.
-  OP_PUSHLENDELIM   = 24,  // No arg.
-  OP_POP            = 25,  // No arg.
-  OP_SETDELIM       = 26,  // No arg.
-  OP_SETBIGGROUPNUM = 27,  // two words: | unused (24) | opc || groupnum (32) |
+  OP_PUSHTAGDELIM   = 23,  /* No arg. */
+  OP_PUSHLENDELIM   = 24,  /* No arg. */
+  OP_POP            = 25,  /* No arg. */
+  OP_SETDELIM       = 26,  /* No arg. */
+  OP_SETBIGGROUPNUM = 27,  /* two words:
+                            *   | unused (24)     | opc (8) |
+                            *   |        groupnum (32)      | */
   OP_CHECKDELIM     = 28,
   OP_CALL           = 29,
   OP_RET            = 30,
   OP_BRANCH         = 31,
 
-  // Different opcodes depending on how many bytes expected.
-  OP_TAG1           = 32,  // | expected tag (16) | jump target (8) | opc (8) |
-  OP_TAG2           = 33,  // | expected tag (16) | jump target (8) | opc (8) |
-  OP_TAGN           = 34,  // three words:
-                           //   | unused (16) | jump target(8) | opc (8) |
-                           //   |           expected tag 1 (32)          |
-                           //   |           expected tag 2 (32)          |
+  /* Different opcodes depending on how many bytes expected. */
+  OP_TAG1           = 32,  /* | match tag (16) | jump target (8) | opc (8) | */
+  OP_TAG2           = 33,  /* | match tag (16) | jump target (8) | opc (8) | */
+  OP_TAGN           = 34,  /* three words: */
+                           /*   | unused (16) | jump target(8) | opc (8) | */
+                           /*   |           match tag 1 (32)             | */
+                           /*   |           match tag 2 (32)             | */
 
-  OP_SETDISPATCH    = 35,  // N words:
-                           //   | unused (24)         | opc |
-                           //   | upb_inttable* (32 or 64)  |
+  OP_SETDISPATCH    = 35,  /* N words: */
+                           /*   | unused (24)         | opc | */
+                           /*   | upb_inttable* (32 or 64)  | */
 
-  OP_DISPATCH       = 36,  // No arg.
+  OP_DISPATCH       = 36,  /* No arg. */
 
-  OP_HALT           = 37,  // No arg.
+  OP_HALT           = 37   /* No arg. */
 } opcode;
 
 #define OP_MAX OP_HALT
 
 UPB_INLINE opcode getop(uint32_t instr) { return instr & 0xff; }
 
-// Method group; represents a set of decoder methods that had their code
-// emitted together, and must therefore be freed together.  Immutable once
-// created.  It is possible we may want to expose this to users at some point.
-//
-// Overall ownership of Decoder objects looks like this:
-//
-//                +----------+
-//                |          | <---> DecoderMethod
-//                | method   |
-// CodeCache ---> |  group   | <---> DecoderMethod
-//                |          |
-//                | (mgroup) | <---> DecoderMethod
-//                +----------+
-typedef struct {
+/* Method group; represents a set of decoder methods that had their code
+ * emitted together, and must therefore be freed together.  Immutable once
+ * created.  It is possible we may want to expose this to users at some point.
+ *
+ * Overall ownership of Decoder objects looks like this:
+ *
+ *                +----------+
+ *                |          | <---> DecoderMethod
+ *                | method   |
+ * CodeCache ---> |  group   | <---> DecoderMethod
+ *                |          |
+ *                | (mgroup) | <---> DecoderMethod
+ *                +----------+
+ */
+struct mgroup {
   upb_refcounted base;
 
-  // Maps upb_msgdef/upb_handlers -> upb_pbdecodermethod.  We own refs on the
-  // methods.
+  /* Maps upb_msgdef/upb_handlers -> upb_pbdecodermethod.  We own refs on the
+   * methods. */
   upb_inttable methods;
 
-  // When we add the ability to link to previously existing mgroups, we'll
-  // need an array of mgroups we reference here, and own refs on them.
+  /* When we add the ability to link to previously existing mgroups, we'll
+   * need an array of mgroups we reference here, and own refs on them. */
 
-  // The bytecode for our methods, if any exists.  Owned by us.
+  /* The bytecode for our methods, if any exists.  Owned by us. */
   uint32_t *bytecode;
   uint32_t *bytecode_end;
 
 #ifdef UPB_USE_JIT_X64
-  // JIT-generated machine code, if any.
+  /* JIT-generated machine code, if any. */
   upb_string_handlerfunc *jit_code;
-  // The size of the jit_code (required to munmap()).
+  /* The size of the jit_code (required to munmap()). */
   size_t jit_size;
   char *debug_info;
   void *dl;
 #endif
-} mgroup;
+};
 
-// The maximum that any submessages can be nested.  Matches proto2's limit.
-// This specifies the size of the decoder's statically-sized array and therefore
-// setting it high will cause the upb::pb::Decoder object to be larger.
-//
-// If necessary we can add a runtime-settable property to Decoder that allow
-// this to be larger than the compile-time setting, but this would add
-// complexity, particularly since we would have to decide how/if to give users
-// the ability to set a custom memory allocation function.
+/* The maximum that any submessages can be nested.  Matches proto2's limit.
+ * This specifies the size of the decoder's statically-sized array and therefore
+ * setting it high will cause the upb::pb::Decoder object to be larger.
+ *
+ * If necessary we can add a runtime-settable property to Decoder that allow
+ * this to be larger than the compile-time setting, but this would add
+ * complexity, particularly since we would have to decide how/if to give users
+ * the ability to set a custom memory allocation function. */
 #define UPB_DECODER_MAX_NESTING 64
 
-// Internal-only struct used by the decoder.
+/* Internal-only struct used by the decoder. */
 typedef struct {
-  // Space optimization note: we store two pointers here that the JIT
-  // doesn't need at all; the upb_handlers* inside the sink and
-  // the dispatch table pointer.  We can optimze so that the JIT uses
-  // smaller stack frames than the interpreter.  The only thing we need
-  // to guarantee is that the fallback routines can find end_ofs.
+  /* Space optimization note: we store two pointers here that the JIT
+   * doesn't need at all; the upb_handlers* inside the sink and
+   * the dispatch table pointer.  We can optimze so that the JIT uses
+   * smaller stack frames than the interpreter.  The only thing we need
+   * to guarantee is that the fallback routines can find end_ofs. */
   upb_sink sink;
 
-  // The absolute stream offset of the end-of-frame delimiter.
-  // Non-delimited frames (groups and non-packed repeated fields) reuse the
-  // delimiter of their parent, even though the frame may not end there.
-  //
-  // NOTE: the JIT stores a slightly different value here for non-top frames.
-  // It stores the value relative to the end of the enclosed message.  But the
-  // top frame is still stored the same way, which is important for ensuring
-  // that calls from the JIT into C work correctly.
+  /* The absolute stream offset of the end-of-frame delimiter.
+   * Non-delimited frames (groups and non-packed repeated fields) reuse the
+   * delimiter of their parent, even though the frame may not end there.
+   *
+   * NOTE: the JIT stores a slightly different value here for non-top frames.
+   * It stores the value relative to the end of the enclosed message.  But the
+   * top frame is still stored the same way, which is important for ensuring
+   * that calls from the JIT into C work correctly. */
   uint64_t end_ofs;
   const uint32_t *base;
 
-  // 0 indicates a length-delimited field.
-  // A positive number indicates a known group.
-  // A negative number indicates an unknown group.
+  /* 0 indicates a length-delimited field.
+   * A positive number indicates a known group.
+   * A negative number indicates an unknown group. */
   int32_t groupnum;
-  upb_inttable *dispatch;  // Not used by the JIT.
+  upb_inttable *dispatch;  /* Not used by the JIT. */
 } upb_pbdecoder_frame;
 
+struct upb_pbdecodermethod {
+  upb_refcounted base;
+
+  /* While compiling, the base is relative in "ofs", after compiling it is
+   * absolute in "ptr". */
+  union {
+    uint32_t ofs;     /* PC offset of method. */
+    void *ptr;        /* Pointer to bytecode or machine code for this method. */
+  } code_base;
+
+  /* The decoder method group to which this method belongs.  We own a ref.
+   * Owning a ref on the entire group is more coarse-grained than is strictly
+   * necessary; all we truly require is that methods we directly reference
+   * outlive us, while the group could contain many other messages we don't
+   * require.  But the group represents the messages that were
+   * allocated+compiled together, so it makes the most sense to free them
+   * together also. */
+  const upb_refcounted *group;
+
+  /* Whether this method is native code or bytecode. */
+  bool is_native_;
+
+  /* The handler one calls to invoke this method. */
+  upb_byteshandler input_handler_;
+
+  /* The destination handlers this method is bound to.  We own a ref. */
+  const upb_handlers *dest_handlers_;
+
+  /* Dispatch table -- used by both bytecode decoder and JIT when encountering a
+   * field number that wasn't the one we were expecting to see.  See
+   * decoder.int.h for the layout of this table. */
+  upb_inttable dispatch;
+};
+
 struct upb_pbdecoder {
   upb_env *env;
 
-  // Our input sink.
+  /* Our input sink. */
   upb_bytessink input_;
 
-  // The decoder method we are parsing with (owned).
+  /* The decoder method we are parsing with (owned). */
   const upb_pbdecodermethod *method_;
 
   size_t call_len;
   const uint32_t *pc, *last;
 
-  // Current input buffer and its stream offset.
+  /* Current input buffer and its stream offset. */
   const char *buf, *ptr, *end, *checkpoint;
 
-  // End of the delimited region, relative to ptr, or NULL if not in this buf.
+  /* End of the delimited region, relative to ptr, NULL if not in this buf. */
   const char *delim_end;
 
-  // End of the delimited region, relative to ptr, or end if not in this buf.
+  /* End of the delimited region, relative to ptr, end if not in this buf. */
   const char *data_end;
 
-  // Overall stream offset of "buf."
+  /* Overall stream offset of "buf." */
   uint64_t bufstart_ofs;
 
-  // Buffer for residual bytes not parsed from the previous buffer.
-  // The maximum number of residual bytes we require is 12; a five-byte
-  // unknown tag plus an eight-byte value, less one because the value
-  // is only a partial value.
+  /* Buffer for residual bytes not parsed from the previous buffer.
+   * The maximum number of residual bytes we require is 12; a five-byte
+   * unknown tag plus an eight-byte value, less one because the value
+   * is only a partial value. */
   char residual[12];
   char *residual_end;
 
-  // Stores the user buffer passed to our decode function.
+  /* Stores the user buffer passed to our decode function. */
   const char *buf_param;
   size_t size_param;
   const upb_bufhandle *handle;
 
-  // Our internal stack.
+  /* Our internal stack. */
   upb_pbdecoder_frame *stack, *top, *limit;
   const uint32_t **callstack;
   size_t stack_size;
@@ -7442,22 +7612,22 @@
   upb_status *status;
 
 #ifdef UPB_USE_JIT_X64
-  // Used momentarily by the generated code to store a value while a user
-  // function is called.
+  /* Used momentarily by the generated code to store a value while a user
+   * function is called. */
   uint32_t tmp_len;
 
   const void *saved_rsp;
 #endif
 };
 
-// Decoder entry points; used as handlers.
+/* Decoder entry points; used as handlers. */
 void *upb_pbdecoder_startbc(void *closure, const void *pc, size_t size_hint);
 void *upb_pbdecoder_startjit(void *closure, const void *hd, size_t size_hint);
 size_t upb_pbdecoder_decode(void *closure, const void *hd, const char *buf,
                             size_t size, const upb_bufhandle *handle);
 bool upb_pbdecoder_end(void *closure, const void *handler_data);
 
-// Decoder-internal functions that the JIT calls to handle fallback paths.
+/* Decoder-internal functions that the JIT calls to handle fallback paths. */
 int32_t upb_pbdecoder_resume(upb_pbdecoder *d, void *p, const char *buf,
                              size_t size, const upb_bufhandle *handle);
 size_t upb_pbdecoder_suspend(upb_pbdecoder *d);
@@ -7469,41 +7639,42 @@
 int32_t upb_pbdecoder_decode_f64(upb_pbdecoder *d, uint64_t *u64);
 void upb_pbdecoder_seterr(upb_pbdecoder *d, const char *msg);
 
-// Error messages that are shared between the bytecode and JIT decoders.
+/* Error messages that are shared between the bytecode and JIT decoders. */
 extern const char *kPbDecoderStackOverflow;
 
-// Access to decoderplan members needed by the decoder.
+/* Access to decoderplan members needed by the decoder. */
 const char *upb_pbdecoder_getopname(unsigned int op);
 
-// JIT codegen entry point.
+/* JIT codegen entry point. */
 void upb_pbdecoder_jit(mgroup *group);
 void upb_pbdecoder_freejit(mgroup *group);
+UPB_REFCOUNTED_CMETHODS(mgroup, mgroup_upcast)
 
-// A special label that means "do field dispatch for this message and branch to
-// wherever that takes you."
+/* A special label that means "do field dispatch for this message and branch to
+ * wherever that takes you." */
 #define LABEL_DISPATCH 0
 
-// A special slot in the dispatch table that stores the epilogue (ENDMSG and/or
-// RET) for branching to when we find an appropriate ENDGROUP tag.
+/* A special slot in the dispatch table that stores the epilogue (ENDMSG and/or
+ * RET) for branching to when we find an appropriate ENDGROUP tag. */
 #define DISPATCH_ENDMSG 0
 
-// It's important to use this invalid wire type instead of 0 (which is a valid
-// wire type).
+/* It's important to use this invalid wire type instead of 0 (which is a valid
+ * wire type). */
 #define NO_WIRE_TYPE 0xff
 
-// The dispatch table layout is:
-//   [field number] -> [ 48-bit offset ][ 8-bit wt2 ][ 8-bit wt1 ]
-//
-// If wt1 matches, jump to the 48-bit offset.  If wt2 matches, lookup
-// (UPB_MAX_FIELDNUMBER + fieldnum) and jump there.
-//
-// We need two wire types because of packed/non-packed compatibility.  A
-// primitive repeated field can use either wire type and be valid.  While we
-// could key the table on fieldnum+wiretype, the table would be 8x sparser.
-//
-// Storing two wire types in the primary value allows us to quickly rule out
-// the second wire type without needing to do a separate lookup (this case is
-// less common than an unknown field).
+/* The dispatch table layout is:
+ *   [field number] -> [ 48-bit offset ][ 8-bit wt2 ][ 8-bit wt1 ]
+ *
+ * If wt1 matches, jump to the 48-bit offset.  If wt2 matches, lookup
+ * (UPB_MAX_FIELDNUMBER + fieldnum) and jump there.
+ *
+ * We need two wire types because of packed/non-packed compatibility.  A
+ * primitive repeated field can use either wire type and be valid.  While we
+ * could key the table on fieldnum+wiretype, the table would be 8x sparser.
+ *
+ * Storing two wire types in the primary value allows us to quickly rule out
+ * the second wire type without needing to do a separate lookup (this case is
+ * less common than an unknown field). */
 UPB_INLINE uint64_t upb_pbdecoder_packdispatch(uint64_t ofs, uint8_t wt1,
                                                uint8_t wt2) {
   return (ofs << 16) | (wt2 << 8) | wt1;
@@ -7516,20 +7687,20 @@
   *ofs = dispatch >> 16;
 }
 
-// All of the functions in decoder.c that return int32_t return values according
-// to the following scheme:
-//   1. negative values indicate a return code from the following list.
-//   2. positive values indicate that error or end of buffer was hit, and
-//      that the decode function should immediately return the given value
-//      (the decoder state has already been suspended and is ready to be
-//      resumed).
+/* All of the functions in decoder.c that return int32_t return values according
+ * to the following scheme:
+ *   1. negative values indicate a return code from the following list.
+ *   2. positive values indicate that error or end of buffer was hit, and
+ *      that the decode function should immediately return the given value
+ *      (the decoder state has already been suspended and is ready to be
+ *      resumed). */
 #define DECODE_OK -1
-#define DECODE_MISMATCH -2  // Used only from checktag_slow().
-#define DECODE_ENDGROUP -3  // Used only from checkunknown().
+#define DECODE_MISMATCH -2  /* Used only from checktag_slow(). */
+#define DECODE_ENDGROUP -3  /* Used only from checkunknown(). */
 
 #define CHECK_RETURN(x) { int32_t ret = x; if (ret >= 0) return ret; }
 
-#endif  // UPB_DECODER_INT_H_
+#endif  /* UPB_DECODER_INT_H_ */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -7551,25 +7722,25 @@
 extern "C" {
 #endif
 
-// A list of types as they are encoded on-the-wire.
+/* A list of types as they are encoded on-the-wire. */
 typedef enum {
   UPB_WIRE_TYPE_VARINT      = 0,
   UPB_WIRE_TYPE_64BIT       = 1,
   UPB_WIRE_TYPE_DELIMITED   = 2,
   UPB_WIRE_TYPE_START_GROUP = 3,
   UPB_WIRE_TYPE_END_GROUP   = 4,
-  UPB_WIRE_TYPE_32BIT       = 5,
+  UPB_WIRE_TYPE_32BIT       = 5
 } upb_wiretype_t;
 
 #define UPB_MAX_WIRE_TYPE 5
 
-// The maximum number of bytes that it takes to encode a 64-bit varint.
-// Note that with a better encoding this could be 9 (TODO: write up a
-// wiki document about this).
+/* The maximum number of bytes that it takes to encode a 64-bit varint.
+ * Note that with a better encoding this could be 9 (TODO: write up a
+ * wiki document about this). */
 #define UPB_PB_VARINT_MAX_LEN 10
 
-// Array of the "native" (ie. non-packed-repeated) wire type for the given a
-// descriptor type (upb_descriptortype_t).
+/* Array of the "native" (ie. non-packed-repeated) wire type for the given a
+ * descriptor type (upb_descriptortype_t). */
 extern const uint8_t upb_pb_native_wire_types[];
 
 /* Zig-zag encoding/decoding **************************************************/
@@ -7585,44 +7756,59 @@
 
 /* Decoding *******************************************************************/
 
-// All decoding functions return this struct by value.
+/* All decoding functions return this struct by value. */
 typedef struct {
-  const char *p;  // NULL if the varint was unterminated.
+  const char *p;  /* NULL if the varint was unterminated. */
   uint64_t val;
 } upb_decoderet;
 
-// Four functions for decoding a varint of at most eight bytes.  They are all
-// functionally identical, but are implemented in different ways and likely have
-// different performance profiles.  We keep them around for performance testing.
-//
-// Note that these functions may not read byte-by-byte, so they must not be used
-// unless there are at least eight bytes left in the buffer!
+UPB_INLINE upb_decoderet upb_decoderet_make(const char *p, uint64_t val) {
+  upb_decoderet ret;
+  ret.p = p;
+  ret.val = val;
+  return ret;
+}
+
+/* Four functions for decoding a varint of at most eight bytes.  They are all
+ * functionally identical, but are implemented in different ways and likely have
+ * different performance profiles.  We keep them around for performance testing.
+ *
+ * Note that these functions may not read byte-by-byte, so they must not be used
+ * unless there are at least eight bytes left in the buffer! */
 upb_decoderet upb_vdecode_max8_branch32(upb_decoderet r);
 upb_decoderet upb_vdecode_max8_branch64(upb_decoderet r);
 upb_decoderet upb_vdecode_max8_wright(upb_decoderet r);
 upb_decoderet upb_vdecode_max8_massimino(upb_decoderet r);
 
-// Template for a function that checks the first two bytes with branching
-// and dispatches 2-10 bytes with a separate function.  Note that this may read
-// up to 10 bytes, so it must not be used unless there are at least ten bytes
-// left in the buffer!
+/* Template for a function that checks the first two bytes with branching
+ * and dispatches 2-10 bytes with a separate function.  Note that this may read
+ * up to 10 bytes, so it must not be used unless there are at least ten bytes
+ * left in the buffer! */
 #define UPB_VARINT_DECODER_CHECK2(name, decode_max8_function)                  \
 UPB_INLINE upb_decoderet upb_vdecode_check2_ ## name(const char *_p) {         \
   uint8_t *p = (uint8_t*)_p;                                                   \
-  if ((*p & 0x80) == 0) { upb_decoderet r = {_p + 1, *p & 0x7fU}; return r; }  \
-  upb_decoderet r = {_p + 2, (*p & 0x7fU) | ((*(p + 1) & 0x7fU) << 7)};        \
-  if ((*(p + 1) & 0x80) == 0) return r;                                        \
+  upb_decoderet r;                                                             \
+  if ((*p & 0x80) == 0) {                                                      \
+  /* Common case: one-byte varint. */                                          \
+    return upb_decoderet_make(_p + 1, *p & 0x7fU);                             \
+  }                                                                            \
+  r = upb_decoderet_make(_p + 2, (*p & 0x7fU) | ((*(p + 1) & 0x7fU) << 7));    \
+  if ((*(p + 1) & 0x80) == 0) {                                                \
+    /* Two-byte varint. */                                                     \
+    return r;                                                                  \
+  }                                                                            \
+  /* Longer varint, fallback to out-of-line function. */                       \
   return decode_max8_function(r);                                              \
 }
 
-UPB_VARINT_DECODER_CHECK2(branch32, upb_vdecode_max8_branch32);
-UPB_VARINT_DECODER_CHECK2(branch64, upb_vdecode_max8_branch64);
-UPB_VARINT_DECODER_CHECK2(wright, upb_vdecode_max8_wright);
-UPB_VARINT_DECODER_CHECK2(massimino, upb_vdecode_max8_massimino);
+UPB_VARINT_DECODER_CHECK2(branch32, upb_vdecode_max8_branch32)
+UPB_VARINT_DECODER_CHECK2(branch64, upb_vdecode_max8_branch64)
+UPB_VARINT_DECODER_CHECK2(wright, upb_vdecode_max8_wright)
+UPB_VARINT_DECODER_CHECK2(massimino, upb_vdecode_max8_massimino)
 #undef UPB_VARINT_DECODER_CHECK2
 
-// Our canonical functions for decoding varints, based on the currently
-// favored best-performing implementations.
+/* Our canonical functions for decoding varints, based on the currently
+ * favored best-performing implementations. */
 UPB_INLINE upb_decoderet upb_vdecode_fast(const char *p) {
   if (sizeof(long) == 8)
     return upb_vdecode_check2_branch64(p);
@@ -7639,7 +7825,7 @@
 
 UPB_INLINE int upb_value_size(uint64_t val) {
 #ifdef __GNUC__
-  int high_bit = 63 - __builtin_clzll(val);  // 0-based, undef if val == 0.
+  int high_bit = 63 - __builtin_clzll(val);  /* 0-based, undef if val == 0. */
 #else
   int high_bit = 0;
   uint64_t tmp = val;
@@ -7648,13 +7834,14 @@
   return val == 0 ? 1 : high_bit / 8 + 1;
 }
 
-// Encodes a 64-bit varint into buf (which must be >=UPB_PB_VARINT_MAX_LEN
-// bytes long), returning how many bytes were used.
-//
-// TODO: benchmark and optimize if necessary.
+/* Encodes a 64-bit varint into buf (which must be >=UPB_PB_VARINT_MAX_LEN
+ * bytes long), returning how many bytes were used.
+ *
+ * TODO: benchmark and optimize if necessary. */
 UPB_INLINE size_t upb_vencode64(uint64_t val, char *buf) {
+  size_t i;
   if (val == 0) { buf[0] = 0; return 1; }
-  size_t i = 0;
+  i = 0;
   while (val) {
     uint8_t byte = val & 0x7fU;
     val >>= 7;
@@ -7669,7 +7856,7 @@
   return upb_vencode64(val, buf);
 }
 
-// Encodes a 32-bit varint, *not* sign-extended.
+/* Encodes a 32-bit varint, *not* sign-extended. */
 UPB_INLINE uint64_t upb_vencode32(uint32_t val) {
   char buf[UPB_PB_VARINT_MAX_LEN];
   size_t bytes = upb_vencode64(val, buf);
@@ -7707,35 +7894,35 @@
 namespace upb {
 namespace pb {
 class Encoder;
-}  // namespace pb
-}  // namespace upb
+}  /* namespace pb */
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::pb::Encoder, upb_pb_encoder);
+UPB_DECLARE_TYPE(upb::pb::Encoder, upb_pb_encoder)
 
 #define UPB_PBENCODER_MAX_NESTING 100
 
 /* upb::pb::Encoder ***********************************************************/
 
-// Preallocation hint: decoder won't allocate more bytes than this when first
-// constructed.  This hint may be an overestimate for some build configurations.
-// But if the decoder library is upgraded without recompiling the application,
-// it may be an underestimate.
+/* Preallocation hint: decoder won't allocate more bytes than this when first
+ * constructed.  This hint may be an overestimate for some build configurations.
+ * But if the decoder library is upgraded without recompiling the application,
+ * it may be an underestimate. */
 #define UPB_PB_ENCODER_SIZE 768
 
 #ifdef __cplusplus
 
 class upb::pb::Encoder {
  public:
-  // Creates a new encoder in the given environment.  The Handlers must have
-  // come from NewHandlers() below.
+  /* Creates a new encoder in the given environment.  The Handlers must have
+   * come from NewHandlers() below. */
   static Encoder* Create(Environment* env, const Handlers* handlers,
                          BytesSink* output);
 
-  // The input to the encoder.
+  /* The input to the encoder. */
   Sink* input();
 
-  // Creates a new set of handlers for this MessageDef.
+  /* Creates a new set of handlers for this MessageDef. */
   static reffed_ptr<const Handlers> NewHandlers(const MessageDef* msg);
 
   static const size_t kSize = UPB_PB_ENCODER_SIZE;
@@ -7772,8 +7959,8 @@
   const Handlers* h = upb_pb_encoder_newhandlers(md, &h);
   return reffed_ptr<const Handlers>(h, &h);
 }
-}  // namespace pb
-}  // namespace upb
+}  /* namespace pb */
+}  /* namespace upb */
 
 #endif
 
@@ -7812,23 +7999,23 @@
 extern "C" {
 #endif
 
-// Loads all defs from the given protobuf binary descriptor, setting default
-// accessors and a default layout on all messages.  The caller owns the
-// returned array of defs, which will be of length *n.  On error NULL is
-// returned and status is set (if non-NULL).
+/* Loads all defs from the given protobuf binary descriptor, setting default
+ * accessors and a default layout on all messages.  The caller owns the
+ * returned array of defs, which will be of length *n.  On error NULL is
+ * returned and status is set (if non-NULL). */
 upb_def **upb_load_defs_from_descriptor(const char *str, size_t len, int *n,
                                         void *owner, upb_status *status);
 
-// Like the previous but also adds the loaded defs to the given symtab.
+/* Like the previous but also adds the loaded defs to the given symtab. */
 bool upb_load_descriptor_into_symtab(upb_symtab *symtab, const char *str,
                                      size_t len, upb_status *status);
 
-// Like the previous but also reads the descriptor from the given filename.
+/* Like the previous but also reads the descriptor from the given filename. */
 bool upb_load_descriptor_file_into_symtab(upb_symtab *symtab, const char *fname,
                                           upb_status *status);
 
-// Reads the given filename into a character string, returning NULL if there
-// was an error.
+/* Reads the given filename into a character string, returning NULL if there
+ * was an error. */
 char *upb_readfile(const char *filename, size_t *len);
 
 #ifdef __cplusplus
@@ -7836,8 +8023,8 @@
 
 namespace upb {
 
-// All routines that load descriptors expect the descriptor to be a
-// FileDescriptorSet.
+/* All routines that load descriptors expect the descriptor to be a
+ * FileDescriptorSet. */
 inline bool LoadDescriptorFileIntoSymtab(SymbolTable* s, const char *fname,
                                          Status* status) {
   return upb_load_descriptor_file_into_symtab(s, fname, status);
@@ -7848,17 +8035,17 @@
   return upb_load_descriptor_into_symtab(s, str, len, status);
 }
 
-// Templated so it can accept both string and std::string.
+/* Templated so it can accept both string and std::string. */
 template <typename T>
 bool LoadDescriptorIntoSymtab(SymbolTable* s, const T& desc, Status* status) {
   return upb_load_descriptor_into_symtab(s, desc.c_str(), desc.size(), status);
 }
 
-}  // namespace upb
+}  /* namespace upb */
 
 #endif
 
-#endif
+#endif  /* UPB_GLUE_H */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -7874,18 +8061,18 @@
 namespace upb {
 namespace pb {
 class TextPrinter;
-}  // namespace pb
-}  // namespace upb
+}  /* namespace pb */
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::pb::TextPrinter, upb_textprinter);
+UPB_DECLARE_TYPE(upb::pb::TextPrinter, upb_textprinter)
 
 #ifdef __cplusplus
 
 class upb::pb::TextPrinter {
  public:
-  // The given handlers must have come from NewHandlers().  It must outlive the
-  // TextPrinter.
+  /* The given handlers must have come from NewHandlers().  It must outlive the
+   * TextPrinter. */
   static TextPrinter *Create(Environment *env, const upb::Handlers *handlers,
                              BytesSink *output);
 
@@ -7893,8 +8080,8 @@
 
   Sink* input();
 
-  // If handler caching becomes a requirement we can add a code cache as in
-  // decoder.h
+  /* If handler caching becomes a requirement we can add a code cache as in
+   * decoder.h */
   static reffed_ptr<const Handlers> NewHandlers(const MessageDef* md);
 };
 
@@ -7902,7 +8089,7 @@
 
 UPB_BEGIN_EXTERN_C
 
-// C API.
+/* C API. */
 upb_textprinter *upb_textprinter_create(upb_env *env, const upb_handlers *h,
                                         upb_bytessink *output);
 void upb_textprinter_setsingleline(upb_textprinter *p, bool single_line);
@@ -7933,8 +8120,8 @@
   const Handlers* h = upb_textprinter_newhandlers(md, &h);
   return reffed_ptr<const Handlers>(h, &h);
 }
-}  // namespace pb
-}  // namespace upb
+}  /* namespace pb */
+}  /* namespace upb */
 
 #endif
 
@@ -7957,23 +8144,24 @@
 namespace upb {
 namespace json {
 class Parser;
-}  // namespace json
-}  // namespace upb
+}  /* namespace json */
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser);
+UPB_DECLARE_TYPE(upb::json::Parser, upb_json_parser)
 
 /* upb::json::Parser **********************************************************/
 
-// Preallocation hint: parser won't allocate more bytes than this when first
-// constructed.  This hint may be an overestimate for some build configurations.
-// But if the parser library is upgraded without recompiling the application,
-// it may be an underestimate.
+/* Preallocation hint: parser won't allocate more bytes than this when first
+ * constructed.  This hint may be an overestimate for some build configurations.
+ * But if the parser library is upgraded without recompiling the application,
+ * it may be an underestimate. */
 #define UPB_JSON_PARSER_SIZE 3568
 
 #ifdef __cplusplus
 
-// Parses an incoming BytesStream, pushing the results to the destination sink.
+/* Parses an incoming BytesStream, pushing the results to the destination
+ * sink. */
 class upb::json::Parser {
  public:
   static Parser* Create(Environment* env, Sink* output);
@@ -7981,7 +8169,7 @@
   BytesSink* input();
 
  private:
-  UPB_DISALLOW_POD_OPS(Parser, upb::json::Parser);
+  UPB_DISALLOW_POD_OPS(Parser, upb::json::Parser)
 };
 
 #endif
@@ -8003,13 +8191,13 @@
 inline BytesSink* Parser::input() {
   return upb_json_parser_input(this);
 }
-}  // namespace json
-}  // namespace upb
+}  /* namespace json */
+}  /* namespace upb */
 
 #endif
 
 
-#endif  // UPB_JSON_PARSER_H_
+#endif  /* UPB_JSON_PARSER_H_ */
 /*
  * upb - a minimalist implementation of protocol buffers.
  *
@@ -8028,11 +8216,11 @@
 namespace upb {
 namespace json {
 class Printer;
-}  // namespace json
-}  // namespace upb
+}  /* namespace json */
+}  /* namespace upb */
 #endif
 
-UPB_DECLARE_TYPE(upb::json::Printer, upb_json_printer);
+UPB_DECLARE_TYPE(upb::json::Printer, upb_json_printer)
 
 
 /* upb::json::Printer *********************************************************/
@@ -8041,29 +8229,29 @@
 
 #ifdef __cplusplus
 
-// Prints an incoming stream of data to a BytesSink in JSON format.
+/* Prints an incoming stream of data to a BytesSink in JSON format. */
 class upb::json::Printer {
  public:
   static Printer* Create(Environment* env, const upb::Handlers* handlers,
                          BytesSink* output);
 
-  // The input to the printer.
+  /* The input to the printer. */
   Sink* input();
 
-  // Returns handlers for printing according to the specified schema.
+  /* Returns handlers for printing according to the specified schema. */
   static reffed_ptr<const Handlers> NewHandlers(const upb::MessageDef* md);
 
   static const size_t kSize = UPB_JSON_PRINTER_SIZE;
 
  private:
-  UPB_DISALLOW_POD_OPS(Printer, upb::json::Printer);
+  UPB_DISALLOW_POD_OPS(Printer, upb::json::Printer)
 };
 
 #endif
 
 UPB_BEGIN_EXTERN_C
 
-// Native C API.
+/* Native C API. */
 upb_json_printer *upb_json_printer_create(upb_env *e, const upb_handlers *h,
                                           upb_bytessink *output);
 upb_sink *upb_json_printer_input(upb_json_printer *p);
@@ -8086,9 +8274,9 @@
   const Handlers* h = upb_json_printer_newhandlers(md, &h);
   return reffed_ptr<const Handlers>(h, &h);
 }
-}  // namespace json
-}  // namespace upb
+}  /* namespace json */
+}  /* namespace upb */
 
 #endif
 
-#endif  // UPB_JSON_TYPED_PRINTER_H_
+#endif  /* UPB_JSON_TYPED_PRINTER_H_ */
