summaryrefslogtreecommitdiff
path: root/ext/B/t
Commit message (Collapse)AuthorAgeFilesLines
* Add a few helpers to B for INVLISTNicolas R2020-11-101-0/+65
| | | | | | | | | | | | | This commit provide some basic method to access to internal fields from one INVLIST: SVt_INVLIST - prev_index - is_offset - array_len - get_invlist_array This allows B::C to be walk and save invlists.
* Make Exporter strict and warnings compliantTodd Rinaldo2020-10-051-285/+431
| | | | Update optree_specials since OptreeCheck.pm uses Exporter.
* B: Remove 5005threads vestiges from testsDagfinn Ilmari Mannsåker2020-08-102-27/+6
| | | | | | Also remove long-obsolete comment about `usethreads` vs `use(i|5005)threads`. It is no longer possible to configure perl with "threads" without an actual implementation, and ponie is long dead.
* Widen the feature bundle hint mask to 4 bitsDagfinn Ilmari Mannsåker2020-08-041-1/+1
| | | | | | VMS only uses two bits for its hints, so we can steal one more for the feature bundles. This is necessary if we want to remove features from a future bundle, e.g. `indirect` and `switch`.
* B: Remove duplicate check for split op in walkoptree.tDagfinn Ilmari Mannsåker2020-05-221-2/+2
| | | | | | Commit 5012eebe558 eliminated the pushre op and did a blanket replacement of pushre with split, but missed that there was already a check for split in the loop. Eliminate the duplicate.
* B::perlstring - add support for \e (Fix #17526)Yves Orton2020-02-041-0/+41
| | | | | | | | | | | | | | | | | | | | | | | | In daf6caf1ef25ff48f871fa1e53adcefc11bf1d08 karl made pv_uni_display() use the available mnemonic escapes instead of using \x{} style escapes. This broke B::perlstring() which has an exclusion list of such escapes to passthrough, and it did not know about \e, so it produced "\\e" instead of "\e", which of course does not round trip. This in turn broke Sub::Quote, which in turn breaks Moo, which breaks a lot of stuff. :-) Unfortunately B::perlstring() had no tests to detect this, so we only found out when we got a BBC report that happened to also ticklet this bug. This patch adds 'e' to the exclusion list, and also adds tests to see that the the first 1024 unicode codepoints and all 255 non-unicode codepoints can round trip through B::perlstring(). This should resolve #17526 and indirectly help us close #17245. With this patch we bump B.pm to v1.80
* pv_uni_display: Use common fcn; \b mnemonicKarl Williamson2020-01-231-1/+0
| | | | | | | | | | | This removes the (almost) duplicate code in this function to display mnemonics for control characters that have them. The reason the two pieces of code aren't precisely the same is that the other function also uses \b as a mnemonic for backspace. Using all possible mnemonics is desirable, so a flag is added for pv_uni_display to now use \b. This is now by default enabled in double-quoted strings, but not regex patterns (as \b there means something quite different except in character classes). B.pm is changed to expect \b.
* OP_MULTIDEREF: avoid trailing null aux byteDavid Mitchell2020-01-021-0/+14
| | | | | | | | | | | | | | | | | | | | | | | GH #17301 The aux array in an OP_MULTIDEREF op consists of an action word containing as many actions as will fit shifted together, followed by words containing the arguments for those actions. Then another action word, and so on. The code in S_maybe_multideref() which creates those ops was reserving a new slot in the aux array for a new action word when the old one became full. If it then turned out that no more actions were needed, this extra slot was harmlessly filled with a zero. However it turns out that the B::UNOP_AUX::aux_list() introspection method would, under those circumstances, claim to have returned one more SV on the stack than it actually had, leading to SEGVs etc. I could have fixed aux_list() directly to cope with an extra null word, but instead I did the more general fix of ensuring that S_maybe_multideref() never adds an extra null word in the first place. The test added to ext/B/t/b.t fails before this commit; the new test in lib/B/Deparse.t doesn't, but was added for completeness.
* Un-revert "[MERGE] add+use si_cxsubix field"David Mitchell2019-09-236-44/+44
| | | | | | | | original merge commit: v5.31.3-198-gd2cd363728 reverted by: v5.31.4-0-g20ef288c53 The commit following this commit fixes the breakage, which that means the revert can be undone.
* Revert "[MERGE] add+use PL_curstackinfo->si_cxsubix field"v5.31.4Max Maischein2019-09-206-44/+44
| | | | | | | | | | | | This reverts commit d2cd363728088adada85312725ac9d96c29659be, reversing changes made to 068b48acd4bdf9e7c69b87f4ba838bdff035053c. This change breaks installing Test::Deep: ... not ok 37 - Test 'isa eq' completed ok 38 - Test 'isa eq' no premature diagnostication ...
* set VOID on OP_ENTERDavid Mitchell2019-09-196-44/+44
| | | | | | | | The OP_ENTER planted at the start of a program (and possibly elsewhere) gets left as UNKNOWN context rather than VOID context, due to op_scope() not honouring the current context. Fixing this makes things infinitesimally faster.
* PERL_OP_PARENT is always defined, stop testing for itTony Cook2019-01-251-3/+1
| | | | | | | | PERL_OP_PARENT is the new reality, leaving the pre-processor checks is more confusing that anything else. I left the test in perl.c for consistency with the other checks in that code.
* Make ext/B/t/strict.t test alike to other ones.Petr Písař2018-12-071-1/+1
| | | | | | Signed-off-by: Petr Písař <ppisar@redhat.com> For: RT 133713
* revert smartmatch to 5.27.6 behaviourZefram2017-12-292-12/+12
| | | | | | | | | | | | | The pumpking has determined that the CPAN breakage caused by changing smartmatch [perl #132594] is too great for the smartmatch changes to stay in for 5.28. This reverts most of the merge in commit da4e040f42421764ef069371d77c008e6b801f45. All core behaviour and documentation is reverted. The removal of use of smartmatch from a couple of tests (that aren't testing smartmatch) remains. Customisation of a couple of CPAN modules to make them portable across smartmatch types remains. A small bugfix in scope.c also remains.
* remove unused CXp_FOR_DEF and OPpITER_DEFZefram2017-11-292-12/+12
| | | | | These were used to identify foreach loops that qualify as topicalizers. That's no longer a relevant classification.
* rip out quicksort and sort algorithm controlZefram2017-11-172-43/+1
| | | | [perl #119635]
* fix ext/B/t/optree_specials.tDavid Mitchell2017-11-141-12/+18
| | | | | | | | | recent changes to expected output didn't account for the way nextstate ops change their hints display when run under LC_ALL=en_US.UTF-8 PERL_UNICODE="" One day we'll make this automatic.
* rip out Perl version portability from BZefram2017-11-147-274/+94
| | | | | B is distributed only with the core, not dual-life, so has no need to be portable between Perl versions.
* in B::Concise, show RV target betterZefram2017-11-142-6/+33
| | | | | Especially show the identity of CVs where possible. This is important now that gv ops often point at a coderef rather than a glob. Fixes [perl
* Replace multiple 'use vars' by 'our' in extNicolas R2017-11-113-6/+5
| | | | | | | | Using vars pragma is discouraged and has been superseded by 'our' declarations available in Perl v5.6.0 or later. This commit is about replacing the usage of 'vars' pragma by 'our' in 'ext' directory.
* Bump version of B/t/OptreeCheck to 0.16Karl Williamson2017-11-081-1/+1
|
* ext/B/t/strict.t: Assure B.pm and O.pm pass strict and warnings checks.Todd Rinaldo2017-11-081-0/+30
| | | | | We need to test these in unit tests since they do not load these modules to prevent pollution of the stash in compilers.
* Remove unnecessary module loads from B and OTodd Rinaldo2017-11-082-253/+444
| | | | | | | | | | This commit removes multiple unnecessary modules so that perl -MO= can hand back to compile as cleanly as possible. This change caused significant jitter in tests for B::Concise. While updating the test to the new reality, OptreeCheck.pm was corrected to stop stripping regexes off $got when it started failing so it would be easier to see where the failure happened.
* fix ext/B/t/optree_samples.tDavid Mitchell2017-10-311-1/+1
| | | | The recent OP_MULTICONCAT merge broke it under PERL_UNICODE=""
* Add OP_MULTICONCAT opDavid Mitchell2017-10-311-97/+89
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Allow multiple OP_CONCAT, OP_CONST ops, plus optionally an OP_SASSIGN or OP_STRINGIFY, to be combined into a single OP_MULTICONCAT op, which can make things a *lot* faster: 4x or more. In more detail: it will optimise into a single OP_MULTICONCAT, most expressions of the form LHS RHS where LHS is one of (empty) my $lexical = $lexical = $lexical .= expression = expression .= and RHS is one of (A . B . C . ...) where A,B,C etc are expressions and/or string constants "aAbBc..." where a,A,b,B etc are expressions and/or string constants sprintf "..%s..%s..", A,B,.. where the format is a constant string containing only '%s' and '%%' elements, and A,B, etc are scalar expressions (so only a fixed, compile-time-known number of args: no arrays or list context function calls etc) It doesn't optimise other forms, such as ($a . $b) . ($c. $d) ((($a .= $b) .= $c) .= $d); (although sub-parts of those expressions might be converted to an OP_MULTICONCAT). This is partly because it would be hard to maintain the correct ordering of tie or overload calls. The compiler uses heuristics to determine when to convert: in general, expressions involving a single OP_CONCAT aren't converted, unless some other saving can be made, for example if an OP_CONST can be eliminated, or in the presence of 'my $x = .. ' which OP_MULTICONCAT can apply OPpTARGET_MY to, but OP_CONST can't. The multiconcat op is of type UNOP_AUX, with the op_aux structure directly holding a pointer to a single constant char* string plus a list of segment lengths. So for "a=$a b=$b\n"; the constant string is "a= b=\n", and the segment lengths are (2,3,1). If the constant string has different non-utf8 and utf8 representations (such as "\x80") then both variants are pre-computed and stored in the aux struct, along with two sets of segment lengths. For all the above LHS types, any SASSIGN op is optimised away. For a LHS of '$lex=', '$lex.=' or 'my $lex=', the PADSV is optimised away too. For example where $a and $b are lexical vars, this statement: my $c = "a=$a, b=$b\n"; formerly compiled to const[PV "a="] s padsv[$a:1,3] s concat[t4] sK/2 const[PV ", b="] s concat[t5] sKS/2 padsv[$b:1,3] s concat[t6] sKS/2 const[PV "\n"] s concat[t7] sKS/2 padsv[$c:2,3] sRM*/LVINTRO sassign vKS/2 and now compiles to: padsv[$a:1,3] s padsv[$b:1,3] s multiconcat("a=, b=\n",2,4,1)[$c:2,3] vK/LVINTRO,TARGMY,STRINGIFY In terms of how much faster it is, this code: my $a = "the quick brown fox jumps over the lazy dog"; my $b = "to be, or not to be; sorry, what was the question again?"; for my $i (1..10_000_000) { my $c = "a=$a, b=$b\n"; } runs 2.7 times faster, and if you throw utf8 mixtures in it gets even better. This loop runs 4 times faster: my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"; for my $i (1..10_000_000) { $s = "\x{100}wxyz"; $s .= "foo=$a bar=$b baz=$c"; } The main ways in which OP_MULTICONCAT gains its speed are: * any OP_CONSTs are eliminated, and the constant bits (already in the right encoding) are copied directly from the constant string attached to the op's aux structure. * It optimises away any SASSIGN op, and possibly a PADSV op on the LHS, in all cases; OP_CONCAT only did this in very limited circumstances. * Because it has a holistic view of the entire concatenation expression, it can do the whole thing in one efficient go, rather than creating and copying intermediate results. pp_multiconcat() goes to considerable efforts to avoid inefficiencies. For example it will only SvGROW() the target once, and to the exact size needed, no matter what mix of utf8 and non-utf8 appear on the LHS and RHS. It never allocates any temporary SVs except possibly in the case of tie or overloading. * It does all its own appending and utf8 handling rather than calling out to functions like sv_catsv(). * It's very good at handling the LHS appearing on the RHS; for example in $x = "abcd"; $x = "-$x-$x-"; It will do roughly the equivalent of the following (where targ is $x); SvPV_force(targ); SvGROW(targ, 11); p = SvPVX(targ); Move(p, p+1, 4, char); Copy("-", p, 1, char); Copy("-", p+5, 1, char); Copy(p+1, p+6, 4, char); Copy("-", p+10, 1, char); SvCUR(targ) = 11; p[11] = '\0'; Formerly, pp_concat would have used multiple PADTMPs or temporary SVs to handle situations like that. The code is quite big; both S_maybe_multiconcat() and pp_multiconcat() (the main compile-time and runtime parts of the implementation) are over 700 lines each. It turns out that when you combine multiple ops, the number of edge cases grows exponentially ;-)
* B::walksymtable: clear cached methodsFather Chrysostomos2017-10-231-0/+15
| | | | | | | | | | | | | There was a dummy assignment in B::walksymtable that I removed in com- mit 6a4fc5265ba1 because it appeared to be redundant. Removing that assignment broke Module::Info (rt.cpan.org #123352), because it changed the behaviour of B::Utils (by changing the behaviour of B::walksymtable). That seemingly useless assignment was actually clearing cached methods, so that any B::GV object passed to the call- back method sees ->CV pointing to something only if there is a real sub there. Since this seems like a reasonable expectation, this com- mit restores the old behaviour, with a comment explaining what the assignment is for, and tests it.
* Give OP_RV2HV a targDavid Mitchell2017-07-273-20/+20
| | | | | | | OP_RV2AV already has one; its not clear why OP_RV2HV didn't. Having one means that in scalar context it can return an int value without having to create a mortal. Ditto when its doing 'keys %h' via OPpRV2HV_ISKEYS.
* optimise away OP_KEYS op in scalar/void contextDavid Mitchell2017-07-273-30/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In something like if (keys %h) { ... } the 'keys %h' is implemented as the op sequences gv[*h] s rv2hv lKRM/1 keys[t2] sK/1 or padhv[%h:1,6] lRM keys[t2] sK/1 It turns out that (%h) in scalar and void context now behaves very similarly to (keys %h) (except that it reset the iterator), so in these cases, convert the two ops rv2hv/padhv, keys into the single op rv2hv/padhv with a private flag indicating that the op is handling the 'keys' action by itself. As well as one less op to execute, this brings the boolean-context optimisation already present in padhv/rv2sv to keys. So if (keys %h) { ... } is no longer slower than if (%h) { ... }
* Switch most open() calls to three-argument form.John Lightsey2016-12-232-3/+3
| | | | | | | | | | Switch from two-argument form. Filehandle cloning is still done with the two argument form for backward compatibility. Committer: Get all porting tests to pass. Increment some $VERSIONs. Run: ./perl -Ilib regen/mk_invlists.pl; ./perl -Ilib regen/regcharclass.pl For: RT #130122
* eliminate OPpRUNTIME private PMOP flagDavid Mitchell2016-11-143-6/+6
| | | | | | This flag was added in 5.004 and even then it didn't seem to be used for anything. It gets set and unset in various places, but is never tested. I'm not even sure what it was intended for.
* make OP_SPLIT a PMOP, and eliminate OP_PUSHREDavid Mitchell2016-10-043-7/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Most ops that execute a regex, such as match and subst, are of type PMOP. A PMOP allows the actual regex to be attached directly to that op, due to its extra fields. OP_SPLIT is different; it is just a plain LISTOP, but it always has an OP_PUSHRE as its first child, which *is* a PMOP and which has the regex attached. At runtime, pp_pushre()'s only job is to push itself (i.e. the current PL_op) onto the stack. Later pp_split() pops this to get access to the regex it wants to execute. This is a bit unpleasant, because we're pushing an OP* onto the stack, which is supposed to be an array of SV*'s. As a bit of a hack, on DEBUGGING builds we push a PVLV with the PL_op address embedded instead, but this still isn't very satisfactory. Now that regexes are first-class SVs, we could push a REGEXP onto the stack rather than PL_op. However, there is an optimisation of @array = split which eliminates the assign and embeds the array's GV/padix directly in the PUSHRE op. So split still needs access to that op. But the pushre op will always be splitop->op_first anyway, so one possibility is to just skip executing the pushre altogether, and make pp_split just directly access op_first instead to get the regex and @array info. But if we're doing that, then why not just go the full hog and make OP_SPLIT into a PMOP, and eliminate the OP_PUSHRE op entirely: with the data that was spread across the two ops now combined into just the one split op. That is exactly what this commit does. For a simple compile-time pattern like split(/foo/, $s, 1), the optree looks like: before: <@> split[t2] lK </> pushre(/"foo"/) s/RTIME <0> padsv[$s:1,2] s <$> const(IV 1) s after: </> split(/"foo"/)[t2] lK/RTIME <0> padsv[$s:1,2] s <$> const[IV 1] s while for a run-time expression like split(/$pat/, $s, 1), before: <@> split[t3] lK </> pushre() sK/RTIME <|> regcomp(other->8) sK <0> padsv[$pat:2,3] s <0> padsv[$s:1,3] s <$> const(IV 1)s after: </> split()[t3] lK/RTIME <|> regcomp(other->8) sK <0> padsv[$pat:2,3] s <0> padsv[$s:1,3] s <$> const[IV 1] s This makes the code faster and simpler. At the same time, two new private flags have been added for OP_SPLIT - OPpSPLIT_ASSIGN and OPpSPLIT_LEX - which make it explicit that the assign op has been optimised away, and if so, whether the array is lexical. Also, deparsing of split has been improved, to the extent that perl TEST -deparse op/split.t now passes. Also, a couple of panic messages in pp_split() have been replaced with asserts().
* padrange, aelemfast: use label for private bitsDavid Mitchell2016-09-273-24/+24
| | | | | | | | | | | | | | | | | | | | Change the output of Concise etc: $ perl -MO=Concise -e'my (@a,$b,$c); $a[5];' from: 3 <0> padrange[@a:1,2; $b:1,2; $c:1,2] vM/LVINTRO,3 ... 5 <0> aelemfast_lex[@a:1,2] sR/5 to: 3 <0> padrange[@a:1,2; $b:1,2; $c:1,2] vM/LVINTRO,range=3 ... 5 <0> aelemfast_lex[@a:1,2] sR/key=5 See http://nntp.perl.org/group/perl.perl5.porters/220208.
* Fix up B::Concise tests following op flag changeFather Chrysostomos2016-09-051-18/+18
|
* Remove VMS-specific hacks from showlex.t.Craig A. Berry2016-08-251-2/+0
| | | | | | | I added this 15 years ago in d0c1fe9a9931bc27, but it isn't necessary for any VMS version now supported and it has recently caused the test to start failing under the test suite but not when run individually. So just get rid of it.
* concise.t: work with PERL_UNICODE=""David Mitchell2016-08-241-1/+5
| | | | | Fixup some tests I added recently so that they pass with PERL_UNICODE="" - which causes extra hints bits to be set in nextstate ops.
* Concise: improve hints decodingDavid Mitchell2016-08-191-1/+19
| | | | | | | | | | | Include the missing HINT_UNI_8_BIT (as 'us'), decode the feature bundle bits (as fea=7) and display any unrecognised bits in hex rather than decimal. This changes a nextstate following 'use feature "signatures"' from, to 2 <;> nextstate(...) v:%,{,469762048 ->3 2 <;> nextstate(...) v:%,{,fea=7 ->3
* ext/B/t/OptreeCheck.pm: Escape literal pattern '{'Karl Williamson2016-05-091-3/+3
| | | | | The deprecated warnings were getting suppressed, but literal '{' in patterns needs to be escaped.
* [perl #126410] keep the DESTROY cache in mro_metaTony Cook2016-02-081-1/+0
| | | | | | | | | | | | | We're already keeping destroy_gen there, so keep the CV there too. The previous implementation, introduced in 8c34e50d, kept the destroy method cache in the stash's stash, which broke B's SvSTASH method. Before that, the DESTROY method was cached in overload magic. A previous version of this patch didn't clear the destructor cache on a clone, which caused ext/XS-APItest/t/clone_with_stack.t to fail.
* Document broken SvSTASH for %version:: in B's test suiteTodd Rinaldo2016-02-081-0/+22
| | | | | | | RT 126410: This may not be a B bug but we have no test coverage for SvSTASH at the moment. TODO the test until it is working correctly. TonyC: fix syntax error and update MANIFEST
* Eliminate PL_sawalias, GPf_ALIASED_SVDavid Mitchell2015-08-171-6/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | These two commits: v5.21.3-759-gff2a62e "Skip no-common-vars optimisation for aliases" v5.21.4-210-gc997e36 "Make list assignment respect foreach aliasing" added a run-time mechanism to detect aliased package variables, by either "*pkg = ...," or "for $pkg (...)", and used that information to enable the OPpASSIGN_COMMON mechanism at runtime for detecting common elements in a list assign, e.g. for $alias ($a, ...) { ($a,$b) = (1,$alias); } The previous commit but one changed the OPpASSIGN_COMMON mechanism such that it no longer uses PL_sawalias. So this var and the mechanism for setting it can now be removed. This commit removes: * the PL_sawalias variable * the GPf_ALIASED_SV GP flag * the SAVEt_GP_ALIASED_SV and save_aliased_sv() save type.
* make my (...) = @_ non-OPpASSIGN_COMMON_RC1David Mitchell2015-08-171-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | Technically in my ($scalar,...) = @_ due to closure/goto tricks, its possible for $scalar to appear on both the LHS and RHS, so we currently set the OPpASSIGN_COMMON_RC1 flag. However, this imposes extra overhead; for example 5% extra instruction reads and 11% extra conditional branches for my ($x,$y,$z) = @_; Given what an important construct this is, disable this flag in the specific case of of only my's on the LHS and only @_ on the RHS. It's technically incorrect, but its the same behaviour we've always had (it was only the previous commit which made it safe but slower). We still set the OPpASSIGN_COMMON_AGG flag for my ($...,@a) = @_ since in the normal case this only adds the small additional runtime overhead of checking that @a is already empty.
* re-implement OPpASSIGN_COMMON mechanismDavid Mitchell2015-08-175-64/+64
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit almost completely replaces the current mechanism for detecting and handing common vars in list assignment, e.g. ($a,$b) = ($b,$a); In general outline: it creates more false positives at compile-time than before, but also no longer misses some false negatives. In compensation, it considerably reduces the run-time cost of handling potential and real commonality. It does this firstly by splitting the OPpASSIGN_COMMON flag into 3 separate flags: OPpASSIGN_COMMON_AGG OPpASSIGN_COMMON_RC1 OPpASSIGN_COMMON_SCALAR which indicate different classes of commonality that can be handled in different ways at runtime. Most importantly, it distinguishes between two basic cases. Firstly, common scalars (OPpASSIGN_COMMON_SCALAR), e.g. ($x,....) = (....,$x,...) where $x is modified and then sometime later its value is used again, but that value has changed in the meantime. In this case, we need replace such vars on the RHS with mortal copies before processing the assign. The second case is an aggregate on the LHS (OPpASSIGN_COMMON_AGG), e.g. (...,@a) = (...., $a[0],...) In this case, the issue is instead that when @a is cleared, it may free items on the RHS (due to the stack not being ref counted). What is required here is that rather than making of a copy of each RHS element and storing it in the array as we progress, we make *all* the copies *before* clearing the array, but mortalise them in case we die in the meantime. We can further distinguish two scalar cases; sometimes it's possible to confirm non-commonality at run-time merely by checking that all the LHS scalars have a reference count of 1. If this is possible, we set the OPpASSIGN_COMMON_RC1 flag rather than the OPpASSIGN_COMMON_SCALAR flag. The major improvement in the run-time performance in the OPpASSIGN_COMMON_SCALAR case (or OPpASSIGN_COMMON_RC1 if rc>1 scalars are detected), is to use a mark-and-sweep scan of the two lists using the SVf_BREAK flag, to determine which elements are common, and only make mortal copies of those elements. This has a very big effect on run-time performance; for example in the classic ($a,$b) = ($b,$a); it would formerly make temp copies of both $a and $b; now it only copies $a. In more detail, the mark and sweep mechanism in pp_aassign works by looping through each LHS and RHS SV pair in parallel. It temporarily marks each LHS SV with the SVf_BREAK flag, then makes a copy of each RHS element only if it has the SVf_BREAK flag set. When the scan is finished, the flag is unset on all LHS elements. One major change in compile-time flagging is that package scalar vars are now treated as if they could always be aliased. So we don't bother any more to do the compile-time PL_generation checking on package vars (we still do it on lexical vars). We also no longer make use of the run-time PL_sawalias mechanism for detecting aliased package vars (and indeed the next commit but one will remove that mechanism). This means that more list assignment expressions which feature package vars will now need to do a runtime mark-and-sweep (or where appropriate, RC1) test. In compensation, we no longer need to test for aliasing and set PL_sawalias in pp_gvsv and pp_gv, nor reset PL_sawalias in every pp_nextstate. Part of the reasoning behind this is that it's nearly impossible to detect all possible package var aliasing; for example PL_sawalias would fail to detect XS code doing GvSV(gv) = sv. Note that we now scan the two children of the OP_AASSIGN separately, and in particular we mark lexicals with PL_generation only on the LHS and test only on the RHS. So something like ($x,$y) = ($default, $default) will no longer be regarded as having common vars. In terms of performance, running Porting/perlbench.pl on the new expr::aassign:: tests in t/perf/benchmarks show that the biggest slowdown is around 13% more instruction reads and 20% more conditional branches in this: setup => 'my ($v1,$v2,$v3) = 1..3; ($x,$y,$z) = 1..3;', code => '($x,$y,$z) = ($v1,$v2,$v3)', where this is now a false positive due to the presence of package variables. The biggest speedup is 50% less instruction reads and conditional branches in this: setup => '@_ = 1..3; my ($x,$y,$z)', code => '($x,$y,$z) = @_', because formerly the presence of @_ pessimised things if the LHS wasn't a my declaration (it's still pessimised, but the runtime's faster now). Conversely, we pessimise the 'my' variant too now: setup => '@_ = 1..3;', code => 'my ($x,$y,$z) = @_', this gives 5% more instruction reads and 11% more conditional branches now. But see the next commit, which will cheat for that particular construct.
* op_parent(): only exist under -DPERL_OP_PARENTDavid Mitchell2015-04-191-1/+1
| | | | | | Make the function Perl_op_parent() only be present in perls built with -DPERL_OP_PARENT. Previously the function was present in all builds, but always returned NULL on non PERL_OP_PARENT builds.
* rename op_lastsib to op_moresib, and invert logicDavid Mitchell2015-04-191-2/+2
| | | | | | | Rather than having a flag which indicates that there are no more siblings, have a flag which indicates that there are more siblings. This flag was only introduced during the current blead cycle, so no production releases know about it.
* [perl #124004] Fix stack bug with foreach(@empty)Father Chrysostomos2015-03-182-12/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | The context gets recorded on the context stack when a loop is entered. That context is then used at loop exit when handling the stack. In the case of foreach, the context applied to the stack was taken from the enteriter op. But the enteriter op was always getting list context applied. That meant that foreach(@empty_array){} in scalar context would push nothing on to the stack, causing a subsequent stack read to look one item too far to the left, either reading the wrong thing, or causing a stack underflow (even a crash). The clearest bug resulting from it: $ ./miniperl -le 'push @_, 1, 2, 3, scalar do { for(@x){} } + 1, 4, 5, 6; print "@_"' 1 2 4 4 5 6 instead of 1 2 3 1 4 5 6. We do need to apply list context to make sure the items iterated over are evaluated in list context. But we need to apply it *only* to those (expr in newFOROP), not the the outer enteriter op. That op’s context should be left unset here, so that the calling context will be applied to it. This bug goes back at least to perl 5.000.
* Spelling correction.James E Keenan2015-03-111-1/+1
|
* Remove use of Test::Stream per ilmari's patch on p5p.James E Keenan2015-03-111-2/+9
|
* ext/B/t/b.t: Generalize for non-ASCII platformsKarl Williamson2015-03-051-1/+1
|
* Corrections to spelling and grammatical errors.Lajos Veres2015-01-281-3/+3
| | | | Extracted from patch submitted by Lajos Veres in RT #123693.
* b.t: Fix test sequence numbersFather Chrysostomos2015-01-051-0/+1
| | | | I should have tested more thoroughly before pushing a462fa007.