From d80e682a9c23c25ab36a151e3ad0d01c97361f95 Mon Sep 17 00:00:00 2001 From: Joshua Haberman <jhaberman@gmail.com> Date: Mon, 4 Oct 2021 00:23:39 -0700 Subject: [PATCH] Moved find field function closer to where it is used. --- upb/decode.c | 91 ++++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/upb/decode.c b/upb/decode.c index 4218d437be..a80d42c5c2 100644 --- a/upb/decode.c +++ b/upb/decode.c @@ -299,50 +299,6 @@ static void decode_munge(int type, wireval *val) { } } -static const upb_msglayout_field *upb_find_field(upb_decstate *d, - const upb_msglayout *l, - uint32_t field_number, - int *last_field_index) { - static upb_msglayout_field none = {0, 0, 0, 0, 0, 0}; - - if (l == NULL) return &none; - - size_t idx = ((size_t)field_number) - 1; // 0 wraps to SIZE_MAX - if (idx < l->dense_below) { - /* Fastest case: index into dense fields. */ - goto found; - } - - if (l->dense_below < l->field_count) { - /* Linear search non-dense fields. Resume scanning from last_field_index - * since fields are usually in order. */ - int last = *last_field_index; - for (idx = last; idx < l->field_count; idx++) { - if (l->fields[idx].number == field_number) { - goto found; - } - } - - for (idx = 0; idx < last; idx++) { - if (l->fields[idx].number == field_number) { - goto found; - } - } - } - - if (l->ext == _UPB_MSGEXT_EXTENDABLE && d->extreg) { - const upb_msglayout_ext *ext = _upb_extreg_get(d->extreg, l, field_number); - if (ext) return &ext->field; - } - - return &none; /* Unknown field. */ - - found: - UPB_ASSERT(l->fields[idx].number == field_number); - *last_field_index = idx; - return &l->fields[idx]; -} - static upb_msg *decode_newsubmsg(upb_decstate *d, const upb_msglayout_sub *subs, const upb_msglayout_field *field) { const upb_msglayout *subl = subs[field->submsg_index].submsg; @@ -609,6 +565,50 @@ static bool decode_tryfastdispatch(upb_decstate *d, const char **ptr, return false; } +static const upb_msglayout_field *decode_findfield(upb_decstate *d, + const upb_msglayout *l, + uint32_t field_number, + int *last_field_index) { + static upb_msglayout_field none = {0, 0, 0, 0, 0, 0}; + + if (l == NULL) return &none; + + size_t idx = ((size_t)field_number) - 1; // 0 wraps to SIZE_MAX + if (idx < l->dense_below) { + /* Fastest case: index into dense fields. */ + goto found; + } + + if (l->dense_below < l->field_count) { + /* Linear search non-dense fields. Resume scanning from last_field_index + * since fields are usually in order. */ + int last = *last_field_index; + for (idx = last; idx < l->field_count; idx++) { + if (l->fields[idx].number == field_number) { + goto found; + } + } + + for (idx = 0; idx < last; idx++) { + if (l->fields[idx].number == field_number) { + goto found; + } + } + } + + if (l->ext == _UPB_MSGEXT_EXTENDABLE && d->extreg) { + const upb_msglayout_ext *ext = _upb_extreg_get(d->extreg, l, field_number); + if (ext) return &ext->field; + } + + return &none; /* Unknown field. */ + + found: + UPB_ASSERT(l->fields[idx].number == field_number); + *last_field_index = idx; + return &l->fields[idx]; + } + UPB_FORCEINLINE static const char *decode_wireval(upb_decstate *d, const char *ptr, const upb_msglayout_field *field, @@ -669,7 +669,6 @@ static const char *decode_known(upb_decstate *d, const char *ptr, upb_msg *msg, subs = &ext->ext->sub; } - /* Parse, using op for dispatch. */ switch (mode & _UPB_MODE_MASK) { case _UPB_MODE_ARRAY: return decode_toarray(d, ptr, msg, subs, field, val, op); @@ -724,7 +723,7 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg, field_number = tag >> 3; wire_type = tag & 7; - field = upb_find_field(d, layout, field_number, &last_field_index); + field = decode_findfield(d, layout, field_number, &last_field_index); if (wire_type == UPB_WIRE_TYPE_END_GROUP) { d->end_group = field_number;