You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

983 lines
28 KiB

преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
  1. // This file is part of Jiffy released under the MIT license.
  2. // See the LICENSE file for more information.
  3. #include <assert.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include "erl_nif.h"
  9. #include "jiffy.h"
  10. #define U(c) ((unsigned char) (c))
  11. #define ERROR(i, msg) make_error(st, env, msg)
  12. #define STACK_SIZE_INC 64
  13. #define NUM_BUF_LEN 32
  14. #if WINDOWS || WIN32
  15. #define snprintf _snprintf
  16. #endif
  17. enum {
  18. st_value=0,
  19. st_object,
  20. st_array,
  21. st_key,
  22. st_colon,
  23. st_comma,
  24. st_done,
  25. st_invalid
  26. } JsonState;
  27. enum {
  28. nst_init=0,
  29. nst_sign,
  30. nst_mantissa,
  31. nst_frac0,
  32. nst_frac1,
  33. nst_frac,
  34. nst_esign,
  35. nst_edigit
  36. } JsonNumState;
  37. typedef struct {
  38. ErlNifEnv* env;
  39. jiffy_st* atoms;
  40. ERL_NIF_TERM arg;
  41. int is_partial;
  42. char* p;
  43. unsigned char* u;
  44. int i;
  45. int len;
  46. char* st_data;
  47. int st_size;
  48. int st_top;
  49. int is_resource;
  50. size_t reds;
  51. } Decoder;
  52. void
  53. dec_init_bin(Decoder* d, ErlNifEnv* env, ERL_NIF_TERM arg, ErlNifBinary* bin)
  54. {
  55. d->arg = arg;
  56. d->p = (char*) bin->data;
  57. d->u = bin->data;
  58. d->len = bin->size;
  59. d->env = env;
  60. }
  61. int
  62. dec_init(Decoder* d, ErlNifEnv* env, ERL_NIF_TERM arg,
  63. ERL_NIF_TERM opts, ErlNifBinary* bin)
  64. {
  65. int i;
  66. ERL_NIF_TERM val;
  67. d->env = env;
  68. d->atoms = enif_priv_data(env);
  69. d->is_partial = 0;
  70. dec_init_bin(d, env, arg, bin);
  71. d->i = 0;
  72. d->st_data = (char*) enif_alloc(STACK_SIZE_INC * sizeof(char));
  73. d->st_size = STACK_SIZE_INC;
  74. d->st_top = 0;
  75. for(i = 0; i < d->st_size; i++) {
  76. d->st_data[i] = st_invalid;
  77. }
  78. d->st_data[0] = st_value;
  79. d->st_top++;
  80. d->reds = REDUCTIONS;
  81. if(!enif_is_list(env, opts)) {
  82. return 0;
  83. }
  84. while(enif_get_list_cell(env, opts, &val, &opts)) {
  85. if(!get_reductions(env, val, d->atoms, &d->reds)) {
  86. return 0;
  87. }
  88. }
  89. d->is_resource = 0;
  90. return 1;
  91. }
  92. void
  93. dec_destroy(ErlNifEnv* env, void* dec)
  94. {
  95. Decoder* d = dec;
  96. if(d->st_data != NULL) {
  97. enif_free(d->st_data);
  98. }
  99. }
  100. ERL_NIF_TERM
  101. dec_error(Decoder* d, const char* atom)
  102. {
  103. ERL_NIF_TERM pos = enif_make_int(d->env, d->i+1);
  104. ERL_NIF_TERM msg = make_atom(d->env, atom);
  105. ERL_NIF_TERM ret = enif_make_tuple2(d->env, pos, msg);
  106. return enif_make_tuple2(d->env, d->atoms->atom_error, ret);
  107. }
  108. char
  109. dec_curr(Decoder* d)
  110. {
  111. return d->st_data[d->st_top-1];
  112. }
  113. int
  114. dec_top(Decoder* d)
  115. {
  116. return d->st_top;
  117. }
  118. void
  119. dec_push(Decoder* d, char val)
  120. {
  121. char* tmp;
  122. int new_sz;
  123. int i;
  124. if(d->st_top >= d->st_size) {
  125. new_sz = d->st_size + STACK_SIZE_INC;
  126. tmp = (char*) enif_alloc(new_sz * sizeof(char));
  127. memcpy(tmp, d->st_data, d->st_size * sizeof(char));
  128. enif_free(d->st_data);
  129. d->st_data = tmp;
  130. d->st_size = new_sz;
  131. for(i = d->st_top; i < d->st_size; i++) {
  132. d->st_data[i] = st_invalid;
  133. }
  134. }
  135. d->st_data[d->st_top++] = val;
  136. }
  137. void
  138. dec_pop(Decoder* d, char val)
  139. {
  140. assert(d->st_data[d->st_top-1] == val && "popped invalid state.");
  141. d->st_data[d->st_top-1] = st_invalid;
  142. d->st_top--;
  143. }
  144. int
  145. dec_string(Decoder* d, ERL_NIF_TERM* value)
  146. {
  147. int has_escape = 0;
  148. int num_escapes = 0;
  149. int st;
  150. int ulen;
  151. int ui;
  152. int hi;
  153. int lo;
  154. char* chrbuf;
  155. int chrpos;
  156. if(d->p[d->i] != '\"') {
  157. return 0;
  158. }
  159. d->i++;
  160. st = d->i;
  161. while(d->i < d->len) {
  162. if(d->u[d->i] < 0x20) {
  163. return 0;
  164. } else if(d->p[d->i] == '\"') {
  165. d->i++;
  166. goto parse;
  167. } else if(d->p[d->i] == '\\') {
  168. if(d->i+1 >= d->len) {
  169. return 0;
  170. }
  171. has_escape = 1;
  172. num_escapes += 1;
  173. d->i++;
  174. switch(d->p[d->i]) {
  175. case '\"':
  176. case '\\':
  177. case '/':
  178. case 'b':
  179. case 'f':
  180. case 'n':
  181. case 'r':
  182. case 't':
  183. d->i++;
  184. break;
  185. case 'u':
  186. hi = 0;
  187. lo = 0;
  188. d->i++;
  189. if(d->i + 4 >= d->len) {
  190. return 0;
  191. }
  192. hi = int_from_hex(&(d->u[d->i]));
  193. if(hi < 0) {
  194. return 0;
  195. }
  196. d->i += 4;
  197. if(hi >= 0xD800 && hi < 0xDC00) {
  198. if(d->i + 6 >= d->len) {
  199. return 0;
  200. }
  201. if(d->p[d->i++] != '\\') {
  202. return 0;
  203. } else if(d->p[d->i++] != 'u') {
  204. return 0;
  205. }
  206. lo = int_from_hex(&(d->u[d->i]));
  207. if(lo < 0) {
  208. return 0;
  209. }
  210. hi = unicode_from_pair(hi, lo);
  211. if(hi < 0) {
  212. return 0;
  213. }
  214. }
  215. hi = utf8_len(hi);
  216. if(hi < 0) {
  217. return 0;
  218. }
  219. if(lo == 0) {
  220. num_escapes += 5 - hi;
  221. } else {
  222. num_escapes += 11 - hi;
  223. }
  224. break;
  225. default:
  226. return 0;
  227. }
  228. } else if(d->u[d->i] < 0x80) {
  229. d->i++;
  230. } else {
  231. ulen = utf8_validate(&(d->u[d->i]), d->len - d->i);
  232. if(ulen < 0) {
  233. return 0;
  234. }
  235. d->i += ulen;
  236. }
  237. }
  238. // The goto above ensures that we only
  239. // hit this when a string is not terminated
  240. // correctly.
  241. return 0;
  242. parse:
  243. if(!has_escape) {
  244. *value = enif_make_sub_binary(d->env, d->arg, st, (d->i - st - 1));
  245. return 1;
  246. }
  247. hi = 0;
  248. lo = 0;
  249. ulen = (d->i - 1) - st - num_escapes;
  250. chrbuf = (char*) enif_make_new_binary(d->env, ulen, value);
  251. chrpos = 0;
  252. ui = st;
  253. while(ui < d->i - 1) {
  254. if(d->p[ui] != '\\') {
  255. chrbuf[chrpos++] = d->p[ui++];
  256. continue;
  257. }
  258. ui++;
  259. switch(d->p[ui]) {
  260. case '\"':
  261. case '\\':
  262. case '/':
  263. chrbuf[chrpos++] = d->p[ui];
  264. ui++;
  265. break;
  266. case 'b':
  267. chrbuf[chrpos++] = '\b';
  268. ui++;
  269. break;
  270. case 'f':
  271. chrbuf[chrpos++] = '\f';
  272. ui++;
  273. break;
  274. case 'n':
  275. chrbuf[chrpos++] = '\n';
  276. ui++;
  277. break;
  278. case 'r':
  279. chrbuf[chrpos++] = '\r';
  280. ui++;
  281. break;
  282. case 't':
  283. chrbuf[chrpos++] = '\t';
  284. ui++;
  285. break;
  286. case 'u':
  287. ui++;
  288. hi = int_from_hex(&(d->u[ui]));
  289. if(hi < 0) {
  290. return 0;
  291. }
  292. if(hi >= 0xD800 && hi < 0xDC00) {
  293. lo = int_from_hex(&(d->u[ui+6]));
  294. if(lo < 0) {
  295. return 0;
  296. }
  297. hi = unicode_from_pair(hi, lo);
  298. ui += 10;
  299. } else {
  300. ui += 4;
  301. }
  302. hi = unicode_to_utf8(hi, (unsigned char*) chrbuf+chrpos);
  303. if(hi < 0) {
  304. return 0;
  305. }
  306. chrpos += hi;
  307. break;
  308. default:
  309. return 0;
  310. }
  311. }
  312. return 1;
  313. }
  314. int
  315. dec_number(Decoder* d, ERL_NIF_TERM* value)
  316. {
  317. ERL_NIF_TERM num_type = d->atoms->atom_error;
  318. char state = nst_init;
  319. char nbuf[NUM_BUF_LEN];
  320. int st = d->i;
  321. int has_frac = 0;
  322. int has_exp = 0;
  323. double dval;
  324. long lval;
  325. while(d->i < d->len) {
  326. switch(state) {
  327. case nst_init:
  328. switch(d->p[d->i]) {
  329. case '-':
  330. state = nst_sign;
  331. d->i++;
  332. break;
  333. case '0':
  334. state = nst_frac0;
  335. d->i++;
  336. break;
  337. case '1':
  338. case '2':
  339. case '3':
  340. case '4':
  341. case '5':
  342. case '6':
  343. case '7':
  344. case '8':
  345. case '9':
  346. state = nst_mantissa;
  347. d->i++;
  348. break;
  349. default:
  350. return 0;
  351. }
  352. break;
  353. case nst_sign:
  354. switch(d->p[d->i]) {
  355. case '0':
  356. state = nst_frac0;
  357. d->i++;
  358. break;
  359. case '1':
  360. case '2':
  361. case '3':
  362. case '4':
  363. case '5':
  364. case '6':
  365. case '7':
  366. case '8':
  367. case '9':
  368. state = nst_mantissa;
  369. d->i++;
  370. break;
  371. default:
  372. return 0;
  373. }
  374. break;
  375. case nst_mantissa:
  376. switch(d->p[d->i]) {
  377. case '.':
  378. state = nst_frac1;
  379. d->i++;
  380. break;
  381. case 'e':
  382. case 'E':
  383. state = nst_esign;
  384. d->i++;
  385. break;
  386. case '0':
  387. case '1':
  388. case '2':
  389. case '3':
  390. case '4':
  391. case '5':
  392. case '6':
  393. case '7':
  394. case '8':
  395. case '9':
  396. d->i++;
  397. break;
  398. default:
  399. goto parse;
  400. }
  401. break;
  402. case nst_frac0:
  403. switch(d->p[d->i]) {
  404. case '.':
  405. state = nst_frac1;
  406. d->i++;
  407. break;
  408. case 'e':
  409. case 'E':
  410. state = nst_esign;
  411. d->i++;
  412. break;
  413. default:
  414. goto parse;
  415. }
  416. break;
  417. case nst_frac1:
  418. has_frac = 1;
  419. switch(d->p[d->i]) {
  420. case '0':
  421. case '1':
  422. case '2':
  423. case '3':
  424. case '4':
  425. case '5':
  426. case '6':
  427. case '7':
  428. case '8':
  429. case '9':
  430. state = nst_frac;
  431. d->i++;
  432. break;
  433. default:
  434. goto parse;
  435. }
  436. break;
  437. case nst_frac:
  438. switch(d->p[d->i]) {
  439. case 'e':
  440. case 'E':
  441. state = nst_esign;
  442. d->i++;
  443. break;
  444. case '0':
  445. case '1':
  446. case '2':
  447. case '3':
  448. case '4':
  449. case '5':
  450. case '6':
  451. case '7':
  452. case '8':
  453. case '9':
  454. d->i++;
  455. break;
  456. default:
  457. goto parse;
  458. }
  459. break;
  460. case nst_esign:
  461. has_exp = 1;
  462. switch(d->p[d->i]) {
  463. case '-':
  464. case '+':
  465. case '0':
  466. case '1':
  467. case '2':
  468. case '3':
  469. case '4':
  470. case '5':
  471. case '6':
  472. case '7':
  473. case '8':
  474. case '9':
  475. state = nst_edigit;
  476. d->i++;
  477. break;
  478. default:
  479. return 0;
  480. }
  481. break;
  482. case nst_edigit:
  483. switch(d->p[d->i]) {
  484. case '0':
  485. case '1':
  486. case '2':
  487. case '3':
  488. case '4':
  489. case '5':
  490. case '6':
  491. case '7':
  492. case '8':
  493. case '9':
  494. d->i++;
  495. break;
  496. default:
  497. goto parse;
  498. }
  499. break;
  500. default:
  501. return 0;
  502. }
  503. }
  504. parse:
  505. switch(state) {
  506. case nst_init:
  507. case nst_sign:
  508. case nst_frac1:
  509. case nst_esign:
  510. return 0;
  511. default:
  512. break;
  513. }
  514. errno = 0;
  515. if(d->i - st < NUM_BUF_LEN) {
  516. memset(nbuf, 0, NUM_BUF_LEN);
  517. memcpy(nbuf, &(d->p[st]), d->i - st);
  518. if(has_frac || has_exp) {
  519. dval = strtod(nbuf, NULL);
  520. if(errno != ERANGE) {
  521. *value = enif_make_double(d->env, dval);
  522. return 1;
  523. }
  524. } else {
  525. lval = strtol(nbuf, NULL, 10);
  526. if(errno != ERANGE) {
  527. *value = enif_make_int64(d->env, lval);
  528. return 1;
  529. }
  530. }
  531. }
  532. if(!has_frac && !has_exp) {
  533. num_type = d->atoms->atom_bignum;
  534. } else if(!has_frac && has_exp) {
  535. num_type = d->atoms->atom_bignum_e;
  536. } else {
  537. num_type = d->atoms->atom_bigdbl;
  538. }
  539. d->is_partial = 1;
  540. *value = enif_make_sub_binary(d->env, d->arg, st, d->i - st);
  541. *value = enif_make_tuple2(d->env, num_type, *value);
  542. return 1;
  543. }
  544. ERL_NIF_TERM
  545. make_object(ErlNifEnv* env, ERL_NIF_TERM pairs)
  546. {
  547. ERL_NIF_TERM ret = enif_make_list(env, 0);
  548. ERL_NIF_TERM key, val;
  549. while(enif_get_list_cell(env, pairs, &val, &pairs)) {
  550. if(!enif_get_list_cell(env, pairs, &key, &pairs)) {
  551. assert(0 == 1 && "Unbalanced object pairs.");
  552. }
  553. val = enif_make_tuple2(env, key, val);
  554. ret = enif_make_list_cell(env, val, ret);
  555. }
  556. return enif_make_tuple1(env, ret);
  557. }
  558. ERL_NIF_TERM
  559. make_array(ErlNifEnv* env, ERL_NIF_TERM list)
  560. {
  561. ERL_NIF_TERM ret = enif_make_list(env, 0);
  562. ERL_NIF_TERM item;
  563. while(enif_get_list_cell(env, list, &item, &list)) {
  564. ret = enif_make_list_cell(env, item, ret);
  565. }
  566. return ret;
  567. }
  568. static ERL_NIF_TERM
  569. dec_yield(Decoder* d, ERL_NIF_TERM objs, ERL_NIF_TERM curr)
  570. {
  571. Decoder* dec = d;
  572. if(!d->is_resource) {
  573. dec = enif_alloc_resource(d->atoms->res_decoder, sizeof(Decoder));
  574. *dec = *d;
  575. dec->is_resource = 1;
  576. }
  577. ERL_NIF_TERM val = enif_make_resource(d->env, dec);
  578. return enif_make_tuple4(d->env,
  579. d->atoms->atom_partial, val, objs, curr);
  580. }
  581. ERL_NIF_TERM
  582. decode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  583. {
  584. Decoder dec;
  585. Decoder* d = &dec;
  586. ErlNifBinary bin;
  587. ERL_NIF_TERM objs;
  588. ERL_NIF_TERM curr;
  589. ERL_NIF_TERM val;
  590. ERL_NIF_TERM ret;
  591. if(argc != 2) {
  592. return enif_make_badarg(env);
  593. } else if(!enif_inspect_binary(env, argv[0], &bin)) {
  594. return enif_make_badarg(env);
  595. }
  596. int arity;
  597. ERL_NIF_TERM* args;
  598. if(enif_get_tuple(env, argv[1], &arity, (const ERL_NIF_TERM **) &args)) {
  599. jiffy_st *priv = enif_priv_data(env);
  600. if(arity != 3 ) {
  601. return enif_make_badarg(env);
  602. }
  603. if(!enif_get_resource(env, args[0], priv->res_decoder, (void **) &d)) {
  604. return enif_make_badarg(env);
  605. }
  606. objs = args[1];
  607. curr = args[2];
  608. dec_init_bin(d, env, argv[0], &bin);
  609. } else {
  610. objs = enif_make_list(env, 0);
  611. curr = enif_make_list(env, 0);
  612. if (!dec_init(d, env, argv[0], argv[1], &bin)) {
  613. return enif_make_badarg(env);
  614. }
  615. }
  616. size_t processed = d->i;
  617. //fprintf(stderr, "Parsing:\r\n");
  618. while(d->i < bin.size) {
  619. //fprintf(stderr, "state: %d\r\n", dec_curr(d));
  620. switch(dec_curr(d)) {
  621. case st_value:
  622. switch(d->p[d->i]) {
  623. case ' ':
  624. case '\n':
  625. case '\r':
  626. case '\t':
  627. d->i++;
  628. break;
  629. case 'n':
  630. if(d->i + 3 >= d->len) {
  631. ret = dec_error(d, "invalid_literal");
  632. goto done;
  633. }
  634. if(memcmp(&(d->p[d->i]), "null", 4) != 0) {
  635. ret = dec_error(d, "invalid_literal");
  636. goto done;
  637. }
  638. val = d->atoms->atom_null;
  639. dec_pop(d, st_value);
  640. d->i += 4;
  641. break;
  642. case 't':
  643. if(d->i + 3 >= d->len) {
  644. ret = dec_error(d, "invalid_literal");
  645. goto done;
  646. }
  647. if(memcmp(&(d->p[d->i]), "true", 4) != 0) {
  648. ret = dec_error(d, "invalid_literal");
  649. goto done;
  650. }
  651. val = d->atoms->atom_true;
  652. dec_pop(d, st_value);
  653. d->i += 4;
  654. break;
  655. case 'f':
  656. if(d->i + 4 >= bin.size) {
  657. ret = dec_error(d, "invalid_literal");
  658. goto done;
  659. }
  660. if(memcmp(&(d->p[d->i]), "false", 5) != 0) {
  661. ret = dec_error(d, "invalid_literal");
  662. goto done;
  663. }
  664. val = d->atoms->atom_false;
  665. dec_pop(d, st_value);
  666. d->i += 5;
  667. break;
  668. case '\"':
  669. if(!dec_string(d, &val)) {
  670. ret = dec_error(d, "invalid_string");
  671. goto done;
  672. }
  673. dec_pop(d, st_value);
  674. break;
  675. case '-':
  676. case '0':
  677. case '1':
  678. case '2':
  679. case '3':
  680. case '4':
  681. case '5':
  682. case '6':
  683. case '7':
  684. case '8':
  685. case '9':
  686. if(!dec_number(d, &val)) {
  687. ret = dec_error(d, "invalid_number");
  688. goto done;
  689. }
  690. dec_pop(d, st_value);
  691. break;
  692. case '{':
  693. dec_push(d, st_object);
  694. dec_push(d, st_key);
  695. objs = enif_make_list_cell(env, curr, objs);
  696. curr = enif_make_list(env, 0);
  697. d->i++;
  698. break;
  699. case '[':
  700. dec_push(d, st_array);
  701. dec_push(d, st_value);
  702. objs = enif_make_list_cell(env, curr, objs);
  703. curr = enif_make_list(env, 0);
  704. d->i++;
  705. break;
  706. case ']':
  707. if(!enif_is_empty_list(env, curr)) {
  708. ret = dec_error(d, "invalid_json");
  709. goto done;
  710. }
  711. dec_pop(d, st_value);
  712. if(dec_curr(d) != st_array) {
  713. ret = dec_error(d, "invalid_json");
  714. goto done;
  715. }
  716. dec_pop(d, st_array);
  717. dec_pop(d, st_value);
  718. val = curr; // curr is []
  719. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  720. ret = dec_error(d, "internal_error");
  721. goto done;
  722. }
  723. d->i++;
  724. break;
  725. default:
  726. ret = dec_error(d, "invalid_json");
  727. goto done;
  728. }
  729. if(dec_top(d) == 0) {
  730. dec_push(d, st_done);
  731. } else if(dec_curr(d) != st_value && dec_curr(d) != st_key) {
  732. dec_push(d, st_comma);
  733. curr = enif_make_list_cell(env, val, curr);
  734. }
  735. break;
  736. case st_key:
  737. switch(d->p[d->i]) {
  738. case ' ':
  739. case '\n':
  740. case '\r':
  741. case '\t':
  742. d->i++;
  743. break;
  744. case '\"':
  745. if(!dec_string(d, &val)) {
  746. ret = dec_error(d, "invalid_string");
  747. goto done;
  748. }
  749. dec_pop(d, st_key);
  750. dec_push(d, st_colon);
  751. curr = enif_make_list_cell(env, val, curr);
  752. break;
  753. case '}':
  754. if(!enif_is_empty_list(env, curr)) {
  755. ret = dec_error(d, "invalid_json");
  756. goto done;
  757. }
  758. dec_pop(d, st_key);
  759. dec_pop(d, st_object);
  760. dec_pop(d, st_value);
  761. val = enif_make_tuple1(env, curr);
  762. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  763. ret = dec_error(d, "internal_error");
  764. goto done;
  765. }
  766. if(dec_top(d) == 0) {
  767. dec_push(d, st_done);
  768. } else {
  769. dec_push(d, st_comma);
  770. curr = enif_make_list_cell(env, val, curr);
  771. }
  772. d->i++;
  773. break;
  774. default:
  775. ret = dec_error(d, "invalid_json");
  776. goto done;
  777. }
  778. break;
  779. case st_colon:
  780. switch(d->p[d->i]) {
  781. case ' ':
  782. case '\n':
  783. case '\r':
  784. case '\t':
  785. d->i++;
  786. break;
  787. case ':':
  788. dec_pop(d, st_colon);
  789. dec_push(d, st_value);
  790. d->i++;
  791. break;
  792. default:
  793. ret = dec_error(d, "invalid_json");
  794. goto done;
  795. }
  796. break;
  797. case st_comma:
  798. switch(d->p[d->i]) {
  799. case ' ':
  800. case '\n':
  801. case '\r':
  802. case '\t':
  803. d->i++;
  804. break;
  805. case ',':
  806. dec_pop(d, st_comma);
  807. switch(dec_curr(d)) {
  808. case st_object:
  809. dec_push(d, st_key);
  810. break;
  811. case st_array:
  812. dec_push(d, st_value);
  813. break;
  814. default:
  815. ret = dec_error(d, "internal_error");
  816. goto done;
  817. }
  818. d->i++;
  819. break;
  820. case '}':
  821. dec_pop(d, st_comma);
  822. if(dec_curr(d) != st_object) {
  823. ret = dec_error(d, "invalid_json");
  824. goto done;
  825. }
  826. dec_pop(d, st_object);
  827. dec_pop(d, st_value);
  828. val = make_object(env, curr);
  829. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  830. ret = dec_error(d, "internal_error");
  831. goto done;
  832. }
  833. if(dec_top(d) > 0) {
  834. dec_push(d, st_comma);
  835. curr = enif_make_list_cell(env, val, curr);
  836. } else {
  837. dec_push(d, st_done);
  838. }
  839. d->i++;
  840. break;
  841. case ']':
  842. dec_pop(d, st_comma);
  843. if(dec_curr(d) != st_array) {
  844. ret = dec_error(d, "invalid_json");
  845. goto done;
  846. }
  847. dec_pop(d, st_array);
  848. dec_pop(d, st_value);
  849. val = make_array(env, curr);
  850. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  851. ret = dec_error(d, "internal_error");
  852. goto done;
  853. }
  854. if(dec_top(d) > 0) {
  855. dec_push(d, st_comma);
  856. curr = enif_make_list_cell(env, val, curr);
  857. } else {
  858. dec_push(d, st_done);
  859. }
  860. d->i++;
  861. break;
  862. default:
  863. ret = dec_error(d, "invalid_json");
  864. goto done;
  865. }
  866. break;
  867. case st_done:
  868. switch(d->p[d->i]) {
  869. case ' ':
  870. case '\n':
  871. case '\r':
  872. case '\t':
  873. d->i++;
  874. break;
  875. default:
  876. ret = dec_error(d, "invalid_trailing_data");
  877. goto done;
  878. }
  879. break;
  880. default:
  881. ret = dec_error(d, "invalid_internal_state");
  882. goto done;
  883. }
  884. if(dec_curr(d) != st_done) {
  885. if(jiffy_consume_timeslice(env, d->reds, d->i, &processed)) {
  886. return dec_yield(d, objs, curr);
  887. }
  888. }
  889. }
  890. if(dec_curr(d) != st_done) {
  891. ret = dec_error(d, "truncated_json");
  892. } else if(d->is_partial) {
  893. ret = enif_make_tuple2(env, d->atoms->atom_partial, val);
  894. } else {
  895. ret = val;
  896. }
  897. done:
  898. jiffy_consume_timeslice(env, d->reds, d->i, &processed);
  899. dec_destroy(env, d);
  900. return ret;
  901. }