--- Compress-LZF/LZF.xs 2008/01/09 20:41:18 1.25 +++ Compress-LZF/LZF.xs 2008/12/29 08:46:40 1.30 @@ -220,12 +220,12 @@ } static void -need_storable(void) +need_storable (void) { - load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv); + eval_sv (sv_2mortal (newSVpvf ("require %s", SvPVbyte_nolen (serializer_package))), G_VOID | G_DISCARD); - storable_mstore = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV)); - storable_mretrieve = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); + storable_mstore = (CV *)SvREFCNT_inc (GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV))); + storable_mretrieve = (CV *)SvREFCNT_inc (GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV))); } MODULE = Compress::LZF PACKAGE = Compress::LZF @@ -245,8 +245,8 @@ SvSetSV (serializer_package , package ); SvSetSV (serializer_mstore , mstore ); SvSetSV (serializer_mretrieve, mretrieve); - storable_mstore = - storable_mretrieve = 0; + SvREFCNT_dec (storable_mstore ); storable_mstore = 0; + SvREFCNT_dec (storable_mretrieve); storable_mretrieve = 0; void compress(data) @@ -285,6 +285,7 @@ && SvTYPE(sv) != SVt_PVMG)) /* mstore */ { int deref = !SvROK (sv); + char *pv; if (!storable_mstore) { @@ -301,16 +302,17 @@ PUTBACK; if (1 != call_sv ((SV *)storable_mstore, G_SCALAR)) - croak ("Storable::mstore didn't return a single scalar"); + croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mstore)); SPAGAIN; sv = POPs; + pv = SvPV_nolen (sv); - if (SvPVX (sv)[0] == MAGIC_R) + if (*pv == MAGIC_R) { if (deref) - SvPVX (sv)[0] = MAGIC_R_deref; + *pv = MAGIC_R_deref; } else { @@ -380,7 +382,7 @@ PUTBACK; if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) - croak ("Storable::mstore didn't return a single scalar"); + croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve)); SPAGAIN; @@ -428,7 +430,7 @@ PUTBACK; if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) - croak ("Storable::mstore didn't return a single scalar"); + croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve)); SPAGAIN;