… | |
… | |
472 | |
472 | |
473 | if (expect_false (SvOBJECT (sv))) |
473 | if (expect_false (SvOBJECT (sv))) |
474 | { |
474 | { |
475 | if (SvSTASH (sv) == json_boolean_stash) |
475 | if (SvSTASH (sv) == json_boolean_stash) |
476 | { |
476 | { |
477 | if (SvIV (sv) == 0) |
477 | if (SvIV (sv)) |
|
|
478 | encode_str (enc, "true", 4, 0); |
|
|
479 | else |
478 | encode_str (enc, "false", 5, 0); |
480 | encode_str (enc, "false", 5, 0); |
479 | else |
|
|
480 | encode_str (enc, "true", 4, 0); |
|
|
481 | } |
481 | } |
482 | else |
482 | else |
483 | { |
483 | { |
484 | #if 0 |
484 | #if 0 |
485 | if (0 && sv_derived_from (rv, "JSON::Literal")) |
485 | if (0 && sv_derived_from (rv, "JSON::Literal")) |
… | |
… | |
527 | else if (svt < SVt_PVAV) |
527 | else if (svt < SVt_PVAV) |
528 | { |
528 | { |
529 | STRLEN len = 0; |
529 | STRLEN len = 0; |
530 | char *pv = svt ? SvPV (sv, len) : 0; |
530 | char *pv = svt ? SvPV (sv, len) : 0; |
531 | |
531 | |
532 | if (len == 1 && *pv == '0') |
532 | if (len == 1 && *pv == '1') |
|
|
533 | encode_str (enc, "true", 4, 0); |
|
|
534 | else if (len == 1 && *pv == '0') |
533 | encode_str (enc, "false", 5, 0); |
535 | encode_str (enc, "false", 5, 0); |
534 | else if (len == 1 && *pv == '1') |
|
|
535 | encode_str (enc, "true", 4, 0); |
|
|
536 | else |
536 | else |
537 | croak ("cannot encode reference to scalar '%s' unless the scalar is 0 or 1", |
537 | croak ("cannot encode reference to scalar '%s' unless the scalar is 0 or 1", |
538 | SvPV_nolen (sv_2mortal (newRV_inc (sv)))); |
538 | SvPV_nolen (sv_2mortal (newRV_inc (sv)))); |
539 | } |
539 | } |
540 | else |
540 | else |
… | |
… | |
1100 | // check filter callbacks |
1100 | // check filter callbacks |
1101 | if (dec->json.flags & F_HOOK) |
1101 | if (dec->json.flags & F_HOOK) |
1102 | { |
1102 | { |
1103 | ENTER; SAVETMPS; |
1103 | ENTER; SAVETMPS; |
1104 | |
1104 | |
1105 | if (HvKEYS (hv) == 1 && dec->json.cb_sk_object) |
1105 | if (dec->json.cb_sk_object && HvKEYS (hv) == 1) |
1106 | { |
1106 | { |
1107 | int count; |
1107 | int count; |
1108 | |
1108 | |
1109 | dSP; PUSHMARK (SP); |
1109 | dSP; PUSHMARK (SP); |
1110 | XPUSHs (sv_2mortal (sv)); |
1110 | XPUSHs (sv_2mortal (sv)); |
1111 | |
1111 | |
1112 | PUTBACK; count = call_sv (dec->json.cb_sk_object, G_ARRAY); SPAGAIN; |
1112 | PUTBACK; count = call_sv (dec->json.cb_sk_object, G_ARRAY); SPAGAIN; |
1113 | |
1113 | |
1114 | if (count == 1) |
1114 | if (count == 1) |
|
|
1115 | { |
1115 | sv = newSVsv (POPs); |
1116 | sv = newSVsv (POPs); |
1116 | else |
1117 | goto filter_ok; |
|
|
1118 | } |
|
|
1119 | |
1117 | SvREFCNT_inc (sv); |
1120 | SvREFCNT_inc (sv); |
1118 | } |
1121 | } |
1119 | |
1122 | |
1120 | if (dec->json.cb_object) |
1123 | if (dec->json.cb_object) |
1121 | { |
1124 | { |
1122 | int count; |
1125 | int count; |
… | |
… | |
1125 | XPUSHs (sv_2mortal (sv)); |
1128 | XPUSHs (sv_2mortal (sv)); |
1126 | |
1129 | |
1127 | PUTBACK; count = call_sv (dec->json.cb_object, G_ARRAY); SPAGAIN; |
1130 | PUTBACK; count = call_sv (dec->json.cb_object, G_ARRAY); SPAGAIN; |
1128 | |
1131 | |
1129 | if (count == 1) |
1132 | if (count == 1) |
|
|
1133 | { |
1130 | sv = newSVsv (POPs); |
1134 | sv = newSVsv (POPs); |
1131 | else |
1135 | goto filter_ok; |
|
|
1136 | } |
|
|
1137 | |
1132 | SvREFCNT_inc (sv); |
1138 | SvREFCNT_inc (sv); |
1133 | } |
1139 | } |
1134 | |
1140 | |
|
|
1141 | filter_ok: |
1135 | FREETMPS; LEAVE; |
1142 | FREETMPS; LEAVE; |
1136 | } |
1143 | } |
1137 | |
1144 | |
1138 | return newRV_noinc ((SV *)hv); |
1145 | return sv; |
1139 | |
1146 | |
1140 | fail: |
1147 | fail: |
1141 | SvREFCNT_dec (hv); |
1148 | SvREFCNT_dec (hv); |
1142 | DEC_DEC_DEPTH; |
1149 | DEC_DEC_DEPTH; |
1143 | return 0; |
1150 | return 0; |
… | |
… | |
1375 | self->flags = self->flags & ~F_MAXSIZE | (log2 << S_MAXSIZE); |
1382 | self->flags = self->flags & ~F_MAXSIZE | (log2 << S_MAXSIZE); |
1376 | |
1383 | |
1377 | XPUSHs (ST (0)); |
1384 | XPUSHs (ST (0)); |
1378 | } |
1385 | } |
1379 | |
1386 | |
1380 | void filter_json_objects (JSON *self, SV *cb = &PL_sv_undef) |
1387 | void filter_json_object (JSON *self, SV *cb = &PL_sv_undef) |
1381 | ALIAS: |
1388 | ALIAS: |
1382 | filter_sk_json_objects = 1 |
1389 | filter_json_single_key_object = 1 |
1383 | PPCODE: |
1390 | PPCODE: |
1384 | { |
1391 | { |
|
|
1392 | SV **svp; |
|
|
1393 | |
1385 | if (!SvOK (cb)) |
1394 | if (!SvOK (cb)) |
1386 | cb = 0; |
1395 | cb = 0; |
|
|
1396 | else |
|
|
1397 | cb = newSVsv (cb); |
1387 | |
1398 | |
1388 | switch (ix) |
1399 | switch (ix) |
1389 | { |
1400 | { |
1390 | case 0: self->cb_object = cb; break; |
1401 | case 0: svp = &self->cb_object ; break; |
1391 | case 1: self->cb_sk_object = cb; break; |
1402 | case 1: svp = &self->cb_sk_object; break; |
1392 | } |
1403 | } |
|
|
1404 | |
|
|
1405 | if (*svp) |
|
|
1406 | SvREFCNT_dec (*svp); |
|
|
1407 | |
|
|
1408 | *svp = cb; |
1393 | |
1409 | |
1394 | XPUSHs (ST (0)); |
1410 | XPUSHs (ST (0)); |
1395 | } |
1411 | } |
1396 | |
1412 | |
1397 | void encode (JSON *self, SV *scalar) |
1413 | void encode (JSON *self, SV *scalar) |