|
|
|
@ -182,7 +182,7 @@ static void encode_tag(upb_encstate* e, uint32_t field_number, |
|
|
|
|
|
|
|
|
|
static void encode_fixedarray(upb_encstate* e, const upb_Array* arr, |
|
|
|
|
size_t elem_size, uint32_t tag) { |
|
|
|
|
size_t bytes = arr->UPB_PRIVATE(size) * elem_size; |
|
|
|
|
size_t bytes = upb_Array_Size(arr) * elem_size; |
|
|
|
|
const char* data = upb_Array_DataPtr(arr); |
|
|
|
|
const char* ptr = data + bytes - elem_size; |
|
|
|
|
|
|
|
|
@ -279,7 +279,7 @@ static void encode_scalar(upb_encstate* e, const void* _field_mem, |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (--e->depth == 0) encode_err(e, kUpb_EncodeStatus_MaxDepthExceeded); |
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_EndGroup); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_EndGroup); |
|
|
|
|
encode_TaggedMessagePtr(e, submsg, subm, &size); |
|
|
|
|
wire_type = kUpb_WireType_StartGroup; |
|
|
|
|
e->depth++; |
|
|
|
@ -305,7 +305,7 @@ static void encode_scalar(upb_encstate* e, const void* _field_mem, |
|
|
|
|
} |
|
|
|
|
#undef CASE |
|
|
|
|
|
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), wire_type); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), wire_type); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void encode_array(upb_encstate* e, const upb_Message* msg, |
|
|
|
@ -315,14 +315,14 @@ static void encode_array(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
bool packed = upb_MiniTableField_IsPacked(f); |
|
|
|
|
size_t pre_len = e->limit - e->ptr; |
|
|
|
|
|
|
|
|
|
if (arr == NULL || arr->UPB_PRIVATE(size) == 0) { |
|
|
|
|
if (arr == NULL || upb_Array_Size(arr) == 0) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define VARINT_CASE(ctype, encode) \ |
|
|
|
|
{ \
|
|
|
|
|
const ctype* start = upb_Array_DataPtr(arr); \
|
|
|
|
|
const ctype* ptr = start + arr->UPB_PRIVATE(size); \
|
|
|
|
|
const ctype* ptr = start + upb_Array_Size(arr); \
|
|
|
|
|
uint32_t tag = \
|
|
|
|
|
packed ? 0 : (f->UPB_PRIVATE(number) << 3) | kUpb_WireType_Varint; \
|
|
|
|
|
do { \
|
|
|
|
@ -367,34 +367,34 @@ static void encode_array(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
case kUpb_FieldType_String: |
|
|
|
|
case kUpb_FieldType_Bytes: { |
|
|
|
|
const upb_StringView* start = upb_Array_DataPtr(arr); |
|
|
|
|
const upb_StringView* ptr = start + arr->UPB_PRIVATE(size); |
|
|
|
|
const upb_StringView* ptr = start + upb_Array_Size(arr); |
|
|
|
|
do { |
|
|
|
|
ptr--; |
|
|
|
|
encode_bytes(e, ptr->data, ptr->size); |
|
|
|
|
encode_varint(e, ptr->size); |
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_Delimited); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_Delimited); |
|
|
|
|
} while (ptr != start); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
case kUpb_FieldType_Group: { |
|
|
|
|
const upb_TaggedMessagePtr* start = upb_Array_DataPtr(arr); |
|
|
|
|
const upb_TaggedMessagePtr* ptr = start + arr->UPB_PRIVATE(size); |
|
|
|
|
const upb_TaggedMessagePtr* ptr = start + upb_Array_Size(arr); |
|
|
|
|
const upb_MiniTable* subm = |
|
|
|
|
upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]); |
|
|
|
|
if (--e->depth == 0) encode_err(e, kUpb_EncodeStatus_MaxDepthExceeded); |
|
|
|
|
do { |
|
|
|
|
size_t size; |
|
|
|
|
ptr--; |
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_EndGroup); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_EndGroup); |
|
|
|
|
encode_TaggedMessagePtr(e, *ptr, subm, &size); |
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_StartGroup); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_StartGroup); |
|
|
|
|
} while (ptr != start); |
|
|
|
|
e->depth++; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
case kUpb_FieldType_Message: { |
|
|
|
|
const upb_TaggedMessagePtr* start = upb_Array_DataPtr(arr); |
|
|
|
|
const upb_TaggedMessagePtr* ptr = start + arr->UPB_PRIVATE(size); |
|
|
|
|
const upb_TaggedMessagePtr* ptr = start + upb_Array_Size(arr); |
|
|
|
|
const upb_MiniTable* subm = |
|
|
|
|
upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]); |
|
|
|
|
if (--e->depth == 0) encode_err(e, kUpb_EncodeStatus_MaxDepthExceeded); |
|
|
|
@ -403,7 +403,7 @@ static void encode_array(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
ptr--; |
|
|
|
|
encode_TaggedMessagePtr(e, *ptr, subm, &size); |
|
|
|
|
encode_varint(e, size); |
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_Delimited); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_Delimited); |
|
|
|
|
} while (ptr != start); |
|
|
|
|
e->depth++; |
|
|
|
|
return; |
|
|
|
@ -413,15 +413,15 @@ static void encode_array(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
|
|
|
|
|
if (packed) { |
|
|
|
|
encode_varint(e, e->limit - e->ptr - pre_len); |
|
|
|
|
encode_tag(e, f->UPB_PRIVATE(number), kUpb_WireType_Delimited); |
|
|
|
|
encode_tag(e, upb_MiniTableField_Number(f), kUpb_WireType_Delimited); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void encode_mapentry(upb_encstate* e, uint32_t number, |
|
|
|
|
const upb_MiniTable* layout, |
|
|
|
|
const upb_MapEntry* ent) { |
|
|
|
|
const upb_MiniTableField* key_field = &layout->UPB_PRIVATE(fields)[0]; |
|
|
|
|
const upb_MiniTableField* val_field = &layout->UPB_PRIVATE(fields)[1]; |
|
|
|
|
const upb_MiniTableField* key_field = upb_MiniTable_MapKey(layout); |
|
|
|
|
const upb_MiniTableField* val_field = upb_MiniTable_MapValue(layout); |
|
|
|
|
size_t pre_len = e->limit - e->ptr; |
|
|
|
|
size_t size; |
|
|
|
|
encode_scalar(e, &ent->v, layout->UPB_PRIVATE(subs), val_field); |
|
|
|
@ -437,7 +437,7 @@ static void encode_map(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
const upb_Map* map = *UPB_PTR_AT(msg, f->UPB_PRIVATE(offset), const upb_Map*); |
|
|
|
|
const upb_MiniTable* layout = |
|
|
|
|
upb_MiniTableSub_Message(subs[f->UPB_PRIVATE(submsg_index)]); |
|
|
|
|
UPB_ASSERT(layout->UPB_PRIVATE(field_count) == 2); |
|
|
|
|
UPB_ASSERT(upb_MiniTable_FieldCount(layout) == 2); |
|
|
|
|
|
|
|
|
|
if (!map || !upb_Map_Size(map)) return; |
|
|
|
|
|
|
|
|
@ -448,7 +448,7 @@ static void encode_map(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
map, &sorted); |
|
|
|
|
upb_MapEntry ent; |
|
|
|
|
while (_upb_sortedmap_next(&e->sorter, map, &sorted, &ent)) { |
|
|
|
|
encode_mapentry(e, f->UPB_PRIVATE(number), layout, &ent); |
|
|
|
|
encode_mapentry(e, upb_MiniTableField_Number(f), layout, &ent); |
|
|
|
|
} |
|
|
|
|
_upb_mapsorter_popmap(&e->sorter, &sorted); |
|
|
|
|
} else { |
|
|
|
@ -459,7 +459,7 @@ static void encode_map(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
upb_MapEntry ent; |
|
|
|
|
_upb_map_fromkey(key, &ent.k, map->key_size); |
|
|
|
|
_upb_map_fromvalue(val, &ent.v, map->val_size); |
|
|
|
|
encode_mapentry(e, f->UPB_PRIVATE(number), layout, &ent); |
|
|
|
|
encode_mapentry(e, upb_MiniTableField_Number(f), layout, &ent); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -499,7 +499,7 @@ static bool encode_shouldencode(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
} else { |
|
|
|
|
// Field is in a oneof.
|
|
|
|
|
return UPB_PRIVATE(_upb_Message_GetOneofCase)(msg, f) == |
|
|
|
|
f->UPB_PRIVATE(number); |
|
|
|
|
upb_MiniTableField_Number(f); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -589,7 +589,7 @@ static void encode_message(upb_encstate* e, const upb_Message* msg, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (m->UPB_PRIVATE(field_count)) { |
|
|
|
|
if (upb_MiniTable_FieldCount(m)) { |
|
|
|
|
const upb_MiniTableField* f = |
|
|
|
|
&m->UPB_PRIVATE(fields)[m->UPB_PRIVATE(field_count)]; |
|
|
|
|
const upb_MiniTableField* first = &m->UPB_PRIVATE(fields)[0]; |
|
|
|
|