google-protobuf 3.7.1 → 3.8.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of google-protobuf might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0cee1790668b2d4b8a846711bd1f2097a78d39492a9744e6fa1e813ef832075
4
- data.tar.gz: f50952e2bebb826351d2546cf05f0ae17a34e659a4e998031e0662bbb720c4ea
3
+ metadata.gz: d2e7a6ca9798b4ad725d81d0935dd61664226d9266763c5aef162ac95945e2df
4
+ data.tar.gz: 1a6532de1bbea70b0bc6f1642504c78345ec99fe6c6264dbf5cec761de36ddc8
5
5
  SHA512:
6
- metadata.gz: ffba3ebd2ae4d3f0033d835f8febe1709fcd95f247ad8b37a7ec114388458f7be4e22f34edcb647aa4367a1b7f2c815915a169e8e50ad2ba93b35bb1cf7efdcb
7
- data.tar.gz: 22155a410f501b5f2d5511391106e3d41088e4269f7cc4dbc569873855960e1621cbec12c66c3af226c9734791bd0f6e7404b16dc7a4687602bc5144d35333e7
6
+ metadata.gz: 6fc38a9ac78e8250de92a08d34cbbdf43fec10f7a2f87532d82ce29f9c5714f7c68eb6dda7616e5a56974d10f8bbe758d65ef3404aa3d60511c2d7d155b9672f
7
+ data.tar.gz: 18cf69356ae93720d97d229e966a8091ef8f8acb719cc0c2f191e265655787f232db817c26bf97e9735aa58d0336cef8b8f0ecd4f5405c2e0b7592b83b977eeb
@@ -886,7 +886,7 @@ VALUE FieldDescriptor_default_set(VALUE _self, VALUE default_value) {
886
886
  upb_fielddef* mut_def = check_field_notfrozen(self->fielddef);
887
887
 
888
888
  switch (upb_fielddef_type(mut_def)) {
889
- case UPB_TYPE_FLOAT:
889
+ case UPB_TYPE_FLOAT:
890
890
  upb_fielddef_setdefaultfloat(mut_def, NUM2DBL(default_value));
891
891
  break;
892
892
  case UPB_TYPE_DOUBLE:
@@ -902,16 +902,16 @@ VALUE FieldDescriptor_default_set(VALUE _self, VALUE default_value) {
902
902
  upb_fielddef_setdefaultbool(mut_def, RTEST(default_value));
903
903
  break;
904
904
  case UPB_TYPE_ENUM:
905
- case UPB_TYPE_INT32:
905
+ case UPB_TYPE_INT32:
906
906
  upb_fielddef_setdefaultint32(mut_def, NUM2INT(default_value));
907
907
  break;
908
- case UPB_TYPE_INT64:
908
+ case UPB_TYPE_INT64:
909
909
  upb_fielddef_setdefaultint64(mut_def, NUM2INT(default_value));
910
910
  break;
911
- case UPB_TYPE_UINT32:
911
+ case UPB_TYPE_UINT32:
912
912
  upb_fielddef_setdefaultuint32(mut_def, NUM2UINT(default_value));
913
913
  break;
914
- case UPB_TYPE_UINT64:
914
+ case UPB_TYPE_UINT64:
915
915
  upb_fielddef_setdefaultuint64(mut_def, NUM2UINT(default_value));
916
916
  break;
917
917
  case UPB_TYPE_STRING:
@@ -2085,7 +2085,7 @@ VALUE Builder_alloc(VALUE klass) {
2085
2085
 
2086
2086
  void Builder_register(VALUE module) {
2087
2087
  VALUE klass = rb_define_class_under(module, "Builder", rb_cObject);
2088
- rb_define_alloc_func(klass, Builder_alloc);
2088
+ rb_define_alloc_func(klass, Builder_alloc);
2089
2089
  rb_define_method(klass, "initialize", Builder_initialize, 0);
2090
2090
  rb_define_method(klass, "add_file", Builder_add_file, -1);
2091
2091
  rb_define_method(klass, "add_message", Builder_add_message, 1);
@@ -2230,7 +2230,7 @@ VALUE Builder_finalize_to_pool(VALUE _self, VALUE pool_rb) {
2230
2230
  VALUE def_rb = rb_ary_entry(self->pending_list, i);
2231
2231
  if (CLASS_OF(def_rb) == cDescriptor) {
2232
2232
  self->defs[i] = (upb_def*)ruby_to_Descriptor(def_rb)->msgdef;
2233
-
2233
+
2234
2234
  if (upb_filedef_syntax(upb_def_file(self->defs[i])) == UPB_SYNTAX_PROTO3) {
2235
2235
  proto3_validate_msgdef((const upb_msgdef*)self->defs[i]);
2236
2236
  }
@@ -386,6 +386,8 @@ VALUE Map_index(VALUE _self, VALUE key) {
386
386
  * was just inserted.
387
387
  */
388
388
  VALUE Map_index_set(VALUE _self, VALUE key, VALUE value) {
389
+ rb_check_frozen(_self);
390
+
389
391
  Map* self = ruby_to_Map(_self);
390
392
 
391
393
  char keybuf[TABLE_KEY_BUF_LENGTH];
@@ -438,6 +440,8 @@ VALUE Map_has_key(VALUE _self, VALUE key) {
438
440
  * nil if none was present. Throws an exception if the key is of the wrong type.
439
441
  */
440
442
  VALUE Map_delete(VALUE _self, VALUE key) {
443
+ rb_check_frozen(_self);
444
+
441
445
  Map* self = ruby_to_Map(_self);
442
446
 
443
447
  char keybuf[TABLE_KEY_BUF_LENGTH];
@@ -461,6 +465,8 @@ VALUE Map_delete(VALUE _self, VALUE key) {
461
465
  * Removes all entries from the map.
462
466
  */
463
467
  VALUE Map_clear(VALUE _self) {
468
+ rb_check_frozen(_self);
469
+
464
470
  Map* self = ruby_to_Map(_self);
465
471
 
466
472
  // Uninit and reinit the table -- this is faster than iterating and doing a
@@ -118,9 +118,38 @@ enum {
118
118
  METHOD_GETTER = 1,
119
119
  METHOD_SETTER = 2,
120
120
  METHOD_CLEAR = 3,
121
- METHOD_PRESENCE = 4
121
+ METHOD_PRESENCE = 4,
122
+ METHOD_ENUM_GETTER = 5,
123
+ METHOD_WRAPPER_GETTER = 6,
124
+ METHOD_WRAPPER_SETTER = 7
122
125
  };
123
126
 
127
+ // Check if the field is a well known wrapper type
128
+ static bool is_wrapper_type_field(const upb_fielddef* field) {
129
+ char* field_type_name = rb_class2name(field_type_class(field));
130
+
131
+ return strcmp(field_type_name, "Google::Protobuf::DoubleValue") == 0 ||
132
+ strcmp(field_type_name, "Google::Protobuf::FloatValue") == 0 ||
133
+ strcmp(field_type_name, "Google::Protobuf::Int32Value") == 0 ||
134
+ strcmp(field_type_name, "Google::Protobuf::Int64Value") == 0 ||
135
+ strcmp(field_type_name, "Google::Protobuf::UInt32Value") == 0 ||
136
+ strcmp(field_type_name, "Google::Protobuf::UInt64Value") == 0 ||
137
+ strcmp(field_type_name, "Google::Protobuf::BoolValue") == 0 ||
138
+ strcmp(field_type_name, "Google::Protobuf::StringValue") == 0 ||
139
+ strcmp(field_type_name, "Google::Protobuf::BytesValue") == 0;
140
+ }
141
+
142
+ // Get a new Ruby wrapper type and set the initial value
143
+ static VALUE ruby_wrapper_type(const upb_fielddef* field, const VALUE* value) {
144
+ if (is_wrapper_type_field(field) && value != Qnil) {
145
+ VALUE hash = rb_hash_new();
146
+ rb_hash_aset(hash, rb_str_new2("value"), value);
147
+ VALUE args[1] = { hash };
148
+ return rb_class_new_instance(1, args, field_type_class(field));
149
+ }
150
+ return Qnil;
151
+ }
152
+
124
153
  static int extract_method_call(VALUE method_name, MessageHeader* self,
125
154
  const upb_fielddef **f, const upb_oneofdef **o) {
126
155
  Check_Type(method_name, T_SYMBOL);
@@ -153,9 +182,62 @@ static int extract_method_call(VALUE method_name, MessageHeader* self,
153
182
  accessor_type = METHOD_GETTER;
154
183
  }
155
184
 
185
+ bool has_field = upb_msgdef_lookupname(self->descriptor->msgdef, name, name_len,
186
+ &test_f, &test_o);
187
+
188
+ // Look for wrapper type accessor of the form <field_name>_as_value
189
+ if (!has_field &&
190
+ (accessor_type == METHOD_GETTER || accessor_type == METHOD_SETTER) &&
191
+ name_len > 9 && strncmp(name + name_len - 9, "_as_value", 9) == 0) {
192
+ // Find the field name
193
+ char wrapper_field_name[name_len - 8];
194
+ strncpy(wrapper_field_name, name, name_len - 9);
195
+ wrapper_field_name[name_len - 7] = '\0';
196
+
197
+ // Check if field exists and is a wrapper type
198
+ const upb_oneofdef* test_o_wrapper;
199
+ const upb_fielddef* test_f_wrapper;
200
+ if (upb_msgdef_lookupname(self->descriptor->msgdef, wrapper_field_name, name_len - 9,
201
+ &test_f_wrapper, &test_o_wrapper) &&
202
+ upb_fielddef_type(test_f_wrapper) == UPB_TYPE_MESSAGE &&
203
+ is_wrapper_type_field(test_f_wrapper)) {
204
+ // It does exist!
205
+ has_field = true;
206
+ if (accessor_type == METHOD_SETTER) {
207
+ accessor_type = METHOD_WRAPPER_SETTER;
208
+ } else {
209
+ accessor_type = METHOD_WRAPPER_GETTER;
210
+ }
211
+ test_o = test_o_wrapper;
212
+ test_f = test_f_wrapper;
213
+ }
214
+ }
215
+
216
+ // Look for enum accessor of the form <enum_name>_const
217
+ if (!has_field && accessor_type == METHOD_GETTER &&
218
+ name_len > 6 && strncmp(name + name_len - 6, "_const", 6) == 0) {
219
+
220
+ // Find enum field name
221
+ char enum_name[name_len - 5];
222
+ strncpy(enum_name, name, name_len - 6);
223
+ enum_name[name_len - 4] = '\0';
224
+
225
+ // Check if enum field exists
226
+ const upb_oneofdef* test_o_enum;
227
+ const upb_fielddef* test_f_enum;
228
+ if (upb_msgdef_lookupname(self->descriptor->msgdef, enum_name, name_len - 6,
229
+ &test_f_enum, &test_o_enum) &&
230
+ upb_fielddef_type(test_f_enum) == UPB_TYPE_ENUM) {
231
+ // It does exist!
232
+ has_field = true;
233
+ accessor_type = METHOD_ENUM_GETTER;
234
+ test_o = test_o_enum;
235
+ test_f = test_f_enum;
236
+ }
237
+ }
238
+
156
239
  // Verify the name corresponds to a oneof or field in this message.
157
- if (!upb_msgdef_lookupname(self->descriptor->msgdef, name, name_len,
158
- &test_f, &test_o)) {
240
+ if (!has_field) {
159
241
  return METHOD_UNKNOWN;
160
242
  }
161
243
 
@@ -212,10 +294,11 @@ VALUE Message_method_missing(int argc, VALUE* argv, VALUE _self) {
212
294
  int accessor_type = extract_method_call(argv[0], self, &f, &o);
213
295
  if (accessor_type == METHOD_UNKNOWN || (o == NULL && f == NULL) ) {
214
296
  return rb_call_super(argc, argv);
215
- } else if (accessor_type == METHOD_SETTER) {
297
+ } else if (accessor_type == METHOD_SETTER || accessor_type == METHOD_WRAPPER_SETTER) {
216
298
  if (argc != 2) {
217
299
  rb_raise(rb_eArgError, "Expected 2 arguments, received %d", argc);
218
300
  }
301
+ rb_check_frozen(_self);
219
302
  } else if (argc != 1) {
220
303
  rb_raise(rb_eArgError, "Expected 1 argument, received %d", argc);
221
304
  }
@@ -231,13 +314,13 @@ VALUE Message_method_missing(int argc, VALUE* argv, VALUE _self) {
231
314
  return oneof_field == NULL ? Qfalse : Qtrue;
232
315
  } else if (accessor_type == METHOD_CLEAR) {
233
316
  if (oneof_field != NULL) {
234
- layout_clear(self->descriptor->layout, Message_data(self), oneof_field);
317
+ layout_clear(self->descriptor->layout, Message_data(self), oneof_field);
235
318
  }
236
319
  return Qnil;
237
320
  } else {
238
321
  // METHOD_ACCESSOR
239
322
  return oneof_field == NULL ? Qnil :
240
- ID2SYM(rb_intern(upb_fielddef_name(oneof_field)));
323
+ ID2SYM(rb_intern(upb_fielddef_name(oneof_field)));
241
324
  }
242
325
  // Otherwise we're operating on a single proto field
243
326
  } else if (accessor_type == METHOD_SETTER) {
@@ -248,6 +331,35 @@ VALUE Message_method_missing(int argc, VALUE* argv, VALUE _self) {
248
331
  return Qnil;
249
332
  } else if (accessor_type == METHOD_PRESENCE) {
250
333
  return layout_has(self->descriptor->layout, Message_data(self), f);
334
+ } else if (accessor_type == METHOD_WRAPPER_GETTER) {
335
+ VALUE value = layout_get(self->descriptor->layout, Message_data(self), f);
336
+ if (value != Qnil) {
337
+ value = rb_funcall(value, rb_intern("value"), 0);
338
+ }
339
+ return value;
340
+ } else if (accessor_type == METHOD_WRAPPER_SETTER) {
341
+ VALUE wrapper = ruby_wrapper_type(f, argv[1]);
342
+ layout_set(self->descriptor->layout, Message_data(self), f, wrapper);
343
+ return Qnil;
344
+ } else if (accessor_type == METHOD_ENUM_GETTER) {
345
+ VALUE enum_type = field_type_class(f);
346
+ VALUE method = rb_intern("const_get");
347
+ VALUE raw_value = layout_get(self->descriptor->layout, Message_data(self), f);
348
+
349
+ // Map repeated fields to a new type with ints
350
+ if (upb_fielddef_label(f) == UPB_LABEL_REPEATED) {
351
+ int array_size = FIX2INT(rb_funcall(raw_value, rb_intern("length"), 0));
352
+ VALUE array_args[1] = { ID2SYM(rb_intern("int64")) };
353
+ VALUE array = rb_class_new_instance(1, array_args, CLASS_OF(raw_value));
354
+ for (int i = 0; i < array_size; i++) {
355
+ VALUE entry = rb_funcall(enum_type, method, 1, rb_funcall(raw_value,
356
+ rb_intern("at"), 1, INT2NUM(i)));
357
+ rb_funcall(array, rb_intern("push"), 1, entry);
358
+ }
359
+ return array;
360
+ }
361
+ // Convert the value for singular fields
362
+ return rb_funcall(enum_type, method, 1, raw_value);
251
363
  } else {
252
364
  return layout_get(self->descriptor->layout, Message_data(self), f);
253
365
  }
@@ -622,10 +734,12 @@ VALUE build_class_from_descriptor(Descriptor* desc) {
622
734
  // Also define #clone so that we don't inherit Object#clone.
623
735
  rb_define_method(klass, "clone", Message_dup, 0);
624
736
  rb_define_method(klass, "==", Message_eq, 1);
737
+ rb_define_method(klass, "eql?", Message_eq, 1);
625
738
  rb_define_method(klass, "hash", Message_hash, 0);
626
739
  rb_define_method(klass, "to_h", Message_to_h, 0);
627
740
  rb_define_method(klass, "to_hash", Message_to_h, 0);
628
741
  rb_define_method(klass, "inspect", Message_inspect, 0);
742
+ rb_define_method(klass, "to_s", Message_inspect, 0);
629
743
  rb_define_method(klass, "[]", Message_index, 1);
630
744
  rb_define_method(klass, "[]=", Message_index_set, 2);
631
745
  rb_define_singleton_method(klass, "decode", Message_decode, 1);
@@ -223,6 +223,12 @@ VALUE RepeatedField_push(VALUE _self, VALUE val) {
223
223
  return _self;
224
224
  }
225
225
 
226
+ VALUE RepeatedField_push_vararg(VALUE _self, VALUE args) {
227
+ for (int i = 0; i < RARRAY_LEN(args); i++) {
228
+ RepeatedField_push(_self, rb_ary_entry(args, i));
229
+ }
230
+ return _self;
231
+ }
226
232
 
227
233
  // Used by parsing handlers.
228
234
  void RepeatedField_push_native(VALUE _self, void* data) {
@@ -635,7 +641,7 @@ void RepeatedField_register(VALUE module) {
635
641
  rb_define_method(klass, "[]", RepeatedField_index, -1);
636
642
  rb_define_method(klass, "at", RepeatedField_index, -1);
637
643
  rb_define_method(klass, "[]=", RepeatedField_index_set, 2);
638
- rb_define_method(klass, "push", RepeatedField_push, 1);
644
+ rb_define_method(klass, "push", RepeatedField_push_vararg, -2);
639
645
  rb_define_method(klass, "<<", RepeatedField_push, 1);
640
646
  rb_define_private_method(klass, "pop_one", RepeatedField_pop_one, 0);
641
647
  rb_define_method(klass, "replace", RepeatedField_replace, 1);
@@ -111,13 +111,13 @@ VALUE native_slot_encode_and_freeze_string(upb_fieldtype_t type, VALUE value) {
111
111
  return value;
112
112
  }
113
113
 
114
- void native_slot_set(const char* name,
114
+ void native_slot_set(const char* name,
115
115
  upb_fieldtype_t type, VALUE type_class,
116
116
  void* memory, VALUE value) {
117
117
  native_slot_set_value_and_case(name, type, type_class, memory, value, NULL, 0);
118
118
  }
119
119
 
120
- void native_slot_set_value_and_case(const char* name,
120
+ void native_slot_set_value_and_case(const char* name,
121
121
  upb_fieldtype_t type, VALUE type_class,
122
122
  void* memory, VALUE value,
123
123
  uint32_t* case_memory,
@@ -178,9 +178,39 @@ void native_slot_set_value_and_case(const char* name,
178
178
  if (CLASS_OF(value) == CLASS_OF(Qnil)) {
179
179
  value = Qnil;
180
180
  } else if (CLASS_OF(value) != type_class) {
181
- rb_raise(cTypeError,
182
- "Invalid type %s to assign to submessage field '%s'.",
183
- rb_class2name(CLASS_OF(value)), name);
181
+ // check for possible implicit conversions
182
+ VALUE converted_value = NULL;
183
+ char* field_type_name = rb_class2name(type_class);
184
+
185
+ if (strcmp(field_type_name, "Google::Protobuf::Timestamp") == 0 &&
186
+ rb_obj_is_kind_of(value, rb_cTime)) {
187
+ // Time -> Google::Protobuf::Timestamp
188
+ VALUE hash = rb_hash_new();
189
+ rb_hash_aset(hash, rb_str_new2("seconds"), rb_funcall(value, rb_intern("to_i"), 0));
190
+ rb_hash_aset(hash, rb_str_new2("nanos"), rb_funcall(value, rb_intern("nsec"), 0));
191
+ VALUE args[1] = { hash };
192
+ converted_value = rb_class_new_instance(1, args, type_class);
193
+ } else if (strcmp(field_type_name, "Google::Protobuf::Duration") == 0 &&
194
+ rb_obj_is_kind_of(value, rb_cNumeric)) {
195
+ // Numeric -> Google::Protobuf::Duration
196
+ VALUE hash = rb_hash_new();
197
+ rb_hash_aset(hash, rb_str_new2("seconds"), rb_funcall(value, rb_intern("to_i"), 0));
198
+ VALUE n_value = rb_funcall(value, rb_intern("remainder"), 1, INT2NUM(1));
199
+ n_value = rb_funcall(n_value, rb_intern("*"), 1, INT2NUM(1000000000));
200
+ n_value = rb_funcall(n_value, rb_intern("round"), 0);
201
+ rb_hash_aset(hash, rb_str_new2("nanos"), n_value);
202
+ VALUE args[1] = { hash };
203
+ converted_value = rb_class_new_instance(1, args, type_class);
204
+ }
205
+
206
+ // raise if no suitable conversaion could be found
207
+ if (converted_value == NULL) {
208
+ rb_raise(cTypeError,
209
+ "Invalid type %s to assign to submessage field '%s'.",
210
+ rb_class2name(CLASS_OF(value)), name);
211
+ } else {
212
+ value = converted_value;
213
+ }
184
214
  }
185
215
  DEREF(memory, VALUE) = value;
186
216
  break;
@@ -668,7 +698,7 @@ void layout_clear(MessageLayout* layout,
668
698
 
669
699
  DEREF(memory, VALUE) = ary;
670
700
  } else {
671
- native_slot_set(upb_fielddef_name(field),
701
+ native_slot_set(upb_fielddef_name(field),
672
702
  upb_fielddef_type(field), field_type_class(field),
673
703
  memory, layout_get_default(field));
674
704
  }
@@ -839,7 +869,7 @@ void layout_set(MessageLayout* layout,
839
869
  check_repeated_field_type(val, field);
840
870
  DEREF(memory, VALUE) = val;
841
871
  } else {
842
- native_slot_set(upb_fielddef_name(field),
872
+ native_slot_set(upb_fielddef_name(field),
843
873
  upb_fielddef_type(field), field_type_class(field),
844
874
  memory, val);
845
875
  }
@@ -12624,6 +12624,7 @@ done:
12624
12624
  ** - handling of keys/escape-sequences/etc that span input buffers.
12625
12625
  */
12626
12626
 
12627
+ #include <ctype.h>
12627
12628
  #include <errno.h>
12628
12629
  #include <float.h>
12629
12630
  #include <math.h>
@@ -12820,6 +12821,19 @@ typedef struct {
12820
12821
  bool is_unknown_field;
12821
12822
  } upb_jsonparser_frame;
12822
12823
 
12824
+ static void init_frame(upb_jsonparser_frame* frame) {
12825
+ frame->m = NULL;
12826
+ frame->f = NULL;
12827
+ frame->name_table = NULL;
12828
+ frame->is_repeated = false;
12829
+ frame->is_map = false;
12830
+ frame->is_mapentry = false;
12831
+ frame->mapfield = NULL;
12832
+ frame->is_any = false;
12833
+ frame->any_frame = NULL;
12834
+ frame->is_unknown_field = false;
12835
+ }
12836
+
12823
12837
  struct upb_json_parser {
12824
12838
  upb_env *env;
12825
12839
  const upb_json_parsermethod *method;
@@ -12867,6 +12881,13 @@ struct upb_json_parser {
12867
12881
  struct tm tm;
12868
12882
  };
12869
12883
 
12884
+ static upb_jsonparser_frame* start_jsonparser_frame(upb_json_parser *p) {
12885
+ upb_jsonparser_frame *inner;
12886
+ inner = p->top + 1;
12887
+ init_frame(inner);
12888
+ return inner;
12889
+ }
12890
+
12870
12891
  struct upb_json_parsermethod {
12871
12892
  upb_refcounted base;
12872
12893
 
@@ -13824,18 +13845,11 @@ static bool start_stringval(upb_json_parser *p) {
13824
13845
 
13825
13846
  /* Start a new parser frame: parser frames correspond one-to-one with
13826
13847
  * handler frames, and string events occur in a sub-frame. */
13827
- inner = p->top + 1;
13848
+ inner = start_jsonparser_frame(p);
13828
13849
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);
13829
13850
  upb_sink_startstr(&p->top->sink, sel, 0, &inner->sink);
13830
13851
  inner->m = p->top->m;
13831
13852
  inner->f = p->top->f;
13832
- inner->name_table = NULL;
13833
- inner->is_repeated = false;
13834
- inner->is_map = false;
13835
- inner->is_mapentry = false;
13836
- inner->is_any = false;
13837
- inner->any_frame = NULL;
13838
- inner->is_unknown_field = false;
13839
13853
  p->top = inner;
13840
13854
 
13841
13855
  if (upb_fielddef_type(p->top->f) == UPB_TYPE_STRING) {
@@ -14358,18 +14372,11 @@ static bool start_fieldmask_path(upb_json_parser *p) {
14358
14372
 
14359
14373
  /* Start a new parser frame: parser frames correspond one-to-one with
14360
14374
  * handler frames, and string events occur in a sub-frame. */
14361
- inner = p->top + 1;
14375
+ inner = start_jsonparser_frame(p);
14362
14376
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);
14363
14377
  upb_sink_startstr(&p->top->sink, sel, 0, &inner->sink);
14364
14378
  inner->m = p->top->m;
14365
14379
  inner->f = p->top->f;
14366
- inner->name_table = NULL;
14367
- inner->is_repeated = false;
14368
- inner->is_map = false;
14369
- inner->is_mapentry = false;
14370
- inner->is_any = false;
14371
- inner->any_frame = NULL;
14372
- inner->is_unknown_field = false;
14373
14380
  p->top = inner;
14374
14381
 
14375
14382
  multipart_startaccum(p);
@@ -14505,18 +14512,12 @@ static bool handle_mapentry(upb_json_parser *p) {
14505
14512
  mapfield = p->top->mapfield;
14506
14513
  mapentrymsg = upb_fielddef_msgsubdef(mapfield);
14507
14514
 
14508
- inner = p->top + 1;
14515
+ inner = start_jsonparser_frame(p);
14509
14516
  p->top->f = mapfield;
14510
14517
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
14511
14518
  upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
14512
14519
  inner->m = mapentrymsg;
14513
- inner->name_table = NULL;
14514
14520
  inner->mapfield = mapfield;
14515
- inner->is_repeated = false;
14516
- inner->is_map = false;
14517
- inner->is_any = false;
14518
- inner->any_frame = NULL;
14519
- inner->is_unknown_field = false;
14520
14521
 
14521
14522
  /* Don't set this to true *yet* -- we reuse parsing handlers below to push
14522
14523
  * the key field value to the sink, and these handlers will pop the frame
@@ -14634,16 +14635,7 @@ static bool start_subobject(upb_json_parser *p) {
14634
14635
  upb_jsonparser_frame *inner;
14635
14636
  if (!check_stack(p)) return false;
14636
14637
 
14637
- inner = p->top + 1;
14638
- inner->m = NULL;
14639
- inner->f = NULL;
14640
- inner->is_repeated = false;
14641
- inner->is_map = false;
14642
- inner->is_mapentry = false;
14643
- inner->is_any = false;
14644
- inner->any_frame = NULL;
14645
- inner->is_unknown_field = false;
14646
- p->top = inner;
14638
+ p->top = start_jsonparser_frame(p);
14647
14639
  return true;
14648
14640
  }
14649
14641
 
@@ -14655,19 +14647,12 @@ static bool start_subobject(upb_json_parser *p) {
14655
14647
  * context. */
14656
14648
  if (!check_stack(p)) return false;
14657
14649
 
14658
- inner = p->top + 1;
14650
+ inner = start_jsonparser_frame(p);
14659
14651
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
14660
14652
  upb_sink_startseq(&p->top->sink, sel, &inner->sink);
14661
14653
  inner->m = upb_fielddef_msgsubdef(p->top->f);
14662
- inner->name_table = NULL;
14663
14654
  inner->mapfield = p->top->f;
14664
- inner->f = NULL;
14665
- inner->is_repeated = false;
14666
14655
  inner->is_map = true;
14667
- inner->is_mapentry = false;
14668
- inner->is_any = false;
14669
- inner->any_frame = NULL;
14670
- inner->is_unknown_field = false;
14671
14656
  p->top = inner;
14672
14657
 
14673
14658
  return true;
@@ -14679,17 +14664,11 @@ static bool start_subobject(upb_json_parser *p) {
14679
14664
  * context. */
14680
14665
  if (!check_stack(p)) return false;
14681
14666
 
14682
- inner = p->top + 1;
14683
-
14667
+ inner = start_jsonparser_frame(p);
14684
14668
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
14685
14669
  upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
14686
14670
  inner->m = upb_fielddef_msgsubdef(p->top->f);
14687
14671
  set_name_table(p, inner);
14688
- inner->f = NULL;
14689
- inner->is_repeated = false;
14690
- inner->is_map = false;
14691
- inner->is_mapentry = false;
14692
- inner->is_unknown_field = false;
14693
14672
  p->top = inner;
14694
14673
 
14695
14674
  if (is_wellknown_msg(p, UPB_WELLKNOWN_ANY)) {
@@ -14804,15 +14783,7 @@ static bool start_array(upb_json_parser *p) {
14804
14783
  }
14805
14784
 
14806
14785
  if (p->top->is_unknown_field) {
14807
- inner = p->top + 1;
14808
- inner->m = NULL;
14809
- inner->name_table = NULL;
14810
- inner->f = NULL;
14811
- inner->is_repeated = false;
14812
- inner->is_map = false;
14813
- inner->is_mapentry = false;
14814
- inner->is_any = false;
14815
- inner->any_frame = NULL;
14786
+ inner = start_jsonparser_frame(p);
14816
14787
  inner->is_unknown_field = true;
14817
14788
  p->top = inner;
14818
14789
 
@@ -14829,18 +14800,12 @@ static bool start_array(upb_json_parser *p) {
14829
14800
 
14830
14801
  if (!check_stack(p)) return false;
14831
14802
 
14832
- inner = p->top + 1;
14803
+ inner = start_jsonparser_frame(p);
14833
14804
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
14834
14805
  upb_sink_startseq(&p->top->sink, sel, &inner->sink);
14835
14806
  inner->m = p->top->m;
14836
- inner->name_table = NULL;
14837
14807
  inner->f = p->top->f;
14838
14808
  inner->is_repeated = true;
14839
- inner->is_map = false;
14840
- inner->is_mapentry = false;
14841
- inner->is_any = false;
14842
- inner->any_frame = NULL;
14843
- inner->is_unknown_field = false;
14844
14809
  p->top = inner;
14845
14810
 
14846
14811
  return true;
@@ -15219,11 +15184,11 @@ static bool is_fieldmask_object(upb_json_parser *p) {
15219
15184
  * final state once, when the closing '"' is seen. */
15220
15185
 
15221
15186
 
15222
- #line 2824 "upb/json/parser.rl"
15187
+ #line 2789 "upb/json/parser.rl"
15223
15188
 
15224
15189
 
15225
15190
 
15226
- #line 2627 "upb/json/parser.c"
15191
+ #line 2592 "upb/json/parser.c"
15227
15192
  static const char _json_actions[] = {
15228
15193
  0, 1, 0, 1, 1, 1, 3, 1,
15229
15194
  4, 1, 6, 1, 7, 1, 8, 1,
@@ -15478,7 +15443,7 @@ static const int json_en_value_machine = 78;
15478
15443
  static const int json_en_main = 1;
15479
15444
 
15480
15445
 
15481
- #line 2827 "upb/json/parser.rl"
15446
+ #line 2792 "upb/json/parser.rl"
15482
15447
 
15483
15448
  size_t parse(void *closure, const void *hd, const char *buf, size_t size,
15484
15449
  const upb_bufhandle *handle) {
@@ -15501,7 +15466,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size,
15501
15466
  capture_resume(parser, buf);
15502
15467
 
15503
15468
 
15504
- #line 2905 "upb/json/parser.c"
15469
+ #line 2870 "upb/json/parser.c"
15505
15470
  {
15506
15471
  int _klen;
15507
15472
  unsigned int _trans;
@@ -15576,147 +15541,147 @@ _match:
15576
15541
  switch ( *_acts++ )
15577
15542
  {
15578
15543
  case 1:
15579
- #line 2632 "upb/json/parser.rl"
15544
+ #line 2597 "upb/json/parser.rl"
15580
15545
  { p--; {cs = stack[--top]; goto _again;} }
15581
15546
  break;
15582
15547
  case 2:
15583
- #line 2634 "upb/json/parser.rl"
15548
+ #line 2599 "upb/json/parser.rl"
15584
15549
  { p--; {stack[top++] = cs; cs = 23;goto _again;} }
15585
15550
  break;
15586
15551
  case 3:
15587
- #line 2638 "upb/json/parser.rl"
15552
+ #line 2603 "upb/json/parser.rl"
15588
15553
  { start_text(parser, p); }
15589
15554
  break;
15590
15555
  case 4:
15591
- #line 2639 "upb/json/parser.rl"
15556
+ #line 2604 "upb/json/parser.rl"
15592
15557
  { CHECK_RETURN_TOP(end_text(parser, p)); }
15593
15558
  break;
15594
15559
  case 5:
15595
- #line 2645 "upb/json/parser.rl"
15560
+ #line 2610 "upb/json/parser.rl"
15596
15561
  { start_hex(parser); }
15597
15562
  break;
15598
15563
  case 6:
15599
- #line 2646 "upb/json/parser.rl"
15564
+ #line 2611 "upb/json/parser.rl"
15600
15565
  { hexdigit(parser, p); }
15601
15566
  break;
15602
15567
  case 7:
15603
- #line 2647 "upb/json/parser.rl"
15568
+ #line 2612 "upb/json/parser.rl"
15604
15569
  { CHECK_RETURN_TOP(end_hex(parser)); }
15605
15570
  break;
15606
15571
  case 8:
15607
- #line 2653 "upb/json/parser.rl"
15572
+ #line 2618 "upb/json/parser.rl"
15608
15573
  { CHECK_RETURN_TOP(escape(parser, p)); }
15609
15574
  break;
15610
15575
  case 9:
15611
- #line 2659 "upb/json/parser.rl"
15576
+ #line 2624 "upb/json/parser.rl"
15612
15577
  { p--; {cs = stack[--top]; goto _again;} }
15613
15578
  break;
15614
15579
  case 10:
15615
- #line 2664 "upb/json/parser.rl"
15580
+ #line 2629 "upb/json/parser.rl"
15616
15581
  { start_year(parser, p); }
15617
15582
  break;
15618
15583
  case 11:
15619
- #line 2665 "upb/json/parser.rl"
15584
+ #line 2630 "upb/json/parser.rl"
15620
15585
  { CHECK_RETURN_TOP(end_year(parser, p)); }
15621
15586
  break;
15622
15587
  case 12:
15623
- #line 2669 "upb/json/parser.rl"
15588
+ #line 2634 "upb/json/parser.rl"
15624
15589
  { start_month(parser, p); }
15625
15590
  break;
15626
15591
  case 13:
15627
- #line 2670 "upb/json/parser.rl"
15592
+ #line 2635 "upb/json/parser.rl"
15628
15593
  { CHECK_RETURN_TOP(end_month(parser, p)); }
15629
15594
  break;
15630
15595
  case 14:
15631
- #line 2674 "upb/json/parser.rl"
15596
+ #line 2639 "upb/json/parser.rl"
15632
15597
  { start_day(parser, p); }
15633
15598
  break;
15634
15599
  case 15:
15635
- #line 2675 "upb/json/parser.rl"
15600
+ #line 2640 "upb/json/parser.rl"
15636
15601
  { CHECK_RETURN_TOP(end_day(parser, p)); }
15637
15602
  break;
15638
15603
  case 16:
15639
- #line 2679 "upb/json/parser.rl"
15604
+ #line 2644 "upb/json/parser.rl"
15640
15605
  { start_hour(parser, p); }
15641
15606
  break;
15642
15607
  case 17:
15643
- #line 2680 "upb/json/parser.rl"
15608
+ #line 2645 "upb/json/parser.rl"
15644
15609
  { CHECK_RETURN_TOP(end_hour(parser, p)); }
15645
15610
  break;
15646
15611
  case 18:
15647
- #line 2684 "upb/json/parser.rl"
15612
+ #line 2649 "upb/json/parser.rl"
15648
15613
  { start_minute(parser, p); }
15649
15614
  break;
15650
15615
  case 19:
15651
- #line 2685 "upb/json/parser.rl"
15616
+ #line 2650 "upb/json/parser.rl"
15652
15617
  { CHECK_RETURN_TOP(end_minute(parser, p)); }
15653
15618
  break;
15654
15619
  case 20:
15655
- #line 2689 "upb/json/parser.rl"
15620
+ #line 2654 "upb/json/parser.rl"
15656
15621
  { start_second(parser, p); }
15657
15622
  break;
15658
15623
  case 21:
15659
- #line 2690 "upb/json/parser.rl"
15624
+ #line 2655 "upb/json/parser.rl"
15660
15625
  { CHECK_RETURN_TOP(end_second(parser, p)); }
15661
15626
  break;
15662
15627
  case 22:
15663
- #line 2695 "upb/json/parser.rl"
15628
+ #line 2660 "upb/json/parser.rl"
15664
15629
  { start_duration_base(parser, p); }
15665
15630
  break;
15666
15631
  case 23:
15667
- #line 2696 "upb/json/parser.rl"
15632
+ #line 2661 "upb/json/parser.rl"
15668
15633
  { CHECK_RETURN_TOP(end_duration_base(parser, p)); }
15669
15634
  break;
15670
15635
  case 24:
15671
- #line 2698 "upb/json/parser.rl"
15636
+ #line 2663 "upb/json/parser.rl"
15672
15637
  { p--; {cs = stack[--top]; goto _again;} }
15673
15638
  break;
15674
15639
  case 25:
15675
- #line 2703 "upb/json/parser.rl"
15640
+ #line 2668 "upb/json/parser.rl"
15676
15641
  { start_timestamp_base(parser); }
15677
15642
  break;
15678
15643
  case 26:
15679
- #line 2705 "upb/json/parser.rl"
15644
+ #line 2670 "upb/json/parser.rl"
15680
15645
  { start_timestamp_fraction(parser, p); }
15681
15646
  break;
15682
15647
  case 27:
15683
- #line 2706 "upb/json/parser.rl"
15648
+ #line 2671 "upb/json/parser.rl"
15684
15649
  { CHECK_RETURN_TOP(end_timestamp_fraction(parser, p)); }
15685
15650
  break;
15686
15651
  case 28:
15687
- #line 2708 "upb/json/parser.rl"
15652
+ #line 2673 "upb/json/parser.rl"
15688
15653
  { start_timestamp_zone(parser, p); }
15689
15654
  break;
15690
15655
  case 29:
15691
- #line 2709 "upb/json/parser.rl"
15656
+ #line 2674 "upb/json/parser.rl"
15692
15657
  { CHECK_RETURN_TOP(end_timestamp_zone(parser, p)); }
15693
15658
  break;
15694
15659
  case 30:
15695
- #line 2711 "upb/json/parser.rl"
15660
+ #line 2676 "upb/json/parser.rl"
15696
15661
  { p--; {cs = stack[--top]; goto _again;} }
15697
15662
  break;
15698
15663
  case 31:
15699
- #line 2716 "upb/json/parser.rl"
15664
+ #line 2681 "upb/json/parser.rl"
15700
15665
  { start_fieldmask_path_text(parser, p); }
15701
15666
  break;
15702
15667
  case 32:
15703
- #line 2717 "upb/json/parser.rl"
15668
+ #line 2682 "upb/json/parser.rl"
15704
15669
  { end_fieldmask_path_text(parser, p); }
15705
15670
  break;
15706
15671
  case 33:
15707
- #line 2722 "upb/json/parser.rl"
15672
+ #line 2687 "upb/json/parser.rl"
15708
15673
  { start_fieldmask_path(parser); }
15709
15674
  break;
15710
15675
  case 34:
15711
- #line 2723 "upb/json/parser.rl"
15676
+ #line 2688 "upb/json/parser.rl"
15712
15677
  { end_fieldmask_path(parser); }
15713
15678
  break;
15714
15679
  case 35:
15715
- #line 2729 "upb/json/parser.rl"
15680
+ #line 2694 "upb/json/parser.rl"
15716
15681
  { p--; {cs = stack[--top]; goto _again;} }
15717
15682
  break;
15718
15683
  case 36:
15719
- #line 2734 "upb/json/parser.rl"
15684
+ #line 2699 "upb/json/parser.rl"
15720
15685
  {
15721
15686
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_TIMESTAMP)) {
15722
15687
  {stack[top++] = cs; cs = 47;goto _again;}
@@ -15730,11 +15695,11 @@ _match:
15730
15695
  }
15731
15696
  break;
15732
15697
  case 37:
15733
- #line 2747 "upb/json/parser.rl"
15698
+ #line 2712 "upb/json/parser.rl"
15734
15699
  { p--; {stack[top++] = cs; cs = 78;goto _again;} }
15735
15700
  break;
15736
15701
  case 38:
15737
- #line 2752 "upb/json/parser.rl"
15702
+ #line 2717 "upb/json/parser.rl"
15738
15703
  {
15739
15704
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15740
15705
  start_any_member(parser, p);
@@ -15744,11 +15709,11 @@ _match:
15744
15709
  }
15745
15710
  break;
15746
15711
  case 39:
15747
- #line 2759 "upb/json/parser.rl"
15712
+ #line 2724 "upb/json/parser.rl"
15748
15713
  { CHECK_RETURN_TOP(end_membername(parser)); }
15749
15714
  break;
15750
15715
  case 40:
15751
- #line 2762 "upb/json/parser.rl"
15716
+ #line 2727 "upb/json/parser.rl"
15752
15717
  {
15753
15718
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15754
15719
  end_any_member(parser, p);
@@ -15758,7 +15723,7 @@ _match:
15758
15723
  }
15759
15724
  break;
15760
15725
  case 41:
15761
- #line 2773 "upb/json/parser.rl"
15726
+ #line 2738 "upb/json/parser.rl"
15762
15727
  {
15763
15728
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15764
15729
  start_any_object(parser, p);
@@ -15768,7 +15733,7 @@ _match:
15768
15733
  }
15769
15734
  break;
15770
15735
  case 42:
15771
- #line 2782 "upb/json/parser.rl"
15736
+ #line 2747 "upb/json/parser.rl"
15772
15737
  {
15773
15738
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15774
15739
  CHECK_RETURN_TOP(end_any_object(parser, p));
@@ -15778,54 +15743,54 @@ _match:
15778
15743
  }
15779
15744
  break;
15780
15745
  case 43:
15781
- #line 2794 "upb/json/parser.rl"
15746
+ #line 2759 "upb/json/parser.rl"
15782
15747
  { CHECK_RETURN_TOP(start_array(parser)); }
15783
15748
  break;
15784
15749
  case 44:
15785
- #line 2798 "upb/json/parser.rl"
15750
+ #line 2763 "upb/json/parser.rl"
15786
15751
  { end_array(parser); }
15787
15752
  break;
15788
15753
  case 45:
15789
- #line 2803 "upb/json/parser.rl"
15754
+ #line 2768 "upb/json/parser.rl"
15790
15755
  { CHECK_RETURN_TOP(start_number(parser, p)); }
15791
15756
  break;
15792
15757
  case 46:
15793
- #line 2804 "upb/json/parser.rl"
15758
+ #line 2769 "upb/json/parser.rl"
15794
15759
  { CHECK_RETURN_TOP(end_number(parser, p)); }
15795
15760
  break;
15796
15761
  case 47:
15797
- #line 2806 "upb/json/parser.rl"
15762
+ #line 2771 "upb/json/parser.rl"
15798
15763
  { CHECK_RETURN_TOP(start_stringval(parser)); }
15799
15764
  break;
15800
15765
  case 48:
15801
- #line 2807 "upb/json/parser.rl"
15766
+ #line 2772 "upb/json/parser.rl"
15802
15767
  { CHECK_RETURN_TOP(end_stringval(parser)); }
15803
15768
  break;
15804
15769
  case 49:
15805
- #line 2809 "upb/json/parser.rl"
15770
+ #line 2774 "upb/json/parser.rl"
15806
15771
  { CHECK_RETURN_TOP(end_bool(parser, true)); }
15807
15772
  break;
15808
15773
  case 50:
15809
- #line 2811 "upb/json/parser.rl"
15774
+ #line 2776 "upb/json/parser.rl"
15810
15775
  { CHECK_RETURN_TOP(end_bool(parser, false)); }
15811
15776
  break;
15812
15777
  case 51:
15813
- #line 2813 "upb/json/parser.rl"
15778
+ #line 2778 "upb/json/parser.rl"
15814
15779
  { CHECK_RETURN_TOP(end_null(parser)); }
15815
15780
  break;
15816
15781
  case 52:
15817
- #line 2815 "upb/json/parser.rl"
15782
+ #line 2780 "upb/json/parser.rl"
15818
15783
  { CHECK_RETURN_TOP(start_subobject_full(parser)); }
15819
15784
  break;
15820
15785
  case 53:
15821
- #line 2816 "upb/json/parser.rl"
15786
+ #line 2781 "upb/json/parser.rl"
15822
15787
  { end_subobject_full(parser); }
15823
15788
  break;
15824
15789
  case 54:
15825
- #line 2821 "upb/json/parser.rl"
15790
+ #line 2786 "upb/json/parser.rl"
15826
15791
  { p--; {cs = stack[--top]; goto _again;} }
15827
15792
  break;
15828
- #line 3229 "upb/json/parser.c"
15793
+ #line 3194 "upb/json/parser.c"
15829
15794
  }
15830
15795
  }
15831
15796
 
@@ -15842,32 +15807,32 @@ _again:
15842
15807
  while ( __nacts-- > 0 ) {
15843
15808
  switch ( *__acts++ ) {
15844
15809
  case 0:
15845
- #line 2630 "upb/json/parser.rl"
15810
+ #line 2595 "upb/json/parser.rl"
15846
15811
  { p--; {cs = stack[--top]; if ( p == pe )
15847
15812
  goto _test_eof;
15848
15813
  goto _again;} }
15849
15814
  break;
15850
15815
  case 46:
15851
- #line 2804 "upb/json/parser.rl"
15816
+ #line 2769 "upb/json/parser.rl"
15852
15817
  { CHECK_RETURN_TOP(end_number(parser, p)); }
15853
15818
  break;
15854
15819
  case 49:
15855
- #line 2809 "upb/json/parser.rl"
15820
+ #line 2774 "upb/json/parser.rl"
15856
15821
  { CHECK_RETURN_TOP(end_bool(parser, true)); }
15857
15822
  break;
15858
15823
  case 50:
15859
- #line 2811 "upb/json/parser.rl"
15824
+ #line 2776 "upb/json/parser.rl"
15860
15825
  { CHECK_RETURN_TOP(end_bool(parser, false)); }
15861
15826
  break;
15862
15827
  case 51:
15863
- #line 2813 "upb/json/parser.rl"
15828
+ #line 2778 "upb/json/parser.rl"
15864
15829
  { CHECK_RETURN_TOP(end_null(parser)); }
15865
15830
  break;
15866
15831
  case 53:
15867
- #line 2816 "upb/json/parser.rl"
15832
+ #line 2781 "upb/json/parser.rl"
15868
15833
  { end_subobject_full(parser); }
15869
15834
  break;
15870
- #line 3271 "upb/json/parser.c"
15835
+ #line 3236 "upb/json/parser.c"
15871
15836
  }
15872
15837
  }
15873
15838
  }
@@ -15875,7 +15840,7 @@ goto _again;} }
15875
15840
  _out: {}
15876
15841
  }
15877
15842
 
15878
- #line 2849 "upb/json/parser.rl"
15843
+ #line 2814 "upb/json/parser.rl"
15879
15844
 
15880
15845
  if (p != pe) {
15881
15846
  upb_status_seterrf(&parser->status, "Parse error at '%.*s'\n", pe - p, p);
@@ -15915,23 +15880,17 @@ static void json_parser_reset(upb_json_parser *p) {
15915
15880
  int top;
15916
15881
 
15917
15882
  p->top = p->stack;
15918
- p->top->f = NULL;
15919
- p->top->is_repeated = false;
15920
- p->top->is_map = false;
15921
- p->top->is_mapentry = false;
15922
- p->top->is_any = false;
15923
- p->top->any_frame = NULL;
15924
- p->top->is_unknown_field = false;
15883
+ init_frame(p->top);
15925
15884
 
15926
15885
  /* Emit Ragel initialization of the parser. */
15927
15886
 
15928
- #line 3329 "upb/json/parser.c"
15887
+ #line 3288 "upb/json/parser.c"
15929
15888
  {
15930
15889
  cs = json_start;
15931
15890
  top = 0;
15932
15891
  }
15933
15892
 
15934
- #line 2898 "upb/json/parser.rl"
15893
+ #line 2857 "upb/json/parser.rl"
15935
15894
  p->current_state = cs;
15936
15895
  p->parser_top = top;
15937
15896
  accumulate_clear(p);
@@ -10639,4 +10639,3 @@ inline reffed_ptr<const Handlers> Printer::NewHandlers(
10639
10639
  #undef UPB_FIELD_AT
10640
10640
  #undef UPB_READ_ONEOF
10641
10641
  #undef UPB_WRITE_ONEOF
10642
- #undef UPB_WRITE_ONEOF
@@ -357,5 +357,25 @@ module BasicTest
357
357
  assert_equal nil, file_descriptor.name
358
358
  assert_equal :proto3, file_descriptor.syntax
359
359
  end
360
+
361
+ # Ruby 2.5 changed to raise FrozenError instead of RuntimeError
362
+ FrozenErrorType = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5') ? RuntimeError : FrozenError
363
+
364
+ def test_map_freeze
365
+ m = proto_module::MapMessage.new
366
+ m.map_string_int32['a'] = 5
367
+ m.map_string_msg['b'] = proto_module::TestMessage2.new
368
+
369
+ m.map_string_int32.freeze
370
+ m.map_string_msg.freeze
371
+
372
+ assert m.map_string_int32.frozen?
373
+ assert m.map_string_msg.frozen?
374
+
375
+ assert_raise(FrozenErrorType) { m.map_string_int32['foo'] = 1 }
376
+ assert_raise(FrozenErrorType) { m.map_string_msg['bar'] = proto_module::TestMessage2.new }
377
+ assert_raise(FrozenErrorType) { m.map_string_int32.delete('a') }
378
+ assert_raise(FrozenErrorType) { m.map_string_int32.clear }
379
+ end
360
380
  end
361
381
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.1
4
+ version: 3.8.0.rc.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Protobuf Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-26 00:00:00.000000000 Z
11
+ date: 2019-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler-dock
@@ -123,11 +123,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
123
  version: '0'
124
124
  required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  requirements:
126
- - - ">="
126
+ - - ">"
127
127
  - !ruby/object:Gem::Version
128
- version: '0'
128
+ version: 1.3.1
129
129
  requirements: []
130
- rubygems_version: 3.0.3
130
+ rubyforge_project:
131
+ rubygems_version: 2.7.6
131
132
  signing_key:
132
133
  specification_version: 4
133
134
  summary: Protocol Buffers