… | |
… | |
194 | INLINE void |
194 | INLINE void |
195 | need (enc_t *enc, STRLEN len) |
195 | need (enc_t *enc, STRLEN len) |
196 | { |
196 | { |
197 | if (expect_false (enc->cur + len >= enc->end)) |
197 | if (expect_false (enc->cur + len >= enc->end)) |
198 | { |
198 | { |
199 | STRLEN cur = enc->cur - SvPVX (enc->sv); |
199 | STRLEN cur = enc->cur - (char *)SvPVX (enc->sv); |
200 | SvGROW (enc->sv, cur + len + 1); |
200 | SvGROW (enc->sv, cur + (len < (cur >> 2) ? cur >> 2 : len) + 1); |
201 | enc->cur = SvPVX (enc->sv) + cur; |
201 | enc->cur = SvPVX (enc->sv) + cur; |
202 | enc->end = SvPVX (enc->sv) + SvLEN (enc->sv) - 1; |
202 | enc->end = SvPVX (enc->sv) + SvLEN (enc->sv) - 1; |
203 | } |
203 | } |
204 | } |
204 | } |
205 | |
205 | |
… | |
… | |
280 | (int)((uch - 0x10000) % 0x400 + 0xDC00)); |
280 | (int)((uch - 0x10000) % 0x400 + 0xDC00)); |
281 | enc->cur += 12; |
281 | enc->cur += 12; |
282 | } |
282 | } |
283 | else |
283 | else |
284 | { |
284 | { |
285 | static char hexdigit [16] = "0123456789abcdef"; |
|
|
286 | need (enc, len += 5); |
285 | need (enc, len += 5); |
287 | *enc->cur++ = '\\'; |
286 | *enc->cur++ = '\\'; |
288 | *enc->cur++ = 'u'; |
287 | *enc->cur++ = 'u'; |
289 | *enc->cur++ = hexdigit [ uch >> 12 ]; |
288 | *enc->cur++ = PL_hexdigit [ uch >> 12 ]; |
290 | *enc->cur++ = hexdigit [(uch >> 8) & 15]; |
289 | *enc->cur++ = PL_hexdigit [(uch >> 8) & 15]; |
291 | *enc->cur++ = hexdigit [(uch >> 4) & 15]; |
290 | *enc->cur++ = PL_hexdigit [(uch >> 4) & 15]; |
292 | *enc->cur++ = hexdigit [(uch >> 0) & 15]; |
291 | *enc->cur++ = PL_hexdigit [(uch >> 0) & 15]; |
293 | } |
292 | } |
294 | |
293 | |
295 | str += clen; |
294 | str += clen; |
296 | } |
295 | } |
297 | else if (enc->json.flags & F_LATIN1) |
296 | else if (enc->json.flags & F_LATIN1) |
… | |
… | |
461 | |
460 | |
462 | encode_ch (enc, '{'); |
461 | encode_ch (enc, '{'); |
463 | |
462 | |
464 | // for canonical output we have to sort by keys first |
463 | // for canonical output we have to sort by keys first |
465 | // actually, this is mostly due to the stupid so-called |
464 | // actually, this is mostly due to the stupid so-called |
466 | // security workaround added somewhere in 5.8.x. |
465 | // security workaround added somewhere in 5.8.x |
467 | // that randomises hash orderings |
466 | // that randomises hash orderings |
468 | if (enc->json.flags & F_CANONICAL) |
467 | if (enc->json.flags & F_CANONICAL) |
469 | { |
468 | { |
470 | int count = hv_iterinit (hv); |
469 | int count = hv_iterinit (hv); |
471 | |
470 | |
… | |
… | |
971 | { |
970 | { |
972 | STRLEN len = cur - buf; |
971 | STRLEN len = cur - buf; |
973 | |
972 | |
974 | if (sv) |
973 | if (sv) |
975 | { |
974 | { |
976 | SvGROW (sv, SvCUR (sv) + len + 1); |
975 | STRLEN cur = SvCUR (sv); |
|
|
976 | |
|
|
977 | if (SvLEN (sv) <= cur + len) |
|
|
978 | SvGROW (sv, cur + (len < (cur >> 2) ? cur >> 2 : len) + 1); |
|
|
979 | |
977 | memcpy (SvPVX (sv) + SvCUR (sv), buf, len); |
980 | memcpy (SvPVX (sv) + SvCUR (sv), buf, len); |
978 | SvCUR_set (sv, SvCUR (sv) + len); |
981 | SvCUR_set (sv, SvCUR (sv) + len); |
979 | } |
982 | } |
980 | else |
983 | else |
981 | sv = newSVpvn (buf, len); |
984 | sv = newSVpvn (buf, len); |
… | |
… | |
1411 | { |
1414 | { |
1412 | dec_t dec; |
1415 | dec_t dec; |
1413 | STRLEN offset; |
1416 | STRLEN offset; |
1414 | SV *sv; |
1417 | SV *sv; |
1415 | |
1418 | |
|
|
1419 | /* work around bugs in 5.10 where manipulating magic values |
|
|
1420 | * will perl ignore the magic in subsequent accesses |
|
|
1421 | */ |
1416 | SvGETMAGIC (string); |
1422 | /*SvGETMAGIC (string);*/ |
|
|
1423 | if (SvMAGICAL (string)) |
|
|
1424 | string = sv_2mortal (newSVsv (string)); |
|
|
1425 | |
1417 | SvUPGRADE (string, SVt_PV); |
1426 | SvUPGRADE (string, SVt_PV); |
1418 | |
1427 | |
1419 | /* work around a bug in perl 5.10, which causes SvCUR to fail an |
1428 | /* work around a bug in perl 5.10, which causes SvCUR to fail an |
1420 | * assertion with -DDEBUGGING, although SvCUR is documented to |
1429 | * assertion with -DDEBUGGING, although SvCUR is documented to |
1421 | * return the xpv_cur field which certainly exists after upgrading. |
1430 | * return the xpv_cur field which certainly exists after upgrading. |
… | |
… | |
1800 | } |
1809 | } |
1801 | |
1810 | |
1802 | { |
1811 | { |
1803 | STRLEN len; |
1812 | STRLEN len; |
1804 | const char *str = SvPV (jsonstr, len); |
1813 | const char *str = SvPV (jsonstr, len); |
1805 | SvGROW (self->incr_text, SvCUR (self->incr_text) + len + 1); |
1814 | STRLEN cur = SvCUR (self->incr_text); |
|
|
1815 | |
|
|
1816 | if (SvLEN (self->incr_text) <= cur + len) |
|
|
1817 | SvGROW (self->incr_text, cur + (len < (cur >> 2) ? cur >> 2 : len) + 1); |
|
|
1818 | |
1806 | Move (str, SvEND (self->incr_text), len, char); |
1819 | Move (str, SvEND (self->incr_text), len, char); |
1807 | SvCUR_set (self->incr_text, SvCUR (self->incr_text) + len); |
1820 | SvCUR_set (self->incr_text, SvCUR (self->incr_text) + len); |
1808 | *SvEND (self->incr_text) = 0; // this should basically be a nop, too, but make sure it's there |
1821 | *SvEND (self->incr_text) = 0; // this should basically be a nop, too, but make sure it's there |
1809 | } |
1822 | } |
1810 | } |
1823 | } |