summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2009-07-03 01:49:37 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2009-07-03 01:49:37 +0900
commit0f9dcb86100e34c7f10a19399cfa5dca3d4dcdbc (patch)
tree65b73da3e3d801a90b33db3cd0b5750e2f95dcd4
parent580fbe77e9301786234ae47bfa0300736d9d8a84 (diff)
downloadmsgpack-python-0f9dcb86100e34c7f10a19399cfa5dca3d4dcdbc.tar.gz
perl: make PreferInteger variable magical and remove get_sv from _msgpack_pack_sv
-rw-r--r--perl/MessagePack.c4
-rw-r--r--perl/lib/Data/MessagePack.pm1
-rw-r--r--perl/pack.c35
3 files changed, 38 insertions, 2 deletions
diff --git a/perl/MessagePack.c b/perl/MessagePack.c
index 3b33fee..f56d147 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 712d3b5..ff179e8 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 c8987fe..03e6530 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<len; i++) {
@@ -133,8 +165,7 @@ static void _msgpack_pack_sv(enc_t *enc, SV* val) {
char * cval = SvPV(val, len);
const int U32_STRLEN = 10; /* length(0xFFFFFFFF) */
- SV* pref_int = get_sv("Data::MessagePack::PreferInteger", 0);
- if (pref_int && SvTRUE(pref_int) && len <= U32_STRLEN && looks_like_int(cval, len) && SvUV(val) < U32_MAX) {
+ if (s_pref_int && len <= U32_STRLEN && looks_like_int(cval, len) && SvUV(val) < U32_MAX) {
PACK_WRAPPER(uint32)(enc, SvUV(val));
return;
}