… | |
… | |
218 | else |
218 | else |
219 | return newSVpvn ("", 0); |
219 | return newSVpvn ("", 0); |
220 | } |
220 | } |
221 | |
221 | |
222 | static void |
222 | static void |
223 | need_storable(void) |
223 | need_storable (void) |
224 | { |
224 | { |
225 | load_module (PERL_LOADMOD_NOIMPORT, serializer_package, Nullsv); |
225 | eval_sv (sv_2mortal (Perl_newSVpvf ("require %s", SvPVbyte_nolen (serializer_package))), G_VOID | G_DISCARD); |
226 | |
226 | |
227 | storable_mstore = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV)); |
227 | storable_mstore = (CV *)SvREFCNT_inc (GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mstore ), TRUE, SVt_PVCV))); |
228 | storable_mretrieve = GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV)); |
228 | storable_mretrieve = (CV *)SvREFCNT_inc (GvCV (gv_fetchpv (SvPVbyte_nolen (serializer_mretrieve), TRUE, SVt_PVCV))); |
229 | } |
229 | } |
230 | |
230 | |
231 | MODULE = Compress::LZF PACKAGE = Compress::LZF |
231 | MODULE = Compress::LZF PACKAGE = Compress::LZF |
232 | |
232 | |
233 | BOOT: |
233 | BOOT: |
… | |
… | |
243 | PROTOTYPE: $$$ |
243 | PROTOTYPE: $$$ |
244 | PPCODE: |
244 | PPCODE: |
245 | SvSetSV (serializer_package , package ); |
245 | SvSetSV (serializer_package , package ); |
246 | SvSetSV (serializer_mstore , mstore ); |
246 | SvSetSV (serializer_mstore , mstore ); |
247 | SvSetSV (serializer_mretrieve, mretrieve); |
247 | SvSetSV (serializer_mretrieve, mretrieve); |
248 | storable_mstore = |
248 | SvREFCNT_dec (storable_mstore ); storable_mstore = 0; |
249 | storable_mretrieve = 0; |
249 | SvREFCNT_dec (storable_mretrieve); storable_mretrieve = 0; |
250 | |
250 | |
251 | void |
251 | void |
252 | compress(data) |
252 | compress(data) |
253 | SV * data |
253 | SV * data |
254 | PROTOTYPE: $ |
254 | PROTOTYPE: $ |
… | |
… | |
283 | && SvTYPE(sv) != SVt_PVIV |
283 | && SvTYPE(sv) != SVt_PVIV |
284 | && SvTYPE(sv) != SVt_PVNV |
284 | && SvTYPE(sv) != SVt_PVNV |
285 | && SvTYPE(sv) != SVt_PVMG)) /* mstore */ |
285 | && SvTYPE(sv) != SVt_PVMG)) /* mstore */ |
286 | { |
286 | { |
287 | int deref = !SvROK (sv); |
287 | int deref = !SvROK (sv); |
|
|
288 | char *pv; |
288 | |
289 | |
289 | if (!storable_mstore) |
290 | if (!storable_mstore) |
290 | { |
291 | { |
291 | PUTBACK; |
292 | PUTBACK; |
292 | need_storable (); |
293 | need_storable (); |
… | |
… | |
299 | PUSHMARK (SP); |
300 | PUSHMARK (SP); |
300 | XPUSHs (sv); |
301 | XPUSHs (sv); |
301 | PUTBACK; |
302 | PUTBACK; |
302 | |
303 | |
303 | if (1 != call_sv ((SV *)storable_mstore, G_SCALAR)) |
304 | if (1 != call_sv ((SV *)storable_mstore, G_SCALAR)) |
304 | croak ("Storable::mstore didn't return a single scalar"); |
305 | croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mstore)); |
305 | |
306 | |
306 | SPAGAIN; |
307 | SPAGAIN; |
307 | |
308 | |
308 | sv = POPs; |
309 | sv = POPs; |
|
|
310 | pv = SvPV_nolen (sv); |
309 | |
311 | |
310 | if (SvPVX (sv)[0] == MAGIC_R) |
312 | if (*pv == MAGIC_R) |
311 | { |
313 | { |
312 | if (deref) |
314 | if (deref) |
313 | SvPVX (sv)[0] = MAGIC_R_deref; |
315 | *pv = MAGIC_R_deref; |
314 | } |
316 | } |
315 | else |
317 | else |
316 | { |
318 | { |
317 | char pfx[2]; |
319 | char pfx[2]; |
318 | |
320 | |
… | |
… | |
378 | PUSHMARK (SP); |
380 | PUSHMARK (SP); |
379 | XPUSHs (sv); |
381 | XPUSHs (sv); |
380 | PUTBACK; |
382 | PUTBACK; |
381 | |
383 | |
382 | if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) |
384 | if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) |
383 | croak ("Storable::mstore didn't return a single scalar"); |
385 | croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve)); |
384 | |
386 | |
385 | SPAGAIN; |
387 | SPAGAIN; |
386 | |
388 | |
387 | if (deref) |
389 | if (deref) |
388 | SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs)))); |
390 | SETs (sv_2mortal (SvREFCNT_inc (SvRV (TOPs)))); |
… | |
… | |
426 | PUSHMARK (SP); |
428 | PUSHMARK (SP); |
427 | XPUSHs (sv); |
429 | XPUSHs (sv); |
428 | PUTBACK; |
430 | PUTBACK; |
429 | |
431 | |
430 | if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) |
432 | if (1 != call_sv ((SV *)storable_mretrieve, G_SCALAR)) |
431 | croak ("Storable::mstore didn't return a single scalar"); |
433 | croak ("%s didn't return a single scalar", SvPVbyte_nolen (serializer_mretrieve)); |
432 | |
434 | |
433 | SPAGAIN; |
435 | SPAGAIN; |
434 | |
436 | |
435 | if (deref) |
437 | if (deref) |
436 | { |
438 | { |