r61712 - in /branches/upstream/libindirect-perl/current: Changes META.yml README indirect.xs lib/indirect.pm t/10-args.t t/20-good.t t/21-bad.t

angelabad-guest at users.alioth.debian.org angelabad-guest at users.alioth.debian.org
Wed Aug 18 09:36:12 UTC 2010


Author: angelabad-guest
Date: Wed Aug 18 09:36:02 2010
New Revision: 61712

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=61712
Log:
[svn-upgrade] new version libindirect-perl (0.22)

Modified:
    branches/upstream/libindirect-perl/current/Changes
    branches/upstream/libindirect-perl/current/META.yml
    branches/upstream/libindirect-perl/current/README
    branches/upstream/libindirect-perl/current/indirect.xs
    branches/upstream/libindirect-perl/current/lib/indirect.pm
    branches/upstream/libindirect-perl/current/t/10-args.t
    branches/upstream/libindirect-perl/current/t/20-good.t
    branches/upstream/libindirect-perl/current/t/21-bad.t

Modified: branches/upstream/libindirect-perl/current/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/Changes?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/Changes (original)
+++ branches/upstream/libindirect-perl/current/Changes Wed Aug 18 09:36:02 2010
@@ -1,4 +1,15 @@
 Revision history for indirect
+
+0.22    2010-08-16 16:00 UTC
+        + Add : Indirect constructs are now reported for code interpolated
+                in quote-like environments, like "${\( ... )}", "@{[ ... ]}",
+                s/pattern/ ... /e, qr/(?{ ... })/ or qr/(??{ ... })/.
+        + Add : You can now make the pragma lethal by passing anything matching
+                /^:?fatal$/i to import(), including "FATAL" and ":Fatal".
+        + Fix : [RT #60378] : segmentation fault on indirect_ck_method.
+                This caused constructs like "@{[ $obj->$meth ]}" to segfault
+                when $meth was a lexical.
+                Thanks Tokuhiro Matsuno for reporting.
 
 0.21    2010-05-31 23:10 UTC
         + Chg : perl 5.8.1 is now required (instead of 5.8.0).

Modified: branches/upstream/libindirect-perl/current/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/META.yml?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/META.yml (original)
+++ branches/upstream/libindirect-perl/current/META.yml Wed Aug 18 09:36:02 2010
@@ -1,6 +1,6 @@
 --- #YAML:1.0
 name:               indirect
-version:            0.21
+version:            0.22
 abstract:           Lexically warn about using the indirect object syntax.
 author:
     - Vincent Pit <perl at profvince.com>

Modified: branches/upstream/libindirect-perl/current/README
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/README?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/README (original)
+++ branches/upstream/libindirect-perl/current/README Wed Aug 18 09:36:02 2010
@@ -2,7 +2,7 @@
     indirect - Lexically warn about using the indirect object syntax.
 
 VERSION
-    Version 0.21
+    Version 0.22
 
 SYNOPSIS
         # In a script
@@ -18,7 +18,7 @@
         }
         try { ... }; # warns
 
-        no indirect ':fatal';
+        no indirect ':fatal';    # or 'FATAL', or ':Fatal' ...
         if (defied $foo) { ... } # croaks, note the typo
 
         # From the command-line
@@ -34,7 +34,7 @@
     object syntax constructs that may have slipped into your code.
 
     This syntax is now considered harmful, since its parsing has many quirks
-    and its use is error prone (when "swoosh" isn't defined, "swoosh $x"
+    and its use is error prone (when "swoosh" is not defined, "swoosh $x"
     actually compiles to "$x->swoosh"). In
     <http://www.shadowcat.co.uk/blog/matt-s-trout/indirect-but-still-fatal>,
     Matt S. Trout gives an example of an indirect construct that can cause a
@@ -47,12 +47,12 @@
     This module is not a source filter.
 
 METHODS
-  "unimport [ hook => $hook | ':fatal' ]"
+  "unimport [ hook => $hook | ':fatal', 'FATAL', ... ]"
     Magically called when "no indirect @opts" is encountered. Turns the
     module on. The policy to apply depends on what is first found in @opts :
 
-    *   If it's the string ':fatal', the compilation will croak on the first
-        indirect syntax met.
+    *   If it is a string that matches "/^:?fatal$/i", the compilation will
+        croak on the first indirect syntax met.
 
     *   If the key/value pair "hook => $hook" comes first, $hook will be
         called for each error with a string representation of the object as
@@ -99,12 +99,12 @@
     for disabling "indirect" in production environments.
 
     Note that clearing this variable after "indirect" was loaded has no
-    effect. If you want to reenable the pragma later, you also need to
+    effect. If you want to re-enable the pragma later, you also need to
     reload it by deleting the 'indirect.pm' entry from %INC.
 
 CAVEATS
     The implementation was tweaked to work around several limitations of
-    vanilla "perl" pragmas : it's thread safe, and doesn't suffer from a
+    vanilla "perl" pragmas : it's thread safe, and does not suffer from a
     "perl 5.8.x-5.10.0" bug that causes all pragmas to propagate into
     "require"d scopes.
 

Modified: branches/upstream/libindirect-perl/current/indirect.xs
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/indirect.xs?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/indirect.xs (original)
+++ branches/upstream/libindirect-perl/current/indirect.xs Wed Aug 18 09:36:02 2010
@@ -62,12 +62,6 @@
 #define I_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S))))))
 
 #if I_HAS_PERL(5, 10, 0) || defined(PL_parser)
-# ifndef PL_lex_inwhat
-#  define PL_lex_inwhat PL_parser->lex_inwhat
-# endif
-# ifndef PL_linestr
-#  define PL_linestr PL_parser->linestr
-# endif
 # ifndef PL_bufptr
 #  define PL_bufptr PL_parser->bufptr
 # endif
@@ -75,12 +69,6 @@
 #  define PL_oldbufptr PL_parser->oldbufptr
 # endif
 #else
-# ifndef PL_lex_inwhat
-#  define PL_lex_inwhat PL_Ilex_inwhat
-# endif
-# ifndef PL_linestr
-#  define PL_linestr PL_Ilinestr
-# endif
 # ifndef PL_bufptr
 #  define PL_bufptr PL_Ibufptr
 # endif
@@ -212,11 +200,10 @@
 
 typedef struct {
 #if I_THREADSAFE
- ptable     *tbl; /* It really is a ptable_hints */
- tTHX        owner;
-#endif
- ptable     *map;
- const char *linestr;
+ ptable *tbl; /* It really is a ptable_hints */
+ tTHX    owner;
+#endif
+ ptable *map;
 } my_cxt_t;
 
 START_MY_CXT
@@ -422,18 +409,6 @@
  STRLEN len;
  dMY_CXT;
 
- /* When lex_inwhat is set, we're in a quotelike environment (qq, qr, but not q)
-  * In this case the linestr has temporarly changed, but the old buffer should
-  * still be alive somewhere. */
-
- if (!PL_lex_inwhat) {
-  const char *pl_linestr = SvPVX_const(PL_linestr);
-  if (MY_CXT.linestr != pl_linestr) {
-   ptable_clear(MY_CXT.map);
-   MY_CXT.linestr = pl_linestr;
-  }
- }
-
  if (!(oi = ptable_fetch(MY_CXT.map, o))) {
   Newx(oi, 1, indirect_op_info_t);
   ptable_store(MY_CXT.map, o, oi);
@@ -463,9 +438,6 @@
 STATIC const indirect_op_info_t *indirect_map_fetch(pTHX_ const OP *o) {
 #define indirect_map_fetch(O) indirect_map_fetch(aTHX_ (O))
  dMY_CXT;
-
- if (MY_CXT.linestr != SvPVX_const(PL_linestr))
-  return NULL;
 
  return ptable_fetch(MY_CXT.map, o);
 }
@@ -649,28 +621,35 @@
 STATIC OP *indirect_ck_method(pTHX_ OP *o) {
  if (indirect_hint()) {
   OP *op = cUNOPo->op_first;
-  const indirect_op_info_t *oi = indirect_map_fetch(op);
-  const char *s = NULL;
-  line_t line;
-  SV *sv;
-
-  if (oi && (s = oi->pos)) {
-   sv   = sv_2mortal(newSVpvn(oi->buf, oi->len));
-   line = oi->line; /* Keep the old line so that we really point to the first */
-  } else {
-   sv = cSVOPx_sv(op);
-   if (!SvPOK(sv) || (SvTYPE(sv) < SVt_PV))
-    goto done;
-   sv   = sv_mortalcopy(sv);
-   s    = indirect_find(sv, PL_oldbufptr);
-   line = CopLINE(&PL_compiling);
+
+  /* Indirect method call is only possible when the method is a bareword, so
+   * don't trip up on $obj->$meth. */
+  if (op && op->op_type == OP_CONST) {
+   const indirect_op_info_t *oi = indirect_map_fetch(op);
+   const char *s = NULL;
+   line_t line;
+   SV *sv;
+
+   if (oi && (s = oi->pos)) {
+    sv   = sv_2mortal(newSVpvn(oi->buf, oi->len));
+    /* Keep the old line so that we really point to the first line of the
+     * expression. */
+    line = oi->line;
+   } else {
+    sv = cSVOPx_sv(op);
+    if (!SvPOK(sv) || (SvTYPE(sv) < SVt_PV))
+     goto done;
+    sv   = sv_mortalcopy(sv);
+    s    = indirect_find(sv, PL_oldbufptr);
+    line = CopLINE(&PL_compiling);
+   }
+
+   o = CALL_FPTR(indirect_old_ck_method)(aTHX_ o);
+   /* o may now be a method_named */
+
+   indirect_map_store(o, s, sv, line);
+   return o;
   }
-
-  o = CALL_FPTR(indirect_old_ck_method)(aTHX_ o);
-  /* o may now be a method_named */
-
-  indirect_map_store(o, s, sv, line);
-  return o;
  }
 
 done:
@@ -820,11 +799,10 @@
  {
   MY_CXT_INIT;
 #if I_THREADSAFE
-  MY_CXT.tbl     = ptable_new();
-  MY_CXT.owner   = aTHX;
-#endif
-  MY_CXT.map     = ptable_new();
-  MY_CXT.linestr = NULL;
+  MY_CXT.tbl   = ptable_new();
+  MY_CXT.owner = aTHX;
+#endif
+  MY_CXT.map   = ptable_new();
  }
 
  indirect_old_ck_const    = PL_check[OP_CONST];
@@ -892,10 +870,9 @@
  }
  {
   MY_CXT_CLONE;
-  MY_CXT.map     = ptable_new();
-  MY_CXT.linestr = NULL;
-  MY_CXT.tbl     = t;
-  MY_CXT.owner   = aTHX;
+  MY_CXT.map   = ptable_new();
+  MY_CXT.tbl   = t;
+  MY_CXT.owner = aTHX;
  }
  reap(3, indirect_thread_cleanup, NULL);
  XSRETURN(0);

Modified: branches/upstream/libindirect-perl/current/lib/indirect.pm
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/lib/indirect.pm?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/lib/indirect.pm (original)
+++ branches/upstream/libindirect-perl/current/lib/indirect.pm Wed Aug 18 09:36:02 2010
@@ -11,13 +11,13 @@
 
 =head1 VERSION
 
-Version 0.21
+Version 0.22
 
 =cut
 
 our $VERSION;
 BEGIN {
- $VERSION = '0.21';
+ $VERSION = '0.22';
 }
 
 =head1 SYNOPSIS
@@ -35,7 +35,7 @@
     }
     try { ... }; # warns
 
-    no indirect ':fatal';
+    no indirect ':fatal';    # or 'FATAL', or ':Fatal' ...
     if (defied $foo) { ... } # croaks, note the typo
 
     # From the command-line
@@ -49,7 +49,7 @@
 
 When enabled (or disabled as some may prefer to say, since you actually turn it on by calling C<no indirect>), this pragma warns about indirect object syntax constructs that may have slipped into your code.
 
-This syntax is now considered harmful, since its parsing has many quirks and its use is error prone (when C<swoosh> isn't defined, C<swoosh $x> actually compiles to C<< $x->swoosh >>).
+This syntax is now considered harmful, since its parsing has many quirks and its use is error prone (when C<swoosh> is not defined, C<swoosh $x> actually compiles to C<< $x->swoosh >>).
 In L<http://www.shadowcat.co.uk/blog/matt-s-trout/indirect-but-still-fatal>, Matt S. Trout gives an example of an indirect construct that can cause a particularly bewildering error.
 
 It currently does not warn for core functions (C<print>, C<say>, C<exec> or C<system>).
@@ -72,7 +72,7 @@
 
 =head1 METHODS
 
-=head2 C<< unimport [ hook => $hook | ':fatal' ] >>
+=head2 C<< unimport [ hook => $hook | ':fatal', 'FATAL', ... ] >>
 
 Magically called when C<no indirect @opts> is encountered.
 Turns the module on.
@@ -82,7 +82,7 @@
 
 =item *
 
-If it's the string C<':fatal'>, the compilation will croak on the first indirect syntax met.
+If it is a string that matches C</^:?fatal$/i>, the compilation will croak on the first indirect syntax met.
 
 =item *
 
@@ -105,7 +105,7 @@
   my $arg = shift;
   if ($arg eq 'hook') {
    $hook = shift;
-  } elsif ($arg eq ':fatal') {
+  } elsif ($arg =~ /^:?fatal$/i) {
    $hook = sub { die msg(@_) };
   }
   last if $hook;
@@ -175,11 +175,11 @@
 This is useful for disabling C<indirect> in production environments.
 
 Note that clearing this variable after C<indirect> was loaded has no effect.
-If you want to reenable the pragma later, you also need to reload it by deleting the C<'indirect.pm'> entry from C<%INC>.
+If you want to re-enable the pragma later, you also need to reload it by deleting the C<'indirect.pm'> entry from C<%INC>.
 
 =head1 CAVEATS
 
-The implementation was tweaked to work around several limitations of vanilla C<perl> pragmas : it's thread safe, and doesn't suffer from a C<perl 5.8.x-5.10.0> bug that causes all pragmas to propagate into C<require>d scopes.
+The implementation was tweaked to work around several limitations of vanilla C<perl> pragmas : it's thread safe, and does not suffer from a C<perl 5.8.x-5.10.0> bug that causes all pragmas to propagate into C<require>d scopes.
 
 C<meth $obj> (no semicolon) at the end of a file won't be seen as an indirect object syntax, although it will as soon as there is another token before the end (as in C<meth $obj;> or C<meth $obj 1>).
 

Modified: branches/upstream/libindirect-perl/current/t/10-args.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/t/10-args.t?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/t/10-args.t (original)
+++ branches/upstream/libindirect-perl/current/t/10-args.t Wed Aug 18 09:36:02 2010
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 4 + 1 + 1;
+use Test::More tests => 4 + 3 + 1;
 
 BEGIN { delete $ENV{PERL_INDIRECT_PM_DISABLE} }
 
@@ -31,17 +31,17 @@
  is_deeply \@warns, [ ],             'no more warnings without arguments';
 }
 
-{
+for my $fatal (':fatal', 'FATAL', ':Fatal') {
  {
   local $SIG{__WARN__} = sub { die "warn:@_" };
-  eval <<'  HERE';
+  eval <<"  HERE";
    die qq{shouldn't even compile\n};
-   no indirect ':fatal', hook => sub { die 'should not be called' };
-   my $x = new Croaked;
-   $x = new NotReached;
+   no indirect '$fatal', hook => sub { die 'should not be called' };
+   my \$x = new Croaked;
+   \$x = new NotReached;
   HERE
  }
- like $@, expect('Croaked'), 'croaks when :fatal is specified';
+ like $@, expect('Croaked'), "croaks when $fatal is specified";
 }
 
 {

Modified: branches/upstream/libindirect-perl/current/t/20-good.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/t/20-good.t?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/t/20-good.t (original)
+++ branches/upstream/libindirect-perl/current/t/20-good.t Wed Aug 18 09:36:02 2010
@@ -9,12 +9,12 @@
 use strict;
 use warnings;
 
-use Test::More tests => 56 * 8;
+use Test::More tests => 101 * 8;
 
 BEGIN { delete $ENV{PERL_INDIRECT_PM_DISABLE} }
 
 my ($obj, $pkg, $cb, $x, @a);
-our $y;
+our ($y, $meth);
 sub meh;
 sub zap (&);
 
@@ -124,6 +124,12 @@
 ####
 $obj = Hlagh->$cb(sub { 'foo' },  bar => $obj);
 ####
+$obj = Hlagh->$meth;
+####
+$obj =   Hlagh
+   -> 
+          $meth   ( 1,   2   );
+####
 $obj = $pkg->new   ;
 ####
 $obj = $pkg  ->   new  (   );
@@ -151,6 +157,30 @@
 ####
 $obj = $pkg->$cb(qw/foo bar baz/);
 ####
+$obj = $pkg->$meth;
+####
+$obj 
+ =
+    $pkg
+          ->
+              $meth
+  ( 1 .. 10 );
+####
+$obj = $y->$cb;
+####
+$obj =  $y
+  ->          $cb   (
+  'foo', 1, 2, 'bar'
+);
+####
+$obj = $y->$meth;
+####
+$obj =
+  $y->
+      $meth   (
+ qr(hello),
+);
+####
 meh;
 ####
 meh $_;
@@ -187,9 +217,83 @@
 ####
 $x->foo($pkg->$cb)
 ####
-$obj = "apple ${\(new Hlagh)} pear"
-####
-$obj = "apple @{[new Hlagh]} pear"
+$obj = "apple ${\($x->new)} pear"
+####
+$obj = "apple @{[$x->new]} pear"
+####
+$obj = "apple ${\($y->new)} pear"
+####
+$obj = "apple @{[$y->new]} pear"
+####
+$obj = "apple ${\($x->$cb)} pear"
+####
+$obj = "apple @{[$x->$cb]} pear"
+####
+$obj = "apple ${\($y->$cb)} pear"
+####
+$obj = "apple @{[$y->$cb]} pear"
+####
+$obj = "apple ${\($x->$meth)} pear"
+####
+$obj = "apple @{[$x->$meth]} pear"
+####
+$obj = "apple ${\($y->$meth)} pear"
+####
+$obj = "apple @{[$y->$meth]} pear"
+#### # local $_ = "foo";
+s/foo/return; Hlagh->new/e;
+#### # local $_ = "bar";
+s/foo/return; Hlagh->new/e;
+#### # local $_ = "foo";
+s/foo/return; Hlagh->$cb/e;
+#### # local $_ = "bar";
+s/foo/return; Hlagh->$cb/e;
+#### # local $_ = "foo";
+s/foo/return; Hlagh->$meth/e;
+#### # local $_ = "bar";
+s/foo/return; Hlagh->$meth/e;
+#### # local $_ = "foo";
+s/foo/return; $x->new/e;
+#### # local $_ = "bar";
+s/foo/return; $x->new/e;
+#### # local $_ = "foo";
+s/foo/return; $x->$cb/e;
+#### # local $_ = "bar";
+s/foo/return; $x->$cb/e;
+#### # local $_ = "foo";
+s/foo/return; $x->$meth/e;
+#### # local $_ = "bar";
+s/foo/return; $x->$meth/e;
+#### # local $_ = "foo";
+s/foo/return; $y->new/e;
+#### # local $_ = "bar";
+s/foo/return; $y->new/e;
+#### # local $_ = "foo";
+s/foo/return; $y->$cb/e;
+#### # local $_ = "bar";
+s/foo/return; $y->$cb/e;
+#### # local $_ = "foo";
+s/foo/return; $y->$meth/e;
+#### # local $_ = "bar";
+s/foo/return; $y->$meth/e;
+####
+"foo" =~ /(?{Hlagh->new})/;
+####
+"foo" =~ /(?{Hlagh->$cb})/;
+####
+"foo" =~ /(?{Hlagh->$meth})/;
+####
+"foo" =~ /(?{$x->new})/;
+####
+"foo" =~ /(?{$x->$cb})/;
+####
+"foo" =~ /(?{$x->$meth})/;
+####
+"foo" =~ /(?{$y->new})/;
+####
+"foo" =~ /(?{$y->$cb})/;
+####
+"foo" =~ /(?{$y->$meth})/;
 ####
 exec $x $x, @a;
 ####

Modified: branches/upstream/libindirect-perl/current/t/21-bad.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libindirect-perl/current/t/21-bad.t?rev=61712&op=diff
==============================================================================
--- branches/upstream/libindirect-perl/current/t/21-bad.t (original)
+++ branches/upstream/libindirect-perl/current/t/21-bad.t Wed Aug 18 09:36:02 2010
@@ -11,8 +11,8 @@
 
 my ($tests, $reports);
 BEGIN {
- $tests   = 61;
- $reports = 69;
+ $tests   = 82;
+ $reports = 94;
 }
 
 use Test::More tests => 3 * (4 * $tests + $reports) + 4;
@@ -31,8 +31,8 @@
   my ($meth, $obj, $file, $line) = @$_;
   $meth = quotemeta $meth;
   $obj  = ($obj =~ /^\s*\{/) ? "a block" : "object \"\Q$obj\E\"";
-  $file = '\(eval \d+\)' unless defined $file;
-  $line = '\d+'          unless defined $line;
+  $file = '\((?:re_)?eval \d+\)' unless defined $file;
+  $line = '\d+'                  unless defined $line;
   qr/^Indirect call of method "$meth" on $obj at $file line $line/
  } eval $expected;
 }
@@ -98,7 +98,10 @@
     }
    }
 
+SKIP:
    {
+    skip 'No space tests on perl 5.11' => 4 + @expected
+                                                  if $] >= 5.011 and $] < 5.012;
     my $code = $code;
     $code =~ s/\$/\$ \n\t /g;
 
@@ -368,6 +371,86 @@
 ----
 [ 'meh', '$x' ]
 ####
+$obj = "apple ${\(new Hlagh)} pear"
+----
+[ 'new', 'Hlagh' ]
+####
+$obj = "apple @{[new Hlagh]} pear"
+----
+[ 'new', 'Hlagh' ]
+####
+$obj = "apple ${\(new $x)} pear"
+----
+[ 'new', '$x' ]
+####
+$obj = "apple @{[new $x]} pear"
+----
+[ 'new', '$x' ]
+####
+$obj = "apple ${\(new $y)} pear"
+----
+[ 'new', '$y' ]
+####
+$obj = "apple @{[new $y]} pear"
+----
+[ 'new', '$y' ]
+####
+$obj = "apple ${\(new $x qq|${\(stuff $y)}|)} pear"
+----
+[ 'stuff', '$y' ], [ 'new', '$x' ]
+####
+$obj = "apple @{[new $x qq|@{[stuff $y]}|]} pear"
+----
+[ 'stuff', '$y' ], [ 'new', '$x' ]
+#### # local $_ = "foo";
+s/foo/return; new Hlagh/e;
+----
+[ 'new', 'Hlagh' ]
+#### # local $_ = "bar";
+s/foo/return; new Hlagh/e;
+----
+[ 'new', 'Hlagh' ]
+#### # local $_ = "foo";
+s/foo/return; new $x/e;
+----
+[ 'new', '$x' ]
+#### # local $_ = "bar";
+s/foo/return; new $x/e;
+----
+[ 'new', '$x' ]
+#### # local $_ = "foo";
+s/foo/return; new $y/e;
+----
+[ 'new', '$y' ]
+#### # local $_ = "bar";
+s/foo/return; new $y/e;
+----
+[ 'new', '$y' ]
+####
+"foo" =~ /(?{new Hlagh})/;
+----
+[ 'new', 'Hlagh' ]
+####
+"foo" =~ /(?{new $x})/;
+----
+[ 'new', '$x' ]
+####
+"foo" =~ /(?{new $y})/;
+----
+[ 'new', '$y' ]
+####
+"foo" =~ /(??{new Hlagh})/;
+----
+[ 'new', 'Hlagh' ]
+####
+"foo" =~ /(??{new $x})/;
+----
+[ 'new', '$x' ]
+####
+"foo" =~ /(??{new $y})/;
+----
+[ 'new', '$y' ]
+####
 meh { };
 ----
 [ 'meh', '{' ]
@@ -404,3 +487,7 @@
 meh { feh $x; 1; } new Hlagh, feh $y;
 ----
 [ 'feh', '$x' ], [ 'new', 'Hlagh' ], [ 'feh', '$y' ], [ 'meh', '{' ]
+####
+$obj = "apple @{[new { feh $x; meh $y; 1 }]} pear"
+----
+[ 'feh', '$x' ], [ 'meh', '$y' ], [ 'new', '{' ]




More information about the Pkg-perl-cvs-commits mailing list