From 2b65f81e23063cded71dda7b78cbab7f92671a8b Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Tue, 12 Oct 2010 22:58:53 +0900 Subject: [PATCH 01/12] Add tests --- perl/t/06_stream_unpack2.t | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/perl/t/06_stream_unpack2.t b/perl/t/06_stream_unpack2.t index bb6fe93..11e3c61 100644 --- a/perl/t/06_stream_unpack2.t +++ b/perl/t/06_stream_unpack2.t @@ -1,15 +1,16 @@ use strict; use warnings; use Data::MessagePack; -use Test::More tests => 9; +use Test::More tests => 61; use t::Util; my $input = [ false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1, 127,127,255,65535,4294967295,-32,-32,-128,-32768, - -2147483648,0.0,-0.0,1.0,-1.0,"a","a","a","","","", + -2147483648,0.0,-0.0, 3.14,-3.14,"a","a","a","","","", [0],[0],[0],[],[],[],{},{},{}, - {"a" => 97},{"a" => 97},{"a" => 97},[[]],[["a"]] + {"a" => 97},{"abc" => 97},{"xyz" => 97},[[]], [["foo"], ["bar"]], + [["foo", true, false, null, 42]], ]; my $packed = Data::MessagePack->pack($input); @@ -40,4 +41,21 @@ is_deeply(Data::MessagePack->unpack($packed), $input); } } +{ + my $s = ''; + foreach my $datum(reverse @{$input}) { + $s .= Data::MessagePack->pack($datum); + } + + my $up = Data::MessagePack::Unpacker->new(); + + my $offset = 0; + for my $datum(reverse @{$input}) { + note "offset: $offset/".length($s); + + $offset = $up->execute($s, $offset); + is_deeply $up->data, $datum; + $up->reset(); + } +} From 4f1207a38c39b9b7284f4d28012e4f76fa0b437e Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Tue, 12 Oct 2010 23:05:58 +0900 Subject: [PATCH 02/12] perl: add a strong assertion --- perl/xs-src/unpack.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/perl/xs-src/unpack.c b/perl/xs-src/unpack.c index caf8662..e997af5 100644 --- a/perl/xs-src/unpack.c +++ b/perl/xs-src/unpack.c @@ -65,6 +65,9 @@ load_bool(pTHX_ const char* const name) { LEAVE; assert(sv); assert(sv_isobject(sv)); + if(!SvOK(sv)) { + croak("Oops: Failed to load %"SVf, name); + } return sv; } From 770542c8c7d3469af5e54b4036fba47e07e1dee0 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Tue, 12 Oct 2010 23:10:59 +0900 Subject: [PATCH 03/12] perl: add tests --- perl/t/12_stream_unpack4.t | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/perl/t/12_stream_unpack4.t b/perl/t/12_stream_unpack4.t index de76e81..ef6fa39 100644 --- a/perl/t/12_stream_unpack4.t +++ b/perl/t/12_stream_unpack4.t @@ -5,11 +5,14 @@ use Test::More; use t::Util; my @input = ( - +[[]], + [[]], [[],[]], [{"a" => 97},{"a" => 97}], [{"a" => 97},{"a" => 97},{"a" => 97}], [ map { +{ "foo $_" => "bar $_" } } 'aa' .. 'zz' ], + [42, null], + [42, true], + [42, false], ); plan tests => @input * 2; From 5b786f65a4ad4b2c04c6f792fd7526cfd63a0af7 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Tue, 12 Oct 2010 23:12:34 +0900 Subject: [PATCH 04/12] Checking in changes prior to tagging of version 0.32. Changelog diff is: diff --git a/perl/Changes b/perl/Changes index 6e07966..4657079 100644 --- a/perl/Changes +++ b/perl/Changes @@ -1,4 +1,8 @@ +0.32 + + - add tests to detect Alpha problems reported via CPAN testers (gfx) + 0.31 - update Module::Install::XSUtil for ccache support (gfx) --- perl/Changes | 4 ++++ perl/lib/Data/MessagePack.pm | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/perl/Changes b/perl/Changes index 6e07966..4657079 100644 --- a/perl/Changes +++ b/perl/Changes @@ -1,4 +1,8 @@ +0.32 + + - add tests to detect Alpha problems reported via CPAN testers (gfx) + 0.31 - update Module::Install::XSUtil for ccache support (gfx) diff --git a/perl/lib/Data/MessagePack.pm b/perl/lib/Data/MessagePack.pm index 6d37d8f..d402167 100644 --- a/perl/lib/Data/MessagePack.pm +++ b/perl/lib/Data/MessagePack.pm @@ -3,7 +3,7 @@ use strict; use warnings; use 5.008001; -our $VERSION = '0.31'; +our $VERSION = '0.32'; our $PreferInteger = 0; sub true () { From 0ced3ec2d29cd1df69f72349e5e1a60ef2bdc095 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 09:38:40 +0900 Subject: [PATCH 05/12] perl: fix tests --- perl/t/06_stream_unpack2.t | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/perl/t/06_stream_unpack2.t b/perl/t/06_stream_unpack2.t index 11e3c61..f50401f 100644 --- a/perl/t/06_stream_unpack2.t +++ b/perl/t/06_stream_unpack2.t @@ -7,7 +7,7 @@ use t::Util; my $input = [ false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1, 127,127,255,65535,4294967295,-32,-32,-128,-32768, - -2147483648,0.0,-0.0, 3.14,-3.14,"a","a","a","","","", + -2147483648,0.0,-0.0, 3.0,-3.0,"a","a",("a" x 70000),"","","", [0],[0],[0],[],[],[],{},{},{}, {"a" => 97},{"abc" => 97},{"xyz" => 97},[[]], [["foo"], ["bar"]], [["foo", true, false, null, 42]], @@ -36,7 +36,7 @@ is_deeply(Data::MessagePack->unpack($packed), $input); $offset = $up->execute($packed, $offset); ok $up->is_finished, 'finished'; my $data = $up->data; - is_deeply $data, $input; + is_deeply $data, $input, "block $i, offset $offset"; $up->reset(); } } @@ -51,10 +51,8 @@ is_deeply(Data::MessagePack->unpack($packed), $input); my $offset = 0; for my $datum(reverse @{$input}) { - note "offset: $offset/".length($s); - $offset = $up->execute($s, $offset); - is_deeply $up->data, $datum; + is_deeply $up->data, $datum, "offset $offset/" . length($s); $up->reset(); } } From 233f13aac5ed328c82749930a7c8c42f7081af6c Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 10:03:56 +0900 Subject: [PATCH 06/12] perl: add tests for unpacking 'float' --- perl/t/02_unpack.t | 2 +- perl/t/data.pl | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/perl/t/02_unpack.t b/perl/t/02_unpack.t index 657387a..1087c40 100644 --- a/perl/t/02_unpack.t +++ b/perl/t/02_unpack.t @@ -15,7 +15,7 @@ sub pis ($$) { or diag( explain(unpackit($_[0])) ); } -my @dat = do 't/data.pl'; +my @dat = do 't/data.pl' or die $@; plan tests => 1*(scalar(@dat)/2); diff --git a/perl/t/data.pl b/perl/t/data.pl index 9bf07b7..300eec1 100644 --- a/perl/t/data.pl +++ b/perl/t/data.pl @@ -26,6 +26,9 @@ no warnings; # i need this, i need this. 'aa 34 32 39 34 39 36 37 32 39 35' => ''.0xFFFFFFFF, 'ab 36 38 37 31 39 34 37 36 37 33 35' => ''.0xFFFFFFFFF, + 'ca 00 00 00 00' => 0.0, # float + 'ca 40 2c cc cd' => unpack('f', pack 'f', 2.7), + 'd2 80 00 00 01' => '-2147483647', # int32_t 'ce 80 00 00 01' => '2147483649', # uint32_t From 3761aacb1d4dbdaa922e024e5ae709a9037c06f3 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 10:14:31 +0900 Subject: [PATCH 07/12] perl: cleanup PP --- perl/lib/Data/MessagePack/PP.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perl/lib/Data/MessagePack/PP.pm b/perl/lib/Data/MessagePack/PP.pm index 00e58b9..15ba22f 100644 --- a/perl/lib/Data/MessagePack/PP.pm +++ b/perl/lib/Data/MessagePack/PP.pm @@ -265,7 +265,7 @@ sub _unpack { my ( $value ) = @_; my $byte = CORE::unpack( 'C', substr( $value, $p++, 1 ) ); # get header - die "invalid data" unless defined $byte; + Carp::croak("invalid data") unless defined $byte; if ( ( $byte >= 0x90 and $byte <= 0x9f ) or $byte == 0xdc or $byte == 0xdd ) { my $num; @@ -312,7 +312,7 @@ sub _unpack { return $byte; } elsif ( $byte == 0xcc ) { # uint8 - CORE::unpack( 'C', substr( $value, $p++, 1 ) ); + return CORE::unpack( 'C', substr( $value, $p++, 1 ) ); } elsif ( $byte == 0xcd ) { # uint16 $p += 2; From c506cd97e0032ec070a81b58a55f5089a4a1b60f Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 10:43:56 +0900 Subject: [PATCH 08/12] perl: tests --- perl/t/01_pack.t | 2 ++ perl/t/data.pl | 1 + 2 files changed, 3 insertions(+) diff --git a/perl/t/01_pack.t b/perl/t/01_pack.t index 50fd663..8c61980 100644 --- a/perl/t/01_pack.t +++ b/perl/t/01_pack.t @@ -55,6 +55,8 @@ my @dat = ( [0, -128, -1, 0, -32768, -1, 0, -2147483648, -1], '99 00 d0 80 ff 00 d1 80 00 ff 00 d2 80 00 00 00 ff', 2147483648, 'ce 80 00 00 00', -2147483648, 'd2 80 00 00 00', + 'a' x 0x0100, 'da 01 00' . (' 61' x 0x0100), + [(undef) x 0x0100], 'dc 01 00' . (' c0' x 0x0100), ); plan tests => 1*(scalar(@dat)/2); diff --git a/perl/t/data.pl b/perl/t/data.pl index 300eec1..b7bbaf1 100644 --- a/perl/t/data.pl +++ b/perl/t/data.pl @@ -22,6 +22,7 @@ no warnings; # i need this, i need this. '82 c2 81 c0 c0 c3 81 c0 80', {false,{undef,undef}, true,{undef,{}}}, '96 de 00 00 de 00 01 c0 c2 de 00 02 c0 c2 c3 c2 df 00 00 00 00 df 00 00 00 01 c0 c2 df 00 00 00 02 c0 c2 c3 c2', [{}, {undef,false}, {true,false, undef,false}, {}, {undef,false}, {true,false, undef,false}], + 'dc 01 00' . (' c0' x 0x0100), [(undef) x 0x0100], 'ce 00 ff ff ff' => ''.0xFFFFFF, 'aa 34 32 39 34 39 36 37 32 39 35' => ''.0xFFFFFFFF, 'ab 36 38 37 31 39 34 37 36 37 33 35' => ''.0xFFFFFFFFF, From 14aa1420f0142f49beb6114599c27f665b34a075 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 10:54:37 +0900 Subject: [PATCH 09/12] perl: comments --- perl/lib/Data/MessagePack/PP.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/perl/lib/Data/MessagePack/PP.pm b/perl/lib/Data/MessagePack/PP.pm index 15ba22f..3aedf4c 100644 --- a/perl/lib/Data/MessagePack/PP.pm +++ b/perl/lib/Data/MessagePack/PP.pm @@ -17,6 +17,8 @@ BEGIN { my $unpack_uint64_slow; if(!eval { pack 'Q', 1 }) { # don't have quad types + # emulates quad types with Math::BigInt. + # very slow but works well. $unpack_int64_slow = sub { require Math::BigInt; my $high = unpack_uint32( $_[0], $_[1] ); @@ -35,7 +37,7 @@ BEGIN { }; $unpack_uint64_slow = sub { require Math::BigInt; - my $high = Math::BigInt->new( unpack_uint32( $_[0], $_[1]) ); + my $high = Math::BigInt->new( unpack_uint32( $_[0], $_[1]) ); my $low = Math::BigInt->new( unpack_uint32( $_[0], $_[1] + 4) ); return +($high << 32 | $low)->bstr; }; @@ -104,7 +106,8 @@ BEGIN { *unpack_uint64 = $unpack_uint64_slow || sub { unpack 'Q', substr( $_[0], $_[1], 8 ); }; } } - else { + else { # 5.10.0 or later + # pack_int64/uint64 are used only when the perl support quad types *pack_uint64 = sub { return pack 'CQ>', 0xcf, $_[0]; }; *pack_int64 = sub { return pack 'Cq>', 0xd3, $_[0]; }; *pack_double = sub { return pack 'Cd>', 0xcb, $_[0]; }; From ef0874feba7ac35a5cd4a6fd8763abf2cb1de40e Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 11:02:57 +0900 Subject: [PATCH 10/12] perl: tweaks for PreferInteger --- perl/lib/Data/MessagePack/PP.pm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/perl/lib/Data/MessagePack/PP.pm b/perl/lib/Data/MessagePack/PP.pm index 3aedf4c..30b963b 100644 --- a/perl/lib/Data/MessagePack/PP.pm +++ b/perl/lib/Data/MessagePack/PP.pm @@ -214,15 +214,18 @@ sub _pack { if ( $Data::MessagePack::PreferInteger ) { if ( $value =~ /^-?[0-9]+$/ ) { # ok? - my $value2 = 0 + $value; - if ( $value > 0xFFFFFFFF or $value < '-'.0x80000000 or # <- needless but for XS compat - 0 + $value != B::svref_2object( \$value2 )->int_value - ) { - local $Data::MessagePack::PreferInteger; # avoid for PV => NV - return _pack( "$value" ); + # checks whether $value is in (u)int32 + my $ivalue = 0 + $value; + if (!( + $ivalue > 0xFFFFFFFF + or $ivalue < '-'.0x80000000 # for XS compat + or $ivalue != B::svref_2object(\$ivalue)->int_value + )) { + return _pack( $ivalue ); } - return _pack( $value + 0 ); + # fallthrough } + # fallthrough } utf8::encode( $value ) if utf8::is_utf8( $value ); From 02f3dd947a02ef35b74583041a837d7f6af6a398 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 12:46:11 +0900 Subject: [PATCH 11/12] perl: optimize PP --- perl/Changes | 5 + perl/lib/Data/MessagePack/PP.pm | 183 +++++++++++++++++--------------- 2 files changed, 100 insertions(+), 88 deletions(-) diff --git a/perl/Changes b/perl/Changes index 4657079..50177f4 100644 --- a/perl/Changes +++ b/perl/Changes @@ -1,4 +1,9 @@ +0.33 + + - fix tests (gfx) + - optimize unpacking routines in Data::MessagePack::PP (gfx) + 0.32 - add tests to detect Alpha problems reported via CPAN testers (gfx) diff --git a/perl/lib/Data/MessagePack/PP.pm b/perl/lib/Data/MessagePack/PP.pm index 30b963b..5e64093 100644 --- a/perl/lib/Data/MessagePack/PP.pm +++ b/perl/lib/Data/MessagePack/PP.pm @@ -164,7 +164,7 @@ sub _pack { if ( ref($value) eq 'ARRAY' ) { my $num = @$value; - my $header = + my $header = $num < 16 ? CORE::pack( 'C', 0x90 + $num ) : $num < 2 ** 16 - 1 ? CORE::pack( 'Cn', 0xdc, $num ) : $num < 2 ** 32 - 1 ? CORE::pack( 'CN', 0xdd, $num ) @@ -175,7 +175,7 @@ sub _pack { elsif ( ref($value) eq 'HASH' ) { my $num = keys %$value; - my $header = + my $header = $num < 16 ? CORE::pack( 'C', 0x80 + $num ) : $num < 2 ** 16 - 1 ? CORE::pack( 'Cn', 0xde, $num ) : $num < 2 ** 32 - 1 ? CORE::pack( 'CN', 0xdf, $num ) @@ -231,11 +231,11 @@ sub _pack { utf8::encode( $value ) if utf8::is_utf8( $value ); my $num = length $value; - my $header = + my $header = $num < 32 ? CORE::pack( 'C', 0xa0 + $num ) : $num < 2 ** 16 - 1 ? CORE::pack( 'Cn', 0xda, $num ) : $num < 2 ** 32 - 1 ? CORE::pack( 'CN', 0xdb, $num ) - : _unexpected_number($num) + : _unexpected('number %d', $num) ; return $header . $value; @@ -266,14 +266,72 @@ sub unpack :method { return $data; } +my $T_RAW = 0x01; +my $T_ARRAY = 0x02; +my $T_MAP = 0x04; +my $T_DIRECT = 0x08; # direct mapping (e.g. 0xc0 <-> nil) + +my @typemap = ( (0x00) x 256 ); + +$typemap[$_] |= $T_ARRAY for + 0x90 .. 0x9f, # fix array + 0xdc, # array16 + 0xdd, # array32 +; +$typemap[$_] |= $T_MAP for + 0x80 .. 0x8f, # fix map + 0xde, # map16 + 0xdf, # map32 +; +$typemap[$_] |= $T_RAW for + 0xa0 .. 0xbf, # fix raw + 0xda, # raw16 + 0xdb, # raw32 +; + +my @byte2value; +foreach my $pair( + [0xc3, true], + [0xc2, false], + [0xc0, undef], + + (map { [ $_, $_ ] } 0x00 .. 0x7f), # positive fixnum + (map { [ $_, $_ - 0x100 ] } 0xe0 .. 0xff), # negative fixnum +) { + $typemap[ $pair->[0] ] |= $T_DIRECT; + $byte2value[ $pair->[0] ] = $pair->[1]; +} sub _unpack { my ( $value ) = @_; - my $byte = CORE::unpack( 'C', substr( $value, $p++, 1 ) ); # get header + # get a header byte + my $byte = unpack "x$p C", $value; # "x$p" is faster than substr() + $p++; Carp::croak("invalid data") unless defined $byte; - if ( ( $byte >= 0x90 and $byte <= 0x9f ) or $byte == 0xdc or $byte == 0xdd ) { + # +/- fixnum, nil, true, false + return $byte2value[$byte] if $typemap[$byte] & $T_DIRECT; + + if ( $typemap[$byte] & $T_RAW ) { + my $num; + if ( $byte == 0xda ) { + $num = CORE::unpack 'n', substr( $value, $p, 2 ); + $p += 2 + $num; + } + elsif ( $byte == 0xdb ) { + $num = CORE::unpack 'N', substr( $value, $p, 4 ); + $p += 4 + $num; + } + else { # fix raw + $num = $byte & ~0xa0; + $p += $num; + } + my $s = substr( $value, $p - $num, $num ); + utf8::decode($s) if $_utf8; + return $s; + } + elsif ( $typemap[$byte] & $T_ARRAY ) { my $num; if ( $byte == 0xdc ) { # array 16 $num = CORE::unpack 'n', substr( $value, $p, 2 ); @@ -287,11 +345,10 @@ sub _unpack { $num = $byte & ~0x90; } my @array; - push @array, _unpack( $value ) while $num-- > 0; + push @array, _unpack( $value ) while --$num >= 0; return \@array; } - - elsif ( ( $byte >= 0x80 and $byte <= 0x8f ) or $byte == 0xde or $byte == 0xdf ) { + elsif ( $typemap[$byte] & $T_MAP ) { my $num; if ( $byte == 0xde ) { # map 16 $num = CORE::unpack 'n', substr( $value, $p, 2 ); @@ -305,7 +362,7 @@ sub _unpack { $num = $byte & ~0x80; } my %map; - for ( 0 .. $num - 1 ) { + while ( --$num >= 0 ) { no warnings; # for undef key case my $key = _unpack( $value ); my $val = _unpack( $value ); @@ -314,9 +371,6 @@ sub _unpack { return \%map; } - elsif ( $byte >= 0x00 and $byte <= 0x7f ) { # positive fixnum - return $byte; - } elsif ( $byte == 0xcc ) { # uint8 return CORE::unpack( 'C', substr( $value, $p++, 1 ) ); } @@ -347,53 +401,17 @@ sub _unpack { elsif ( $byte == 0xd0 ) { # int8 return CORE::unpack 'c', substr( $value, $p++, 1 ); # c / C } - elsif ( $byte >= 0xe0 and $byte <= 0xff ) { # negative fixnum - return $byte - 256; - } - - elsif ( ( $byte >= 0xa0 and $byte <= 0xbf ) or $byte == 0xda or $byte == 0xdb ) { # raw - my $num; - if ( $byte == 0xda ) { - $num = CORE::unpack 'n', substr( $value, $p, 2 ); - $p += 2 + $num; - } - elsif ( $byte == 0xdb ) { - $num = CORE::unpack 'N', substr( $value, $p, 4 ); - $p += 4 + $num; - } - else { # fix raw - $num = $byte & ~0xa0; - $p += $num; - } - my $s = substr( $value, $p - $num, $num ); - utf8::decode($s) if $_utf8; - return $s; - } - - elsif ( $byte == 0xc0 ) { # nil - return undef; - } - elsif ( $byte == 0xc2 ) { # boolean - return false; - } - elsif ( $byte == 0xc3 ) { # boolean - return true; - } - elsif ( $byte == 0xcb ) { # double $p += 8; return unpack_double( $value, $p - 8 ); } - elsif ( $byte == 0xca ) { # float $p += 4; return unpack_float( $value, $p - 4 ); } - else { _unexpected("byte 0x%02x", $byte); } - } @@ -456,7 +474,28 @@ sub _count { my ( $self, $value ) = @_; my $byte = unpack( 'C', substr( $value, $p++, 1 ) ); # get header - if ( ( $byte >= 0x90 and $byte <= 0x9f ) or $byte == 0xdc or $byte == 0xdd ) { + Carp::croak('invalid data') unless defined $byte; + + # +/- fixnum, nil, true, false + return 1 if $typemap[$byte] & $T_DIRECT; + + if ( $typemap[$byte] & $T_RAW ) { + my $num; + if ( $byte == 0xda ) { + $num = unpack 'n', substr( $value, $p, 2 ); + $p += 2; + } + elsif ( $byte == 0xdb ) { + $num = unpack 'N', substr( $value, $p, 4 ); + $p += 4; + } + else { # fix raw + $num = $byte & ~0xa0; + } + $p += $num; + return 1; + } + elsif ( $typemap[$byte] & $T_ARRAY ) { my $num; if ( $byte == 0xdc ) { # array 16 $num = unpack 'n', substr( $value, $p, 2 ); @@ -476,8 +515,7 @@ sub _count { return 1; } - - elsif ( ( $byte >= 0x80 and $byte <= 0x8f ) or $byte == 0xde or $byte == 0xdf ) { + elsif ( $typemap[$byte] & $T_MAP ) { my $num; if ( $byte == 0xde ) { # map 16 $num = unpack 'n', substr( $value, $p, 2 ); @@ -498,20 +536,12 @@ sub _count { return 1; } - elsif ( $byte == 0xc0 or $byte == 0xc2 or $byte == 0xc3 ) { # nil, false, true - return 1; - } - - elsif ( $byte >= 0x00 and $byte <= 0x7f ) { # positive fixnum - return 1; - } - elsif ( $byte >= 0xcc and $byte <= 0xcf ) { # uint $p += $byte == 0xcc ? 1 : $byte == 0xcd ? 2 : $byte == 0xce ? 4 : $byte == 0xcf ? 8 - : _unexpected("byte 0x%02x", $byte); + : Data::MessagePack::PP::_unexpected("byte 0x%02x", $byte); return 1; } @@ -520,38 +550,15 @@ sub _count { : $byte == 0xd1 ? 2 : $byte == 0xd2 ? 4 : $byte == 0xd3 ? 8 - : _unexpected("byte 0x%02x", $byte); + : Data::MessagePack::PP::_unexpected("byte 0x%02x", $byte); return 1; } - - elsif ( $byte >= 0xe0 and $byte <= 0xff ) { # negative fixnum - return 1; - } - - elsif ( $byte >= 0xca and $byte <= 0xcb ) { # float, double + elsif ( $byte == 0xca or $byte == 0xcb ) { # float, double $p += $byte == 0xca ? 4 : 8; return 1; } - - elsif ( ( $byte >= 0xa0 and $byte <= 0xbf ) or $byte == 0xda or $byte == 0xdb ) { - my $num; - if ( $byte == 0xda ) { - $num = unpack 'n', substr( $value, $p, 2 ); - $p += 2; - } - elsif ( $byte == 0xdb ) { - $num = unpack 'N', substr( $value, $p, 4 ); - $p += 4; - } - else { # fix raw - $num = $byte & ~0xa0; - } - $p += $num; - return 1; - } - else { - _unexpected("byte 0x%02x", $byte); + Data::MessagePack::PP::_unexpected("byte 0x%02x", $byte); } return 0; @@ -602,6 +609,6 @@ makamaka =head1 COPYRIGHT AND LICENSE This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. +it under the same terms as Perl itself. =cut From 0017f4fce8f85f5d189fcca808221da06631c264 Mon Sep 17 00:00:00 2001 From: "Fuji, Goro" Date: Wed, 13 Oct 2010 12:46:41 +0900 Subject: [PATCH 12/12] Checking in changes prior to tagging of version 0.33. Changelog diff is: --- perl/lib/Data/MessagePack.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl/lib/Data/MessagePack.pm b/perl/lib/Data/MessagePack.pm index d402167..9111db0 100644 --- a/perl/lib/Data/MessagePack.pm +++ b/perl/lib/Data/MessagePack.pm @@ -3,7 +3,7 @@ use strict; use warnings; use 5.008001; -our $VERSION = '0.32'; +our $VERSION = '0.33'; our $PreferInteger = 0; sub true () {