google-protobuf 3.4.1.1-x86-linux → 3.5.0-x86-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of google-protobuf might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/defs.c +14 -3
- data/ext/google/protobuf_c/encode_decode.c +72 -59
- data/ext/google/protobuf_c/message.c +42 -7
- data/ext/google/protobuf_c/protobuf.c +1 -1
- data/ext/google/protobuf_c/protobuf.h +14 -5
- data/ext/google/protobuf_c/storage.c +12 -1
- data/ext/google/protobuf_c/upb.c +1413 -411
- data/ext/google/protobuf_c/upb.h +508 -411
- data/lib/google/2.0/protobuf_c.so +0 -0
- data/lib/google/2.1/protobuf_c.so +0 -0
- data/lib/google/2.2/protobuf_c.so +0 -0
- data/lib/google/2.3/protobuf_c.so +0 -0
- data/lib/google/2.4/protobuf_c.so +0 -0
- data/tests/basic.rb +50 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53726691c603d78a3d533137d758e91b6f8b1623
|
4
|
+
data.tar.gz: de2912402a84550f8310f2e02fbf6d31389006a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c9d0821d9035209c0168a46b87a167c6f33c95484c179c87aea3c0546c248988c08f1c24df22547295bc64811b42f408f805c6c34c947093c13bbfbedc6a640
|
7
|
+
data.tar.gz: 4aa1b37a32df41b8e18d32b9da808ec222648823dd4d3222f401789f22590ffcbc293df89232e15cbb7e159529522fe2d830ddc3e21b0a9debf48c2b2456cb7a
|
@@ -228,7 +228,6 @@ DEFINE_CLASS(Descriptor, "Google::Protobuf::Descriptor");
|
|
228
228
|
void Descriptor_mark(void* _self) {
|
229
229
|
Descriptor* self = _self;
|
230
230
|
rb_gc_mark(self->klass);
|
231
|
-
rb_gc_mark(self->typeclass_references);
|
232
231
|
}
|
233
232
|
|
234
233
|
void Descriptor_free(void* _self) {
|
@@ -283,7 +282,6 @@ VALUE Descriptor_alloc(VALUE klass) {
|
|
283
282
|
self->pb_serialize_handlers = NULL;
|
284
283
|
self->json_serialize_handlers = NULL;
|
285
284
|
self->json_serialize_handlers_preserve = NULL;
|
286
|
-
self->typeclass_references = rb_ary_new();
|
287
285
|
return ret;
|
288
286
|
}
|
289
287
|
|
@@ -1635,7 +1633,7 @@ VALUE Builder_alloc(VALUE klass) {
|
|
1635
1633
|
Builder* self = ALLOC(Builder);
|
1636
1634
|
VALUE ret = TypedData_Wrap_Struct(
|
1637
1635
|
klass, &_Builder_type, self);
|
1638
|
-
self->pending_list =
|
1636
|
+
self->pending_list = Qnil;
|
1639
1637
|
self->defs = NULL;
|
1640
1638
|
return ret;
|
1641
1639
|
}
|
@@ -1645,11 +1643,24 @@ void Builder_register(VALUE module) {
|
|
1645
1643
|
rb_define_alloc_func(klass, Builder_alloc);
|
1646
1644
|
rb_define_method(klass, "add_message", Builder_add_message, 1);
|
1647
1645
|
rb_define_method(klass, "add_enum", Builder_add_enum, 1);
|
1646
|
+
rb_define_method(klass, "initialize", Builder_initialize, 0);
|
1648
1647
|
rb_define_method(klass, "finalize_to_pool", Builder_finalize_to_pool, 1);
|
1649
1648
|
cBuilder = klass;
|
1650
1649
|
rb_gc_register_address(&cBuilder);
|
1651
1650
|
}
|
1652
1651
|
|
1652
|
+
/*
|
1653
|
+
* call-seq:
|
1654
|
+
* Builder.new(d) => builder
|
1655
|
+
*
|
1656
|
+
* Create a new message builder.
|
1657
|
+
*/
|
1658
|
+
VALUE Builder_initialize(VALUE _self) {
|
1659
|
+
DEFINE_SELF(Builder, self, _self);
|
1660
|
+
self->pending_list = rb_ary_new();
|
1661
|
+
return Qnil;
|
1662
|
+
}
|
1663
|
+
|
1653
1664
|
/*
|
1654
1665
|
* call-seq:
|
1655
1666
|
* Builder.add_message(name, &block)
|
@@ -44,6 +44,56 @@ VALUE noleak_rb_str_cat(VALUE rb_str, const char *str, long len) {
|
|
44
44
|
return rb_str;
|
45
45
|
}
|
46
46
|
|
47
|
+
// The code below also comes from upb's prototype Ruby binding, developed by
|
48
|
+
// haberman@.
|
49
|
+
|
50
|
+
/* stringsink *****************************************************************/
|
51
|
+
|
52
|
+
static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
|
53
|
+
stringsink *sink = _sink;
|
54
|
+
sink->len = 0;
|
55
|
+
return sink;
|
56
|
+
}
|
57
|
+
|
58
|
+
static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
|
59
|
+
size_t len, const upb_bufhandle *handle) {
|
60
|
+
stringsink *sink = _sink;
|
61
|
+
size_t new_size = sink->size;
|
62
|
+
|
63
|
+
UPB_UNUSED(hd);
|
64
|
+
UPB_UNUSED(handle);
|
65
|
+
|
66
|
+
while (sink->len + len > new_size) {
|
67
|
+
new_size *= 2;
|
68
|
+
}
|
69
|
+
|
70
|
+
if (new_size != sink->size) {
|
71
|
+
sink->ptr = realloc(sink->ptr, new_size);
|
72
|
+
sink->size = new_size;
|
73
|
+
}
|
74
|
+
|
75
|
+
memcpy(sink->ptr + sink->len, ptr, len);
|
76
|
+
sink->len += len;
|
77
|
+
|
78
|
+
return len;
|
79
|
+
}
|
80
|
+
|
81
|
+
void stringsink_init(stringsink *sink) {
|
82
|
+
upb_byteshandler_init(&sink->handler);
|
83
|
+
upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
|
84
|
+
upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
|
85
|
+
|
86
|
+
upb_bytessink_reset(&sink->sink, &sink->handler, sink);
|
87
|
+
|
88
|
+
sink->size = 32;
|
89
|
+
sink->ptr = malloc(sink->size);
|
90
|
+
sink->len = 0;
|
91
|
+
}
|
92
|
+
|
93
|
+
void stringsink_uninit(stringsink *sink) {
|
94
|
+
free(sink->ptr);
|
95
|
+
}
|
96
|
+
|
47
97
|
// -----------------------------------------------------------------------------
|
48
98
|
// Parsing.
|
49
99
|
// -----------------------------------------------------------------------------
|
@@ -613,6 +663,20 @@ static void add_handlers_for_oneof_field(upb_handlers *h,
|
|
613
663
|
upb_handlerattr_uninit(&attr);
|
614
664
|
}
|
615
665
|
|
666
|
+
static bool unknown_field_handler(void* closure, const void* hd,
|
667
|
+
const char* buf, size_t size) {
|
668
|
+
UPB_UNUSED(hd);
|
669
|
+
|
670
|
+
MessageHeader* msg = (MessageHeader*)closure;
|
671
|
+
if (msg->unknown_fields == NULL) {
|
672
|
+
msg->unknown_fields = malloc(sizeof(stringsink));
|
673
|
+
stringsink_init(msg->unknown_fields);
|
674
|
+
}
|
675
|
+
|
676
|
+
stringsink_string(msg->unknown_fields, NULL, buf, size, NULL);
|
677
|
+
|
678
|
+
return true;
|
679
|
+
}
|
616
680
|
|
617
681
|
static void add_handlers_for_message(const void *closure, upb_handlers *h) {
|
618
682
|
const upb_msgdef* msgdef = upb_handlers_msgdef(h);
|
@@ -634,6 +698,9 @@ static void add_handlers_for_message(const void *closure, upb_handlers *h) {
|
|
634
698
|
desc->layout = create_layout(desc->msgdef);
|
635
699
|
}
|
636
700
|
|
701
|
+
upb_handlerattr attr = UPB_HANDLERATTR_INITIALIZER;
|
702
|
+
upb_handlers_setunknown(h, unknown_field_handler, &attr);
|
703
|
+
|
637
704
|
for (upb_msg_field_begin(&i, desc->msgdef);
|
638
705
|
!upb_msg_field_done(&i);
|
639
706
|
upb_msg_field_next(&i)) {
|
@@ -831,65 +898,6 @@ VALUE Message_decode_json(VALUE klass, VALUE data) {
|
|
831
898
|
// -----------------------------------------------------------------------------
|
832
899
|
// Serializing.
|
833
900
|
// -----------------------------------------------------------------------------
|
834
|
-
//
|
835
|
-
// The code below also comes from upb's prototype Ruby binding, developed by
|
836
|
-
// haberman@.
|
837
|
-
|
838
|
-
/* stringsink *****************************************************************/
|
839
|
-
|
840
|
-
// This should probably be factored into a common upb component.
|
841
|
-
|
842
|
-
typedef struct {
|
843
|
-
upb_byteshandler handler;
|
844
|
-
upb_bytessink sink;
|
845
|
-
char *ptr;
|
846
|
-
size_t len, size;
|
847
|
-
} stringsink;
|
848
|
-
|
849
|
-
static void *stringsink_start(void *_sink, const void *hd, size_t size_hint) {
|
850
|
-
stringsink *sink = _sink;
|
851
|
-
sink->len = 0;
|
852
|
-
return sink;
|
853
|
-
}
|
854
|
-
|
855
|
-
static size_t stringsink_string(void *_sink, const void *hd, const char *ptr,
|
856
|
-
size_t len, const upb_bufhandle *handle) {
|
857
|
-
stringsink *sink = _sink;
|
858
|
-
size_t new_size = sink->size;
|
859
|
-
|
860
|
-
UPB_UNUSED(hd);
|
861
|
-
UPB_UNUSED(handle);
|
862
|
-
|
863
|
-
while (sink->len + len > new_size) {
|
864
|
-
new_size *= 2;
|
865
|
-
}
|
866
|
-
|
867
|
-
if (new_size != sink->size) {
|
868
|
-
sink->ptr = realloc(sink->ptr, new_size);
|
869
|
-
sink->size = new_size;
|
870
|
-
}
|
871
|
-
|
872
|
-
memcpy(sink->ptr + sink->len, ptr, len);
|
873
|
-
sink->len += len;
|
874
|
-
|
875
|
-
return len;
|
876
|
-
}
|
877
|
-
|
878
|
-
void stringsink_init(stringsink *sink) {
|
879
|
-
upb_byteshandler_init(&sink->handler);
|
880
|
-
upb_byteshandler_setstartstr(&sink->handler, stringsink_start, NULL);
|
881
|
-
upb_byteshandler_setstring(&sink->handler, stringsink_string, NULL);
|
882
|
-
|
883
|
-
upb_bytessink_reset(&sink->sink, &sink->handler, sink);
|
884
|
-
|
885
|
-
sink->size = 32;
|
886
|
-
sink->ptr = malloc(sink->size);
|
887
|
-
sink->len = 0;
|
888
|
-
}
|
889
|
-
|
890
|
-
void stringsink_uninit(stringsink *sink) {
|
891
|
-
free(sink->ptr);
|
892
|
-
}
|
893
901
|
|
894
902
|
/* msgvisitor *****************************************************************/
|
895
903
|
|
@@ -1171,6 +1179,11 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
|
|
1171
1179
|
}
|
1172
1180
|
}
|
1173
1181
|
|
1182
|
+
stringsink* unknown = msg->unknown_fields;
|
1183
|
+
if (unknown != NULL) {
|
1184
|
+
upb_sink_putunknown(sink, unknown->ptr, unknown->len);
|
1185
|
+
}
|
1186
|
+
|
1174
1187
|
upb_sink_endmsg(sink, &status);
|
1175
1188
|
}
|
1176
1189
|
|
@@ -44,6 +44,11 @@ void Message_mark(void* _self) {
|
|
44
44
|
}
|
45
45
|
|
46
46
|
void Message_free(void* self) {
|
47
|
+
stringsink* unknown = ((MessageHeader *)self)->unknown_fields;
|
48
|
+
if (unknown != NULL) {
|
49
|
+
stringsink_uninit(unknown);
|
50
|
+
free(unknown);
|
51
|
+
}
|
47
52
|
xfree(self);
|
48
53
|
}
|
49
54
|
|
@@ -67,6 +72,8 @@ VALUE Message_alloc(VALUE klass) {
|
|
67
72
|
msg->descriptor = desc;
|
68
73
|
rb_ivar_set(ret, descriptor_instancevar_interned, descriptor);
|
69
74
|
|
75
|
+
msg->unknown_fields = NULL;
|
76
|
+
|
70
77
|
layout_init(desc->layout, Message_data(msg));
|
71
78
|
|
72
79
|
return ret;
|
@@ -217,20 +224,32 @@ VALUE Message_respond_to_missing(int argc, VALUE* argv, VALUE _self) {
|
|
217
224
|
return Qtrue;
|
218
225
|
}
|
219
226
|
|
227
|
+
VALUE create_submsg_from_hash(const upb_fielddef *f, VALUE hash) {
|
228
|
+
const upb_def *d = upb_fielddef_subdef(f);
|
229
|
+
assert(d != NULL);
|
230
|
+
|
231
|
+
VALUE descriptor = get_def_obj(d);
|
232
|
+
VALUE msgclass = rb_funcall(descriptor, rb_intern("msgclass"), 0, NULL);
|
233
|
+
|
234
|
+
VALUE args[1] = { hash };
|
235
|
+
return rb_class_new_instance(1, args, msgclass);
|
236
|
+
}
|
237
|
+
|
220
238
|
int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
|
221
239
|
MessageHeader* self;
|
222
|
-
|
223
|
-
char* name;
|
240
|
+
char *name;
|
224
241
|
const upb_fielddef* f;
|
225
242
|
TypedData_Get_Struct(_self, MessageHeader, &Message_type, self);
|
226
243
|
|
227
|
-
if (
|
244
|
+
if (TYPE(key) == T_STRING) {
|
245
|
+
name = RSTRING_PTR(key);
|
246
|
+
} else if (TYPE(key) == T_SYMBOL) {
|
247
|
+
name = RSTRING_PTR(rb_id2str(SYM2ID(key)));
|
248
|
+
} else {
|
228
249
|
rb_raise(rb_eArgError,
|
229
|
-
"Expected symbols as hash keys
|
250
|
+
"Expected string or symbols as hash keys when initializing proto from hash.");
|
230
251
|
}
|
231
252
|
|
232
|
-
method_str = rb_id2str(SYM2ID(key));
|
233
|
-
name = RSTRING_PTR(method_str);
|
234
253
|
f = upb_msgdef_ntofz(self->descriptor->msgdef, name);
|
235
254
|
if (f == NULL) {
|
236
255
|
rb_raise(rb_eArgError,
|
@@ -255,9 +274,18 @@ int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
|
|
255
274
|
}
|
256
275
|
ary = layout_get(self->descriptor->layout, Message_data(self), f);
|
257
276
|
for (int i = 0; i < RARRAY_LEN(val); i++) {
|
258
|
-
|
277
|
+
VALUE entry = rb_ary_entry(val, i);
|
278
|
+
if (TYPE(entry) == T_HASH && upb_fielddef_issubmsg(f)) {
|
279
|
+
entry = create_submsg_from_hash(f, entry);
|
280
|
+
}
|
281
|
+
|
282
|
+
RepeatedField_push(ary, entry);
|
259
283
|
}
|
260
284
|
} else {
|
285
|
+
if (TYPE(val) == T_HASH && upb_fielddef_issubmsg(f)) {
|
286
|
+
val = create_submsg_from_hash(f, val);
|
287
|
+
}
|
288
|
+
|
261
289
|
layout_set(self->descriptor->layout, Message_data(self), f, val);
|
262
290
|
}
|
263
291
|
return 0;
|
@@ -419,6 +447,13 @@ VALUE Message_to_h(VALUE _self) {
|
|
419
447
|
msg_value = Map_to_h(msg_value);
|
420
448
|
} else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
|
421
449
|
msg_value = RepeatedField_to_ary(msg_value);
|
450
|
+
|
451
|
+
if (upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
|
452
|
+
for (int i = 0; i < RARRAY_LEN(msg_value); i++) {
|
453
|
+
VALUE elem = rb_ary_entry(msg_value, i);
|
454
|
+
rb_ary_store(msg_value, i, Message_to_h(elem));
|
455
|
+
}
|
456
|
+
}
|
422
457
|
} else if (msg_value != Qnil &&
|
423
458
|
upb_fielddef_type(field) == UPB_TYPE_MESSAGE) {
|
424
459
|
msg_value = Message_to_h(msg_value);
|
@@ -110,6 +110,6 @@ void Init_protobuf_c() {
|
|
110
110
|
kRubyStringASCIIEncoding = rb_usascii_encoding();
|
111
111
|
kRubyString8bitEncoding = rb_ascii8bit_encoding();
|
112
112
|
|
113
|
-
upb_def_to_ruby_obj_map = rb_hash_new();
|
114
113
|
rb_gc_register_address(&upb_def_to_ruby_obj_map);
|
114
|
+
upb_def_to_ruby_obj_map = rb_hash_new();
|
115
115
|
}
|
@@ -116,10 +116,6 @@ struct Descriptor {
|
|
116
116
|
const upb_handlers* pb_serialize_handlers;
|
117
117
|
const upb_handlers* json_serialize_handlers;
|
118
118
|
const upb_handlers* json_serialize_handlers_preserve;
|
119
|
-
// Handlers hold type class references for sub-message fields directly in some
|
120
|
-
// cases. We need to keep these rooted because they might otherwise be
|
121
|
-
// collected.
|
122
|
-
VALUE typeclass_references;
|
123
119
|
};
|
124
120
|
|
125
121
|
struct FieldDescriptor {
|
@@ -280,6 +276,7 @@ void Builder_free(void* _self);
|
|
280
276
|
VALUE Builder_alloc(VALUE klass);
|
281
277
|
void Builder_register(VALUE module);
|
282
278
|
Builder* ruby_to_Builder(VALUE value);
|
279
|
+
VALUE Builder_initialize(VALUE _self);
|
283
280
|
VALUE Builder_add_message(VALUE _self, VALUE name);
|
284
281
|
VALUE Builder_add_enum(VALUE _self, VALUE name);
|
285
282
|
VALUE Builder_finalize_to_pool(VALUE _self, VALUE pool_rb);
|
@@ -478,8 +475,20 @@ VALUE layout_inspect(MessageLayout* layout, void* storage);
|
|
478
475
|
// Message class creation.
|
479
476
|
// -----------------------------------------------------------------------------
|
480
477
|
|
478
|
+
// This should probably be factored into a common upb component.
|
479
|
+
|
480
|
+
typedef struct {
|
481
|
+
upb_byteshandler handler;
|
482
|
+
upb_bytessink sink;
|
483
|
+
char *ptr;
|
484
|
+
size_t len, size;
|
485
|
+
} stringsink;
|
486
|
+
|
487
|
+
void stringsink_uninit(stringsink *sink);
|
488
|
+
|
481
489
|
struct MessageHeader {
|
482
|
-
Descriptor* descriptor;
|
490
|
+
Descriptor* descriptor; // kept alive by self.class.descriptor reference.
|
491
|
+
stringsink* unknown_fields; // store unknown fields in decoding.
|
483
492
|
// Data comes after this.
|
484
493
|
};
|
485
494
|
|
@@ -176,6 +176,15 @@ void native_slot_set_value_and_case(upb_fieldtype_t type, VALUE type_class,
|
|
176
176
|
break;
|
177
177
|
}
|
178
178
|
case UPB_TYPE_STRING:
|
179
|
+
if (CLASS_OF(value) == rb_cSymbol) {
|
180
|
+
value = rb_funcall(value, rb_intern("to_s"), 0, NULL);
|
181
|
+
} else if (CLASS_OF(value) != rb_cString) {
|
182
|
+
rb_raise(rb_eTypeError, "Invalid argument for string field.");
|
183
|
+
}
|
184
|
+
|
185
|
+
DEREF(memory, VALUE) = native_slot_encode_and_freeze_string(type, value);
|
186
|
+
break;
|
187
|
+
|
179
188
|
case UPB_TYPE_BYTES: {
|
180
189
|
if (CLASS_OF(value) != rb_cString) {
|
181
190
|
rb_raise(rb_eTypeError, "Invalid argument for string field.");
|
@@ -197,7 +206,9 @@ void native_slot_set_value_and_case(upb_fieldtype_t type, VALUE type_class,
|
|
197
206
|
}
|
198
207
|
case UPB_TYPE_ENUM: {
|
199
208
|
int32_t int_val = 0;
|
200
|
-
if (
|
209
|
+
if (TYPE(value) == T_STRING) {
|
210
|
+
value = rb_funcall(value, rb_intern("to_sym"), 0, NULL);
|
211
|
+
} else if (!is_ruby_num(value) && TYPE(value) != T_SYMBOL) {
|
201
212
|
rb_raise(rb_eTypeError,
|
202
213
|
"Expected number or symbol type for enum field.");
|
203
214
|
}
|
data/ext/google/protobuf_c/upb.c
CHANGED
@@ -2,6 +2,585 @@
|
|
2
2
|
#include "upb.h"
|
3
3
|
|
4
4
|
|
5
|
+
/* Maps descriptor type -> upb field type. */
|
6
|
+
static const uint8_t upb_desctype_to_fieldtype[] = {
|
7
|
+
UPB_WIRE_TYPE_END_GROUP, /* ENDGROUP */
|
8
|
+
UPB_TYPE_DOUBLE, /* DOUBLE */
|
9
|
+
UPB_TYPE_FLOAT, /* FLOAT */
|
10
|
+
UPB_TYPE_INT64, /* INT64 */
|
11
|
+
UPB_TYPE_UINT64, /* UINT64 */
|
12
|
+
UPB_TYPE_INT32, /* INT32 */
|
13
|
+
UPB_TYPE_UINT64, /* FIXED64 */
|
14
|
+
UPB_TYPE_UINT32, /* FIXED32 */
|
15
|
+
UPB_TYPE_BOOL, /* BOOL */
|
16
|
+
UPB_TYPE_STRING, /* STRING */
|
17
|
+
UPB_TYPE_MESSAGE, /* GROUP */
|
18
|
+
UPB_TYPE_MESSAGE, /* MESSAGE */
|
19
|
+
UPB_TYPE_BYTES, /* BYTES */
|
20
|
+
UPB_TYPE_UINT32, /* UINT32 */
|
21
|
+
UPB_TYPE_ENUM, /* ENUM */
|
22
|
+
UPB_TYPE_INT32, /* SFIXED32 */
|
23
|
+
UPB_TYPE_INT64, /* SFIXED64 */
|
24
|
+
UPB_TYPE_INT32, /* SINT32 */
|
25
|
+
UPB_TYPE_INT64, /* SINT64 */
|
26
|
+
};
|
27
|
+
|
28
|
+
/* Data pertaining to the parse. */
|
29
|
+
typedef struct {
|
30
|
+
upb_env *env;
|
31
|
+
/* Current decoding pointer. Points to the beginning of a field until we
|
32
|
+
* have finished decoding the whole field. */
|
33
|
+
const char *ptr;
|
34
|
+
} upb_decstate;
|
35
|
+
|
36
|
+
/* Data pertaining to a single message frame. */
|
37
|
+
typedef struct {
|
38
|
+
const char *limit;
|
39
|
+
int32_t group_number; /* 0 if we are not parsing a group. */
|
40
|
+
|
41
|
+
/* These members are unset for an unknown group frame. */
|
42
|
+
char *msg;
|
43
|
+
const upb_msglayout_msginit_v1 *m;
|
44
|
+
} upb_decframe;
|
45
|
+
|
46
|
+
#define CHK(x) if (!(x)) { return false; }
|
47
|
+
|
48
|
+
static bool upb_skip_unknowngroup(upb_decstate *d, int field_number,
|
49
|
+
const char *limit);
|
50
|
+
static bool upb_decode_message(upb_decstate *d, const char *limit,
|
51
|
+
int group_number, char *msg,
|
52
|
+
const upb_msglayout_msginit_v1 *l);
|
53
|
+
|
54
|
+
static bool upb_decode_varint(const char **ptr, const char *limit,
|
55
|
+
uint64_t *val) {
|
56
|
+
uint8_t byte;
|
57
|
+
int bitpos = 0;
|
58
|
+
const char *p = *ptr;
|
59
|
+
*val = 0;
|
60
|
+
|
61
|
+
do {
|
62
|
+
CHK(bitpos < 70 && p < limit);
|
63
|
+
byte = *p;
|
64
|
+
*val |= (uint64_t)(byte & 0x7F) << bitpos;
|
65
|
+
p++;
|
66
|
+
bitpos += 7;
|
67
|
+
} while (byte & 0x80);
|
68
|
+
|
69
|
+
*ptr = p;
|
70
|
+
return true;
|
71
|
+
}
|
72
|
+
|
73
|
+
static bool upb_decode_varint32(const char **ptr, const char *limit,
|
74
|
+
uint32_t *val) {
|
75
|
+
uint64_t u64;
|
76
|
+
CHK(upb_decode_varint(ptr, limit, &u64) && u64 <= UINT32_MAX);
|
77
|
+
*val = u64;
|
78
|
+
return true;
|
79
|
+
}
|
80
|
+
|
81
|
+
static bool upb_decode_64bit(const char **ptr, const char *limit,
|
82
|
+
uint64_t *val) {
|
83
|
+
CHK(limit - *ptr >= 8);
|
84
|
+
memcpy(val, *ptr, 8);
|
85
|
+
*ptr += 8;
|
86
|
+
return true;
|
87
|
+
}
|
88
|
+
|
89
|
+
static bool upb_decode_32bit(const char **ptr, const char *limit,
|
90
|
+
uint32_t *val) {
|
91
|
+
CHK(limit - *ptr >= 4);
|
92
|
+
memcpy(val, *ptr, 4);
|
93
|
+
*ptr += 4;
|
94
|
+
return true;
|
95
|
+
}
|
96
|
+
|
97
|
+
static bool upb_decode_tag(const char **ptr, const char *limit,
|
98
|
+
int *field_number, int *wire_type) {
|
99
|
+
uint32_t tag = 0;
|
100
|
+
CHK(upb_decode_varint32(ptr, limit, &tag));
|
101
|
+
*field_number = tag >> 3;
|
102
|
+
*wire_type = tag & 7;
|
103
|
+
return true;
|
104
|
+
}
|
105
|
+
|
106
|
+
static int32_t upb_zzdecode_32(uint32_t n) {
|
107
|
+
return (n >> 1) ^ -(int32_t)(n & 1);
|
108
|
+
}
|
109
|
+
|
110
|
+
static int64_t upb_zzdecode_64(uint64_t n) {
|
111
|
+
return (n >> 1) ^ -(int64_t)(n & 1);
|
112
|
+
}
|
113
|
+
|
114
|
+
static bool upb_decode_string(const char **ptr, const char *limit,
|
115
|
+
upb_stringview *val) {
|
116
|
+
uint32_t len;
|
117
|
+
|
118
|
+
CHK(upb_decode_varint32(ptr, limit, &len) &&
|
119
|
+
len < INT32_MAX &&
|
120
|
+
limit - *ptr >= (int32_t)len);
|
121
|
+
|
122
|
+
*val = upb_stringview_make(*ptr, len);
|
123
|
+
*ptr += len;
|
124
|
+
return true;
|
125
|
+
}
|
126
|
+
|
127
|
+
static void upb_set32(void *msg, size_t ofs, uint32_t val) {
|
128
|
+
memcpy((char*)msg + ofs, &val, sizeof(val));
|
129
|
+
}
|
130
|
+
|
131
|
+
static bool upb_append_unknown(upb_decstate *d, upb_decframe *frame,
|
132
|
+
const char *start) {
|
133
|
+
UPB_UNUSED(d);
|
134
|
+
UPB_UNUSED(frame);
|
135
|
+
UPB_UNUSED(start);
|
136
|
+
return true;
|
137
|
+
}
|
138
|
+
|
139
|
+
static bool upb_skip_unknownfielddata(upb_decstate *d, upb_decframe *frame,
|
140
|
+
int field_number, int wire_type) {
|
141
|
+
switch (wire_type) {
|
142
|
+
case UPB_WIRE_TYPE_VARINT: {
|
143
|
+
uint64_t val;
|
144
|
+
return upb_decode_varint(&d->ptr, frame->limit, &val);
|
145
|
+
}
|
146
|
+
case UPB_WIRE_TYPE_32BIT: {
|
147
|
+
uint32_t val;
|
148
|
+
return upb_decode_32bit(&d->ptr, frame->limit, &val);
|
149
|
+
}
|
150
|
+
case UPB_WIRE_TYPE_64BIT: {
|
151
|
+
uint64_t val;
|
152
|
+
return upb_decode_64bit(&d->ptr, frame->limit, &val);
|
153
|
+
}
|
154
|
+
case UPB_WIRE_TYPE_DELIMITED: {
|
155
|
+
upb_stringview val;
|
156
|
+
return upb_decode_string(&d->ptr, frame->limit, &val);
|
157
|
+
}
|
158
|
+
case UPB_WIRE_TYPE_START_GROUP:
|
159
|
+
return upb_skip_unknowngroup(d, field_number, frame->limit);
|
160
|
+
case UPB_WIRE_TYPE_END_GROUP:
|
161
|
+
CHK(field_number == frame->group_number);
|
162
|
+
frame->limit = d->ptr;
|
163
|
+
return true;
|
164
|
+
}
|
165
|
+
return false;
|
166
|
+
}
|
167
|
+
|
168
|
+
static bool upb_array_grow(upb_array *arr, size_t elements) {
|
169
|
+
size_t needed = arr->len + elements;
|
170
|
+
size_t new_size = UPB_MAX(arr->size, 8);
|
171
|
+
size_t new_bytes;
|
172
|
+
size_t old_bytes;
|
173
|
+
void *new_data;
|
174
|
+
|
175
|
+
while (new_size < needed) {
|
176
|
+
new_size *= 2;
|
177
|
+
}
|
178
|
+
|
179
|
+
old_bytes = arr->len * arr->element_size;
|
180
|
+
new_bytes = new_size * arr->element_size;
|
181
|
+
new_data = upb_realloc(arr->alloc, arr->data, old_bytes, new_bytes);
|
182
|
+
CHK(new_data);
|
183
|
+
|
184
|
+
arr->data = new_data;
|
185
|
+
arr->size = new_size;
|
186
|
+
return true;
|
187
|
+
}
|
188
|
+
|
189
|
+
static void *upb_array_reserve(upb_array *arr, size_t elements) {
|
190
|
+
if (arr->size - arr->len < elements) {
|
191
|
+
CHK(upb_array_grow(arr, elements));
|
192
|
+
}
|
193
|
+
return (char*)arr->data + (arr->len * arr->element_size);
|
194
|
+
}
|
195
|
+
|
196
|
+
static void *upb_array_add(upb_array *arr, size_t elements) {
|
197
|
+
void *ret = upb_array_reserve(arr, elements);
|
198
|
+
arr->len += elements;
|
199
|
+
return ret;
|
200
|
+
}
|
201
|
+
|
202
|
+
static upb_array *upb_getarr(upb_decframe *frame,
|
203
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
204
|
+
UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
|
205
|
+
return *(upb_array**)&frame->msg[field->offset];
|
206
|
+
}
|
207
|
+
|
208
|
+
static upb_array *upb_getorcreatearr(upb_decstate *d,
|
209
|
+
upb_decframe *frame,
|
210
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
211
|
+
upb_array *arr = upb_getarr(frame, field);
|
212
|
+
|
213
|
+
if (!arr) {
|
214
|
+
arr = upb_env_malloc(d->env, sizeof(*arr));
|
215
|
+
if (!arr) {
|
216
|
+
return NULL;
|
217
|
+
}
|
218
|
+
upb_array_init(arr, upb_desctype_to_fieldtype[field->type],
|
219
|
+
upb_arena_alloc(upb_env_arena(d->env)));
|
220
|
+
*(upb_array**)&frame->msg[field->offset] = arr;
|
221
|
+
}
|
222
|
+
|
223
|
+
return arr;
|
224
|
+
}
|
225
|
+
|
226
|
+
static void upb_sethasbit(upb_decframe *frame,
|
227
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
228
|
+
UPB_ASSERT(field->hasbit != UPB_NO_HASBIT);
|
229
|
+
frame->msg[field->hasbit / 8] |= (1 << (field->hasbit % 8));
|
230
|
+
}
|
231
|
+
|
232
|
+
static void upb_setoneofcase(upb_decframe *frame,
|
233
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
234
|
+
UPB_ASSERT(field->oneof_index != UPB_NOT_IN_ONEOF);
|
235
|
+
upb_set32(frame->msg, frame->m->oneofs[field->oneof_index].case_offset,
|
236
|
+
field->number);
|
237
|
+
}
|
238
|
+
|
239
|
+
static char *upb_decode_prepareslot(upb_decstate *d,
|
240
|
+
upb_decframe *frame,
|
241
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
242
|
+
char *field_mem = frame->msg + field->offset;
|
243
|
+
upb_array *arr;
|
244
|
+
|
245
|
+
if (field->label == UPB_LABEL_REPEATED) {
|
246
|
+
arr = upb_getorcreatearr(d, frame, field);
|
247
|
+
field_mem = upb_array_reserve(arr, 1);
|
248
|
+
}
|
249
|
+
|
250
|
+
return field_mem;
|
251
|
+
}
|
252
|
+
|
253
|
+
static void upb_decode_setpresent(upb_decframe *frame,
|
254
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
255
|
+
if (field->label == UPB_LABEL_REPEATED) {
|
256
|
+
upb_array *arr = upb_getarr(frame, field);
|
257
|
+
UPB_ASSERT(arr->len < arr->size);
|
258
|
+
arr->len++;
|
259
|
+
} else if (field->oneof_index != UPB_NOT_IN_ONEOF) {
|
260
|
+
upb_setoneofcase(frame, field);
|
261
|
+
} else if (field->hasbit != UPB_NO_HASBIT) {
|
262
|
+
upb_sethasbit(frame, field);
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
static bool upb_decode_submsg(upb_decstate *d,
|
267
|
+
upb_decframe *frame,
|
268
|
+
const char *limit,
|
269
|
+
const upb_msglayout_fieldinit_v1 *field,
|
270
|
+
int group_number) {
|
271
|
+
char *submsg = *(void**)&frame->msg[field->offset];
|
272
|
+
const upb_msglayout_msginit_v1 *subm;
|
273
|
+
|
274
|
+
UPB_ASSERT(field->submsg_index != UPB_NO_SUBMSG);
|
275
|
+
subm = frame->m->submsgs[field->submsg_index];
|
276
|
+
UPB_ASSERT(subm);
|
277
|
+
|
278
|
+
if (!submsg) {
|
279
|
+
submsg = upb_env_malloc(d->env, upb_msg_sizeof((upb_msglayout *)subm));
|
280
|
+
CHK(submsg);
|
281
|
+
submsg = upb_msg_init(
|
282
|
+
submsg, (upb_msglayout*)subm, upb_arena_alloc(upb_env_arena(d->env)));
|
283
|
+
*(void**)&frame->msg[field->offset] = submsg;
|
284
|
+
}
|
285
|
+
|
286
|
+
upb_decode_message(d, limit, group_number, submsg, subm);
|
287
|
+
|
288
|
+
return true;
|
289
|
+
}
|
290
|
+
|
291
|
+
static bool upb_decode_varintfield(upb_decstate *d, upb_decframe *frame,
|
292
|
+
const char *field_start,
|
293
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
294
|
+
uint64_t val;
|
295
|
+
void *field_mem;
|
296
|
+
|
297
|
+
field_mem = upb_decode_prepareslot(d, frame, field);
|
298
|
+
CHK(field_mem);
|
299
|
+
CHK(upb_decode_varint(&d->ptr, frame->limit, &val));
|
300
|
+
|
301
|
+
switch ((upb_descriptortype_t)field->type) {
|
302
|
+
case UPB_DESCRIPTOR_TYPE_INT64:
|
303
|
+
case UPB_DESCRIPTOR_TYPE_UINT64:
|
304
|
+
memcpy(field_mem, &val, sizeof(val));
|
305
|
+
break;
|
306
|
+
case UPB_DESCRIPTOR_TYPE_INT32:
|
307
|
+
case UPB_DESCRIPTOR_TYPE_UINT32:
|
308
|
+
case UPB_DESCRIPTOR_TYPE_ENUM: {
|
309
|
+
uint32_t val32 = val;
|
310
|
+
memcpy(field_mem, &val32, sizeof(val32));
|
311
|
+
break;
|
312
|
+
}
|
313
|
+
case UPB_DESCRIPTOR_TYPE_BOOL: {
|
314
|
+
bool valbool = val != 0;
|
315
|
+
memcpy(field_mem, &valbool, sizeof(valbool));
|
316
|
+
break;
|
317
|
+
}
|
318
|
+
case UPB_DESCRIPTOR_TYPE_SINT32: {
|
319
|
+
int32_t decoded = upb_zzdecode_32(val);
|
320
|
+
memcpy(field_mem, &decoded, sizeof(decoded));
|
321
|
+
break;
|
322
|
+
}
|
323
|
+
case UPB_DESCRIPTOR_TYPE_SINT64: {
|
324
|
+
int64_t decoded = upb_zzdecode_64(val);
|
325
|
+
memcpy(field_mem, &decoded, sizeof(decoded));
|
326
|
+
break;
|
327
|
+
}
|
328
|
+
default:
|
329
|
+
return upb_append_unknown(d, frame, field_start);
|
330
|
+
}
|
331
|
+
|
332
|
+
upb_decode_setpresent(frame, field);
|
333
|
+
return true;
|
334
|
+
}
|
335
|
+
|
336
|
+
static bool upb_decode_64bitfield(upb_decstate *d, upb_decframe *frame,
|
337
|
+
const char *field_start,
|
338
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
339
|
+
void *field_mem;
|
340
|
+
uint64_t val;
|
341
|
+
|
342
|
+
field_mem = upb_decode_prepareslot(d, frame, field);
|
343
|
+
CHK(field_mem);
|
344
|
+
CHK(upb_decode_64bit(&d->ptr, frame->limit, &val));
|
345
|
+
|
346
|
+
switch ((upb_descriptortype_t)field->type) {
|
347
|
+
case UPB_DESCRIPTOR_TYPE_DOUBLE:
|
348
|
+
case UPB_DESCRIPTOR_TYPE_FIXED64:
|
349
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED64:
|
350
|
+
memcpy(field_mem, &val, sizeof(val));
|
351
|
+
break;
|
352
|
+
default:
|
353
|
+
return upb_append_unknown(d, frame, field_start);
|
354
|
+
}
|
355
|
+
|
356
|
+
upb_decode_setpresent(frame, field);
|
357
|
+
return true;
|
358
|
+
}
|
359
|
+
|
360
|
+
static bool upb_decode_32bitfield(upb_decstate *d, upb_decframe *frame,
|
361
|
+
const char *field_start,
|
362
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
363
|
+
void *field_mem;
|
364
|
+
uint32_t val;
|
365
|
+
|
366
|
+
field_mem = upb_decode_prepareslot(d, frame, field);
|
367
|
+
CHK(field_mem);
|
368
|
+
CHK(upb_decode_32bit(&d->ptr, frame->limit, &val));
|
369
|
+
|
370
|
+
switch ((upb_descriptortype_t)field->type) {
|
371
|
+
case UPB_DESCRIPTOR_TYPE_FLOAT:
|
372
|
+
case UPB_DESCRIPTOR_TYPE_FIXED32:
|
373
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED32:
|
374
|
+
memcpy(field_mem, &val, sizeof(val));
|
375
|
+
break;
|
376
|
+
default:
|
377
|
+
return upb_append_unknown(d, frame, field_start);
|
378
|
+
}
|
379
|
+
|
380
|
+
upb_decode_setpresent(frame, field);
|
381
|
+
return true;
|
382
|
+
}
|
383
|
+
|
384
|
+
static bool upb_decode_fixedpacked(upb_array *arr, upb_stringview data,
|
385
|
+
int elem_size) {
|
386
|
+
int elements = data.size / elem_size;
|
387
|
+
void *field_mem;
|
388
|
+
|
389
|
+
CHK((size_t)(elements * elem_size) == data.size);
|
390
|
+
field_mem = upb_array_add(arr, elements);
|
391
|
+
CHK(field_mem);
|
392
|
+
memcpy(field_mem, data.data, data.size);
|
393
|
+
return true;
|
394
|
+
}
|
395
|
+
|
396
|
+
static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
|
397
|
+
const char *field_start,
|
398
|
+
const upb_msglayout_fieldinit_v1 *field,
|
399
|
+
upb_stringview val) {
|
400
|
+
upb_array *arr = upb_getorcreatearr(d, frame, field);
|
401
|
+
|
402
|
+
#define VARINT_CASE(ctype, decode) { \
|
403
|
+
const char *ptr = val.data; \
|
404
|
+
const char *limit = ptr + val.size; \
|
405
|
+
while (ptr < limit) { \
|
406
|
+
uint64_t val; \
|
407
|
+
void *field_mem; \
|
408
|
+
ctype decoded; \
|
409
|
+
CHK(upb_decode_varint(&ptr, limit, &val)); \
|
410
|
+
decoded = (decode)(val); \
|
411
|
+
field_mem = upb_array_add(arr, 1); \
|
412
|
+
CHK(field_mem); \
|
413
|
+
memcpy(field_mem, &decoded, sizeof(ctype)); \
|
414
|
+
} \
|
415
|
+
return true; \
|
416
|
+
}
|
417
|
+
|
418
|
+
switch ((upb_descriptortype_t)field->type) {
|
419
|
+
case UPB_DESCRIPTOR_TYPE_STRING:
|
420
|
+
case UPB_DESCRIPTOR_TYPE_BYTES: {
|
421
|
+
void *field_mem = upb_array_add(arr, 1);
|
422
|
+
CHK(field_mem);
|
423
|
+
memcpy(field_mem, &val, sizeof(val));
|
424
|
+
return true;
|
425
|
+
}
|
426
|
+
case UPB_DESCRIPTOR_TYPE_FLOAT:
|
427
|
+
case UPB_DESCRIPTOR_TYPE_FIXED32:
|
428
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED32:
|
429
|
+
return upb_decode_fixedpacked(arr, val, sizeof(int32_t));
|
430
|
+
case UPB_DESCRIPTOR_TYPE_DOUBLE:
|
431
|
+
case UPB_DESCRIPTOR_TYPE_FIXED64:
|
432
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED64:
|
433
|
+
return upb_decode_fixedpacked(arr, val, sizeof(int64_t));
|
434
|
+
case UPB_DESCRIPTOR_TYPE_INT32:
|
435
|
+
case UPB_DESCRIPTOR_TYPE_UINT32:
|
436
|
+
case UPB_DESCRIPTOR_TYPE_ENUM:
|
437
|
+
/* TODO: proto2 enum field that isn't in the enum. */
|
438
|
+
VARINT_CASE(uint32_t, uint32_t);
|
439
|
+
case UPB_DESCRIPTOR_TYPE_INT64:
|
440
|
+
case UPB_DESCRIPTOR_TYPE_UINT64:
|
441
|
+
VARINT_CASE(uint64_t, uint64_t);
|
442
|
+
case UPB_DESCRIPTOR_TYPE_BOOL:
|
443
|
+
VARINT_CASE(bool, bool);
|
444
|
+
case UPB_DESCRIPTOR_TYPE_SINT32:
|
445
|
+
VARINT_CASE(int32_t, upb_zzdecode_32);
|
446
|
+
case UPB_DESCRIPTOR_TYPE_SINT64:
|
447
|
+
VARINT_CASE(int64_t, upb_zzdecode_64);
|
448
|
+
case UPB_DESCRIPTOR_TYPE_MESSAGE:
|
449
|
+
CHK(val.size <= (size_t)(frame->limit - val.data));
|
450
|
+
return upb_decode_submsg(d, frame, val.data + val.size, field, 0);
|
451
|
+
case UPB_DESCRIPTOR_TYPE_GROUP:
|
452
|
+
return upb_append_unknown(d, frame, field_start);
|
453
|
+
}
|
454
|
+
#undef VARINT_CASE
|
455
|
+
UPB_UNREACHABLE();
|
456
|
+
}
|
457
|
+
|
458
|
+
static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
|
459
|
+
const char *field_start,
|
460
|
+
const upb_msglayout_fieldinit_v1 *field) {
|
461
|
+
upb_stringview val;
|
462
|
+
|
463
|
+
CHK(upb_decode_string(&d->ptr, frame->limit, &val));
|
464
|
+
|
465
|
+
if (field->label == UPB_LABEL_REPEATED) {
|
466
|
+
return upb_decode_toarray(d, frame, field_start, field, val);
|
467
|
+
} else {
|
468
|
+
switch ((upb_descriptortype_t)field->type) {
|
469
|
+
case UPB_DESCRIPTOR_TYPE_STRING:
|
470
|
+
case UPB_DESCRIPTOR_TYPE_BYTES: {
|
471
|
+
void *field_mem = upb_decode_prepareslot(d, frame, field);
|
472
|
+
CHK(field_mem);
|
473
|
+
memcpy(field_mem, &val, sizeof(val));
|
474
|
+
break;
|
475
|
+
}
|
476
|
+
case UPB_DESCRIPTOR_TYPE_MESSAGE:
|
477
|
+
CHK(val.size <= (size_t)(frame->limit - val.data));
|
478
|
+
CHK(upb_decode_submsg(d, frame, val.data + val.size, field, 0));
|
479
|
+
break;
|
480
|
+
default:
|
481
|
+
/* TODO(haberman): should we accept the last element of a packed? */
|
482
|
+
return upb_append_unknown(d, frame, field_start);
|
483
|
+
}
|
484
|
+
upb_decode_setpresent(frame, field);
|
485
|
+
return true;
|
486
|
+
}
|
487
|
+
}
|
488
|
+
|
489
|
+
static const upb_msglayout_fieldinit_v1 *upb_find_field(
|
490
|
+
const upb_msglayout_msginit_v1 *l, uint32_t field_number) {
|
491
|
+
/* Lots of optimization opportunities here. */
|
492
|
+
int i;
|
493
|
+
for (i = 0; i < l->field_count; i++) {
|
494
|
+
if (l->fields[i].number == field_number) {
|
495
|
+
return &l->fields[i];
|
496
|
+
}
|
497
|
+
}
|
498
|
+
|
499
|
+
return NULL; /* Unknown field. */
|
500
|
+
}
|
501
|
+
|
502
|
+
static bool upb_decode_field(upb_decstate *d, upb_decframe *frame) {
|
503
|
+
int field_number;
|
504
|
+
int wire_type;
|
505
|
+
const char *field_start = d->ptr;
|
506
|
+
const upb_msglayout_fieldinit_v1 *field;
|
507
|
+
|
508
|
+
CHK(upb_decode_tag(&d->ptr, frame->limit, &field_number, &wire_type));
|
509
|
+
field = upb_find_field(frame->m, field_number);
|
510
|
+
|
511
|
+
if (field) {
|
512
|
+
switch (wire_type) {
|
513
|
+
case UPB_WIRE_TYPE_VARINT:
|
514
|
+
return upb_decode_varintfield(d, frame, field_start, field);
|
515
|
+
case UPB_WIRE_TYPE_32BIT:
|
516
|
+
return upb_decode_32bitfield(d, frame, field_start, field);
|
517
|
+
case UPB_WIRE_TYPE_64BIT:
|
518
|
+
return upb_decode_64bitfield(d, frame, field_start, field);
|
519
|
+
case UPB_WIRE_TYPE_DELIMITED:
|
520
|
+
return upb_decode_delimitedfield(d, frame, field_start, field);
|
521
|
+
case UPB_WIRE_TYPE_START_GROUP:
|
522
|
+
CHK(field->type == UPB_DESCRIPTOR_TYPE_GROUP);
|
523
|
+
return upb_decode_submsg(d, frame, frame->limit, field, field_number);
|
524
|
+
case UPB_WIRE_TYPE_END_GROUP:
|
525
|
+
CHK(frame->group_number == field_number)
|
526
|
+
frame->limit = d->ptr;
|
527
|
+
return true;
|
528
|
+
default:
|
529
|
+
return false;
|
530
|
+
}
|
531
|
+
} else {
|
532
|
+
CHK(field_number != 0);
|
533
|
+
return upb_skip_unknownfielddata(d, frame, field_number, wire_type);
|
534
|
+
}
|
535
|
+
}
|
536
|
+
|
537
|
+
static bool upb_skip_unknowngroup(upb_decstate *d, int field_number,
|
538
|
+
const char *limit) {
|
539
|
+
upb_decframe frame;
|
540
|
+
frame.msg = NULL;
|
541
|
+
frame.m = NULL;
|
542
|
+
frame.group_number = field_number;
|
543
|
+
frame.limit = limit;
|
544
|
+
|
545
|
+
while (d->ptr < frame.limit) {
|
546
|
+
int wire_type;
|
547
|
+
int field_number;
|
548
|
+
|
549
|
+
CHK(upb_decode_tag(&d->ptr, frame.limit, &field_number, &wire_type));
|
550
|
+
CHK(upb_skip_unknownfielddata(d, &frame, field_number, wire_type));
|
551
|
+
}
|
552
|
+
|
553
|
+
return true;
|
554
|
+
}
|
555
|
+
|
556
|
+
static bool upb_decode_message(upb_decstate *d, const char *limit,
|
557
|
+
int group_number, char *msg,
|
558
|
+
const upb_msglayout_msginit_v1 *l) {
|
559
|
+
upb_decframe frame;
|
560
|
+
frame.group_number = group_number;
|
561
|
+
frame.limit = limit;
|
562
|
+
frame.msg = msg;
|
563
|
+
frame.m = l;
|
564
|
+
|
565
|
+
while (d->ptr < frame.limit) {
|
566
|
+
CHK(upb_decode_field(d, &frame));
|
567
|
+
}
|
568
|
+
|
569
|
+
return true;
|
570
|
+
}
|
571
|
+
|
572
|
+
bool upb_decode(upb_stringview buf, void *msg,
|
573
|
+
const upb_msglayout_msginit_v1 *l, upb_env *env) {
|
574
|
+
upb_decstate state;
|
575
|
+
state.ptr = buf.data;
|
576
|
+
state.env = env;
|
577
|
+
|
578
|
+
return upb_decode_message(&state, buf.data + buf.size, 0, msg, l);
|
579
|
+
}
|
580
|
+
|
581
|
+
#undef CHK
|
582
|
+
|
583
|
+
|
5
584
|
#include <ctype.h>
|
6
585
|
#include <stdlib.h>
|
7
586
|
#include <string.h>
|
@@ -326,6 +905,7 @@ static bool assign_msg_indices(upb_msgdef *m, upb_status *s) {
|
|
326
905
|
v = upb_value_bool(true);
|
327
906
|
upb_inttable_insert(&t, UPB_STARTMSG_SELECTOR, v);
|
328
907
|
upb_inttable_insert(&t, UPB_ENDMSG_SELECTOR, v);
|
908
|
+
upb_inttable_insert(&t, UPB_UNKNOWN_SELECTOR, v);
|
329
909
|
for(upb_msg_field_begin(&j, m);
|
330
910
|
!upb_msg_field_done(&j);
|
331
911
|
upb_msg_field_next(&j)) {
|
@@ -2308,6 +2888,9 @@ bool upb_symtab_addfile(upb_symtab *s, upb_filedef *file, upb_status *status) {
|
|
2308
2888
|
bool ret;
|
2309
2889
|
|
2310
2890
|
n = upb_filedef_defcount(file);
|
2891
|
+
if (n == 0) {
|
2892
|
+
return true;
|
2893
|
+
}
|
2311
2894
|
defs = upb_gmalloc(sizeof(*defs) * n);
|
2312
2895
|
|
2313
2896
|
if (defs == NULL) {
|
@@ -2356,6 +2939,397 @@ bool upb_symtab_done(const upb_symtab_iter *iter) {
|
|
2356
2939
|
const upb_def *upb_symtab_iter_def(const upb_symtab_iter *iter) {
|
2357
2940
|
return upb_value_getptr(upb_strtable_iter_value(&iter->iter));
|
2358
2941
|
}
|
2942
|
+
/* We encode backwards, to avoid pre-computing lengths (one-pass encode). */
|
2943
|
+
|
2944
|
+
|
2945
|
+
#define UPB_PB_VARINT_MAX_LEN 10
|
2946
|
+
#define CHK(x) do { if (!(x)) { return false; } } while(0)
|
2947
|
+
|
2948
|
+
/* Maps descriptor type -> upb field type. */
|
2949
|
+
static const uint8_t upb_desctype_to_fieldtype2[] = {
|
2950
|
+
UPB_WIRE_TYPE_END_GROUP, /* ENDGROUP */
|
2951
|
+
UPB_TYPE_DOUBLE, /* DOUBLE */
|
2952
|
+
UPB_TYPE_FLOAT, /* FLOAT */
|
2953
|
+
UPB_TYPE_INT64, /* INT64 */
|
2954
|
+
UPB_TYPE_UINT64, /* UINT64 */
|
2955
|
+
UPB_TYPE_INT32, /* INT32 */
|
2956
|
+
UPB_TYPE_UINT64, /* FIXED64 */
|
2957
|
+
UPB_TYPE_UINT32, /* FIXED32 */
|
2958
|
+
UPB_TYPE_BOOL, /* BOOL */
|
2959
|
+
UPB_TYPE_STRING, /* STRING */
|
2960
|
+
UPB_TYPE_MESSAGE, /* GROUP */
|
2961
|
+
UPB_TYPE_MESSAGE, /* MESSAGE */
|
2962
|
+
UPB_TYPE_BYTES, /* BYTES */
|
2963
|
+
UPB_TYPE_UINT32, /* UINT32 */
|
2964
|
+
UPB_TYPE_ENUM, /* ENUM */
|
2965
|
+
UPB_TYPE_INT32, /* SFIXED32 */
|
2966
|
+
UPB_TYPE_INT64, /* SFIXED64 */
|
2967
|
+
UPB_TYPE_INT32, /* SINT32 */
|
2968
|
+
UPB_TYPE_INT64, /* SINT64 */
|
2969
|
+
};
|
2970
|
+
|
2971
|
+
static size_t upb_encode_varint(uint64_t val, char *buf) {
|
2972
|
+
size_t i;
|
2973
|
+
if (val < 128) { buf[0] = val; return 1; }
|
2974
|
+
i = 0;
|
2975
|
+
while (val) {
|
2976
|
+
uint8_t byte = val & 0x7fU;
|
2977
|
+
val >>= 7;
|
2978
|
+
if (val) byte |= 0x80U;
|
2979
|
+
buf[i++] = byte;
|
2980
|
+
}
|
2981
|
+
return i;
|
2982
|
+
}
|
2983
|
+
|
2984
|
+
static uint32_t upb_zzencode_32(int32_t n) { return (n << 1) ^ (n >> 31); }
|
2985
|
+
static uint64_t upb_zzencode_64(int64_t n) { return (n << 1) ^ (n >> 63); }
|
2986
|
+
|
2987
|
+
typedef struct {
|
2988
|
+
upb_env *env;
|
2989
|
+
char *buf, *ptr, *limit;
|
2990
|
+
} upb_encstate;
|
2991
|
+
|
2992
|
+
static size_t upb_roundup_pow2(size_t bytes) {
|
2993
|
+
size_t ret = 128;
|
2994
|
+
while (ret < bytes) {
|
2995
|
+
ret *= 2;
|
2996
|
+
}
|
2997
|
+
return ret;
|
2998
|
+
}
|
2999
|
+
|
3000
|
+
static bool upb_encode_growbuffer(upb_encstate *e, size_t bytes) {
|
3001
|
+
size_t old_size = e->limit - e->buf;
|
3002
|
+
size_t new_size = upb_roundup_pow2(bytes + (e->limit - e->ptr));
|
3003
|
+
char *new_buf = upb_env_realloc(e->env, e->buf, old_size, new_size);
|
3004
|
+
CHK(new_buf);
|
3005
|
+
|
3006
|
+
/* We want previous data at the end, realloc() put it at the beginning. */
|
3007
|
+
memmove(e->limit - old_size, e->buf, old_size);
|
3008
|
+
|
3009
|
+
e->ptr = new_buf + new_size - (e->limit - e->ptr);
|
3010
|
+
e->limit = new_buf + new_size;
|
3011
|
+
e->buf = new_buf;
|
3012
|
+
return true;
|
3013
|
+
}
|
3014
|
+
|
3015
|
+
/* Call to ensure that at least "bytes" bytes are available for writing at
|
3016
|
+
* e->ptr. Returns false if the bytes could not be allocated. */
|
3017
|
+
static bool upb_encode_reserve(upb_encstate *e, size_t bytes) {
|
3018
|
+
CHK(UPB_LIKELY((size_t)(e->ptr - e->buf) >= bytes) ||
|
3019
|
+
upb_encode_growbuffer(e, bytes));
|
3020
|
+
|
3021
|
+
e->ptr -= bytes;
|
3022
|
+
return true;
|
3023
|
+
}
|
3024
|
+
|
3025
|
+
/* Writes the given bytes to the buffer, handling reserve/advance. */
|
3026
|
+
static bool upb_put_bytes(upb_encstate *e, const void *data, size_t len) {
|
3027
|
+
CHK(upb_encode_reserve(e, len));
|
3028
|
+
memcpy(e->ptr, data, len);
|
3029
|
+
return true;
|
3030
|
+
}
|
3031
|
+
|
3032
|
+
static bool upb_put_fixed64(upb_encstate *e, uint64_t val) {
|
3033
|
+
/* TODO(haberman): byte-swap for big endian. */
|
3034
|
+
return upb_put_bytes(e, &val, sizeof(uint64_t));
|
3035
|
+
}
|
3036
|
+
|
3037
|
+
static bool upb_put_fixed32(upb_encstate *e, uint32_t val) {
|
3038
|
+
/* TODO(haberman): byte-swap for big endian. */
|
3039
|
+
return upb_put_bytes(e, &val, sizeof(uint32_t));
|
3040
|
+
}
|
3041
|
+
|
3042
|
+
static bool upb_put_varint(upb_encstate *e, uint64_t val) {
|
3043
|
+
size_t len;
|
3044
|
+
char *start;
|
3045
|
+
CHK(upb_encode_reserve(e, UPB_PB_VARINT_MAX_LEN));
|
3046
|
+
len = upb_encode_varint(val, e->ptr);
|
3047
|
+
start = e->ptr + UPB_PB_VARINT_MAX_LEN - len;
|
3048
|
+
memmove(start, e->ptr, len);
|
3049
|
+
e->ptr = start;
|
3050
|
+
return true;
|
3051
|
+
}
|
3052
|
+
|
3053
|
+
static bool upb_put_double(upb_encstate *e, double d) {
|
3054
|
+
uint64_t u64;
|
3055
|
+
UPB_ASSERT(sizeof(double) == sizeof(uint64_t));
|
3056
|
+
memcpy(&u64, &d, sizeof(uint64_t));
|
3057
|
+
return upb_put_fixed64(e, u64);
|
3058
|
+
}
|
3059
|
+
|
3060
|
+
static bool upb_put_float(upb_encstate *e, float d) {
|
3061
|
+
uint32_t u32;
|
3062
|
+
UPB_ASSERT(sizeof(float) == sizeof(uint32_t));
|
3063
|
+
memcpy(&u32, &d, sizeof(uint32_t));
|
3064
|
+
return upb_put_fixed32(e, u32);
|
3065
|
+
}
|
3066
|
+
|
3067
|
+
static uint32_t upb_readcase(const char *msg, const upb_msglayout_msginit_v1 *m,
|
3068
|
+
int oneof_index) {
|
3069
|
+
uint32_t ret;
|
3070
|
+
memcpy(&ret, msg + m->oneofs[oneof_index].case_offset, sizeof(ret));
|
3071
|
+
return ret;
|
3072
|
+
}
|
3073
|
+
|
3074
|
+
static bool upb_readhasbit(const char *msg,
|
3075
|
+
const upb_msglayout_fieldinit_v1 *f) {
|
3076
|
+
UPB_ASSERT(f->hasbit != UPB_NO_HASBIT);
|
3077
|
+
return msg[f->hasbit / 8] & (1 << (f->hasbit % 8));
|
3078
|
+
}
|
3079
|
+
|
3080
|
+
static bool upb_put_tag(upb_encstate *e, int field_number, int wire_type) {
|
3081
|
+
return upb_put_varint(e, (field_number << 3) | wire_type);
|
3082
|
+
}
|
3083
|
+
|
3084
|
+
static bool upb_put_fixedarray(upb_encstate *e, const upb_array *arr,
|
3085
|
+
size_t size) {
|
3086
|
+
size_t bytes = arr->len * size;
|
3087
|
+
return upb_put_bytes(e, arr->data, bytes) && upb_put_varint(e, bytes);
|
3088
|
+
}
|
3089
|
+
|
3090
|
+
bool upb_encode_message(upb_encstate *e, const char *msg,
|
3091
|
+
const upb_msglayout_msginit_v1 *m,
|
3092
|
+
size_t *size);
|
3093
|
+
|
3094
|
+
static bool upb_encode_array(upb_encstate *e, const char *field_mem,
|
3095
|
+
const upb_msglayout_msginit_v1 *m,
|
3096
|
+
const upb_msglayout_fieldinit_v1 *f) {
|
3097
|
+
const upb_array *arr = *(const upb_array**)field_mem;
|
3098
|
+
|
3099
|
+
if (arr == NULL || arr->len == 0) {
|
3100
|
+
return true;
|
3101
|
+
}
|
3102
|
+
|
3103
|
+
UPB_ASSERT(arr->type == upb_desctype_to_fieldtype2[f->type]);
|
3104
|
+
|
3105
|
+
#define VARINT_CASE(ctype, encode) { \
|
3106
|
+
ctype *start = arr->data; \
|
3107
|
+
ctype *ptr = start + arr->len; \
|
3108
|
+
size_t pre_len = e->limit - e->ptr; \
|
3109
|
+
do { \
|
3110
|
+
ptr--; \
|
3111
|
+
CHK(upb_put_varint(e, encode)); \
|
3112
|
+
} while (ptr != start); \
|
3113
|
+
CHK(upb_put_varint(e, e->limit - e->ptr - pre_len)); \
|
3114
|
+
} \
|
3115
|
+
break; \
|
3116
|
+
do { ; } while(0)
|
3117
|
+
|
3118
|
+
switch (f->type) {
|
3119
|
+
case UPB_DESCRIPTOR_TYPE_DOUBLE:
|
3120
|
+
CHK(upb_put_fixedarray(e, arr, sizeof(double)));
|
3121
|
+
break;
|
3122
|
+
case UPB_DESCRIPTOR_TYPE_FLOAT:
|
3123
|
+
CHK(upb_put_fixedarray(e, arr, sizeof(float)));
|
3124
|
+
break;
|
3125
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED64:
|
3126
|
+
case UPB_DESCRIPTOR_TYPE_FIXED64:
|
3127
|
+
CHK(upb_put_fixedarray(e, arr, sizeof(uint64_t)));
|
3128
|
+
break;
|
3129
|
+
case UPB_DESCRIPTOR_TYPE_FIXED32:
|
3130
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED32:
|
3131
|
+
CHK(upb_put_fixedarray(e, arr, sizeof(uint32_t)));
|
3132
|
+
break;
|
3133
|
+
case UPB_DESCRIPTOR_TYPE_INT64:
|
3134
|
+
case UPB_DESCRIPTOR_TYPE_UINT64:
|
3135
|
+
VARINT_CASE(uint64_t, *ptr);
|
3136
|
+
case UPB_DESCRIPTOR_TYPE_UINT32:
|
3137
|
+
case UPB_DESCRIPTOR_TYPE_INT32:
|
3138
|
+
case UPB_DESCRIPTOR_TYPE_ENUM:
|
3139
|
+
VARINT_CASE(uint32_t, *ptr);
|
3140
|
+
case UPB_DESCRIPTOR_TYPE_BOOL:
|
3141
|
+
VARINT_CASE(bool, *ptr);
|
3142
|
+
case UPB_DESCRIPTOR_TYPE_SINT32:
|
3143
|
+
VARINT_CASE(int32_t, upb_zzencode_32(*ptr));
|
3144
|
+
case UPB_DESCRIPTOR_TYPE_SINT64:
|
3145
|
+
VARINT_CASE(int64_t, upb_zzencode_64(*ptr));
|
3146
|
+
case UPB_DESCRIPTOR_TYPE_STRING:
|
3147
|
+
case UPB_DESCRIPTOR_TYPE_BYTES: {
|
3148
|
+
upb_stringview *start = arr->data;
|
3149
|
+
upb_stringview *ptr = start + arr->len;
|
3150
|
+
do {
|
3151
|
+
ptr--;
|
3152
|
+
CHK(upb_put_bytes(e, ptr->data, ptr->size) &&
|
3153
|
+
upb_put_varint(e, ptr->size) &&
|
3154
|
+
upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
|
3155
|
+
} while (ptr != start);
|
3156
|
+
return true;
|
3157
|
+
}
|
3158
|
+
case UPB_DESCRIPTOR_TYPE_GROUP: {
|
3159
|
+
void **start = arr->data;
|
3160
|
+
void **ptr = start + arr->len;
|
3161
|
+
const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
|
3162
|
+
do {
|
3163
|
+
size_t size;
|
3164
|
+
ptr--;
|
3165
|
+
CHK(upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
|
3166
|
+
upb_encode_message(e, *ptr, subm, &size) &&
|
3167
|
+
upb_put_tag(e, f->number, UPB_WIRE_TYPE_START_GROUP));
|
3168
|
+
} while (ptr != start);
|
3169
|
+
return true;
|
3170
|
+
}
|
3171
|
+
case UPB_DESCRIPTOR_TYPE_MESSAGE: {
|
3172
|
+
void **start = arr->data;
|
3173
|
+
void **ptr = start + arr->len;
|
3174
|
+
const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
|
3175
|
+
do {
|
3176
|
+
size_t size;
|
3177
|
+
ptr--;
|
3178
|
+
CHK(upb_encode_message(e, *ptr, subm, &size) &&
|
3179
|
+
upb_put_varint(e, size) &&
|
3180
|
+
upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
|
3181
|
+
} while (ptr != start);
|
3182
|
+
return true;
|
3183
|
+
}
|
3184
|
+
}
|
3185
|
+
#undef VARINT_CASE
|
3186
|
+
|
3187
|
+
/* We encode all primitive arrays as packed, regardless of what was specified
|
3188
|
+
* in the .proto file. Could special case 1-sized arrays. */
|
3189
|
+
CHK(upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED));
|
3190
|
+
return true;
|
3191
|
+
}
|
3192
|
+
|
3193
|
+
static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
|
3194
|
+
const upb_msglayout_msginit_v1 *m,
|
3195
|
+
const upb_msglayout_fieldinit_v1 *f,
|
3196
|
+
bool is_proto3) {
|
3197
|
+
bool skip_zero_value = is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF;
|
3198
|
+
|
3199
|
+
#define CASE(ctype, type, wire_type, encodeval) do { \
|
3200
|
+
ctype val = *(ctype*)field_mem; \
|
3201
|
+
if (skip_zero_value && val == 0) { \
|
3202
|
+
return true; \
|
3203
|
+
} \
|
3204
|
+
return upb_put_ ## type(e, encodeval) && \
|
3205
|
+
upb_put_tag(e, f->number, wire_type); \
|
3206
|
+
} while(0)
|
3207
|
+
|
3208
|
+
switch (f->type) {
|
3209
|
+
case UPB_DESCRIPTOR_TYPE_DOUBLE:
|
3210
|
+
CASE(double, double, UPB_WIRE_TYPE_64BIT, val);
|
3211
|
+
case UPB_DESCRIPTOR_TYPE_FLOAT:
|
3212
|
+
CASE(float, float, UPB_WIRE_TYPE_32BIT, val);
|
3213
|
+
case UPB_DESCRIPTOR_TYPE_INT64:
|
3214
|
+
case UPB_DESCRIPTOR_TYPE_UINT64:
|
3215
|
+
CASE(uint64_t, varint, UPB_WIRE_TYPE_VARINT, val);
|
3216
|
+
case UPB_DESCRIPTOR_TYPE_UINT32:
|
3217
|
+
case UPB_DESCRIPTOR_TYPE_INT32:
|
3218
|
+
case UPB_DESCRIPTOR_TYPE_ENUM:
|
3219
|
+
CASE(uint32_t, varint, UPB_WIRE_TYPE_VARINT, val);
|
3220
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED64:
|
3221
|
+
case UPB_DESCRIPTOR_TYPE_FIXED64:
|
3222
|
+
CASE(uint64_t, fixed64, UPB_WIRE_TYPE_64BIT, val);
|
3223
|
+
case UPB_DESCRIPTOR_TYPE_FIXED32:
|
3224
|
+
case UPB_DESCRIPTOR_TYPE_SFIXED32:
|
3225
|
+
CASE(uint32_t, fixed32, UPB_WIRE_TYPE_32BIT, val);
|
3226
|
+
case UPB_DESCRIPTOR_TYPE_BOOL:
|
3227
|
+
CASE(bool, varint, UPB_WIRE_TYPE_VARINT, val);
|
3228
|
+
case UPB_DESCRIPTOR_TYPE_SINT32:
|
3229
|
+
CASE(int32_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_32(val));
|
3230
|
+
case UPB_DESCRIPTOR_TYPE_SINT64:
|
3231
|
+
CASE(int64_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_64(val));
|
3232
|
+
case UPB_DESCRIPTOR_TYPE_STRING:
|
3233
|
+
case UPB_DESCRIPTOR_TYPE_BYTES: {
|
3234
|
+
upb_stringview view = *(upb_stringview*)field_mem;
|
3235
|
+
if (skip_zero_value && view.size == 0) {
|
3236
|
+
return true;
|
3237
|
+
}
|
3238
|
+
return upb_put_bytes(e, view.data, view.size) &&
|
3239
|
+
upb_put_varint(e, view.size) &&
|
3240
|
+
upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED);
|
3241
|
+
}
|
3242
|
+
case UPB_DESCRIPTOR_TYPE_GROUP: {
|
3243
|
+
size_t size;
|
3244
|
+
void *submsg = *(void**)field_mem;
|
3245
|
+
const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
|
3246
|
+
if (skip_zero_value && submsg == NULL) {
|
3247
|
+
return true;
|
3248
|
+
}
|
3249
|
+
return upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
|
3250
|
+
upb_encode_message(e, submsg, subm, &size) &&
|
3251
|
+
upb_put_tag(e, f->number, UPB_WIRE_TYPE_START_GROUP);
|
3252
|
+
}
|
3253
|
+
case UPB_DESCRIPTOR_TYPE_MESSAGE: {
|
3254
|
+
size_t size;
|
3255
|
+
void *submsg = *(void**)field_mem;
|
3256
|
+
const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
|
3257
|
+
if (skip_zero_value && submsg == NULL) {
|
3258
|
+
return true;
|
3259
|
+
}
|
3260
|
+
return upb_encode_message(e, submsg, subm, &size) &&
|
3261
|
+
upb_put_varint(e, size) &&
|
3262
|
+
upb_put_tag(e, f->number, UPB_WIRE_TYPE_DELIMITED);
|
3263
|
+
}
|
3264
|
+
}
|
3265
|
+
#undef CASE
|
3266
|
+
UPB_UNREACHABLE();
|
3267
|
+
}
|
3268
|
+
|
3269
|
+
bool upb_encode_hasscalarfield(const char *msg,
|
3270
|
+
const upb_msglayout_msginit_v1 *m,
|
3271
|
+
const upb_msglayout_fieldinit_v1 *f) {
|
3272
|
+
if (f->oneof_index != UPB_NOT_IN_ONEOF) {
|
3273
|
+
return upb_readcase(msg, m, f->oneof_index) == f->number;
|
3274
|
+
} else if (m->is_proto2) {
|
3275
|
+
return upb_readhasbit(msg, f);
|
3276
|
+
} else {
|
3277
|
+
/* For proto3, we'll test for the field being empty later. */
|
3278
|
+
return true;
|
3279
|
+
}
|
3280
|
+
}
|
3281
|
+
|
3282
|
+
bool upb_encode_message(upb_encstate* e, const char *msg,
|
3283
|
+
const upb_msglayout_msginit_v1 *m,
|
3284
|
+
size_t *size) {
|
3285
|
+
int i;
|
3286
|
+
char *buf_end = e->ptr;
|
3287
|
+
|
3288
|
+
if (msg == NULL) {
|
3289
|
+
return true;
|
3290
|
+
}
|
3291
|
+
|
3292
|
+
for (i = m->field_count - 1; i >= 0; i--) {
|
3293
|
+
const upb_msglayout_fieldinit_v1 *f = &m->fields[i];
|
3294
|
+
|
3295
|
+
if (f->label == UPB_LABEL_REPEATED) {
|
3296
|
+
CHK(upb_encode_array(e, msg + f->offset, m, f));
|
3297
|
+
} else {
|
3298
|
+
if (upb_encode_hasscalarfield(msg, m, f)) {
|
3299
|
+
CHK(upb_encode_scalarfield(e, msg + f->offset, m, f, !m->is_proto2));
|
3300
|
+
}
|
3301
|
+
}
|
3302
|
+
}
|
3303
|
+
|
3304
|
+
*size = buf_end - e->ptr;
|
3305
|
+
return true;
|
3306
|
+
}
|
3307
|
+
|
3308
|
+
char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *m,
|
3309
|
+
upb_env *env, size_t *size) {
|
3310
|
+
upb_encstate e;
|
3311
|
+
e.env = env;
|
3312
|
+
e.buf = NULL;
|
3313
|
+
e.limit = NULL;
|
3314
|
+
e.ptr = NULL;
|
3315
|
+
|
3316
|
+
if (!upb_encode_message(&e, msg, m, size)) {
|
3317
|
+
*size = 0;
|
3318
|
+
return NULL;
|
3319
|
+
}
|
3320
|
+
|
3321
|
+
*size = e.limit - e.ptr;
|
3322
|
+
|
3323
|
+
if (*size == 0) {
|
3324
|
+
static char ch;
|
3325
|
+
return &ch;
|
3326
|
+
} else {
|
3327
|
+
UPB_ASSERT(e.ptr);
|
3328
|
+
return e.ptr;
|
3329
|
+
}
|
3330
|
+
}
|
3331
|
+
|
3332
|
+
#undef CHK
|
2359
3333
|
/*
|
2360
3334
|
** TODO(haberman): it's unclear whether a lot of the consistency checks should
|
2361
3335
|
** UPB_ASSERT() or return false.
|
@@ -2727,6 +3701,12 @@ SETTER(endseq, upb_endfield_handlerfunc*, UPB_HANDLER_ENDSEQ)
|
|
2727
3701
|
|
2728
3702
|
#undef SETTER
|
2729
3703
|
|
3704
|
+
bool upb_handlers_setunknown(upb_handlers *h, upb_unknown_handlerfunc *func,
|
3705
|
+
upb_handlerattr *attr) {
|
3706
|
+
return doset(h, UPB_UNKNOWN_SELECTOR, NULL, UPB_HANDLER_INT32,
|
3707
|
+
(upb_func *)func, attr);
|
3708
|
+
}
|
3709
|
+
|
2730
3710
|
bool upb_handlers_setstartmsg(upb_handlers *h, upb_startmsg_handlerfunc *func,
|
2731
3711
|
upb_handlerattr *attr) {
|
2732
3712
|
return doset(h, UPB_STARTMSG_SELECTOR, NULL, UPB_HANDLER_INT32,
|
@@ -3076,7 +4056,8 @@ bool upb_fieldtype_mapkeyok(upb_fieldtype_t type) {
|
|
3076
4056
|
void *upb_array_pack(const upb_array *arr, void *p, size_t *ofs, size_t size);
|
3077
4057
|
void *upb_map_pack(const upb_map *map, void *p, size_t *ofs, size_t size);
|
3078
4058
|
|
3079
|
-
#define
|
4059
|
+
#define PTR_AT(msg, ofs, type) (type*)((char*)msg + ofs)
|
4060
|
+
#define VOIDPTR_AT(msg, ofs) PTR_AT(msg, ofs, void)
|
3080
4061
|
#define ENCODE_MAX_NESTING 64
|
3081
4062
|
#define CHECK_TRUE(x) if (!(x)) { return false; }
|
3082
4063
|
|
@@ -3118,12 +4099,20 @@ static size_t upb_msgval_sizeof(upb_fieldtype_t type) {
|
|
3118
4099
|
case UPB_TYPE_MESSAGE:
|
3119
4100
|
return sizeof(void*);
|
3120
4101
|
case UPB_TYPE_STRING:
|
3121
|
-
return sizeof(
|
4102
|
+
return sizeof(upb_stringview);
|
3122
4103
|
}
|
3123
4104
|
UPB_UNREACHABLE();
|
3124
4105
|
}
|
3125
4106
|
|
3126
|
-
static uint8_t upb_msg_fieldsize(const
|
4107
|
+
static uint8_t upb_msg_fieldsize(const upb_msglayout_fieldinit_v1 *field) {
|
4108
|
+
if (field->label == UPB_LABEL_REPEATED) {
|
4109
|
+
return sizeof(void*);
|
4110
|
+
} else {
|
4111
|
+
return upb_msgval_sizeof(field->type);
|
4112
|
+
}
|
4113
|
+
}
|
4114
|
+
|
4115
|
+
static uint8_t upb_msg_fielddefsize(const upb_fielddef *f) {
|
3127
4116
|
if (upb_fielddef_isseq(f)) {
|
3128
4117
|
return sizeof(void*);
|
3129
4118
|
} else {
|
@@ -3167,7 +4156,6 @@ static upb_ctype_t upb_fieldtotabtype(upb_fieldtype_t type) {
|
|
3167
4156
|
}
|
3168
4157
|
|
3169
4158
|
static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
|
3170
|
-
/* TODO(haberman): improve/optimize this (maybe use upb_msgval in fielddef) */
|
3171
4159
|
switch (upb_fielddef_type(f)) {
|
3172
4160
|
case UPB_TYPE_FLOAT:
|
3173
4161
|
return upb_msgval_float(upb_fielddef_defaultfloat(f));
|
@@ -3179,7 +4167,7 @@ static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
|
|
3179
4167
|
case UPB_TYPE_BYTES: {
|
3180
4168
|
size_t len;
|
3181
4169
|
const char *ptr = upb_fielddef_defaultstr(f, &len);
|
3182
|
-
return
|
4170
|
+
return upb_msgval_makestr(ptr, len);
|
3183
4171
|
}
|
3184
4172
|
case UPB_TYPE_MESSAGE:
|
3185
4173
|
return upb_msgval_msg(NULL);
|
@@ -3202,63 +4190,44 @@ static upb_msgval upb_msgval_fromdefault(const upb_fielddef *f) {
|
|
3202
4190
|
/** upb_msglayout *************************************************************/
|
3203
4191
|
|
3204
4192
|
struct upb_msglayout {
|
3205
|
-
|
3206
|
-
const upb_msgdef *msgdef;
|
3207
|
-
size_t size;
|
3208
|
-
size_t extdict_offset;
|
3209
|
-
void *default_msg;
|
3210
|
-
uint32_t *field_offsets;
|
3211
|
-
uint32_t *case_offsets;
|
3212
|
-
uint32_t *hasbits;
|
3213
|
-
bool has_extdict;
|
3214
|
-
uint8_t align;
|
4193
|
+
struct upb_msglayout_msginit_v1 data;
|
3215
4194
|
};
|
3216
4195
|
|
3217
|
-
static void upb_msg_checkfield(const upb_msglayout *l, const upb_fielddef *f) {
|
3218
|
-
UPB_ASSERT(l->msgdef == upb_fielddef_containingtype(f));
|
3219
|
-
}
|
3220
|
-
|
3221
4196
|
static void upb_msglayout_free(upb_msglayout *l) {
|
3222
|
-
upb_gfree(l->default_msg);
|
4197
|
+
upb_gfree(l->data.default_msg);
|
3223
4198
|
upb_gfree(l);
|
3224
4199
|
}
|
3225
4200
|
|
3226
|
-
const upb_msgdef *upb_msglayout_msgdef(const upb_msglayout *l) {
|
3227
|
-
return l->msgdef;
|
3228
|
-
}
|
3229
|
-
|
3230
4201
|
static size_t upb_msglayout_place(upb_msglayout *l, size_t size) {
|
3231
4202
|
size_t ret;
|
3232
4203
|
|
3233
|
-
l->size = align_up(l->size, size);
|
3234
|
-
|
3235
|
-
|
3236
|
-
l->size += size;
|
4204
|
+
l->data.size = align_up(l->data.size, size);
|
4205
|
+
ret = l->data.size;
|
4206
|
+
l->data.size += size;
|
3237
4207
|
return ret;
|
3238
4208
|
}
|
3239
4209
|
|
3240
4210
|
static uint32_t upb_msglayout_offset(const upb_msglayout *l,
|
3241
4211
|
const upb_fielddef *f) {
|
3242
|
-
return l->
|
4212
|
+
return l->data.fields[upb_fielddef_index(f)].offset;
|
3243
4213
|
}
|
3244
4214
|
|
3245
4215
|
static uint32_t upb_msglayout_hasbit(const upb_msglayout *l,
|
3246
4216
|
const upb_fielddef *f) {
|
3247
|
-
return l->
|
4217
|
+
return l->data.fields[upb_fielddef_index(f)].hasbit;
|
3248
4218
|
}
|
3249
4219
|
|
3250
|
-
static bool upb_msglayout_initdefault(upb_msglayout *l) {
|
3251
|
-
const upb_msgdef *m = l->msgdef;
|
4220
|
+
static bool upb_msglayout_initdefault(upb_msglayout *l, const upb_msgdef *m) {
|
3252
4221
|
upb_msg_field_iter it;
|
3253
4222
|
|
3254
|
-
if (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2 && l->size) {
|
4223
|
+
if (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2 && l->data.size) {
|
3255
4224
|
/* Allocate default message and set default values in it. */
|
3256
|
-
l->default_msg = upb_gmalloc(l->size);
|
3257
|
-
if (!l->default_msg) {
|
4225
|
+
l->data.default_msg = upb_gmalloc(l->data.size);
|
4226
|
+
if (!l->data.default_msg) {
|
3258
4227
|
return false;
|
3259
4228
|
}
|
3260
4229
|
|
3261
|
-
memset(l->default_msg, 0, l->size);
|
4230
|
+
memset(l->data.default_msg, 0, l->data.size);
|
3262
4231
|
|
3263
4232
|
for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
|
3264
4233
|
upb_msg_field_next(&it)) {
|
@@ -3268,10 +4237,14 @@ static bool upb_msglayout_initdefault(upb_msglayout *l) {
|
|
3268
4237
|
continue;
|
3269
4238
|
}
|
3270
4239
|
|
4240
|
+
/* TODO(haberman): handle strings. */
|
3271
4241
|
if (!upb_fielddef_isstring(f) &&
|
3272
4242
|
!upb_fielddef_issubmsg(f) &&
|
3273
4243
|
!upb_fielddef_isseq(f)) {
|
3274
|
-
upb_msg_set(l->default_msg,
|
4244
|
+
upb_msg_set(l->data.default_msg,
|
4245
|
+
upb_fielddef_index(f),
|
4246
|
+
upb_msgval_fromdefault(f),
|
4247
|
+
l);
|
3275
4248
|
}
|
3276
4249
|
}
|
3277
4250
|
}
|
@@ -3284,22 +4257,46 @@ static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
|
|
3284
4257
|
upb_msg_oneof_iter oit;
|
3285
4258
|
upb_msglayout *l;
|
3286
4259
|
size_t hasbit;
|
3287
|
-
size_t
|
4260
|
+
size_t submsg_count = 0;
|
4261
|
+
const upb_msglayout_msginit_v1 **submsgs;
|
4262
|
+
upb_msglayout_fieldinit_v1 *fields;
|
4263
|
+
upb_msglayout_oneofinit_v1 *oneofs;
|
3288
4264
|
|
3289
|
-
|
3290
|
-
|
4265
|
+
for (upb_msg_field_begin(&it, m);
|
4266
|
+
!upb_msg_field_done(&it);
|
4267
|
+
upb_msg_field_next(&it)) {
|
4268
|
+
const upb_fielddef* f = upb_msg_iter_field(&it);
|
4269
|
+
if (upb_fielddef_issubmsg(f)) {
|
4270
|
+
submsg_count++;
|
4271
|
+
}
|
3291
4272
|
}
|
3292
4273
|
|
3293
|
-
l = upb_gmalloc(sizeof(*l)
|
4274
|
+
l = upb_gmalloc(sizeof(*l));
|
3294
4275
|
if (!l) return NULL;
|
3295
4276
|
|
3296
4277
|
memset(l, 0, sizeof(*l));
|
3297
4278
|
|
3298
|
-
|
3299
|
-
|
3300
|
-
|
3301
|
-
|
3302
|
-
|
4279
|
+
fields = upb_gmalloc(upb_msgdef_numfields(m) * sizeof(*fields));
|
4280
|
+
submsgs = upb_gmalloc(submsg_count * sizeof(*submsgs));
|
4281
|
+
oneofs = upb_gmalloc(upb_msgdef_numoneofs(m) * sizeof(*oneofs));
|
4282
|
+
|
4283
|
+
if ((!fields && upb_msgdef_numfields(m)) ||
|
4284
|
+
(!submsgs && submsg_count) ||
|
4285
|
+
(!oneofs && upb_msgdef_numoneofs(m))) {
|
4286
|
+
/* OOM. */
|
4287
|
+
upb_gfree(l);
|
4288
|
+
upb_gfree(fields);
|
4289
|
+
upb_gfree(submsgs);
|
4290
|
+
upb_gfree(oneofs);
|
4291
|
+
return NULL;
|
4292
|
+
}
|
4293
|
+
|
4294
|
+
l->data.field_count = upb_msgdef_numfields(m);
|
4295
|
+
l->data.oneof_count = upb_msgdef_numoneofs(m);
|
4296
|
+
l->data.fields = fields;
|
4297
|
+
l->data.submsgs = submsgs;
|
4298
|
+
l->data.oneofs = oneofs;
|
4299
|
+
l->data.is_proto2 = (upb_msgdef_syntax(m) == UPB_SYNTAX_PROTO2);
|
3303
4300
|
|
3304
4301
|
/* Allocate data offsets in three stages:
|
3305
4302
|
*
|
@@ -3310,74 +4307,75 @@ static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
|
|
3310
4307
|
* OPT: There is a lot of room for optimization here to minimize the size.
|
3311
4308
|
*/
|
3312
4309
|
|
3313
|
-
/* Allocate hasbits
|
3314
|
-
for (upb_msg_field_begin(&it, m), hasbit =
|
4310
|
+
/* Allocate hasbits and set basic field attributes. */
|
4311
|
+
for (upb_msg_field_begin(&it, m), hasbit = 0;
|
3315
4312
|
!upb_msg_field_done(&it);
|
3316
4313
|
upb_msg_field_next(&it)) {
|
3317
4314
|
const upb_fielddef* f = upb_msg_iter_field(&it);
|
4315
|
+
upb_msglayout_fieldinit_v1 *field = &fields[upb_fielddef_index(f)];
|
4316
|
+
|
4317
|
+
field->number = upb_fielddef_number(f);
|
4318
|
+
field->type = upb_fielddef_type(f);
|
4319
|
+
field->label = upb_fielddef_label(f);
|
4320
|
+
|
4321
|
+
if (upb_fielddef_containingoneof(f)) {
|
4322
|
+
field->oneof_index = upb_oneofdef_index(upb_fielddef_containingoneof(f));
|
4323
|
+
} else {
|
4324
|
+
field->oneof_index = UPB_NOT_IN_ONEOF;
|
4325
|
+
}
|
3318
4326
|
|
3319
4327
|
if (upb_fielddef_haspresence(f) && !upb_fielddef_containingoneof(f)) {
|
3320
|
-
|
4328
|
+
field->hasbit = hasbit++;
|
3321
4329
|
}
|
3322
4330
|
}
|
3323
4331
|
|
3324
4332
|
/* Account for space used by hasbits. */
|
3325
|
-
l->size = div_round_up(hasbit, 8);
|
4333
|
+
l->data.size = div_round_up(hasbit, 8);
|
3326
4334
|
|
3327
4335
|
/* Allocate non-oneof fields. */
|
3328
4336
|
for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
|
3329
4337
|
upb_msg_field_next(&it)) {
|
3330
4338
|
const upb_fielddef* f = upb_msg_iter_field(&it);
|
3331
|
-
size_t field_size =
|
4339
|
+
size_t field_size = upb_msg_fielddefsize(f);
|
3332
4340
|
size_t index = upb_fielddef_index(f);
|
3333
4341
|
|
3334
|
-
|
3335
4342
|
if (upb_fielddef_containingoneof(f)) {
|
3336
4343
|
/* Oneofs are handled separately below. */
|
3337
4344
|
continue;
|
3338
4345
|
}
|
3339
4346
|
|
3340
|
-
|
4347
|
+
fields[index].offset = upb_msglayout_place(l, field_size);
|
3341
4348
|
}
|
3342
4349
|
|
3343
4350
|
/* Allocate oneof fields. Each oneof field consists of a uint32 for the case
|
3344
4351
|
* and space for the actual data. */
|
3345
4352
|
for (upb_msg_oneof_begin(&oit, m); !upb_msg_oneof_done(&oit);
|
3346
4353
|
upb_msg_oneof_next(&oit)) {
|
3347
|
-
const upb_oneofdef*
|
4354
|
+
const upb_oneofdef* o = upb_msg_iter_oneof(&oit);
|
3348
4355
|
upb_oneof_iter fit;
|
4356
|
+
|
3349
4357
|
size_t case_size = sizeof(uint32_t); /* Could potentially optimize this. */
|
4358
|
+
upb_msglayout_oneofinit_v1 *oneof = &oneofs[upb_oneofdef_index(o)];
|
3350
4359
|
size_t field_size = 0;
|
3351
|
-
size_t case_offset;
|
3352
|
-
size_t val_offset;
|
3353
4360
|
|
3354
4361
|
/* Calculate field size: the max of all field sizes. */
|
3355
|
-
for (upb_oneof_begin(&fit,
|
4362
|
+
for (upb_oneof_begin(&fit, o);
|
3356
4363
|
!upb_oneof_done(&fit);
|
3357
4364
|
upb_oneof_next(&fit)) {
|
3358
4365
|
const upb_fielddef* f = upb_oneof_iter_field(&fit);
|
3359
|
-
field_size = UPB_MAX(field_size,
|
4366
|
+
field_size = UPB_MAX(field_size, upb_msg_fielddefsize(f));
|
3360
4367
|
}
|
3361
4368
|
|
3362
4369
|
/* Align and allocate case offset. */
|
3363
|
-
case_offset = upb_msglayout_place(l, case_size);
|
3364
|
-
|
3365
|
-
|
3366
|
-
l->case_offsets[upb_oneofdef_index(oneof)] = case_offset;
|
3367
|
-
|
3368
|
-
/* Assign all fields in the oneof this same offset. */
|
3369
|
-
for (upb_oneof_begin(&fit, oneof); !upb_oneof_done(&fit);
|
3370
|
-
upb_oneof_next(&fit)) {
|
3371
|
-
const upb_fielddef* f = upb_oneof_iter_field(&fit);
|
3372
|
-
l->field_offsets[upb_fielddef_index(f)] = val_offset;
|
3373
|
-
}
|
4370
|
+
oneof->case_offset = upb_msglayout_place(l, case_size);
|
4371
|
+
oneof->data_offset = upb_msglayout_place(l, field_size);
|
3374
4372
|
}
|
3375
4373
|
|
3376
4374
|
/* Size of the entire structure should be a multiple of its greatest
|
3377
|
-
* alignment. */
|
3378
|
-
l->size = align_up(l->size,
|
4375
|
+
* alignment. TODO: track overall alignment for real? */
|
4376
|
+
l->data.size = align_up(l->data.size, 8);
|
3379
4377
|
|
3380
|
-
if (upb_msglayout_initdefault(l)) {
|
4378
|
+
if (upb_msglayout_initdefault(l, m)) {
|
3381
4379
|
return l;
|
3382
4380
|
} else {
|
3383
4381
|
upb_msglayout_free(l);
|
@@ -3385,10 +4383,6 @@ static upb_msglayout *upb_msglayout_new(const upb_msgdef *m) {
|
|
3385
4383
|
}
|
3386
4384
|
}
|
3387
4385
|
|
3388
|
-
upb_msgfactory *upb_msglayout_factory(const upb_msglayout *layout) {
|
3389
|
-
return layout->factory;
|
3390
|
-
}
|
3391
|
-
|
3392
4386
|
|
3393
4387
|
/** upb_msgfactory ************************************************************/
|
3394
4388
|
|
@@ -3445,7 +4439,6 @@ const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
|
|
3445
4439
|
upb_msglayout *l = upb_msglayout_new(m);
|
3446
4440
|
upb_inttable_insertptr(&mutable_f->layouts, m, upb_value_ptr(l));
|
3447
4441
|
UPB_ASSERT(l);
|
3448
|
-
l->factory = f;
|
3449
4442
|
return l;
|
3450
4443
|
}
|
3451
4444
|
}
|
@@ -3454,16 +4447,15 @@ const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f,
|
|
3454
4447
|
|
3455
4448
|
void *upb_msg_startstr(void *msg, const void *hd, size_t size_hint) {
|
3456
4449
|
uint32_t ofs = (uintptr_t)hd;
|
3457
|
-
|
3458
|
-
upb_alloc *alloc = upb_msg_alloc(msg, NULL);
|
4450
|
+
upb_alloc *alloc = upb_msg_alloc(msg);
|
3459
4451
|
upb_msgval val;
|
3460
4452
|
UPB_UNUSED(size_hint);
|
3461
4453
|
|
3462
4454
|
val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
|
3463
4455
|
|
3464
|
-
upb_free(alloc, (void*)val.str.
|
3465
|
-
val.str.
|
3466
|
-
val.str.
|
4456
|
+
upb_free(alloc, (void*)val.str.data);
|
4457
|
+
val.str.data = NULL;
|
4458
|
+
val.str.size = 0;
|
3467
4459
|
|
3468
4460
|
upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
|
3469
4461
|
return msg;
|
@@ -3472,23 +4464,22 @@ void *upb_msg_startstr(void *msg, const void *hd, size_t size_hint) {
|
|
3472
4464
|
size_t upb_msg_str(void *msg, const void *hd, const char *ptr, size_t size,
|
3473
4465
|
const upb_bufhandle *handle) {
|
3474
4466
|
uint32_t ofs = (uintptr_t)hd;
|
3475
|
-
|
3476
|
-
upb_alloc *alloc = upb_msg_alloc(msg, NULL);
|
4467
|
+
upb_alloc *alloc = upb_msg_alloc(msg);
|
3477
4468
|
upb_msgval val;
|
3478
4469
|
size_t newsize;
|
3479
4470
|
UPB_UNUSED(handle);
|
3480
4471
|
|
3481
4472
|
val = upb_msgval_read(msg, ofs, upb_msgval_sizeof(UPB_TYPE_STRING));
|
3482
4473
|
|
3483
|
-
newsize = val.str.
|
3484
|
-
val.str.
|
4474
|
+
newsize = val.str.size + size;
|
4475
|
+
val.str.data = upb_realloc(alloc, (void*)val.str.data, val.str.size, newsize);
|
3485
4476
|
|
3486
|
-
if (!val.str.
|
4477
|
+
if (!val.str.data) {
|
3487
4478
|
return false;
|
3488
4479
|
}
|
3489
4480
|
|
3490
|
-
memcpy((char*)val.str.
|
3491
|
-
val.str.
|
4481
|
+
memcpy((char*)val.str.data + val.str.size, ptr, size);
|
4482
|
+
val.str.size = newsize;
|
3492
4483
|
upb_msgval_write(msg, ofs, val, upb_msgval_sizeof(UPB_TYPE_STRING));
|
3493
4484
|
return size;
|
3494
4485
|
}
|
@@ -3553,13 +4544,14 @@ static upb_selector_t getsel2(const upb_fielddef *f, upb_handlertype_t type) {
|
|
3553
4544
|
|
3554
4545
|
static bool upb_visitor_hasfield(const upb_msg *msg, const upb_fielddef *f,
|
3555
4546
|
const upb_msglayout *layout) {
|
4547
|
+
int field_index = upb_fielddef_index(f);
|
3556
4548
|
if (upb_fielddef_isseq(f)) {
|
3557
|
-
return upb_msgval_getarr(upb_msg_get(msg,
|
4549
|
+
return upb_msgval_getarr(upb_msg_get(msg, field_index, layout)) != NULL;
|
3558
4550
|
} else if (upb_msgdef_syntax(upb_fielddef_containingtype(f)) ==
|
3559
4551
|
UPB_SYNTAX_PROTO2) {
|
3560
|
-
return upb_msg_has(msg,
|
4552
|
+
return upb_msg_has(msg, field_index, layout);
|
3561
4553
|
} else {
|
3562
|
-
upb_msgval val = upb_msg_get(msg,
|
4554
|
+
upb_msgval val = upb_msg_get(msg, field_index, layout);
|
3563
4555
|
switch (upb_fielddef_type(f)) {
|
3564
4556
|
case UPB_TYPE_FLOAT:
|
3565
4557
|
return upb_msgval_getfloat(val) != 0;
|
@@ -3578,7 +4570,7 @@ static bool upb_visitor_hasfield(const upb_msg *msg, const upb_fielddef *f,
|
|
3578
4570
|
return upb_msgval_getuint64(val) != 0;
|
3579
4571
|
case UPB_TYPE_STRING:
|
3580
4572
|
case UPB_TYPE_BYTES:
|
3581
|
-
return upb_msgval_getstr(val)
|
4573
|
+
return upb_msgval_getstr(val).size > 0;
|
3582
4574
|
case UPB_TYPE_MESSAGE:
|
3583
4575
|
return upb_msgval_getmsg(val) != NULL;
|
3584
4576
|
}
|
@@ -3589,7 +4581,7 @@ static bool upb_visitor_hasfield(const upb_msg *msg, const upb_fielddef *f,
|
|
3589
4581
|
static bool upb_visitor_visitmsg2(const upb_msg *msg,
|
3590
4582
|
const upb_msglayout *layout, upb_sink *sink,
|
3591
4583
|
int depth) {
|
3592
|
-
const upb_msgdef *md =
|
4584
|
+
const upb_msgdef *md = upb_handlers_msgdef(sink->handlers);
|
3593
4585
|
upb_msg_field_iter i;
|
3594
4586
|
upb_status status;
|
3595
4587
|
|
@@ -3611,7 +4603,7 @@ static bool upb_visitor_visitmsg2(const upb_msg *msg,
|
|
3611
4603
|
continue;
|
3612
4604
|
}
|
3613
4605
|
|
3614
|
-
val = upb_msg_get(msg, f, layout);
|
4606
|
+
val = upb_msg_get(msg, upb_fielddef_index(f), layout);
|
3615
4607
|
|
3616
4608
|
if (upb_fielddef_isseq(f)) {
|
3617
4609
|
const upb_array *arr = upb_msgval_getarr(val);
|
@@ -3680,194 +4672,160 @@ bool upb_visitor_visitmsg(upb_visitor *visitor, const upb_msg *msg) {
|
|
3680
4672
|
/* If we always read/write as a consistent type to each address, this shouldn't
|
3681
4673
|
* violate aliasing.
|
3682
4674
|
*/
|
3683
|
-
#define DEREF(msg, ofs, type) *(
|
4675
|
+
#define DEREF(msg, ofs, type) *PTR_AT(msg, ofs, type)
|
3684
4676
|
|
3685
|
-
|
3686
|
-
|
3687
|
-
|
3688
|
-
}
|
3689
|
-
|
3690
|
-
static upb_inttable *upb_msg_getextdict(upb_msg *msg,
|
3691
|
-
const upb_msglayout *l,
|
3692
|
-
upb_alloc *a) {
|
3693
|
-
upb_inttable *ext_dict;
|
3694
|
-
UPB_ASSERT(l->has_extdict);
|
4677
|
+
/* Internal members of a upb_msg. We can change this without breaking binary
|
4678
|
+
* compatibility. We put these before the user's data. The user's upb_msg*
|
4679
|
+
* points after the upb_msg_internal. */
|
3695
4680
|
|
3696
|
-
|
4681
|
+
/* Used when a message is not extendable. */
|
4682
|
+
typedef struct {
|
4683
|
+
/* TODO(haberman): add unknown fields. */
|
4684
|
+
upb_alloc *alloc;
|
4685
|
+
} upb_msg_internal;
|
3697
4686
|
|
3698
|
-
|
3699
|
-
|
4687
|
+
/* Used when a message is extendable. */
|
4688
|
+
typedef struct {
|
4689
|
+
upb_inttable *extdict;
|
4690
|
+
upb_msg_internal base;
|
4691
|
+
} upb_msg_internal_withext;
|
3700
4692
|
|
3701
|
-
|
3702
|
-
|
3703
|
-
|
4693
|
+
static int upb_msg_internalsize(const upb_msglayout *l) {
|
4694
|
+
return sizeof(upb_msg_internal) - l->data.extendable * sizeof(void*);
|
4695
|
+
}
|
3704
4696
|
|
3705
|
-
|
3706
|
-
|
3707
|
-
|
3708
|
-
return NULL;
|
3709
|
-
}
|
4697
|
+
static upb_msg_internal *upb_msg_getinternal(upb_msg *msg) {
|
4698
|
+
return VOIDPTR_AT(msg, -sizeof(upb_msg_internal));
|
4699
|
+
}
|
3710
4700
|
|
3711
|
-
|
3712
|
-
|
4701
|
+
static const upb_msg_internal *upb_msg_getinternal_const(const upb_msg *msg) {
|
4702
|
+
return VOIDPTR_AT(msg, -sizeof(upb_msg_internal));
|
4703
|
+
}
|
3713
4704
|
|
3714
|
-
|
4705
|
+
static upb_msg_internal_withext *upb_msg_getinternalwithext(
|
4706
|
+
upb_msg *msg, const upb_msglayout *l) {
|
4707
|
+
UPB_ASSERT(l->data.extendable);
|
4708
|
+
return VOIDPTR_AT(msg, -sizeof(upb_msg_internal_withext));
|
3715
4709
|
}
|
3716
4710
|
|
3717
|
-
static
|
3718
|
-
|
3719
|
-
|
3720
|
-
|
3721
|
-
return DEREF(msg, oneof_ofs, uint8_t);
|
4711
|
+
static const upb_msglayout_fieldinit_v1 *upb_msg_checkfield(
|
4712
|
+
int field_index, const upb_msglayout *l) {
|
4713
|
+
UPB_ASSERT(field_index >= 0 && field_index < l->data.field_count);
|
4714
|
+
return &l->data.fields[field_index];
|
3722
4715
|
}
|
3723
4716
|
|
3724
|
-
static
|
3725
|
-
|
3726
|
-
const upb_msglayout *l,
|
3727
|
-
uint32_t val) {
|
3728
|
-
size_t oneof_ofs = l->case_offsets[upb_oneofdef_index(o)];
|
3729
|
-
DEREF(msg, oneof_ofs, uint8_t) = val;
|
4717
|
+
static bool upb_msg_inoneof(const upb_msglayout_fieldinit_v1 *field) {
|
4718
|
+
return field->oneof_index != UPB_NOT_IN_ONEOF;
|
3730
4719
|
}
|
3731
4720
|
|
4721
|
+
static uint32_t *upb_msg_oneofcase(const upb_msg *msg, int field_index,
|
4722
|
+
const upb_msglayout *l) {
|
4723
|
+
const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
|
4724
|
+
UPB_ASSERT(upb_msg_inoneof(field));
|
4725
|
+
return PTR_AT(msg, l->data.oneofs[field->oneof_index].case_offset, uint32_t);
|
4726
|
+
}
|
3732
4727
|
|
3733
|
-
|
3734
|
-
|
3735
|
-
return upb_msg_getoneofint(msg, o, l) == upb_fielddef_number(f);
|
4728
|
+
size_t upb_msg_sizeof(const upb_msglayout *l) {
|
4729
|
+
return l->data.size + upb_msg_internalsize(l);
|
3736
4730
|
}
|
3737
4731
|
|
3738
|
-
|
4732
|
+
upb_msg *upb_msg_init(void *mem, const upb_msglayout *l, upb_alloc *a) {
|
4733
|
+
upb_msg *msg = VOIDPTR_AT(mem, upb_msg_internalsize(l));
|
3739
4734
|
|
3740
|
-
|
3741
|
-
if (l->default_msg) {
|
3742
|
-
memcpy(msg, l->default_msg, l->size);
|
4735
|
+
/* Initialize normal members. */
|
4736
|
+
if (l->data.default_msg) {
|
4737
|
+
memcpy(msg, l->data.default_msg, l->data.size);
|
3743
4738
|
} else {
|
3744
|
-
memset(msg, 0, l->size);
|
4739
|
+
memset(msg, 0, l->data.size);
|
3745
4740
|
}
|
3746
4741
|
|
3747
|
-
/*
|
3748
|
-
|
3749
|
-
}
|
4742
|
+
/* Initialize internal members. */
|
4743
|
+
upb_msg_getinternal(msg)->alloc = a;
|
3750
4744
|
|
3751
|
-
|
3752
|
-
|
3753
|
-
if (ext_dict) {
|
3754
|
-
upb_inttable_uninit2(ext_dict, upb_msg_alloc(msg, l));
|
4745
|
+
if (l->data.extendable) {
|
4746
|
+
upb_msg_getinternalwithext(msg, l)->extdict = NULL;
|
3755
4747
|
}
|
3756
|
-
}
|
3757
4748
|
|
3758
|
-
|
3759
|
-
|
4749
|
+
return msg;
|
4750
|
+
}
|
3760
4751
|
|
3761
|
-
|
3762
|
-
|
4752
|
+
void *upb_msg_uninit(upb_msg *msg, const upb_msglayout *l) {
|
4753
|
+
if (l->data.extendable) {
|
4754
|
+
upb_inttable *ext_dict = upb_msg_getinternalwithext(msg, l)->extdict;
|
4755
|
+
if (ext_dict) {
|
4756
|
+
upb_inttable_uninit2(ext_dict, upb_msg_alloc(msg));
|
4757
|
+
upb_free(upb_msg_alloc(msg), ext_dict);
|
4758
|
+
}
|
3763
4759
|
}
|
3764
4760
|
|
3765
|
-
return msg;
|
4761
|
+
return VOIDPTR_AT(msg, -upb_msg_internalsize(l));
|
4762
|
+
}
|
4763
|
+
|
4764
|
+
upb_msg *upb_msg_new(const upb_msglayout *l, upb_alloc *a) {
|
4765
|
+
void *mem = upb_malloc(a, upb_msg_sizeof(l));
|
4766
|
+
return mem ? upb_msg_init(mem, l, a) : NULL;
|
3766
4767
|
}
|
3767
4768
|
|
3768
4769
|
void upb_msg_free(upb_msg *msg, const upb_msglayout *l) {
|
3769
|
-
upb_msg_uninit(msg, l);
|
3770
|
-
upb_free(upb_msg_alloc(msg, l), msg);
|
4770
|
+
upb_free(upb_msg_alloc(msg), upb_msg_uninit(msg, l));
|
3771
4771
|
}
|
3772
4772
|
|
3773
|
-
upb_alloc *upb_msg_alloc(const upb_msg *msg
|
3774
|
-
|
3775
|
-
UPB_UNUSED(l);
|
3776
|
-
memcpy(&alloc, msg, sizeof(alloc));
|
3777
|
-
return alloc;
|
4773
|
+
upb_alloc *upb_msg_alloc(const upb_msg *msg) {
|
4774
|
+
return upb_msg_getinternal_const(msg)->alloc;
|
3778
4775
|
}
|
3779
4776
|
|
3780
4777
|
bool upb_msg_has(const upb_msg *msg,
|
3781
|
-
|
4778
|
+
int field_index,
|
3782
4779
|
const upb_msglayout *l) {
|
3783
|
-
const
|
3784
|
-
upb_msg_checkfield(l, f);
|
3785
|
-
UPB_ASSERT(upb_fielddef_haspresence(f));
|
4780
|
+
const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
|
3786
4781
|
|
3787
|
-
|
3788
|
-
|
3789
|
-
|
3790
|
-
upb_value v;
|
3791
|
-
return ext_dict != NULL &&
|
3792
|
-
upb_inttable_lookup32(ext_dict, upb_fielddef_number(f), &v);
|
3793
|
-
} else if ((o = upb_fielddef_containingoneof(f)) != NULL) {
|
4782
|
+
UPB_ASSERT(l->data.is_proto2);
|
4783
|
+
|
4784
|
+
if (upb_msg_inoneof(field)) {
|
3794
4785
|
/* Oneofs are set when the oneof number is set to this field. */
|
3795
|
-
return
|
4786
|
+
return *upb_msg_oneofcase(msg, field_index, l) == field->number;
|
3796
4787
|
} else {
|
3797
4788
|
/* Other fields are set when their hasbit is set. */
|
3798
|
-
uint32_t hasbit = l->
|
4789
|
+
uint32_t hasbit = l->data.fields[field_index].hasbit;
|
3799
4790
|
return DEREF(msg, hasbit / 8, char) | (1 << (hasbit % 8));
|
3800
4791
|
}
|
3801
4792
|
}
|
3802
4793
|
|
3803
|
-
upb_msgval upb_msg_get(const upb_msg *msg,
|
4794
|
+
upb_msgval upb_msg_get(const upb_msg *msg, int field_index,
|
3804
4795
|
const upb_msglayout *l) {
|
3805
|
-
upb_msg_checkfield(
|
4796
|
+
const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
|
4797
|
+
int size = upb_msg_fieldsize(field);
|
3806
4798
|
|
3807
|
-
if (
|
3808
|
-
|
3809
|
-
|
3810
|
-
|
3811
|
-
return upb_msgval_fromval(val);
|
4799
|
+
if (upb_msg_inoneof(field)) {
|
4800
|
+
if (*upb_msg_oneofcase(msg, field_index, l) == field->number) {
|
4801
|
+
size_t ofs = l->data.oneofs[field->oneof_index].data_offset;
|
4802
|
+
return upb_msgval_read(msg, ofs, size);
|
3812
4803
|
} else {
|
3813
|
-
|
4804
|
+
/* Return default. */
|
4805
|
+
return upb_msgval_read(l->data.default_msg, field->offset, size);
|
3814
4806
|
}
|
3815
4807
|
} else {
|
3816
|
-
|
3817
|
-
const upb_oneofdef *o = upb_fielddef_containingoneof(f);
|
3818
|
-
upb_msgval ret;
|
3819
|
-
|
3820
|
-
if (o && !upb_msg_oneofis(msg, l, o, f)) {
|
3821
|
-
/* Oneof defaults can't come from the message because the memory is reused
|
3822
|
-
* by all types in the oneof. */
|
3823
|
-
return upb_msgval_fromdefault(f);
|
3824
|
-
}
|
3825
|
-
|
3826
|
-
ret = upb_msgval_read(msg, ofs, upb_msg_fieldsize(f));
|
3827
|
-
return ret;
|
4808
|
+
return upb_msgval_read(msg, field->offset, size);
|
3828
4809
|
}
|
3829
4810
|
}
|
3830
4811
|
|
3831
|
-
|
3832
|
-
const upb_fielddef *f,
|
3833
|
-
upb_msgval val,
|
4812
|
+
void upb_msg_set(upb_msg *msg, int field_index, upb_msgval val,
|
3834
4813
|
const upb_msglayout *l) {
|
3835
|
-
|
3836
|
-
|
3837
|
-
|
3838
|
-
if (upb_fielddef_isextension(f)) {
|
3839
|
-
/* TODO(haberman): introduce table API that can do this in one call. */
|
3840
|
-
upb_inttable *ext = upb_msg_getextdict(msg, l, a);
|
3841
|
-
upb_value val2 = upb_toval(val);
|
3842
|
-
if (!upb_inttable_replace(ext, upb_fielddef_number(f), val2) &&
|
3843
|
-
!upb_inttable_insert2(ext, upb_fielddef_number(f), val2, a)) {
|
3844
|
-
return false;
|
3845
|
-
}
|
3846
|
-
} else {
|
3847
|
-
size_t ofs = l->field_offsets[upb_fielddef_index(f)];
|
3848
|
-
const upb_oneofdef *o = upb_fielddef_containingoneof(f);
|
4814
|
+
const upb_msglayout_fieldinit_v1 *field = upb_msg_checkfield(field_index, l);
|
4815
|
+
int size = upb_msg_fieldsize(field);
|
3849
4816
|
|
3850
|
-
|
3851
|
-
|
3852
|
-
|
3853
|
-
|
3854
|
-
|
4817
|
+
if (upb_msg_inoneof(field)) {
|
4818
|
+
size_t ofs = l->data.oneofs[field->oneof_index].data_offset;
|
4819
|
+
*upb_msg_oneofcase(msg, field_index, l) = field->number;
|
4820
|
+
upb_msgval_write(msg, ofs, val, size);
|
4821
|
+
} else {
|
4822
|
+
upb_msgval_write(msg, field->offset, val, size);
|
3855
4823
|
}
|
3856
|
-
return true;
|
3857
4824
|
}
|
3858
4825
|
|
3859
4826
|
|
3860
4827
|
/** upb_array *****************************************************************/
|
3861
4828
|
|
3862
|
-
struct upb_array {
|
3863
|
-
upb_fieldtype_t type;
|
3864
|
-
uint8_t element_size;
|
3865
|
-
void *data; /* Each element is element_size. */
|
3866
|
-
size_t len; /* Measured in elements. */
|
3867
|
-
size_t size; /* Measured in elements. */
|
3868
|
-
upb_alloc *alloc;
|
3869
|
-
};
|
3870
|
-
|
3871
4829
|
#define DEREF_ARR(arr, i, type) ((type*)arr->data)[i]
|
3872
4830
|
|
3873
4831
|
size_t upb_array_sizeof(upb_fieldtype_t type) {
|
@@ -3962,8 +4920,8 @@ static void upb_map_tokey(upb_fieldtype_t type, upb_msgval *key,
|
|
3962
4920
|
switch (type) {
|
3963
4921
|
case UPB_TYPE_STRING:
|
3964
4922
|
/* Point to string data of the input key. */
|
3965
|
-
*out_key = key->str.
|
3966
|
-
*out_len = key->str.
|
4923
|
+
*out_key = key->str.data;
|
4924
|
+
*out_len = key->str.size;
|
3967
4925
|
return;
|
3968
4926
|
case UPB_TYPE_BOOL:
|
3969
4927
|
case UPB_TYPE_INT32:
|
@@ -3988,7 +4946,7 @@ static upb_msgval upb_map_fromkey(upb_fieldtype_t type, const char *key,
|
|
3988
4946
|
size_t len) {
|
3989
4947
|
switch (type) {
|
3990
4948
|
case UPB_TYPE_STRING:
|
3991
|
-
return
|
4949
|
+
return upb_msgval_makestr(key, len);
|
3992
4950
|
case UPB_TYPE_BOOL:
|
3993
4951
|
case UPB_TYPE_INT32:
|
3994
4952
|
case UPB_TYPE_UINT32:
|
@@ -6448,138 +7406,138 @@ static upb_inttable reftables[268];
|
|
6448
7406
|
#endif
|
6449
7407
|
|
6450
7408
|
static const upb_msgdef msgs[22] = {
|
6451
|
-
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto",
|
6452
|
-
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange",
|
6453
|
-
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ReservedRange",
|
6454
|
-
UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto",
|
6455
|
-
UPB_MSGDEF_INIT("google.protobuf.EnumOptions",
|
6456
|
-
UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto",
|
6457
|
-
UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions",
|
6458
|
-
UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto",
|
6459
|
-
UPB_MSGDEF_INIT("google.protobuf.FieldOptions",
|
6460
|
-
UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto",
|
6461
|
-
UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet",
|
6462
|
-
UPB_MSGDEF_INIT("google.protobuf.FileOptions",
|
6463
|
-
UPB_MSGDEF_INIT("google.protobuf.MessageOptions",
|
6464
|
-
UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto",
|
6465
|
-
UPB_MSGDEF_INIT("google.protobuf.MethodOptions",
|
6466
|
-
UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto",
|
6467
|
-
UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto",
|
6468
|
-
UPB_MSGDEF_INIT("google.protobuf.ServiceOptions",
|
6469
|
-
UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo",
|
6470
|
-
UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location",
|
6471
|
-
UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption",
|
6472
|
-
UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart",
|
7409
|
+
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto", 41, 8, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[0], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[0]), false, UPB_SYNTAX_PROTO2, &reftables[0], &reftables[1]),
|
7410
|
+
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ExtensionRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[11], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[16]), false, UPB_SYNTAX_PROTO2, &reftables[2], &reftables[3]),
|
7411
|
+
UPB_MSGDEF_INIT("google.protobuf.DescriptorProto.ReservedRange", 5, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[14], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[20]), false, UPB_SYNTAX_PROTO2, &reftables[4], &reftables[5]),
|
7412
|
+
UPB_MSGDEF_INIT("google.protobuf.EnumDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[17], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[24]), false, UPB_SYNTAX_PROTO2, &reftables[6], &reftables[7]),
|
7413
|
+
UPB_MSGDEF_INIT("google.protobuf.EnumOptions", 9, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[0], &arrays[21], 4, 2), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[28]), false, UPB_SYNTAX_PROTO2, &reftables[8], &reftables[9]),
|
7414
|
+
UPB_MSGDEF_INIT("google.protobuf.EnumValueDescriptorProto", 9, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[25], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[32]), false, UPB_SYNTAX_PROTO2, &reftables[10], &reftables[11]),
|
7415
|
+
UPB_MSGDEF_INIT("google.protobuf.EnumValueOptions", 8, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[2], &arrays[29], 2, 1), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[36]), false, UPB_SYNTAX_PROTO2, &reftables[12], &reftables[13]),
|
7416
|
+
UPB_MSGDEF_INIT("google.protobuf.FieldDescriptorProto", 24, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[31], 11, 10), UPB_STRTABLE_INIT(10, 15, UPB_CTYPE_PTR, 4, &strentries[40]), false, UPB_SYNTAX_PROTO2, &reftables[14], &reftables[15]),
|
7417
|
+
UPB_MSGDEF_INIT("google.protobuf.FieldOptions", 13, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[4], &arrays[42], 11, 6), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[56]), false, UPB_SYNTAX_PROTO2, &reftables[16], &reftables[17]),
|
7418
|
+
UPB_MSGDEF_INIT("google.protobuf.FileDescriptorProto", 43, 6, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[53], 13, 12), UPB_STRTABLE_INIT(12, 15, UPB_CTYPE_PTR, 4, &strentries[72]), false, UPB_SYNTAX_PROTO2, &reftables[18], &reftables[19]),
|
7419
|
+
UPB_MSGDEF_INIT("google.protobuf.FileDescriptorSet", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[66], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[88]), false, UPB_SYNTAX_PROTO2, &reftables[20], &reftables[21]),
|
7420
|
+
UPB_MSGDEF_INIT("google.protobuf.FileOptions", 38, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[6], &arrays[68], 42, 17), UPB_STRTABLE_INIT(18, 31, UPB_CTYPE_PTR, 5, &strentries[92]), false, UPB_SYNTAX_PROTO2, &reftables[22], &reftables[23]),
|
7421
|
+
UPB_MSGDEF_INIT("google.protobuf.MessageOptions", 11, 1, UPB_INTTABLE_INIT(1, 1, UPB_CTYPE_PTR, 1, &intentries[8], &arrays[110], 8, 4), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[124]), false, UPB_SYNTAX_PROTO2, &reftables[24], &reftables[25]),
|
7422
|
+
UPB_MSGDEF_INIT("google.protobuf.MethodDescriptorProto", 16, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[118], 7, 6), UPB_STRTABLE_INIT(6, 7, UPB_CTYPE_PTR, 3, &strentries[132]), false, UPB_SYNTAX_PROTO2, &reftables[26], &reftables[27]),
|
7423
|
+
UPB_MSGDEF_INIT("google.protobuf.MethodOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[10], &arrays[125], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[140]), false, UPB_SYNTAX_PROTO2, &reftables[28], &reftables[29]),
|
7424
|
+
UPB_MSGDEF_INIT("google.protobuf.OneofDescriptorProto", 6, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[126], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[144]), false, UPB_SYNTAX_PROTO2, &reftables[30], &reftables[31]),
|
7425
|
+
UPB_MSGDEF_INIT("google.protobuf.ServiceDescriptorProto", 12, 2, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[128], 4, 3), UPB_STRTABLE_INIT(3, 3, UPB_CTYPE_PTR, 2, &strentries[148]), false, UPB_SYNTAX_PROTO2, &reftables[32], &reftables[33]),
|
7426
|
+
UPB_MSGDEF_INIT("google.protobuf.ServiceOptions", 8, 1, UPB_INTTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &intentries[14], &arrays[132], 1, 0), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[152]), false, UPB_SYNTAX_PROTO2, &reftables[34], &reftables[35]),
|
7427
|
+
UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo", 7, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[133], 2, 1), UPB_STRTABLE_INIT(1, 3, UPB_CTYPE_PTR, 2, &strentries[156]), false, UPB_SYNTAX_PROTO2, &reftables[36], &reftables[37]),
|
7428
|
+
UPB_MSGDEF_INIT("google.protobuf.SourceCodeInfo.Location", 20, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[135], 7, 5), UPB_STRTABLE_INIT(5, 7, UPB_CTYPE_PTR, 3, &strentries[160]), false, UPB_SYNTAX_PROTO2, &reftables[38], &reftables[39]),
|
7429
|
+
UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption", 19, 1, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[142], 9, 7), UPB_STRTABLE_INIT(7, 15, UPB_CTYPE_PTR, 4, &strentries[168]), false, UPB_SYNTAX_PROTO2, &reftables[40], &reftables[41]),
|
7430
|
+
UPB_MSGDEF_INIT("google.protobuf.UninterpretedOption.NamePart", 7, 0, UPB_INTTABLE_INIT(0, 0, UPB_CTYPE_PTR, 0, NULL, &arrays[151], 3, 2), UPB_STRTABLE_INIT(2, 3, UPB_CTYPE_PTR, 2, &strentries[184]), false, UPB_SYNTAX_PROTO2, &reftables[42], &reftables[43]),
|
6473
7431
|
};
|
6474
7432
|
|
6475
7433
|
static const upb_fielddef fields[107] = {
|
6476
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL,
|
6477
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL,
|
6478
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL,
|
6479
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[11], NULL,
|
6480
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "client_streaming", 5, &msgs[13], NULL,
|
6481
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "csharp_namespace", 37, &msgs[11], NULL,
|
6482
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[8], (const upb_def*)(&enums[2]),
|
6483
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[7], NULL,
|
6484
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[9], NULL,
|
6485
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[8], NULL,
|
6486
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[14], NULL,
|
6487
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[12], NULL,
|
6488
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 23, &msgs[11], NULL,
|
6489
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 1, &msgs[6], NULL,
|
6490
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[4], NULL,
|
6491
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[17], NULL,
|
6492
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[20], NULL,
|
6493
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[2], NULL,
|
6494
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL,
|
6495
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[9], (const upb_def*)(&msgs[3]),
|
6496
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[3]),
|
6497
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[7], NULL,
|
6498
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[7]),
|
6499
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[9], (const upb_def*)(&msgs[7]),
|
6500
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]),
|
6501
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[7]),
|
6502
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[10], (const upb_def*)(&msgs[9]),
|
6503
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[11], NULL,
|
6504
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[20], NULL,
|
6505
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[13], NULL,
|
6506
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[21], NULL,
|
6507
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[11], NULL,
|
6508
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[11], NULL,
|
6509
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[11], NULL,
|
6510
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[11], NULL,
|
6511
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[11], NULL,
|
6512
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_string_check_utf8", 27, &msgs[11], NULL,
|
6513
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "javanano_use_deprecated_package", 38, &msgs[11], NULL,
|
6514
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "json_name", 10, &msgs[7], NULL,
|
6515
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "jstype", 6, &msgs[8], (const upb_def*)(&enums[3]),
|
6516
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[7], (const upb_def*)(&enums[0]),
|
6517
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[8], NULL,
|
6518
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[19], NULL,
|
6519
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "leading_detached_comments", 6, &msgs[19], NULL,
|
6520
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[18], (const upb_def*)(&msgs[19]),
|
6521
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "map_entry", 7, &msgs[12], NULL,
|
6522
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[12], NULL,
|
6523
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]),
|
6524
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]),
|
6525
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]),
|
6526
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL,
|
6527
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL,
|
6528
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL,
|
6529
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL,
|
6530
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL,
|
6531
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL,
|
6532
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL,
|
6533
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL,
|
6534
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL,
|
6535
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL,
|
6536
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]),
|
6537
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL,
|
6538
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL,
|
6539
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL,
|
6540
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL,
|
6541
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]),
|
6542
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL,
|
6543
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]),
|
6544
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]),
|
6545
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]),
|
6546
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]),
|
6547
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]),
|
6548
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]),
|
6549
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]),
|
6550
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]),
|
6551
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL,
|
6552
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL,
|
6553
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL,
|
6554
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL,
|
6555
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_class_prefix", 40, &msgs[11], NULL,
|
6556
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_namespace", 41, &msgs[11], NULL,
|
6557
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL,
|
6558
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL,
|
6559
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL,
|
6560
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL,
|
6561
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]),
|
6562
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL,
|
6563
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]),
|
6564
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]),
|
6565
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL,
|
6566
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL,
|
6567
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL,
|
6568
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL,
|
6569
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL,
|
6570
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL,
|
6571
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]),
|
6572
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL,
|
6573
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]),
|
6574
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]),
|
6575
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]),
|
6576
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]),
|
6577
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]),
|
6578
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]),
|
6579
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]),
|
6580
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]),
|
6581
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL,
|
6582
|
-
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL,
|
7434
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "aggregate_value", 8, &msgs[20], NULL, 16, 6, {0},&reftables[44], &reftables[45]),
|
7435
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "allow_alias", 2, &msgs[4], NULL, 7, 1, {0},&reftables[46], &reftables[47]),
|
7436
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_enable_arenas", 31, &msgs[11], NULL, 24, 12, {0},&reftables[48], &reftables[49]),
|
7437
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "cc_generic_services", 16, &msgs[11], NULL, 18, 6, {0},&reftables[50], &reftables[51]),
|
7438
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "client_streaming", 5, &msgs[13], NULL, 14, 4, {0},&reftables[52], &reftables[53]),
|
7439
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "csharp_namespace", 37, &msgs[11], NULL, 28, 14, {0},&reftables[54], &reftables[55]),
|
7440
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "ctype", 1, &msgs[8], (const upb_def*)(&enums[2]), 7, 1, {0},&reftables[56], &reftables[57]),
|
7441
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "default_value", 7, &msgs[7], NULL, 17, 7, {0},&reftables[58], &reftables[59]),
|
7442
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "dependency", 3, &msgs[9], NULL, 31, 8, {0},&reftables[60], &reftables[61]),
|
7443
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[8], NULL, 9, 3, {0},&reftables[62], &reftables[63]),
|
7444
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[14], NULL, 7, 1, {0},&reftables[64], &reftables[65]),
|
7445
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[12], NULL, 9, 3, {0},&reftables[66], &reftables[67]),
|
7446
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 23, &msgs[11], NULL, 22, 10, {0},&reftables[68], &reftables[69]),
|
7447
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 1, &msgs[6], NULL, 7, 1, {0},&reftables[70], &reftables[71]),
|
7448
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 3, &msgs[4], NULL, 8, 2, {0},&reftables[72], &reftables[73]),
|
7449
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "deprecated", 33, &msgs[17], NULL, 7, 1, {0},&reftables[74], &reftables[75]),
|
7450
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_DOUBLE, 0, false, false, false, false, "double_value", 6, &msgs[20], NULL, 12, 4, {0},&reftables[76], &reftables[77]),
|
7451
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[2], NULL, 4, 1, {0},&reftables[78], &reftables[79]),
|
7452
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "end", 2, &msgs[1], NULL, 4, 1, {0},&reftables[80], &reftables[81]),
|
7453
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 5, &msgs[9], (const upb_def*)(&msgs[3]), 14, 1, {0},&reftables[82], &reftables[83]),
|
7454
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "enum_type", 4, &msgs[0], (const upb_def*)(&msgs[3]), 19, 2, {0},&reftables[84], &reftables[85]),
|
7455
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "extendee", 2, &msgs[7], NULL, 8, 2, {0},&reftables[86], &reftables[87]),
|
7456
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 6, &msgs[0], (const upb_def*)(&msgs[7]), 25, 4, {0},&reftables[88], &reftables[89]),
|
7457
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension", 7, &msgs[9], (const upb_def*)(&msgs[7]), 20, 3, {0},&reftables[90], &reftables[91]),
|
7458
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "extension_range", 5, &msgs[0], (const upb_def*)(&msgs[1]), 22, 3, {0},&reftables[92], &reftables[93]),
|
7459
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "field", 2, &msgs[0], (const upb_def*)(&msgs[7]), 13, 0, {0},&reftables[94], &reftables[95]),
|
7460
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "file", 1, &msgs[10], (const upb_def*)(&msgs[9]), 6, 0, {0},&reftables[96], &reftables[97]),
|
7461
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "go_package", 11, &msgs[11], NULL, 15, 5, {0},&reftables[98], &reftables[99]),
|
7462
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "identifier_value", 3, &msgs[20], NULL, 7, 1, {0},&reftables[100], &reftables[101]),
|
7463
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "input_type", 2, &msgs[13], NULL, 8, 2, {0},&reftables[102], &reftables[103]),
|
7464
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_BOOL, 0, false, false, false, false, "is_extension", 2, &msgs[21], NULL, 6, 1, {0},&reftables[104], &reftables[105]),
|
7465
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generate_equals_and_hash", 20, &msgs[11], NULL, 21, 9, {0},&reftables[106], &reftables[107]),
|
7466
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_generic_services", 17, &msgs[11], NULL, 19, 7, {0},&reftables[108], &reftables[109]),
|
7467
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_multiple_files", 10, &msgs[11], NULL, 14, 4, {0},&reftables[110], &reftables[111]),
|
7468
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_outer_classname", 8, &msgs[11], NULL, 10, 2, {0},&reftables[112], &reftables[113]),
|
7469
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "java_package", 1, &msgs[11], NULL, 7, 1, {0},&reftables[114], &reftables[115]),
|
7470
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "java_string_check_utf8", 27, &msgs[11], NULL, 23, 11, {0},&reftables[116], &reftables[117]),
|
7471
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "javanano_use_deprecated_package", 38, &msgs[11], NULL, 31, 15, {0},&reftables[118], &reftables[119]),
|
7472
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "json_name", 10, &msgs[7], NULL, 21, 9, {0},&reftables[120], &reftables[121]),
|
7473
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "jstype", 6, &msgs[8], (const upb_def*)(&enums[3]), 11, 5, {0},&reftables[122], &reftables[123]),
|
7474
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "label", 4, &msgs[7], (const upb_def*)(&enums[0]), 12, 4, {0},&reftables[124], &reftables[125]),
|
7475
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "lazy", 5, &msgs[8], NULL, 10, 4, {0},&reftables[126], &reftables[127]),
|
7476
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "leading_comments", 3, &msgs[19], NULL, 9, 2, {0},&reftables[128], &reftables[129]),
|
7477
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "leading_detached_comments", 6, &msgs[19], NULL, 17, 4, {0},&reftables[130], &reftables[131]),
|
7478
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "location", 1, &msgs[18], (const upb_def*)(&msgs[19]), 6, 0, {0},&reftables[132], &reftables[133]),
|
7479
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "map_entry", 7, &msgs[12], NULL, 10, 4, {0},&reftables[134], &reftables[135]),
|
7480
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "message_set_wire_format", 1, &msgs[12], NULL, 7, 1, {0},&reftables[136], &reftables[137]),
|
7481
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "message_type", 4, &msgs[9], (const upb_def*)(&msgs[0]), 11, 0, {0},&reftables[138], &reftables[139]),
|
7482
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "method", 2, &msgs[16], (const upb_def*)(&msgs[13]), 7, 0, {0},&reftables[140], &reftables[141]),
|
7483
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "name", 2, &msgs[20], (const upb_def*)(&msgs[21]), 6, 0, {0},&reftables[142], &reftables[143]),
|
7484
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[5], NULL, 5, 1, {0},&reftables[144], &reftables[145]),
|
7485
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[9], NULL, 23, 6, {0},&reftables[146], &reftables[147]),
|
7486
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[3], NULL, 9, 2, {0},&reftables[148], &reftables[149]),
|
7487
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[16], NULL, 9, 2, {0},&reftables[150], &reftables[151]),
|
7488
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[15], NULL, 3, 0, {0},&reftables[152], &reftables[153]),
|
7489
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[13], NULL, 5, 1, {0},&reftables[154], &reftables[155]),
|
7490
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[7], NULL, 5, 1, {0},&reftables[156], &reftables[157]),
|
7491
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "name", 1, &msgs[0], NULL, 33, 8, {0},&reftables[158], &reftables[159]),
|
7492
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REQUIRED, UPB_TYPE_STRING, 0, false, false, false, false, "name_part", 1, &msgs[21], NULL, 3, 0, {0},&reftables[160], &reftables[161]),
|
7493
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT64, UPB_INTFMT_VARIABLE, false, false, false, false, "negative_int_value", 5, &msgs[20], NULL, 11, 3, {0},&reftables[162], &reftables[163]),
|
7494
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "nested_type", 3, &msgs[0], (const upb_def*)(&msgs[0]), 16, 1, {0},&reftables[164], &reftables[165]),
|
7495
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "no_standard_descriptor_accessor", 2, &msgs[12], NULL, 8, 2, {0},&reftables[166], &reftables[167]),
|
7496
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 3, &msgs[7], NULL, 11, 3, {0},&reftables[168], &reftables[169]),
|
7497
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "number", 2, &msgs[5], NULL, 8, 2, {0},&reftables[170], &reftables[171]),
|
7498
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "objc_class_prefix", 36, &msgs[11], NULL, 25, 13, {0},&reftables[172], &reftables[173]),
|
7499
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "oneof_decl", 8, &msgs[0], (const upb_def*)(&msgs[15]), 29, 6, {0},&reftables[174], &reftables[175]),
|
7500
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "oneof_index", 9, &msgs[7], NULL, 20, 8, {0},&reftables[176], &reftables[177]),
|
7501
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "optimize_for", 9, &msgs[11], (const upb_def*)(&enums[4]), 13, 3, {0},&reftables[178], &reftables[179]),
|
7502
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 7, &msgs[0], (const upb_def*)(&msgs[12]), 26, 5, {0},&reftables[180], &reftables[181]),
|
7503
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[9], (const upb_def*)(&msgs[11]), 21, 4, {0},&reftables[182], &reftables[183]),
|
7504
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 8, &msgs[7], (const upb_def*)(&msgs[8]), 4, 0, {0},&reftables[184], &reftables[185]),
|
7505
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 4, &msgs[13], (const upb_def*)(&msgs[14]), 4, 0, {0},&reftables[186], &reftables[187]),
|
7506
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[16], (const upb_def*)(&msgs[17]), 8, 1, {0},&reftables[188], &reftables[189]),
|
7507
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[3], (const upb_def*)(&msgs[4]), 8, 1, {0},&reftables[190], &reftables[191]),
|
7508
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "options", 3, &msgs[5], (const upb_def*)(&msgs[6]), 4, 0, {0},&reftables[192], &reftables[193]),
|
7509
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "output_type", 3, &msgs[13], NULL, 11, 3, {0},&reftables[194], &reftables[195]),
|
7510
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "package", 2, &msgs[9], NULL, 26, 7, {0},&reftables[196], &reftables[197]),
|
7511
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "packed", 2, &msgs[8], NULL, 8, 2, {0},&reftables[198], &reftables[199]),
|
7512
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "path", 1, &msgs[19], NULL, 5, 0, {0},&reftables[200], &reftables[201]),
|
7513
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_class_prefix", 40, &msgs[11], NULL, 32, 16, {0},&reftables[202], &reftables[203]),
|
7514
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "php_namespace", 41, &msgs[11], NULL, 35, 17, {0},&reftables[204], &reftables[205]),
|
7515
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_UINT64, UPB_INTFMT_VARIABLE, false, false, false, false, "positive_int_value", 4, &msgs[20], NULL, 10, 2, {0},&reftables[206], &reftables[207]),
|
7516
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "public_dependency", 10, &msgs[9], NULL, 36, 9, {0},&reftables[208], &reftables[209]),
|
7517
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "py_generic_services", 18, &msgs[11], NULL, 20, 8, {0},&reftables[210], &reftables[211]),
|
7518
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_STRING, 0, false, false, false, false, "reserved_name", 10, &msgs[0], NULL, 38, 9, {0},&reftables[212], &reftables[213]),
|
7519
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "reserved_range", 9, &msgs[0], (const upb_def*)(&msgs[2]), 32, 7, {0},&reftables[214], &reftables[215]),
|
7520
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "server_streaming", 6, &msgs[13], NULL, 15, 5, {0},&reftables[216], &reftables[217]),
|
7521
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "service", 6, &msgs[9], (const upb_def*)(&msgs[16]), 17, 2, {0},&reftables[218], &reftables[219]),
|
7522
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_MESSAGE, 0, false, false, false, false, "source_code_info", 9, &msgs[9], (const upb_def*)(&msgs[18]), 22, 5, {0},&reftables[220], &reftables[221]),
|
7523
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, true, "span", 2, &msgs[19], NULL, 8, 1, {0},&reftables[222], &reftables[223]),
|
7524
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[2], NULL, 3, 0, {0},&reftables[224], &reftables[225]),
|
7525
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "start", 1, &msgs[1], NULL, 3, 0, {0},&reftables[226], &reftables[227]),
|
7526
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BYTES, 0, false, false, false, false, "string_value", 7, &msgs[20], NULL, 13, 5, {0},&reftables[228], &reftables[229]),
|
7527
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "syntax", 12, &msgs[9], NULL, 40, 11, {0},&reftables[230], &reftables[231]),
|
7528
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "trailing_comments", 4, &msgs[19], NULL, 12, 3, {0},&reftables[232], &reftables[233]),
|
7529
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_ENUM, 0, false, false, false, false, "type", 5, &msgs[7], (const upb_def*)(&enums[1]), 13, 5, {0},&reftables[234], &reftables[235]),
|
7530
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_STRING, 0, false, false, false, false, "type_name", 6, &msgs[7], NULL, 14, 6, {0},&reftables[236], &reftables[237]),
|
7531
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[12], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[238], &reftables[239]),
|
7532
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[17], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[240], &reftables[241]),
|
7533
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[11], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[242], &reftables[243]),
|
7534
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[14], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[244], &reftables[245]),
|
7535
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[8], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[246], &reftables[247]),
|
7536
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[6], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[248], &reftables[249]),
|
7537
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "uninterpreted_option", 999, &msgs[4], (const upb_def*)(&msgs[20]), 6, 0, {0},&reftables[250], &reftables[251]),
|
7538
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_MESSAGE, 0, false, false, false, false, "value", 2, &msgs[3], (const upb_def*)(&msgs[5]), 7, 0, {0},&reftables[252], &reftables[253]),
|
7539
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_OPTIONAL, UPB_TYPE_BOOL, 0, false, false, false, false, "weak", 10, &msgs[8], NULL, 12, 6, {0},&reftables[254], &reftables[255]),
|
7540
|
+
UPB_FIELDDEF_INIT(UPB_LABEL_REPEATED, UPB_TYPE_INT32, UPB_INTFMT_VARIABLE, false, false, false, false, "weak_dependency", 11, &msgs[9], NULL, 39, 10, {0},&reftables[256], &reftables[257]),
|
6583
7541
|
};
|
6584
7542
|
|
6585
7543
|
static const upb_enumdef enums[5] = {
|
@@ -7398,6 +8356,7 @@ typedef struct {
|
|
7398
8356
|
struct upb_descreader {
|
7399
8357
|
upb_sink sink;
|
7400
8358
|
upb_inttable files;
|
8359
|
+
upb_strtable files_by_name;
|
7401
8360
|
upb_filedef *file; /* The last file in files. */
|
7402
8361
|
upb_descreader_frame stack[UPB_MAX_MESSAGE_NESTING];
|
7403
8362
|
int stack_len;
|
@@ -7564,6 +8523,7 @@ static size_t file_onname(void *closure, const void *hd, const char *buf,
|
|
7564
8523
|
UPB_UNUSED(handle);
|
7565
8524
|
|
7566
8525
|
name = upb_gstrndup(buf, n);
|
8526
|
+
upb_strtable_insert(&r->files_by_name, name, upb_value_ptr(r->file));
|
7567
8527
|
/* XXX: see comment at the top of the file. */
|
7568
8528
|
ok = upb_filedef_setname(r->file, name, NULL);
|
7569
8529
|
upb_gfree(name);
|
@@ -7587,6 +8547,18 @@ static size_t file_onpackage(void *closure, const void *hd, const char *buf,
|
|
7587
8547
|
return n;
|
7588
8548
|
}
|
7589
8549
|
|
8550
|
+
static void *file_startphpnamespace(void *closure, const void *hd,
|
8551
|
+
size_t size_hint) {
|
8552
|
+
upb_descreader *r = closure;
|
8553
|
+
bool ok;
|
8554
|
+
UPB_UNUSED(hd);
|
8555
|
+
UPB_UNUSED(size_hint);
|
8556
|
+
|
8557
|
+
ok = upb_filedef_setphpnamespace(r->file, "", NULL);
|
8558
|
+
UPB_ASSERT(ok);
|
8559
|
+
return closure;
|
8560
|
+
}
|
8561
|
+
|
7590
8562
|
static size_t file_onphpnamespace(void *closure, const void *hd,
|
7591
8563
|
const char *buf, size_t n,
|
7592
8564
|
const upb_bufhandle *handle) {
|
@@ -7665,6 +8637,18 @@ static void *file_startext(void *closure, const void *hd) {
|
|
7665
8637
|
return r;
|
7666
8638
|
}
|
7667
8639
|
|
8640
|
+
static size_t file_ondep(void *closure, const void *hd, const char *buf,
|
8641
|
+
size_t n, const upb_bufhandle *handle) {
|
8642
|
+
upb_descreader *r = closure;
|
8643
|
+
upb_value val;
|
8644
|
+
if (upb_strtable_lookup2(&r->files_by_name, buf, n, &val)) {
|
8645
|
+
upb_filedef_adddep(r->file, upb_value_getptr(val));
|
8646
|
+
}
|
8647
|
+
UPB_UNUSED(hd);
|
8648
|
+
UPB_UNUSED(handle);
|
8649
|
+
return n;
|
8650
|
+
}
|
8651
|
+
|
7668
8652
|
/** Handlers for google.protobuf.EnumValueDescriptorProto. *********************/
|
7669
8653
|
|
7670
8654
|
static bool enumval_startmsg(void *closure, const void *hd) {
|
@@ -8109,6 +9093,8 @@ static void reghandlers(const void *closure, upb_handlers *h) {
|
|
8109
9093
|
&file_startenum, NULL);
|
8110
9094
|
upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, extension),
|
8111
9095
|
&file_startext, NULL);
|
9096
|
+
upb_handlers_setstring(h, F(FileDescriptorProto, dependency),
|
9097
|
+
&file_ondep, NULL);
|
8112
9098
|
} else if (upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)) {
|
8113
9099
|
upb_handlers_setstartmsg(h, &enumval_startmsg, NULL);
|
8114
9100
|
upb_handlers_setendmsg(h, &enumval_endmsg, NULL);
|
@@ -8147,6 +9133,8 @@ static void reghandlers(const void *closure, upb_handlers *h) {
|
|
8147
9133
|
} else if (upbdefs_google_protobuf_FileOptions_is(m)) {
|
8148
9134
|
upb_handlers_setstring(h, F(FileOptions, php_class_prefix),
|
8149
9135
|
&file_onphpprefix, NULL);
|
9136
|
+
upb_handlers_setstartstr(h, F(FileOptions, php_namespace),
|
9137
|
+
&file_startphpnamespace, NULL);
|
8150
9138
|
upb_handlers_setstring(h, F(FileOptions, php_namespace),
|
8151
9139
|
&file_onphpnamespace, NULL);
|
8152
9140
|
}
|
@@ -8166,6 +9154,7 @@ void descreader_cleanup(void *_r) {
|
|
8166
9154
|
|
8167
9155
|
upb_gfree(r->name);
|
8168
9156
|
upb_inttable_uninit(&r->files);
|
9157
|
+
upb_strtable_uninit(&r->files_by_name);
|
8169
9158
|
upb_inttable_uninit(&r->oneofs);
|
8170
9159
|
upb_gfree(r->default_string);
|
8171
9160
|
while (r->stack_len > 0) {
|
@@ -8184,6 +9173,7 @@ upb_descreader *upb_descreader_create(upb_env *e, const upb_handlers *h) {
|
|
8184
9173
|
}
|
8185
9174
|
|
8186
9175
|
upb_inttable_init(&r->files, UPB_CTYPE_PTR);
|
9176
|
+
upb_strtable_init(&r->files_by_name, UPB_CTYPE_PTR);
|
8187
9177
|
upb_inttable_init(&r->oneofs, UPB_CTYPE_PTR);
|
8188
9178
|
upb_sink_reset(upb_descreader_input(r), h, r);
|
8189
9179
|
r->stack_len = 0;
|
@@ -8483,7 +9473,7 @@ static void put32(compiler *c, uint32_t v) {
|
|
8483
9473
|
*c->pc++ = v;
|
8484
9474
|
}
|
8485
9475
|
|
8486
|
-
static void putop(compiler *c,
|
9476
|
+
static void putop(compiler *c, int op, ...) {
|
8487
9477
|
va_list ap;
|
8488
9478
|
va_start(ap, op);
|
8489
9479
|
|
@@ -9766,7 +10756,6 @@ have_tag:
|
|
9766
10756
|
return upb_pbdecoder_suspend(d);
|
9767
10757
|
}
|
9768
10758
|
|
9769
|
-
/* TODO: deliver to unknown field callback. */
|
9770
10759
|
switch (wire_type) {
|
9771
10760
|
case UPB_WIRE_TYPE_32BIT:
|
9772
10761
|
CHECK_RETURN(skip(d, 4));
|
@@ -9804,6 +10793,8 @@ have_tag:
|
|
9804
10793
|
}
|
9805
10794
|
|
9806
10795
|
if (d->top->groupnum >= 0) {
|
10796
|
+
/* TODO: More code needed for handling unknown groups. */
|
10797
|
+
upb_sink_putunknown(&d->top->sink, d->checkpoint, d->ptr - d->checkpoint);
|
9807
10798
|
return DECODE_OK;
|
9808
10799
|
}
|
9809
10800
|
|
@@ -10659,6 +11650,12 @@ static void *encode_startdelimfield(void *c, const void *hd) {
|
|
10659
11650
|
return ok ? c : UPB_BREAK;
|
10660
11651
|
}
|
10661
11652
|
|
11653
|
+
static bool encode_unknown(void *c, const void *hd, const char *buf,
|
11654
|
+
size_t len) {
|
11655
|
+
UPB_UNUSED(hd);
|
11656
|
+
return encode_bytes(c, buf, len) && commit(c);
|
11657
|
+
}
|
11658
|
+
|
10662
11659
|
static bool encode_enddelimfield(void *c, const void *hd) {
|
10663
11660
|
UPB_UNUSED(hd);
|
10664
11661
|
return end_delim(c);
|
@@ -10721,6 +11718,7 @@ static void newhandlers_callback(const void *closure, upb_handlers *h) {
|
|
10721
11718
|
|
10722
11719
|
upb_handlers_setstartmsg(h, startmsg, NULL);
|
10723
11720
|
upb_handlers_setendmsg(h, endmsg, NULL);
|
11721
|
+
upb_handlers_setunknown(h, encode_unknown, NULL);
|
10724
11722
|
|
10725
11723
|
m = upb_handlers_msgdef(h);
|
10726
11724
|
for(upb_msg_field_begin(&i, m);
|
@@ -11930,15 +12928,21 @@ static bool end_number(upb_json_parser *p, const char *ptr) {
|
|
11930
12928
|
return parse_number(p, false);
|
11931
12929
|
}
|
11932
12930
|
|
12931
|
+
/* |buf| is NULL-terminated. |buf| itself will never include quotes;
|
12932
|
+
* |is_quoted| tells us whether this text originally appeared inside quotes. */
|
11933
12933
|
static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,
|
11934
|
-
|
11935
|
-
size_t len =
|
12934
|
+
bool is_quoted) {
|
12935
|
+
size_t len = strlen(buf);
|
12936
|
+
const char *bufend = buf + len;
|
11936
12937
|
char *end;
|
11937
12938
|
upb_fieldtype_t type = upb_fielddef_type(p->top->f);
|
11938
12939
|
double val;
|
11939
12940
|
double dummy;
|
12941
|
+
double inf = 1.0 / 0.0; /* C89 does not have an INFINITY macro. */
|
12942
|
+
|
12943
|
+
errno = 0;
|
11940
12944
|
|
11941
|
-
if (buf[0] == ' ') {
|
12945
|
+
if (len == 0 || buf[0] == ' ') {
|
11942
12946
|
return false;
|
11943
12947
|
}
|
11944
12948
|
|
@@ -11997,15 +13001,15 @@ static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,
|
|
11997
13001
|
}
|
11998
13002
|
|
11999
13003
|
if (type != UPB_TYPE_DOUBLE && type != UPB_TYPE_FLOAT && is_quoted) {
|
12000
|
-
/* Quoted numbers
|
13004
|
+
/* Quoted numbers for integer types are not allowed to be in double form. */
|
12001
13005
|
return false;
|
12002
13006
|
}
|
12003
13007
|
|
12004
13008
|
if (len == strlen("Infinity") && strcmp(buf, "Infinity") == 0) {
|
12005
13009
|
/* C89 does not have an INFINITY macro. */
|
12006
|
-
val =
|
13010
|
+
val = inf;
|
12007
13011
|
} else if (len == strlen("-Infinity") && strcmp(buf, "-Infinity") == 0) {
|
12008
|
-
val = -
|
13012
|
+
val = -inf;
|
12009
13013
|
} else {
|
12010
13014
|
val = strtod(buf, &end);
|
12011
13015
|
if (errno == ERANGE || end != bufend) {
|
@@ -12014,28 +13018,29 @@ static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,
|
|
12014
13018
|
}
|
12015
13019
|
|
12016
13020
|
switch (type) {
|
12017
|
-
#define CASE(capitaltype, smalltype, min, max)
|
13021
|
+
#define CASE(capitaltype, smalltype, ctype, min, max) \
|
12018
13022
|
case UPB_TYPE_ ## capitaltype: { \
|
12019
13023
|
if (modf(val, &dummy) != 0 || val > max || val < min) { \
|
12020
13024
|
return false; \
|
12021
13025
|
} else { \
|
12022
|
-
upb_sink_put ## smalltype(&p->top->sink, parser_getsel(p),
|
13026
|
+
upb_sink_put ## smalltype(&p->top->sink, parser_getsel(p), \
|
13027
|
+
(ctype)val); \
|
12023
13028
|
return true; \
|
12024
13029
|
} \
|
12025
13030
|
break; \
|
12026
13031
|
}
|
12027
13032
|
case UPB_TYPE_ENUM:
|
12028
|
-
CASE(INT32, int32, INT32_MIN, INT32_MAX);
|
12029
|
-
CASE(INT64, int64, INT64_MIN, INT64_MAX);
|
12030
|
-
CASE(UINT32, uint32, 0, UINT32_MAX);
|
12031
|
-
CASE(UINT64, uint64, 0, UINT64_MAX);
|
13033
|
+
CASE(INT32, int32, int32_t, INT32_MIN, INT32_MAX);
|
13034
|
+
CASE(INT64, int64, int64_t, INT64_MIN, INT64_MAX);
|
13035
|
+
CASE(UINT32, uint32, uint32_t, 0, UINT32_MAX);
|
13036
|
+
CASE(UINT64, uint64, uint64_t, 0, UINT64_MAX);
|
12032
13037
|
#undef CASE
|
12033
13038
|
|
12034
13039
|
case UPB_TYPE_DOUBLE:
|
12035
13040
|
upb_sink_putdouble(&p->top->sink, parser_getsel(p), val);
|
12036
13041
|
return true;
|
12037
13042
|
case UPB_TYPE_FLOAT:
|
12038
|
-
if (
|
13043
|
+
if ((val > FLT_MAX || val < -FLT_MAX) && val != inf && val != -inf) {
|
12039
13044
|
return false;
|
12040
13045
|
} else {
|
12041
13046
|
upb_sink_putfloat(&p->top->sink, parser_getsel(p), val);
|
@@ -12049,7 +13054,6 @@ static bool parse_number_from_buffer(upb_json_parser *p, const char *buf,
|
|
12049
13054
|
static bool parse_number(upb_json_parser *p, bool is_quoted) {
|
12050
13055
|
size_t len;
|
12051
13056
|
const char *buf;
|
12052
|
-
const char *bufend;
|
12053
13057
|
|
12054
13058
|
/* strtol() and friends unfortunately do not support specifying the length of
|
12055
13059
|
* the input string, so we need to force a copy into a NULL-terminated buffer. */
|
@@ -12058,10 +13062,8 @@ static bool parse_number(upb_json_parser *p, bool is_quoted) {
|
|
12058
13062
|
}
|
12059
13063
|
|
12060
13064
|
buf = accumulate_getptr(p, &len);
|
12061
|
-
bufend = buf + len - 1; /* One for NULL. */
|
12062
|
-
errno = 0;
|
12063
13065
|
|
12064
|
-
if (parse_number_from_buffer(p, buf,
|
13066
|
+
if (parse_number_from_buffer(p, buf, is_quoted)) {
|
12065
13067
|
multipart_end(p);
|
12066
13068
|
return true;
|
12067
13069
|
} else {
|
@@ -12521,11 +13523,11 @@ static void end_object(upb_json_parser *p) {
|
|
12521
13523
|
* final state once, when the closing '"' is seen. */
|
12522
13524
|
|
12523
13525
|
|
12524
|
-
#line
|
13526
|
+
#line 1310 "upb/json/parser.rl"
|
12525
13527
|
|
12526
13528
|
|
12527
13529
|
|
12528
|
-
#line
|
13530
|
+
#line 1222 "upb/json/parser.c"
|
12529
13531
|
static const char _json_actions[] = {
|
12530
13532
|
0, 1, 0, 1, 2, 1, 3, 1,
|
12531
13533
|
5, 1, 6, 1, 7, 1, 8, 1,
|
@@ -12674,7 +13676,7 @@ static const int json_en_value_machine = 27;
|
|
12674
13676
|
static const int json_en_main = 1;
|
12675
13677
|
|
12676
13678
|
|
12677
|
-
#line
|
13679
|
+
#line 1313 "upb/json/parser.rl"
|
12678
13680
|
|
12679
13681
|
size_t parse(void *closure, const void *hd, const char *buf, size_t size,
|
12680
13682
|
const upb_bufhandle *handle) {
|
@@ -12696,7 +13698,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size,
|
|
12696
13698
|
capture_resume(parser, buf);
|
12697
13699
|
|
12698
13700
|
|
12699
|
-
#line
|
13701
|
+
#line 1393 "upb/json/parser.c"
|
12700
13702
|
{
|
12701
13703
|
int _klen;
|
12702
13704
|
unsigned int _trans;
|
@@ -12771,118 +13773,118 @@ _match:
|
|
12771
13773
|
switch ( *_acts++ )
|
12772
13774
|
{
|
12773
13775
|
case 0:
|
12774
|
-
#line
|
13776
|
+
#line 1225 "upb/json/parser.rl"
|
12775
13777
|
{ p--; {cs = stack[--top]; goto _again;} }
|
12776
13778
|
break;
|
12777
13779
|
case 1:
|
12778
|
-
#line
|
13780
|
+
#line 1226 "upb/json/parser.rl"
|
12779
13781
|
{ p--; {stack[top++] = cs; cs = 10; goto _again;} }
|
12780
13782
|
break;
|
12781
13783
|
case 2:
|
12782
|
-
#line
|
13784
|
+
#line 1230 "upb/json/parser.rl"
|
12783
13785
|
{ start_text(parser, p); }
|
12784
13786
|
break;
|
12785
13787
|
case 3:
|
12786
|
-
#line
|
13788
|
+
#line 1231 "upb/json/parser.rl"
|
12787
13789
|
{ CHECK_RETURN_TOP(end_text(parser, p)); }
|
12788
13790
|
break;
|
12789
13791
|
case 4:
|
12790
|
-
#line
|
13792
|
+
#line 1237 "upb/json/parser.rl"
|
12791
13793
|
{ start_hex(parser); }
|
12792
13794
|
break;
|
12793
13795
|
case 5:
|
12794
|
-
#line
|
13796
|
+
#line 1238 "upb/json/parser.rl"
|
12795
13797
|
{ hexdigit(parser, p); }
|
12796
13798
|
break;
|
12797
13799
|
case 6:
|
12798
|
-
#line
|
13800
|
+
#line 1239 "upb/json/parser.rl"
|
12799
13801
|
{ CHECK_RETURN_TOP(end_hex(parser)); }
|
12800
13802
|
break;
|
12801
13803
|
case 7:
|
12802
|
-
#line
|
13804
|
+
#line 1245 "upb/json/parser.rl"
|
12803
13805
|
{ CHECK_RETURN_TOP(escape(parser, p)); }
|
12804
13806
|
break;
|
12805
13807
|
case 8:
|
12806
|
-
#line
|
13808
|
+
#line 1251 "upb/json/parser.rl"
|
12807
13809
|
{ p--; {cs = stack[--top]; goto _again;} }
|
12808
13810
|
break;
|
12809
13811
|
case 9:
|
12810
|
-
#line
|
13812
|
+
#line 1254 "upb/json/parser.rl"
|
12811
13813
|
{ {stack[top++] = cs; cs = 19; goto _again;} }
|
12812
13814
|
break;
|
12813
13815
|
case 10:
|
12814
|
-
#line
|
13816
|
+
#line 1256 "upb/json/parser.rl"
|
12815
13817
|
{ p--; {stack[top++] = cs; cs = 27; goto _again;} }
|
12816
13818
|
break;
|
12817
13819
|
case 11:
|
12818
|
-
#line
|
13820
|
+
#line 1261 "upb/json/parser.rl"
|
12819
13821
|
{ start_member(parser); }
|
12820
13822
|
break;
|
12821
13823
|
case 12:
|
12822
|
-
#line
|
13824
|
+
#line 1262 "upb/json/parser.rl"
|
12823
13825
|
{ CHECK_RETURN_TOP(end_membername(parser)); }
|
12824
13826
|
break;
|
12825
13827
|
case 13:
|
12826
|
-
#line
|
13828
|
+
#line 1265 "upb/json/parser.rl"
|
12827
13829
|
{ end_member(parser); }
|
12828
13830
|
break;
|
12829
13831
|
case 14:
|
12830
|
-
#line
|
13832
|
+
#line 1271 "upb/json/parser.rl"
|
12831
13833
|
{ start_object(parser); }
|
12832
13834
|
break;
|
12833
13835
|
case 15:
|
12834
|
-
#line
|
13836
|
+
#line 1274 "upb/json/parser.rl"
|
12835
13837
|
{ end_object(parser); }
|
12836
13838
|
break;
|
12837
13839
|
case 16:
|
12838
|
-
#line
|
13840
|
+
#line 1280 "upb/json/parser.rl"
|
12839
13841
|
{ CHECK_RETURN_TOP(start_array(parser)); }
|
12840
13842
|
break;
|
12841
13843
|
case 17:
|
12842
|
-
#line
|
13844
|
+
#line 1284 "upb/json/parser.rl"
|
12843
13845
|
{ end_array(parser); }
|
12844
13846
|
break;
|
12845
13847
|
case 18:
|
12846
|
-
#line
|
13848
|
+
#line 1289 "upb/json/parser.rl"
|
12847
13849
|
{ start_number(parser, p); }
|
12848
13850
|
break;
|
12849
13851
|
case 19:
|
12850
|
-
#line
|
13852
|
+
#line 1290 "upb/json/parser.rl"
|
12851
13853
|
{ CHECK_RETURN_TOP(end_number(parser, p)); }
|
12852
13854
|
break;
|
12853
13855
|
case 20:
|
12854
|
-
#line
|
13856
|
+
#line 1292 "upb/json/parser.rl"
|
12855
13857
|
{ CHECK_RETURN_TOP(start_stringval(parser)); }
|
12856
13858
|
break;
|
12857
13859
|
case 21:
|
12858
|
-
#line
|
13860
|
+
#line 1293 "upb/json/parser.rl"
|
12859
13861
|
{ CHECK_RETURN_TOP(end_stringval(parser)); }
|
12860
13862
|
break;
|
12861
13863
|
case 22:
|
12862
|
-
#line
|
13864
|
+
#line 1295 "upb/json/parser.rl"
|
12863
13865
|
{ CHECK_RETURN_TOP(parser_putbool(parser, true)); }
|
12864
13866
|
break;
|
12865
13867
|
case 23:
|
12866
|
-
#line
|
13868
|
+
#line 1297 "upb/json/parser.rl"
|
12867
13869
|
{ CHECK_RETURN_TOP(parser_putbool(parser, false)); }
|
12868
13870
|
break;
|
12869
13871
|
case 24:
|
12870
|
-
#line
|
13872
|
+
#line 1299 "upb/json/parser.rl"
|
12871
13873
|
{ /* null value */ }
|
12872
13874
|
break;
|
12873
13875
|
case 25:
|
12874
|
-
#line
|
13876
|
+
#line 1301 "upb/json/parser.rl"
|
12875
13877
|
{ CHECK_RETURN_TOP(start_subobject(parser)); }
|
12876
13878
|
break;
|
12877
13879
|
case 26:
|
12878
|
-
#line
|
13880
|
+
#line 1302 "upb/json/parser.rl"
|
12879
13881
|
{ end_subobject(parser); }
|
12880
13882
|
break;
|
12881
13883
|
case 27:
|
12882
|
-
#line
|
13884
|
+
#line 1307 "upb/json/parser.rl"
|
12883
13885
|
{ p--; {cs = stack[--top]; goto _again;} }
|
12884
13886
|
break;
|
12885
|
-
#line
|
13887
|
+
#line 1579 "upb/json/parser.c"
|
12886
13888
|
}
|
12887
13889
|
}
|
12888
13890
|
|
@@ -12895,7 +13897,7 @@ _again:
|
|
12895
13897
|
_out: {}
|
12896
13898
|
}
|
12897
13899
|
|
12898
|
-
#line
|
13900
|
+
#line 1334 "upb/json/parser.rl"
|
12899
13901
|
|
12900
13902
|
if (p != pe) {
|
12901
13903
|
upb_status_seterrf(&parser->status, "Parse error at '%.*s'\n", pe - p, p);
|
@@ -12936,13 +13938,13 @@ static void json_parser_reset(upb_json_parser *p) {
|
|
12936
13938
|
|
12937
13939
|
/* Emit Ragel initialization of the parser. */
|
12938
13940
|
|
12939
|
-
#line
|
13941
|
+
#line 1633 "upb/json/parser.c"
|
12940
13942
|
{
|
12941
13943
|
cs = json_start;
|
12942
13944
|
top = 0;
|
12943
13945
|
}
|
12944
13946
|
|
12945
|
-
#line
|
13947
|
+
#line 1374 "upb/json/parser.rl"
|
12946
13948
|
p->current_state = cs;
|
12947
13949
|
p->parser_top = top;
|
12948
13950
|
accumulate_clear(p);
|