summaryrefslogtreecommitdiff
path: root/t/cmd
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-08-12 17:57:35 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-09-15 22:45:06 -0700
commit0afba48f17ab3a5f576fdfaf4e4fc8671acde2bd (patch)
tree561da2665c228349942bed247cd24b41fa0dbc8c /t/cmd
parent8d2a5fb44f375599c14c4c03cdec3954962a2ef5 (diff)
downloadperl-0afba48f17ab3a5f576fdfaf4e4fc8671acde2bd.tar.gz
Fix up outside pointers for my subs
I had not yet fixed Perl_pad_fixup_inner_anons to account for the fact that my sub prototype CVs are stored in magic attached to the SV slot in the pad, rather than directly in the pad. It also did not like & entries that close over subs defined in outer or inner subs (‘my sub foo; sub bar; sub bar { &foo } }’ and ‘sub bar; sub bar { my sub foo; sub { sub foo { } } }’ respectively). This was resulting in assertion failures, unsurprisingly. Some of the tests I added, which were causing assertion failures, are now failing for other reasons, and are marked as to-do.
Diffstat (limited to 't/cmd')
-rw-r--r--t/cmd/lexsub.t52
1 files changed, 51 insertions, 1 deletions
diff --git a/t/cmd/lexsub.t b/t/cmd/lexsub.t
index 348facf933..f17eee0b7d 100644
--- a/t/cmd/lexsub.t
+++ b/t/cmd/lexsub.t
@@ -8,7 +8,7 @@ BEGIN {
*bar::like = *like;
}
no warnings 'deprecated';
-plan 107;
+plan 111;
# -------------------- our -------------------- #
@@ -453,6 +453,19 @@ sub make_anon_with_my_sub{
is eval{s2},eval{\&s1}, 'my sub in anon closure closing over sibling my sub';
}
}
+
+# Test my subs inside predeclared my subs
+{
+ my sub s2;
+ sub s2 {
+ my $x = 3;
+ my sub s3 { eval '$x' }
+ s3;
+ }
+ local $::TODO = 'closure problem?';
+ is s2, 3, 'my sub inside predeclared my sub';
+}
+
{
my $s = make_anon_with_my_sub;
&$s;
@@ -488,3 +501,40 @@ is sub {
s1
}->()(), 3, 'state sub inside my sub closing over my sub uncle';
+{
+ my sub s2 { 3 };
+ sub not_lexical { state sub foo { \&s2 } foo }
+ is not_lexical->(), 3, 'state subs that reference my sub from outside';
+}
+
+# Test my subs inside predeclared package subs
+# This test also checks that CvOUTSIDE pointers are not mangled when the
+# inner sub’s CvOUTSIDE points to another sub.
+sub not_lexical2;
+sub not_lexical2 {
+ my $x = 23;
+ my sub bar;
+ sub not_lexical3 {
+ not_lexical2();
+ sub bar { $x }
+ };
+ bar
+}
+$::TODO = 'closing over wrong sub';
+is not_lexical3, 23, 'my subs inside predeclared package subs';
+
+# Test my subs inside predeclared package sub, where the lexical sub is
+# declared outside the package sub.
+# This checks that CvOUTSIDE pointers are fixed up even when the sub is
+# not declared inside the sub that its CvOUTSIDE points to.
+{
+ my sub foo;
+ sub not_lexical4;
+ sub not_lexical4 {
+ my $x = 234;
+ sub foo { $x }
+ foo
+ }
+ is not_lexical4, 234,
+ 'my sub defined in predeclared pkg sub but declared outside';
+}