mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-02 15:41:38 +02:00
perl: fix unpacking int64_t in PP (based on makamaka's patch)
This commit is contained in:
parent
a1c01c6722
commit
d6a825981d
@ -22,10 +22,19 @@ BEGIN {
|
||||
if(!eval { pack 'Q', 1 }) { # don't have quad types
|
||||
$unpack_int64_slow = sub {
|
||||
require Math::BigInt;
|
||||
my $high = Math::BigInt->new( unpack_int32( $_[0], $_[1]) );
|
||||
my $low = Math::BigInt->new( unpack_uint32( $_[0], $_[1] + 4) );
|
||||
my $high = unpack_uint32( $_[0], $_[1] );
|
||||
my $low = unpack_uint32( $_[0], $_[1] + 4);
|
||||
|
||||
return +($high << 32 | $low)->bstr;
|
||||
if($high < 0xF0000000) { # positive
|
||||
$high = Math::BigInt->new( $high );
|
||||
$low = Math::BigInt->new( $low );
|
||||
return +($high << 32 | $low)->bstr;
|
||||
}
|
||||
else { # negative
|
||||
$high = Math::BigInt->new( ~$high );
|
||||
$low = Math::BigInt->new( ~$low );
|
||||
return +( -($high << 32 | $low + 1) )->bstr;
|
||||
}
|
||||
};
|
||||
$unpack_uint64_slow = sub {
|
||||
require Math::BigInt;
|
||||
|
@ -35,4 +35,9 @@ no warnings; # i need this, i need this.
|
||||
|
||||
'd3 ff ff ff ff ff ff ff ff' => '-1', # int64_t
|
||||
'cf ff ff ff ff ff ff ff ff' => '18446744073709551615', # uint64_t
|
||||
|
||||
# int64_t
|
||||
'd3 00 00 00 10 00 00 00 00' => '68719476736',
|
||||
'd3 00 00 00 10 00 00 00 01' => '68719476737',
|
||||
'd3 10 00 00 00 00 00 00 00' => '1152921504606846976',
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user