decode.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. #include <string.h>
  2. #include "upb/upb.h"
  3. #include "upb/decode.h"
  4. #include "upb/port_def.inc"
  5. /* Maps descriptor type -> upb field type. */
  6. static const uint8_t desctype_to_fieldtype[] = {
  7. -1, /* invalid descriptor type */
  8. UPB_TYPE_DOUBLE, /* DOUBLE */
  9. UPB_TYPE_FLOAT, /* FLOAT */
  10. UPB_TYPE_INT64, /* INT64 */
  11. UPB_TYPE_UINT64, /* UINT64 */
  12. UPB_TYPE_INT32, /* INT32 */
  13. UPB_TYPE_UINT64, /* FIXED64 */
  14. UPB_TYPE_UINT32, /* FIXED32 */
  15. UPB_TYPE_BOOL, /* BOOL */
  16. UPB_TYPE_STRING, /* STRING */
  17. UPB_TYPE_MESSAGE, /* GROUP */
  18. UPB_TYPE_MESSAGE, /* MESSAGE */
  19. UPB_TYPE_BYTES, /* BYTES */
  20. UPB_TYPE_UINT32, /* UINT32 */
  21. UPB_TYPE_ENUM, /* ENUM */
  22. UPB_TYPE_INT32, /* SFIXED32 */
  23. UPB_TYPE_INT64, /* SFIXED64 */
  24. UPB_TYPE_INT32, /* SINT32 */
  25. UPB_TYPE_INT64, /* SINT64 */
  26. };
  27. /* Maps descriptor type -> upb map size. */
  28. static const uint8_t desctype_to_mapsize[] = {
  29. -1, /* invalid descriptor type */
  30. 8, /* DOUBLE */
  31. 4, /* FLOAT */
  32. 8, /* INT64 */
  33. 8, /* UINT64 */
  34. 4, /* INT32 */
  35. 8, /* FIXED64 */
  36. 4, /* FIXED32 */
  37. 1, /* BOOL */
  38. UPB_MAPTYPE_STRING, /* STRING */
  39. sizeof(void*), /* GROUP */
  40. sizeof(void*), /* MESSAGE */
  41. UPB_MAPTYPE_STRING, /* BYTES */
  42. 4, /* UINT32 */
  43. 4, /* ENUM */
  44. 4, /* SFIXED32 */
  45. 8, /* SFIXED64 */
  46. 4, /* SINT32 */
  47. 8, /* SINT64 */
  48. };
  49. /* Data pertaining to the parse. */
  50. typedef struct {
  51. const char *field_start; /* Start of this field. */
  52. const char *limit; /* End of delimited region or end of buffer. */
  53. upb_arena *arena;
  54. int depth;
  55. uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */
  56. } upb_decstate;
  57. #define CHK(x) if (!(x)) { return 0; }
  58. #define PTR_AT(msg, ofs, type) (type*)((const char*)msg + ofs)
  59. static const char *upb_decode_message(const char *ptr, const upb_msglayout *l,
  60. upb_msg *msg, upb_decstate *d);
  61. static const char *upb_decode_varint(const char *ptr, const char *limit,
  62. uint64_t *val) {
  63. uint8_t byte;
  64. int bitpos = 0;
  65. *val = 0;
  66. do {
  67. CHK(bitpos < 70 && ptr < limit);
  68. byte = *ptr;
  69. *val |= (uint64_t)(byte & 0x7F) << bitpos;
  70. ptr++;
  71. bitpos += 7;
  72. } while (byte & 0x80);
  73. return ptr;
  74. }
  75. static const char *upb_decode_varint32(const char *ptr, const char *limit,
  76. uint32_t *val) {
  77. uint64_t u64;
  78. CHK(ptr = upb_decode_varint(ptr, limit, &u64))
  79. CHK(u64 <= UINT32_MAX);
  80. *val = (uint32_t)u64;
  81. return ptr;
  82. }
  83. static const char *upb_decode_64bit(const char *ptr, const char *limit,
  84. uint64_t *val) {
  85. CHK(limit - ptr >= 8);
  86. memcpy(val, ptr, 8);
  87. return ptr + 8;
  88. }
  89. static const char *upb_decode_32bit(const char *ptr, const char *limit,
  90. uint32_t *val) {
  91. CHK(limit - ptr >= 4);
  92. memcpy(val, ptr, 4);
  93. return ptr + 4;
  94. }
  95. static int32_t upb_zzdecode_32(uint32_t n) {
  96. return (n >> 1) ^ -(int32_t)(n & 1);
  97. }
  98. static int64_t upb_zzdecode_64(uint64_t n) {
  99. return (n >> 1) ^ -(int64_t)(n & 1);
  100. }
  101. static const char *upb_decode_string(const char *ptr, const char *limit,
  102. int *outlen) {
  103. uint32_t len;
  104. CHK(ptr = upb_decode_varint32(ptr, limit, &len));
  105. CHK(len < INT32_MAX);
  106. CHK(limit - ptr >= (int32_t)len);
  107. *outlen = len;
  108. return ptr;
  109. }
  110. static void upb_set32(void *msg, size_t ofs, uint32_t val) {
  111. memcpy((char*)msg + ofs, &val, sizeof(val));
  112. }
  113. static const char *upb_append_unknown(const char *ptr, upb_msg *msg,
  114. upb_decstate *d) {
  115. upb_msg_addunknown(msg, d->field_start, ptr - d->field_start, d->arena);
  116. return ptr;
  117. }
  118. static const char *upb_skip_unknownfielddata(const char *ptr, upb_decstate *d,
  119. uint32_t tag) {
  120. switch (tag & 7) {
  121. case UPB_WIRE_TYPE_VARINT: {
  122. uint64_t val;
  123. return upb_decode_varint(ptr, d->limit, &val);
  124. }
  125. case UPB_WIRE_TYPE_32BIT: {
  126. uint32_t val;
  127. return upb_decode_32bit(ptr, d->limit, &val);
  128. }
  129. case UPB_WIRE_TYPE_64BIT: {
  130. uint64_t val;
  131. return upb_decode_64bit(ptr, d->limit, &val);
  132. }
  133. case UPB_WIRE_TYPE_DELIMITED: {
  134. int len;
  135. CHK(ptr = upb_decode_string(ptr, d->limit, &len));
  136. return ptr + len;
  137. }
  138. case UPB_WIRE_TYPE_START_GROUP: {
  139. uint32_t field_number = tag >> 3;
  140. while (ptr < d->limit && d->end_group == 0) {
  141. uint32_t tag = 0;
  142. CHK(ptr = upb_decode_varint32(ptr, d->limit, &tag));
  143. CHK(ptr = upb_skip_unknownfielddata(ptr, d, tag));
  144. }
  145. CHK(d->end_group == field_number);
  146. d->end_group = 0;
  147. return ptr;
  148. }
  149. case UPB_WIRE_TYPE_END_GROUP:
  150. d->end_group = tag >> 3;
  151. return ptr;
  152. }
  153. return false;
  154. }
  155. static void *upb_array_reserve(upb_array *arr, size_t elements,
  156. size_t elem_size, upb_arena *arena) {
  157. if (arr->size - arr->len < elements) {
  158. CHK(_upb_array_realloc(arr, arr->len + elements, arena));
  159. }
  160. return (char*)_upb_array_ptr(arr) + (arr->len * elem_size);
  161. }
  162. bool upb_array_add(upb_array *arr, size_t elements, size_t elem_size,
  163. const void *data, upb_arena *arena) {
  164. void *dest = upb_array_reserve(arr, elements, elem_size, arena);
  165. CHK(dest);
  166. arr->len += elements;
  167. memcpy(dest, data, elements * elem_size);
  168. return true;
  169. }
  170. static upb_array *upb_getarr(upb_msg *msg, const upb_msglayout_field *field) {
  171. UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
  172. return *PTR_AT(msg, field->offset, upb_array*);
  173. }
  174. static upb_array *upb_getorcreatearr(upb_msg *msg,
  175. const upb_msglayout_field *field,
  176. upb_decstate *d) {
  177. upb_array *arr = upb_getarr(msg, field);
  178. if (!arr) {
  179. upb_fieldtype_t type = desctype_to_fieldtype[field->descriptortype];
  180. arr = _upb_array_new(d->arena, type);
  181. CHK(arr);
  182. *PTR_AT(msg, field->offset, upb_array*) = arr;
  183. }
  184. return arr;
  185. }
  186. static upb_msg *upb_getorcreatemsg(upb_msg *msg,
  187. const upb_msglayout_field *field,
  188. const upb_msglayout *layout,
  189. upb_decstate *d) {
  190. upb_msg **submsg = PTR_AT(msg, field->offset, upb_msg*);
  191. UPB_ASSERT(field->label != UPB_LABEL_REPEATED);
  192. if (!*submsg) {
  193. *submsg = _upb_msg_new(layout, d->arena);
  194. CHK(*submsg);
  195. }
  196. return *submsg;
  197. }
  198. static upb_msg *upb_addmsg(upb_msg *msg,
  199. const upb_msglayout_field *field,
  200. const upb_msglayout *layout,
  201. upb_decstate *d) {
  202. upb_msg *submsg;
  203. upb_array *arr = upb_getorcreatearr(msg, field, d);
  204. UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
  205. UPB_ASSERT(field->descriptortype == UPB_DESCRIPTOR_TYPE_MESSAGE ||
  206. field->descriptortype == UPB_DESCRIPTOR_TYPE_GROUP);
  207. submsg = _upb_msg_new(layout, d->arena);
  208. CHK(submsg);
  209. upb_array_add(arr, 1, sizeof(submsg), &submsg, d->arena);
  210. return submsg;
  211. }
  212. static void upb_sethasbit(upb_msg *msg, const upb_msglayout_field *field) {
  213. int32_t hasbit = field->presence;
  214. UPB_ASSERT(field->presence > 0);
  215. *PTR_AT(msg, hasbit / 8, char) |= (1 << (hasbit % 8));
  216. }
  217. static void upb_setoneofcase(upb_msg *msg, const upb_msglayout_field *field) {
  218. UPB_ASSERT(field->presence < 0);
  219. upb_set32(msg, ~field->presence, field->number);
  220. }
  221. static bool upb_decode_addval(upb_msg *msg, const upb_msglayout_field *field,
  222. void *val, size_t size, upb_decstate *d) {
  223. char *field_mem = PTR_AT(msg, field->offset, char);
  224. upb_array *arr;
  225. if (field->label == UPB_LABEL_REPEATED) {
  226. arr = upb_getorcreatearr(msg, field, d);
  227. CHK(arr);
  228. field_mem = upb_array_reserve(arr, 1, size, d->arena);
  229. CHK(field_mem);
  230. }
  231. memcpy(field_mem, val, size);
  232. return true;
  233. }
  234. static void upb_decode_setpresent(upb_msg *msg,
  235. const upb_msglayout_field *field) {
  236. if (field->label == UPB_LABEL_REPEATED) {
  237. upb_array *arr = upb_getarr(msg, field);
  238. UPB_ASSERT(arr->len < arr->size);
  239. arr->len++;
  240. } else if (field->presence < 0) {
  241. upb_setoneofcase(msg, field);
  242. } else if (field->presence > 0) {
  243. upb_sethasbit(msg, field);
  244. }
  245. }
  246. static const char *upb_decode_msgfield(const char *ptr,
  247. const upb_msglayout *layout, int limit,
  248. upb_msg *msg, upb_decstate *d) {
  249. const char* saved_limit = d->limit;
  250. d->limit = ptr + limit;
  251. CHK(--d->depth >= 0);
  252. ptr = upb_decode_message(ptr, layout, msg, d);
  253. d->depth++;
  254. d->limit = saved_limit;
  255. CHK(d->end_group == 0);
  256. return ptr;
  257. }
  258. static const char *upb_decode_groupfield(const char *ptr,
  259. const upb_msglayout *layout,
  260. int field_number, upb_msg *msg,
  261. upb_decstate *d) {
  262. CHK(--d->depth >= 0);
  263. ptr = upb_decode_message(ptr, layout, msg, d);
  264. d->depth++;
  265. CHK(d->end_group == field_number);
  266. d->end_group = 0;
  267. return ptr;
  268. }
  269. static const char *upb_decode_varintfield(const char *ptr, upb_msg *msg,
  270. const upb_msglayout_field *field,
  271. upb_decstate *d) {
  272. uint64_t val;
  273. CHK(ptr = upb_decode_varint(ptr, d->limit, &val));
  274. switch (field->descriptortype) {
  275. case UPB_DESCRIPTOR_TYPE_INT64:
  276. case UPB_DESCRIPTOR_TYPE_UINT64:
  277. CHK(upb_decode_addval(msg, field, &val, sizeof(val), d));
  278. break;
  279. case UPB_DESCRIPTOR_TYPE_INT32:
  280. case UPB_DESCRIPTOR_TYPE_UINT32:
  281. case UPB_DESCRIPTOR_TYPE_ENUM: {
  282. uint32_t val32 = (uint32_t)val;
  283. CHK(upb_decode_addval(msg, field, &val32, sizeof(val32), d));
  284. break;
  285. }
  286. case UPB_DESCRIPTOR_TYPE_BOOL: {
  287. bool valbool = val != 0;
  288. CHK(upb_decode_addval(msg, field, &valbool, sizeof(valbool), d));
  289. break;
  290. }
  291. case UPB_DESCRIPTOR_TYPE_SINT32: {
  292. int32_t decoded = upb_zzdecode_32((uint32_t)val);
  293. CHK(upb_decode_addval(msg, field, &decoded, sizeof(decoded), d));
  294. break;
  295. }
  296. case UPB_DESCRIPTOR_TYPE_SINT64: {
  297. int64_t decoded = upb_zzdecode_64(val);
  298. CHK(upb_decode_addval(msg, field, &decoded, sizeof(decoded), d));
  299. break;
  300. }
  301. default:
  302. return upb_append_unknown(ptr, msg, d);
  303. }
  304. upb_decode_setpresent(msg, field);
  305. return ptr;
  306. }
  307. static const char *upb_decode_64bitfield(const char *ptr,
  308. const upb_msglayout_field *field,
  309. upb_msg *msg, upb_decstate *d) {
  310. uint64_t val;
  311. CHK(ptr = upb_decode_64bit(ptr, d->limit, &val));
  312. switch (field->descriptortype) {
  313. case UPB_DESCRIPTOR_TYPE_DOUBLE:
  314. case UPB_DESCRIPTOR_TYPE_FIXED64:
  315. case UPB_DESCRIPTOR_TYPE_SFIXED64:
  316. CHK(upb_decode_addval(msg, field, &val, sizeof(val), d));
  317. break;
  318. default:
  319. return upb_append_unknown(ptr, msg, d);
  320. }
  321. upb_decode_setpresent(msg, field);
  322. return ptr;
  323. }
  324. static const char *upb_decode_32bitfield(const char *ptr,
  325. const upb_msglayout_field *field,
  326. upb_msg *msg, upb_decstate *d) {
  327. uint32_t val;
  328. CHK(ptr = upb_decode_32bit(ptr, d->limit, &val));
  329. switch (field->descriptortype) {
  330. case UPB_DESCRIPTOR_TYPE_FLOAT:
  331. case UPB_DESCRIPTOR_TYPE_FIXED32:
  332. case UPB_DESCRIPTOR_TYPE_SFIXED32:
  333. CHK(upb_decode_addval(msg, field, &val, sizeof(val), d));
  334. break;
  335. default:
  336. return upb_append_unknown(ptr, msg, d);
  337. }
  338. upb_decode_setpresent(msg, field);
  339. return ptr;
  340. }
  341. static const char *upb_decode_fixedpacked(const char *ptr, upb_decstate *d,
  342. upb_array *arr, uint32_t len,
  343. int elem_size) {
  344. size_t elements = len / elem_size;
  345. CHK((size_t)(elements * elem_size) == len);
  346. CHK(upb_array_add(arr, elements, elem_size, ptr, d->arena));
  347. return ptr + len;
  348. }
  349. static const char *upb_decode_strfield(const char *ptr, upb_decstate *d,
  350. uint32_t len, upb_strview *str) {
  351. str->data = ptr;
  352. str->size = len;
  353. return ptr + len;
  354. }
  355. static const char *upb_decode_toarray(const char *ptr,
  356. const upb_msglayout *layout,
  357. const upb_msglayout_field *field, int len,
  358. upb_msg *msg, upb_decstate *d) {
  359. upb_array *arr = upb_getorcreatearr(msg, field, d);
  360. CHK(arr);
  361. #define VARINT_CASE(ctype, decode) \
  362. VARINT_CASE_EX(ctype, decode, decode)
  363. #define VARINT_CASE_EX(ctype, decode, dtype) \
  364. { \
  365. const char *limit = ptr + len; \
  366. while (ptr < limit) { \
  367. uint64_t val; \
  368. ctype decoded; \
  369. CHK(ptr = upb_decode_varint(ptr, limit, &val)); \
  370. decoded = (decode)((dtype)val); \
  371. CHK(upb_array_add(arr, 1, sizeof(decoded), &decoded, d->arena)); \
  372. } \
  373. return ptr; \
  374. }
  375. switch (field->descriptortype) {
  376. case UPB_DESCRIPTOR_TYPE_STRING:
  377. case UPB_DESCRIPTOR_TYPE_BYTES: {
  378. upb_strview str;
  379. ptr = upb_decode_strfield(ptr, d, len, &str);
  380. CHK(upb_array_add(arr, 1, sizeof(str), &str, d->arena));
  381. return ptr;
  382. }
  383. case UPB_DESCRIPTOR_TYPE_FLOAT:
  384. case UPB_DESCRIPTOR_TYPE_FIXED32:
  385. case UPB_DESCRIPTOR_TYPE_SFIXED32:
  386. return upb_decode_fixedpacked(ptr, d, arr, len, sizeof(int32_t));
  387. case UPB_DESCRIPTOR_TYPE_DOUBLE:
  388. case UPB_DESCRIPTOR_TYPE_FIXED64:
  389. case UPB_DESCRIPTOR_TYPE_SFIXED64:
  390. return upb_decode_fixedpacked(ptr, d, arr, len, sizeof(int64_t));
  391. case UPB_DESCRIPTOR_TYPE_INT32:
  392. case UPB_DESCRIPTOR_TYPE_UINT32:
  393. case UPB_DESCRIPTOR_TYPE_ENUM:
  394. VARINT_CASE(uint32_t, uint32_t);
  395. case UPB_DESCRIPTOR_TYPE_INT64:
  396. case UPB_DESCRIPTOR_TYPE_UINT64:
  397. VARINT_CASE(uint64_t, uint64_t);
  398. case UPB_DESCRIPTOR_TYPE_BOOL:
  399. VARINT_CASE(bool, bool);
  400. case UPB_DESCRIPTOR_TYPE_SINT32:
  401. VARINT_CASE_EX(int32_t, upb_zzdecode_32, uint32_t);
  402. case UPB_DESCRIPTOR_TYPE_SINT64:
  403. VARINT_CASE_EX(int64_t, upb_zzdecode_64, uint64_t);
  404. case UPB_DESCRIPTOR_TYPE_MESSAGE: {
  405. const upb_msglayout *subl = layout->submsgs[field->submsg_index];
  406. upb_msg *submsg = upb_addmsg(msg, field, subl, d);
  407. CHK(submsg);
  408. return upb_decode_msgfield(ptr, subl, len, submsg, d);
  409. }
  410. case UPB_DESCRIPTOR_TYPE_GROUP:
  411. return upb_append_unknown(ptr, msg, d);
  412. }
  413. #undef VARINT_CASE
  414. UPB_UNREACHABLE();
  415. }
  416. static const char *upb_decode_mapfield(const char *ptr,
  417. const upb_msglayout *layout,
  418. const upb_msglayout_field *field,
  419. int len, upb_msg *msg, upb_decstate *d) {
  420. upb_map *map = *PTR_AT(msg, field->offset, upb_map*);
  421. const upb_msglayout *entry = layout->submsgs[field->submsg_index];
  422. upb_map_entry ent;
  423. if (!map) {
  424. /* Lazily create map. */
  425. const upb_msglayout_field *key_field = &entry->fields[0];
  426. const upb_msglayout_field *val_field = &entry->fields[1];
  427. char key_size = desctype_to_mapsize[key_field->descriptortype];
  428. char val_size = desctype_to_mapsize[val_field->descriptortype];
  429. UPB_ASSERT(key_field->number == 1);
  430. UPB_ASSERT(val_field->number == 2);
  431. UPB_ASSERT(key_field->offset == 0);
  432. UPB_ASSERT(val_field->offset == sizeof(upb_strview));
  433. map = _upb_map_new(d->arena, key_size, val_size);
  434. *PTR_AT(msg, field->offset, upb_map*) = map;
  435. }
  436. /* Parse map entry. */
  437. memset(&ent, 0, sizeof(ent));
  438. CHK(ptr = upb_decode_msgfield(ptr, entry, len, &ent.k, d));
  439. /* Insert into map. */
  440. _upb_map_set(map, &ent.k, map->key_size, &ent.v, map->val_size, d->arena);
  441. return ptr;
  442. }
  443. static const char *upb_decode_delimitedfield(const char *ptr,
  444. const upb_msglayout *layout,
  445. const upb_msglayout_field *field,
  446. upb_msg *msg, upb_decstate *d) {
  447. int len;
  448. CHK(ptr = upb_decode_string(ptr, d->limit, &len));
  449. if (field->label == UPB_LABEL_REPEATED) {
  450. return upb_decode_toarray(ptr, layout, field, len, msg, d);
  451. } else if (field->label == UPB_LABEL_MAP) {
  452. return upb_decode_mapfield(ptr, layout, field, len, msg, d);
  453. } else {
  454. switch (field->descriptortype) {
  455. case UPB_DESCRIPTOR_TYPE_STRING:
  456. case UPB_DESCRIPTOR_TYPE_BYTES: {
  457. upb_strview str;
  458. ptr = upb_decode_strfield(ptr, d, len, &str);
  459. CHK(upb_decode_addval(msg, field, &str, sizeof(str), d));
  460. break;
  461. }
  462. case UPB_DESCRIPTOR_TYPE_MESSAGE: {
  463. const upb_msglayout *subl = layout->submsgs[field->submsg_index];
  464. upb_msg *submsg = upb_getorcreatemsg(msg, field, subl, d);
  465. CHK(submsg);
  466. CHK(ptr = upb_decode_msgfield(ptr, subl, len, submsg, d));
  467. break;
  468. }
  469. default:
  470. /* TODO(haberman): should we accept the last element of a packed? */
  471. return upb_append_unknown(ptr + len, msg, d);
  472. }
  473. upb_decode_setpresent(msg, field);
  474. return ptr;
  475. }
  476. }
  477. static const upb_msglayout_field *upb_find_field(const upb_msglayout *l,
  478. uint32_t field_number) {
  479. /* Lots of optimization opportunities here. */
  480. int i;
  481. for (i = 0; i < l->field_count; i++) {
  482. if (l->fields[i].number == field_number) {
  483. return &l->fields[i];
  484. }
  485. }
  486. return NULL; /* Unknown field. */
  487. }
  488. static const char *upb_decode_field(const char *ptr,
  489. const upb_msglayout *layout, upb_msg *msg,
  490. upb_decstate *d) {
  491. uint32_t tag;
  492. const upb_msglayout_field *field;
  493. int field_number;
  494. d->field_start = ptr;
  495. CHK(ptr = upb_decode_varint32(ptr, d->limit, &tag));
  496. field_number = tag >> 3;
  497. field = upb_find_field(layout, field_number);
  498. if (field) {
  499. switch (tag & 7) {
  500. case UPB_WIRE_TYPE_VARINT:
  501. return upb_decode_varintfield(ptr, msg, field, d);
  502. case UPB_WIRE_TYPE_32BIT:
  503. return upb_decode_32bitfield(ptr, field, msg, d);
  504. case UPB_WIRE_TYPE_64BIT:
  505. return upb_decode_64bitfield(ptr, field, msg, d);
  506. case UPB_WIRE_TYPE_DELIMITED:
  507. return upb_decode_delimitedfield(ptr, layout, field, msg, d);
  508. case UPB_WIRE_TYPE_START_GROUP: {
  509. const upb_msglayout *subl = layout->submsgs[field->submsg_index];
  510. upb_msg *group;
  511. if (field->label == UPB_LABEL_REPEATED) {
  512. group = upb_addmsg(msg, field, subl, d);
  513. } else {
  514. group = upb_getorcreatemsg(msg, field, subl, d);
  515. }
  516. return upb_decode_groupfield(ptr, subl, field_number, group, d);
  517. }
  518. case UPB_WIRE_TYPE_END_GROUP:
  519. d->end_group = field_number;
  520. return ptr;
  521. default:
  522. CHK(false);
  523. }
  524. } else {
  525. CHK(field_number != 0);
  526. CHK(ptr = upb_skip_unknownfielddata(ptr, d, tag));
  527. CHK(ptr = upb_append_unknown(ptr, msg, d));
  528. return ptr;
  529. }
  530. UPB_UNREACHABLE();
  531. }
  532. static const char *upb_decode_message(const char *ptr, const upb_msglayout *l,
  533. upb_msg *msg, upb_decstate *d) {
  534. while (ptr < d->limit) {
  535. CHK(ptr = upb_decode_field(ptr, l, msg, d));
  536. }
  537. return ptr;
  538. }
  539. bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l,
  540. upb_arena *arena) {
  541. upb_decstate state;
  542. state.limit = buf + size;
  543. state.arena = arena;
  544. state.depth = 64;
  545. state.end_group = 0;
  546. /* Early exit required for buf==NULL case. */
  547. if (size == 0) return true;
  548. CHK(upb_decode_message(buf, l, msg, &state));
  549. return state.end_group == 0;
  550. }
  551. #undef CHK
  552. #undef PTR_AT