Lines Matching refs:js_ctx

29069 DUK_LOCAL_DECL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx);
29070 DUK_LOCAL_DECL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx);
29071 DUK_LOCAL_DECL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx);
29072 DUK_LOCAL_DECL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx);
29073 DUK_LOCAL_DECL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx);
29074 DUK_LOCAL_DECL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uin…
29075 DUK_LOCAL_DECL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx);
29076 DUK_LOCAL_DECL void duk__dec_string(duk_json_dec_ctx *js_ctx);
29078 DUK_LOCAL_DECL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx);
29079 DUK_LOCAL_DECL void duk__dec_pointer(duk_json_dec_ctx *js_ctx);
29080 DUK_LOCAL_DECL void duk__dec_buffer(duk_json_dec_ctx *js_ctx);
29082 DUK_LOCAL_DECL void duk__dec_number(duk_json_dec_ctx *js_ctx);
29083 DUK_LOCAL_DECL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx);
29084 DUK_LOCAL_DECL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx);
29085 DUK_LOCAL_DECL void duk__dec_object(duk_json_dec_ctx *js_ctx);
29086 DUK_LOCAL_DECL void duk__dec_array(duk_json_dec_ctx *js_ctx);
29087 DUK_LOCAL_DECL void duk__dec_value(duk_json_dec_ctx *js_ctx);
29088 DUK_LOCAL_DECL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx);
29090 DUK_LOCAL_DECL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch);
29091 DUK_LOCAL_DECL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch…
29092 DUK_LOCAL_DECL void duk__unemit_1(duk_json_enc_ctx *js_ctx);
29093 DUK_LOCAL_DECL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h);
29095 DUK_LOCAL_DECL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *p);
29097 DUK_LOCAL_DECL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx);
29098 DUK_LOCAL_DECL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp,…
29099 DUK_LOCAL_DECL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k);
29100 DUK_LOCAL_DECL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str);
29101 DUK_LOCAL_DECL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top);
29102 DUK_LOCAL_DECL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top);
29103 DUK_LOCAL_DECL void duk__enc_object(duk_json_enc_ctx *js_ctx);
29104 DUK_LOCAL_DECL void duk__enc_array(duk_json_enc_ctx *js_ctx);
29105 DUK_LOCAL_DECL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder);
29107 DUK_LOCAL_DECL void duk__enc_double(duk_json_enc_ctx *js_ctx);
29109 DUK_LOCAL_DECL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv);
29112 DUK_LOCAL_DECL void duk__enc_buffer(duk_json_enc_ctx *js_ctx, duk_hbuffer *h);
29113 DUK_LOCAL_DECL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr);
29114 DUK_LOCAL_DECL void duk__enc_bufferobject(duk_json_enc_ctx *js_ctx, duk_hbufferobject *h_bufobj);
29116 DUK_LOCAL_DECL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_int_t depth);
29241 DUK_LOCAL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx) { in duk__dec_syntax_error() argument
29246 DUK_ERROR_FMT1(js_ctx->thr, DUK_ERR_SYNTAX_ERROR, DUK_STR_FMT_INVALID_JSON, in duk__dec_syntax_error()
29247 (long) (js_ctx->p - js_ctx->p_start)); in duk__dec_syntax_error()
29250 DUK_LOCAL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx) { in duk__dec_eat_white() argument
29254 p = js_ctx->p; in duk__dec_eat_white()
29256 DUK_ASSERT(p <= js_ctx->p_end); in duk__dec_eat_white()
29277 js_ctx->p = p; in duk__dec_eat_white()
29280 DUK_LOCAL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx) { in duk__dec_peek() argument
29281 DUK_ASSERT(js_ctx->p <= js_ctx->p_end); in duk__dec_peek()
29282 return *js_ctx->p; in duk__dec_peek()
29285 DUK_LOCAL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx) { in duk__dec_get() argument
29286 DUK_ASSERT(js_ctx->p <= js_ctx->p_end); in duk__dec_get()
29287 return *js_ctx->p++; in duk__dec_get()
29290 DUK_LOCAL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx) { in duk__dec_get_nonwhite() argument
29291 duk__dec_eat_white(js_ctx); in duk__dec_get_nonwhite()
29292 return duk__dec_get(js_ctx); in duk__dec_get_nonwhite()
29296 DUK_LOCAL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n… in duk__dec_decode_hex_escape() argument
29305 x = duk__dec_get(js_ctx); in duk__dec_decode_hex_escape()
29324 duk__dec_syntax_error(js_ctx); in duk__dec_decode_hex_escape()
29329 DUK_LOCAL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx) { in duk__dec_req_stridx() argument
29341 h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); in duk__dec_req_stridx()
29345 DUK_ASSERT(*(js_ctx->p - 1) == *(p - 1)); /* first character has been matched */ in duk__dec_req_stridx()
29352 y = duk__dec_get(js_ctx); in duk__dec_req_stridx()
29363 duk__dec_syntax_error(js_ctx); in duk__dec_req_stridx()
29367 DUK_LOCAL duk_small_int_t duk__dec_string_escape(duk_json_dec_ctx *js_ctx, duk_uint8_t **ext_p) { in duk__dec_string_escape() argument
29374 cp = (duk_uint_fast32_t) duk__dec_get(js_ctx); in duk__dec_string_escape()
29385 cp = duk__dec_decode_hex_escape(js_ctx, 4); in duk__dec_string_escape()
29390 if (js_ctx->flag_ext_custom) { in duk__dec_string_escape()
29391 cp = duk__dec_decode_hex_escape(js_ctx, 8); in duk__dec_string_escape()
29398 if (js_ctx->flag_ext_custom) { in duk__dec_string_escape()
29399 cp = duk__dec_decode_hex_escape(js_ctx, 2); in duk__dec_string_escape()
29416 DUK_LOCAL void duk__dec_string(duk_json_dec_ctx *js_ctx) { in duk__dec_string() argument
29417 duk_hthread *thr = js_ctx->thr; in duk__dec_string()
29431 DUK_BW_INIT_PUSHBUF(js_ctx->thr, bw, DUK__JSON_DECSTR_BUFSIZE); in duk__dec_string()
29432 q = DUK_BW_GET_PTR(js_ctx->thr, bw); in duk__dec_string()
29449 q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, safe + DUK_UNICODE_MAX_XUTF8_LENGTH, q); in duk__dec_string()
29451 p = js_ctx->p; /* temp copy, write back for next loop */ in duk__dec_string()
29454 js_ctx->p = p; in duk__dec_string()
29468 js_ctx->p = p; in duk__dec_string()
29475 js_ctx->p = p; in duk__dec_string()
29476 if (duk__dec_string_escape(js_ctx, &q) != 0) { in duk__dec_string()
29481 js_ctx->p = p; in duk__dec_string()
29491 q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, DUK_UNICODE_MAX_XUTF8_LENGTH, q); in duk__dec_string()
29493 x = duk__dec_get(js_ctx); in duk__dec_string()
29498 if (duk__dec_string_escape(js_ctx, &q) != 0) { in duk__dec_string()
29510 DUK_BW_SETPTR_AND_COMPACT(js_ctx->thr, bw, q); in duk__dec_string()
29518 duk__dec_syntax_error(js_ctx); in duk__dec_string()
29526 DUK_LOCAL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx) { in duk__dec_plain_string() argument
29527 duk_hthread *thr = js_ctx->thr; in duk__dec_plain_string()
29534 js_ctx->p--; /* safe */ in duk__dec_plain_string()
29535 p = js_ctx->p; in duk__dec_plain_string()
29561 duk_push_lstring(ctx, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p)); in duk__dec_plain_string()
29562 js_ctx->p = p; in duk__dec_plain_string()
29569 DUK_LOCAL void duk__dec_pointer(duk_json_dec_ctx *js_ctx) { in duk__dec_pointer() argument
29570 duk_hthread *thr = js_ctx->thr; in duk__dec_pointer()
29578 p = js_ctx->p; in duk__dec_pointer()
29608 (void) DUK_SSCANF((const char *) js_ctx->p, DUK_STR_FMT_PTR, &voidptr); in duk__dec_pointer()
29610 js_ctx->p = p + 1; /* skip ')' */ in duk__dec_pointer()
29617 duk__dec_syntax_error(js_ctx); in duk__dec_pointer()
29623 DUK_LOCAL void duk__dec_buffer(duk_json_dec_ctx *js_ctx) { in duk__dec_buffer() argument
29624 duk_hthread *thr = js_ctx->thr; in duk__dec_buffer()
29633 p = js_ctx->p; in duk__dec_buffer()
29662 src_len = (duk_size_t) (p - js_ctx->p); in duk__dec_buffer()
29665 DUK_MEMCPY((void *) buf, (const void *) js_ctx->p, src_len); in duk__dec_buffer()
29668 js_ctx->p = p + 1; /* skip '|' */ in duk__dec_buffer()
29675 duk__dec_syntax_error(js_ctx); in duk__dec_buffer()
29681 DUK_LOCAL void duk__dec_number(duk_json_dec_ctx *js_ctx) { in duk__dec_number() argument
29682 duk_context *ctx = (duk_context *) js_ctx->thr; in duk__dec_number()
29690 p_start = js_ctx->p; in duk__dec_number()
29696 p = js_ctx->p; in duk__dec_number()
29702 (const void *) js_ctx->p_end, (long) x)); in duk__dec_number()
29724 js_ctx->p = p; in duk__dec_number()
29726 DUK_ASSERT(js_ctx->p > p_start); in duk__dec_number()
29737 duk__dec_syntax_error(js_ctx); in duk__dec_number()
29746 DUK_LOCAL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx) { in duk__dec_objarr_entry() argument
29747 duk_context *ctx = (duk_context *) js_ctx->thr; in duk__dec_objarr_entry()
29752 DUK_ASSERT(js_ctx->recursion_depth >= 0); in duk__dec_objarr_entry()
29753 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); in duk__dec_objarr_entry()
29754 if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { in duk__dec_objarr_entry()
29757 js_ctx->recursion_depth++; in duk__dec_objarr_entry()
29760 DUK_LOCAL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx) { in duk__dec_objarr_exit() argument
29763 DUK_ASSERT(js_ctx->recursion_depth > 0); in duk__dec_objarr_exit()
29764 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); in duk__dec_objarr_exit()
29765 js_ctx->recursion_depth--; in duk__dec_objarr_exit()
29768 DUK_LOCAL void duk__dec_object(duk_json_dec_ctx *js_ctx) { in duk__dec_object() argument
29769 duk_context *ctx = (duk_context *) js_ctx->thr; in duk__dec_object()
29775 duk__dec_objarr_entry(js_ctx); in duk__dec_object()
29783 x = duk__dec_get_nonwhite(js_ctx); in duk__dec_object()
29793 x = duk__dec_get_nonwhite(js_ctx); in duk__dec_object()
29810 duk__dec_string(js_ctx); in duk__dec_object()
29812 } else if (js_ctx->flag_ext_custom && in duk__dec_object()
29814 duk__dec_plain_string(js_ctx); in duk__dec_object()
29822 x = duk__dec_get_nonwhite(js_ctx); in duk__dec_object()
29827 duk__dec_value(js_ctx); in duk__dec_object()
29843 duk__dec_objarr_exit(js_ctx); in duk__dec_object()
29847 duk__dec_syntax_error(js_ctx); in duk__dec_object()
29851 DUK_LOCAL void duk__dec_array(duk_json_dec_ctx *js_ctx) { in duk__dec_array() argument
29852 duk_context *ctx = (duk_context *) js_ctx->thr; in duk__dec_array()
29858 duk__dec_objarr_entry(js_ctx); in duk__dec_array()
29866 x = duk__dec_get_nonwhite(js_ctx); in duk__dec_array()
29884 js_ctx->p--; /* backtrack (safe) */ in duk__dec_array()
29892 duk__dec_value(js_ctx); in duk__dec_array()
29911 duk__dec_objarr_exit(js_ctx); in duk__dec_array()
29915 duk__dec_syntax_error(js_ctx); in duk__dec_array()
29919 DUK_LOCAL void duk__dec_value(duk_json_dec_ctx *js_ctx) { argument
29920 duk_context *ctx = (duk_context *) js_ctx->thr;
29923 x = duk__dec_get_nonwhite(js_ctx);
29930 duk__dec_string(js_ctx);
29933 if (js_ctx->flag_ext_custom && x == DUK_ASC_MINUS && duk__dec_peek(js_ctx) == DUK_ASC_UC_I) {
29934 duk__dec_req_stridx(js_ctx, DUK_STRIDX_MINUS_INFINITY); /* "-Infinity", '-' has been eaten */
29941 js_ctx->p--; /* safe */
29942 duk__dec_number(js_ctx);
29945 duk__dec_req_stridx(js_ctx, DUK_STRIDX_TRUE);
29948 duk__dec_req_stridx(js_ctx, DUK_STRIDX_FALSE);
29951 duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_NULL);
29954 } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LC_U) {
29955 duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_UNDEFINED);
29957 } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_N) {
29958 duk__dec_req_stridx(js_ctx, DUK_STRIDX_NAN);
29960 } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_I) {
29961 duk__dec_req_stridx(js_ctx, DUK_STRIDX_INFINITY);
29963 } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LPAREN) {
29964 duk__dec_pointer(js_ctx);
29965 } else if (js_ctx->flag_ext_custom && x == DUK_ASC_PIPE) {
29966 duk__dec_buffer(js_ctx);
29969 duk__dec_object(js_ctx);
29971 duk__dec_array(js_ctx);
29977 duk__dec_eat_white(js_ctx);
29983 duk__dec_syntax_error(js_ctx);
29991 DUK_LOCAL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx) { argument
29992 duk_context *ctx = (duk_context *) js_ctx->thr;
30020 duk__dec_reviver_walk(js_ctx); /* -> [ ... holder name val new_elem ] */
30047 duk__dec_reviver_walk(js_ctx);
30072 duk_dup(ctx, js_ctx->idx_reviver);
30084 #define DUK__EMIT_1(js_ctx,ch) duk__emit_1((js_ctx), (duk_uint_fast8_t) (ch)) argument
30085 #define DUK__EMIT_2(js_ctx,ch1,ch2) duk__emit_2((js_ctx), (duk_uint_fast8_t) (ch1), (duk_uint_f… argument
30086 #define DUK__EMIT_HSTR(js_ctx,h) duk__emit_hstring((js_ctx), (h)) argument
30088 #define DUK__EMIT_CSTR(js_ctx,p) duk__emit_cstring((js_ctx), (p)) argument
30090 #define DUK__EMIT_STRIDX(js_ctx,i) duk__emit_stridx((js_ctx), (i)) argument
30091 #define DUK__UNEMIT_1(js_ctx) duk__unemit_1((js_ctx)) argument
30093 DUK_LOCAL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch) { argument
30094 DUK_BW_WRITE_ENSURE_U8(js_ctx->thr, &js_ctx->bw, ch);
30097 DUK_LOCAL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2) { argument
30098 DUK_BW_WRITE_ENSURE_U8_2(js_ctx->thr, &js_ctx->bw, ch1, ch2);
30101 DUK_LOCAL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h) { argument
30102 DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h);
30106 DUK_LOCAL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *str) { argument
30107 DUK_BW_WRITE_ENSURE_CSTRING(js_ctx->thr, &js_ctx->bw, str);
30111 DUK_LOCAL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx) { argument
30116 h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx);
30119 DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h);
30122 DUK_LOCAL void duk__unemit_1(duk_json_enc_ctx *js_ctx) { argument
30123 DUK_ASSERT(DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw) >= 1);
30124 DUK_BW_ADD_PTR(js_ctx->thr, &js_ctx->bw, -1);
30132 DUK_LOCAL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_… argument
30136 DUK_UNREF(js_ctx);
30148 if (DUK_UNLIKELY(js_ctx->flag_ext_custom)) {
30159 if (DUK_LIKELY(js_ctx->flag_ext_custom)) {
30186 DUK_LOCAL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k) { argument
30200 if (js_ctx->flag_avoid_key_quotes) {
30224 DUK__EMIT_HSTR(js_ctx, k);
30229 duk__enc_quote_string(js_ctx, k);
30237 DUK_LOCAL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str) { argument
30238 duk_hthread *thr = js_ctx->thr;
30250 DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE);
30269 q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space);
30286 q = duk__emit_esc_auto_fast(js_ctx, cp, q);
30287 } else if (b == 0x7f && js_ctx->flag_ascii_only) {
30291 q = duk__emit_esc_auto_fast(js_ctx, cp, q);
30318 q = duk__emit_esc_auto_fast(js_ctx, cp, q);
30320 } else if (cp == 0x7f && js_ctx->flag_ascii_only) {
30321 q = duk__emit_esc_auto_fast(js_ctx, cp, q);
30353 if (js_ctx->flag_ascii_only || cp == 0x2028 || cp == 0x2029) {
30355 if (js_ctx->flag_ascii_only) {
30357 q = duk__emit_esc_auto_fast(js_ctx, cp, q);
30365 DUK_BW_SET_PTR(thr, &js_ctx->bw, q);
30368 DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE);
30374 DUK_LOCAL void duk__enc_double(duk_json_enc_ctx *js_ctx) { argument
30385 DUK_ASSERT(js_ctx != NULL);
30386 thr = js_ctx->thr;
30407 (js_ctx->flag_ext_custom_or_compatible))) {
30418 DUK__EMIT_HSTR(js_ctx, h_str);
30423 if (!(js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |
30427 stridx = js_ctx->stridx_custom_nan;
30429 stridx = js_ctx->stridx_custom_posinf;
30431 stridx = js_ctx->stridx_custom_neginf;
30436 DUK__EMIT_STRIDX(js_ctx, stridx);
30441 DUK_LOCAL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv) { argument
30460 DUK__EMIT_CSTR(js_ctx, (const char *) buf);
30543 DUK_LOCAL void duk__enc_buffer_data(duk_json_enc_ctx *js_ctx, duk_uint8_t *buf_data, duk_size_t buf… argument
30548 thr = js_ctx->thr;
30550 DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */
30551 DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible);
30567 q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space);
30570 if (js_ctx->flag_ext_custom)
30585 DUK_ASSERT(js_ctx->flag_ext_compatible);
30594 DUK_BW_SET_PTR(thr, &js_ctx->bw, q);
30597 DUK_LOCAL void duk__enc_buffer(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) { argument
30598 duk__enc_buffer_data(js_ctx,
30599 (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h),
30605 DUK_LOCAL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr) { argument
30609 DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */
30610 DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible);
30618 if (js_ctx->flag_ext_custom)
30630 DUK_ASSERT(js_ctx->flag_ext_compatible);
30637 DUK__EMIT_CSTR(js_ctx, buf);
30642 DUK_LOCAL void duk__enc_bufferobject(duk_json_enc_ctx *js_ctx, duk_hbufferobject *h_bufobj) { argument
30646 DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
30649 duk__enc_buffer_data(js_ctx,
30650 … (duk_uint8_t *) DUK_HBUFFEROBJECT_GET_SLICE_BASE(js_ctx->thr->heap, h_bufobj),
30660 DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_int_t depth) { argument
30661 DUK_ASSERT(js_ctx->h_gap != NULL);
30662 DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */
30664 DUK__EMIT_1(js_ctx, 0x0a);
30666 DUK__EMIT_HSTR(js_ctx, js_ctx->h_gap);
30670 DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_int_t depth) { argument
30678 DUK_ASSERT(js_ctx->h_gap != NULL);
30679 DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */
30681 DUK__EMIT_1(js_ctx, 0x0a);
30692 gap_data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(js_ctx->h_gap);
30693 gap_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap);
30697 p = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, need_bytes);
30718 DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, p);
30723 DUK_LOCAL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) { argument
30724 duk_context *ctx = (duk_context *) js_ctx->thr;
30739 n = js_ctx->recursion_depth;
30744 if (DUK_UNLIKELY(js_ctx->visiting[i] == h_target)) {
30749 if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) {
30750 js_ctx->visiting[js_ctx->recursion_depth] = h_target;
30754 if (duk_has_prop(ctx, js_ctx->idx_loop)) {
30758 duk_put_prop(ctx, js_ctx->idx_loop); /* -> [ ... ] */
30763 DUK_ASSERT(js_ctx->recursion_depth >= 0);
30764 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
30765 if (js_ctx->recursion_depth >= js_ctx->recursion_limit) {
30768 js_ctx->recursion_depth++;
30771 (long) duk_get_top(ctx), (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop)));
30775 DUK_LOCAL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) { argument
30776 duk_context *ctx = (duk_context *) js_ctx->thr;
30781 DUK_ASSERT(js_ctx->recursion_depth > 0);
30782 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
30783 js_ctx->recursion_depth--;
30790 if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) {
30794 duk_del_prop(ctx, js_ctx->idx_loop); /* -> [ ... ] */
30801 (long) duk_get_top(ctx), (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop)));
30808 DUK_LOCAL void duk__enc_object(duk_json_enc_ctx *js_ctx) { argument
30809 duk_context *ctx = (duk_context *) js_ctx->thr;
30820 duk__enc_objarr_entry(js_ctx, &entry_top);
30824 if (js_ctx->idx_proplist >= 0) {
30825 idx_keys = js_ctx->idx_proplist;
30839 DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);
30859 prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw);
30860 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
30861 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
30862 duk__enc_key_autoquote(js_ctx, h_key);
30863 DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE);
30865 duk__enc_key_autoquote(js_ctx, h_key);
30866 DUK__EMIT_1(js_ctx, DUK_ASC_COLON);
30871 if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_obj) == 0)) {
30875 DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size);
30877 DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
30885 DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
30886 DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
30887 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
30888 DUK_ASSERT(js_ctx->recursion_depth >= 1);
30889 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1);
30892 DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);
30894 duk__enc_objarr_exit(js_ctx, &entry_top);
30903 DUK_LOCAL void duk__enc_array(duk_json_enc_ctx *js_ctx) { argument
30904 duk_context *ctx = (duk_context *) js_ctx->thr;
30913 duk__enc_objarr_entry(js_ctx, &entry_top);
30919 DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET);
30928 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
30929 DUK_ASSERT(js_ctx->recursion_depth >= 1);
30930 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
30939 if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_arr) == 0)) {
30941 DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
30948 DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
30953 DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
30954 DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
30955 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
30956 DUK_ASSERT(js_ctx->recursion_depth >= 1);
30957 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1);
30960 DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET);
30962 duk__enc_objarr_exit(js_ctx, &entry_top);
30971 DUK_LOCAL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder) { argument
30972 duk_context *ctx = (duk_context *) js_ctx->thr;
31017 if (js_ctx->h_replacer) {
31020 duk_push_hobject(ctx, js_ctx->h_replacer); /* -> [ ... key val replacer ] */
31051 if (js_ctx->mask_for_undefined & DUK_TYPE_MASK_BUFFER) {
31056 duk__enc_bufferobject(js_ctx, h_bufobj);
31100 if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |
31104 DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);
31105 DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);
31125 if (duk_check_type_mask(ctx, -1, js_ctx->mask_for_undefined)) {
31136 DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);
31141 DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
31145 DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ?
31152 duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv));
31160 duk__enc_quote_string(js_ctx, h);
31173 duk__enc_array(js_ctx);
31175 duk__enc_object(js_ctx);
31182 duk__enc_buffer(js_ctx, DUK_TVAL_GET_BUFFER(tv));
31189 DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);
31190 DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);
31202 duk__enc_fastint_tval(js_ctx, tv);
31212 duk__enc_double(js_ctx);
31256 DUK_LOCAL duk_bool_t duk__json_stringify_fast_value(duk_json_enc_ctx *js_ctx, duk_tval *tv) { argument
31261 DUK_ASSERT(js_ctx != NULL);
31262 DUK_ASSERT(js_ctx->thr != NULL);
31273 if (js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible) {
31274 DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);
31284 DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
31288 DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ?
31297 duk__enc_quote_string(js_ctx, h);
31338 DUK_ASSERT(js_ctx->recursion_depth >= 0);
31339 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
31340 if (js_ctx->recursion_depth >= js_ctx->recursion_limit) {
31342 DUK_ERROR_RANGE(js_ctx->thr, DUK_STR_JSONDEC_RECLIMIT);
31345 for (i = 0, n = (duk_uint_fast32_t) js_ctx->recursion_depth; i < n; i++) {
31346 if (DUK_UNLIKELY(js_ctx->visiting[i] == obj)) {
31348 DUK_ERROR_TYPE(js_ctx->thr, DUK_STR_CYCLIC_INPUT);
31355 DUK_ASSERT(js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY);
31356 js_ctx->visiting[js_ctx->recursion_depth] = obj;
31357 js_ctx->recursion_depth++;
31369 if (duk_hobject_hasprop_raw(js_ctx->thr, obj, DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr)) ||
31385 if (js_ctx->flag_ext_custom_or_compatible) {
31416 DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);
31431 k = DUK_HOBJECT_E_GET_KEY(js_ctx->thr->heap, obj, i);
31435 if (!DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(js_ctx->thr->heap, obj, i)) {
31438 if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(js_ctx->thr->heap, obj, i)) {
31449 tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(js_ctx->thr->heap, obj, i);
31451 prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw);
31452 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
31453 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
31454 duk__enc_key_autoquote(js_ctx, k);
31455 DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE);
31457 duk__enc_key_autoquote(js_ctx, k);
31458 DUK__EMIT_1(js_ctx, DUK_ASC_COLON);
31461 if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) {
31463 DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size);
31465 DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
31476 DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
31477 DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
31478 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
31479 DUK_ASSERT(js_ctx->recursion_depth >= 1);
31480 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1);
31483 DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);
31488 DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET);
31496 arr_len = (duk_uint_fast32_t) duk_hobject_get_length(js_ctx->thr, obj);
31511 tv_val = DUK_HOBJECT_A_GET_VALUE_PTR(js_ctx->thr->heap, obj, i);
31513 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
31514 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);
31526 duk_push_uint((duk_context *) js_ctx->thr, (duk_uint_t) i);
31527 h_tmp = duk_to_hstring((duk_context *) js_ctx->thr, -1);
31529 has_inherited = duk_hobject_hasprop_raw(js_ctx->thr, obj, h_tmp);
31530 duk_pop((duk_context *) js_ctx->thr);
31542 DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);
31544 DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
31547 if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) {
31548 DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);
31552 DUK__EMIT_1(js_ctx, DUK_ASC_COMMA);
31557 DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);
31558 DUK__UNEMIT_1(js_ctx); /* eat trailing comma */
31559 if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {
31560 DUK_ASSERT(js_ctx->recursion_depth >= 1);
31561 duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1);
31564 DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET);
31584 tv_internal = duk_hobject_get_internal_value_tval_ptr(js_ctx->thr->heap, obj);
31592 DUK_ASSERT(js_ctx->recursion_depth > 0);
31593 js_ctx->recursion_depth--; /* required to keep recursion depth correct */
31598 DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);
31600 duk__enc_bufferobject(js_ctx, (duk_hbufferobject *) obj);
31606 DUK_ASSERT(js_ctx->recursion_depth > 0);
31607 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
31608 js_ctx->recursion_depth--;
31612 DUK_ASSERT(js_ctx->recursion_depth > 0);
31613 DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);
31614 js_ctx->recursion_depth--;
31619 if (js_ctx->flag_ext_custom_or_compatible) {
31620 duk__enc_buffer(js_ctx, DUK_TVAL_GET_BUFFER(tv));
31631 if (js_ctx->flag_ext_custom_or_compatible) {
31632 duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv));
31654 duk__enc_fastint_tval(js_ctx, tv);
31666 duk_push_tval((duk_context *) js_ctx->thr, tv);
31667 duk__enc_double(js_ctx);
31668 duk_pop((duk_context *) js_ctx->thr);
31681 DUK__EMIT_CSTR(js_ctx, buf);
31693 DUK_ERROR_INTERNAL_DEFMSG(js_ctx->thr);
31698 duk_json_enc_ctx *js_ctx; local
31704 js_ctx = (duk_json_enc_ctx *) DUK_TVAL_GET_POINTER(tv);
31705 DUK_ASSERT(js_ctx != NULL);
31708 if (duk__json_stringify_fast_value(js_ctx, tv) == 0) {
31728 duk_json_dec_ctx *js_ctx = &js_ctx_alloc; local
31745 js_ctx->thr = thr;
31749 js_ctx->recursion_limit = DUK_USE_JSON_DEC_RECLIMIT;
31750 DUK_ASSERT(js_ctx->recursion_depth == 0);
31756 js_ctx->flags = flags;
31758 js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM;
31761 js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE;
31764js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMP…
31774 js_ctx->p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text);
31775 js_ctx->p = js_ctx->p_start;
31776 js_ctx->p_end = ((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text)) +
31778 DUK_ASSERT(*(js_ctx->p_end) == 0x00);
31780 duk__dec_value(js_ctx); /* -> [ ... value ] */
31786 if (js_ctx->p != js_ctx->p_end) {
31787 duk__dec_syntax_error(js_ctx);
31794 js_ctx->idx_reviver = idx_reviver;
31805 duk__dec_reviver_walk(js_ctx); /* [ ... val root "" ] -> [ ... val val' ] */
31832 duk_json_enc_ctx *js_ctx = &js_ctx_alloc; local
31856 js_ctx->thr = thr;
31858 js_ctx->h_replacer = NULL;
31859 js_ctx->h_gap = NULL;
31861 js_ctx->idx_proplist = -1;
31867 js_ctx->flags = flags;
31868 js_ctx->flag_ascii_only = flags & DUK_JSON_FLAG_ASCII_ONLY;
31869 js_ctx->flag_avoid_key_quotes = flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES;
31871 js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM;
31874 js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE;
31877js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMP…
31884 js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_NULL; /* standard JSON; array gaps */
31887 js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_UNDEFINED;
31888 js_ctx->stridx_custom_nan = DUK_STRIDX_NAN;
31889 js_ctx->stridx_custom_neginf = DUK_STRIDX_MINUS_INFINITY;
31890 js_ctx->stridx_custom_posinf = DUK_STRIDX_INFINITY;
31891 js_ctx->stridx_custom_function =
31901 if (js_ctx->flags & DUK_JSON_FLAG_EXT_COMPATIBLE) {
31902 js_ctx->stridx_custom_undefined = DUK_STRIDX_JSON_EXT_UNDEFINED;
31903 js_ctx->stridx_custom_nan = DUK_STRIDX_JSON_EXT_NAN;
31904 js_ctx->stridx_custom_neginf = DUK_STRIDX_JSON_EXT_NEGINF;
31905 js_ctx->stridx_custom_posinf = DUK_STRIDX_JSON_EXT_POSINF;
31906 js_ctx->stridx_custom_function = DUK_STRIDX_JSON_EXT_FUNCTION1;
31912 if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |
31914 DUK_ASSERT(js_ctx->mask_for_undefined == 0); /* already zero */
31919 js_ctx->mask_for_undefined = DUK_TYPE_MASK_UNDEFINED |
31925 DUK_BW_INIT_PUSHBUF(thr, &js_ctx->bw, DUK__JSON_STRINGIFY_BUFSIZE);
31927 js_ctx->idx_loop = duk_push_object_internal(ctx);
31928 DUK_ASSERT(js_ctx->idx_loop >= 0);
31939 js_ctx->h_replacer = h;
31950 js_ctx->idx_proplist = duk_push_array(ctx); /* XXX: array internal? */
32009 js_ctx->h_gap = duk_get_hstring(ctx, -1);
32010 DUK_ASSERT(js_ctx->h_gap != NULL);
32015 js_ctx->h_gap = duk_get_hstring(ctx, -1);
32016 DUK_ASSERT(js_ctx->h_gap != NULL);
32021 if (js_ctx->h_gap != NULL) {
32023 if (DUK_HSTRING_GET_CHARLEN(js_ctx->h_gap) == 0) {
32024 js_ctx->h_gap = NULL;
32036 if (js_ctx->h_replacer == NULL && /* replacer is a mutation risk */
32037 js_ctx->idx_proplist == -1) { /* proplist is very rare */
32051 js_ctx->recursion_limit = DUK_JSON_ENC_LOOPARRAY;
32052 DUK_ASSERT(js_ctx->recursion_depth == 0);
32060 duk_push_pointer(ctx, (void *) js_ctx);
32078 DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw);
32088 DUK_BW_RESET_SIZE(thr, &js_ctx->bw);
32089 js_ctx->recursion_depth = 0;
32103 (unsigned long) js_ctx->flags,
32104 (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop),
32105 (duk_heaphdr *) js_ctx->h_replacer,
32106 … (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(ctx, js_ctx->idx_proplist) : NULL),
32107 (duk_heaphdr *) js_ctx->h_gap,
32116 js_ctx->recursion_limit = DUK_USE_JSON_ENC_RECLIMIT;
32117 DUK_ASSERT(js_ctx->recursion_depth == 0);
32119 …if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_holder) == 0)) { /* [ ... holder key ] -> [ ... holde…
32124 DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw);
32129 (unsigned long) js_ctx->flags,
32130 (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop),
32131 (duk_heaphdr *) js_ctx->h_replacer,
32132 … (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(ctx, js_ctx->idx_proplist) : NULL),
32133 (duk_heaphdr *) js_ctx->h_gap,