mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-19 04:52:59 +01:00
Perl: do not use switch (SvTYPE)
This commit is contained in:
parent
390c5ad8a0
commit
718227bc2c
32
perl/pack.c
32
perl/pack.c
@ -140,18 +140,9 @@ 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)) {
|
||||||
}
|
|
||||||
|
|
||||||
switch (SvTYPE(val)) {
|
|
||||||
case SVt_NULL:
|
|
||||||
msgpack_pack_nil(enc);
|
|
||||||
break;
|
|
||||||
case SVt_PVNV:
|
|
||||||
{
|
|
||||||
STRLEN len = 0;
|
STRLEN len = 0;
|
||||||
char *pv = SvPV(val, len);
|
char *pv = SvPV(val, len);
|
||||||
if (len == 1 && *pv == '1') {
|
if (len == 1 && *pv == '1') {
|
||||||
@ -161,10 +152,7 @@ static void _msgpack_pack_sv(enc_t *enc, SV* val) {
|
|||||||
} else {
|
} else {
|
||||||
msgpack_pack_nil(enc);
|
msgpack_pack_nil(enc);
|
||||||
}
|
}
|
||||||
}
|
} else if (SvTYPE(val) == SVt_PVAV) {
|
||||||
break;
|
|
||||||
case SVt_PVAV:
|
|
||||||
{
|
|
||||||
AV* ary = (AV*)val;
|
AV* ary = (AV*)val;
|
||||||
int len = av_len(ary) + 1;
|
int len = av_len(ary) + 1;
|
||||||
int i;
|
int i;
|
||||||
@ -177,10 +165,7 @@ static void _msgpack_pack_sv(enc_t *enc, SV* val) {
|
|||||||
msgpack_pack_nil(enc);
|
msgpack_pack_nil(enc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (SvTYPE(val) == SVt_PVHV) {
|
||||||
break;
|
|
||||||
case SVt_PVHV:
|
|
||||||
{
|
|
||||||
HV* hval = (HV*)val;
|
HV* hval = (HV*)val;
|
||||||
int count = hv_iterinit(hval);
|
int count = hv_iterinit(hval);
|
||||||
HE* he;
|
HE* he;
|
||||||
@ -191,10 +176,7 @@ static void _msgpack_pack_sv(enc_t *enc, SV* val) {
|
|||||||
_msgpack_pack_sv(enc, hv_iterkeysv(he));
|
_msgpack_pack_sv(enc, hv_iterkeysv(he));
|
||||||
_msgpack_pack_sv(enc, HeVAL(he));
|
_msgpack_pack_sv(enc, HeVAL(he));
|
||||||
}
|
}
|
||||||
}
|
} else if (SvPOKp(val)) {
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (SvPOKp(val)) {
|
|
||||||
STRLEN len;
|
STRLEN len;
|
||||||
char * cval = SvPV(val, len);
|
char * cval = SvPV(val, len);
|
||||||
|
|
||||||
@ -204,19 +186,21 @@ static void _msgpack_pack_sv(enc_t *enc, SV* val) {
|
|||||||
|
|
||||||
msgpack_pack_raw(enc, len);
|
msgpack_pack_raw(enc, len);
|
||||||
msgpack_pack_raw_body(enc, cval, len);
|
msgpack_pack_raw_body(enc, cval, len);
|
||||||
return;
|
|
||||||
} else if (SvIOK_UV(val)) {
|
} else if (SvIOK_UV(val)) {
|
||||||
msgpack_pack_uint32(enc, SvUV(val));
|
msgpack_pack_uint32(enc, SvUV(val));
|
||||||
} else if (SvIOK(val)) {
|
} else if (SvIOK(val)) {
|
||||||
PACK_WRAPPER(IVTYPE)(enc, SvIV(val));
|
PACK_WRAPPER(IVTYPE)(enc, SvIV(val));
|
||||||
} else if (SvNOK(val)) {
|
} else if (SvNOK(val)) {
|
||||||
PACK_WRAPPER(NVTYPE)(enc, SvNV(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 {
|
} else {
|
||||||
sv_dump(val);
|
sv_dump(val);
|
||||||
Perl_croak(aTHX_ "msgpack for perl doesn't supported this type: %d\n", SvTYPE(val));
|
Perl_croak(aTHX_ "msgpack for perl doesn't supported this type: %d\n", SvTYPE(val));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
XS(xs_pack) {
|
XS(xs_pack) {
|
||||||
dXSARGS;
|
dXSARGS;
|
||||||
|
@ -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',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user