perl: make PreferInteger variable magical and remove get_sv from _msgpack_pack_sv

This commit is contained in:
frsyuki 2009-07-03 01:49:37 +09:00
parent 580fbe77e9
commit 0f9dcb8610
3 changed files with 38 additions and 2 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }