diff --git a/perl/MessagePack.c b/perl/MessagePack.c index 3b33fee1..f56d1476 100644 --- a/perl/MessagePack.c +++ b/perl/MessagePack.c @@ -19,10 +19,14 @@ XS(xs_unpacker_is_finished); XS(xs_unpacker_data); XS(xs_unpacker_reset); +void boot_Data__MessagePack_pack(void); + XS(boot_Data__MessagePack) { dXSARGS; HV * stash; + boot_Data__MessagePack_pack(); + newXS("Data::MessagePack::pack", xs_pack, __FILE__); newXS("Data::MessagePack::unpack", xs_unpack, __FILE__); stash = gv_stashpvn("Data::MessagePack", strlen("Data::MessagePack"), TRUE); diff --git a/perl/lib/Data/MessagePack.pm b/perl/lib/Data/MessagePack.pm index 712d3b5c..ff179e8a 100644 --- a/perl/lib/Data/MessagePack.pm +++ b/perl/lib/Data/MessagePack.pm @@ -5,6 +5,7 @@ use XSLoader; use 5.008001; our $VERSION = '0.02'; +our $PreferInteger = 0; XSLoader::load(__PACKAGE__, $VERSION); diff --git a/perl/pack.c b/perl/pack.c index c8987fef..03e65303 100644 --- a/perl/pack.c +++ b/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) { int i; for (i=0; i