diff options
| author | Tokuhiro Matsuno <tokuhirom@gmail.com> | 2009-07-22 16:40:15 +0900 |
|---|---|---|
| committer | Tokuhiro Matsuno <tokuhirom@gmail.com> | 2009-07-22 16:40:15 +0900 |
| commit | 718227bc2cc7ed2d4a4152a1018f0fa046bbc57e (patch) | |
| tree | 2f9aea528d3199573b92be91e25b3030aef3dfa9 | |
| parent | 390c5ad8a0424968dbcc4b69750d2c31f1872b4f (diff) | |
| download | msgpack-python-718227bc2cc7ed2d4a4152a1018f0fa046bbc57e.tar.gz | |
Perl: do not use switch (SvTYPE)
| -rw-r--r-- | perl/pack.c | 114 | ||||
| -rw-r--r-- | perl/t/01_pack.t | 1 |
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', |
