This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Exit early from Perl_fbm_compile() if the SV is already "compiled".
authorNicholas Clark <nick@ccl4.org>
Wed, 18 May 2011 09:49:43 +0000 (10:49 +0100)
committerNicholas Clark <nick@ccl4.org>
Sat, 11 Jun 2011 07:40:02 +0000 (09:40 +0200)
I believe that this can only happen if a constant subroutine is used more than
once as the second argument to index.

t/op/index.t
util.c

index c8aafcf..b5b1005 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 }
 
 use strict;
-plan( tests => 120 );
+plan( tests => 122 );
 
 run_tests() unless caller;
 
@@ -224,4 +224,10 @@ formline PVBM2;
 is($^A, 'bang', "formline isn't confused by index compilation");
 is(index('bang', PVBM2), 0, "index isn't confused by format compilation");
 
+{
+    use constant perl => "rules";
+    is(index("perl rules", perl), 5, 'first index of a constant works');
+    is(index("rules 1 & 2", perl), 0, 'second index of the same constant works');
+}
+
 }
diff --git a/util.c b/util.c
index 74d7bb8..165e61a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -559,6 +559,9 @@ Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
     if (SvSCREAM(sv))
        return;
 
+    if (SvVALID(sv))
+       return;
+
     if (flags & FBMcf_TAIL) {
        MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
        sv_catpvs(sv, "\n");            /* Taken into account in fbm_instr() */