|
|
|
@ -174,10 +174,10 @@ static void upb_MiniTable_SetField(upb_MtDecoder* d, uint8_t ch, |
|
|
|
|
type -= kUpb_EncodedType_RepeatedBase; |
|
|
|
|
field->UPB_PRIVATE(mode) = kUpb_FieldMode_Array; |
|
|
|
|
field->UPB_PRIVATE(mode) |= pointer_rep << kUpb_FieldRep_Shift; |
|
|
|
|
field->offset = kNoPresence; |
|
|
|
|
field->UPB_PRIVATE(offset) = kNoPresence; |
|
|
|
|
} else { |
|
|
|
|
field->UPB_PRIVATE(mode) = kUpb_FieldMode_Scalar; |
|
|
|
|
field->offset = kHasbitPresence; |
|
|
|
|
field->UPB_PRIVATE(offset) = kHasbitPresence; |
|
|
|
|
if (type == kUpb_EncodedType_Group || type == kUpb_EncodedType_Message) { |
|
|
|
|
field->UPB_PRIVATE(mode) |= pointer_rep << kUpb_FieldRep_Shift; |
|
|
|
|
} else if ((unsigned long)type >= sizeof(kUpb_EncodedToFieldRep)) { |
|
|
|
@ -225,7 +225,7 @@ static void upb_MtDecoder_ModifyField(upb_MtDecoder* d, |
|
|
|
|
bool required = field_modifiers & kUpb_EncodedFieldModifier_IsRequired; |
|
|
|
|
|
|
|
|
|
// Validate.
|
|
|
|
|
if ((singular || required) && field->offset != kHasbitPresence) { |
|
|
|
|
if ((singular || required) && field->UPB_PRIVATE(offset) != kHasbitPresence) { |
|
|
|
|
upb_MdDecoder_ErrorJmp(&d->base, |
|
|
|
|
"Invalid modifier(s) for repeated field %" PRIu32, |
|
|
|
|
upb_MiniTableField_Number(field)); |
|
|
|
@ -236,9 +236,9 @@ static void upb_MtDecoder_ModifyField(upb_MtDecoder* d, |
|
|
|
|
upb_MiniTableField_Number(field)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (singular) field->offset = kNoPresence; |
|
|
|
|
if (singular) field->UPB_PRIVATE(offset) = kNoPresence; |
|
|
|
|
if (required) { |
|
|
|
|
field->offset = kRequiredPresence; |
|
|
|
|
field->UPB_PRIVATE(offset) = kRequiredPresence; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -325,7 +325,7 @@ static const char* upb_MtDecoder_DecodeOneofField(upb_MtDecoder* d, |
|
|
|
|
" to oneof, no such field number.", |
|
|
|
|
field_num); |
|
|
|
|
} |
|
|
|
|
if (f->offset != kHasbitPresence) { |
|
|
|
|
if (f->UPB_PRIVATE(offset) != kHasbitPresence) { |
|
|
|
|
upb_MdDecoder_ErrorJmp( |
|
|
|
|
&d->base, |
|
|
|
|
"Cannot add repeated, required, or singular field %" PRIu32 |
|
|
|
@ -340,7 +340,7 @@ static const char* upb_MtDecoder_DecodeOneofField(upb_MtDecoder* d, |
|
|
|
|
item->rep = rep; |
|
|
|
|
} |
|
|
|
|
// Prepend this field to the linked list.
|
|
|
|
|
f->offset = item->field_index; |
|
|
|
|
f->UPB_PRIVATE(offset) = item->field_index; |
|
|
|
|
item->field_index = (f - d->fields) + kOneofBase; |
|
|
|
|
return ptr; |
|
|
|
|
} |
|
|
|
@ -517,7 +517,7 @@ static bool upb_MtDecoder_SortLayoutItems(upb_MtDecoder* d) { |
|
|
|
|
int n = d->table->UPB_PRIVATE(field_count); |
|
|
|
|
for (int i = 0; i < n; i++) { |
|
|
|
|
upb_MiniTableField* f = &d->fields[i]; |
|
|
|
|
if (f->offset >= kOneofBase) continue; |
|
|
|
|
if (f->UPB_PRIVATE(offset) >= kOneofBase) continue; |
|
|
|
|
upb_LayoutItem item = {.field_index = i, |
|
|
|
|
.rep = f->UPB_PRIVATE(mode) >> kUpb_FieldRep_Shift, |
|
|
|
|
.type = kUpb_LayoutItemType_Field}; |
|
|
|
@ -545,9 +545,9 @@ static void upb_MtDecoder_AssignHasbits(upb_MtDecoder* d) { |
|
|
|
|
for (int i = 0; i < n; i++) { |
|
|
|
|
upb_MiniTableField* field = |
|
|
|
|
(upb_MiniTableField*)&ret->UPB_PRIVATE(fields)[i]; |
|
|
|
|
if (field->offset == kRequiredPresence) { |
|
|
|
|
if (field->UPB_PRIVATE(offset) == kRequiredPresence) { |
|
|
|
|
field->presence = ++last_hasbit; |
|
|
|
|
} else if (field->offset == kNoPresence) { |
|
|
|
|
} else if (field->UPB_PRIVATE(offset) == kNoPresence) { |
|
|
|
|
field->presence = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -561,7 +561,7 @@ static void upb_MtDecoder_AssignHasbits(upb_MtDecoder* d) { |
|
|
|
|
for (int i = 0; i < n; i++) { |
|
|
|
|
upb_MiniTableField* field = |
|
|
|
|
(upb_MiniTableField*)&ret->UPB_PRIVATE(fields)[i]; |
|
|
|
|
if (field->offset == kHasbitPresence) { |
|
|
|
|
if (field->UPB_PRIVATE(offset) == kHasbitPresence) { |
|
|
|
|
field->presence = ++last_hasbit; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -599,9 +599,10 @@ static void upb_MtDecoder_AssignOffsets(upb_MtDecoder* d) { |
|
|
|
|
upb_MiniTableField* f = &d->fields[item->field_index]; |
|
|
|
|
while (true) { |
|
|
|
|
f->presence = ~item->offset; |
|
|
|
|
if (f->offset == kUpb_LayoutItem_IndexSentinel) break; |
|
|
|
|
UPB_ASSERT(f->offset - kOneofBase < d->table->UPB_PRIVATE(field_count)); |
|
|
|
|
f = &d->fields[f->offset - kOneofBase]; |
|
|
|
|
if (f->UPB_PRIVATE(offset) == kUpb_LayoutItem_IndexSentinel) break; |
|
|
|
|
UPB_ASSERT(f->UPB_PRIVATE(offset) - kOneofBase < |
|
|
|
|
d->table->UPB_PRIVATE(field_count)); |
|
|
|
|
f = &d->fields[f->UPB_PRIVATE(offset) - kOneofBase]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -611,14 +612,14 @@ static void upb_MtDecoder_AssignOffsets(upb_MtDecoder* d) { |
|
|
|
|
switch (item->type) { |
|
|
|
|
case kUpb_LayoutItemType_OneofField: |
|
|
|
|
while (true) { |
|
|
|
|
uint16_t next_offset = f->offset; |
|
|
|
|
f->offset = item->offset; |
|
|
|
|
uint16_t next_offset = f->UPB_PRIVATE(offset); |
|
|
|
|
f->UPB_PRIVATE(offset) = item->offset; |
|
|
|
|
if (next_offset == kUpb_LayoutItem_IndexSentinel) break; |
|
|
|
|
f = &d->fields[next_offset - kOneofBase]; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case kUpb_LayoutItemType_Field: |
|
|
|
|
f->offset = item->offset; |
|
|
|
|
f->UPB_PRIVATE(offset) = item->offset; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
@ -689,8 +690,8 @@ static void upb_MtDecoder_ParseMap(upb_MtDecoder* d, const char* data, |
|
|
|
|
// NOTE: sync with mini_table/message_internal.h.
|
|
|
|
|
const size_t kv_size = d->platform == kUpb_MiniTablePlatform_32Bit ? 8 : 16; |
|
|
|
|
const size_t hasbit_size = 8; |
|
|
|
|
d->fields[0].offset = hasbit_size; |
|
|
|
|
d->fields[1].offset = hasbit_size + kv_size; |
|
|
|
|
d->fields[0].UPB_PRIVATE(offset) = hasbit_size; |
|
|
|
|
d->fields[1].UPB_PRIVATE(offset) = hasbit_size + kv_size; |
|
|
|
|
d->table->UPB_PRIVATE(size) = |
|
|
|
|
UPB_ALIGN_UP(hasbit_size + kv_size + kv_size, 8); |
|
|
|
|
|
|
|
|
@ -815,7 +816,7 @@ static const char* upb_MtDecoder_DoBuildMiniTableExtension( |
|
|
|
|
upb_MiniTableField* f = &ext->UPB_PRIVATE(field); |
|
|
|
|
|
|
|
|
|
f->UPB_PRIVATE(mode) |= kUpb_LabelFlags_IsExtension; |
|
|
|
|
f->offset = 0; |
|
|
|
|
f->UPB_PRIVATE(offset) = 0; |
|
|
|
|
f->presence = 0; |
|
|
|
|
|
|
|
|
|
if (extendee->UPB_PRIVATE(ext) & kUpb_ExtMode_IsMessageSet) { |
|
|
|
|