25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

983 satır
28 KiB

  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. }