google-protobuf 3.7.0 → 3.8.0

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.

@@ -1,4 +1,5 @@
1
- // Amalgamated source file
1
+ /* Amalgamated source file */
2
+ #define _XOPEN_SOURCE 700
2
3
  #include "upb.h"
3
4
 
4
5
  #if UINTPTR_MAX == 0xffffffff
@@ -53,24 +54,24 @@ static const upb_msglayout *const google_protobuf_FileDescriptorProto_submsgs[6]
53
54
  };
54
55
 
55
56
  static const upb_msglayout_field google_protobuf_FileDescriptorProto__fields[12] = {
56
- {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
57
- {2, UPB_SIZE(16, 32), 2, 0, 9, 1},
58
- {3, UPB_SIZE(40, 80), 0, 0, 9, 3},
59
- {4, UPB_SIZE(44, 88), 0, 0, 11, 3},
60
- {5, UPB_SIZE(48, 96), 0, 1, 11, 3},
61
- {6, UPB_SIZE(52, 104), 0, 4, 11, 3},
62
- {7, UPB_SIZE(56, 112), 0, 2, 11, 3},
63
- {8, UPB_SIZE(32, 64), 4, 3, 11, 1},
64
- {9, UPB_SIZE(36, 72), 5, 5, 11, 1},
65
- {10, UPB_SIZE(60, 120), 0, 0, 5, 3},
66
- {11, UPB_SIZE(64, 128), 0, 0, 5, 3},
67
- {12, UPB_SIZE(24, 48), 3, 0, 9, 1},
57
+ {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
58
+ {2, UPB_SIZE(12, 24), 2, 0, 9, 1},
59
+ {3, UPB_SIZE(36, 72), 0, 0, 9, 3},
60
+ {4, UPB_SIZE(40, 80), 0, 0, 11, 3},
61
+ {5, UPB_SIZE(44, 88), 0, 1, 11, 3},
62
+ {6, UPB_SIZE(48, 96), 0, 4, 11, 3},
63
+ {7, UPB_SIZE(52, 104), 0, 2, 11, 3},
64
+ {8, UPB_SIZE(28, 56), 4, 3, 11, 1},
65
+ {9, UPB_SIZE(32, 64), 5, 5, 11, 1},
66
+ {10, UPB_SIZE(56, 112), 0, 0, 5, 3},
67
+ {11, UPB_SIZE(60, 120), 0, 0, 5, 3},
68
+ {12, UPB_SIZE(20, 40), 3, 0, 9, 1},
68
69
  };
69
70
 
70
71
  const upb_msglayout google_protobuf_FileDescriptorProto_msginit = {
71
72
  &google_protobuf_FileDescriptorProto_submsgs[0],
72
73
  &google_protobuf_FileDescriptorProto__fields[0],
73
- UPB_SIZE(72, 144), 12, false,
74
+ UPB_SIZE(64, 128), 12, false,
74
75
  };
75
76
 
76
77
  static const upb_msglayout *const google_protobuf_DescriptorProto_submsgs[8] = {
@@ -84,22 +85,22 @@ static const upb_msglayout *const google_protobuf_DescriptorProto_submsgs[8] = {
84
85
  };
85
86
 
86
87
  static const upb_msglayout_field google_protobuf_DescriptorProto__fields[10] = {
87
- {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
88
- {2, UPB_SIZE(20, 40), 0, 4, 11, 3},
89
- {3, UPB_SIZE(24, 48), 0, 0, 11, 3},
90
- {4, UPB_SIZE(28, 56), 0, 3, 11, 3},
91
- {5, UPB_SIZE(32, 64), 0, 1, 11, 3},
92
- {6, UPB_SIZE(36, 72), 0, 4, 11, 3},
93
- {7, UPB_SIZE(16, 32), 2, 5, 11, 1},
94
- {8, UPB_SIZE(40, 80), 0, 6, 11, 3},
95
- {9, UPB_SIZE(44, 88), 0, 2, 11, 3},
96
- {10, UPB_SIZE(48, 96), 0, 0, 9, 3},
88
+ {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
89
+ {2, UPB_SIZE(16, 32), 0, 4, 11, 3},
90
+ {3, UPB_SIZE(20, 40), 0, 0, 11, 3},
91
+ {4, UPB_SIZE(24, 48), 0, 3, 11, 3},
92
+ {5, UPB_SIZE(28, 56), 0, 1, 11, 3},
93
+ {6, UPB_SIZE(32, 64), 0, 4, 11, 3},
94
+ {7, UPB_SIZE(12, 24), 2, 5, 11, 1},
95
+ {8, UPB_SIZE(36, 72), 0, 6, 11, 3},
96
+ {9, UPB_SIZE(40, 80), 0, 2, 11, 3},
97
+ {10, UPB_SIZE(44, 88), 0, 0, 9, 3},
97
98
  };
98
99
 
99
100
  const upb_msglayout google_protobuf_DescriptorProto_msginit = {
100
101
  &google_protobuf_DescriptorProto_submsgs[0],
101
102
  &google_protobuf_DescriptorProto__fields[0],
102
- UPB_SIZE(56, 112), 10, false,
103
+ UPB_SIZE(48, 96), 10, false,
103
104
  };
104
105
 
105
106
  static const upb_msglayout *const google_protobuf_DescriptorProto_ExtensionRange_submsgs[1] = {
@@ -171,14 +172,14 @@ static const upb_msglayout *const google_protobuf_OneofDescriptorProto_submsgs[1
171
172
  };
172
173
 
173
174
  static const upb_msglayout_field google_protobuf_OneofDescriptorProto__fields[2] = {
174
- {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
175
- {2, UPB_SIZE(16, 32), 2, 0, 11, 1},
175
+ {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
176
+ {2, UPB_SIZE(12, 24), 2, 0, 11, 1},
176
177
  };
177
178
 
178
179
  const upb_msglayout google_protobuf_OneofDescriptorProto_msginit = {
179
180
  &google_protobuf_OneofDescriptorProto_submsgs[0],
180
181
  &google_protobuf_OneofDescriptorProto__fields[0],
181
- UPB_SIZE(24, 48), 2, false,
182
+ UPB_SIZE(16, 32), 2, false,
182
183
  };
183
184
 
184
185
  static const upb_msglayout *const google_protobuf_EnumDescriptorProto_submsgs[3] = {
@@ -188,11 +189,11 @@ static const upb_msglayout *const google_protobuf_EnumDescriptorProto_submsgs[3]
188
189
  };
189
190
 
190
191
  static const upb_msglayout_field google_protobuf_EnumDescriptorProto__fields[5] = {
191
- {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
192
- {2, UPB_SIZE(20, 40), 0, 2, 11, 3},
193
- {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
194
- {4, UPB_SIZE(24, 48), 0, 0, 11, 3},
195
- {5, UPB_SIZE(28, 56), 0, 0, 9, 3},
192
+ {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
193
+ {2, UPB_SIZE(16, 32), 0, 2, 11, 3},
194
+ {3, UPB_SIZE(12, 24), 2, 1, 11, 1},
195
+ {4, UPB_SIZE(20, 40), 0, 0, 11, 3},
196
+ {5, UPB_SIZE(24, 48), 0, 0, 9, 3},
196
197
  };
197
198
 
198
199
  const upb_msglayout google_protobuf_EnumDescriptorProto_msginit = {
@@ -217,15 +218,15 @@ static const upb_msglayout *const google_protobuf_EnumValueDescriptorProto_subms
217
218
  };
218
219
 
219
220
  static const upb_msglayout_field google_protobuf_EnumValueDescriptorProto__fields[3] = {
220
- {1, UPB_SIZE(8, 16), 2, 0, 9, 1},
221
+ {1, UPB_SIZE(8, 8), 2, 0, 9, 1},
221
222
  {2, UPB_SIZE(4, 4), 1, 0, 5, 1},
222
- {3, UPB_SIZE(16, 32), 3, 0, 11, 1},
223
+ {3, UPB_SIZE(16, 24), 3, 0, 11, 1},
223
224
  };
224
225
 
225
226
  const upb_msglayout google_protobuf_EnumValueDescriptorProto_msginit = {
226
227
  &google_protobuf_EnumValueDescriptorProto_submsgs[0],
227
228
  &google_protobuf_EnumValueDescriptorProto__fields[0],
228
- UPB_SIZE(24, 48), 3, false,
229
+ UPB_SIZE(24, 32), 3, false,
229
230
  };
230
231
 
231
232
  static const upb_msglayout *const google_protobuf_ServiceDescriptorProto_submsgs[2] = {
@@ -234,9 +235,9 @@ static const upb_msglayout *const google_protobuf_ServiceDescriptorProto_submsgs
234
235
  };
235
236
 
236
237
  static const upb_msglayout_field google_protobuf_ServiceDescriptorProto__fields[3] = {
237
- {1, UPB_SIZE(8, 16), 1, 0, 9, 1},
238
- {2, UPB_SIZE(20, 40), 0, 0, 11, 3},
239
- {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
238
+ {1, UPB_SIZE(4, 8), 1, 0, 9, 1},
239
+ {2, UPB_SIZE(16, 32), 0, 0, 11, 3},
240
+ {3, UPB_SIZE(12, 24), 2, 1, 11, 1},
240
241
  };
241
242
 
242
243
  const upb_msglayout google_protobuf_ServiceDescriptorProto_msginit = {
@@ -250,10 +251,10 @@ static const upb_msglayout *const google_protobuf_MethodDescriptorProto_submsgs[
250
251
  };
251
252
 
252
253
  static const upb_msglayout_field google_protobuf_MethodDescriptorProto__fields[6] = {
253
- {1, UPB_SIZE(8, 16), 3, 0, 9, 1},
254
- {2, UPB_SIZE(16, 32), 4, 0, 9, 1},
255
- {3, UPB_SIZE(24, 48), 5, 0, 9, 1},
256
- {4, UPB_SIZE(32, 64), 6, 0, 11, 1},
254
+ {1, UPB_SIZE(4, 8), 3, 0, 9, 1},
255
+ {2, UPB_SIZE(12, 24), 4, 0, 9, 1},
256
+ {3, UPB_SIZE(20, 40), 5, 0, 9, 1},
257
+ {4, UPB_SIZE(28, 56), 6, 0, 11, 1},
257
258
  {5, UPB_SIZE(1, 1), 1, 0, 8, 1},
258
259
  {6, UPB_SIZE(2, 2), 2, 0, 8, 1},
259
260
  };
@@ -261,7 +262,7 @@ static const upb_msglayout_field google_protobuf_MethodDescriptorProto__fields[6
261
262
  const upb_msglayout google_protobuf_MethodDescriptorProto_msginit = {
262
263
  &google_protobuf_MethodDescriptorProto_submsgs[0],
263
264
  &google_protobuf_MethodDescriptorProto__fields[0],
264
- UPB_SIZE(40, 80), 6, false,
265
+ UPB_SIZE(32, 64), 6, false,
265
266
  };
266
267
 
267
268
  static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = {
@@ -269,11 +270,11 @@ static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = {
269
270
  };
270
271
 
271
272
  static const upb_msglayout_field google_protobuf_FileOptions__fields[19] = {
272
- {1, UPB_SIZE(32, 32), 11, 0, 9, 1},
273
- {8, UPB_SIZE(40, 48), 12, 0, 9, 1},
273
+ {1, UPB_SIZE(28, 32), 11, 0, 9, 1},
274
+ {8, UPB_SIZE(36, 48), 12, 0, 9, 1},
274
275
  {9, UPB_SIZE(8, 8), 1, 0, 14, 1},
275
276
  {10, UPB_SIZE(16, 16), 2, 0, 8, 1},
276
- {11, UPB_SIZE(48, 64), 13, 0, 9, 1},
277
+ {11, UPB_SIZE(44, 64), 13, 0, 9, 1},
277
278
  {16, UPB_SIZE(17, 17), 3, 0, 8, 1},
278
279
  {17, UPB_SIZE(18, 18), 4, 0, 8, 1},
279
280
  {18, UPB_SIZE(19, 19), 5, 0, 8, 1},
@@ -281,19 +282,19 @@ static const upb_msglayout_field google_protobuf_FileOptions__fields[19] = {
281
282
  {23, UPB_SIZE(21, 21), 7, 0, 8, 1},
282
283
  {27, UPB_SIZE(22, 22), 8, 0, 8, 1},
283
284
  {31, UPB_SIZE(23, 23), 9, 0, 8, 1},
284
- {36, UPB_SIZE(56, 80), 14, 0, 9, 1},
285
- {37, UPB_SIZE(64, 96), 15, 0, 9, 1},
286
- {39, UPB_SIZE(72, 112), 16, 0, 9, 1},
287
- {40, UPB_SIZE(80, 128), 17, 0, 9, 1},
288
- {41, UPB_SIZE(88, 144), 18, 0, 9, 1},
285
+ {36, UPB_SIZE(52, 80), 14, 0, 9, 1},
286
+ {37, UPB_SIZE(60, 96), 15, 0, 9, 1},
287
+ {39, UPB_SIZE(68, 112), 16, 0, 9, 1},
288
+ {40, UPB_SIZE(76, 128), 17, 0, 9, 1},
289
+ {41, UPB_SIZE(84, 144), 18, 0, 9, 1},
289
290
  {42, UPB_SIZE(24, 24), 10, 0, 8, 1},
290
- {999, UPB_SIZE(96, 160), 0, 0, 11, 3},
291
+ {999, UPB_SIZE(92, 160), 0, 0, 11, 3},
291
292
  };
292
293
 
293
294
  const upb_msglayout google_protobuf_FileOptions_msginit = {
294
295
  &google_protobuf_FileOptions_submsgs[0],
295
296
  &google_protobuf_FileOptions__fields[0],
296
- UPB_SIZE(104, 176), 19, false,
297
+ UPB_SIZE(96, 176), 19, false,
297
298
  };
298
299
 
299
300
  static const upb_msglayout *const google_protobuf_MessageOptions_submsgs[1] = {
@@ -431,7 +432,7 @@ const upb_msglayout google_protobuf_UninterpretedOption_msginit = {
431
432
  };
432
433
 
433
434
  static const upb_msglayout_field google_protobuf_UninterpretedOption_NamePart__fields[2] = {
434
- {1, UPB_SIZE(8, 16), 2, 0, 9, 2},
435
+ {1, UPB_SIZE(4, 8), 2, 0, 9, 2},
435
436
  {2, UPB_SIZE(1, 1), 1, 0, 8, 2},
436
437
  };
437
438
 
@@ -456,17 +457,17 @@ const upb_msglayout google_protobuf_SourceCodeInfo_msginit = {
456
457
  };
457
458
 
458
459
  static const upb_msglayout_field google_protobuf_SourceCodeInfo_Location__fields[5] = {
459
- {1, UPB_SIZE(24, 48), 0, 0, 5, 3},
460
- {2, UPB_SIZE(28, 56), 0, 0, 5, 3},
461
- {3, UPB_SIZE(8, 16), 1, 0, 9, 1},
462
- {4, UPB_SIZE(16, 32), 2, 0, 9, 1},
463
- {6, UPB_SIZE(32, 64), 0, 0, 9, 3},
460
+ {1, UPB_SIZE(20, 40), 0, 0, 5, 3},
461
+ {2, UPB_SIZE(24, 48), 0, 0, 5, 3},
462
+ {3, UPB_SIZE(4, 8), 1, 0, 9, 1},
463
+ {4, UPB_SIZE(12, 24), 2, 0, 9, 1},
464
+ {6, UPB_SIZE(28, 56), 0, 0, 9, 3},
464
465
  };
465
466
 
466
467
  const upb_msglayout google_protobuf_SourceCodeInfo_Location_msginit = {
467
468
  NULL,
468
469
  &google_protobuf_SourceCodeInfo_Location__fields[0],
469
- UPB_SIZE(40, 80), 5, false,
470
+ UPB_SIZE(32, 64), 5, false,
470
471
  };
471
472
 
472
473
  static const upb_msglayout *const google_protobuf_GeneratedCodeInfo_submsgs[1] = {
@@ -484,8 +485,8 @@ const upb_msglayout google_protobuf_GeneratedCodeInfo_msginit = {
484
485
  };
485
486
 
486
487
  static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__fields[4] = {
487
- {1, UPB_SIZE(24, 32), 0, 0, 5, 3},
488
- {2, UPB_SIZE(16, 16), 3, 0, 9, 1},
488
+ {1, UPB_SIZE(20, 32), 0, 0, 5, 3},
489
+ {2, UPB_SIZE(12, 16), 3, 0, 9, 1},
489
490
  {3, UPB_SIZE(4, 4), 1, 0, 5, 1},
490
491
  {4, UPB_SIZE(8, 8), 2, 0, 5, 1},
491
492
  };
@@ -493,7 +494,7 @@ static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__f
493
494
  const upb_msglayout google_protobuf_GeneratedCodeInfo_Annotation_msginit = {
494
495
  NULL,
495
496
  &google_protobuf_GeneratedCodeInfo_Annotation__fields[0],
496
- UPB_SIZE(32, 48), 4, false,
497
+ UPB_SIZE(24, 48), 4, false,
497
498
  };
498
499
 
499
500
 
@@ -608,14 +609,14 @@ static int64_t upb_zzdecode_64(uint64_t n) {
608
609
  }
609
610
 
610
611
  static bool upb_decode_string(const char **ptr, const char *limit,
611
- upb_stringview *val) {
612
+ upb_strview *val) {
612
613
  uint32_t len;
613
614
 
614
615
  CHK(upb_decode_varint32(ptr, limit, &len) &&
615
616
  len < INT32_MAX &&
616
617
  limit - *ptr >= (int32_t)len);
617
618
 
618
- *val = upb_stringview_make(*ptr, len);
619
+ *val = upb_strview_make(*ptr, len);
619
620
  *ptr += len;
620
621
  return true;
621
622
  }
@@ -646,7 +647,7 @@ static bool upb_skip_unknownfielddata(upb_decstate *d, upb_decframe *frame,
646
647
  return upb_decode_64bit(&d->ptr, frame->limit, &val);
647
648
  }
648
649
  case UPB_WIRE_TYPE_DELIMITED: {
649
- upb_stringview val;
650
+ upb_strview val;
650
651
  return upb_decode_string(&d->ptr, frame->limit, &val);
651
652
  }
652
653
  case UPB_WIRE_TYPE_START_GROUP:
@@ -870,7 +871,7 @@ static bool upb_decode_32bitfield(upb_decstate *d, upb_decframe *frame,
870
871
  return true;
871
872
  }
872
873
 
873
- static bool upb_decode_fixedpacked(upb_array *arr, upb_stringview data,
874
+ static bool upb_decode_fixedpacked(upb_array *arr, upb_strview data,
874
875
  int elem_size) {
875
876
  int elements = data.size / elem_size;
876
877
  void *field_mem;
@@ -885,7 +886,7 @@ static bool upb_decode_fixedpacked(upb_array *arr, upb_stringview data,
885
886
  static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
886
887
  const char *field_start,
887
888
  const upb_msglayout_field *field,
888
- upb_stringview val) {
889
+ upb_strview val) {
889
890
  upb_array *arr = upb_getorcreatearr(frame, field);
890
891
 
891
892
  #define VARINT_CASE(ctype, decode) { \
@@ -966,7 +967,7 @@ static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
966
967
  static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
967
968
  const char *field_start,
968
969
  const upb_msglayout_field *field) {
969
- upb_stringview val;
970
+ upb_strview val;
970
971
 
971
972
  CHK(upb_decode_string(&d->ptr, frame->limit, &val));
972
973
 
@@ -1080,7 +1081,7 @@ static bool upb_decode_message(upb_decstate *d, const char *limit,
1080
1081
  return true;
1081
1082
  }
1082
1083
 
1083
- bool upb_decode(upb_stringview buf, void *msg, const upb_msglayout *l) {
1084
+ bool upb_decode(upb_strview buf, void *msg, const upb_msglayout *l) {
1084
1085
  upb_decstate state;
1085
1086
  state.ptr = buf.data;
1086
1087
 
@@ -1752,6 +1753,8 @@ static void freefield(upb_refcounted *r) {
1752
1753
  upb_fielddef_uninit_default(f);
1753
1754
  if (f->subdef_is_symbolic)
1754
1755
  upb_gfree(f->sub.name);
1756
+ if (f->msg_is_symbolic)
1757
+ upb_gfree(f->msg.name);
1755
1758
  upb_def_uninit(upb_fielddef_upcast_mutable(f));
1756
1759
  upb_gfree(f);
1757
1760
  }
@@ -2109,7 +2112,7 @@ bool upb_fielddef_setnumber(upb_fielddef *f, uint32_t number, upb_status *s) {
2109
2112
  s, "cannot change field number after adding to a message");
2110
2113
  return false;
2111
2114
  }
2112
- if (number == 0 || number > UPB_MAX_FIELDNUMBER) {
2115
+ if (number == 0) {
2113
2116
  upb_status_seterrf(s, "invalid field number (%u)", number);
2114
2117
  return false;
2115
2118
  }
@@ -3717,8 +3720,8 @@ do { ; } while(0)
3717
3720
  VARINT_CASE(int64_t, upb_zzencode_64(*ptr));
3718
3721
  case UPB_DESCRIPTOR_TYPE_STRING:
3719
3722
  case UPB_DESCRIPTOR_TYPE_BYTES: {
3720
- upb_stringview *start = arr->data;
3721
- upb_stringview *ptr = start + arr->len;
3723
+ upb_strview *start = arr->data;
3724
+ upb_strview *ptr = start + arr->len;
3722
3725
  do {
3723
3726
  ptr--;
3724
3727
  CHK(upb_put_bytes(e, ptr->data, ptr->size) &&
@@ -3802,7 +3805,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
3802
3805
  CASE(int64_t, varint, UPB_WIRE_TYPE_VARINT, upb_zzencode_64(val));
3803
3806
  case UPB_DESCRIPTOR_TYPE_STRING:
3804
3807
  case UPB_DESCRIPTOR_TYPE_BYTES: {
3805
- upb_stringview view = *(upb_stringview*)field_mem;
3808
+ upb_strview view = *(upb_strview*)field_mem;
3806
3809
  if (skip_zero_value && view.size == 0) {
3807
3810
  return true;
3808
3811
  }
@@ -4752,7 +4755,7 @@ static size_t upb_msgval_sizeof(upb_fieldtype_t type) {
4752
4755
  return sizeof(void*);
4753
4756
  case UPB_TYPE_BYTES:
4754
4757
  case UPB_TYPE_STRING:
4755
- return sizeof(upb_stringview);
4758
+ return sizeof(upb_strview);
4756
4759
  }
4757
4760
  UPB_UNREACHABLE();
4758
4761
  }
@@ -5242,7 +5245,7 @@ static size_t upb_msgval_sizeof2(upb_fieldtype_t type) {
5242
5245
  return sizeof(void*);
5243
5246
  case UPB_TYPE_BYTES:
5244
5247
  case UPB_TYPE_STRING:
5245
- return sizeof(upb_stringview);
5248
+ return sizeof(upb_strview);
5246
5249
  }
5247
5250
  UPB_UNREACHABLE();
5248
5251
  }
@@ -7664,7 +7667,6 @@ size_t upb_env_bytesallocated(const upb_env *e) {
7664
7667
  * Do not edit -- your changes will be discarded when the file is
7665
7668
  * regenerated. */
7666
7669
 
7667
-
7668
7670
  static const upb_msgdef msgs[22];
7669
7671
  static const upb_fielddef fields[107];
7670
7672
  static const upb_enumdef enums[5];
@@ -8900,14 +8902,21 @@ static void *file_startenum(void *closure, const void *hd) {
8900
8902
 
8901
8903
  static void *file_startext(void *closure, const void *hd) {
8902
8904
  upb_descreader *r = closure;
8903
- bool ok;
8904
8905
  r->f = upb_fielddef_new(r);
8905
- ok = upb_filedef_addext(r->file, r->f, r, NULL);
8906
8906
  UPB_UNUSED(hd);
8907
- UPB_ASSERT(ok);
8908
8907
  return r;
8909
8908
  }
8910
8909
 
8910
+ static bool file_endext(void *closure, const void *hd) {
8911
+ /* The current symtab code can't handle extensions, so we just discard
8912
+ * them for now. */
8913
+ upb_descreader *r = closure;
8914
+ upb_fielddef_unref(r->f, r);
8915
+ UPB_UNUSED(hd);
8916
+ r->f = NULL;
8917
+ return true;
8918
+ }
8919
+
8911
8920
  static size_t file_ondep(void *closure, const void *hd, const char *buf,
8912
8921
  size_t n, const upb_bufhandle *handle) {
8913
8922
  upb_descreader *r = closure;
@@ -9281,13 +9290,21 @@ static void *msg_startmsg(void *closure, const void *hd) {
9281
9290
 
9282
9291
  static void *msg_startext(void *closure, const void *hd) {
9283
9292
  upb_descreader *r = closure;
9284
- upb_fielddef *f = upb_fielddef_new(&f);
9285
- bool ok = upb_filedef_addext(r->file, f, &f, NULL);
9293
+ r->f = upb_fielddef_new(r);
9286
9294
  UPB_UNUSED(hd);
9287
- UPB_ASSERT(ok);
9288
9295
  return r;
9289
9296
  }
9290
9297
 
9298
+ static bool msg_endext(void *closure, const void *hd) {
9299
+ /* The current symtab code can't handle extensions, so we just discard
9300
+ * them for now. */
9301
+ upb_descreader *r = closure;
9302
+ upb_fielddef_unref(r->f, r);
9303
+ UPB_UNUSED(hd);
9304
+ r->f = NULL;
9305
+ return true;
9306
+ }
9307
+
9291
9308
  static void *msg_startfield(void *closure, const void *hd) {
9292
9309
  upb_descreader *r = closure;
9293
9310
  r->f = upb_fielddef_new(&r->f);
@@ -9342,6 +9359,8 @@ static void reghandlers(const void *closure, upb_handlers *h) {
9342
9359
  upb_handlers_setstring(h, F(DescriptorProto, name), &msg_name, NULL);
9343
9360
  upb_handlers_setstartsubmsg(h, F(DescriptorProto, extension), &msg_startext,
9344
9361
  NULL);
9362
+ upb_handlers_setendsubmsg(h, F(DescriptorProto, extension), &msg_endext,
9363
+ NULL);
9345
9364
  upb_handlers_setstartsubmsg(h, F(DescriptorProto, nested_type),
9346
9365
  &msg_startmsg, NULL);
9347
9366
  upb_handlers_setstartsubmsg(h, F(DescriptorProto, field),
@@ -9365,6 +9384,8 @@ static void reghandlers(const void *closure, upb_handlers *h) {
9365
9384
  &file_startenum, NULL);
9366
9385
  upb_handlers_setstartsubmsg(h, F(FileDescriptorProto, extension),
9367
9386
  &file_startext, NULL);
9387
+ upb_handlers_setendsubmsg(h, F(FileDescriptorProto, extension),
9388
+ &file_endext, NULL);
9368
9389
  upb_handlers_setstring(h, F(FileDescriptorProto, dependency),
9369
9390
  &file_ondep, NULL);
9370
9391
  } else if (upbdefs_google_protobuf_EnumValueDescriptorProto_is(m)) {
@@ -12603,6 +12624,7 @@ done:
12603
12624
  ** - handling of keys/escape-sequences/etc that span input buffers.
12604
12625
  */
12605
12626
 
12627
+ #include <ctype.h>
12606
12628
  #include <errno.h>
12607
12629
  #include <float.h>
12608
12630
  #include <math.h>
@@ -12610,6 +12632,7 @@ done:
12610
12632
  #include <stdio.h>
12611
12633
  #include <stdlib.h>
12612
12634
  #include <string.h>
12635
+
12613
12636
  #include <time.h>
12614
12637
 
12615
12638
 
@@ -12763,6 +12786,11 @@ typedef struct {
12763
12786
  /* The table mapping json name to fielddef for this message. */
12764
12787
  upb_strtable *name_table;
12765
12788
 
12789
+ /* We are in a repeated-field context. We need this flag to decide whether to
12790
+ * handle the array as a normal repeated field or a
12791
+ * google.protobuf.ListValue/google.protobuf.Value. */
12792
+ bool is_repeated;
12793
+
12766
12794
  /* We are in a repeated-field context, ready to emit mapentries as
12767
12795
  * submessages. This flag alters the start-of-object (open-brace) behavior to
12768
12796
  * begin a sequence of mapentry messages rather than a single submessage. */
@@ -12793,6 +12821,19 @@ typedef struct {
12793
12821
  bool is_unknown_field;
12794
12822
  } upb_jsonparser_frame;
12795
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
+
12796
12837
  struct upb_json_parser {
12797
12838
  upb_env *env;
12798
12839
  const upb_json_parsermethod *method;
@@ -12840,6 +12881,13 @@ struct upb_json_parser {
12840
12881
  struct tm tm;
12841
12882
  };
12842
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
+
12843
12891
  struct upb_json_parsermethod {
12844
12892
  upb_refcounted base;
12845
12893
 
@@ -13797,17 +13845,11 @@ static bool start_stringval(upb_json_parser *p) {
13797
13845
 
13798
13846
  /* Start a new parser frame: parser frames correspond one-to-one with
13799
13847
  * handler frames, and string events occur in a sub-frame. */
13800
- inner = p->top + 1;
13848
+ inner = start_jsonparser_frame(p);
13801
13849
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);
13802
13850
  upb_sink_startstr(&p->top->sink, sel, 0, &inner->sink);
13803
13851
  inner->m = p->top->m;
13804
13852
  inner->f = p->top->f;
13805
- inner->name_table = NULL;
13806
- inner->is_map = false;
13807
- inner->is_mapentry = false;
13808
- inner->is_any = false;
13809
- inner->any_frame = NULL;
13810
- inner->is_unknown_field = false;
13811
13853
  p->top = inner;
13812
13854
 
13813
13855
  if (upb_fielddef_type(p->top->f) == UPB_TYPE_STRING) {
@@ -14100,49 +14142,100 @@ static bool end_duration_base(upb_json_parser *p, const char *ptr) {
14100
14142
  return true;
14101
14143
  }
14102
14144
 
14103
- static void start_timestamp_base(upb_json_parser *p, const char *ptr) {
14145
+ static int parse_timestamp_number(upb_json_parser *p) {
14146
+ size_t len;
14147
+ const char *buf;
14148
+ char *end;
14149
+ int val;
14150
+
14151
+ /* atoi() and friends unfortunately do not support specifying the length of
14152
+ * the input string, so we need to force a copy into a NULL-terminated buffer. */
14153
+ multipart_text(p, "\0", 1, false);
14154
+
14155
+ buf = accumulate_getptr(p, &len);
14156
+ val = atoi(buf);
14157
+ multipart_end(p);
14158
+ multipart_startaccum(p);
14159
+
14160
+ return val;
14161
+ }
14162
+
14163
+ static void start_year(upb_json_parser *p, const char *ptr) {
14104
14164
  capture_begin(p, ptr);
14105
14165
  }
14106
14166
 
14107
- #define UPB_TIMESTAMP_BASE_SIZE 19
14167
+ static bool end_year(upb_json_parser *p, const char *ptr) {
14168
+ if (!capture_end(p, ptr)) {
14169
+ return false;
14170
+ }
14171
+ p->tm.tm_year = parse_timestamp_number(p) - 1900;
14172
+ return true;
14173
+ }
14108
14174
 
14109
- static bool end_timestamp_base(upb_json_parser *p, const char *ptr) {
14110
- size_t len;
14111
- const char *buf;
14112
- /* 3 for GMT and 1 for ending 0 */
14113
- char timestamp_buf[UPB_TIMESTAMP_BASE_SIZE + 4];
14175
+ static void start_month(upb_json_parser *p, const char *ptr) {
14176
+ capture_begin(p, ptr);
14177
+ }
14114
14178
 
14179
+ static bool end_month(upb_json_parser *p, const char *ptr) {
14115
14180
  if (!capture_end(p, ptr)) {
14116
14181
  return false;
14117
14182
  }
14183
+ p->tm.tm_mon = parse_timestamp_number(p) - 1;
14184
+ return true;
14185
+ }
14118
14186
 
14119
- buf = accumulate_getptr(p, &len);
14120
- UPB_ASSERT(len == UPB_TIMESTAMP_BASE_SIZE);
14121
- memcpy(timestamp_buf, buf, UPB_TIMESTAMP_BASE_SIZE);
14122
- memcpy(timestamp_buf + UPB_TIMESTAMP_BASE_SIZE, "GMT", 3);
14123
- timestamp_buf[UPB_TIMESTAMP_BASE_SIZE + 3] = 0;
14124
-
14125
- #if defined __MINGW32__ || defined __MINGW64__
14126
- upb_status_seterrf(
14127
- &p->status, "error parsing timestamp: mingw doesn't support strptime");
14128
- upb_env_reporterror(p->env, &p->status);
14129
- return false;
14130
- #else
14131
- /* Parse seconds */
14132
- if (strptime(timestamp_buf, "%FT%H:%M:%S%Z", &p->tm) == NULL) {
14133
- upb_status_seterrf(&p->status, "error parsing timestamp: %s", buf);
14134
- upb_env_reporterror(p->env, &p->status);
14187
+ static void start_day(upb_json_parser *p, const char *ptr) {
14188
+ capture_begin(p, ptr);
14189
+ }
14190
+
14191
+ static bool end_day(upb_json_parser *p, const char *ptr) {
14192
+ if (!capture_end(p, ptr)) {
14135
14193
  return false;
14136
14194
  }
14137
- #endif
14195
+ p->tm.tm_mday = parse_timestamp_number(p);
14196
+ return true;
14197
+ }
14138
14198
 
14139
- /* Clean up buffer */
14140
- multipart_end(p);
14141
- multipart_startaccum(p);
14199
+ static void start_hour(upb_json_parser *p, const char *ptr) {
14200
+ capture_begin(p, ptr);
14201
+ }
14142
14202
 
14203
+ static bool end_hour(upb_json_parser *p, const char *ptr) {
14204
+ if (!capture_end(p, ptr)) {
14205
+ return false;
14206
+ }
14207
+ p->tm.tm_hour = parse_timestamp_number(p);
14143
14208
  return true;
14144
14209
  }
14145
14210
 
14211
+ static void start_minute(upb_json_parser *p, const char *ptr) {
14212
+ capture_begin(p, ptr);
14213
+ }
14214
+
14215
+ static bool end_minute(upb_json_parser *p, const char *ptr) {
14216
+ if (!capture_end(p, ptr)) {
14217
+ return false;
14218
+ }
14219
+ p->tm.tm_min = parse_timestamp_number(p);
14220
+ return true;
14221
+ }
14222
+
14223
+ static void start_second(upb_json_parser *p, const char *ptr) {
14224
+ capture_begin(p, ptr);
14225
+ }
14226
+
14227
+ static bool end_second(upb_json_parser *p, const char *ptr) {
14228
+ if (!capture_end(p, ptr)) {
14229
+ return false;
14230
+ }
14231
+ p->tm.tm_sec = parse_timestamp_number(p);
14232
+ return true;
14233
+ }
14234
+
14235
+ static void start_timestamp_base(upb_json_parser *p) {
14236
+ memset(&p->tm, 0, sizeof(struct tm));
14237
+ }
14238
+
14146
14239
  static void start_timestamp_fraction(upb_json_parser *p, const char *ptr) {
14147
14240
  capture_begin(p, ptr);
14148
14241
  }
@@ -14206,10 +14299,51 @@ static void start_timestamp_zone(upb_json_parser *p, const char *ptr) {
14206
14299
  capture_begin(p, ptr);
14207
14300
  }
14208
14301
 
14302
+ #define EPOCH_YEAR 1970
14303
+ #define TM_YEAR_BASE 1900
14304
+
14305
+ static bool isleap(int year) {
14306
+ return (year % 4) == 0 && (year % 100 != 0 || (year % 400) == 0);
14307
+ }
14308
+
14309
+ const unsigned short int __mon_yday[2][13] = {
14310
+ /* Normal years. */
14311
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
14312
+ /* Leap years. */
14313
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
14314
+ };
14315
+
14316
+ int64_t epoch(int year, int yday, int hour, int min, int sec) {
14317
+ int64_t years = year - EPOCH_YEAR;
14318
+
14319
+ int64_t leap_days = years / 4 - years / 100 + years / 400;
14320
+
14321
+ int64_t days = years * 365 + yday + leap_days;
14322
+ int64_t hours = days * 24 + hour;
14323
+ int64_t mins = hours * 60 + min;
14324
+ int64_t secs = mins * 60 + sec;
14325
+ return secs;
14326
+ }
14327
+
14328
+ static int64_t upb_mktime(const struct tm *tp) {
14329
+ int sec = tp->tm_sec;
14330
+ int min = tp->tm_min;
14331
+ int hour = tp->tm_hour;
14332
+ int mday = tp->tm_mday;
14333
+ int mon = tp->tm_mon;
14334
+ int year = tp->tm_year + TM_YEAR_BASE;
14335
+
14336
+ /* Calculate day of year from year, month, and day of month. */
14337
+ int mon_yday = ((__mon_yday[isleap(year)][mon]) - 1);
14338
+ int yday = mon_yday + mday;
14339
+
14340
+ return epoch(year, yday, hour, min, sec);
14341
+ }
14342
+
14209
14343
  static bool end_timestamp_zone(upb_json_parser *p, const char *ptr) {
14210
14344
  size_t len;
14211
14345
  const char *buf;
14212
- int hours;
14346
+ int hours = 0;
14213
14347
  int64_t seconds;
14214
14348
  const char *seconds_membername = "seconds";
14215
14349
 
@@ -14229,12 +14363,11 @@ static bool end_timestamp_zone(upb_json_parser *p, const char *ptr) {
14229
14363
  if (buf[0] == '+') {
14230
14364
  hours = -hours;
14231
14365
  }
14232
-
14233
- p->tm.tm_hour += hours;
14234
14366
  }
14235
14367
 
14236
14368
  /* Normalize tm */
14237
- seconds = mktime(&p->tm);
14369
+ seconds = upb_mktime(&p->tm);
14370
+ seconds += 3600 * hours;
14238
14371
 
14239
14372
  /* Check timestamp boundary */
14240
14373
  if (seconds < -62135596800) {
@@ -14280,17 +14413,11 @@ static bool start_fieldmask_path(upb_json_parser *p) {
14280
14413
 
14281
14414
  /* Start a new parser frame: parser frames correspond one-to-one with
14282
14415
  * handler frames, and string events occur in a sub-frame. */
14283
- inner = p->top + 1;
14416
+ inner = start_jsonparser_frame(p);
14284
14417
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSTR);
14285
14418
  upb_sink_startstr(&p->top->sink, sel, 0, &inner->sink);
14286
14419
  inner->m = p->top->m;
14287
14420
  inner->f = p->top->f;
14288
- inner->name_table = NULL;
14289
- inner->is_map = false;
14290
- inner->is_mapentry = false;
14291
- inner->is_any = false;
14292
- inner->any_frame = NULL;
14293
- inner->is_unknown_field = false;
14294
14421
  p->top = inner;
14295
14422
 
14296
14423
  multipart_startaccum(p);
@@ -14426,17 +14553,12 @@ static bool handle_mapentry(upb_json_parser *p) {
14426
14553
  mapfield = p->top->mapfield;
14427
14554
  mapentrymsg = upb_fielddef_msgsubdef(mapfield);
14428
14555
 
14429
- inner = p->top + 1;
14556
+ inner = start_jsonparser_frame(p);
14430
14557
  p->top->f = mapfield;
14431
14558
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
14432
14559
  upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
14433
14560
  inner->m = mapentrymsg;
14434
- inner->name_table = NULL;
14435
14561
  inner->mapfield = mapfield;
14436
- inner->is_map = false;
14437
- inner->is_any = false;
14438
- inner->any_frame = NULL;
14439
- inner->is_unknown_field = false;
14440
14562
 
14441
14563
  /* Don't set this to true *yet* -- we reuse parsing handlers below to push
14442
14564
  * the key field value to the sink, and these handlers will pop the frame
@@ -14554,15 +14676,7 @@ static bool start_subobject(upb_json_parser *p) {
14554
14676
  upb_jsonparser_frame *inner;
14555
14677
  if (!check_stack(p)) return false;
14556
14678
 
14557
- inner = p->top + 1;
14558
- inner->m = NULL;
14559
- inner->f = NULL;
14560
- inner->is_map = false;
14561
- inner->is_mapentry = false;
14562
- inner->is_any = false;
14563
- inner->any_frame = NULL;
14564
- inner->is_unknown_field = false;
14565
- p->top = inner;
14679
+ p->top = start_jsonparser_frame(p);
14566
14680
  return true;
14567
14681
  }
14568
14682
 
@@ -14574,18 +14688,12 @@ static bool start_subobject(upb_json_parser *p) {
14574
14688
  * context. */
14575
14689
  if (!check_stack(p)) return false;
14576
14690
 
14577
- inner = p->top + 1;
14691
+ inner = start_jsonparser_frame(p);
14578
14692
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
14579
14693
  upb_sink_startseq(&p->top->sink, sel, &inner->sink);
14580
14694
  inner->m = upb_fielddef_msgsubdef(p->top->f);
14581
- inner->name_table = NULL;
14582
14695
  inner->mapfield = p->top->f;
14583
- inner->f = NULL;
14584
14696
  inner->is_map = true;
14585
- inner->is_mapentry = false;
14586
- inner->is_any = false;
14587
- inner->any_frame = NULL;
14588
- inner->is_unknown_field = false;
14589
14697
  p->top = inner;
14590
14698
 
14591
14699
  return true;
@@ -14597,16 +14705,11 @@ static bool start_subobject(upb_json_parser *p) {
14597
14705
  * context. */
14598
14706
  if (!check_stack(p)) return false;
14599
14707
 
14600
- inner = p->top + 1;
14601
-
14708
+ inner = start_jsonparser_frame(p);
14602
14709
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSUBMSG);
14603
14710
  upb_sink_startsubmsg(&p->top->sink, sel, &inner->sink);
14604
14711
  inner->m = upb_fielddef_msgsubdef(p->top->f);
14605
14712
  set_name_table(p, inner);
14606
- inner->f = NULL;
14607
- inner->is_map = false;
14608
- inner->is_mapentry = false;
14609
- inner->is_unknown_field = false;
14610
14713
  p->top = inner;
14611
14714
 
14612
14715
  if (is_wellknown_msg(p, UPB_WELLKNOWN_ANY)) {
@@ -14706,10 +14809,14 @@ static bool start_array(upb_json_parser *p) {
14706
14809
  } else {
14707
14810
  return false;
14708
14811
  }
14709
- } else if (is_wellknown_field(p, UPB_WELLKNOWN_LISTVALUE)) {
14812
+ } else if (is_wellknown_field(p, UPB_WELLKNOWN_LISTVALUE) &&
14813
+ (!upb_fielddef_isseq(p->top->f) ||
14814
+ p->top->is_repeated)) {
14710
14815
  if (!start_subobject(p)) return false;
14711
14816
  start_listvalue_object(p);
14712
- } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE)) {
14817
+ } else if (is_wellknown_field(p, UPB_WELLKNOWN_VALUE) &&
14818
+ (!upb_fielddef_isseq(p->top->f) ||
14819
+ p->top->is_repeated)) {
14713
14820
  if (!start_subobject(p)) return false;
14714
14821
  start_value_object(p, VALUE_LISTVALUE);
14715
14822
  if (!start_subobject(p)) return false;
@@ -14717,14 +14824,7 @@ static bool start_array(upb_json_parser *p) {
14717
14824
  }
14718
14825
 
14719
14826
  if (p->top->is_unknown_field) {
14720
- inner = p->top + 1;
14721
- inner->m = NULL;
14722
- inner->name_table = NULL;
14723
- inner->f = NULL;
14724
- inner->is_map = false;
14725
- inner->is_mapentry = false;
14726
- inner->is_any = false;
14727
- inner->any_frame = NULL;
14827
+ inner = start_jsonparser_frame(p);
14728
14828
  inner->is_unknown_field = true;
14729
14829
  p->top = inner;
14730
14830
 
@@ -14741,17 +14841,12 @@ static bool start_array(upb_json_parser *p) {
14741
14841
 
14742
14842
  if (!check_stack(p)) return false;
14743
14843
 
14744
- inner = p->top + 1;
14844
+ inner = start_jsonparser_frame(p);
14745
14845
  sel = getsel_for_handlertype(p, UPB_HANDLER_STARTSEQ);
14746
14846
  upb_sink_startseq(&p->top->sink, sel, &inner->sink);
14747
14847
  inner->m = p->top->m;
14748
- inner->name_table = NULL;
14749
14848
  inner->f = p->top->f;
14750
- inner->is_map = false;
14751
- inner->is_mapentry = false;
14752
- inner->is_any = false;
14753
- inner->any_frame = NULL;
14754
- inner->is_unknown_field = false;
14849
+ inner->is_repeated = true;
14755
14850
  p->top = inner;
14756
14851
 
14757
14852
  return true;
@@ -15130,27 +15225,30 @@ static bool is_fieldmask_object(upb_json_parser *p) {
15130
15225
  * final state once, when the closing '"' is seen. */
15131
15226
 
15132
15227
 
15133
- #line 2730 "upb/json/parser.rl"
15228
+ #line 2789 "upb/json/parser.rl"
15134
15229
 
15135
15230
 
15136
15231
 
15137
- #line 2556 "upb/json/parser.c"
15232
+ #line 2592 "upb/json/parser.c"
15138
15233
  static const char _json_actions[] = {
15139
15234
  0, 1, 0, 1, 1, 1, 3, 1,
15140
15235
  4, 1, 6, 1, 7, 1, 8, 1,
15141
- 9, 1, 10, 1, 11, 1, 12, 1,
15142
- 13, 1, 24, 1, 26, 1, 28, 1,
15143
- 29, 1, 31, 1, 32, 1, 33, 1,
15144
- 35, 1, 37, 1, 38, 1, 39, 1,
15145
- 40, 1, 42, 1, 43, 2, 4, 9,
15146
- 2, 5, 6, 2, 7, 3, 2, 7,
15147
- 9, 2, 14, 15, 2, 16, 17, 2,
15148
- 18, 19, 2, 21, 23, 2, 22, 20,
15149
- 2, 27, 25, 2, 29, 31, 2, 34,
15150
- 2, 2, 35, 43, 2, 36, 25, 2,
15151
- 38, 43, 2, 39, 43, 2, 40, 43,
15152
- 2, 41, 30, 2, 42, 43, 3, 21,
15153
- 23, 24, 4, 14, 15, 16, 17
15236
+ 9, 1, 11, 1, 12, 1, 13, 1,
15237
+ 14, 1, 15, 1, 16, 1, 17, 1,
15238
+ 18, 1, 19, 1, 20, 1, 22, 1,
15239
+ 23, 1, 24, 1, 35, 1, 37, 1,
15240
+ 39, 1, 40, 1, 42, 1, 43, 1,
15241
+ 44, 1, 46, 1, 48, 1, 49, 1,
15242
+ 50, 1, 51, 1, 53, 1, 54, 2,
15243
+ 4, 9, 2, 5, 6, 2, 7, 3,
15244
+ 2, 7, 9, 2, 21, 26, 2, 25,
15245
+ 10, 2, 27, 28, 2, 29, 30, 2,
15246
+ 32, 34, 2, 33, 31, 2, 38, 36,
15247
+ 2, 40, 42, 2, 45, 2, 2, 46,
15248
+ 54, 2, 47, 36, 2, 49, 54, 2,
15249
+ 50, 54, 2, 51, 54, 2, 52, 41,
15250
+ 2, 53, 54, 3, 32, 34, 35, 4,
15251
+ 21, 26, 27, 28
15154
15252
  };
15155
15253
 
15156
15254
  static const short _json_key_offsets[] = {
@@ -15334,30 +15432,30 @@ static const char _json_trans_targs[] = {
15334
15432
  106
15335
15433
  };
15336
15434
 
15337
- static const char _json_trans_actions[] = {
15338
- 0, 0, 92, 86, 35, 0, 0, 0,
15339
- 104, 41, 27, 0, 37, 0, 0, 0,
15435
+ static const unsigned char _json_trans_actions[] = {
15436
+ 0, 0, 113, 107, 53, 0, 0, 0,
15437
+ 125, 59, 45, 0, 55, 0, 0, 0,
15340
15438
  0, 0, 0, 0, 0, 0, 0, 0,
15341
- 0, 0, 80, 33, 29, 0, 0, 27,
15342
- 31, 31, 83, 0, 0, 0, 0, 0,
15439
+ 0, 0, 101, 51, 47, 0, 0, 45,
15440
+ 49, 49, 104, 0, 0, 0, 0, 0,
15343
15441
  3, 0, 0, 0, 0, 0, 5, 15,
15344
- 0, 0, 53, 7, 13, 0, 56, 9,
15345
- 9, 9, 59, 62, 11, 17, 17, 17,
15346
- 0, 0, 0, 19, 0, 21, 23, 0,
15347
- 0, 0, 0, 0, 0, 0, 0, 0,
15348
- 0, 0, 0, 0, 0, 0, 0, 0,
15349
- 0, 114, 65, 114, 0, 0, 0, 0,
15350
- 0, 71, 0, 68, 68, 77, 25, 0,
15351
- 110, 74, 92, 86, 35, 0, 0, 0,
15352
- 104, 41, 51, 89, 27, 0, 37, 0,
15353
- 0, 0, 0, 0, 0, 98, 0, 0,
15354
- 0, 101, 0, 0, 0, 95, 0, 80,
15355
- 33, 29, 0, 0, 27, 31, 31, 83,
15356
- 0, 0, 107, 0, 39, 45, 47, 43,
15357
- 49
15442
+ 0, 0, 71, 7, 13, 0, 74, 9,
15443
+ 9, 9, 77, 80, 11, 37, 37, 37,
15444
+ 0, 0, 0, 39, 0, 41, 86, 0,
15445
+ 0, 0, 17, 19, 0, 21, 23, 0,
15446
+ 25, 27, 0, 29, 31, 0, 33, 35,
15447
+ 0, 135, 83, 135, 0, 0, 0, 0,
15448
+ 0, 92, 0, 89, 89, 98, 43, 0,
15449
+ 131, 95, 113, 107, 53, 0, 0, 0,
15450
+ 125, 59, 69, 110, 45, 0, 55, 0,
15451
+ 0, 0, 0, 0, 0, 119, 0, 0,
15452
+ 0, 122, 0, 0, 0, 116, 0, 101,
15453
+ 51, 47, 0, 0, 45, 49, 49, 104,
15454
+ 0, 0, 128, 0, 57, 63, 65, 61,
15455
+ 67
15358
15456
  };
15359
15457
 
15360
- static const char _json_eof_actions[] = {
15458
+ static const unsigned char _json_eof_actions[] = {
15361
15459
  0, 0, 0, 0, 0, 0, 0, 0,
15362
15460
  0, 0, 0, 0, 0, 0, 0, 0,
15363
15461
  0, 0, 0, 0, 0, 0, 0, 0,
@@ -15371,7 +15469,7 @@ static const char _json_eof_actions[] = {
15371
15469
  0, 0, 0, 0, 0, 0, 0, 0,
15372
15470
  0, 0, 0, 0, 0, 0, 0, 0,
15373
15471
  0, 0, 0, 0, 0, 0, 0, 0,
15374
- 0, 0, 0, 39, 45, 47, 43, 49,
15472
+ 0, 0, 0, 57, 63, 65, 61, 67,
15375
15473
  0, 0, 0, 0, 0, 0
15376
15474
  };
15377
15475
 
@@ -15386,7 +15484,7 @@ static const int json_en_value_machine = 78;
15386
15484
  static const int json_en_main = 1;
15387
15485
 
15388
15486
 
15389
- #line 2733 "upb/json/parser.rl"
15487
+ #line 2792 "upb/json/parser.rl"
15390
15488
 
15391
15489
  size_t parse(void *closure, const void *hd, const char *buf, size_t size,
15392
15490
  const upb_bufhandle *handle) {
@@ -15409,7 +15507,7 @@ size_t parse(void *closure, const void *hd, const char *buf, size_t size,
15409
15507
  capture_resume(parser, buf);
15410
15508
 
15411
15509
 
15412
- #line 2831 "upb/json/parser.c"
15510
+ #line 2870 "upb/json/parser.c"
15413
15511
  {
15414
15512
  int _klen;
15415
15513
  unsigned int _trans;
@@ -15484,103 +15582,147 @@ _match:
15484
15582
  switch ( *_acts++ )
15485
15583
  {
15486
15584
  case 1:
15487
- #line 2561 "upb/json/parser.rl"
15585
+ #line 2597 "upb/json/parser.rl"
15488
15586
  { p--; {cs = stack[--top]; goto _again;} }
15489
15587
  break;
15490
15588
  case 2:
15491
- #line 2563 "upb/json/parser.rl"
15589
+ #line 2599 "upb/json/parser.rl"
15492
15590
  { p--; {stack[top++] = cs; cs = 23;goto _again;} }
15493
15591
  break;
15494
15592
  case 3:
15495
- #line 2567 "upb/json/parser.rl"
15593
+ #line 2603 "upb/json/parser.rl"
15496
15594
  { start_text(parser, p); }
15497
15595
  break;
15498
15596
  case 4:
15499
- #line 2568 "upb/json/parser.rl"
15597
+ #line 2604 "upb/json/parser.rl"
15500
15598
  { CHECK_RETURN_TOP(end_text(parser, p)); }
15501
15599
  break;
15502
15600
  case 5:
15503
- #line 2574 "upb/json/parser.rl"
15601
+ #line 2610 "upb/json/parser.rl"
15504
15602
  { start_hex(parser); }
15505
15603
  break;
15506
15604
  case 6:
15507
- #line 2575 "upb/json/parser.rl"
15605
+ #line 2611 "upb/json/parser.rl"
15508
15606
  { hexdigit(parser, p); }
15509
15607
  break;
15510
15608
  case 7:
15511
- #line 2576 "upb/json/parser.rl"
15609
+ #line 2612 "upb/json/parser.rl"
15512
15610
  { CHECK_RETURN_TOP(end_hex(parser)); }
15513
15611
  break;
15514
15612
  case 8:
15515
- #line 2582 "upb/json/parser.rl"
15613
+ #line 2618 "upb/json/parser.rl"
15516
15614
  { CHECK_RETURN_TOP(escape(parser, p)); }
15517
15615
  break;
15518
15616
  case 9:
15519
- #line 2588 "upb/json/parser.rl"
15617
+ #line 2624 "upb/json/parser.rl"
15520
15618
  { p--; {cs = stack[--top]; goto _again;} }
15521
15619
  break;
15522
15620
  case 10:
15523
- #line 2600 "upb/json/parser.rl"
15524
- { start_duration_base(parser, p); }
15621
+ #line 2629 "upb/json/parser.rl"
15622
+ { start_year(parser, p); }
15525
15623
  break;
15526
15624
  case 11:
15527
- #line 2601 "upb/json/parser.rl"
15528
- { CHECK_RETURN_TOP(end_duration_base(parser, p)); }
15625
+ #line 2630 "upb/json/parser.rl"
15626
+ { CHECK_RETURN_TOP(end_year(parser, p)); }
15529
15627
  break;
15530
15628
  case 12:
15531
- #line 2603 "upb/json/parser.rl"
15532
- { p--; {cs = stack[--top]; goto _again;} }
15629
+ #line 2634 "upb/json/parser.rl"
15630
+ { start_month(parser, p); }
15533
15631
  break;
15534
15632
  case 13:
15535
- #line 2608 "upb/json/parser.rl"
15536
- { start_timestamp_base(parser, p); }
15633
+ #line 2635 "upb/json/parser.rl"
15634
+ { CHECK_RETURN_TOP(end_month(parser, p)); }
15537
15635
  break;
15538
15636
  case 14:
15539
- #line 2609 "upb/json/parser.rl"
15540
- { CHECK_RETURN_TOP(end_timestamp_base(parser, p)); }
15637
+ #line 2639 "upb/json/parser.rl"
15638
+ { start_day(parser, p); }
15541
15639
  break;
15542
15640
  case 15:
15543
- #line 2611 "upb/json/parser.rl"
15544
- { start_timestamp_fraction(parser, p); }
15641
+ #line 2640 "upb/json/parser.rl"
15642
+ { CHECK_RETURN_TOP(end_day(parser, p)); }
15545
15643
  break;
15546
15644
  case 16:
15547
- #line 2612 "upb/json/parser.rl"
15548
- { CHECK_RETURN_TOP(end_timestamp_fraction(parser, p)); }
15645
+ #line 2644 "upb/json/parser.rl"
15646
+ { start_hour(parser, p); }
15549
15647
  break;
15550
15648
  case 17:
15551
- #line 2614 "upb/json/parser.rl"
15552
- { start_timestamp_zone(parser, p); }
15649
+ #line 2645 "upb/json/parser.rl"
15650
+ { CHECK_RETURN_TOP(end_hour(parser, p)); }
15553
15651
  break;
15554
15652
  case 18:
15555
- #line 2615 "upb/json/parser.rl"
15556
- { CHECK_RETURN_TOP(end_timestamp_zone(parser, p)); }
15653
+ #line 2649 "upb/json/parser.rl"
15654
+ { start_minute(parser, p); }
15557
15655
  break;
15558
15656
  case 19:
15559
- #line 2617 "upb/json/parser.rl"
15560
- { p--; {cs = stack[--top]; goto _again;} }
15657
+ #line 2650 "upb/json/parser.rl"
15658
+ { CHECK_RETURN_TOP(end_minute(parser, p)); }
15561
15659
  break;
15562
15660
  case 20:
15563
- #line 2622 "upb/json/parser.rl"
15564
- { start_fieldmask_path_text(parser, p); }
15661
+ #line 2654 "upb/json/parser.rl"
15662
+ { start_second(parser, p); }
15565
15663
  break;
15566
15664
  case 21:
15567
- #line 2623 "upb/json/parser.rl"
15568
- { end_fieldmask_path_text(parser, p); }
15665
+ #line 2655 "upb/json/parser.rl"
15666
+ { CHECK_RETURN_TOP(end_second(parser, p)); }
15569
15667
  break;
15570
15668
  case 22:
15571
- #line 2628 "upb/json/parser.rl"
15572
- { start_fieldmask_path(parser); }
15669
+ #line 2660 "upb/json/parser.rl"
15670
+ { start_duration_base(parser, p); }
15573
15671
  break;
15574
15672
  case 23:
15575
- #line 2629 "upb/json/parser.rl"
15576
- { end_fieldmask_path(parser); }
15673
+ #line 2661 "upb/json/parser.rl"
15674
+ { CHECK_RETURN_TOP(end_duration_base(parser, p)); }
15577
15675
  break;
15578
15676
  case 24:
15579
- #line 2635 "upb/json/parser.rl"
15677
+ #line 2663 "upb/json/parser.rl"
15580
15678
  { p--; {cs = stack[--top]; goto _again;} }
15581
15679
  break;
15582
15680
  case 25:
15583
- #line 2640 "upb/json/parser.rl"
15681
+ #line 2668 "upb/json/parser.rl"
15682
+ { start_timestamp_base(parser); }
15683
+ break;
15684
+ case 26:
15685
+ #line 2670 "upb/json/parser.rl"
15686
+ { start_timestamp_fraction(parser, p); }
15687
+ break;
15688
+ case 27:
15689
+ #line 2671 "upb/json/parser.rl"
15690
+ { CHECK_RETURN_TOP(end_timestamp_fraction(parser, p)); }
15691
+ break;
15692
+ case 28:
15693
+ #line 2673 "upb/json/parser.rl"
15694
+ { start_timestamp_zone(parser, p); }
15695
+ break;
15696
+ case 29:
15697
+ #line 2674 "upb/json/parser.rl"
15698
+ { CHECK_RETURN_TOP(end_timestamp_zone(parser, p)); }
15699
+ break;
15700
+ case 30:
15701
+ #line 2676 "upb/json/parser.rl"
15702
+ { p--; {cs = stack[--top]; goto _again;} }
15703
+ break;
15704
+ case 31:
15705
+ #line 2681 "upb/json/parser.rl"
15706
+ { start_fieldmask_path_text(parser, p); }
15707
+ break;
15708
+ case 32:
15709
+ #line 2682 "upb/json/parser.rl"
15710
+ { end_fieldmask_path_text(parser, p); }
15711
+ break;
15712
+ case 33:
15713
+ #line 2687 "upb/json/parser.rl"
15714
+ { start_fieldmask_path(parser); }
15715
+ break;
15716
+ case 34:
15717
+ #line 2688 "upb/json/parser.rl"
15718
+ { end_fieldmask_path(parser); }
15719
+ break;
15720
+ case 35:
15721
+ #line 2694 "upb/json/parser.rl"
15722
+ { p--; {cs = stack[--top]; goto _again;} }
15723
+ break;
15724
+ case 36:
15725
+ #line 2699 "upb/json/parser.rl"
15584
15726
  {
15585
15727
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_TIMESTAMP)) {
15586
15728
  {stack[top++] = cs; cs = 47;goto _again;}
@@ -15593,12 +15735,12 @@ _match:
15593
15735
  }
15594
15736
  }
15595
15737
  break;
15596
- case 26:
15597
- #line 2653 "upb/json/parser.rl"
15738
+ case 37:
15739
+ #line 2712 "upb/json/parser.rl"
15598
15740
  { p--; {stack[top++] = cs; cs = 78;goto _again;} }
15599
15741
  break;
15600
- case 27:
15601
- #line 2658 "upb/json/parser.rl"
15742
+ case 38:
15743
+ #line 2717 "upb/json/parser.rl"
15602
15744
  {
15603
15745
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15604
15746
  start_any_member(parser, p);
@@ -15607,12 +15749,12 @@ _match:
15607
15749
  }
15608
15750
  }
15609
15751
  break;
15610
- case 28:
15611
- #line 2665 "upb/json/parser.rl"
15752
+ case 39:
15753
+ #line 2724 "upb/json/parser.rl"
15612
15754
  { CHECK_RETURN_TOP(end_membername(parser)); }
15613
15755
  break;
15614
- case 29:
15615
- #line 2668 "upb/json/parser.rl"
15756
+ case 40:
15757
+ #line 2727 "upb/json/parser.rl"
15616
15758
  {
15617
15759
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15618
15760
  end_any_member(parser, p);
@@ -15621,8 +15763,8 @@ _match:
15621
15763
  }
15622
15764
  }
15623
15765
  break;
15624
- case 30:
15625
- #line 2679 "upb/json/parser.rl"
15766
+ case 41:
15767
+ #line 2738 "upb/json/parser.rl"
15626
15768
  {
15627
15769
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15628
15770
  start_any_object(parser, p);
@@ -15631,8 +15773,8 @@ _match:
15631
15773
  }
15632
15774
  }
15633
15775
  break;
15634
- case 31:
15635
- #line 2688 "upb/json/parser.rl"
15776
+ case 42:
15777
+ #line 2747 "upb/json/parser.rl"
15636
15778
  {
15637
15779
  if (is_wellknown_msg(parser, UPB_WELLKNOWN_ANY)) {
15638
15780
  CHECK_RETURN_TOP(end_any_object(parser, p));
@@ -15641,55 +15783,55 @@ _match:
15641
15783
  }
15642
15784
  }
15643
15785
  break;
15644
- case 32:
15645
- #line 2700 "upb/json/parser.rl"
15786
+ case 43:
15787
+ #line 2759 "upb/json/parser.rl"
15646
15788
  { CHECK_RETURN_TOP(start_array(parser)); }
15647
15789
  break;
15648
- case 33:
15649
- #line 2704 "upb/json/parser.rl"
15790
+ case 44:
15791
+ #line 2763 "upb/json/parser.rl"
15650
15792
  { end_array(parser); }
15651
15793
  break;
15652
- case 34:
15653
- #line 2709 "upb/json/parser.rl"
15794
+ case 45:
15795
+ #line 2768 "upb/json/parser.rl"
15654
15796
  { CHECK_RETURN_TOP(start_number(parser, p)); }
15655
15797
  break;
15656
- case 35:
15657
- #line 2710 "upb/json/parser.rl"
15798
+ case 46:
15799
+ #line 2769 "upb/json/parser.rl"
15658
15800
  { CHECK_RETURN_TOP(end_number(parser, p)); }
15659
15801
  break;
15660
- case 36:
15661
- #line 2712 "upb/json/parser.rl"
15802
+ case 47:
15803
+ #line 2771 "upb/json/parser.rl"
15662
15804
  { CHECK_RETURN_TOP(start_stringval(parser)); }
15663
15805
  break;
15664
- case 37:
15665
- #line 2713 "upb/json/parser.rl"
15806
+ case 48:
15807
+ #line 2772 "upb/json/parser.rl"
15666
15808
  { CHECK_RETURN_TOP(end_stringval(parser)); }
15667
15809
  break;
15668
- case 38:
15669
- #line 2715 "upb/json/parser.rl"
15810
+ case 49:
15811
+ #line 2774 "upb/json/parser.rl"
15670
15812
  { CHECK_RETURN_TOP(end_bool(parser, true)); }
15671
15813
  break;
15672
- case 39:
15673
- #line 2717 "upb/json/parser.rl"
15814
+ case 50:
15815
+ #line 2776 "upb/json/parser.rl"
15674
15816
  { CHECK_RETURN_TOP(end_bool(parser, false)); }
15675
15817
  break;
15676
- case 40:
15677
- #line 2719 "upb/json/parser.rl"
15818
+ case 51:
15819
+ #line 2778 "upb/json/parser.rl"
15678
15820
  { CHECK_RETURN_TOP(end_null(parser)); }
15679
15821
  break;
15680
- case 41:
15681
- #line 2721 "upb/json/parser.rl"
15822
+ case 52:
15823
+ #line 2780 "upb/json/parser.rl"
15682
15824
  { CHECK_RETURN_TOP(start_subobject_full(parser)); }
15683
15825
  break;
15684
- case 42:
15685
- #line 2722 "upb/json/parser.rl"
15826
+ case 53:
15827
+ #line 2781 "upb/json/parser.rl"
15686
15828
  { end_subobject_full(parser); }
15687
15829
  break;
15688
- case 43:
15689
- #line 2727 "upb/json/parser.rl"
15830
+ case 54:
15831
+ #line 2786 "upb/json/parser.rl"
15690
15832
  { p--; {cs = stack[--top]; goto _again;} }
15691
15833
  break;
15692
- #line 3111 "upb/json/parser.c"
15834
+ #line 3194 "upb/json/parser.c"
15693
15835
  }
15694
15836
  }
15695
15837
 
@@ -15706,32 +15848,32 @@ _again:
15706
15848
  while ( __nacts-- > 0 ) {
15707
15849
  switch ( *__acts++ ) {
15708
15850
  case 0:
15709
- #line 2559 "upb/json/parser.rl"
15851
+ #line 2595 "upb/json/parser.rl"
15710
15852
  { p--; {cs = stack[--top]; if ( p == pe )
15711
15853
  goto _test_eof;
15712
15854
  goto _again;} }
15713
15855
  break;
15714
- case 35:
15715
- #line 2710 "upb/json/parser.rl"
15856
+ case 46:
15857
+ #line 2769 "upb/json/parser.rl"
15716
15858
  { CHECK_RETURN_TOP(end_number(parser, p)); }
15717
15859
  break;
15718
- case 38:
15719
- #line 2715 "upb/json/parser.rl"
15860
+ case 49:
15861
+ #line 2774 "upb/json/parser.rl"
15720
15862
  { CHECK_RETURN_TOP(end_bool(parser, true)); }
15721
15863
  break;
15722
- case 39:
15723
- #line 2717 "upb/json/parser.rl"
15864
+ case 50:
15865
+ #line 2776 "upb/json/parser.rl"
15724
15866
  { CHECK_RETURN_TOP(end_bool(parser, false)); }
15725
15867
  break;
15726
- case 40:
15727
- #line 2719 "upb/json/parser.rl"
15868
+ case 51:
15869
+ #line 2778 "upb/json/parser.rl"
15728
15870
  { CHECK_RETURN_TOP(end_null(parser)); }
15729
15871
  break;
15730
- case 42:
15731
- #line 2722 "upb/json/parser.rl"
15872
+ case 53:
15873
+ #line 2781 "upb/json/parser.rl"
15732
15874
  { end_subobject_full(parser); }
15733
15875
  break;
15734
- #line 3153 "upb/json/parser.c"
15876
+ #line 3236 "upb/json/parser.c"
15735
15877
  }
15736
15878
  }
15737
15879
  }
@@ -15739,7 +15881,7 @@ goto _again;} }
15739
15881
  _out: {}
15740
15882
  }
15741
15883
 
15742
- #line 2755 "upb/json/parser.rl"
15884
+ #line 2814 "upb/json/parser.rl"
15743
15885
 
15744
15886
  if (p != pe) {
15745
15887
  upb_status_seterrf(&parser->status, "Parse error at '%.*s'\n", pe - p, p);
@@ -15779,22 +15921,17 @@ static void json_parser_reset(upb_json_parser *p) {
15779
15921
  int top;
15780
15922
 
15781
15923
  p->top = p->stack;
15782
- p->top->f = NULL;
15783
- p->top->is_map = false;
15784
- p->top->is_mapentry = false;
15785
- p->top->is_any = false;
15786
- p->top->any_frame = NULL;
15787
- p->top->is_unknown_field = false;
15924
+ init_frame(p->top);
15788
15925
 
15789
15926
  /* Emit Ragel initialization of the parser. */
15790
15927
 
15791
- #line 3210 "upb/json/parser.c"
15928
+ #line 3288 "upb/json/parser.c"
15792
15929
  {
15793
15930
  cs = json_start;
15794
15931
  top = 0;
15795
15932
  }
15796
15933
 
15797
- #line 2803 "upb/json/parser.rl"
15934
+ #line 2857 "upb/json/parser.rl"
15798
15935
  p->current_state = cs;
15799
15936
  p->parser_top = top;
15800
15937
  accumulate_clear(p);
@@ -16396,9 +16533,14 @@ static size_t putbytes(void *closure, const void *handler_data, const char *str,
16396
16533
  UPB_UNUSED(handler_data);
16397
16534
  UPB_UNUSED(handle);
16398
16535
 
16536
+ print_data(p, "\"", 1);
16537
+
16399
16538
  while (remaining > 2) {
16400
- /* TODO(haberman): handle encoded lengths > sizeof(data) */
16401
- UPB_ASSERT((limit - to) >= 4);
16539
+ if (limit - to < 4) {
16540
+ bytes = to - data;
16541
+ putstring(p, data, bytes);
16542
+ to = data;
16543
+ }
16402
16544
 
16403
16545
  to[0] = base64[from[0] >> 2];
16404
16546
  to[1] = base64[((from[0] & 0x3) << 4) | (from[1] >> 4)];
@@ -16430,7 +16572,6 @@ static size_t putbytes(void *closure, const void *handler_data, const char *str,
16430
16572
  }
16431
16573
 
16432
16574
  bytes = to - data;
16433
- print_data(p, "\"", 1);
16434
16575
  putstring(p, data, bytes);
16435
16576
  print_data(p, "\"", 1);
16436
16577
  return len;
@@ -16703,7 +16844,6 @@ static void *startseq_fieldmask(void *closure, const void *handler_data) {
16703
16844
  UPB_UNUSED(handler_data);
16704
16845
  p->depth_++;
16705
16846
  p->first_elem_[p->depth_] = true;
16706
- print_data(p, "\"", 1);
16707
16847
  return closure;
16708
16848
  }
16709
16849
 
@@ -16711,7 +16851,6 @@ static bool endseq_fieldmask(void *closure, const void *handler_data) {
16711
16851
  upb_json_printer *p = closure;
16712
16852
  UPB_UNUSED(handler_data);
16713
16853
  p->depth_--;
16714
- print_data(p, "\"", 1);
16715
16854
  return true;
16716
16855
  }
16717
16856
 
@@ -16931,6 +17070,29 @@ static bool printer_endmsg_noframe(
16931
17070
  return true;
16932
17071
  }
16933
17072
 
17073
+ static bool printer_startmsg_fieldmask(
17074
+ void *closure, const void *handler_data) {
17075
+ upb_json_printer *p = closure;
17076
+ UPB_UNUSED(handler_data);
17077
+ if (p->depth_ == 0) {
17078
+ upb_bytessink_start(p->output_, 0, &p->subc_);
17079
+ }
17080
+ print_data(p, "\"", 1);
17081
+ return true;
17082
+ }
17083
+
17084
+ static bool printer_endmsg_fieldmask(
17085
+ void *closure, const void *handler_data, upb_status *s) {
17086
+ upb_json_printer *p = closure;
17087
+ UPB_UNUSED(handler_data);
17088
+ UPB_UNUSED(s);
17089
+ print_data(p, "\"", 1);
17090
+ if (p->depth_ == 0) {
17091
+ upb_bytessink_end(p->output_);
17092
+ }
17093
+ return true;
17094
+ }
17095
+
16934
17096
  static void *scalar_startstr_onlykey(
16935
17097
  void *closure, const void *handler_data, size_t size_hint) {
16936
17098
  upb_json_printer *p = closure;
@@ -16984,8 +17146,8 @@ void printer_sethandlers_fieldmask(const void *closure, upb_handlers *h) {
16984
17146
  upb_handlers_setstartseq(h, f, startseq_fieldmask, &empty_attr);
16985
17147
  upb_handlers_setendseq(h, f, endseq_fieldmask, &empty_attr);
16986
17148
 
16987
- upb_handlers_setstartmsg(h, printer_startmsg_noframe, &empty_attr);
16988
- upb_handlers_setendmsg(h, printer_endmsg_noframe, &empty_attr);
17149
+ upb_handlers_setstartmsg(h, printer_startmsg_fieldmask, &empty_attr);
17150
+ upb_handlers_setendmsg(h, printer_endmsg_fieldmask, &empty_attr);
16989
17151
 
16990
17152
  upb_handlers_setstartstr(h, f, repeated_startstr_fieldmask, &empty_attr);
16991
17153
  upb_handlers_setstring(h, f, repeated_str_fieldmask, &empty_attr);