--- JSON-XS/XS.xs 2007/07/02 00:29:38 1.50 +++ JSON-XS/XS.xs 2007/07/02 00:48:18 1.51 @@ -474,10 +474,10 @@ { if (SvSTASH (sv) == json_boolean_stash) { - if (SvIV (sv) == 0) - encode_str (enc, "false", 5, 0); - else + if (SvIV (sv)) encode_str (enc, "true", 4, 0); + else + encode_str (enc, "false", 5, 0); } else { @@ -529,10 +529,10 @@ STRLEN len = 0; char *pv = svt ? SvPV (sv, len) : 0; - if (len == 1 && *pv == '0') - encode_str (enc, "false", 5, 0); - else if (len == 1 && *pv == '1') + if (len == 1 && *pv == '1') encode_str (enc, "true", 4, 0); + else if (len == 1 && *pv == '0') + encode_str (enc, "false", 5, 0); else croak ("cannot encode reference to scalar '%s' unless the scalar is 0 or 1", SvPV_nolen (sv_2mortal (newRV_inc (sv)))); @@ -1102,7 +1102,7 @@ { ENTER; SAVETMPS; - if (HvKEYS (hv) == 1 && dec->json.cb_sk_object) + if (dec->json.cb_sk_object && HvKEYS (hv) == 1) { int count; @@ -1112,9 +1112,12 @@ PUTBACK; count = call_sv (dec->json.cb_sk_object, G_ARRAY); SPAGAIN; if (count == 1) - sv = newSVsv (POPs); - else - SvREFCNT_inc (sv); + { + sv = newSVsv (POPs); + goto filter_ok; + } + + SvREFCNT_inc (sv); } if (dec->json.cb_object) @@ -1127,15 +1130,19 @@ PUTBACK; count = call_sv (dec->json.cb_object, G_ARRAY); SPAGAIN; if (count == 1) - sv = newSVsv (POPs); - else - SvREFCNT_inc (sv); + { + sv = newSVsv (POPs); + goto filter_ok; + } + + SvREFCNT_inc (sv); } +filter_ok: FREETMPS; LEAVE; } - return newRV_noinc ((SV *)hv); + return sv; fail: SvREFCNT_dec (hv); @@ -1377,20 +1384,29 @@ XPUSHs (ST (0)); } -void filter_json_objects (JSON *self, SV *cb = &PL_sv_undef) +void filter_json_object (JSON *self, SV *cb = &PL_sv_undef) ALIAS: - filter_sk_json_objects = 1 + filter_json_single_key_object = 1 PPCODE: { + SV **svp; + if (!SvOK (cb)) cb = 0; + else + cb = newSVsv (cb); switch (ix) { - case 0: self->cb_object = cb; break; - case 1: self->cb_sk_object = cb; break; + case 0: svp = &self->cb_object ; break; + case 1: svp = &self->cb_sk_object; break; } + if (*svp) + SvREFCNT_dec (*svp); + + *svp = cb; + XPUSHs (ST (0)); }