json_decode.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2021, Google LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of Google LLC nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "upb/json_decode.h"
29 
30 #include <errno.h>
31 #include <float.h>
32 #include <inttypes.h>
33 #include <limits.h>
34 #include <math.h>
35 #include <setjmp.h>
36 #include <stdlib.h>
37 #include <string.h>
38 
39 #include "upb/encode.h"
40 #include "upb/reflection.h"
41 
42 /* Special header, must be included last. */
43 #include "upb/port_def.inc"
44 
45 typedef struct {
46  const char *ptr, *end;
47  upb_Arena* arena; /* TODO: should we have a tmp arena for tmp data? */
49  int depth;
51  jmp_buf err;
52  int line;
53  const char* line_begin;
54  bool is_first;
55  int options;
57 } jsondec;
58 
60 
61 /* Forward declarations of mutually-recursive functions. */
63  const upb_MessageDef* m);
66  const upb_MessageDef* m);
67 static void jsondec_object(jsondec* d, upb_Message* msg,
68  const upb_MessageDef* m);
69 
70 static bool jsondec_streql(upb_StringView str, const char* lit) {
71  return str.size == strlen(lit) && memcmp(str.data, lit, str.size) == 0;
72 }
73 
74 static bool jsondec_isnullvalue(const upb_FieldDef* f) {
77  "google.protobuf.NullValue") == 0;
78 }
79 
80 static bool jsondec_isvalue(const upb_FieldDef* f) {
85 }
86 
87 UPB_NORETURN static void jsondec_err(jsondec* d, const char* msg) {
88  upb_Status_SetErrorFormat(d->status, "Error parsing JSON @%d:%d: %s", d->line,
89  (int)(d->ptr - d->line_begin), msg);
90  UPB_LONGJMP(d->err, 1);
91 }
92 
93 UPB_PRINTF(2, 3)
94 UPB_NORETURN static void jsondec_errf(jsondec* d, const char* fmt, ...) {
95  va_list argp;
96  upb_Status_SetErrorFormat(d->status, "Error parsing JSON @%d:%d: ", d->line,
97  (int)(d->ptr - d->line_begin));
98  va_start(argp, fmt);
100  va_end(argp);
101  UPB_LONGJMP(d->err, 1);
102 }
103 
104 static void jsondec_skipws(jsondec* d) {
105  while (d->ptr != d->end) {
106  switch (*d->ptr) {
107  case '\n':
108  d->line++;
109  d->line_begin = d->ptr;
110  /* Fallthrough. */
111  case '\r':
112  case '\t':
113  case ' ':
114  d->ptr++;
115  break;
116  default:
117  return;
118  }
119  }
120  jsondec_err(d, "Unexpected EOF");
121 }
122 
123 static bool jsondec_tryparsech(jsondec* d, char ch) {
124  if (d->ptr == d->end || *d->ptr != ch) return false;
125  d->ptr++;
126  return true;
127 }
128 
129 static void jsondec_parselit(jsondec* d, const char* lit) {
130  size_t avail = d->end - d->ptr;
131  size_t len = strlen(lit);
132  if (avail < len || memcmp(d->ptr, lit, len) != 0) {
133  jsondec_errf(d, "Expected: '%s'", lit);
134  }
135  d->ptr += len;
136 }
137 
138 static void jsondec_wsch(jsondec* d, char ch) {
139  jsondec_skipws(d);
140  if (!jsondec_tryparsech(d, ch)) {
141  jsondec_errf(d, "Expected: '%c'", ch);
142  }
143 }
144 
145 static void jsondec_true(jsondec* d) { jsondec_parselit(d, "true"); }
146 static void jsondec_false(jsondec* d) { jsondec_parselit(d, "false"); }
147 static void jsondec_null(jsondec* d) { jsondec_parselit(d, "null"); }
148 
149 static void jsondec_entrysep(jsondec* d) {
150  jsondec_skipws(d);
151  jsondec_parselit(d, ":");
152 }
153 
154 static int jsondec_rawpeek(jsondec* d) {
155  switch (*d->ptr) {
156  case '{':
157  return JD_OBJECT;
158  case '[':
159  return JD_ARRAY;
160  case '"':
161  return JD_STRING;
162  case '-':
163  case '0':
164  case '1':
165  case '2':
166  case '3':
167  case '4':
168  case '5':
169  case '6':
170  case '7':
171  case '8':
172  case '9':
173  return JD_NUMBER;
174  case 't':
175  return JD_TRUE;
176  case 'f':
177  return JD_FALSE;
178  case 'n':
179  return JD_NULL;
180  default:
181  jsondec_errf(d, "Unexpected character: '%c'", *d->ptr);
182  }
183 }
184 
185 /* JSON object/array **********************************************************/
186 
187 /* These are used like so:
188  *
189  * jsondec_objstart(d);
190  * while (jsondec_objnext(d)) {
191  * ...
192  * }
193  * jsondec_objend(d) */
194 
195 static int jsondec_peek(jsondec* d) {
196  jsondec_skipws(d);
197  return jsondec_rawpeek(d);
198 }
199 
200 static void jsondec_push(jsondec* d) {
201  if (--d->depth < 0) {
202  jsondec_err(d, "Recursion limit exceeded");
203  }
204  d->is_first = true;
205 }
206 
207 static bool jsondec_seqnext(jsondec* d, char end_ch) {
208  bool is_first = d->is_first;
209  d->is_first = false;
210  jsondec_skipws(d);
211  if (*d->ptr == end_ch) return false;
212  if (!is_first) jsondec_parselit(d, ",");
213  return true;
214 }
215 
216 static void jsondec_arrstart(jsondec* d) {
217  jsondec_push(d);
218  jsondec_wsch(d, '[');
219 }
220 
221 static void jsondec_arrend(jsondec* d) {
222  d->depth++;
223  jsondec_wsch(d, ']');
224 }
225 
226 static bool jsondec_arrnext(jsondec* d) { return jsondec_seqnext(d, ']'); }
227 
228 static void jsondec_objstart(jsondec* d) {
229  jsondec_push(d);
230  jsondec_wsch(d, '{');
231 }
232 
233 static void jsondec_objend(jsondec* d) {
234  d->depth++;
235  jsondec_wsch(d, '}');
236 }
237 
238 static bool jsondec_objnext(jsondec* d) {
239  if (!jsondec_seqnext(d, '}')) return false;
240  if (jsondec_peek(d) != JD_STRING) {
241  jsondec_err(d, "Object must start with string");
242  }
243  return true;
244 }
245 
246 /* JSON number ****************************************************************/
247 
249  const char* start = d->ptr;
250 
251  while (d->ptr < d->end) {
252  if (*d->ptr < '0' || *d->ptr > '9') {
253  break;
254  }
255  d->ptr++;
256  }
257 
258  return d->ptr != start;
259 }
260 
261 static void jsondec_skipdigits(jsondec* d) {
262  if (!jsondec_tryskipdigits(d)) {
263  jsondec_err(d, "Expected one or more digits");
264  }
265 }
266 
267 static double jsondec_number(jsondec* d) {
268  const char* start = d->ptr;
269 
270  assert(jsondec_rawpeek(d) == JD_NUMBER);
271 
272  /* Skip over the syntax of a number, as specified by JSON. */
273  if (*d->ptr == '-') d->ptr++;
274 
275  if (jsondec_tryparsech(d, '0')) {
276  if (jsondec_tryskipdigits(d)) {
277  jsondec_err(d, "number cannot have leading zero");
278  }
279  } else {
281  }
282 
283  if (d->ptr == d->end) goto parse;
284  if (jsondec_tryparsech(d, '.')) {
286  }
287  if (d->ptr == d->end) goto parse;
288 
289  if (*d->ptr == 'e' || *d->ptr == 'E') {
290  d->ptr++;
291  if (d->ptr == d->end) {
292  jsondec_err(d, "Unexpected EOF in number");
293  }
294  if (*d->ptr == '+' || *d->ptr == '-') {
295  d->ptr++;
296  }
298  }
299 
300 parse:
301  /* Having verified the syntax of a JSON number, use strtod() to parse
302  * (strtod() accepts a superset of JSON syntax). */
303  errno = 0;
304  {
305  char* end;
306  double val = strtod(start, &end);
307  assert(end == d->ptr);
308 
309  /* Currently the min/max-val conformance tests fail if we check this. Does
310  * this mean the conformance tests are wrong or strtod() is wrong, or
311  * something else? Investigate further. */
312  /*
313  if (errno == ERANGE) {
314  jsondec_err(d, "Number out of range");
315  }
316  */
317 
318  if (val > DBL_MAX || val < -DBL_MAX) {
319  jsondec_err(d, "Number out of range");
320  }
321 
322  return val;
323  }
324 }
325 
326 /* JSON string ****************************************************************/
327 
328 static char jsondec_escape(jsondec* d) {
329  switch (*d->ptr++) {
330  case '"':
331  return '\"';
332  case '\\':
333  return '\\';
334  case '/':
335  return '/';
336  case 'b':
337  return '\b';
338  case 'f':
339  return '\f';
340  case 'n':
341  return '\n';
342  case 'r':
343  return '\r';
344  case 't':
345  return '\t';
346  default:
347  jsondec_err(d, "Invalid escape char");
348  }
349 }
350 
352  uint32_t cp = 0;
353  const char* end;
354 
355  if (d->end - d->ptr < 4) {
356  jsondec_err(d, "EOF inside string");
357  }
358 
359  end = d->ptr + 4;
360  while (d->ptr < end) {
361  char ch = *d->ptr++;
362  if (ch >= '0' && ch <= '9') {
363  ch -= '0';
364  } else if (ch >= 'a' && ch <= 'f') {
365  ch = ch - 'a' + 10;
366  } else if (ch >= 'A' && ch <= 'F') {
367  ch = ch - 'A' + 10;
368  } else {
369  jsondec_err(d, "Invalid hex digit");
370  }
371  cp = (cp << 4) | ch;
372  }
373 
374  return cp;
375 }
376 
377 /* Parses a \uXXXX unicode escape (possibly a surrogate pair). */
378 static size_t jsondec_unicode(jsondec* d, char* out) {
380  if (cp >= 0xd800 && cp <= 0xdbff) {
381  /* Surrogate pair: two 16-bit codepoints become a 32-bit codepoint. */
382  uint32_t high = cp;
383  uint32_t low;
384  jsondec_parselit(d, "\\u");
385  low = jsondec_codepoint(d);
386  if (low < 0xdc00 || low > 0xdfff) {
387  jsondec_err(d, "Invalid low surrogate");
388  }
389  cp = (high & 0x3ff) << 10;
390  cp |= (low & 0x3ff);
391  cp += 0x10000;
392  } else if (cp >= 0xdc00 && cp <= 0xdfff) {
393  jsondec_err(d, "Unpaired low surrogate");
394  }
395 
396  /* Write to UTF-8 */
397  if (cp <= 0x7f) {
398  out[0] = cp;
399  return 1;
400  } else if (cp <= 0x07FF) {
401  out[0] = ((cp >> 6) & 0x1F) | 0xC0;
402  out[1] = ((cp >> 0) & 0x3F) | 0x80;
403  return 2;
404  } else if (cp <= 0xFFFF) {
405  out[0] = ((cp >> 12) & 0x0F) | 0xE0;
406  out[1] = ((cp >> 6) & 0x3F) | 0x80;
407  out[2] = ((cp >> 0) & 0x3F) | 0x80;
408  return 3;
409  } else if (cp < 0x10FFFF) {
410  out[0] = ((cp >> 18) & 0x07) | 0xF0;
411  out[1] = ((cp >> 12) & 0x3f) | 0x80;
412  out[2] = ((cp >> 6) & 0x3f) | 0x80;
413  out[3] = ((cp >> 0) & 0x3f) | 0x80;
414  return 4;
415  } else {
416  jsondec_err(d, "Invalid codepoint");
417  }
418 }
419 
420 static void jsondec_resize(jsondec* d, char** buf, char** end, char** buf_end) {
421  size_t oldsize = *buf_end - *buf;
422  size_t len = *end - *buf;
423  size_t size = UPB_MAX(8, 2 * oldsize);
424 
425  *buf = upb_Arena_Realloc(d->arena, *buf, len, size);
426  if (!*buf) jsondec_err(d, "Out of memory");
427 
428  *end = *buf + len;
429  *buf_end = *buf + size;
430 }
431 
433  char* buf = NULL;
434  char* end = NULL;
435  char* buf_end = NULL;
436 
437  jsondec_skipws(d);
438 
439  if (*d->ptr++ != '"') {
440  jsondec_err(d, "Expected string");
441  }
442 
443  while (d->ptr < d->end) {
444  char ch = *d->ptr++;
445 
446  if (end == buf_end) {
447  jsondec_resize(d, &buf, &end, &buf_end);
448  }
449 
450  switch (ch) {
451  case '"': {
453  ret.data = buf;
454  ret.size = end - buf;
455  *end = '\0'; /* Needed for possible strtod(). */
456  return ret;
457  }
458  case '\\':
459  if (d->ptr == d->end) goto eof;
460  if (*d->ptr == 'u') {
461  d->ptr++;
462  if (buf_end - end < 4) {
463  /* Allow space for maximum-sized code point (4 bytes). */
464  jsondec_resize(d, &buf, &end, &buf_end);
465  }
466  end += jsondec_unicode(d, end);
467  } else {
468  *end++ = jsondec_escape(d);
469  }
470  break;
471  default:
472  if ((unsigned char)*d->ptr < 0x20) {
473  jsondec_err(d, "Invalid char in JSON string");
474  }
475  *end++ = ch;
476  break;
477  }
478  }
479 
480 eof:
481  jsondec_err(d, "EOF inside string");
482 }
483 
484 static void jsondec_skipval(jsondec* d) {
485  switch (jsondec_peek(d)) {
486  case JD_OBJECT:
488  while (jsondec_objnext(d)) {
489  jsondec_string(d);
492  }
493  jsondec_objend(d);
494  break;
495  case JD_ARRAY:
497  while (jsondec_arrnext(d)) {
499  }
500  jsondec_arrend(d);
501  break;
502  case JD_TRUE:
503  jsondec_true(d);
504  break;
505  case JD_FALSE:
506  jsondec_false(d);
507  break;
508  case JD_NULL:
509  jsondec_null(d);
510  break;
511  case JD_STRING:
512  jsondec_string(d);
513  break;
514  case JD_NUMBER:
515  jsondec_number(d);
516  break;
517  }
518 }
519 
520 /* Base64 decoding for bytes fields. ******************************************/
521 
522 static unsigned int jsondec_base64_tablelookup(const char ch) {
523  /* Table includes the normal base64 chars plus the URL-safe variant. */
524  const signed char table[256] = {
525  -1, -1, -1, -1, -1, -1, -1,
526  -1, -1, -1, -1, -1, -1, -1,
527  -1, -1, -1, -1, -1, -1, -1,
528  -1, -1, -1, -1, -1, -1, -1,
529  -1, -1, -1, -1, -1, -1, -1,
530  -1, -1, -1, -1, -1, -1, -1,
531  -1, 62 /*+*/, -1, 62 /*-*/, -1, 63 /*/ */, 52 /*0*/,
532  53 /*1*/, 54 /*2*/, 55 /*3*/, 56 /*4*/, 57 /*5*/, 58 /*6*/, 59 /*7*/,
533  60 /*8*/, 61 /*9*/, -1, -1, -1, -1, -1,
534  -1, -1, 0 /*A*/, 1 /*B*/, 2 /*C*/, 3 /*D*/, 4 /*E*/,
535  5 /*F*/, 6 /*G*/, 07 /*H*/, 8 /*I*/, 9 /*J*/, 10 /*K*/, 11 /*L*/,
536  12 /*M*/, 13 /*N*/, 14 /*O*/, 15 /*P*/, 16 /*Q*/, 17 /*R*/, 18 /*S*/,
537  19 /*T*/, 20 /*U*/, 21 /*V*/, 22 /*W*/, 23 /*X*/, 24 /*Y*/, 25 /*Z*/,
538  -1, -1, -1, -1, 63 /*_*/, -1, 26 /*a*/,
539  27 /*b*/, 28 /*c*/, 29 /*d*/, 30 /*e*/, 31 /*f*/, 32 /*g*/, 33 /*h*/,
540  34 /*i*/, 35 /*j*/, 36 /*k*/, 37 /*l*/, 38 /*m*/, 39 /*n*/, 40 /*o*/,
541  41 /*p*/, 42 /*q*/, 43 /*r*/, 44 /*s*/, 45 /*t*/, 46 /*u*/, 47 /*v*/,
542  48 /*w*/, 49 /*x*/, 50 /*y*/, 51 /*z*/, -1, -1, -1,
543  -1, -1, -1, -1, -1, -1, -1,
544  -1, -1, -1, -1, -1, -1, -1,
545  -1, -1, -1, -1, -1, -1, -1,
546  -1, -1, -1, -1, -1, -1, -1,
547  -1, -1, -1, -1, -1, -1, -1,
548  -1, -1, -1, -1, -1, -1, -1,
549  -1, -1, -1, -1, -1, -1, -1,
550  -1, -1, -1, -1, -1, -1, -1,
551  -1, -1, -1, -1, -1, -1, -1,
552  -1, -1, -1, -1, -1, -1, -1,
553  -1, -1, -1, -1, -1, -1, -1,
554  -1, -1, -1, -1, -1, -1, -1,
555  -1, -1, -1, -1, -1, -1, -1,
556  -1, -1, -1, -1, -1, -1, -1,
557  -1, -1, -1, -1, -1, -1, -1,
558  -1, -1, -1, -1, -1, -1, -1,
559  -1, -1, -1, -1, -1, -1, -1,
560  -1, -1, -1, -1, -1, -1, -1,
561  -1, -1, -1, -1};
562 
563  /* Sign-extend return value so high bit will be set on any unexpected char. */
564  return table[(unsigned)ch];
565 }
566 
567 static char* jsondec_partialbase64(jsondec* d, const char* ptr, const char* end,
568  char* out) {
569  int32_t val = -1;
570 
571  switch (end - ptr) {
572  case 2:
573  val = jsondec_base64_tablelookup(ptr[0]) << 18 |
575  out[0] = val >> 16;
576  out += 1;
577  break;
578  case 3:
579  val = jsondec_base64_tablelookup(ptr[0]) << 18 |
580  jsondec_base64_tablelookup(ptr[1]) << 12 |
582  out[0] = val >> 16;
583  out[1] = (val >> 8) & 0xff;
584  out += 2;
585  break;
586  }
587 
588  if (val < 0) {
589  jsondec_err(d, "Corrupt base64");
590  }
591 
592  return out;
593 }
594 
596  /* We decode in place. This is safe because this is a new buffer (not
597  * aliasing the input) and because base64 decoding shrinks 4 bytes into 3. */
598  char* out = (char*)str.data;
599  const char* ptr = str.data;
600  const char* end = ptr + str.size;
601  const char* end4 = ptr + (str.size & -4); /* Round down to multiple of 4. */
602 
603  for (; ptr < end4; ptr += 4, out += 3) {
604  int val = jsondec_base64_tablelookup(ptr[0]) << 18 |
605  jsondec_base64_tablelookup(ptr[1]) << 12 |
608 
609  if (val < 0) {
610  /* Junk chars or padding. Remove trailing padding, if any. */
611  if (end - ptr == 4 && ptr[3] == '=') {
612  if (ptr[2] == '=') {
613  end -= 2;
614  } else {
615  end -= 1;
616  }
617  }
618  break;
619  }
620 
621  out[0] = val >> 16;
622  out[1] = (val >> 8) & 0xff;
623  out[2] = val & 0xff;
624  }
625 
626  if (ptr < end) {
627  /* Process remaining chars. We do not require padding. */
629  }
630 
631  return out - str.data;
632 }
633 
634 /* Low-level integer parsing **************************************************/
635 
636 /* We use these hand-written routines instead of strto[u]l() because the "long
637  * long" variants aren't in c89. Also our version allows setting a ptr limit. */
638 
639 static const char* jsondec_buftouint64(jsondec* d, const char* ptr,
640  const char* end, uint64_t* val) {
641  uint64_t u64 = 0;
642  while (ptr < end) {
643  unsigned ch = *ptr - '0';
644  if (ch >= 10) break;
645  if (u64 > UINT64_MAX / 10 || u64 * 10 > UINT64_MAX - ch) {
646  jsondec_err(d, "Integer overflow");
647  }
648  u64 *= 10;
649  u64 += ch;
650  ptr++;
651  }
652 
653  *val = u64;
654  return ptr;
655 }
656 
657 static const char* jsondec_buftoint64(jsondec* d, const char* ptr,
658  const char* end, int64_t* val) {
659  bool neg = false;
660  uint64_t u64;
661 
662  if (ptr != end && *ptr == '-') {
663  ptr++;
664  neg = true;
665  }
666 
667  ptr = jsondec_buftouint64(d, ptr, end, &u64);
668  if (u64 > (uint64_t)INT64_MAX + neg) {
669  jsondec_err(d, "Integer overflow");
670  }
671 
672  *val = neg ? -u64 : u64;
673  return ptr;
674 }
675 
677  const char* end = str.data + str.size;
678  uint64_t ret;
679  if (jsondec_buftouint64(d, str.data, end, &ret) != end) {
680  jsondec_err(d, "Non-number characters in quoted integer");
681  }
682  return ret;
683 }
684 
686  const char* end = str.data + str.size;
687  int64_t ret;
688  if (jsondec_buftoint64(d, str.data, end, &ret) != end) {
689  jsondec_err(d, "Non-number characters in quoted integer");
690  }
691  return ret;
692 }
693 
694 /* Primitive value types ******************************************************/
695 
696 /* Parse INT32 or INT64 value. */
698  upb_MessageValue val;
699 
700  switch (jsondec_peek(d)) {
701  case JD_NUMBER: {
702  double dbl = jsondec_number(d);
703  if (dbl > 9223372036854774784.0 || dbl < -9223372036854775808.0) {
704  jsondec_err(d, "JSON number is out of range.");
705  }
706  val.int64_val = dbl; /* must be guarded, overflow here is UB */
707  if (val.int64_val != dbl) {
708  jsondec_errf(d, "JSON number was not integral (%f != %" PRId64 ")", dbl,
709  val.int64_val);
710  }
711  break;
712  }
713  case JD_STRING: {
716  break;
717  }
718  default:
719  jsondec_err(d, "Expected number or string");
720  }
721 
724  if (val.int64_val > INT32_MAX || val.int64_val < INT32_MIN) {
725  jsondec_err(d, "Integer out of range.");
726  }
727  val.int32_val = (int32_t)val.int64_val;
728  }
729 
730  return val;
731 }
732 
733 /* Parse UINT32 or UINT64 value. */
735  upb_MessageValue val = {0};
736 
737  switch (jsondec_peek(d)) {
738  case JD_NUMBER: {
739  double dbl = jsondec_number(d);
740  if (dbl > 18446744073709549568.0 || dbl < 0) {
741  jsondec_err(d, "JSON number is out of range.");
742  }
743  val.uint64_val = dbl; /* must be guarded, overflow here is UB */
744  if (val.uint64_val != dbl) {
745  jsondec_errf(d, "JSON number was not integral (%f != %" PRIu64 ")", dbl,
746  val.uint64_val);
747  }
748  break;
749  }
750  case JD_STRING: {
753  break;
754  }
755  default:
756  jsondec_err(d, "Expected number or string");
757  }
758 
760  if (val.uint64_val > UINT32_MAX) {
761  jsondec_err(d, "Integer out of range.");
762  }
763  val.uint32_val = (uint32_t)val.uint64_val;
764  }
765 
766  return val;
767 }
768 
769 /* Parse DOUBLE or FLOAT value. */
772  upb_MessageValue val = {0};
773 
774  switch (jsondec_peek(d)) {
775  case JD_NUMBER:
776  val.double_val = jsondec_number(d);
777  break;
778  case JD_STRING:
779  str = jsondec_string(d);
780  if (jsondec_streql(str, "NaN")) {
781  val.double_val = NAN;
782  } else if (jsondec_streql(str, "Infinity")) {
783  val.double_val = INFINITY;
784  } else if (jsondec_streql(str, "-Infinity")) {
785  val.double_val = -INFINITY;
786  } else {
787  val.double_val = strtod(str.data, NULL);
788  }
789  break;
790  default:
791  jsondec_err(d, "Expected number or string");
792  }
793 
795  if (val.double_val != INFINITY && val.double_val != -INFINITY &&
796  (val.double_val > FLT_MAX || val.double_val < -FLT_MAX)) {
797  jsondec_err(d, "Float out of range");
798  }
799  val.float_val = val.double_val;
800  }
801 
802  return val;
803 }
804 
805 /* Parse STRING or BYTES value. */
807  upb_MessageValue val;
808  val.str_val = jsondec_string(d);
810  val.str_val.size = jsondec_base64(d, val.str_val);
811  }
812  return val;
813 }
814 
816  switch (jsondec_peek(d)) {
817  case JD_STRING: {
820  const upb_EnumValueDef* ev =
822  upb_MessageValue val;
823  if (ev) {
825  } else {
826  if (d->options & upb_JsonDecode_IgnoreUnknown) {
827  val.int32_val = 0;
828  } else {
829  jsondec_errf(d, "Unknown enumerator: '" UPB_STRINGVIEW_FORMAT "'",
831  }
832  }
833  return val;
834  }
835  case JD_NULL: {
836  if (jsondec_isnullvalue(f)) {
837  upb_MessageValue val;
838  jsondec_null(d);
839  val.int32_val = 0;
840  return val;
841  }
842  }
843  /* Fallthrough. */
844  default:
845  return jsondec_int(d, f);
846  }
847 }
848 
850  bool is_map_key = upb_FieldDef_Number(f) == 1 &&
852  upb_MessageValue val;
853 
854  if (is_map_key) {
856  if (jsondec_streql(str, "true")) {
857  val.bool_val = true;
858  } else if (jsondec_streql(str, "false")) {
859  val.bool_val = false;
860  } else {
861  jsondec_err(d, "Invalid boolean map key");
862  }
863  } else {
864  switch (jsondec_peek(d)) {
865  case JD_TRUE:
866  val.bool_val = true;
867  jsondec_true(d);
868  break;
869  case JD_FALSE:
870  val.bool_val = false;
871  jsondec_false(d);
872  break;
873  default:
874  jsondec_err(d, "Expected true or false");
875  }
876  }
877 
878  return val;
879 }
880 
881 /* Composite types (array/message/map) ****************************************/
882 
884  upb_Array* arr = upb_Message_Mutable(msg, f, d->arena).array;
885 
887  while (jsondec_arrnext(d)) {
889  upb_Array_Append(arr, elem, d->arena);
890  }
891  jsondec_arrend(d);
892 }
893 
894 static void jsondec_map(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
895  upb_Map* map = upb_Message_Mutable(msg, f, d->arena).map;
897  const upb_FieldDef* key_f = upb_MessageDef_FindFieldByNumber(entry, 1);
898  const upb_FieldDef* val_f = upb_MessageDef_FindFieldByNumber(entry, 2);
899 
901  while (jsondec_objnext(d)) {
902  upb_MessageValue key, val;
903  key = jsondec_value(d, key_f);
905  val = jsondec_value(d, val_f);
906  upb_Map_Set(map, key, val, d->arena);
907  }
908  jsondec_objend(d);
909 }
910 
912  const upb_MessageDef* m) {
914  jsondec_object(d, msg, m);
915  } else {
917  }
918 }
919 
922  upb_Message* msg = upb_Message_New(m, d->arena);
923  upb_MessageValue val;
924 
925  jsondec_tomsg(d, msg, m);
926  val.msg_val = msg;
927  return val;
928 }
929 
931  const upb_MessageDef* m) {
933  const upb_FieldDef* f;
934  const upb_FieldDef* preserved;
935 
936  name = jsondec_string(d);
938 
939  if (name.size >= 2 && name.data[0] == '[' &&
940  name.data[name.size - 1] == ']') {
941  f = upb_DefPool_FindExtensionByNameWithSize(d->symtab, name.data + 1,
942  name.size - 2);
943  if (f && upb_FieldDef_ContainingType(f) != m) {
944  jsondec_errf(
945  d, "Extension %s extends message %s, but was seen in message %s",
949  }
950  } else {
952  }
953 
954  if (!f) {
955  if ((d->options & upb_JsonDecode_IgnoreUnknown) == 0) {
956  jsondec_errf(d, "No such field: " UPB_STRINGVIEW_FORMAT,
958  }
960  return;
961  }
962 
963  if (jsondec_peek(d) == JD_NULL && !jsondec_isvalue(f)) {
964  /* JSON "null" indicates a default value, so no need to set anything. */
965  jsondec_null(d);
966  return;
967  }
968 
971  jsondec_err(d, "More than one field for this oneof.");
972  }
973 
974  preserved = d->debug_field;
975  d->debug_field = f;
976 
977  if (upb_FieldDef_IsMap(f)) {
978  jsondec_map(d, msg, f);
979  } else if (upb_FieldDef_IsRepeated(f)) {
980  jsondec_array(d, msg, f);
981  } else if (upb_FieldDef_IsSubMessage(f)) {
982  upb_Message* submsg = upb_Message_Mutable(msg, f, d->arena).msg;
984  jsondec_tomsg(d, submsg, subm);
985  } else {
987  upb_Message_Set(msg, f, val, d->arena);
988  }
989 
990  d->debug_field = preserved;
991 }
992 
994  const upb_MessageDef* m) {
996  while (jsondec_objnext(d)) {
997  jsondec_field(d, msg, m);
998  }
999  jsondec_objend(d);
1000 }
1001 
1003  switch (upb_FieldDef_CType(f)) {
1004  case kUpb_CType_Bool:
1005  return jsondec_bool(d, f);
1006  case kUpb_CType_Float:
1007  case kUpb_CType_Double:
1008  return jsondec_double(d, f);
1009  case kUpb_CType_UInt32:
1010  case kUpb_CType_UInt64:
1011  return jsondec_uint(d, f);
1012  case kUpb_CType_Int32:
1013  case kUpb_CType_Int64:
1014  return jsondec_int(d, f);
1015  case kUpb_CType_String:
1016  case kUpb_CType_Bytes:
1017  return jsondec_strfield(d, f);
1018  case kUpb_CType_Enum:
1019  return jsondec_enum(d, f);
1020  case kUpb_CType_Message:
1021  return jsondec_msg(d, f);
1022  default:
1023  UPB_UNREACHABLE();
1024  }
1025 }
1026 
1027 /* Well-known types ***********************************************************/
1028 
1029 static int jsondec_tsdigits(jsondec* d, const char** ptr, size_t digits,
1030  const char* after) {
1031  uint64_t val;
1032  const char* p = *ptr;
1033  const char* end = p + digits;
1034  size_t after_len = after ? strlen(after) : 0;
1035 
1036  UPB_ASSERT(digits <= 9); /* int can't overflow. */
1037 
1038  if (jsondec_buftouint64(d, p, end, &val) != end ||
1039  (after_len && memcmp(end, after, after_len) != 0)) {
1040  jsondec_err(d, "Malformed timestamp");
1041  }
1042 
1043  UPB_ASSERT(val < INT_MAX);
1044 
1045  *ptr = end + after_len;
1046  return (int)val;
1047 }
1048 
1049 static int jsondec_nanos(jsondec* d, const char** ptr, const char* end) {
1050  uint64_t nanos = 0;
1051  const char* p = *ptr;
1052 
1053  if (p != end && *p == '.') {
1054  const char* nano_end = jsondec_buftouint64(d, p + 1, end, &nanos);
1055  int digits = (int)(nano_end - p - 1);
1056  int exp_lg10 = 9 - digits;
1057  if (digits > 9) {
1058  jsondec_err(d, "Too many digits for partial seconds");
1059  }
1060  while (exp_lg10--) nanos *= 10;
1061  *ptr = nano_end;
1062  }
1063 
1064  UPB_ASSERT(nanos < INT_MAX);
1065 
1066  return (int)nanos;
1067 }
1068 
1069 /* jsondec_epochdays(1970, 1, 1) == 1970-01-01 == 0. */
1070 int jsondec_epochdays(int y, int m, int d) {
1071  const uint32_t year_base = 4800; /* Before min year, multiple of 400. */
1072  const uint32_t m_adj = m - 3; /* March-based month. */
1073  const uint32_t carry = m_adj > (uint32_t)m ? 1 : 0;
1074  const uint32_t adjust = carry ? 12 : 0;
1075  const uint32_t y_adj = y + year_base - carry;
1076  const uint32_t month_days = ((m_adj + adjust) * 62719 + 769) / 2048;
1077  const uint32_t leap_days = y_adj / 4 - y_adj / 100 + y_adj / 400;
1078  return y_adj * 365 + leap_days + month_days + (d - 1) - 2472632;
1079 }
1080 
1081 static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s) {
1082  return (int64_t)jsondec_epochdays(y, m, d) * 86400 + h * 3600 + min * 60 + s;
1083 }
1084 
1086  const upb_MessageDef* m) {
1088  upb_MessageValue nanos;
1090  const char* ptr = str.data;
1091  const char* end = ptr + str.size;
1092 
1093  if (str.size < 20) goto malformed;
1094 
1095  {
1096  /* 1972-01-01T01:00:00 */
1097  int year = jsondec_tsdigits(d, &ptr, 4, "-");
1098  int mon = jsondec_tsdigits(d, &ptr, 2, "-");
1099  int day = jsondec_tsdigits(d, &ptr, 2, "T");
1100  int hour = jsondec_tsdigits(d, &ptr, 2, ":");
1101  int min = jsondec_tsdigits(d, &ptr, 2, ":");
1102  int sec = jsondec_tsdigits(d, &ptr, 2, NULL);
1103 
1104  seconds.int64_val = jsondec_unixtime(year, mon, day, hour, min, sec);
1105  }
1106 
1107  nanos.int32_val = jsondec_nanos(d, &ptr, end);
1108 
1109  {
1110  /* [+-]08:00 or Z */
1111  int ofs_hour = 0;
1112  int ofs_min = 0;
1113  bool neg = false;
1114 
1115  if (ptr == end) goto malformed;
1116 
1117  switch (*ptr++) {
1118  case '-':
1119  neg = true;
1120  /* fallthrough */
1121  case '+':
1122  if ((end - ptr) != 5) goto malformed;
1123  ofs_hour = jsondec_tsdigits(d, &ptr, 2, ":");
1124  ofs_min = jsondec_tsdigits(d, &ptr, 2, NULL);
1125  ofs_min = ((ofs_hour * 60) + ofs_min) * 60;
1126  seconds.int64_val += (neg ? ofs_min : -ofs_min);
1127  break;
1128  case 'Z':
1129  if (ptr != end) goto malformed;
1130  break;
1131  default:
1132  goto malformed;
1133  }
1134  }
1135 
1136  if (seconds.int64_val < -62135596800) {
1137  jsondec_err(d, "Timestamp out of range");
1138  }
1139 
1141  d->arena);
1143  return;
1144 
1145 malformed:
1146  jsondec_err(d, "Malformed timestamp");
1147 }
1148 
1150  const upb_MessageDef* m) {
1152  upb_MessageValue nanos;
1154  const char* ptr = str.data;
1155  const char* end = ptr + str.size;
1156  const int64_t max = (uint64_t)3652500 * 86400;
1157 
1158  /* "3.000000001s", "3s", etc. */
1159  ptr = jsondec_buftoint64(d, ptr, end, &seconds.int64_val);
1160  nanos.int32_val = jsondec_nanos(d, &ptr, end);
1161 
1162  if (end - ptr != 1 || *ptr != 's') {
1163  jsondec_err(d, "Malformed duration");
1164  }
1165 
1166  if (seconds.int64_val < -max || seconds.int64_val > max) {
1167  jsondec_err(d, "Duration out of range");
1168  }
1169 
1170  if (seconds.int64_val < 0) {
1171  nanos.int32_val = -nanos.int32_val;
1172  }
1173 
1175  d->arena);
1177 }
1178 
1180  const upb_MessageDef* m) {
1181  const upb_FieldDef* values_f = upb_MessageDef_FindFieldByNumber(m, 1);
1182  const upb_MessageDef* value_m = upb_FieldDef_MessageSubDef(values_f);
1183  upb_Array* values = upb_Message_Mutable(msg, values_f, d->arena).array;
1184 
1186  while (jsondec_arrnext(d)) {
1187  upb_Message* value_msg = upb_Message_New(value_m, d->arena);
1189  value.msg_val = value_msg;
1190  upb_Array_Append(values, value, d->arena);
1191  jsondec_wellknownvalue(d, value_msg, value_m);
1192  }
1193  jsondec_arrend(d);
1194 }
1195 
1197  const upb_MessageDef* m) {
1198  const upb_FieldDef* fields_f = upb_MessageDef_FindFieldByNumber(m, 1);
1199  const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(fields_f);
1200  const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(entry_m, 2);
1201  const upb_MessageDef* value_m = upb_FieldDef_MessageSubDef(value_f);
1202  upb_Map* fields = upb_Message_Mutable(msg, fields_f, d->arena).map;
1203 
1205  while (jsondec_objnext(d)) {
1207  upb_Message* value_msg = upb_Message_New(value_m, d->arena);
1208  key.str_val = jsondec_string(d);
1209  value.msg_val = value_msg;
1210  upb_Map_Set(fields, key, value, d->arena);
1212  jsondec_wellknownvalue(d, value_msg, value_m);
1213  }
1214  jsondec_objend(d);
1215 }
1216 
1218  const upb_MessageDef* m) {
1219  upb_MessageValue val;
1220  const upb_FieldDef* f;
1221  upb_Message* submsg;
1222 
1223  switch (jsondec_peek(d)) {
1224  case JD_NUMBER:
1225  /* double number_value = 2; */
1227  val.double_val = jsondec_number(d);
1228  break;
1229  case JD_STRING:
1230  /* string string_value = 3; */
1232  val.str_val = jsondec_string(d);
1233  break;
1234  case JD_FALSE:
1235  /* bool bool_value = 4; */
1237  val.bool_val = false;
1238  jsondec_false(d);
1239  break;
1240  case JD_TRUE:
1241  /* bool bool_value = 4; */
1243  val.bool_val = true;
1244  jsondec_true(d);
1245  break;
1246  case JD_NULL:
1247  /* NullValue null_value = 1; */
1249  val.int32_val = 0;
1250  jsondec_null(d);
1251  break;
1252  /* Note: these cases return, because upb_Message_Mutable() is enough. */
1253  case JD_OBJECT:
1254  /* Struct struct_value = 5; */
1256  submsg = upb_Message_Mutable(msg, f, d->arena).msg;
1258  return;
1259  case JD_ARRAY:
1260  /* ListValue list_value = 6; */
1262  submsg = upb_Message_Mutable(msg, f, d->arena).msg;
1264  return;
1265  default:
1266  UPB_UNREACHABLE();
1267  }
1268 
1269  upb_Message_Set(msg, f, val, d->arena);
1270 }
1271 
1272 static upb_StringView jsondec_mask(jsondec* d, const char* buf,
1273  const char* end) {
1274  /* FieldMask fields grow due to inserted '_' characters, so we can't do the
1275  * transform in place. */
1276  const char* ptr = buf;
1278  char* out;
1279 
1280  ret.size = end - ptr;
1281  while (ptr < end) {
1282  ret.size += (*ptr >= 'A' && *ptr <= 'Z');
1283  ptr++;
1284  }
1285 
1286  out = upb_Arena_Malloc(d->arena, ret.size);
1287  ptr = buf;
1288  ret.data = out;
1289 
1290  while (ptr < end) {
1291  char ch = *ptr++;
1292  if (ch >= 'A' && ch <= 'Z') {
1293  *out++ = '_';
1294  *out++ = ch + 32;
1295  } else if (ch == '_') {
1296  jsondec_err(d, "field mask may not contain '_'");
1297  } else {
1298  *out++ = ch;
1299  }
1300  }
1301 
1302  return ret;
1303 }
1304 
1306  const upb_MessageDef* m) {
1307  /* repeated string paths = 1; */
1308  const upb_FieldDef* paths_f = upb_MessageDef_FindFieldByNumber(m, 1);
1309  upb_Array* arr = upb_Message_Mutable(msg, paths_f, d->arena).array;
1311  const char* ptr = str.data;
1312  const char* end = ptr + str.size;
1313  upb_MessageValue val;
1314 
1315  while (ptr < end) {
1316  const char* elem_end = memchr(ptr, ',', end - ptr);
1317  if (elem_end) {
1318  val.str_val = jsondec_mask(d, ptr, elem_end);
1319  ptr = elem_end + 1;
1320  } else {
1321  val.str_val = jsondec_mask(d, ptr, end);
1322  ptr = end;
1323  }
1324  upb_Array_Append(arr, val, d->arena);
1325  }
1326 }
1327 
1329  const upb_MessageDef* m) {
1331  /* For regular types: {"@type": "[user type]", "f1": <V1>, "f2": <V2>}
1332  * where f1, f2, etc. are the normal fields of this type. */
1333  jsondec_field(d, msg, m);
1334  } else {
1335  /* For well-known types: {"@type": "[well-known type]", "value": <X>}
1336  * where <X> is whatever encoding the WKT normally uses. */
1339  if (!jsondec_streql(str, "value")) {
1340  jsondec_err(d, "Key for well-known type must be 'value'");
1341  }
1342  jsondec_wellknown(d, msg, m);
1343  }
1344 }
1345 
1347  const upb_MessageDef* m) {
1348  const upb_FieldDef* type_url_f = upb_MessageDef_FindFieldByNumber(m, 1);
1349  const upb_MessageDef* type_m;
1351  const char* end = type_url.data + type_url.size;
1352  const char* ptr = end;
1353  upb_MessageValue val;
1354 
1355  val.str_val = type_url;
1356  upb_Message_Set(msg, type_url_f, val, d->arena);
1357 
1358  /* Find message name after the last '/' */
1359  while (ptr > type_url.data && *--ptr != '/') {
1360  }
1361 
1362  if (ptr == type_url.data || ptr == end) {
1363  jsondec_err(d, "Type url must have at least one '/' and non-empty host");
1364  }
1365 
1366  ptr++;
1367  type_m = upb_DefPool_FindMessageByNameWithSize(d->symtab, ptr, end - ptr);
1368 
1369  if (!type_m) {
1370  jsondec_err(d, "Type was not found");
1371  }
1372 
1373  return type_m;
1374 }
1375 
1377  /* string type_url = 1;
1378  * bytes value = 2; */
1379  const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 2);
1380  upb_Message* any_msg;
1381  const upb_MessageDef* any_m = NULL;
1382  const char* pre_type_data = NULL;
1383  const char* pre_type_end = NULL;
1384  upb_MessageValue encoded;
1385 
1387 
1388  /* Scan looking for "@type", which is not necessarily first. */
1389  while (!any_m && jsondec_objnext(d)) {
1390  const char* start = d->ptr;
1393  if (jsondec_streql(name, "@type")) {
1394  any_m = jsondec_typeurl(d, msg, m);
1395  if (pre_type_data) {
1396  pre_type_end = start;
1397  while (*pre_type_end != ',') pre_type_end--;
1398  }
1399  } else {
1400  if (!pre_type_data) pre_type_data = start;
1401  jsondec_skipval(d);
1402  }
1403  }
1404 
1405  if (!any_m) {
1406  jsondec_err(d, "Any object didn't contain a '@type' field");
1407  }
1408 
1409  any_msg = upb_Message_New(any_m, d->arena);
1410 
1411  if (pre_type_data) {
1412  size_t len = pre_type_end - pre_type_data + 1;
1413  char* tmp = upb_Arena_Malloc(d->arena, len);
1414  const char* saved_ptr = d->ptr;
1415  const char* saved_end = d->end;
1416  memcpy(tmp, pre_type_data, len - 1);
1417  tmp[len - 1] = '}';
1418  d->ptr = tmp;
1419  d->end = tmp + len;
1420  d->is_first = true;
1421  while (jsondec_objnext(d)) {
1422  jsondec_anyfield(d, any_msg, any_m);
1423  }
1424  d->ptr = saved_ptr;
1425  d->end = saved_end;
1426  }
1427 
1428  while (jsondec_objnext(d)) {
1429  jsondec_anyfield(d, any_msg, any_m);
1430  }
1431 
1432  jsondec_objend(d);
1433 
1434  encoded.str_val.data = upb_Encode(any_msg, upb_MessageDef_MiniTable(any_m), 0,
1435  d->arena, &encoded.str_val.size);
1436  upb_Message_Set(msg, value_f, encoded, d->arena);
1437 }
1438 
1440  const upb_MessageDef* m) {
1441  const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 1);
1442  upb_MessageValue val = jsondec_value(d, value_f);
1443  upb_Message_Set(msg, value_f, val, d->arena);
1444 }
1445 
1447  const upb_MessageDef* m) {
1448  switch (upb_MessageDef_WellKnownType(m)) {
1449  case kUpb_WellKnown_Any:
1450  jsondec_any(d, msg, m);
1451  break;
1453  jsondec_fieldmask(d, msg, m);
1454  break;
1456  jsondec_duration(d, msg, m);
1457  break;
1459  jsondec_timestamp(d, msg, m);
1460  break;
1461  case kUpb_WellKnown_Value:
1463  break;
1465  jsondec_listvalue(d, msg, m);
1466  break;
1467  case kUpb_WellKnown_Struct:
1468  jsondec_struct(d, msg, m);
1469  break;
1479  jsondec_wrapper(d, msg, m);
1480  break;
1481  default:
1482  UPB_UNREACHABLE();
1483  }
1484 }
1485 
1486 bool upb_JsonDecode(const char* buf, size_t size, upb_Message* msg,
1487  const upb_MessageDef* m, const upb_DefPool* symtab,
1489  jsondec d;
1490 
1491  if (size == 0) return true;
1492 
1493  d.ptr = buf;
1494  d.end = buf + size;
1495  d.arena = arena;
1496  d.symtab = symtab;
1497  d.status = status;
1498  d.options = options;
1499  d.depth = 64;
1500  d.line = 1;
1501  d.line_begin = d.ptr;
1502  d.debug_field = NULL;
1503  d.is_first = false;
1504 
1505  if (UPB_SETJMP(d.err)) return false;
1506 
1507  jsondec_tomsg(&d, msg, m);
1508  return true;
1509 }
kUpb_WellKnown_StringValue
@ kUpb_WellKnown_StringValue
Definition: upb/upb/def.h:85
upb_MutableMessageValue::array
upb_Array * array
Definition: upb/upb/reflection.h:57
xds_interop_client.str
str
Definition: xds_interop_client.py:487
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
upb_FieldDef_Number
uint32_t upb_FieldDef_Number(const upb_FieldDef *f)
Definition: upb/upb/def.c:541
absl::time_internal::cctz::seconds
std::chrono::duration< std::int_fast64_t > seconds
Definition: abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h:40
upb_MessageValue::uint32_val
uint32_t uint32_val
Definition: upb/upb/reflection.h:46
jsondec_strfield
static upb_MessageValue jsondec_strfield(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:806
jsondec_double
static upb_MessageValue jsondec_double(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:770
jsondec_wellknownvalue
static void jsondec_wellknownvalue(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1217
kUpb_CType_String
@ kUpb_CType_String
Definition: upb/upb/upb.h:296
upb_MessageValue::int64_val
int64_t int64_val
Definition: upb/upb/reflection.h:45
kUpb_CType_UInt32
@ kUpb_CType_UInt32
Definition: upb/upb/upb.h:290
test_server.argp
argp
Definition: test_server.py:33
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
kUpb_CType_Int32
@ kUpb_CType_Int32
Definition: upb/upb/upb.h:289
upb_EnumDef_FindValueByNameWithSize
const upb_EnumValueDef * upb_EnumDef_FindValueByNameWithSize(const upb_EnumDef *def, const char *name, size_t len)
Definition: upb/upb/def.c:409
jsondec_strtoint64
static int64_t jsondec_strtoint64(jsondec *d, upb_StringView str)
Definition: json_decode.c:685
upb_Arena_Realloc
UPB_INLINE void * upb_Arena_Realloc(upb_Arena *a, void *ptr, size_t oldsize, size_t size)
Definition: upb/upb/upb.h:246
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
jsondec_parselit
static void jsondec_parselit(jsondec *d, const char *lit)
Definition: json_decode.c:129
jsondec_entrysep
static void jsondec_entrysep(jsondec *d)
Definition: json_decode.c:149
upb_MessageDef_MiniTable
const upb_MiniTable * upb_MessageDef_MiniTable(const upb_MessageDef *m)
Definition: upb/upb/def.c:818
upb_MutableMessageValue::map
upb_Map * map
Definition: upb/upb/reflection.h:55
jsondec_uint
static upb_MessageValue jsondec_uint(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:734
UPB_STRINGVIEW_ARGS
#define UPB_STRINGVIEW_ARGS(view)
Definition: upb/upb/upb.h:97
encode.h
upb_StringView::data
const char * data
Definition: upb/upb/upb.h:73
y
const double y
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3611
upb_MessageDef
Definition: upb/upb/def.c:100
INT64_MAX
#define INT64_MAX
Definition: stdint-msvc2008.h:139
jsondec_escape
static char jsondec_escape(jsondec *d)
Definition: json_decode.c:328
string.h
options
double_dict options[]
Definition: capstone_test.c:55
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
kUpb_CType_Bytes
@ kUpb_CType_Bytes
Definition: upb/upb/upb.h:297
elem
Timer elem
Definition: event_engine/iomgr_event_engine/timer_heap_test.cc:109
UPB_UNREACHABLE
#define UPB_UNREACHABLE()
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:145
UINT64_MAX
#define UINT64_MAX
Definition: stdint-msvc2008.h:143
error_ref_leak.err
err
Definition: error_ref_leak.py:35
UINT32_MAX
#define UINT32_MAX
Definition: stdint-msvc2008.h:142
UPB_SETJMP
#define UPB_SETJMP(buf)
Definition: php-upb.c:163
upb_MessageValue::str_val
upb_StringView str_val
Definition: upb/upb/reflection.h:51
jsondec_objstart
static void jsondec_objstart(jsondec *d)
Definition: json_decode.c:228
status
absl::Status status
Definition: rls.cc:251
jsondec_bool
static upb_MessageValue jsondec_bool(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:849
setup.name
name
Definition: setup.py:542
upb_MessageValue::int32_val
int32_t int32_val
Definition: upb/upb/reflection.h:44
jsondec_buftouint64
static const char * jsondec_buftouint64(jsondec *d, const char *ptr, const char *end, uint64_t *val)
Definition: json_decode.c:639
xds_manager.p
p
Definition: xds_manager.py:60
UPB_PRINTF
#define UPB_PRINTF(str, first_vararg)
Definition: php-upb.c:122
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:480
jsondec_unixtime
static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s)
Definition: json_decode.c:1081
upb_MutableMessageValue::msg
upb_Message * msg
Definition: upb/upb/reflection.h:56
kUpb_CType_Int64
@ kUpb_CType_Int64
Definition: upb/upb/upb.h:294
jsondec_timestamp
static void jsondec_timestamp(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1085
upb_FieldDef_RealContainingOneof
const upb_OneofDef * upb_FieldDef_RealContainingOneof(const upb_FieldDef *f)
Definition: upb/upb/def.c:575
jsondec_isvalue
static bool jsondec_isvalue(const upb_FieldDef *f)
Definition: json_decode.c:80
upb_MessageValue::double_val
double double_val
Definition: upb/upb/reflection.h:43
jsondec_seqnext
static bool jsondec_seqnext(jsondec *d, char end_ch)
Definition: json_decode.c:207
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
json_decode.h
jsondec_mask
static upb_StringView jsondec_mask(jsondec *d, const char *buf, const char *end)
Definition: json_decode.c:1272
upb_MessageValue::bool_val
bool bool_val
Definition: upb/upb/reflection.h:41
upb_Message_New
upb_Message * upb_Message_New(const upb_MessageDef *m, upb_Arena *a)
Definition: reflection.c:95
kUpb_WellKnown_FloatValue
@ kUpb_WellKnown_FloatValue
Definition: upb/upb/def.h:79
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
upb_MessageValue
Definition: upb/upb/reflection.h:40
jsondec_base64
static size_t jsondec_base64(jsondec *d, upb_StringView str)
Definition: json_decode.c:595
jsondec_struct
static void jsondec_struct(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1196
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
upb_MessageDef_FindByJsonNameWithSize
const upb_FieldDef * upb_MessageDef_FindByJsonNameWithSize(const upb_MessageDef *m, const char *name, size_t len)
Definition: upb/upb/def.c:767
jsondec_string
static upb_StringView jsondec_string(jsondec *d)
Definition: json_decode.c:432
start
static uint64_t start
Definition: benchmark-pound.c:74
jsondec_fieldmask
static void jsondec_fieldmask(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1305
upb_MessageDef_IsMapEntry
UPB_INLINE bool upb_MessageDef_IsMapEntry(const upb_MessageDef *m)
Definition: upb/upb/def.h:209
upb_MessageDef_WellKnownType
upb_WellKnown upb_MessageDef_WellKnownType(const upb_MessageDef *m)
Definition: upb/upb/def.c:855
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
jsondec_unicode
static size_t jsondec_unicode(jsondec *d, char *out)
Definition: json_decode.c:378
xds_interop_client.int
int
Definition: xds_interop_client.py:113
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
upb_FieldDef_IsMap
bool upb_FieldDef_IsMap(const upb_FieldDef *f)
Definition: upb/upb/def.c:659
kUpb_CType_Double
@ kUpb_CType_Double
Definition: upb/upb/upb.h:293
jsondec_arrnext
static bool jsondec_arrnext(jsondec *d)
Definition: json_decode.c:226
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
upb_StringView::size
size_t size
Definition: upb/upb/upb.h:74
kUpb_WellKnown_BytesValue
@ kUpb_WellKnown_BytesValue
Definition: upb/upb/def.h:86
kUpb_WellKnown_Unspecified
@ kUpb_WellKnown_Unspecified
Definition: upb/upb/def.h:72
kUpb_WellKnown_Timestamp
@ kUpb_WellKnown_Timestamp
Definition: upb/upb/def.h:76
upb_Array
Definition: msg_internal.h:424
upb_Arena_Malloc
UPB_INLINE void * upb_Arena_Malloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.h:222
upb_Status_VAppendErrorFormat
void upb_Status_VAppendErrorFormat(upb_Status *status, const char *fmt, va_list args)
Definition: upb/upb/upb.c:78
jsondec_arrend
static void jsondec_arrend(jsondec *d)
Definition: json_decode.c:221
upb_MessageValue::uint64_val
uint64_t uint64_val
Definition: upb/upb/reflection.h:47
upb_EnumValueDef
Definition: upb/upb/def.c:150
jsondec_listvalue
static void jsondec_listvalue(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1179
jsondec_rawpeek
static int jsondec_rawpeek(jsondec *d)
Definition: json_decode.c:154
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
upb_EnumDef_FullName
const char * upb_EnumDef_FullName(const upb_EnumDef *e)
Definition: upb/upb/def.c:390
kUpb_WellKnown_UInt32Value
@ kUpb_WellKnown_UInt32Value
Definition: upb/upb/def.h:83
upb_Status_SetErrorFormat
void upb_Status_SetErrorFormat(upb_Status *status, const char *fmt,...)
Definition: upb/upb/upb.c:63
jsondec_typeurl
static const upb_MessageDef * jsondec_typeurl(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1346
jsondec_field
static void jsondec_field(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:930
JD_OBJECT
@ JD_OBJECT
Definition: json_decode.c:59
reflection.h
jsondec_streql
static bool jsondec_streql(upb_StringView str, const char *lit)
Definition: json_decode.c:70
kUpb_WellKnown_BoolValue
@ kUpb_WellKnown_BoolValue
Definition: upb/upb/def.h:87
UPB_STRINGVIEW_FORMAT
#define UPB_STRINGVIEW_FORMAT
Definition: upb/upb/upb.h:96
jsondec_number
static double jsondec_number(jsondec *d)
Definition: json_decode.c:267
jsondec_array
static void jsondec_array(jsondec *d, upb_Message *msg, const upb_FieldDef *f)
Definition: json_decode.c:883
upb_Status
Definition: upb/upb/upb.h:52
UPB_ASSERT
#define UPB_ASSERT(expr)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:135
mon
static const char *const mon[12]
Definition: a_strex.c:515
upb_MessageValue::msg_val
const upb_Message * msg_val
Definition: upb/upb/reflection.h:49
upb_Array_Append
bool upb_Array_Append(upb_Array *arr, upb_MessageValue val, upb_Arena *arena)
Definition: reflection.c:380
jsondec_objnext
static bool jsondec_objnext(jsondec *d)
Definition: json_decode.c:238
upb_FieldDef_CType
upb_CType upb_FieldDef_CType(const upb_FieldDef *f)
Definition: upb/upb/def.c:500
min
#define min(a, b)
Definition: qsort.h:83
jsondec_skipval
static void jsondec_skipval(jsondec *d)
Definition: json_decode.c:484
jsondec_any
static void jsondec_any(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1376
jsondec_objend
static void jsondec_objend(jsondec *d)
Definition: json_decode.c:233
jsondec_wellknown
static void jsondec_wellknown(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1446
d
static const fe d
Definition: curve25519_tables.h:19
upb_Message
void upb_Message
Definition: msg.h:49
upb_FieldDef_MessageSubDef
const upb_MessageDef * upb_FieldDef_MessageSubDef(const upb_FieldDef *f)
Definition: upb/upb/def.c:619
JD_TRUE
@ JD_TRUE
Definition: json_decode.c:59
upb_FieldDef_EnumSubDef
const upb_EnumDef * upb_FieldDef_EnumSubDef(const upb_FieldDef *f)
Definition: upb/upb/def.c:623
upb_DefPool_FindExtensionByNameWithSize
const upb_FieldDef * upb_DefPool_FindExtensionByNameWithSize(const upb_DefPool *s, const char *name, size_t size)
Definition: upb/upb/def.c:1162
jsondec_peek
static int jsondec_peek(jsondec *d)
Definition: json_decode.c:195
after
IntAfterTypedTestSuiteP after
Definition: googletest/googletest/test/gtest-typed-test_test.cc:375
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
jsondec_push
static void jsondec_push(jsondec *d)
Definition: json_decode.c:200
upb_Map_Set
bool upb_Map_Set(upb_Map *map, upb_MessageValue key, upb_MessageValue val, upb_Arena *arena)
Definition: reflection.c:439
kUpb_WellKnown_Any
@ kUpb_WellKnown_Any
Definition: upb/upb/def.h:73
upb_FieldDef
Definition: upb/upb/def.c:56
jsondec_null
static void jsondec_null(jsondec *d)
Definition: json_decode.c:147
JD_STRING
@ JD_STRING
Definition: json_decode.c:59
kUpb_CType_Float
@ kUpb_CType_Float
Definition: upb/upb/upb.h:288
jsondec_errf
static UPB_NORETURN void jsondec_errf(jsondec *d, const char *fmt,...)
Definition: json_decode.c:94
jsondec_object
static void jsondec_object(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:993
value
const char * value
Definition: hpack_parser_table.cc:165
jsondec_wrapper
static void jsondec_wrapper(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1439
jsondec_skipws
static void jsondec_skipws(jsondec *d)
Definition: json_decode.c:104
symtab
upb_symtab * symtab
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:774
jsondec::symtab
const upb_DefPool * symtab
Definition: json_decode.c:48
jsondec_map
static void jsondec_map(jsondec *d, upb_Message *msg, const upb_FieldDef *f)
Definition: json_decode.c:894
UPB_MAX
#define UPB_MAX(x, y)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:125
testing::internal::fmt
GTEST_API_ const char * fmt
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1808
jsondec_resize
static void jsondec_resize(jsondec *d, char **buf, char **end, char **buf_end)
Definition: json_decode.c:420
upb_Encode
char * upb_Encode(const void *msg, const upb_MiniTable *l, int options, upb_Arena *arena, size_t *size)
Definition: encode.c:573
INT32_MIN
#define INT32_MIN
Definition: stdint-msvc2008.h:136
upb_FieldDef_ContainingType
const upb_MessageDef * upb_FieldDef_ContainingType(const upb_FieldDef *f)
Definition: upb/upb/def.c:563
kUpb_WellKnown_UInt64Value
@ kUpb_WellKnown_UInt64Value
Definition: upb/upb/def.h:81
jsondec_anyfield
static void jsondec_anyfield(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1328
kUpb_WellKnown_Duration
@ kUpb_WellKnown_Duration
Definition: upb/upb/def.h:75
kUpb_WellKnown_Struct
@ kUpb_WellKnown_Struct
Definition: upb/upb/def.h:90
jsondec_nanos
static int jsondec_nanos(jsondec *d, const char **ptr, const char *end)
Definition: json_decode.c:1049
jsondec::debug_field
const upb_FieldDef * debug_field
Definition: json_decode.c:56
jsondec_strtouint64
static uint64_t jsondec_strtouint64(jsondec *d, upb_StringView str)
Definition: json_decode.c:676
jsondec_buftoint64
static const char * jsondec_buftoint64(jsondec *d, const char *ptr, const char *end, int64_t *val)
Definition: json_decode.c:657
key
const char * key
Definition: hpack_parser_table.cc:164
jsondec_true
static void jsondec_true(jsondec *d)
Definition: json_decode.c:145
upb_JsonDecode_IgnoreUnknown
@ upb_JsonDecode_IgnoreUnknown
Definition: json_decode.h:37
upb_StringView
Definition: upb/upb/upb.h:72
jsondec_tomsg
static void jsondec_tomsg(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:911
upb_Message_Mutable
upb_MutableMessageValue upb_Message_Mutable(upb_Message *msg, const upb_FieldDef *f, upb_Arena *a)
Definition: reflection.c:164
upb_FieldDef_IsRepeated
bool upb_FieldDef_IsRepeated(const upb_FieldDef *f)
Definition: upb/upb/def.c:651
upb_DefPool_FindMessageByNameWithSize
const upb_MessageDef * upb_DefPool_FindMessageByNameWithSize(const upb_DefPool *s, const char *sym, size_t len)
Definition: upb/upb/def.c:1130
jsondec_false
static void jsondec_false(jsondec *d)
Definition: json_decode.c:146
upb_Message_WhichOneof
const upb_FieldDef * upb_Message_WhichOneof(const upb_Message *msg, const upb_OneofDef *o)
Definition: reflection.c:131
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
upb_JsonDecode
bool upb_JsonDecode(const char *buf, size_t size, upb_Message *msg, const upb_MessageDef *m, const upb_DefPool *symtab, int options, upb_Arena *arena, upb_Status *status)
Definition: json_decode.c:1486
profile_analyzer.fields
list fields
Definition: profile_analyzer.py:266
jsondec_partialbase64
static char * jsondec_partialbase64(jsondec *d, const char *ptr, const char *end, char *out)
Definition: json_decode.c:567
jsondec_epochdays
int jsondec_epochdays(int y, int m, int d)
Definition: json_decode.c:1070
values
std::array< int64_t, Size > values
Definition: abseil-cpp/absl/container/btree_benchmark.cc:608
upb_MessageValue::float_val
float float_val
Definition: upb/upb/reflection.h:42
regen-readme.line
line
Definition: regen-readme.py:30
jsondec_enum
static upb_MessageValue jsondec_enum(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:815
parse
static void parse(const char *s)
Definition: debug/trace.cc:121
type_url
string * type_url
Definition: bloaty/third_party/protobuf/conformance/conformance_cpp.cc:72
UPB_NORETURN
#define UPB_NORETURN
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:79
upb_MessageDef_FullName
const char * upb_MessageDef_FullName(const upb_MessageDef *m)
Definition: upb/upb/def.c:701
kUpb_WellKnown_Value
@ kUpb_WellKnown_Value
Definition: upb/upb/def.h:88
kUpb_WellKnown_ListValue
@ kUpb_WellKnown_ListValue
Definition: upb/upb/def.h:89
jsondec
Definition: php-upb.c:7368
kUpb_WellKnown_Int64Value
@ kUpb_WellKnown_Int64Value
Definition: upb/upb/def.h:80
jsondec_duration
static void jsondec_duration(jsondec *d, upb_Message *msg, const upb_MessageDef *m)
Definition: json_decode.c:1149
jsondec_tsdigits
static int jsondec_tsdigits(jsondec *d, const char **ptr, size_t digits, const char *after)
Definition: json_decode.c:1029
kUpb_WellKnown_DoubleValue
@ kUpb_WellKnown_DoubleValue
Definition: upb/upb/def.h:78
kUpb_WellKnown_Int32Value
@ kUpb_WellKnown_Int32Value
Definition: upb/upb/def.h:82
jsondec_codepoint
static uint32_t jsondec_codepoint(jsondec *d)
Definition: json_decode.c:351
upb_FieldDef_IsSubMessage
bool upb_FieldDef_IsSubMessage(const upb_FieldDef *f)
Definition: upb/upb/def.c:642
kUpb_CType_Bool
@ kUpb_CType_Bool
Definition: upb/upb/upb.h:287
upb_FieldDef_ContainingOneof
const upb_OneofDef * upb_FieldDef_ContainingOneof(const upb_FieldDef *f)
Definition: upb/upb/def.c:571
jsondec_wsch
static void jsondec_wsch(jsondec *d, char ch)
Definition: json_decode.c:138
kUpb_CType_Enum
@ kUpb_CType_Enum
Definition: upb/upb/upb.h:291
JD_FALSE
@ JD_FALSE
Definition: json_decode.c:59
jsondec_msg
static upb_MessageValue jsondec_msg(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:920
JD_ARRAY
@ JD_ARRAY
Definition: json_decode.c:59
upb_EnumDef
Definition: upb/upb/def.c:134
upb_Map
Definition: msg_internal.h:581
table
uint8_t table[256]
Definition: hpack_parser.cc:456
jsondec::arena
upb_Arena * arena
Definition: json_decode.c:47
jsondec_arrstart
static void jsondec_arrstart(jsondec *d)
Definition: json_decode.c:216
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
autogen_x86imm.tmp
tmp
Definition: autogen_x86imm.py:12
kUpb_CType_UInt64
@ kUpb_CType_UInt64
Definition: upb/upb/upb.h:295
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
jsondec_base64_tablelookup
static unsigned int jsondec_base64_tablelookup(const char ch)
Definition: json_decode.c:522
INT32_MAX
#define INT32_MAX
Definition: stdint-msvc2008.h:137
regress.m
m
Definition: regress/regress.py:25
mkowners.depth
depth
Definition: mkowners.py:114
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
jsondec_err
static UPB_NORETURN void jsondec_err(jsondec *d, const char *msg)
Definition: json_decode.c:87
jsondec_tryparsech
static bool jsondec_tryparsech(jsondec *d, char ch)
Definition: json_decode.c:123
upb_Message_Set
bool upb_Message_Set(upb_Message *msg, const upb_FieldDef *f, upb_MessageValue val, upb_Arena *a)
Definition: reflection.c:202
kUpb_WellKnown_FieldMask
@ kUpb_WellKnown_FieldMask
Definition: upb/upb/def.h:74
jsondec_value
static upb_MessageValue jsondec_value(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:1002
upb_DefPool
Definition: upb/upb/def.c:217
upb_MessageDef_FindFieldByNumber
const upb_FieldDef * upb_MessageDef_FindFieldByNumber(const upb_MessageDef *m, uint32_t i)
Definition: upb/upb/def.c:721
upb_EnumValueDef_Number
int32_t upb_EnumValueDef_Number(const upb_EnumValueDef *ev)
Definition: upb/upb/def.c:458
upb_Arena
Definition: upb_internal.h:36
jsondec_int
static upb_MessageValue jsondec_int(jsondec *d, const upb_FieldDef *f)
Definition: json_decode.c:697
JD_NUMBER
@ JD_NUMBER
Definition: json_decode.c:59
upb_FieldDef_FullName
const char * upb_FieldDef_FullName(const upb_FieldDef *f)
Definition: upb/upb/def.c:496
UPB_LONGJMP
#define UPB_LONGJMP(buf, val)
Definition: php-upb.c:164
jsondec::status
upb_Status * status
Definition: json_decode.c:50
errno.h
kUpb_CType_Message
@ kUpb_CType_Message
Definition: upb/upb/upb.h:292
jsondec_tryskipdigits
static bool jsondec_tryskipdigits(jsondec *d)
Definition: json_decode.c:248
JD_NULL
@ JD_NULL
Definition: json_decode.c:59
jsondec_isnullvalue
static bool jsondec_isnullvalue(const upb_FieldDef *f)
Definition: json_decode.c:74
jsondec_skipdigits
static void jsondec_skipdigits(jsondec *d)
Definition: json_decode.c:261


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:25