// 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. upb_value val; if (upb_inttable_lookup32(dispatch, fieldnum, &val)) { uint64_t v = upb_value_getuint64(val); if (wire_type == (v & 0xff)) { d->pc = d->top->base + (v >> 16); return DECODE_OK; } else if (wire_type == ((v >> 8) & 0xff)) {
static void goto_endmsg(upb_pbdecoder *d) { upb_value v; bool found = upb_inttable_lookup32(d->top->dispatch, DISPATCH_ENDMSG, &v); UPB_ASSERT_VAR(found, found); d->pc = d->top->base + upb_value_getuint64(v); }
const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i) { upb_value val; return upb_inttable_lookup32(&m->itof, i, &val) ? upb_value_getptr(val) : NULL; }
const char *upb_enumdef_iton(const upb_enumdef *def, int32_t num) { upb_value v; return upb_inttable_lookup32(&def->iton, num, &v) ? upb_value_getcstr(v) : NULL; }
const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i) { const upb_value *val = upb_inttable_lookup32(&m->itof, i); return val ? (const upb_fielddef*)upb_value_getptr(*val) : NULL; }
const char *upb_enumdef_iton(const upb_enumdef *def, int32_t num) { const upb_value *v = upb_inttable_lookup32(&def->iton, num); return v ? upb_value_getcstr(*v) : NULL; }