diff options
author | Father Chrysostomos <sprout@cpan.org> | 2012-04-23 20:29:13 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2012-05-21 16:51:34 -0700 |
commit | 09fb282d08ec6c0189a10f94933ae9c8b8186577 (patch) | |
tree | f14564b5856183a9cc59a306dd19105ec808ef9d /mg.c | |
parent | e33525913afb6ff03f7a9e1f9881fd5ea6982f22 (diff) | |
download | perl-09fb282d08ec6c0189a10f94933ae9c8b8186577.tar.gz |
Copy call checker when cloning closure prototype
Otherwise cv_set_call_checker has no effect inside an attribute han-
dler for a closure.
Diffstat (limited to 'mg.c')
-rw-r--r-- | mg.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -3383,6 +3383,25 @@ Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg) return 0; } +int +Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv, + const char *name, I32 namlen) +{ + MAGIC *nmg; + + PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER; + PERL_UNUSED_ARG(name); + PERL_UNUSED_ARG(namlen); + + sv_magic(nsv, &PL_sv_undef, mg->mg_type, NULL, 0); + nmg = mg_find(nsv, mg->mg_type); + if (nmg->mg_flags & MGf_REFCOUNTED) SvREFCNT_dec(nmg->mg_obj); + nmg->mg_ptr = mg->mg_ptr; + nmg->mg_obj = SvREFCNT_inc_simple(mg->mg_obj); + nmg->mg_flags |= MGf_REFCOUNTED; + return 1; +} + /* * Local variables: * c-indentation-style: bsd |