summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTokuhiro Matsuno <tokuhirom@gmail.com>2009-07-22 16:40:15 +0900
committerTokuhiro Matsuno <tokuhirom@gmail.com>2009-07-22 16:40:15 +0900
commit718227bc2cc7ed2d4a4152a1018f0fa046bbc57e (patch)
tree2f9aea528d3199573b92be91e25b3030aef3dfa9
parent390c5ad8a0424968dbcc4b69750d2c31f1872b4f (diff)
downloadmsgpack-python-718227bc2cc7ed2d4a4152a1018f0fa046bbc57e.tar.gz
Perl: do not use switch (SvTYPE)
-rw-r--r--perl/pack.c114
-rw-r--r--perl/t/01_pack.t1
2 files changed, 50 insertions, 65 deletions
diff --git a/perl/pack.c b/perl/pack.c
index ff0ef2d..50b82e5 100644
--- a/perl/pack.c
+++ b/perl/pack.c
@@ -140,81 +140,65 @@ 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) {
msgpack_pack_nil(enc);
- return;
} else if (SvROK(val)) {
_msgpack_pack_sv(enc, SvRV(val));
- return;
- }
-
- switch (SvTYPE(val)) {
- case SVt_NULL:
- msgpack_pack_nil(enc);
- break;
- case SVt_PVNV:
- {
- 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 (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 {
+ msgpack_pack_nil(enc);
+ }
+ } 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<len; i++) {
+ SV** svp = av_fetch(ary, i, 0);
+ if (svp) {
+ _msgpack_pack_sv(enc, *svp);
} else {
msgpack_pack_nil(enc);
}
}
- break;
- case SVt_PVAV:
- {
- AV* ary = (AV*)val;
- int len = av_len(ary) + 1;
- int i;
- msgpack_pack_array(enc, len);
- for (i=0; i<len; i++) {
- SV** svp = av_fetch(ary, i, 0);
- if (svp) {
- _msgpack_pack_sv(enc, *svp);
- } else {
- msgpack_pack_nil(enc);
- }
- }
- }
- break;
- case SVt_PVHV:
- {
- HV* hval = (HV*)val;
- int count = hv_iterinit(hval);
- HE* he;
-
- msgpack_pack_map(enc, count);
-
- while (he = hv_iternext(hval)) {
- _msgpack_pack_sv(enc, hv_iterkeysv(he));
- _msgpack_pack_sv(enc, HeVAL(he));
- }
+ } else if (SvTYPE(val) == SVt_PVHV) {
+ HV* hval = (HV*)val;
+ int count = hv_iterinit(hval);
+ HE* he;
+
+ msgpack_pack_map(enc, count);
+
+ while (he = hv_iternext(hval)) {
+ _msgpack_pack_sv(enc, hv_iterkeysv(he));
+ _msgpack_pack_sv(enc, HeVAL(he));
}
- break;
- default:
- if (SvPOKp(val)) {
- STRLEN len;
- char * cval = SvPV(val, len);
-
- if (s_pref_int && try_int(enc, cval, len)) {
- return;
- }
+ } else if (SvPOKp(val)) {
+ STRLEN len;
+ char * cval = SvPV(val, len);
- msgpack_pack_raw(enc, len);
- msgpack_pack_raw_body(enc, cval, len);
+ if (s_pref_int && try_int(enc, cval, len)) {
return;
- } else if (SvIOK_UV(val)) {
- msgpack_pack_uint32(enc, SvUV(val));
- } else if (SvIOK(val)) {
- PACK_WRAPPER(IVTYPE)(enc, SvIV(val));
- } else if (SvNOK(val)) {
- PACK_WRAPPER(NVTYPE)(enc, SvNV(val));
- } else {
- sv_dump(val);
- Perl_croak(aTHX_ "msgpack for perl doesn't supported this type: %d\n", SvTYPE(val));
}
+
+ msgpack_pack_raw(enc, len);
+ msgpack_pack_raw_body(enc, cval, len);
+ } else if (SvIOK_UV(val)) {
+ msgpack_pack_uint32(enc, SvUV(val));
+ } else if (SvIOK(val)) {
+ PACK_WRAPPER(IVTYPE)(enc, SvIV(val));
+ } else if (SvNOK(val)) {
+ PACK_WRAPPER(NVTYPE)(enc, SvNV(val));
+ } else if (!SvOK(val)) {
+ msgpack_pack_nil(enc);
+ } else if (isGV(val)) {
+ Perl_croak(aTHX_ "msgpack cannot pack the GV\n");
+ } else {
+ sv_dump(val);
+ Perl_croak(aTHX_ "msgpack for perl doesn't supported this type: %d\n", SvTYPE(val));
}
}
diff --git a/perl/t/01_pack.t b/perl/t/01_pack.t
index dbf7a9a..22a8c14 100644
--- a/perl/t/01_pack.t
+++ b/perl/t/01_pack.t
@@ -17,6 +17,7 @@ my @dat = (
0, '00',
(my $foo="0")+0, '00',
{2 => undef}, '81 a1 32 c0',
+ do {no warnings; my $foo = 10; "$foo"; $foo = undef; $foo} => 'c0', # PVIV but !POK && !IOK
1, '01',
127, '7f',
128, 'cc 80',