summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-04-23 20:29:13 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-05-21 16:51:34 -0700
commit09fb282d08ec6c0189a10f94933ae9c8b8186577 (patch)
treef14564b5856183a9cc59a306dd19105ec808ef9d /mg.c
parente33525913afb6ff03f7a9e1f9881fd5ea6982f22 (diff)
downloadperl-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.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/mg.c b/mg.c
index e202d585d3..03500da7ca 100644
--- a/mg.c
+++ b/mg.c
@@ -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