mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-19 04:52:59 +01:00
perl: make PreferInteger variable magical and remove get_sv from _msgpack_pack_sv
This commit is contained in:
parent
580fbe77e9
commit
0f9dcb8610
@ -19,10 +19,14 @@ XS(xs_unpacker_is_finished);
|
|||||||
XS(xs_unpacker_data);
|
XS(xs_unpacker_data);
|
||||||
XS(xs_unpacker_reset);
|
XS(xs_unpacker_reset);
|
||||||
|
|
||||||
|
void boot_Data__MessagePack_pack(void);
|
||||||
|
|
||||||
XS(boot_Data__MessagePack) {
|
XS(boot_Data__MessagePack) {
|
||||||
dXSARGS;
|
dXSARGS;
|
||||||
HV * stash;
|
HV * stash;
|
||||||
|
|
||||||
|
boot_Data__MessagePack_pack();
|
||||||
|
|
||||||
newXS("Data::MessagePack::pack", xs_pack, __FILE__);
|
newXS("Data::MessagePack::pack", xs_pack, __FILE__);
|
||||||
newXS("Data::MessagePack::unpack", xs_unpack, __FILE__);
|
newXS("Data::MessagePack::unpack", xs_unpack, __FILE__);
|
||||||
stash = gv_stashpvn("Data::MessagePack", strlen("Data::MessagePack"), TRUE);
|
stash = gv_stashpvn("Data::MessagePack", strlen("Data::MessagePack"), TRUE);
|
||||||
|
@ -5,6 +5,7 @@ use XSLoader;
|
|||||||
use 5.008001;
|
use 5.008001;
|
||||||
|
|
||||||
our $VERSION = '0.02';
|
our $VERSION = '0.02';
|
||||||
|
our $PreferInteger = 0;
|
||||||
|
|
||||||
XSLoader::load(__PACKAGE__, $VERSION);
|
XSLoader::load(__PACKAGE__, $VERSION);
|
||||||
|
|
||||||
|
35
perl/pack.c
35
perl/pack.c
@ -51,6 +51,38 @@ void need(enc_t *enc, STRLEN len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int s_pref_int = 0;
|
||||||
|
|
||||||
|
static int pref_int_set(pTHX_ SV* sv, MAGIC* mg) {
|
||||||
|
if (SvTRUE(sv)) {
|
||||||
|
s_pref_int = 1;
|
||||||
|
} else {
|
||||||
|
s_pref_int = 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MGVTBL pref_int_vtbl = {
|
||||||
|
NULL,
|
||||||
|
pref_int_set,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
#ifdef MGf_LOCAL
|
||||||
|
NULL,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
void boot_Data__MessagePack_pack(void) {
|
||||||
|
SV* var = get_sv("Data::MessagePack::PreferInteger", 0);
|
||||||
|
sv_magicext(var, NULL, PERL_MAGIC_ext, &pref_int_vtbl, NULL, 0);
|
||||||
|
SvSETMAGIC(var);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int looks_like_int(const char *str, size_t len) {
|
static int looks_like_int(const char *str, size_t len) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
@ -133,8 +165,7 @@ static void _msgpack_pack_sv(enc_t *enc, SV* val) {
|
|||||||
char * cval = SvPV(val, len);
|
char * cval = SvPV(val, len);
|
||||||
const int U32_STRLEN = 10; /* length(0xFFFFFFFF) */
|
const int U32_STRLEN = 10; /* length(0xFFFFFFFF) */
|
||||||
|
|
||||||
SV* pref_int = get_sv("Data::MessagePack::PreferInteger", 0);
|
if (s_pref_int && len <= U32_STRLEN && looks_like_int(cval, len) && SvUV(val) < U32_MAX) {
|
||||||
if (pref_int && SvTRUE(pref_int) && len <= U32_STRLEN && looks_like_int(cval, len) && SvUV(val) < U32_MAX) {
|
|
||||||
PACK_WRAPPER(uint32)(enc, SvUV(val));
|
PACK_WRAPPER(uint32)(enc, SvUV(val));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user