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