Permalink
Browse files

fixed incr_parse

  • Loading branch information...
1 parent 8781513 commit 61e58213f5478e07c0869e0d236758529f697018 @makamaka committed May 22, 2011
Showing with 45 additions and 8 deletions.
  1. +6 −1 Changes
  2. +2 −0 README
  3. +12 −7 lib/JSON/PP.pm
  4. +25 −0 t/116_incr_parse_fixed.t
View
@@ -20,10 +20,15 @@ It comes to be a perl core module in Perl 5.14.
* release JSON distribution as stable version.
- * rename JSON::PPdev into JSON::PP and release on CPAN. <<<< HERE
+ * rename JSON::PPdev into JSON::PP and release on CPAN.
+
+ * Perl 5.14.0 released. This module is a dual-life module. <<<< HERE
--------------------------------------------------------------------------
+2.27200 Sun May 22 12:17:51 2011
+ - fixed incr_parse docodeing string more correctly (rt#68032 by LCONS)
+
2.27105 Tue Mar 8 12:38:42 2011
- removed t/900_pod.t from package because of author test
View
@@ -24,6 +24,8 @@ This distribution is for the preparation.
* rename JSON::PPdev into JSON::PP and release on CPAN.
+ * Perl 5.14.0 released. This module is a dual-life module. <<<< HERE
+
=================
INSTALLATION
View
@@ -11,7 +11,7 @@ use Carp ();
use B ();
#use Devel::Peek;
-$JSON::PP::VERSION = '2.27105';
+$JSON::PP::VERSION = '2.27200';
@JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
@@ -1459,7 +1459,7 @@ sub incr_parse {
if ( defined wantarray ) {
- $self->{incr_mode} = INCR_M_WS;
+ $self->{incr_mode} = INCR_M_WS unless defined $self->{incr_mode};
if ( wantarray ) {
my @ret;
@@ -1470,10 +1470,10 @@ sub incr_parse {
push @ret, $self->_incr_parse( $coder, $self->{incr_text} );
unless ( !$self->{incr_nest} and $self->{incr_mode} == INCR_M_JSON ) {
- $self->{incr_mode} = INCR_M_WS;
+ $self->{incr_mode} = INCR_M_WS if $self->{incr_mode} != INCR_M_STR;
}
- } until ( !$self->{incr_text} );
+ } until ( length $self->{incr_text} >= $self->{incr_p} );
$self->{incr_parsing} = 0;
@@ -1512,6 +1512,10 @@ sub _incr_parse {
my $s = substr( $text, $p++, 1 );
if ( $s eq '"' ) {
+ if (substr( $text, $p - 2, 1 ) eq '\\' ) {
+ next;
+ }
+
if ( $self->{incr_mode} != INCR_M_STR ) {
$self->{incr_mode} = INCR_M_STR;
}
@@ -1545,6 +1549,7 @@ sub _incr_parse {
$self->{incr_p} = $p;
+ return if ( $self->{incr_mode} == INCR_M_STR and not $self->{incr_nest} );
return if ( $self->{incr_mode} == INCR_M_JSON and $self->{incr_nest} > 0 );
return '' unless ( length substr( $self->{incr_text}, 0, $p ) );
@@ -1625,9 +1630,9 @@ JSON::PP - JSON::XS compatible pure-Perl module.
=head1 VERSION
- 2.27105
+ 2.27200
-L<JSON::XS> 2.27 compatible.
+L<JSON::XS> 2.27 (~2.30) compatible.
=head1 NOTE
@@ -2804,7 +2809,7 @@ Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
=head1 COPYRIGHT AND LICENSE
-Copyright 2007-2010 by Makamaka Hannyaharamitu
+Copyright 2007-2011 by Makamaka Hannyaharamitu
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 4;
+
+use JSON::PP;
+
+my $json = JSON::PP->new->allow_nonref();
+
+my @vs = $json->incr_parse('"a\"bc');
+
+ok( not scalar(@vs) );
+
+@vs = $json->incr_parse('"');
+
+is( $vs[0], "a\"bc" );
+
+
+$json = JSON::PP->new;
+
+@vs = $json->incr_parse('"a\"bc');
+ok( not scalar(@vs) );
+@vs = eval { $json->incr_parse('"') };
+ok($@ =~ qr/JSON text must be an object or array/);
+

0 comments on commit 61e5821

Please sign in to comment.