MP_INLINE void modperl_io_handle_untie(pTHX_ GV *handle) { #ifdef MP_TRACE if (mg_find(TIEHANDLE_SV(handle), PERL_MAGIC_tiedscalar)) { MP_TRACE_r(MP_FUNC, "untie *%s(0x%lx), REFCNT=%d", GvNAME(handle), (unsigned long)handle, SvREFCNT(TIEHANDLE_SV(handle))); } #endif sv_unmagic(TIEHANDLE_SV(handle), PERL_MAGIC_tiedscalar); }
static void tie_it(pTHX_ const char name, UV flag, HV *const stash) { GV *const gv = gv_fetchpvn(&name, 1, GV_ADDMULTI|GV_NOTQUAL, SVt_PVHV); HV *const hv = GvHV(gv); SV *rv = newSV_type(SVt_RV); SvRV_set(rv, newSVuv(flag)); SvROK_on(rv); sv_bless(rv, stash); sv_unmagic((SV *)hv, PERL_MAGIC_tied); sv_magic((SV *)hv, rv, PERL_MAGIC_tied, NULL, 0); SvREFCNT_dec(rv); /* As sv_magic increased it by one. */ }
void unlink_perl_object(SV* perl_obj) { SV* underlying_hash; object_link_data* link; // get the object linked to the perl_obj link = get_link_data(perl_obj); if (link == NULL) return; // remove the magical link underlying_hash = SvRV(perl_obj); sv_unmagic((SV*)underlying_hash, PERL_MAGIC_ext); // this is only ever called from DESTROY, which means // refcount should already be 0 //SvREFCNT_dec(link->perl_object); // decrement reference count link->perl_object = NULL; if (link->perl_object == NULL && link->cpp_object == NULL) delete link; }
HR_INLINE void free_our_magic(SV* target) { MAGIC *mg_last = mg_find(target, PERL_MAGIC_ext); MAGIC *mg_cur = mg_last; HR_Action *action; for(;mg_cur; mg_last = mg_cur, mg_cur = mg_cur->mg_moremagic ) { if(mg_cur->mg_virtual == &vtbl) { break; } } if(!mg_cur) { return; } action = _mg_action_list(mg_cur); if(action) { HR_DEBUG("Found action=%p", action); while((action = HR_free_action(action))); } /*Check if this is the last magic on the variable*/ GT_FREE_MAGIC: mg_cur->mg_virtual = NULL; if(mg_cur == mg_last) { /*First magic entry*/ HR_DEBUG("Calling sv_unmagic(%p)", mg_cur->mg_obj); sv_unmagic(mg_cur->mg_obj, PERL_MAGIC_ext); HR_DEBUG("Done!"); } else { mg_last->mg_moremagic = mg_cur->mg_moremagic; HR_DEBUG("About to Safefree(mg_cur=%p)", mg_cur); HR_DEBUG("Free=%p", mg_cur); Safefree(mg_cur); } }