Father Chrysostomos [Mon, 5 Aug 2013 16:17:32 +0000 (09:17 -0700)]
Stop ‘used once’ warnings from crashing on circularities
gv_check was only checking for stashes nested directly inside them-
selves (*foo:: = *foo::foo) and the main stash.
Other stash circularities would cause infinite recursion, blowing the
C stack and crashing.
Steve Hay [Mon, 5 Aug 2013 17:06:23 +0000 (18:06 +0100)]
Upgrade Scalar-List-Utils from 1.29 to 1.30
Nicholas Clark [Wed, 31 Jul 2013 10:43:51 +0000 (12:43 +0200)]
Storable should not assume that sizeof(mg_len) is 4.
Commit
6174b39a88cd4874 changed mg_len from I32 to SSize_t. sizeof(I32) is 4
everywhere (except certain Crays, for which Storable has work-around code).
In the version object serialisation code, Storable was passing mg->len
directly to the macro WLEN(), and and it turns out that some paths through
this macro is relying on the assumption that the value passed in is 32 bits.
This is now invalid on on 64 bit systems, but only triggered an error with
the existing tests on big endian systems.
The easiest fix is to assign the value to a temporary variable of the
correct size, and process that. However, a lot of the code makes a lot of
unwarranted assumptions about sizeof(int), and ideally should be audited and
rewritten to use more appropriate types.
Nicholas Clark [Wed, 31 Jul 2013 10:32:27 +0000 (12:32 +0200)]
Restore Storable's DEBUGME build after commit
591596833b093b3c
Storable.xs can conditionally compile debugging code if the C pre-processor
macro DEBUGME is defined. By default, it is not.
Commit
591596833b093b3c changed the name and purpose of the second argument
to the macro BLESS(), but missed updating the name in one location, within
code conditionally enabled by DEBUGME, hence breaking compilation with
DEBUGME.
Fix compilation by correcting that code to use the new macro parameter name.
Father Chrysostomos [Mon, 5 Aug 2013 09:14:39 +0000 (02:14 -0700)]
op.c:newCONSTSUB: Stop using CopFILESV for CvFILE
CopFILESV points to *{"_<filename"}, which can be modified
from perl space. CopFILE points to the third character of
*{"_<filename"}{NAME}.
Ithreads were already using CopFILE. Make non-threaded builds do the
same. This makes things a little more robust.
CvFILE is not actually used anywhere as far as I can tell, so I cannot
easily test this.
Father Chrysostomos [Mon, 5 Aug 2013 08:55:31 +0000 (01:55 -0700)]
Don’t use CopFILESV for ‘once’ warnings
CopFILESV points to ${"_<filename"}, which can be modified by Perl
code. Under non-threaded builds, newGP (which records the file name
used by ‘used once’ warnings) was using CopFILESV for the file name.
It is safer just to use the name of the GV itself.
Father Chrysostomos [Mon, 5 Aug 2013 08:35:36 +0000 (01:35 -0700)]
op.c:aassign_common_vars: merge duplicate code
We are just asking for bugs to creep in by repeating it like this.
Father Chrysostomos [Mon, 5 Aug 2013 08:32:33 +0000 (01:32 -0700)]
op.c: correct comment
Father Chrysostomos [Mon, 5 Aug 2013 08:22:46 +0000 (01:22 -0700)]
Remove SAVEt_STACK_CXPOS
81ed78b25c4b removed the only use of this.
Father Chrysostomos [Mon, 5 Aug 2013 08:13:21 +0000 (01:13 -0700)]
Handle SAVEt_READONLY_OFF in ss_dup
20d5dc239d1 added SAVEt_READONLY_OFF without adding it to ss_dup.
Father Chrysostomos [Mon, 5 Aug 2013 08:10:21 +0000 (01:10 -0700)]
Handle SAVEt_ADELETE in ss_dup
c68ec7a9f95 added SAVEt_ADELETE without adding it to ss_dup.
Father Chrysostomos [Mon, 5 Aug 2013 08:02:23 +0000 (01:02 -0700)]
Test that ss_dup handles all savestack items
It is far too easy to overlook it when adding new savestack types.
Father Chrysostomos [Mon, 5 Aug 2013 07:39:32 +0000 (00:39 -0700)]
toke.c: s/below/above/
The condition this refers to was moved in commit
4efe39d21.
Father Chrysostomos [Mon, 5 Aug 2013 07:36:50 +0000 (00:36 -0700)]
toke.c:incline: Avoid duplicate symbol lookup
If we have already looked up the GV for *{"_<newfilename"}, we
can set CopFILEGV to that instead of having CopFILE_setn look it
up itself.
Father Chrysostomos [Mon, 5 Aug 2013 07:28:48 +0000 (00:28 -0700)]
toke.c:incline: Don’t stringify a GV to look it up
If we already have the GV, there is no need to stringify it and then
look it up again.
Father Chrysostomos [Mon, 5 Aug 2013 07:13:40 +0000 (00:13 -0700)]
Make eval "#line" account for ${"_<foo"} changes
If a BEGIN block in the eval modifies the ${"_<foo"} scalar where
‘foo’ is the file name in the eval, then subsequent #line directives
that change the file name won’t cause the lines to be copied to
@{"_<newname"}. (This copying usually happens under the debugger.)
Just use the name of the GV itself, rather than CopFILESV, since the
GV name cannot be changed from Perl space.
Father Chrysostomos [Mon, 5 Aug 2013 06:54:59 +0000 (23:54 -0700)]
toke.c:incline: Move code into the block that uses it
Setting up the values of these variables is pointless if we are not
going to be using them. They are only used inside the ‘if’ block that
this patch moves them into.
Father Chrysostomos [Mon, 5 Aug 2013 06:52:20 +0000 (23:52 -0700)]
Prevent __FILE__ corruption when ${"_<..."} is modified
This fixes a longstanding bug under non-threaded builds that was
extended to threaded builds by the previous commit.
Modifying the SV slot of the file gv can cause CopFILE to violate
memory discipline, giving random strings.
Since the GV is named after the file, too, and since its name can-
not be changed from Perl space, use that for CopFILE instead.
Father Chrysostomos [Sat, 6 Jul 2013 05:51:50 +0000 (22:51 -0700)]
[perl #117855] Store CopFILEGV in a pad under ithreads
This saves having to allocate a separate string buffer for every cop
(control op; every statement has one).
Under non-threaded builds, every cop has a pointer to the GV for that
source file, namely *{"_<filename"}.
Under threaded builds, the name of the GV used to be stored instead.
Now we store an offset into the per-interpreter PL_filegvpad, which
points to the GV.
This makes no significant speed difference, but it reduces mem-
ory usage.
Father Chrysostomos [Sun, 4 Aug 2013 18:22:03 +0000 (11:22 -0700)]
Don’t let list const modification affect future retvals
In commit
f99a5f08f203, I inadvertently made modifications to val-
ues return by list ‘constants’ affect what values are returned sub-
sequently.
It’s for this type of situation that PADTMP exists (values are never
referenced, but copied). So use it.
This is similar to
5608dcc62, which fixed #3105.
Father Chrysostomos [Sun, 4 Aug 2013 06:58:56 +0000 (23:58 -0700)]
[perl #119043] Allow utf8 up/downgrade on ro COWs
Commit 1913067 allowed COW constants to be read-only. This broke
Glib, so I reverted it with
ba36554e02. That caused this bug to reë-
merge (I hadn’t realised that I had fixed it in 1913067):
perl -e 'for(1..10){for(__PACKAGE__){warn $_; $_++}}'
main at -e line 1.
maio at -e line 1.
maip at -e line 1.
maiq at -e line 1.
mair at -e line 1.
so I reverted the revert two commits ago.
Glib was triggering a read-only error because it called
sv_utf8_upgrade on a read-only COW scalar, and sv_utf8_upgrade does
sv_force_normal on COWs to de-COW them. sv_force_normal croaks on
read-only scalars.
The real problem here is that sv_force_normal means ‘I am going to
modify this scalar’, yet sv_utf8_upgrade conceptually does not modify
the scalar, but only changes the internal representation.
Having to call sv_force_normal to get the *side effect* of de-COWing
without triggering the various other things it does is no good.
What we need is a separate sv_uncow function that sv_force_normal
uses. This commit introduces such a function.
Father Chrysostomos [Sun, 4 Aug 2013 06:08:42 +0000 (23:08 -0700)]
Test that __PACKAGE__ is read-only
I.e., test that this bug is fixed:
$ perl -e 'for(1..10){for(__PACKAGE__){warn $_; $_++}}'
main at -e line 1.
maio at -e line 1.
maip at -e line 1.
maiq at -e line 1.
mair at -e line 1.
mais at -e line 1.
mait at -e line 1.
maiu at -e line 1.
maiv at -e line 1.
maiw at -e line 1.
for my$p(__PACKAGE__){$p++for+1..55664
,;!print"Just another \u$p hacker,\n"}
Father Chrysostomos [Sun, 4 Aug 2013 06:08:08 +0000 (23:08 -0700)]
Revert "[perl #119043] Exempt shared hash key consts from ro"
This reverts commit
ba36554e02872e48d146177a57a9cfb154727fae.
It turns out it reinstates bugs like this:
$ perl -e 'for(1..10){for(__PACKAGE__){warn $_; $_++}}'
main at -e line 1.
maio at -e line 1.
maip at -e line 1.
maiq at -e line 1.
mair at -e line 1.
mais at -e line 1.
mait at -e line 1.
maiu at -e line 1.
maiv at -e line 1.
maiw at -e line 1.
Chris 'BinGOs' Williams [Fri, 2 Aug 2013 22:53:15 +0000 (23:53 +0100)]
_perl_abs_path() symlink tests fail on QNX Neutrino
Chris 'BinGOs' Williams [Fri, 2 Aug 2013 21:47:56 +0000 (22:47 +0100)]
Resolve File::Spec test failures on QNX Neutrino
Chris 'BinGOs' Williams [Fri, 2 Aug 2013 16:39:57 +0000 (17:39 +0100)]
Add note about regenerating META files when updating CPAN-Meta
Chris 'BinGOs' Williams [Fri, 2 Aug 2013 16:34:19 +0000 (17:34 +0100)]
Update CPAN-Meta to CPAN version 2.132140
[DELTA]
2.132140 2013-08-02 11:54:17 America/New_York
[DOCUMENTATION]
- Fixed some typos in CPAN::Meta::Spec
[OTHER]
- migrated repository to Perl-Toolchain-Gang organization on Github and
updated metadata accordingly
James E Keenan [Tue, 30 Jul 2013 01:31:28 +0000 (21:31 -0400)]
Regression tests for 4 cases reported by Philip Hazel++.
With revisions per suggestion by demerphq++.
For: RT #119069, 119071, 119073, 119075
Tony Cook [Fri, 2 Aug 2013 01:27:10 +0000 (11:27 +1000)]
prevent a precedence warning on clang
Dumper.xs:245:29: warning: '&&' within '||' [-Wlogical-op-parentheses]
((k >= 7 && k <= 10 || k == 12 || k == 13 || k == 27)
~~~~~~~^~~~~~~~~~ ~~
Dumper.xs:245:29: note: place parentheses around the '&&' expression to silence
this warning
((k >= 7 && k <= 10 || k == 12 || k == 13 || k == 27)
Karl Williamson [Thu, 1 Aug 2013 20:19:34 +0000 (14:19 -0600)]
regcomp.c: Silence clang compiler warning
There is no pre-canned format for printing STRLEN variables. This
commit casts to UV and uses %"UVuf".
Chris 'BinGOs' Williams [Thu, 1 Aug 2013 20:07:00 +0000 (21:07 +0100)]
Update Scalar-List-Utils to CPAN version 1.29
[DELTA]
1.29 -- Thu Aug 01 13:40 UTC 2013
* Bugfix to pairmap/pairgrep when stack moves beneath them during operation
1.28 -- Thu Aug 01 12:19 UTC 2013
-- BROKEN; do not use. See 1.29
* Added pairgrep, pairmap, pairs (inspired by List::Pairwise)
* Added pairkeys and pairvalues
Karl Williamson [Thu, 1 Aug 2013 19:05:36 +0000 (13:05 -0600)]
dump.c: White-space only
Indent and wrap lines to correspond with newly formed block
Karl Williamson [Tue, 23 Jul 2013 16:48:20 +0000 (10:48 -0600)]
Extend sv_dump() to dump SVt_INVLIST
This changes the previously unused _invlist_dump() function to be called
from sv_dump() to dump inversion list scalars. The format for regular
SVt_PVs doesn't give human-friendly output for these.
Since these lists are currently not visible outside the Perl core, the
format is documented only in comments in the function itself.
Steve Hay [Thu, 1 Aug 2013 12:43:21 +0000 (13:43 +0100)]
version's test files are not excluded from blead
They were added long ago by
543eec9e19.
Nicholas Clark [Tue, 30 Jul 2013 17:59:48 +0000 (19:59 +0200)]
Set a large thread stack when running the regex tests in a thread.
For testing ithreads cloning, all the regex tests are run twice. Once
"normally", and once in a child ithread, to verify that all regex
constructions can be cloned.
The recently added tests for backreferences starting with 8 or 9 causes a
lot of C recursion in the child thread, enough to bust the default thread
stack size on (at least) HP-UX. So set a large explicit thread stack size.
It doesn't matter that it's large, as we are only running one child thread.
Steve Hay [Thu, 1 Aug 2013 08:10:46 +0000 (09:10 +0100)]
Use undef rather than 'undef' for Devel::PPPort's UPSTREAM status
All other undefined UPSTREAM statuses are undef rather than 'undef'
already, which causes core-cpan-diff to emit 'upstream is: UNKNOWN!'
rather than 'upstream is: undef', which is probably the intended effect
since it indicates the status is not known rather than specifically
undefined.
Steve Hay [Thu, 1 Aug 2013 07:58:30 +0000 (08:58 +0100)]
Note that three more test files are excluded from XSLoader
Karl Williamson [Wed, 31 Jul 2013 21:05:43 +0000 (15:05 -0600)]
PATCH: [perl #119101] Extraneous warnings in Parse::ErrorString::Perl
(Since 5.18.0)
This is from https://rt.cpan.org/Ticket/Display.html?id=87458.
Working on this ticket caused me to be more certain of the advisability
of the deprecation message that was added in v5.18.0, and which was
inappropriately being raised in the test suite for this module.
The message notes that escaping the metacharacter '{', '[', or '(')
doesn't actually do anything in a pattern whose delimiters are {} [] or
() respectively.
The code in question looked something like
my $pat = "m{\Q$foo}";
...
eval "$bar =~ $pat";
where $foo comes from somewhere else and contained something like
\x{61}. The message should not be raised because the \Q changes that to
\\x\{61\}, and so the \x loses its special meaning as well, and the left
brace is not a metacharacter in this context. The solution is to look
at all the backslashes before the 'x' and only raise the message if
there are an odd number of them.
But, if $foo had been something like "bar{3}", the \Q would have
transformed that into "bar\{3\}. In the code above, this matches
"b" followed by "a" followed by 3 "r"s.
Similarly for [] and ().
my $foo = "(abc)";
my $pat = "m(\Q$foo)";
...
eval "$bar =~ $pat";
will not match the parens in $foo literally, but treat them as marking a
group.
The bottom line is that currently you cannot rely on \Q to properly
quote in a regex pattern in which the delimiters are mirrored
metacharacters. The only current safe mirrored delimiters are <>, which
are not metacharacters. Starting in 5.18.0, there is a default-on
message that catches this. Starting with this commit, certain false
positives have been removed, and I know of none other.
David Mitchell [Wed, 31 Jul 2013 21:41:17 +0000 (22:41 +0100)]
Handle /[#]/ and /[(?#]/ with code blocks
This is a regression in 5.18.0.
In something like /[#](?{})/x, the perl toker incorrectly sees the '#' as a
comment and skips the code block without parsing it.
David Mitchell [Wed, 31 Jul 2013 09:29:49 +0000 (10:29 +0100)]
pp_match(): remove some superfluous braces
David Mitchell [Wed, 31 Jul 2013 09:13:31 +0000 (10:13 +0100)]
pp_match(): only look up pos() magic once
Currently before matching, we see whether the SV has any pos() magic
attached; then after the match we look it up again to update pos().
Instead just remember the previous value of mg and reuse it where
possible.
David Mitchell [Wed, 31 Jul 2013 09:08:18 +0000 (10:08 +0100)]
pp_match(): remove redundant condition
a successful match always sets $-[0] now, so there's no need to check
whether its set
Steve Hay [Wed, 31 Jul 2013 07:52:51 +0000 (08:52 +0100)]
Fix ordering of modules and pragmata in perldelta.pod
Steve Hay [Wed, 31 Jul 2013 07:51:36 +0000 (08:51 +0100)]
Upgrade parent from 0.225 to 0.226
Father Chrysostomos [Wed, 31 Jul 2013 03:09:36 +0000 (20:09 -0700)]
perlsub: constant -> inlinable
This was brought up in ticket #109744. I cannot change the header of
the section, as it will break links. But at least we can avoid
stressing the constancy as much.
Nathan Trapuzzano [Tue, 30 Jul 2013 23:10:20 +0000 (19:10 -0400)]
Remove semicolon from inline TYPEMAP in perlxstut example.
Karl Williamson [Wed, 31 Jul 2013 00:29:37 +0000 (18:29 -0600)]
regcomp.c: Fix yet another C89 problem
In my haste to get
a42823ac3c233f0a9b8aefaac74a3b1e1600e6f6 out, I
neglected to see this second instance of a improperly placed
declaration.
Karl Williamson [Tue, 30 Jul 2013 23:00:27 +0000 (17:00 -0600)]
regcomp.c: Properly declare variable with C89
Commit
89d3fa0ee43d5c7489581a62b3d662c316bfcb43 introduced a syntax
error under C89 compilers, as it removed braces so a declaration wasn't
the first thing in a block. This adds a declaration in the proper
place.
David Mitchell [Tue, 30 Jul 2013 15:16:35 +0000 (16:16 +0100)]
RT #118213: handle $r=qr/.../; /$r/p properly
In the case where a qr// regex is directly used by PMOP (rather than being
interpolated with some other stuff and a new regex created, such as
/a$r/p), then the PMf_KEEPCOPY flag will be set on the PMOP, but the
corresponding RXf_PMf_KEEPCOPY flag *won't* be set on the regex.
Since most of the regex handling for copying the string and extracting out
${^PREMATCH} etc is done based on the RXf_PMf_KEEPCOPY flag in the regex,
this is a bit of a problem.
Prior to 5.18.0 this wasn't so noticeable, since various other bugs around
//p handling meant that ${$PREMATCH} etc often accidentally got set
anyway. 5.18.0 fixed these bugs, and so as a side-effect, exposed the
PMOP verses regex flag issue. In particular, this stopped working in
5.18.0:
my $pat = qr/a/;
'aaaa' =~ /$pat/gp or die;
print "MATCH=[${^MATCH}]\n";
(prints 'a' in 5.16.0, undef in 5.18.0).
The presence /g caused the engine to copy the string anyway by luck.
We can't just set the RXf_PMf_KEEPCOPY flag on the regex if we see the
PMf_KEEPCOPY flag on the PMOP, otherwise stuff like this will be wrong:
$r = qr/..../;
/$r/p; # set RXf_PMf_KEEPCOPY on $r
/$r/; # does a /p match by mistake
Since for 5.19.x onwards COW is enabled by default (and cheap copies are
always made regardless of /p), then this fix is mainly for PERL_NO_COW
builds and for backporting to 5.18.x. (Although it still applies to
strings that can't be COWed for whatever reason).
Since we can't set a flag in the rx, we fix this by:
1) when calling the regex engine (which may attempt to copy part or all of
the capture string), make sure we pass REXEC_COPY_STR, but neither of
REXEC_COPY_SKIP_PRE, REXEC_COPY_SKIP_POST when we call regexec() from
pp_match or pp_subst when the corresponding PMOP has PMf_KEEPCOPY set.
2) in Perl_reg_numbered_buff_fetch() etc, check for PMf_KEEPCOPY in
PL_curpm as well as for RXf_PMf_KEEPCOPY in the current rx before deciding
whether to process ${^PREMATCH} etc.
As well as adding new tests to t/re/reg_pmod.t, I also changed the
string to be matched against from being '12...' to '012...', to ensure that
the lengths of ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} would all be
different.
Karl Williamson [Tue, 30 Jul 2013 17:27:20 +0000 (11:27 -0600)]
regcomp.c: Remove extraneous debug info
Prior to this commit the prhase {unicode} was emitted to mark what a
bracketed character class matched that wasn't in that classes bitmap.
This was oftern accompanied by another phrase that gave further
details. Since everything is {unicode}, the first phrase isn't very
helpful. Now it is changed to {utf8} for those things that won't match
unless the target string is in utf8 (this includes some upper latin1
code points under /d matches), or {outside bitmap} for where utf8 isn't
necessasily required (this happens for user-defined Unicode properties
that aren't known at compile time).
Karl Williamson [Tue, 30 Jul 2013 17:21:11 +0000 (11:21 -0600)]
regcomp.c: White-space only
Outdent code which the previous commit removed from a block.
Karl Williamson [Tue, 30 Jul 2013 17:16:56 +0000 (11:16 -0600)]
regcomp.c: Remove redundant code
This code is redundant, attempting to output what isn't returned in 'lv'
by reglcass_swash(), but that function makes sure that 'lv' contains
everything it should, so we ended up processing (and outputting) the
same data twice.
Karl Williamson [Tue, 30 Jul 2013 16:51:35 +0000 (10:51 -0600)]
regexec.c: Add, clarify comments
Karl Williamson [Sun, 28 Jul 2013 01:10:27 +0000 (19:10 -0600)]
regcomp.c: Change Debug output of char classes
This commit causes the debug output that was formerly "\x4ff", for
example to be \x{4f}f. It always puts braces around the hex to separate
it from other characters.
Karl Williamson [Sun, 28 Jul 2013 00:45:18 +0000 (18:45 -0600)]
regcomp.c: Debug output clearer ranges
It's not immediately obvious what the character class [!-~] matches.
Better is its equivalent: [\x21-\x7e]. This commit changes the debug
output to be the latter for character class matches, while retaining the
current behavior where it is clear what the range matches, in, e.g.,
[J-R]. Ranges like [A-z] include more than just alphabetics, so they
are now output as [\x41-\x7a]. (Debug output is done, for example, when
the command line option -Dr is specified.)
Karl Williamson [Sun, 28 Jul 2013 00:21:40 +0000 (18:21 -0600)]
regcomp.c: White-space only
This indents properly to correspond to a newly formed block
Karl Williamson [Sun, 28 Jul 2013 00:19:29 +0000 (18:19 -0600)]
regcomp.c: Change debug output to use \t, etc instead of hex
It is easier to read the standard abbreviations \t, \n, etc than the hex
equivalents, \x09, ...
Karl Williamson [Sun, 28 Jul 2013 00:14:12 +0000 (18:14 -0600)]
regcomp.c: Extract duplicated code into single fcn
This code that appears twice is nearly duplicate.
Karl Williamson [Tue, 30 Jul 2013 17:39:02 +0000 (11:39 -0600)]
Regen t/porting/known_pod_issues.dat.
This silences a warning that shows up under pedantic mode
Karl Williamson [Fri, 26 Jul 2013 20:26:27 +0000 (14:26 -0600)]
regcomp.c: Fix potential scalar leak
The lines in this code were reversed. We need to check something before
overwriting it, rather than the other way around. The result would be
that under certain circumstances a SV would not get freed. Those
circumstances are very limited: the first of the three parameters to
this function is not empty, but the 2nd is, and the output (3rd
parameter) is to overwrite the 2nd. I found this bug by code reading; I
have searched the code space and there are no current calls to it that
have this parameter configuration, therefore there is no test that can
be added to trigger it.
Karl Williamson [Thu, 25 Jul 2013 02:02:40 +0000 (20:02 -0600)]
regcomp.c: Change #ifdef
This function is currently #ifdef'd out. Change it so that enabling it
in embed.fnc automatically enables it here as well, making a 2 step
process into just a single step.
Andy Dougherty [Tue, 30 Jul 2013 14:57:32 +0000 (10:57 -0400)]
Mention the 'make clean' makefile target [perl #38307].
Mention the 'make clean' target in INSTALL. It cleans up a lot,
but not everything. Since perl is used extensively in its own
build process, it may involve attempting to build perl in order
to clean up. Alternatively, we could just make 'clean' an
alias for 'realclean'.
Steve Hay [Tue, 30 Jul 2013 15:16:29 +0000 (16:16 +0100)]
Remove four Module-Build files which were removed in 4.006 but left in core
Steve Hay [Tue, 30 Jul 2013 13:19:20 +0000 (14:19 +0100)]
Upgrade Config-Perl-V from 0.18 to 0.19
Father Chrysostomos [Tue, 30 Jul 2013 03:40:24 +0000 (20:40 -0700)]
Skip trailing constants when searching pads
Under ithreads, constants and GVs are stored in the pad.
When names are looked up up in a pad, the search begins at the end and
works its way toward the beginning, so that an $x declared later masks
one declared earlier.
If there are many constants at the end of the pad, which can happen
for generated code such as lib/unicore/TestProp.pl (which has about
100,000 lines and over 500,000 pad entries for constants at the
end of the file scope’s pad), it can take a long time to search
through them all.
Before commit
325e1816, constants used &PL_sv_undef ‘names’. Since
that is the default value for array elements (when viewed directly
through AvARRAY, rather than av_fetch), the pad allocation code did
not even bother storing the ‘name’ for these. So the name pad (aka
padnamelist) was not extended, leaving just 10 entries or so in the
case of lib/unicore/TestProp.pl.
Commit
325e1816 make pad constants have &PL_sv_no names, so the
name pad would be implicitly extended as a result of storing
&PL_sv_no, causing a huge slowdown in t/re/uniprops.t (which runs
lib/unicore/TestProp.pl) under threaded builds.
Now, normally the name pad *does* get extended to match the pad,
in pad_tidy, but that is skipped for string eval (and required
file scope, of course). Hence, wrapping the contents of
lib/unicore/TestProp.pl in a sub or adding ‘my $x’ to end of it will
cause the same slowdown before
325e1816.
lib/unicore/TestProp.pl just happened to be written (ok, generated) in
such a way that it ended up with a small name pad.
This commit fixes things to make them as fast as before by recording
the index of the last named variable in the pad. Anything following
that is disregarded in pad lookup and search begins with the last
named variable. (This actually does make things faster before for
subs with many trailing constants in the pad.)
This is not a complete fix. Adding ‘my $x’ to the end of a large file
like lib/unicore/TestProp.pl will make it just as slow again.
Ultimately we need another algorithm, such as a binary search.
Steve Hay [Tue, 30 Jul 2013 12:28:17 +0000 (13:28 +0100)]
Note that five new meta/pod tests are excluded from the Filter distro
H.Merijn Brand [Tue, 30 Jul 2013 13:06:19 +0000 (15:06 +0200)]
Config-Perl-V 0.19 released
Nicholas Clark [Fri, 27 Apr 2012 15:56:34 +0000 (17:56 +0200)]
No need to prefix $(LDLIBPTH) when running $(CC) to link perl and miniperl.
When perl is build with a shared perl library, $(LDLIBPTH) is used to prefix
the appropriate LD_LIBRARY_PATH=... before commands in the Makefile so that
the uninstalled ./perl will be able to find it.
Commit
c4f23d77f4b3486a (in May 1998) added the code for LDLIBPTH, but also
added it to the default command line used to invoke $(CC) to link perl and
miniperl. These commands don't need to run ./perl, hence the use of
$(LDLIBPTH) is superfluous here. Removing it makes the code simpler.
$(LDLIBPTH) was first removed in commit
d182087b9c1b8811 (April 2003), but
that change was reverted by commit
f913803b6e67ae4c (in Aug 2003) as part of
an attempt to fix problems reported by a perl smoker on a platform where the
C compiler is actually a Perl wrapper script. However, from subsequent
discussion it seems that the reversion didn't actually fix the problem, and
both the documentation of LD_LIBRARY_PATH and attempting to replicate the
smoker's setup suggest that this particular change is independent of the
problem. I can't replicate the smoker's reported problems building a shared
library perl with (or without) this commit on a current Power Linux machine
using a Perl script to wrap the C compiler, where the #! line on that Perl
script is an install of perl 5.8.0 also using a shared perl library. Hence
I'm confident that this change is independent of the true cause of the
smoker's problems. See the discussion in RT #23212 for more details.
Steve Hay [Mon, 29 Jul 2013 16:56:12 +0000 (17:56 +0100)]
Update Socket from 2.010 to 2.011
Tony Cook [Tue, 30 Jul 2013 04:41:56 +0000 (14:41 +1000)]
[perl #118525] make it work on threaded builds
Tony Cook [Mon, 29 Jul 2013 23:50:23 +0000 (09:50 +1000)]
Tony Cook [Thu, 25 Jul 2013 02:09:00 +0000 (12:09 +1000)]
CvGV is no longer a simple struct member access
The same slot is also used for the NAME_HEK for lexical subs, so:
- split B::CV::GV out into its own function that uses the CvGV macro
- add B::CV::NAME_HEK so the name of a lexical sub can be fetched
James E Keenan [Sat, 27 Jul 2013 02:10:58 +0000 (22:10 -0400)]
Document $DynaLoader::dl_dlext, per sisyphus++.
With one modification suggested by Andy Dougherty; version bump to 1.19.
For: RT #119031
Steve Hay [Mon, 29 Jul 2013 17:06:37 +0000 (18:06 +0100)]
Add Aristotle to the list of The Keepers of the Pumpkin
Tony Cook [Mon, 29 Jul 2013 06:34:07 +0000 (16:34 +1000)]
Philip Boulain is now a perl AUTHOR, and bump a version
Philip Boulain [Mon, 3 Sep 2012 14:16:26 +0000 (15:16 +0100)]
Reap child in case where exception has been thrown
If open3 throws due to an issue such as an exec failure, the caller
cannot know the child PID to wait for. Therefore it is our
responsibility to reap it.
Also update POD, since on some platforms exec failures now ARE raised as
exceptions (since perlbug #72016).
Colin Kuskie [Wed, 3 Oct 2012 00:13:02 +0000 (17:13 -0700)]
Refactor ext/Pod-Functions/Functions_pm.PL to use Test::More instead of making TAP by hand.
Tony Cook [Mon, 29 Jul 2013 06:04:29 +0000 (16:04 +1000)]
[perl #52000] use PL_exit_flags in the test so it works non-threaded
Tony Cook [Mon, 29 Jul 2013 05:44:15 +0000 (15:44 +1000)]
[perl #52000] Warn/abort on attempted perl exit
Tony Cook [Mon, 29 Jul 2013 05:38:58 +0000 (15:38 +1000)]
[perl #52000] add perldiag entries for the new warnings
Tony Cook [Mon, 29 Jul 2013 05:36:26 +0000 (15:36 +1000)]
John Gardiner Myers is now a perl AUTHOR
John Gardiner Myers [Mon, 29 Jul 2013 05:33:09 +0000 (15:33 +1000)]
[perl #52000] Warn/abort on attempted perl exit
Tony Cook [Mon, 29 Jul 2013 04:24:58 +0000 (14:24 +1000)]
[perl #114964] Correct 'ref' func POD to fix bad behavior around 'class matching'
Tony Cook [Mon, 29 Jul 2013 04:23:07 +0000 (14:23 +1000)]
mention reftype too
Tony Cook [Mon, 29 Jul 2013 04:09:58 +0000 (14:09 +1000)]
Brendan Byrd is now a perl AUTHOR
Brendan Byrd [Wed, 19 Sep 2012 14:32:40 +0000 (10:32 -0400)]
Correct 'ref' func POD to fix bad behavior around "class matching"
Daniel Dragan [Sat, 27 Jul 2013 02:01:00 +0000 (22:01 -0400)]
comments only, explain the different ONE_AT_A_TIME algos
Seeing 3 hash algos with the same name is confusing. If they are the same
name ("one at a time"), then why are there 3 different ones? What are the
differences (without reading the code)? What are the pros and cons of each?
INSTALL lists the ONE_AT_A_TIME algos as existing, but doesn't explain why
there are 3 of them. Patch with jkeenan suggestions.
Father Chrysostomos [Sun, 28 Jul 2013 21:12:28 +0000 (14:12 -0700)]
perldelta for
2f222bbd/#119051 (\&$glob crashing)
Father Chrysostomos [Sun, 28 Jul 2013 21:10:10 +0000 (14:10 -0700)]
[perl #119055] Make qq with no vars read-only
In commit
2484f8db I stopped constant folding from changing the read-
onliness of expressions like 1+2, which should return mutable values,
seeing that ${\1}+2 returns a mutable value. (After all, constant
folding is supposed to be solely an optimisation, without changing
behaviour.)
This is accomplished by turning on the PADTMP flag, which tells opera-
tors like \ to copy the scalar.
I did not realise at the time that some qq strings like "hello\n" and
qq "foo" (but not just "foo") are implemented using constant folding.
The lexer outputs something like stringify("foo"), which is compiled
down to a stringify op with a constant ("foo") as its only child.
In this case we really do want qq"foo" to be treated as a single con-
stant. That it is implemented using folding while "foo" is not is an
implementation detail we should hide.
So turn off the PADTMP flag when folding a stringify op.
Father Chrysostomos [Sun, 28 Jul 2013 20:21:24 +0000 (13:21 -0700)]
Exempt clang from -Wunused-value when run as cc
We already have an exception for it when called as clang or clang-1.2.3,
but not when called as cc or anything else. Mac OS X Mountain Lion
therefore ends up spitting out lots of warnings, as cc is a symlink
to clang.
Father Chrysostomos [Sun, 28 Jul 2013 20:19:33 +0000 (13:19 -0700)]
[perl #119043] Exempt shared hash key consts from ro
Commit
19130678b4 stopped copy-on-write scalars from being exempt from
readonliness in ck_svconst (called for every OP_CONST). That was for
the sake of consistency.
It turns out this breaks CPAN modules, so change it back, but only for
shared hash key scalars, not other COW scalars.
This is an historical artefact left over from when copy-on-write used
the read-only flag without the scalar actually being read-only.
Father Chrysostomos [Sun, 28 Jul 2013 20:01:59 +0000 (13:01 -0700)]
[perl #119045] Make list constant mutable again
This broke CPAN. Maybe we need to rethink this....
Father Chrysostomos [Sun, 28 Jul 2013 19:35:47 +0000 (12:35 -0700)]
[perl #119051] Fix crash with \&$glob_copy
$ref = *Foo::nosub;
\&$ref;
The assignment creates a glob copy (coercible glob; one that down-
grades back to a simple scalar when assigned to).
\&$ref autovivifies a stub in that glob. The CvGV pointer ends up
pointing to $ref, rather than *Foo::nosub. $ref can easily cease
being a glob. So crashes happen.
Stub autovivification used to stringify the glob, look it up again by
name, and then vivify the stub in the glob.
In commit
186a5ba82d584 I removed what seemed like a waste of CPU
cycles, but apparently it served some purpose. The lookup caused CvGV
to point to *Foo::nosub, rather than $x.
This commit restores the stringfy-and-lookup if the glob is coercible
(SvFAKE). It goes a little further and turns off the SvFAKE flag if
the glob just looked up is also FAKE.
It turns out this bug is old, and has been triggerable via glob copies
in stash elements for a long time.
186a5ba82d584 made it easier to
trigger the bug (so it is a regression from 5.16).
David Mitchell [Sun, 28 Jul 2013 13:09:44 +0000 (14:09 +0100)]
[MERGE] refactor pp_match(), pp_subst(), regexec()
Notionally the regexec engine has a well-defined API.
In practice, the caller of regexec() (typically pp_match() or pp_subst()),
is required to do a lot of set-up before calling regexec(), and some
post-processing afterwards; in particular to handle \G, to handle intuit,
and to set up $& correctly after an intuit-only match.
The series of commits in this branch refactors the code around these three
functions so that all the regex "knowledge" is now contained within
regexec() rather than in the calling pp functions. At the same, time the
pp functions have been heavily cleaned up and simplified where possible.
This reduces the LOC in pp_match() from 305 to 186.
The most visible refactorisation changes are that:
* the call to intuit is now done from regexec() rather than from pp*;
* ditto the setting of $& on intuit-only matches;
* all the extra setup for \G is now in a single block of code in regexec(),
rather than being distributed haphazardly across all 3 functions;
Along the way various things have been improved and bugs have been fixed:
* intuit-only matches had been inadvertently disabled when COW was enabled;
this now fixed. (An intuit-only match is where intuit finding a suitable
start position is sufficient to determine that the pattern has matched,
e.g. a fixed string pattern /abc/ without captures);
* intuit-only substitutions had never been enabled; they are now;
e.g /s/foo/bar/g
* formerly, intuit was skipped in the presence of anchored \G; this is no
longer the case, so that something like "aaaa" =~ /\G.*xx/ now fails
quickly due to the missing "xx";
* the COW code will try to reuse the COW copy SV on subsequent captures on
the same regex and string, rather than freeing and reallocating.
* substitutions will no longer permit themselves to iterate "backwards",
e.g. with s/.(?=.\G)/x/g;
* some obscure utf8 issues with s/// have been fixed;
* some bugs with \G fixed (and probably new ones added)
David Mitchell [Sun, 21 Jul 2013 10:57:22 +0000 (11:57 +0100)]
regexec(): add quick-fail test for anchored \G
under anchored \G, e.g. /ab\G/, we know that the start of the match must
be at (ganch-gofs); so fail quickly if that's off the beginning of the
string; or use it as the start point otherwise.
David Mitchell [Sun, 21 Jul 2013 10:31:21 +0000 (11:31 +0100)]
regexec: swap ganch setting and gofs offsetting
These two block of code are currently independent of each other, but swap
them round so that the calculated ganch value will be available for more
more clever gofs offset processing.
David Mitchell [Sat, 20 Jul 2013 15:16:10 +0000 (16:16 +0100)]
fix COW match capture optimisation
When an SV matches, a new SV is created which is a COW copy of the original
SV, and stored in prog->saved_copy, then prog->subbeg is set to point to
the (shared) PVX buffer.
Earlier in this branch I introduced an optimisation that skipped freeing
the old saved_copy and creating a new COW SV each time, if the old
saved_copy SV was already a shared copy of the SV being matched.
So far so good, except that I implemented it wrongly: if non-COW
matches (which malloc() subbeg) are interspersed with COW matches,
then the subbeg of the COW and the malloced subbeg get mixed up and
AddressSanitizer throws a wobbly.
The fix is simple: in the optimised branch, we still need to free subbeg
if RXp_MATCH_COPIED is true, then reassign it.
David Mitchell [Fri, 19 Jul 2013 21:00:23 +0000 (22:00 +0100)]
regexec(): avoid uninit use of var
clang pointed out that
if (...)
goto phooey;
oldsave = PL_savestack_ix;
...
phooey:
LEAVE_SCOPE(oldsave);
could use oldsave uninitialised. clang 1, dave 0.
David Mitchell [Fri, 19 Jul 2013 20:44:32 +0000 (21:44 +0100)]
fix /test_bootstrap.t under -DPERL_NO_COW
These tests check whether "require test.pl" inadvertently use $& etc.
They do that by doing a simple pattern match "Perl/ =~ /Perl/, then
checking that eval '$&' returns undef.
This has always been a dodgy thing o rely on. It turns out that under
5.18.0, whether eval '$&' was undef depended on whether the intuit-only-
match codepath was taken. So:
"Perl" =~ /Perl/; eval '$&'; # intuit-only match: returned undef
"Perl" =~ /\w+\w*/; eval '$&'; # regexec() match: returned 'Perl'.
In this branch, the same code path is now used for both intuit() and
regexec() matches, so both return 'Perl'.
So, abandon this approach to the test, and instead read in tets.pl and
grep for the test '$&' etc.
Requires minor fixup to test.pl to avoid a false positive.
David Mitchell [Fri, 19 Jul 2013 19:07:56 +0000 (20:07 +0100)]
fix build under -DPERL_NO_COW
An earlier commit in this branch fixed up capturing on intuit-only
matches.
However, the new code grabbed the buffer before setting offs[0].start,
offs[0].end. Under old-style non-COW, it uses offs[0].start and end to
determine what subset to the buffer to capture. So set them first!