From 4db90d23ac95592ea3892513026de326926007f9 Mon Sep 17 00:00:00 2001 From: Tokuhiro Matsuno Date: Thu, 30 Jul 2009 16:22:00 +0900 Subject: - fixed SVt_PVNV issue. --- perl/Makefile.PL | 4 ++ perl/MessagePack.c | 2 - perl/lib/Data/MessagePack.pm | 5 ++ perl/pack.c | 120 +++++++++++++++++++++++++++---------------- perl/t/01_pack.t | 1 + perl/unpack.c | 58 +++++++++++++-------- perl/util.h | 11 ++++ 7 files changed, 133 insertions(+), 68 deletions(-) create mode 100644 perl/util.h diff --git a/perl/Makefile.PL b/perl/Makefile.PL index 773d65d..d1bff06 100644 --- a/perl/Makefile.PL +++ b/perl/Makefile.PL @@ -23,6 +23,10 @@ makemaker_args( tests 't/*.t'; author_tests('xt'); +if ($ENV{DEBUG}) { + cc_append_to_ccflags '-g'; +} + # copy modules if ($Module::Install::AUTHOR && -d File::Spec->catfile('..', 'msgpack')) { mkdir 'msgpack' unless -d 'msgpack'; diff --git a/perl/MessagePack.c b/perl/MessagePack.c index 6b9010c..fd1b344 100644 --- a/perl/MessagePack.c +++ b/perl/MessagePack.c @@ -31,8 +31,6 @@ XS(boot_Data__MessagePack) { newXS("Data::MessagePack::pack", xs_pack, __FILE__); newXS("Data::MessagePack::unpack", xs_unpack, __FILE__); stash = gv_stashpvn("Data::MessagePack", strlen("Data::MessagePack"), TRUE); - newCONSTSUB(stash, "true", &PL_sv_yes); - newCONSTSUB(stash, "false", &PL_sv_no); newXS("Data::MessagePack::Unpacker::new", xs_unpacker_new, __FILE__); newXS("Data::MessagePack::Unpacker::execute", xs_unpacker_execute, __FILE__); diff --git a/perl/lib/Data/MessagePack.pm b/perl/lib/Data/MessagePack.pm index f01a92a..38431eb 100644 --- a/perl/lib/Data/MessagePack.pm +++ b/perl/lib/Data/MessagePack.pm @@ -7,6 +7,11 @@ use 5.008001; our $VERSION = '0.07'; our $PreferInteger = 0; +our $true = do { bless \(my $dummy = 1), "Data::MessagePack::Boolean" }; +our $false = do { bless \(my $dummy = 0), "Data::MessagePack::Boolean" }; +sub true () { $true } +sub false () { $false } + XSLoader::load(__PACKAGE__, $VERSION); 1; diff --git a/perl/pack.c b/perl/pack.c index 50b82e5..01dd5b6 100644 --- a/perl/pack.c +++ b/perl/pack.c @@ -137,36 +137,60 @@ static int try_int(enc_t* enc, const char *p, size_t len) { } -static void _msgpack_pack_sv(enc_t *enc, SV* val) { - if (val==NULL) { +static void _msgpack_pack_rv(enc_t *enc, SV* sv); + +static void _msgpack_pack_sv(enc_t *enc, SV* sv) { + SvGETMAGIC(sv); + + if (sv==NULL) { msgpack_pack_nil(enc); - } else if (SvROK(val)) { - _msgpack_pack_sv(enc, SvRV(val)); - } else if (SVt_PVNV == SvTYPE(val)) { - STRLEN len = 0; - char *pv = SvPV(val, len); - if (len == 1 && *pv == '1') { - msgpack_pack_true(enc); - } else if (len == 0 && *pv==0) { - msgpack_pack_false(enc); + } else if (SvPOKp(sv)) { + STRLEN len; + char * csv = SvPV(sv, len); + + if (s_pref_int && try_int(enc, csv, len)) { + return; } else { - msgpack_pack_nil(enc); + msgpack_pack_raw(enc, len); + msgpack_pack_raw_body(enc, csv, len); } - } else if (SvTYPE(val) == SVt_PVAV) { - AV* ary = (AV*)val; - int len = av_len(ary) + 1; - int i; - msgpack_pack_array(enc, len); - for (i=0; i= 3 +# define INLINE inline +#else +# define INLINE +#endif + +#endif // __PERL_MSGPACK_UTIL_H__ + -- cgit v1.2.1