Perl: do not use switch (SvTYPE)

This commit is contained in:
Tokuhiro Matsuno 2009-07-22 16:40:15 +09:00
parent 390c5ad8a0
commit 718227bc2c
2 changed files with 50 additions and 65 deletions

View File

@ -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) { static void _msgpack_pack_sv(enc_t *enc, SV* val) {
if (val==NULL) { if (val==NULL) {
msgpack_pack_nil(enc); msgpack_pack_nil(enc);
return;
} else if (SvROK(val)) { } else if (SvROK(val)) {
_msgpack_pack_sv(enc, SvRV(val)); _msgpack_pack_sv(enc, SvRV(val));
return; } else if (SVt_PVNV == SvTYPE(val)) {
} STRLEN len = 0;
char *pv = SvPV(val, len);
switch (SvTYPE(val)) { if (len == 1 && *pv == '1') {
case SVt_NULL: msgpack_pack_true(enc);
msgpack_pack_nil(enc); } else if (len == 0 && *pv==0) {
break; msgpack_pack_false(enc);
case SVt_PVNV: } else {
{ msgpack_pack_nil(enc);
STRLEN len = 0; }
char *pv = SvPV(val, len); } else if (SvTYPE(val) == SVt_PVAV) {
if (len == 1 && *pv == '1') { AV* ary = (AV*)val;
msgpack_pack_true(enc); int len = av_len(ary) + 1;
} else if (len == 0 && *pv==0) { int i;
msgpack_pack_false(enc); 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 { } else {
msgpack_pack_nil(enc); msgpack_pack_nil(enc);
} }
} }
break; } else if (SvTYPE(val) == SVt_PVHV) {
case SVt_PVAV: HV* hval = (HV*)val;
{ int count = hv_iterinit(hval);
AV* ary = (AV*)val; HE* he;
int len = av_len(ary) + 1;
int i; msgpack_pack_map(enc, count);
msgpack_pack_array(enc, len);
for (i=0; i<len; i++) { while (he = hv_iternext(hval)) {
SV** svp = av_fetch(ary, i, 0); _msgpack_pack_sv(enc, hv_iterkeysv(he));
if (svp) { _msgpack_pack_sv(enc, HeVAL(he));
_msgpack_pack_sv(enc, *svp);
} else {
msgpack_pack_nil(enc);
}
}
} }
break; } else if (SvPOKp(val)) {
case SVt_PVHV: STRLEN len;
{ char * cval = SvPV(val, len);
HV* hval = (HV*)val;
int count = hv_iterinit(hval);
HE* he;
msgpack_pack_map(enc, count); if (s_pref_int && try_int(enc, cval, len)) {
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;
}
msgpack_pack_raw(enc, len);
msgpack_pack_raw_body(enc, cval, len);
return; 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));
} }
} }

View File

@ -17,6 +17,7 @@ my @dat = (
0, '00', 0, '00',
(my $foo="0")+0, '00', (my $foo="0")+0, '00',
{2 => undef}, '81 a1 32 c0', {2 => undef}, '81 a1 32 c0',
do {no warnings; my $foo = 10; "$foo"; $foo = undef; $foo} => 'c0', # PVIV but !POK && !IOK
1, '01', 1, '01',
127, '7f', 127, '7f',
128, 'cc 80', 128, 'cc 80',