… | |
… | |
391 | if (obj->self) |
391 | if (obj->self) |
392 | reattach (subclass::get_dt (), (subclass *)obj); |
392 | reattach (subclass::get_dt (), (subclass *)obj); |
393 | } |
393 | } |
394 | |
394 | |
395 | object_freezer::object_freezer (const char *filename) |
395 | object_freezer::object_freezer (const char *filename) |
396 | : filename (filename) |
|
|
397 | { |
396 | { |
|
|
397 | this->filename = (SV *)newSVpv (filename, 0); |
|
|
398 | |
|
|
399 | char filename2 [4096]; |
|
|
400 | snprintf (filename2, 4096, "%s~", filename); |
|
|
401 | |
|
|
402 | fp = fopen (filename2, "w"); |
|
|
403 | |
|
|
404 | if (!fp) |
|
|
405 | LOG (llevError, "cannot open file '%s' for writing: %s\n", filename2, strerror (errno)); |
|
|
406 | |
398 | av = (AV *)newAV (); |
407 | av = (AV *)newAV (); |
399 | } |
408 | } |
400 | |
409 | |
401 | object_freezer::~object_freezer () |
410 | object_freezer::~object_freezer () |
402 | { |
411 | { |
|
|
412 | if (fp) |
|
|
413 | { |
|
|
414 | fclose (fp); |
|
|
415 | |
403 | dSP; |
416 | dSP; |
404 | ENTER; |
417 | ENTER; |
405 | SAVETMPS; |
418 | SAVETMPS; |
406 | PUSHMARK (SP); |
419 | PUSHMARK (SP); |
407 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
420 | XPUSHs (sv_2mortal ((SV *)filename)); |
408 | XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); |
421 | XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); |
409 | PUTBACK; |
422 | PUTBACK; |
410 | call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); |
423 | call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); |
411 | FREETMPS; |
424 | FREETMPS; |
412 | LEAVE; |
425 | LEAVE; |
|
|
426 | } |
|
|
427 | else |
|
|
428 | SvREFCNT_dec ((SV *)filename); |
413 | } |
429 | } |
414 | |
430 | |
415 | void object_freezer::put (FILE *fp, attachable_base *ext) |
431 | void object_freezer::put (attachable_base *ext) |
416 | { |
432 | { |
417 | ext->optimise (); |
433 | ext->optimise (); |
418 | |
434 | |
419 | if (ext->self) |
435 | if (ext->self) |
420 | { |
436 | { |
… | |
… | |
422 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
438 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
423 | fprintf (fp, "oid %d\n", idx); |
439 | fprintf (fp, "oid %d\n", idx); |
424 | } |
440 | } |
425 | } |
441 | } |
426 | |
442 | |
427 | object_thawer::object_thawer (const char *filename) |
443 | object_thawer::object_thawer (FILE *fp, const char *filename) |
428 | { |
444 | { |
|
|
445 | this->fp = fp; |
429 | av = 0; |
446 | av = 0; |
430 | |
447 | |
431 | if (!filename) |
448 | if (!filename) |
432 | return; |
449 | return; |
433 | |
450 | |
… | |
… | |
472 | reattach (type, obj); |
489 | reattach (type, obj); |
473 | } |
490 | } |
474 | |
491 | |
475 | object_thawer::~object_thawer () |
492 | object_thawer::~object_thawer () |
476 | { |
493 | { |
477 | if (av) |
|
|
478 | SvREFCNT_dec ((SV *)av); |
494 | if (av) SvREFCNT_dec ((AV *)av); |
479 | } |
495 | } |
480 | |
496 | |
481 | ///////////////////////////////////////////////////////////////////////////// |
497 | ///////////////////////////////////////////////////////////////////////////// |
482 | |
498 | |
483 | extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) |
499 | extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) |