|
|
|
@ -7,8 +7,15 @@ |
|
|
|
|
|
|
|
|
|
#include "upb/mini_descriptor/build_enum.h" |
|
|
|
|
|
|
|
|
|
#include <stddef.h> |
|
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
|
|
#include "upb/base/status.h" |
|
|
|
|
#include "upb/mem/arena.h" |
|
|
|
|
#include "upb/mini_descriptor/internal/base92.h" |
|
|
|
|
#include "upb/mini_descriptor/internal/decoder.h" |
|
|
|
|
#include "upb/mini_descriptor/internal/wire_constants.h" |
|
|
|
|
#include "upb/mini_table/enum.h" |
|
|
|
|
#include "upb/mini_table/internal/enum.h" |
|
|
|
|
|
|
|
|
|
// Must be last.
|
|
|
|
@ -36,26 +43,27 @@ static upb_MiniTableEnum* _upb_MiniTable_AddEnumDataMember(upb_MdEnumDecoder* d, |
|
|
|
|
d->enum_table = upb_Arena_Realloc(d->arena, d->enum_table, old_sz, new_sz); |
|
|
|
|
upb_MdDecoder_CheckOutOfMemory(&d->base, d->enum_table); |
|
|
|
|
} |
|
|
|
|
d->enum_table->data[d->enum_data_count++] = val; |
|
|
|
|
d->enum_table->UPB_PRIVATE(data)[d->enum_data_count++] = val; |
|
|
|
|
return d->enum_table; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void upb_MiniTableEnum_BuildValue(upb_MdEnumDecoder* d, uint32_t val) { |
|
|
|
|
upb_MiniTableEnum* table = d->enum_table; |
|
|
|
|
d->enum_value_count++; |
|
|
|
|
if (table->value_count || (val > 512 && d->enum_value_count < val / 32)) { |
|
|
|
|
if (table->value_count == 0) { |
|
|
|
|
assert(d->enum_data_count == table->mask_limit / 32); |
|
|
|
|
if (table->UPB_PRIVATE(value_count) || |
|
|
|
|
(val > 512 && d->enum_value_count < val / 32)) { |
|
|
|
|
if (table->UPB_PRIVATE(value_count) == 0) { |
|
|
|
|
UPB_ASSERT(d->enum_data_count == table->UPB_PRIVATE(mask_limit) / 32); |
|
|
|
|
} |
|
|
|
|
table = _upb_MiniTable_AddEnumDataMember(d, val); |
|
|
|
|
table->value_count++; |
|
|
|
|
table->UPB_PRIVATE(value_count)++; |
|
|
|
|
} else { |
|
|
|
|
uint32_t new_mask_limit = ((val / 32) + 1) * 32; |
|
|
|
|
while (table->mask_limit < new_mask_limit) { |
|
|
|
|
while (table->UPB_PRIVATE(mask_limit) < new_mask_limit) { |
|
|
|
|
table = _upb_MiniTable_AddEnumDataMember(d, 0); |
|
|
|
|
table->mask_limit += 32; |
|
|
|
|
table->UPB_PRIVATE(mask_limit) += 32; |
|
|
|
|
} |
|
|
|
|
table->data[val / 32] |= 1ULL << (val % 32); |
|
|
|
|
table->UPB_PRIVATE(data)[val / 32] |= 1ULL << (val % 32); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -73,11 +81,11 @@ static upb_MiniTableEnum* upb_MtDecoder_DoBuildMiniTableEnum( |
|
|
|
|
upb_MdDecoder_CheckOutOfMemory(&d->base, d->enum_table); |
|
|
|
|
|
|
|
|
|
// Guarantee at least 64 bits of mask without checking mask size.
|
|
|
|
|
d->enum_table->mask_limit = 64; |
|
|
|
|
d->enum_table->UPB_PRIVATE(mask_limit) = 64; |
|
|
|
|
d->enum_table = _upb_MiniTable_AddEnumDataMember(d, 0); |
|
|
|
|
d->enum_table = _upb_MiniTable_AddEnumDataMember(d, 0); |
|
|
|
|
|
|
|
|
|
d->enum_table->value_count = 0; |
|
|
|
|
d->enum_table->UPB_PRIVATE(value_count) = 0; |
|
|
|
|
|
|
|
|
|
const char* ptr = data; |
|
|
|
|
uint32_t base = 0; |
|
|
|
@ -105,7 +113,8 @@ static upb_MiniTableEnum* upb_MtDecoder_DoBuildMiniTableEnum( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static upb_MiniTableEnum* upb_MtDecoder_BuildMiniTableEnum( |
|
|
|
|
upb_MdEnumDecoder* const decoder, const char* const data, size_t const len) { |
|
|
|
|
upb_MdEnumDecoder* const decoder, const char* const data, |
|
|
|
|
size_t const len) { |
|
|
|
|
if (UPB_SETJMP(decoder->base.err) != 0) return NULL; |
|
|
|
|
return upb_MtDecoder_DoBuildMiniTableEnum(decoder, data, len); |
|
|
|
|
} |
|
|
|
|