t/lib/feature/removed Tests for enabling/disabling removed feature
t/lib/feature/say Tests for enabling/disabling say feature
t/lib/feature/switch Tests for enabling/disabling switch feature
+t/lib/GH_15109/Apack.pm test Module for caller.t
+t/lib/GH_15109/Bpack.pm test Module for caller.t
+t/lib/GH_15109/Cpack.pm test Module for caller.t
t/lib/h2ph.h Test header file for h2ph
t/lib/h2ph.pht Generated output from h2ph.h by h2ph, for comparison
t/lib/locale/latin1 Part of locale.t in Latin 1
(void)CvGV(cv);
if (floor) LEAVE_SCOPE(floor);
ENTER;
+
+ SAVEVPTR(PL_curcop);
+ if (PL_curcop == &PL_compiling) {
+ /* Avoid pushing the "global" &PL_compiling onto the
+ * context stack. For example, a stack trace inside
+ * nested use's would show all calls coming from whoever
+ * most recently updated PL_compiling.cop_file and
+ * cop_line. So instead, temporarily set PL_curcop to a
+ * private copy of &PL_compiling. PL_curcop will soon be
+ * set to point back to &PL_compiling anyway but only
+ * after the temp value has been pushed onto the context
+ * stack as blk_oldcop.
+ * This is slightly hacky, but necessary. Note also
+ * that in the brief window before PL_curcop is set back
+ * to PL_compiling, IN_PERL_COMPILETIME/IN_PERL_RUNTIME
+ * will give the wrong answer.
+ */
+ Newx(PL_curcop, 1, COP);
+ StructCopy(&PL_compiling, PL_curcop, COP);
+ PL_curcop->op_slabbed = 0;
+ SAVEFREEPV(PL_curcop);
+ }
+
PUSHSTACKi(PERLSI_REQUIRE);
SAVECOPFILE(&PL_compiling);
SAVECOPLINE(&PL_compiling);
- SAVEVPTR(PL_curcop);
DEBUG_x( dump_sub(gv) );
Perl_av_create_and_push(aTHX_ &PL_beginav, MUTABLE_SV(cv));
--- /dev/null
+# for use by caller.t for GH #15109
+package Apack;
+use Bpack;
+1;
--- /dev/null
+# for use by caller.t for GH #15109
+package Bpack;
+use Cpack;
+1;
--- /dev/null
+# for use by caller.t for GH #15109
+package Cpack;
+
+
+my $i = 0;
+
+while (my ($package, $file, $line) = caller($i++)) {
+ push @Cpack::callers, "$file:$line";
+}
+
+1;
chdir 't' if -d 't';
require './test.pl';
set_up_inc('../lib');
- plan( tests => 97 ); # some tests are run in a BEGIN block
+ plan( tests => 109 ); # some tests are run in a BEGIN block
}
my @c;
do './op/caller.pl' or die $@;
+# GH #15109
+# See that callers within a nested series of 'use's gets the right
+# filenames.
+{
+ local @INC = 'lib/GH_15109/';
+ # Apack use's Bpack which use's Cpack which populates @Cpack::caller
+ # with the file:N of all the callers
+ eval 'use Apack; 1';
+ is($@, "", "GH #15109 - eval");
+ is (scalar(@Cpack::callers), 10, "GH #15109 - callers count");
+ like($Cpack::callers[$_], qr{GH_15109/Bpack.pm:3}, "GH #15109 level $_") for 0..2;
+ like($Cpack::callers[$_], qr{GH_15109/Apack.pm:3}, "GH #15109 level $_") for 3..5;
+ like($Cpack::callers[$_], qr{\(eval \d+\):1}, "GH #15109 level $_") for 6..8;
+ like($Cpack::callers[$_], qr{caller\.t}, "GH #15109 level $_") for 9;
+}
+
{
package RT129239;
BEGIN {
#line 12345 "virtually/op/caller.t"
}
}
+