Skip to content

Commit db71344

Browse files
Move iteration APIs to headers, so they're inlined in loop calls
PiperOrigin-RevId: 698497070
1 parent 20b6e24 commit db71344

File tree

13 files changed

+165
-135
lines changed

13 files changed

+165
-135
lines changed

upb/message/compare.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ static bool _upb_Message_ExtensionsAreEqual(const upb_Message* msg1,
142142
upb_MessageValue val1;
143143

144144
// Iterate over all extensions for msg1, and search msg2 for each extension.
145-
size_t iter1 = kUpb_Extension_Begin;
146-
while (UPB_PRIVATE(_upb_Message_NextExtension)(msg1, m, &e, &val1, &iter1)) {
145+
size_t iter1 = kUpb_Message_ExtensionBegin;
146+
while (upb_Message_NextExtension(msg1, &e, &val1, &iter1)) {
147147
const upb_Extension* ext2 = UPB_PRIVATE(_upb_Message_Getext)(msg2, e);
148148
if (!ext2) return false;
149149

upb/message/compat.c

+11-20
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,27 @@
1010
#include <stddef.h>
1111
#include <stdint.h>
1212

13-
#include "upb/message/internal/extension.h"
1413
#include "upb/message/message.h"
14+
#include "upb/message/value.h"
1515
#include "upb/mini_table/extension.h"
1616

1717
// Must be last.
1818
#include "upb/port/def.inc"
1919

20-
bool upb_Message_NextExtension(const upb_Message* msg,
21-
const upb_MiniTableExtension** result,
22-
uintptr_t* iter) {
23-
size_t count;
24-
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
25-
size_t i = *iter;
26-
if (i >= count) {
27-
return false;
28-
*result = NULL;
29-
}
30-
*result = ext[i].ext;
31-
*iter = i + 1;
32-
return true;
20+
bool upb_Message_NextExtensionReverse(const upb_Message* msg,
21+
const upb_MiniTableExtension** result,
22+
uintptr_t* iter) {
23+
upb_MessageValue val;
24+
return UPB_PRIVATE(_upb_Message_NextExtensionReverse)(msg, result, &val,
25+
iter);
3326
}
3427

3528
const upb_MiniTableExtension* upb_Message_FindExtensionByNumber(
3629
const upb_Message* msg, uint32_t field_number) {
37-
size_t count;
38-
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
39-
40-
for (; count--; ext++) {
41-
const upb_MiniTableExtension* e = ext->ext;
42-
if (upb_MiniTableExtension_Number(e) == field_number) return e;
30+
uintptr_t iter = kUpb_Message_ExtensionBegin;
31+
const upb_MiniTableExtension* result;
32+
while (upb_Message_NextExtensionReverse(msg, &result, &iter)) {
33+
if (upb_MiniTableExtension_Number(result) == field_number) return result;
4334
}
4435
return NULL;
4536
}

upb/message/compat.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@
2525
extern "C" {
2626
#endif
2727

28-
#define kUpb_Message_ExtensionBegin 0;
29-
30-
bool upb_Message_NextExtension(const upb_Message* msg,
31-
const upb_MiniTableExtension** result,
32-
uintptr_t* iter);
28+
// Same as upb_Message_NextExtension but iterates in reverse wire order
29+
bool upb_Message_NextExtensionReverse(const upb_Message* msg,
30+
const upb_MiniTableExtension** result,
31+
uintptr_t* iter);
3332
// Returns the minitable with the given field number, or NULL on failure.
3433
const upb_MiniTableExtension* upb_Message_FindExtensionByNumber(
3534
const upb_Message* msg, uint32_t field_number);

upb/message/internal/extension.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
4040
upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
4141
if (in) {
4242
*count = (in->size - in->ext_begin) / sizeof(upb_Extension);
43-
return UPB_PTR_AT(in, in->ext_begin, void);
43+
return UPB_PTR_AT(in, in->ext_begin, const upb_Extension);
4444
} else {
4545
*count = 0;
4646
return NULL;

upb/message/internal/iterator.c

-20
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212
#include "upb/message/accessors.h"
1313
#include "upb/message/array.h"
1414
#include "upb/message/internal/accessors.h"
15-
#include "upb/message/internal/extension.h"
1615
#include "upb/message/map.h"
1716
#include "upb/message/message.h"
18-
#include "upb/mini_table/extension.h"
1917
#include "upb/mini_table/field.h"
2018
#include "upb/mini_table/message.h"
2119

@@ -58,21 +56,3 @@ bool UPB_PRIVATE(_upb_Message_NextBaseField)(const upb_Message* msg,
5856

5957
return false;
6058
}
61-
62-
bool UPB_PRIVATE(_upb_Message_NextExtension)(
63-
const upb_Message* msg, const upb_MiniTable* m,
64-
const upb_MiniTableExtension** out_e, upb_MessageValue* out_v,
65-
size_t* iter) {
66-
size_t count;
67-
const upb_Extension* exts = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
68-
size_t i = *iter;
69-
70-
if (++i < count) {
71-
*out_e = exts[i].ext;
72-
*out_v = exts[i].data;
73-
*iter = i;
74-
return true;
75-
}
76-
77-
return false;
78-
}

upb/message/internal/iterator.h

+2-8
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,21 @@
99
#define THIRD_PARTY_UPB_UPB_MESSAGE_INTERNAL_ITERATOR_H_
1010

1111
#include <stddef.h>
12+
#include <stdint.h>
1213

1314
#include "upb/message/message.h"
1415
#include "upb/message/value.h"
15-
#include "upb/mini_table/extension.h"
1616
#include "upb/mini_table/field.h"
1717
#include "upb/mini_table/message.h"
1818

1919
// Must be last.
2020
#include "upb/port/def.inc"
2121

2222
#define kUpb_BaseField_Begin ((size_t)-1)
23-
#define kUpb_Extension_Begin ((size_t)-1)
24-
2523
bool UPB_PRIVATE(_upb_Message_NextBaseField)(const upb_Message* msg,
2624
const upb_MiniTable* m,
2725
const upb_MiniTableField** out_f,
2826
upb_MessageValue* out_v,
29-
size_t* iter);
27+
uintptr_t* iter);
3028

31-
bool UPB_PRIVATE(_upb_Message_NextExtension)(
32-
const upb_Message* msg, const upb_MiniTable* m,
33-
const upb_MiniTableExtension** out_e, upb_MessageValue* out_v,
34-
size_t* iter);
3529
#endif // THIRD_PARTY_UPB_UPB_MESSAGE_INTERNAL_ITERATOR_H_

upb/message/internal/map_sorter.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "upb/message/internal/extension.h"
1919
#include "upb/message/internal/map.h"
2020
#include "upb/message/internal/map_entry.h"
21+
#include "upb/message/internal/message.h"
2122

2223
// Must be last.
2324
#include "upb/port/def.inc"
@@ -80,7 +81,7 @@ UPB_INLINE void _upb_mapsorter_popmap(_upb_mapsorter* s,
8081
bool _upb_mapsorter_pushmap(_upb_mapsorter* s, upb_FieldType key_type,
8182
const struct upb_Map* map, _upb_sortedmap* sorted);
8283

83-
bool _upb_mapsorter_pushexts(_upb_mapsorter* s, const upb_Extension* exts,
84+
bool _upb_mapsorter_pushexts(_upb_mapsorter* s, const upb_Message_Internal* in,
8485
size_t count, _upb_sortedmap* sorted);
8586

8687
#ifdef __cplusplus

upb/message/internal/message.h

+66
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@
1515
#ifndef UPB_MESSAGE_INTERNAL_MESSAGE_H_
1616
#define UPB_MESSAGE_INTERNAL_MESSAGE_H_
1717

18+
#include <stdint.h>
1819
#include <stdlib.h>
1920
#include <string.h>
2021

22+
#include "upb/base/string_view.h"
2123
#include "upb/mem/arena.h"
2224
#include "upb/message/internal/extension.h"
25+
#include "upb/message/internal/types.h"
26+
#include "upb/mini_table/extension.h"
2327
#include "upb/mini_table/message.h"
2428

2529
// Must be last.
@@ -101,6 +105,68 @@ bool UPB_PRIVATE(_upb_Message_AddUnknownV)(struct upb_Message* msg,
101105
bool UPB_PRIVATE(_upb_Message_Realloc)(struct upb_Message* msg, size_t need,
102106
upb_Arena* arena);
103107

108+
#define kUpb_Message_UnknownBegin 0
109+
#define kUpb_Message_ExtensionBegin 0
110+
111+
UPB_INLINE bool upb_Message_NextUnknown(const struct upb_Message* msg,
112+
upb_StringView* data, uintptr_t* iter) {
113+
const upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
114+
if (in && *iter == kUpb_Message_UnknownBegin) {
115+
size_t len = in->unknown_end - sizeof(upb_Message_Internal);
116+
if (len != 0) {
117+
data->size = len;
118+
data->data = (const char*)(in + 1);
119+
(*iter)++;
120+
return true;
121+
}
122+
}
123+
data->size = 0;
124+
data->data = NULL;
125+
return false;
126+
}
127+
128+
UPB_INLINE bool upb_Message_HasUnknown(const struct upb_Message* msg) {
129+
upb_StringView data;
130+
uintptr_t iter = kUpb_Message_UnknownBegin;
131+
return upb_Message_NextUnknown(msg, &data, &iter);
132+
}
133+
134+
UPB_INLINE bool upb_Message_NextExtension(const struct upb_Message* msg,
135+
const upb_MiniTableExtension** out_e,
136+
upb_MessageValue* out_v,
137+
uintptr_t* iter) {
138+
size_t count;
139+
const upb_Extension* exts = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
140+
size_t i = *iter;
141+
if (i < count) {
142+
// Extensions are stored in reverse wire order, so to iterate in wire order,
143+
// we need to iterate backwards.
144+
*out_e = exts[count - 1 - i].ext;
145+
*out_v = exts[count - 1 - i].data;
146+
*iter = i + 1;
147+
return true;
148+
}
149+
150+
return false;
151+
}
152+
153+
UPB_INLINE bool UPB_PRIVATE(_upb_Message_NextExtensionReverse)(
154+
const struct upb_Message* msg, const upb_MiniTableExtension** out_e,
155+
upb_MessageValue* out_v, uintptr_t* iter) {
156+
size_t count;
157+
const upb_Extension* exts = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
158+
size_t i = *iter;
159+
if (i < count) {
160+
// Extensions are stored in reverse wire order
161+
*out_e = exts[i].ext;
162+
*out_v = exts[i].data;
163+
*iter = i + 1;
164+
return true;
165+
}
166+
167+
return false;
168+
}
169+
104170
#ifdef __cplusplus
105171
} /* extern "C" */
106172
#endif

upb/message/map_sorter.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
#include "upb/base/internal/log2.h"
1515
#include "upb/base/string_view.h"
1616
#include "upb/mem/alloc.h"
17+
#include "upb/message/internal/extension.h"
18+
#include "upb/message/internal/message.h"
1719
#include "upb/message/map.h"
18-
#include "upb/message/message.h"
1920
#include "upb/mini_table/extension.h"
2021

2122
// Must be last.
@@ -144,14 +145,15 @@ static int _upb_mapsorter_cmpext(const void* _a, const void* _b) {
144145
return a_num < b_num ? -1 : 1;
145146
}
146147

147-
bool _upb_mapsorter_pushexts(_upb_mapsorter* s, const upb_Extension* exts,
148+
bool _upb_mapsorter_pushexts(_upb_mapsorter* s, const upb_Message_Internal* in,
148149
size_t count, _upb_sortedmap* sorted) {
149150
if (!_upb_mapsorter_resize(s, sorted, count)) return false;
151+
const upb_Extension* exts =
152+
UPB_PTR_AT(in, in->ext_begin, const upb_Extension);
150153

151154
for (size_t i = 0; i < count; i++) {
152155
s->entries[sorted->start + i] = &exts[i];
153156
}
154-
155157
qsort(&s->entries[sorted->start], count, sizeof(*s->entries),
156158
_upb_mapsorter_cmpext);
157159
return true;

upb/message/message.c

+6-37
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
// Must be last.
3131
#include "upb/port/def.inc"
3232

33-
static const size_t message_overhead = sizeof(upb_Message_Internal);
34-
3533
upb_Message* upb_Message_New(const upb_MiniTable* m, upb_Arena* a) {
3634
return _upb_Message_New(m, a);
3735
}
@@ -75,39 +73,14 @@ void _upb_Message_DiscardUnknown_shallow(upb_Message* msg) {
7573
UPB_ASSERT(!upb_Message_IsFrozen(msg));
7674
upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
7775
if (in) {
78-
in->unknown_end = message_overhead;
79-
}
80-
}
81-
82-
bool upb_Message_NextUnknown(const upb_Message* msg, upb_StringView* data,
83-
uintptr_t* iter) {
84-
const upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
85-
if (in && *iter == kUpb_Message_UnknownBegin) {
86-
size_t len = in->unknown_end - message_overhead;
87-
if (len != 0) {
88-
data->size = len;
89-
data->data = (const char*)(in + 1);
90-
(*iter)++;
91-
return true;
92-
}
76+
in->unknown_end = sizeof(upb_Message_Internal);
9377
}
94-
data->size = 0;
95-
data->data = NULL;
96-
return false;
97-
}
98-
99-
bool upb_Message_HasUnknown(const upb_Message* msg) {
100-
const upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
101-
if (in) {
102-
return in->unknown_end > message_overhead;
103-
}
104-
return false;
10578
}
10679

10780
const char* upb_Message_GetUnknown(const upb_Message* msg, size_t* len) {
10881
upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
10982
if (in) {
110-
*len = in->unknown_end - message_overhead;
83+
*len = in->unknown_end - sizeof(upb_Message_Internal);
11184
return (char*)(in + 1);
11285
} else {
11386
*len = 0;
@@ -185,17 +158,13 @@ void upb_Message_Freeze(upb_Message* msg, const upb_MiniTable* m) {
185158
}
186159

187160
// Extensions.
188-
size_t ext_count;
189-
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &ext_count);
190-
191-
for (size_t i = 0; i < ext_count; i++) {
192-
const upb_MiniTableExtension* e = ext[i].ext;
161+
uintptr_t iter = kUpb_Message_ExtensionBegin;
162+
const upb_MiniTableExtension* e;
163+
upb_MessageValue val;
164+
while (upb_Message_NextExtension(msg, &e, &val, &iter)) {
193165
const upb_MiniTableField* f = &e->UPB_PRIVATE(field);
194166
const upb_MiniTable* m2 = upb_MiniTableExtension_GetSubMessage(e);
195167

196-
upb_MessageValue val;
197-
memcpy(&val, &ext[i].data, sizeof(upb_MessageValue));
198-
199168
switch (UPB_PRIVATE(_upb_MiniTableField_Mode)(f)) {
200169
case kUpb_FieldMode_Array: {
201170
upb_Array* arr = (upb_Array*)val.array_val;

0 commit comments

Comments
 (0)