This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl5.git
6 years agospeed up building with less disk IO pod moves+__END__+misc
Daniel Dragan [Sun, 12 Oct 2014 07:42:38 +0000 (03:42 -0400)]
speed up building with less disk IO pod moves+__END__+misc

In Cwd.pm, dont search for pwd on Win32.

Also trim down the list of makefile suffixes on Win32 so it doesn't try
searching for av.pas and perl.f90 and hash.cbl on disk.

Add __END__ tokens to stop the last read() call on the handle which
returns 0 bytes at EOF.

6 years agoremove excess whitespace from warnings.pm
Daniel Dragan [Mon, 13 Oct 2014 02:42:15 +0000 (22:42 -0400)]
remove excess whitespace from warnings.pm

Some lines end with spaces, remove that, use tabs instead of spaces in code
so the perl code is less bytes to read from disk. This patch saved 183
bytes. Part of [perl #122955].

6 years agomove POD in warnings.pm to end of file to reduce module load I/O calls
Daniel Dragan [Mon, 13 Oct 2014 01:57:01 +0000 (21:57 -0400)]
move POD in warnings.pm to end of file to reduce module load I/O calls

warnings.pm is the hottest file/takes the most read() calls of any
module during a make all. By moving POD to the end, ~40KB of OS read()
IO was reduced to ~16KB of OS read() IO calls. Also the parser doesn't need
to search for Perl code in the POD further lessining load time because of
the __END__ token. Filed as [perl #122955].

6 years agosilence warning after "Fold join to const or stringify where possible"
Daniel Dragan [Mon, 13 Oct 2014 19:20:30 +0000 (15:20 -0400)]
silence warning after "Fold join to const or stringify where possible"

VC 2003
op.c(4022) : warning C4244: '=' : conversion from 'unsigned short' to
'char', possible loss of data

6 years ago[perl #122965] aelemfast in list assignment
Father Chrysostomos [Mon, 13 Oct 2014 15:27:02 +0000 (08:27 -0700)]
[perl #122965] aelemfast in list assignment

I accidentally broke ($_[0],$_[1])=($_[1],$_[0]) in be9de18, which was
only supposed to be a refactoring.  Since it now happens later in the
compilation phase when optimisations like aelemfast have happened, the
search for common vars needs to take aelemfast into account.

6 years agoperldelta for 73f4c4f
Father Chrysostomos [Mon, 13 Oct 2014 06:22:39 +0000 (23:22 -0700)]
perldelta for 73f4c4f

6 years agoperldelta for 987c969
Father Chrysostomos [Mon, 13 Oct 2014 06:20:27 +0000 (23:20 -0700)]
perldelta for 987c969

6 years agoperldelta for afc8007
Father Chrysostomos [Mon, 13 Oct 2014 06:17:44 +0000 (23:17 -0700)]
perldelta for afc8007

6 years agoperldelta for split-to-array
Father Chrysostomos [Mon, 13 Oct 2014 06:16:35 +0000 (23:16 -0700)]
perldelta for split-to-array

4ecee20 op.c: Distangle split and common-vars
fd017c0 Optimise @lexarray = split...
ef7999f Optimise my(@array)=split
4574270 opt.t: Test split-to-array optimisation

6 years agoperldelta for 821956c
Father Chrysostomos [Mon, 13 Oct 2014 06:11:16 +0000 (23:11 -0700)]
perldelta for 821956c

6 years agoperldelta for de183bb
Father Chrysostomos [Mon, 13 Oct 2014 06:08:58 +0000 (23:08 -0700)]
perldelta for de183bb

6 years agoperldelta for bcff414
Father Chrysostomos [Mon, 13 Oct 2014 06:06:23 +0000 (23:06 -0700)]
perldelta for bcff414

6 years agoperldelta for deparsing with CORE:: prefix
Father Chrysostomos [Mon, 13 Oct 2014 06:05:47 +0000 (23:05 -0700)]
perldelta for deparsing with CORE:: prefix

3188a82 Deparse with CORE:: to avoid lex sub conflicts
e54915d Deparse sub calls quietly
7741cee Finish deparsing ‘my sub if; CORE::if...’

6 years agoperldelta for a21eb52
Father Chrysostomos [Mon, 13 Oct 2014 06:02:05 +0000 (23:02 -0700)]
perldelta for a21eb52

6 years agoperldelta for 4c62787/#122771
Father Chrysostomos [Mon, 13 Oct 2014 06:00:40 +0000 (23:00 -0700)]
perldelta for 4c62787/#122771

6 years agoperldelta for f8a7cce and 88a758b
Father Chrysostomos [Mon, 13 Oct 2014 05:57:50 +0000 (22:57 -0700)]
perldelta for f8a7cce and 88a758b

6 years agoperldelta for 2258401
Father Chrysostomos [Mon, 13 Oct 2014 05:56:11 +0000 (22:56 -0700)]
perldelta for 2258401

6 years agoperldelta for f351564 and 5f4d849
Father Chrysostomos [Mon, 13 Oct 2014 02:39:36 +0000 (19:39 -0700)]
perldelta for f351564 and 5f4d849

6 years agoperldelta for c8ec376
Father Chrysostomos [Mon, 13 Oct 2014 02:39:09 +0000 (19:39 -0700)]
perldelta for c8ec376

6 years agoperldelta for c997e36 and 6bd144e0f
Father Chrysostomos [Mon, 13 Oct 2014 02:28:52 +0000 (19:28 -0700)]
perldelta for c997e36 and 6bd144e0f

6 years agoperldelta for 157fb5a
Father Chrysostomos [Mon, 13 Oct 2014 01:11:48 +0000 (18:11 -0700)]
perldelta for 157fb5a

6 years agoperldelta for 1e9a122
Father Chrysostomos [Mon, 13 Oct 2014 01:09:10 +0000 (18:09 -0700)]
perldelta for 1e9a122

6 years agoperldelta for 8fb0127
Father Chrysostomos [Mon, 13 Oct 2014 01:07:12 +0000 (18:07 -0700)]
perldelta for 8fb0127

6 years agoUpdate perlguts for PADMY changes
Father Chrysostomos [Mon, 13 Oct 2014 01:05:45 +0000 (18:05 -0700)]
Update perlguts for PADMY changes

6 years agoperlguts typo
Father Chrysostomos [Mon, 13 Oct 2014 01:04:38 +0000 (18:04 -0700)]
perlguts typo

6 years agoperldelta for PADMY changes
Father Chrysostomos [Mon, 13 Oct 2014 01:02:44 +0000 (18:02 -0700)]
perldelta for PADMY changes

145bf8e Remove most uses of PADMY
a9f1090 Peek.t should not expect PADMY under 5.21.5
c068384 Stop setting PADMY; renumber PADSTALE

6 years agoperldelta for ecf05a5
Father Chrysostomos [Mon, 13 Oct 2014 01:01:19 +0000 (18:01 -0700)]
perldelta for ecf05a5

6 years agoB: Document GPFLAGS
Father Chrysostomos [Mon, 13 Oct 2014 00:58:32 +0000 (17:58 -0700)]
B: Document GPFLAGS

6 years agoperldelta for 14d9114
Father Chrysostomos [Mon, 13 Oct 2014 00:56:22 +0000 (17:56 -0700)]
perldelta for 14d9114

6 years agoperldelta for 926f5fc
Father Chrysostomos [Sun, 12 Oct 2014 21:56:46 +0000 (14:56 -0700)]
perldelta for 926f5fc

6 years agoperldelta for a623f8939
Father Chrysostomos [Sun, 12 Oct 2014 21:53:29 +0000 (14:53 -0700)]
perldelta for a623f8939

6 years agoTru64: S_mulexp10 overflow help.
Jarkko Hietaniemi [Sun, 12 Oct 2014 21:43:48 +0000 (17:43 -0400)]
Tru64: S_mulexp10 overflow help.

6 years agoinfnan: if the mulexp10 value goes to zero, return it.
Jarkko Hietaniemi [Sun, 12 Oct 2014 21:11:02 +0000 (17:11 -0400)]
infnan: if the mulexp10 value goes to zero, return it.

6 years agoperldelta for e78728e52f52
Tony Cook [Sun, 12 Oct 2014 23:14:28 +0000 (10:14 +1100)]
perldelta for e78728e52f52

6 years agoAdd support for Linux pipe buffer size fcntl commands
Dagfinn Ilmari Mannsåker [Wed, 8 Oct 2014 19:58:05 +0000 (20:58 +0100)]
Add support for Linux pipe buffer size fcntl commands

This lets us make t/io/eintr.t more reliable by making sure we're
actually writing more than the buffer size.

6 years agoTest croaks inadvertently rmvd by bd2688c4c
Father Chrysostomos [Sun, 12 Oct 2014 18:23:54 +0000 (11:23 -0700)]
Test croaks inadvertently rmvd by bd2688c4c

6 years agoRevert "op.c: Don’t keep looping when we see potential common vars"
Father Chrysostomos [Sun, 12 Oct 2014 18:22:49 +0000 (11:22 -0700)]
Revert "op.c: Don’t keep looping when we see potential common vars"

This reverts commit bd2688c4c50527e5796ba4bc132c379f11e57112.

It seemed like an obvious optimisation, until it dawned on me that
this loop is doing two things, not just searching for common vars.

6 years agoOptimise "@_" to a single join
Father Chrysostomos [Sun, 12 Oct 2014 15:10:41 +0000 (08:10 -0700)]
Optimise "@_" to a single join

instead of stringify(join(...)).

6 years agoopt.t: Test split-to-array optimisation
Father Chrysostomos [Sun, 12 Oct 2014 13:58:11 +0000 (06:58 -0700)]
opt.t: Test split-to-array optimisation

6 years agoperldiag: Fix typo
Karl Williamson [Sun, 12 Oct 2014 15:53:24 +0000 (09:53 -0600)]
perldiag: Fix typo

6 years agodump.c: Dump pmop patterns without trailing )
Father Chrysostomos [Sun, 12 Oct 2014 13:48:08 +0000 (06:48 -0700)]
dump.c: Dump pmop patterns without trailing )

6 years agoUse full name for Perl_tmps_grow_p in EXTEND_MORTAL
Father Chrysostomos [Sun, 12 Oct 2014 13:36:31 +0000 (06:36 -0700)]
Use full name for Perl_tmps_grow_p in EXTEND_MORTAL

For functions only exported and not public, we can’t use the short
forms in pubic macros.

6 years agoTest that my($self)=@_ uses no-common-vars optimisation
Father Chrysostomos [Sat, 11 Oct 2014 17:40:52 +0000 (10:40 -0700)]
Test that my($self)=@_ uses no-common-vars optimisation

IIRC, this was broken in 5.10.0, but I don’t have a 5.10.0 around to
confirm (only 5.10.1).

6 years agoFold join to const or stringify where possible
Father Chrysostomos [Sat, 11 Oct 2014 08:21:12 +0000 (01:21 -0700)]
Fold join to const or stringify where possible

Due to the exigencies of the implementation, "$_->$*" ends up with a
join op (join $", $$_), which is unnecessary.  This gave me the idea
of folding it where possible (instead of trying to tackle it in
toke.c), which would also make explicit joins benefit, too.

If the arguments are a simple scalar or constant followed by a
single-item list, then the join can become a stringify, and the sepa-
rator can simply disappear.

Further (and this is unrelated to "$_->$*"), if all of join’s argu-
ments are constant, the whole thing can be folded to a const op.

6 years agoOptimise my(@array)=split
Father Chrysostomos [Sun, 12 Oct 2014 07:20:26 +0000 (00:20 -0700)]
Optimise my(@array)=split

Even though we can’t optimise away the array op for my(@array),
local(@array), and @{foo()}, we can still optimise away the assign-
ment.  Just have split pop the array off the stack and Bob’s
your Uncle.

6 years agoOptimise @lexarray = split...
Father Chrysostomos [Sun, 12 Oct 2014 06:33:40 +0000 (23:33 -0700)]
Optimise @lexarray = split...

‘@pkgary = split //, $foo’ gets optimised such that the split writes
directly to the array and the assignment doesn’t have to happen.

This commit makes it work also with lexical arrays.  It only works for
arrays declared previously; ‘my @a = split’ doesn’t get optimised,
just as ‘local @a = split’ doesn’t.

The pad offset is stored in the op_targ field of the pushre op, just
as the GV is stored in its op_pmreplrootu field.

6 years agoperlref: Document lvalue slice refs
Father Chrysostomos [Sun, 12 Oct 2014 06:24:00 +0000 (23:24 -0700)]
perlref: Document lvalue slice refs

Something I missed.

6 years agoClarify two panic perldiag entries
Father Chrysostomos [Sun, 12 Oct 2014 06:22:24 +0000 (23:22 -0700)]
Clarify two panic perldiag entries

6 years agopp.c:pp_split: Remove redundant !s
Father Chrysostomos [Sun, 12 Oct 2014 06:17:43 +0000 (23:17 -0700)]
pp.c:pp_split: Remove redundant !s

SvPV always returns something (or croaks), so s cannot be null here.

6 years agoFix ()=@a=split
Father Chrysostomos [Sun, 12 Oct 2014 00:17:32 +0000 (17:17 -0700)]
Fix ()=@a=split

@a=split//,$foo gets optimised such that split writes directly to
the array and the list assignment doesn’t happen.  In fact, the list
assignment is completetly removed from the op tree:

$ ./perl -Ilib -MO=Concise -e '@a=split//,$foo'
7  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
6     <@> split[t2] vK/IMPLIM ->7
3        </> pushre(/""/ => @a) s/RTIME ->4
-        <1> ex-rv2sv sK/1 ->5
4           <$> gvsv(*foo) s ->5
5        <$> const(IV 0) s ->6
-e syntax OK

(There would have been aassign where you see split if the optimisation
had not happened.)

($a,$b,$c) = split... optimises split by setting its limit argument
automatically so it doesn’t bother splitting into more parts than
necessary.

The latter optimisation was doing the wrong thing for () = @a = split,
because the @a=split on the rhs was being optimised down to a split
op.  Then the limit optimisation would see an empty (or short) list on
the lhs and a split op on the rhs and see it as a candidate for lim-
ited split.  So too few items would be assigned to the array.

We need to check whether the split on the rhs is a split-to-array
first before doing the limit optimisation.  (If it is, then don’t
optimise.)

This breaks one of my JAPHs:

()=@==split" ","Just another Perl hacker,\n";
print reverse@=

6 years agoinfnan: test overflows and underflows.
Jarkko Hietaniemi [Thu, 9 Oct 2014 21:35:32 +0000 (23:35 +0200)]
infnan: test overflows and underflows.

6 years ago[Merge] Lvalue references
Father Chrysostomos [Sat, 11 Oct 2014 17:24:33 +0000 (10:24 -0700)]
[Merge] Lvalue references

Also:
• Single refgen optimisation now applies to \@ \% \& as well.
• split-to-array no longer runs the risk of clobbering its argument
  and returning junk.
• The split-to-array optimisation happens more often than before.
• foreach my $x is no longer subject to the list-assignment-after-ali-
  asing bug (#89646).

6 years agoDocument lvalue references
Father Chrysostomos [Sat, 11 Oct 2014 07:00:55 +0000 (00:00 -0700)]
Document lvalue references

6 years agoMake Deparse.t more tolerant of our @F vs our(@F)
Father Chrysostomos [Sat, 11 Oct 2014 05:16:38 +0000 (22:16 -0700)]
Make Deparse.t more tolerant of our @F vs our(@F)

Currently B::Deparse deparses ‘our @F;’ as ‘our @F;’, but ‘our @F =...’
as ‘our(@F) = ...’, adding parentheses.  For split-to-array, it just
happens to omit the parentheses, because there is no list op for it
to process, and it is when processing a list op that it decides to put
them there.  While it could be changed to omit the parentheses for the
list or add them for split-to-array, for now just make the test more
tolerant, as this is just a cosmetic difference.

6 years agoExtend lex alias detection to foreach, too
Father Chrysostomos [Sat, 11 Oct 2014 04:52:37 +0000 (21:52 -0700)]
Extend lex alias detection to foreach, too

Now that I have added a mechanism for detecting lexical aliases in
list assignments, we can extend that to foreach, too, to fix another
instance of the list-assignment-after-aliasing bug.

6 years agoSkip no-common-vars optimisation for lex aliases
Father Chrysostomos [Sat, 11 Oct 2014 04:48:48 +0000 (21:48 -0700)]
Skip no-common-vars optimisation for lex aliases

6 years agoop.c: Move common vars check into the peephole optimiser
Father Chrysostomos [Fri, 10 Oct 2014 23:44:58 +0000 (16:44 -0700)]
op.c: Move common vars check into the peephole optimiser

Putting it this late in the compilation phase will facilitate checking
for lexical aliases, too.

6 years agoUpdate B-Debug’s tests for split optimisation
Father Chrysostomos [Fri, 10 Oct 2014 23:37:00 +0000 (16:37 -0700)]
Update B-Debug’s tests for split optimisation

This will have to be submitted upstream after this branch is merged.

6 years agoop.c: Distangle split and common-vars
Father Chrysostomos [Fri, 10 Oct 2014 15:45:29 +0000 (08:45 -0700)]
op.c: Distangle split and common-vars

The split-to-array optimisation was being skipped if the assignment
referenced the same variable on both sides, or if it referenced @_
(since @_ aliases other vars).  This was to prevent split from freeing
its own argument when writing to the array.

As the previous commit shows, that didn’t actually work properly, and
so that commit used a different means to work around that problem.

So now there is no reason to skip the optimisation in such cases.

    @_ = split;
    @a = split //, $a[0];

now optimise away the assignment.

(This also allows me to move the common-vars check into the peep-
hole optimiser, where it needs to be to work correctly with lexi-
cal aliases.)

6 years agoMake split temporarily refcnt its argument
Father Chrysostomos [Fri, 10 Oct 2014 15:39:49 +0000 (08:39 -0700)]
Make split temporarily refcnt its argument

In this example, the @a=split... is optimised so that split writes to
@a directly:

*a = *b;
$a[1] = "foobarbaz";
@a = split //, $b[1];
print "@a\n";

But since @a and @b are the same, $b[1] gets freed even before the
split occurs.  This just happens to work, because copy-on-write saves
the day, since the buffer is still valid, the "foobarbaz" constant
still holding on to it.

This modified example gives me junk:

*a = *b;
$a[1] = "foobarbaz";
$a[1] .= "";
@a = split //, $b[1];
print "@a\n";

The easiest solution is to make pp_split hold a temporary reference
count on the SV.

This will also allow the split optimisation to be disentangled from
the common-vars pessimisation (which fails here anyway).  And *that*
will allow the common-vars pessimisation to take lexical aliases
into account.

6 years agoop.c:newASSIGNOP: Rmv LINKLIST call
Father Chrysostomos [Fri, 10 Oct 2014 05:05:15 +0000 (22:05 -0700)]
op.c:newASSIGNOP: Rmv LINKLIST call

Originally, aassign_common_vars used LINKLIST itself because it
was following op_next pointers.  That changed in 3023b5f30, so the
LINKLIST was moved outside that function.

The LINKLIST call could not simply have been deleted, because the
split optimisation that follows assumes that it has been called and
fixes up an op_next pointer.

If we remove the LINKLIST call *and* the op_next fix-up, then every-
thing works.  The op_next fix-up was only happening to begin with
because of LINKLIST.

6 years agoop.c: Don’t keep looping when we see potential common vars
Father Chrysostomos [Fri, 10 Oct 2014 04:54:12 +0000 (21:54 -0700)]
op.c: Don’t keep looping when we see potential common vars

When we loop through the list in LIST=..., once we have decided that
we need to do the more thorough check for common vars we don’t reverse
that decision based on subsequent ops, so there is no point in con-
tinuing to loop through them.

6 years agolvref.t: Remove special TODO code
Father Chrysostomos [Thu, 9 Oct 2014 22:53:53 +0000 (15:53 -0700)]
lvref.t: Remove special TODO code

We no longer have a plethora of to-do tests, so this specialised code
no longer gains us anything.

6 years agoStore internal state of state vars separately
Father Chrysostomos [Thu, 9 Oct 2014 22:51:18 +0000 (15:51 -0700)]
Store internal state of state vars separately

Use a separate pad entry to record whether a state variable has been
initialised, instead of using a flag on the value.

This prevents \$state_var = \$some_other_var from interfering with
that internal state.  It probably also fixes some cases with foreach
as well, but I have not confirmed.

6 years agolvref.t: More list and cond tests
Father Chrysostomos [Thu, 9 Oct 2014 21:07:35 +0000 (14:07 -0700)]
lvref.t: More list and cond tests

6 years agoDeparse lvalue references
Father Chrysostomos [Tue, 7 Oct 2014 05:12:27 +0000 (22:12 -0700)]
Deparse lvalue references

6 years agolvref.t: Remove temporary eval & skip
Father Chrysostomos [Sat, 4 Oct 2014 13:35:29 +0000 (06:35 -0700)]
lvref.t: Remove temporary eval & skip

6 years agolvref.t: Fix hash elem tests
Father Chrysostomos [Sat, 4 Oct 2014 13:31:11 +0000 (06:31 -0700)]
lvref.t: Fix hash elem tests

I was testing against a package hash for the ‘lexical’ tests.

6 years agoHandle state vars correctly in ref assignment
Father Chrysostomos [Sat, 4 Oct 2014 02:50:45 +0000 (19:50 -0700)]
Handle state vars correctly in ref assignment

Only \state(@_) was handling this correctly, as pp_lvavref
calls pp_padav.

6 years agolvref.t: Tests for \my assignment and scope exit
Father Chrysostomos [Fri, 3 Oct 2014 23:33:55 +0000 (16:33 -0700)]
lvref.t: Tests for \my assignment and scope exit

6 years agoRework lvref.t foreach tests
Father Chrysostomos [Fri, 3 Oct 2014 19:40:23 +0000 (12:40 -0700)]
Rework lvref.t foreach tests

Remove the to-do marker.

Add tests for package vars, too.

Redo the \my &a test.  I’ve decided not to bother with the ‘my &a’
syntax for now (if at all).  It is problematic and needs discussion.
(If ‘my &a’ is allowed in foreach, then it should be allowed else-
where, but ‘my &a;’ would call a stub.)

6 years agoGet foreach \&foo working
Father Chrysostomos [Fri, 3 Oct 2014 19:29:35 +0000 (12:29 -0700)]
Get foreach \&foo working

Previously these would crash.  Usually, &foo is wrapped in an entersub
op which gets converted to rv2cv when refgen applies lvalue context.
In foreach \&foo, there is no need for us to go the entersub route;
rather we pass the original rv2cv op directly to refgen without the
entersub wrapping.  So the resulting op tree is different.  S_lvref
was not expecting this alternate op tree.

6 years agoforeach \$var
Father Chrysostomos [Fri, 3 Oct 2014 05:38:27 +0000 (22:38 -0700)]
foreach \$var

Some passing tests are still marked to-do.  We need more tests still.

6 years agoAdd OPpLVREF_ITER flag
Father Chrysostomos [Fri, 3 Oct 2014 04:49:28 +0000 (21:49 -0700)]
Add OPpLVREF_ITER flag

An lvalue reference used as an iterator variable will be implemented
using an lvref op with this flag set.

6 years agoFix err message for $cond ? \bad : ... = ...
Father Chrysostomos [Thu, 2 Oct 2014 03:18:06 +0000 (20:18 -0700)]
Fix err message for $cond ? \bad : ... = ...

The error message code in S_lvref was assuming that it only handled
list assignment (which was originally the case), but

    $condition ? \pos : whatever = ...

goes through that same code path, and that is a scalar assignment.

So pass the assignment type through to S_lvref.

6 years agoSubroutine reference assignment
Father Chrysostomos [Thu, 2 Oct 2014 03:00:10 +0000 (20:00 -0700)]
Subroutine reference assignment

6 years agolvref.t: Repeat bad ref tests with list assignment
Father Chrysostomos [Thu, 2 Oct 2014 01:15:16 +0000 (18:15 -0700)]
lvref.t: Repeat bad ref tests with list assignment

List assignment goes through a different code path.  The errors come
from magic_setlvref in that case, not pp_refassign.

6 years agolvref.t: do-block err msg is no longer to-do
Father Chrysostomos [Wed, 1 Oct 2014 05:28:48 +0000 (22:28 -0700)]
lvref.t: do-block err msg is no longer to-do

The previous commit’s rearrangement of things fixed this, too.

6 years agoMake \( ?: ) assignment work
Father Chrysostomos [Wed, 1 Oct 2014 05:20:56 +0000 (22:20 -0700)]
Make \( ?: ) assignment work

When I first implemented list assignment to lvalue references, I
thought I could simply modify the kids of the refgen op (\) in one
spot.  But things like ?: make it necessary to do this recursively.
So all that code for turning thingies into lvrefs has been moved into
a separate function patterned after op_lvalue but handling only the
lvref cases.

(I thought about combining it with op_lvalue’s switch statement, but
that would require ‘if(type == OP_LVREF) goto nomod;’ too many times,
which would be harder to maintain.)

6 years agolvref.t: Remove unnecessary evals
Father Chrysostomos [Tue, 30 Sep 2014 17:28:32 +0000 (10:28 -0700)]
lvref.t: Remove unnecessary evals

6 years agoGet basic $cond ? \$a : \$b = ... working
Father Chrysostomos [Tue, 30 Sep 2014 17:27:34 +0000 (10:27 -0700)]
Get basic $cond ? \$a : \$b = ... working

When I started working on lvalue references, I envisioned having all
scalar assignments pass through pp_refassign.  A refassign op repre-
sents the initial backslash on the lhs *and* the equals sign.  For
cases like this, there is no single refgen on the lhs.  It turns out
that the approach I am using for list assignments (where the lhs
becomes an lvref op that returns a magic scalar that does the aliasing
when assigned to) is the easiest way to get this working, too.

All this commit has to do is allow ‘sassign’ lvalue context to apply
to srefgen and fix the completely broken to-do tests.  (I have a ten-
dency to write broken to-do tests, as I have no way of testing them at
the time.)

6 years agoAssignment to \(@array)
Father Chrysostomos [Tue, 30 Sep 2014 05:21:21 +0000 (22:21 -0700)]
Assignment to \(@array)

This is a slurpy lvalue that gobbles up all the rhs elements, which
are expected to be references.  So \(@a)=\(@b) makes @a share the
same elements as @b.

We implement this by pushing a null on to the stack as a special
marker that pp_aassign will recognise.

I decided to change the wording for the \local(@a)=... error
slightly, from what my to-do tests had.

Some of the other to-do tests were badly written and had to be
fixed up a bit.

6 years agolvavref needs OPpLVAL_INTRO and OPpPAD_STATE
Father Chrysostomos [Tue, 30 Sep 2014 05:23:22 +0000 (22:23 -0700)]
lvavref needs OPpLVAL_INTRO and OPpPAD_STATE

6 years agoAdd lvavref op type
Father Chrysostomos [Tue, 30 Sep 2014 04:43:53 +0000 (21:43 -0700)]
Add lvavref op type

This will be used for slurpy array ref assignments.  \(@a) = \(@b)
will make @a share the same elements as @b.

6 years agolvref is actually a baseop/unop
Father Chrysostomos [Tue, 30 Sep 2014 04:40:28 +0000 (21:40 -0700)]
lvref is actually a baseop/unop

When used for pad vars, it is childless.

6 years agoList assignment to array and hash refs
Father Chrysostomos [Tue, 30 Sep 2014 01:03:57 +0000 (18:03 -0700)]
List assignment to array and hash refs

(\@a,\%h)=... works, but \(@a) and \(%h) do not.  \(%h) correctly
croaks.  (\local @a, \local %h)=... also works.

6 years agoRenumber OPpLVREF_TYPE
Father Chrysostomos [Mon, 29 Sep 2014 22:48:24 +0000 (15:48 -0700)]
Renumber OPpLVREF_TYPE

to avoid conflicting with OPpPAD_STATE.

6 years agoAssignment to \local @array and \local %hash
Father Chrysostomos [Mon, 29 Sep 2014 05:17:27 +0000 (22:17 -0700)]
Assignment to \local @array and \local %hash

Doesn’t work with lhs parentheses yet.

6 years agolvref.t: Tests for localised arrays and hashes
Father Chrysostomos [Sun, 28 Sep 2014 18:45:57 +0000 (11:45 -0700)]
lvref.t: Tests for localised arrays and hashes

6 years agolvref.t: Test assigning non-array to array
Father Chrysostomos [Sun, 28 Sep 2014 07:53:19 +0000 (00:53 -0700)]
lvref.t: Test assigning non-array to array

Same with hashes.

6 years agoSimple \@array and \%hash assignment
Father Chrysostomos [Sun, 28 Sep 2014 07:52:45 +0000 (00:52 -0700)]
Simple \@array and \%hash assignment

Parentheses do not work yet.  Neither does local.

6 years agolvref.t: To-do tests for hashes
Father Chrysostomos [Sun, 28 Sep 2014 07:42:09 +0000 (00:42 -0700)]
lvref.t: To-do tests for hashes

Concerning the error message tests, ‘parenthesized hash’ would be more
helpful than ‘hash dereference’ or ‘private hash’ (as would be provided
by OP_DESC), as %foo doesn’t look like a hash dereference and ‘private
hash’ suggests that \%foo= won’t work, whereas it will.

6 years agoAdd priv flags for the type of lvalue ref
Father Chrysostomos [Sun, 28 Sep 2014 05:03:25 +0000 (22:03 -0700)]
Add priv flags for the type of lvalue ref

6 years agolvref.t: To-do tests for array ref assignment
Father Chrysostomos [Sun, 28 Sep 2014 01:44:57 +0000 (18:44 -0700)]
lvref.t: To-do tests for array ref assignment

The evals are temporary.  Some of the tests don’t even make sense
with the evals; they are more placeholders and reminders for now
that tests.

6 years agopp.c: Fold SvIV into S_localise_aelem_lval
Father Chrysostomos [Sat, 27 Sep 2014 21:17:09 +0000 (14:17 -0700)]
pp.c: Fold SvIV into S_localise_aelem_lval

All three callers were doing SvIV, so we can do it in one spot.

6 years agopp.c: Some branch prediction hints
Father Chrysostomos [Sat, 27 Sep 2014 21:15:50 +0000 (14:15 -0700)]
pp.c: Some branch prediction hints

6 years agoAssignment to hash element refs
Father Chrysostomos [Sat, 27 Sep 2014 21:15:00 +0000 (14:15 -0700)]
Assignment to hash element refs

6 years agopp.c: Consolidate some local aelem code
Father Chrysostomos [Sat, 27 Sep 2014 18:07:35 +0000 (11:07 -0700)]
pp.c: Consolidate some local aelem code

In the process, avoid a redundant av_fetch for \local$a[0]= and
\local($a[0])=.

6 years agopp.c:pp_lvrefslice: Unused var
Father Chrysostomos [Sat, 27 Sep 2014 17:49:46 +0000 (10:49 -0700)]
pp.c:pp_lvrefslice: Unused var

6 years ago\local $a[$ix] assignment
Father Chrysostomos [Sat, 27 Sep 2014 17:49:24 +0000 (10:49 -0700)]
\local $a[$ix] assignment