--- JSON-XS/XS.xs 2008/03/25 23:00:31 1.79 +++ JSON-XS/XS.xs 2008/03/26 22:54:38 1.83 @@ -104,6 +104,17 @@ ///////////////////////////////////////////////////////////////////////////// // utility functions +INLINE SV * +get_bool (const char *name) +{ + SV *sv = get_sv (name, 1); + + SvREADONLY_on (sv); + SvREADONLY_on (SvRV (sv)); + + return sv; +} + INLINE void shrink (SV *sv) { @@ -1345,9 +1356,9 @@ { dec->cur += 4; #if JSON_SLOW - json_true = get_sv ("JSON::XS::true", 1); SvREADONLY_on (json_true); + json_true = get_bool ("JSON::XS::true"); #endif - return SvREFCNT_inc (json_true); + return newSVsv (json_true); } else ERR ("'true' expected"); @@ -1359,9 +1370,9 @@ { dec->cur += 5; #if JSON_SLOW - json_false = get_sv ("JSON::XS::false", 1); SvREADONLY_on (json_false); + json_false = get_bool ("JSON::XS::false"); #endif - return SvREFCNT_inc (json_false); + return newSVsv (json_false); } else ERR ("'false' expected"); @@ -1609,8 +1620,8 @@ json_stash = gv_stashpv ("JSON::XS" , 1); json_boolean_stash = gv_stashpv ("JSON::XS::Boolean", 1); - json_true = get_sv ("JSON::XS::true" , 1); SvREADONLY_on (json_true ); - json_false = get_sv ("JSON::XS::false", 1); SvREADONLY_on (json_false); + json_true = get_bool ("JSON::XS::true"); + json_false = get_bool ("JSON::XS::false"); } PROTOTYPES: DISABLE @@ -1800,10 +1811,12 @@ { STRLEN offset; - incr_parse (self); - if (!INCR_DONE (self)) - break; + { + incr_parse (self); + if (!INCR_DONE (self)) + break; + } XPUSHs (decode_json (self->incr_text, self, &offset)); @@ -1820,7 +1833,7 @@ CODE: { if (self->incr_pos) - croak ("incr_text can only be called after a successful incr_parse call in scalar context"); + croak ("incr_text can not be called when the incremental parser already started parsing"); RETVAL = self->incr_text ? SvREFCNT_inc (self->incr_text) : &PL_sv_undef; } @@ -1830,13 +1843,13 @@ void incr_skip (JSON *self) CODE: { - if (!self->incr_pos || !INCR_DONE (self)) - croak ("incr_text can only be called after an unsuccessful incr_parse call in scalar context");//D - - sv_chop (self->incr_text, SvPV_nolen (self->incr_text) + self->incr_pos); - self->incr_pos = 0; - self->incr_nest = 0; - self->incr_mode = 0; + if (self->incr_pos) + { + sv_chop (self->incr_text, SvPV_nolen (self->incr_text) + self->incr_pos); + self->incr_pos = 0; + self->incr_nest = 0; + self->incr_mode = 0; + } } void DESTROY (JSON *self)