This is a live mirror of the Perl 5 development currently hosted at
10 years agoperldiag.pod: Document overload’s invalid arg warning
Father Chrysostomos [Mon, 16 Jan 2012 17:59:49 +0000 (09:59 -0800)]
perldiag.pod: Document overload’s invalid arg warning

10 years Combine two loops
Father Chrysostomos [Mon, 16 Jan 2012 17:59:23 +0000 (09:59 -0800)] Combine two loops

It should go faster if we only iterate through %arg once.

10 years agoTest invalid arg warning from overload
Father Chrysostomos [Mon, 16 Jan 2012 17:50:47 +0000 (09:50 -0800)]
Test invalid arg warning from overload

10 years Put invalid arg warning in "overload" category
Father Chrysostomos [Mon, 16 Jan 2012 17:36:22 +0000 (09:36 -0800)] Put invalid arg warning in "overload" category

Existing overload warnings work that way.

10 years agoSuppress ‘useless’ warning in
Father Chrysostomos [Mon, 16 Jan 2012 17:32:09 +0000 (09:32 -0800)]
Suppress ‘useless’ warning in

10 years agoEmit a warning if an attempt is made to overload an invalid (e.g., misspelled) operat...
jkeenan [Sun, 15 Jan 2012 14:07:13 +0000 (09:07 -0500)]
Emit a warning if an attempt is made to overload an invalid (e.g., misspelled) operator. For RT #74098.

10 years agodefined(@array) now also warns for package variables.
Nicholas Clark [Wed, 4 Jan 2012 10:36:25 +0000 (11:36 +0100)]
defined(@array) now also warns for package variables.

10 years agoTest that defined warns for package arrays and hashes.
Nicholas Clark [Wed, 4 Jan 2012 10:23:17 +0000 (11:23 +0100)]
Test that defined warns for package arrays and hashes.

Currently TODO'd for package arrays. The existing tests were only for

10 years agoIn Perl_feature_is_enabled() use cBOOL to convert the pointer to a "bool".
Nicholas Clark [Mon, 16 Jan 2012 15:21:21 +0000 (16:21 +0100)]
In Perl_feature_is_enabled() use cBOOL to convert the pointer to a "bool".

On some platforms which don't have a (real) bool type, bool is actually a
char, and hence (sadly) it's correct for the compiler to truncate when
assigning to it, instead of what the programmer thought was going to happen
(testing zero or not). In Perl_feature_is_enabled(), the expression is a
pointer, so if it converts to an integer with the bottom 8 bits zero, then
on these platforms it would truncate to "false". Not what was expected.

10 years agoShuffle my entry around to use my name instead of old email
Steffen Mueller [Mon, 16 Jan 2012 07:25:09 +0000 (08:25 +0100)]
Shuffle my entry around to use my name instead of old email

10 years agoCorrect Hojung Youn's name in AUTHORS
Hojung Youn [Mon, 16 Jan 2012 07:19:07 +0000 (08:19 +0100)]
Correct Hojung Youn's name in AUTHORS

10 years agoBump ExtUtils::Manifest version due to commits 97bae9c5 and bf081550
Chris 'BinGOs' Williams [Sun, 15 Jan 2012 21:49:01 +0000 (21:49 +0000)]
Bump ExtUtils::Manifest version due to commits 97bae9c5 and bf081550

10 years agoBump autouse version due to commit f965e9d4a
Chris 'BinGOs' Williams [Sun, 15 Jan 2012 21:42:59 +0000 (21:42 +0000)]
Bump autouse version due to commit f965e9d4a

10 years agostat.t: Avoid unconditional lstat on file name
Father Chrysostomos [Sun, 15 Jan 2012 19:36:35 +0000 (11:36 -0800)]
stat.t: Avoid unconditional lstat on file name

lstat on handles is ok.

10 years agostat.t, filetest.t: Actually gen rand file names
Father Chrysostomos [Sun, 15 Jan 2012 19:22:34 +0000 (11:22 -0800)]
stat.t, filetest.t: Actually gen rand file names

This mistake of mine was stupid enough I laughed out loud.

10 years agoperldelta up to 55b5114f4
Father Chrysostomos [Sun, 15 Jan 2012 06:35:47 +0000 (22:35 -0800)]
perldelta up to 55b5114f4

10 years ago[perl #108224] B::Deparse doesn't recognize for continue block
Hojung Youn [Sun, 15 Jan 2012 03:03:19 +0000 (12:03 +0900)]
[perl #108224] B::Deparse doesn't recognize for continue block

B::Deparse foreach scoping problem was fixed at cf24a84005,
which was issued at #30504. But B::Deparse was blinded
temporarily by this commit so that it couldn't recognize
foreach continue block for a moment.

foreach statement generates 'nextstate', 'stub', 'leave', or
'scope' root opcode at will when foreach statement is not used
as a oneline statement modifier. So all the case of opcodes
should be checked.

Some tests for foreach scoping and continue block are attached.

related: #30504

10 years agoperldelta up to 9f71cfe6ef2
Father Chrysostomos [Sun, 15 Jan 2012 06:05:13 +0000 (22:05 -0800)]
perldelta up to 9f71cfe6ef2

10 years agoIn vmsify, leave ../ path components alone.
Craig A. Berry [Sun, 15 Jan 2012 04:40:24 +0000 (22:40 -0600)]
In vmsify, leave ../ path components alone.

Way back in 08c7cbbb0fc466967038dcb56ca4f1b828b96269, we started
eliminating ../ components when converting paths from Unix syntax
to VMS syntax.  No corresponding change was made when converting
in the opposite direction, so this was inconsistent.  We should
get a valid path either way, but doing more interpretation than
necessary seems uncalled for, so this patch restores the previous

This also paves the way to eliminate some inconsistencies between
what we do when Extended Filename Syntax (EFS) is in effect and
when it's not.

10 years agoUn-TODO some VMS file spec tests under EFS.
Craig A. Berry [Sat, 14 Jan 2012 22:24:16 +0000 (16:24 -0600)]
Un-TODO some VMS file spec tests under EFS.

When Extended Filename Syntax is enabled, several tests were
expecting not to pass, but they do, so we should say so.  Also,
reinstate a test removed in 1fe570cc5e24eecfb07059e53e95fa864bb44142.

10 years agoMake lstat($ioref) and lstat($gv) consistent
Father Chrysostomos [Sat, 14 Jan 2012 21:12:07 +0000 (13:12 -0800)]
Make lstat($ioref) and lstat($gv) consistent

As documented in perldiag, lstat($gv) warns and does an fstat.

lstat($ioref) wasn’t doing what was documented, but after warning
would do the same as stat(_).

10 years agostat.t: Make test for -T _ and lstat more robust
Father Chrysostomos [Sat, 14 Jan 2012 20:59:34 +0000 (12:59 -0800)]
stat.t: Make test for -T _ and lstat more robust

It is now less likely to fail if one runs stat.t manually when tests
are running, due to the random file name.  It also works now when the
script chdirs (when run outside t), because it no longer relies on $0
being a real file.

That last part was broken by commit ad2d99e39, which made -T _ more
consistent when it cannot open the file.  It used to set the stat
type, but not the success status (as of commit 25988e07, which
fixed #4253).

10 years agoDocument the data columns in vms/ext/filespec.t.
Craig A. Berry [Sat, 14 Jan 2012 19:16:26 +0000 (13:16 -0600)]
Document the data columns in vms/ext/filespec.t.

10 years agoStop inadvertently skipping Spec.t on VMS.
Craig A. Berry [Fri, 6 Jan 2012 20:23:59 +0000 (14:23 -0600)]
Stop inadvertently skipping Spec.t on VMS.

ae5a807c7dcf moved a check against $@ away from the eval it was
checking and inserted another eval in between, the effect of which
was to make the tests that can only run on VMS get skipped there
too.  Ouch.

There are other problems with ae5a807c7dcf, but this is a start.

10 years agopp_sys.c: goto mustn’t skip initialisation
Father Chrysostomos [Sat, 14 Jan 2012 19:31:45 +0000 (11:31 -0800)]
pp_sys.c: goto mustn’t skip initialisation

10 years agoperldelta up to 7c2b3c783b
Father Chrysostomos [Sat, 14 Jan 2012 09:16:58 +0000 (01:16 -0800)]
perldelta up to 7c2b3c783b

10 years agomagic.t: Correct miniperl skip count
Father Chrysostomos [Sat, 14 Jan 2012 09:01:33 +0000 (01:01 -0800)]
magic.t: Correct miniperl skip count

10 years ago-T "unreadable file" should set stat info consistently
Father Chrysostomos [Sat, 14 Jan 2012 08:23:23 +0000 (00:23 -0800)]
-T "unreadable file" should set stat info consistently

This was mentioned in ticket #77388.  It turns out to be
related to #4253.

If the file cannot be opened, -T and -B on filenames set the last han-
dle to null and set the last stat type to stat, but leave the actual
stat buffer and success status as they were.

That means that stat(_) will continue to return the previous buffer,
but lstat(_) will no longer work.

This is another of those inconsistent cases where the internal stat
info is only partially set.

Originally, this code would set PL_laststatval (the success status) to
-1.  Commit 25988e07 (the patch in ticket #4253) intentionally changed
this to make -T _ less suprising on read-only files.

But the patch ended up affecting -T with an explicit file name, too.
It also only partially fixed things for -T _, because the last stat
type *was* still being set.

This commit changes it to set all the stat info, for explicit file
names, or no stat info, for _ (if the previous stat was with a
file name).

10 years agostat.t: Add bug number
Father Chrysostomos [Sat, 14 Jan 2012 08:40:05 +0000 (00:40 -0800)]
stat.t: Add bug number

10 years agoDon’t emit unopened warning for other stat(HANDLE) error
Father Chrysostomos [Sat, 14 Jan 2012 08:33:15 +0000 (00:33 -0800)]
Don’t emit unopened warning for other stat(HANDLE) error

-r or -T on a GV with no IO or on an IO with no fp (or dirp for -r)
will produce an ‘unopened’ warning.  stat() on a filehandle will warn
about an unopened filehandle not only if there is no fp, but also if
the fstat call fails (with errno containing EBADP, EFAULT or EIO, at
least on Darwin).

I don’t know if there is a way to test this.

(But pp_stat and my_stat_flags are getting closer, so this must be
correct. :-)

10 years agoMake -T BADHANDLE set errno with fatal warnings
Father Chrysostomos [Sat, 14 Jan 2012 08:07:46 +0000 (00:07 -0800)]
Make -T BADHANDLE set errno with fatal warnings

Due to the order of the statements, SETERRNO would never be reached
with fatal warnings.

I’ve added another SETERRNO out of paranoia.  If there is a nicely-
behaved __WARN__ handler, we should still be setting errno just before
-T returns, in case the handler changed it.  We can’t do much in
the case of fatal handlers that do system calls.  (Is $! localised
for those?)

10 years agoMake -l HANDLE set PL_laststatval with fatal warnings
Father Chrysostomos [Sat, 14 Jan 2012 08:00:26 +0000 (00:00 -0800)]
Make -l HANDLE set PL_laststatval with fatal warnings

Fatal warnings were preventing it from being set, because the warning
came first.

(PL_laststatval records the success status of the previous stat.)

10 years agoMake -T HANDLE and -B HANDLE always set last stat type
Father Chrysostomos [Sat, 14 Jan 2012 07:50:15 +0000 (23:50 -0800)]
Make -T HANDLE and -B HANDLE always set last stat type

-T and -B on handles always set PL_laststatval (which indicates the
success of the previous stat).  But they don’t set the last stat type
(PL_laststype) for closed filehandles.  Those two should always go
together.  stat and -r, -w etc., always set PL_laststype for a closed
or missing filehandle.

10 years agopp_sys.c:pp_fttest: Don’t set PL_statname to SvPV(PL_statname)
Father Chrysostomos [Sat, 14 Jan 2012 07:42:04 +0000 (23:42 -0800)]
pp_sys.c:pp_fttest: Don’t set PL_statname to SvPV(PL_statname)

This is a waste of CPU cycles.

PL_statname is always a PV.

10 years agoMake -T _ and -B _ always set PL_laststatval
Father Chrysostomos [Sat, 14 Jan 2012 07:38:57 +0000 (23:38 -0800)]
Make -T _ and -B _ always set PL_laststatval

-T _ and -B _ always do another stat() on the previous file handle or
filename, unless it is a handle that has been closed.

Normally, the internal stat buffer, status, etc., are reset even for
_.  This happens even on a failed fstat().

-T HANDLE and -B HANDLE currently *do* reset the stat status
(PL_laststatval) if there is no IO thingy, so having -T _ and -B _ not
do that makes things needlessly inconsistent.

10 years agopp_sys.c: Remove space from lstat($ioref) warning
Father Chrysostomos [Sat, 14 Jan 2012 06:47:31 +0000 (22:47 -0800)]
pp_sys.c: Remove space from lstat($ioref) warning

This was emitting two spaces before the ‘at’:

lstat() on filehandle  at -e line 1.

10 years agopp_sys.c:pp_fttext: Don’t extend the stack after popping
Father Chrysostomos [Sat, 14 Jan 2012 06:19:23 +0000 (22:19 -0800)]
pp_sys.c:pp_fttext: Don’t extend the stack after popping

10 years agoSquash repetitititive code in doio.c:my_stat_flags
Father Chrysostomos [Sat, 14 Jan 2012 04:31:23 +0000 (20:31 -0800)]
Squash repetitititive code in doio.c:my_stat_flags

10 years agoMake failed filetests consistent with & w/out fatal warnings
Father Chrysostomos [Sat, 14 Jan 2012 04:28:46 +0000 (20:28 -0800)]
Make failed filetests consistent with & w/out fatal warnings

The result of stat(_) after a failed -r HANDLE would differ depending
on whether fatal warnings are on.  This corrects that, by setting the
internal status before warning about an unopened filehandle.

10 years agostat $ioref should record the handle for -T _
Father Chrysostomos [Sat, 14 Jan 2012 00:52:23 +0000 (16:52 -0800)]
stat $ioref should record the handle for -T _

stat $gv records the handle so that -T _ can use it.  But stat $ioref
hasn’t been doing that, until this commit.

PL_statgv can now hold an SVt_PVIO instead of a SVt_PVGV.

10 years agostat $ioref should reset the internal stat type
Father Chrysostomos [Sat, 14 Jan 2012 00:43:30 +0000 (16:43 -0800)]
stat $ioref should reset the internal stat type

In addition to a stat buffer, Perl keeps track internally of which
type of stat was done last, either stat or lstat, so that lstat _ can
die if the previous type was stat.

This was not being reset for stat $ioref.  Filetest ops were fine.

10 years agoSet PL_statgv to null when freed or coerced
Father Chrysostomos [Fri, 13 Jan 2012 23:50:51 +0000 (15:50 -0800)]
Set PL_statgv to null when freed or coerced

If PL_statgv is not set to null when freed, that same SV could be
reused for another GV, in which case -T _ will then use another handle
unrelated to the previous stat.

Similarly, if PL_statgv points to a fake glob that gets coerced into
a non-glob before it is freed, it will not follow the code path in
sv_free that sets PL_statgv to null.  Furthermore, if it becomes a GV
again, it could be a completely different filehandle, unrelated to the
previous stat.

10 years agoSuppress confusing uninit warning from -T _
Father Chrysostomos [Fri, 13 Jan 2012 22:26:19 +0000 (14:26 -0800)]
Suppress confusing uninit warning from -T _

-T _ uses the file name saved by a preceding stat.  If there was no
preceding stat, the internal sv used to store the file name is unde-
fined, so SvPV producing an uninitialized warning.  Normally a failed
-T will just return undefined and set $!.  Normally stat on a filehan-
dle will set the internal stat file name to "".

This commit sets the internal file name to "" initially on startup,
instead of creating an undefined scalar.

10 years agodefined *{"+"} should not stop %+ from working
Father Chrysostomos [Fri, 13 Jan 2012 17:32:20 +0000 (09:32 -0800)]
defined *{"+"} should not stop %+ from working

The same applies to %-.

This is something I broke when merging is_magical_gv with

gv_fetchpvn_flags must make sure its *+ glob is present in the symbol
table when it loads Tie::Hash::NamedCapture.  If it adds it afterwards
it will clobber another *+ that Tie::Hash::NamedCapture has autovivi-
fied and tied in the mean time.

10 years agodefined *{"!"} should not stop %! from working
Father Chrysostomos [Fri, 13 Jan 2012 17:23:07 +0000 (09:23 -0800)]
defined *{"!"} should not stop %! from working

This is something I broke when merging is_magical_gv with

gv_fetchpvn_flags must make sure its *! glob is present in the sym-
bol table it loads Errno.  If it adds it afterwards it will clobber
another *! that Errno has autovivified and tied in the mean time.

10 years agoSquash repetititive code in util.c:report_evil_fh
Father Chrysostomos [Fri, 13 Jan 2012 00:41:59 +0000 (16:41 -0800)]
Squash repetititive code in util.c:report_evil_fh

10 years agoperldelta for Unicode property performance changes
Karl Williamson [Fri, 13 Jan 2012 16:38:50 +0000 (09:38 -0700)]
perldelta for Unicode property performance changes

I put this under a major change, but would be fine if it is moved to an
=item change.

10 years agoutil.c: Silence compiler warning
Karl Williamson [Sun, 8 Jan 2012 17:23:45 +0000 (10:23 -0700)]
util.c: Silence compiler warning

cc on solaris is smart enough to figure out that this return isn't

10 years agoregcomp.c: Compile inverted character classes with \p{}
Karl Williamson [Fri, 6 Jan 2012 22:05:11 +0000 (15:05 -0700)]
regcomp.c: Compile inverted character classes with \p{}

This commit causes character classes of the form [^\p{...}] to have
their code points known at compile time instead of runtime.  This allows
for better optimization and runtime execution speed.

10 years agoregcomp.c: Prepare for allowing [^\p{...}]
Karl Williamson [Fri, 6 Jan 2012 21:51:27 +0000 (14:51 -0700)]
regcomp.c: Prepare for allowing [^\p{...}]

It turns out that this code is buggy, except for the fact that
<nonbitmap> currently can't contain conflicts.  The trouble would have
started when Unicode properties were moved to being looked at at compile
time -- except when the class is to be inverted, so there isn't a
problem.  But in preparation for handling this case, we fix the
potential bugs, as specified in the comments.

10 years agoregcomp.c; Use Latin1 \p{} in optimization
Karl Williamson [Fri, 6 Jan 2012 21:38:37 +0000 (14:38 -0700)]
regcomp.c; Use Latin1 \p{} in optimization

This commit causes any Latin1-range characters from Unicode properties
to be placed at compile time into the bitmap of the ANYOF node that
implements those properties, and to remove the flag that says they
should be looked for at run time.  This causes the optimizer to generate
a better start class, as it knows more fully which characters can be and
can't be in the start class, and speeds up runtime checking, as it can
just do a bitmap test for these, instead of having to go look at the

10 years agoregcomp.c: Better optimize [classes] under /aa.
Karl Williamson [Fri, 6 Jan 2012 20:46:17 +0000 (13:46 -0700)]
regcomp.c: Better optimize [classes] under /aa.

An optimization introduced in 5.14 is for bracketed character classes of
the very special form like [Bb].  These can be optimized into an
EXACTFish node.  In this case, they can be optimized to an EXACTFA node
since they are ASCII characters.  If the surrounding options are /aa, it
is likely that any adjacent EXACTFish nodes will be EXACTFA, so optimize
to that node instead of the previous EXACTFU.  This will allow the
optimizer to collapse any adjacent nodes.  For example


will now get optimized to  an EXACTFA of "abc".  Previously it would
have gotten optimized to EXACTFA<a> . EXACTFU<b> . EXACTFA<c>.

10 years agoregcomp.c: Avoid unnecessary runtime fold checking
Karl Williamson [Fri, 6 Jan 2012 20:27:17 +0000 (13:27 -0700)]
regcomp.c: Avoid unnecessary runtime fold checking

Since 5.14, the single-char folds have been calculated at compile time,
either by doing it there, or for properties, setting the swash name to
include a foleded or non-folded version of the property.  Thus this
patch could have been done much earlier.

Now, most of the properties are actually computed at compile time by
previous patches, but that isn't relevant to this one.

Thus there really doesn't need to be runtime folding for things that
aren't in the bitmap, except for those things under /d that match only
if the string is in UTF8.

10 years agoregcomp.c: Change loop variable name, associated changes
Karl Williamson [Fri, 6 Jan 2012 17:18:53 +0000 (10:18 -0700)]
regcomp.c: Change loop variable name, associated changes

The variable 'value' is already used for something else.  Using it as a
loop variable corrupts the other use.  This commit changes to a
different name, and adds code to keep 'value', and 'prevvalue' in sync
with their other meanings.

10 years agoregexec.c: Use shared swash in bracketed character classes
Karl Williamson [Fri, 6 Jan 2012 04:15:45 +0000 (21:15 -0700)]
regexec.c: Use shared swash in bracketed character classes

This takes advantage of an earlier commit to use a swash that may be
shared across multiple character class instances.  That means that if a
match in another class has to look up a value, that that same value is
automatically available without further lookup to all character classes
that share the swash.  This means that the lookup result only needs be
cached once for all instances in the thread, saving time and memory.

Note that currently the only swashes that are shared are those that
consist solely of a single Unicode property definition.  Some sort of
checksum would have to be computed if this were to be extended to
custom classes.  But what this does is cause sharing for all Unicode
properties that aren't in bracketed classes (as they are implemented as
a bracketed class with a single element), as well as the few cases where
someone explicitly writes [\p{foo}] without anything else in the class.

10 years agoregexec.c: Allow for returning shared swash
Karl Williamson [Fri, 6 Jan 2012 04:10:28 +0000 (21:10 -0700)]
regexec.c: Allow for returning shared swash

This changes the function that returns the swash associated with a
bracketed character class so that it returns the original swash and not
a copy.  The function is renamed and made accessible only from within
regexec.c, and a new wrapper function with the original name is created
that just calls the other one and returns a copy of the swash.

Thus, all access from outside regexec.c will use a copy which if
overwritten will not harm others; while the option exists from within
regexec.c to use a shared version.

10 years agoregcomp.c: Clean up comment
Karl Williamson [Thu, 5 Jan 2012 22:53:25 +0000 (15:53 -0700)]
regcomp.c: Clean up comment

10 years agoperlunicode: Discourage use of is_utf8_char()
Karl Williamson [Thu, 5 Jan 2012 22:42:08 +0000 (15:42 -0700)]
perlunicode: Discourage use of is_utf8_char()

10 years agoperlop: Typos, too long lines, corrections
Karl Williamson [Thu, 5 Jan 2012 22:27:35 +0000 (15:27 -0700)]
perlop: Typos, too long lines, corrections

10 years agointrpvar.h: clarification in comment
Karl Williamson [Thu, 5 Jan 2012 22:24:11 +0000 (15:24 -0700)]
intrpvar.h: clarification in comment

10 years agoutf8.c: fix typo in pod
Karl Williamson [Thu, 5 Jan 2012 22:23:16 +0000 (15:23 -0700)]
utf8.c: fix typo in pod

10 years agoregcomp.c: Avoid leaking a scalar
Karl Williamson [Thu, 5 Jan 2012 22:17:18 +0000 (15:17 -0700)]
regcomp.c: Avoid leaking a scalar

10 years agoregcomp.c: truncate long debug dump output
Karl Williamson [Thu, 5 Jan 2012 20:27:35 +0000 (13:27 -0700)]
regcomp.c: truncate long debug dump output

What an ANYOF node matches could theoretically be millions of characters
long;  This only outputs the first portion of very long ones.

10 years agoregcomp.c: in debug output, don't duplicate code points
Karl Williamson [Thu, 5 Jan 2012 20:21:57 +0000 (13:21 -0700)]
regcomp.c: in debug output, don't duplicate code points

The non-bitmap portion of an ANYOF node may also be in the bitmap
portion.  There is no sense in having duplicate output

10 years agoregcomp.c: Change debug dump of bitmap/non-bitmap
Karl Williamson [Thu, 5 Jan 2012 20:17:19 +0000 (13:17 -0700)]
regcomp.c: Change debug dump of bitmap/non-bitmap

Instead of '...' separating the two components of the output, change it
to a single space, which is output only if the first component isn't

10 years agoregcomp.c: Change \t to a - in debug dumping ranges
Karl Williamson [Thu, 5 Jan 2012 20:13:55 +0000 (13:13 -0700)]
regcomp.c: Change \t to a - in debug dumping ranges

This changes the separator in the output of a range from a tab to a
hyphen, which is clearer.

10 years agoregcomp.c: White-space only
Karl Williamson [Thu, 5 Jan 2012 20:01:36 +0000 (13:01 -0700)]
regcomp.c: White-space only

Remove trailing tabs

10 years agoregcomp.c: put_byte wants an ord, not a utf8 char
Karl Williamson [Thu, 5 Jan 2012 18:44:48 +0000 (11:44 -0700)]
regcomp.c: put_byte wants an ord, not a utf8 char

These were calling put_byte() incorrectly, with a utf8 char instead of a
the ordinal.

10 years agoregcomp.c: White-space only
Karl Williamson [Thu, 5 Jan 2012 18:41:36 +0000 (11:41 -0700)]
regcomp.c: White-space only

These lines were indented one stop too many for the enclosing block

10 years agoregcomp.c: Don't read beyond input
Karl Williamson [Tue, 29 Nov 2011 21:57:02 +0000 (14:57 -0700)]
regcomp.c: Don't read beyond input

This code was assuming that there were several more bytes in the input
stream, when there may not be.  This was discovered by valgrind.

10 years agoregcomp.c: Optimize a single Unicode property in a [character class]
Karl Williamson [Mon, 28 Nov 2011 19:32:02 +0000 (12:32 -0700)]
regcomp.c: Optimize a single Unicode property in a [character class]

All Unicode properties actually turn into bracketed character classes,
whether explicitly done or not.  A swash is generated for each property
in the class.  If that is the only thing not in the class's bitmap, it
specifies completely the non-bitmap behavior of the class, and can be
passed explicitly to regexec.c.  This avoids having to regenerate the
swash.  It also means that the same swash is used for multiple instances
of a property.  And that means the number of duplicated data structures
is greatly reduced.  This currently doesn't extend to cases where
multiple Unicode properties are used in the same class
[\p{greek}\p{latin}] will not share the same swash as another character
class with the same components.  This is because I don't know of a
an efficient method to determine if a new class being parsed has the
same components as one already generated.  I suppose some sort of
checksum could be generated, but that is for future consideration.

10 years agoMove Unicode property defn processing to compile time
Karl Williamson [Mon, 28 Nov 2011 17:26:28 +0000 (10:26 -0700)]
Move Unicode property defn processing to compile time

This patch moves the processing of most Unicode property definitions
from execution (regexec.c) to compilation (regcomp.c).  There is a cost
to do this.  By deferring it to execution, it may be that the affected
path will never be taken, and hence the work won't have to be done;
whereas, it's always done if it gets done at compilation.

However, doing it at compilation, has many advantages.  We can't
optimize what we don't know about, so this allows for better
optimization, as well as feature enhancements, such as set
manipulations, restricting matches to certain scripts, etc.  A big one,
about to be committed allows for significantly reducing the number of
copies of the data structure used for each property.  (Currently, every
mention in every regular expression of a given property will generate a
new instance of its hash, and so results of look-ups of code points in
one instance aren't automatically known to other instances, so the code
point has to be looked-up again.)

This commit leaves the processing to execution time when the class is to
be inverted.  This was done purely to make the commit smaller, and will
be removed in a future commit; hence the redundant test here will be
removed shortly.

It also has to leave to execution time processing of properties whose
definition is not known yet.  That can happen when the property is
user-defined.  We call _core_swash_init(), and if it fails, we assume
that it's because it's such a property, and if it turns out that it was
an unknown property, we leave to execution time the raising of a warning
for it, just as before.

Currently, the processing of properties in inverted character classes is
also left to execution time.  This restriction will be lifted in a
future commit, and this patch assumes that, and doesn't indent some code
that it otherwise would, in anticipation of the surrounding 'if' tests
being removed.

10 years agoregcomp.c: Pass inversion list directly to regexec.c
Karl Williamson [Mon, 28 Nov 2011 16:43:54 +0000 (09:43 -0700)]
regcomp.c: Pass inversion list directly to regexec.c

Currently, any generated inversion list is stringified and passed in the
data structure to regexec.c as such.  regexec.c then calls
_core_swash_init() to convert it into a swash and back into an inversion
list.  This intermediate step is wasteful, and this commit dispenses
with it, based on preparatory commits in regexec.c and utf8.c

10 years agoregexec.c: Prepare for inversion lists in ANYOF nodes
Karl Williamson [Mon, 28 Nov 2011 16:25:45 +0000 (09:25 -0700)]
regexec.c: Prepare for inversion lists in ANYOF nodes

Future commits will start passing inversion lists to regexec.c from the
compilation phase.  This commit causes regexec.c to accept them, trace
them for debug output, and pass them along to utf8.c

10 years agoregcomp.c: Add _invlist_contents() to compactly dump inversion list
Karl Williamson [Mon, 28 Nov 2011 16:20:12 +0000 (09:20 -0700)]
regcomp.c: Add _invlist_contents() to compactly dump inversion list

This will be used in future commits for debug traces

10 years agoutf8.c: White-space only
Karl Williamson [Mon, 28 Nov 2011 16:00:52 +0000 (09:00 -0700)]
utf8.c: White-space only

As a result of previous commits adding and removing if() {} blocks,
indent and outdent and reflow comments and statements to not exceed 80

10 years agoutf8.c: Add ability to pass inversion list to _core_swash_init()
Karl Williamson [Mon, 28 Nov 2011 15:36:54 +0000 (08:36 -0700)]
utf8.c: Add ability to pass inversion list to _core_swash_init()

Add a new parameter to _core_swash_init() that is an inversion list to
add to the swash, along with a boolean to indicate if this inversion
list is derived from a user-defined property.  This capability will prove
useful in future commits

10 years agoutf8.c: Add flag to swash_init() to not croak on error
Karl Williamson [Mon, 28 Nov 2011 15:24:07 +0000 (08:24 -0700)]
utf8.c: Add flag to swash_init() to not croak on error

This adds the capability, to be used in future commits, for swash_ini()
to return NULL instead of croaking if it can't find a property, so that
the caller can choose how to handle the situation.

10 years agoregcomp.c: Use '*a == b', not 'a == &b'
Karl Williamson [Mon, 28 Nov 2011 03:55:33 +0000 (20:55 -0700)]
regcomp.c: Use '*a == b', not 'a == &b'

The latter doesn't always work.  The consequences of this failure were
memory leaks

10 years agoregcomp.c: decrement ptr ref cnt before invalidating ptr
Karl Williamson [Mon, 28 Nov 2011 03:53:56 +0000 (20:53 -0700)]
regcomp.c: decrement ptr ref cnt before invalidating ptr

Otherwise there coul be memory leaks

10 years agoregcomp.c: Add some assertions
Karl Williamson [Mon, 28 Nov 2011 03:49:59 +0000 (20:49 -0700)]
regcomp.c: Add some assertions

Subsequent code assumes that these are true

10 years agoregcomp.c: Don't overallocate space for cloned SV
Karl Williamson [Sun, 27 Nov 2011 22:45:22 +0000 (15:45 -0700)]
regcomp.c: Don't overallocate space for cloned SV

The length passed to _new_invlist() is in elements and not bytes, so
this was overallocating space because the number of bytes is multiplied
by a platform-dependent value.

10 years agoregcomp.c: Make sure invlist_clone length set correctly
Karl Williamson [Sun, 27 Nov 2011 22:41:26 +0000 (15:41 -0700)]
regcomp.c: Make sure invlist_clone length set correctly

The cloned inversion list was getting initialized with sufficient space,
but because a Copy was used, it did not know how much of that space is
occupied.  There are no tests, because this was found through valgrind,
and it otherwise depends on whatever was in the uninitialized data at
the time

10 years agoutf8.c: Prevent reading before buffer start
Karl Williamson [Sun, 27 Nov 2011 22:34:52 +0000 (15:34 -0700)]
utf8.c: Prevent reading before buffer start

Make sure there is something before the character being read before
reading it.

10 years agoUtf8.c: Generate and use inversion lists for binary swashes
Karl Williamson [Sun, 27 Nov 2011 01:24:46 +0000 (18:24 -0700)]
Utf8.c: Generate and use inversion lists for binary swashes

Prior to this patch, every time a code point was matched against a swash,
and the result was not previously known, a linear search through the
swash was performed.  This patch changes that to generate an inversion
list whenever a swash for a binary property is created.  A binary search
is then performed for missing values.

This change does not have much effect on the speed of Perl's regression
test suite, but the speed-up in worst-case scenarios is huge.  The
program at the end of this commit is crafted to avoid the caching that
hides much of the current inefficiencies.  At character classes of 100
isolated code points, the new method is about an order of magnitude
faster; two orders of magnitude at 1000 code points.  The program at the
end of this commit message took 97s to execute on my box using blead,
and 1.5 seconds using this new scheme.  I was surprised to see that even
with classes containing fewer than 10 code points, the binary search
trumped, by a little, the linear search

Even after this patch, under the current scheme, one can easily run out
of memory due to the permanent storing of results of swash lookups in
hashes.  The new search mechanism might be fast enough to enable the
elimination of that memory usage.  Instead, a simple cache in each
inversion list that stored its previous result could be created, and
that checked to see if it's still valid before starting the search,
under the assumption, which the current scheme also makes, that probes
will tend to be clustered together, as nearby code points are often in
the same script.
 # This program creates longer and longer character class lists while
 # testing code points matches against them.  By adding or subtracting
 # 65 from the previous member, caching of results is eliminated (as of
 # this writing), so this essentially tests for how long it takes to
 # search through swashes to see if a code point matches or not.

use Benchmark ':hireswallclock';

my $string = "";
my $class_cp = 2**30;   # Divide the code space in half, approx.
my $string_cp = $class_cp;
my $iterations = 10000;
for my $j (1..2048) {

    # Append the next character to the [class]
    my $hex_class_cp = sprintf("%X", $class_cp);
    $string .= "\\x{$hex_class_cp}";
    $class_cp -= 65;

    next if $j % 100 != 0;  # Only test certain ones

    print "$j: lowest is [$hex_class_cp]: ";

    timethis(1, "no warnings qw(portable non_unicode);my \$i = $string_cp; for (0 .. $iterations) { chr(\$i) =~ /[$string]/; \$i+= 65 }");
    $string_cp += ($iterations + 1) * 65;

10 years agoregcomp.c: Add _invlist_populate_swatch()
Karl Williamson [Fri, 25 Nov 2011 19:59:51 +0000 (12:59 -0700)]
regcomp.c: Add _invlist_populate_swatch()

This function will be used in future commits

10 years agoregcomp.c: Add invlist_search()
Karl Williamson [Fri, 25 Nov 2011 19:49:02 +0000 (12:49 -0700)]
regcomp.c: Add invlist_search()

This function does a binary search on an inversion list.  It will be
used in future commits

10 years agoutf8.c: Refactor code slightly in prep
Karl Williamson [Thu, 24 Nov 2011 03:11:26 +0000 (20:11 -0700)]
utf8.c: Refactor code slightly in prep

Future commits will split up the necessary initialization into two
components.  This patch prepares for that without adding anything new.

10 years agoregcomp.c: Change internal #define name
Karl Williamson [Tue, 22 Nov 2011 20:37:04 +0000 (13:37 -0700)]
regcomp.c: Change internal #define name

I have struggled to come up with a good name for this concept; and like
the new one better than the old

10 years agoutf8.c: New function to retrieve non-copy of swash
Karl Williamson [Tue, 22 Nov 2011 19:06:41 +0000 (12:06 -0700)]
utf8.c: New function to retrieve non-copy of swash

Currently, swash_init returns a copy of the swash it finds.  The core
portions of the swash are read-only, and the non-read-only portions are
derived from them.  When the value for a code point is looked up, the
results for it and adjacent code points are stored in a new element,
so that the lookup never has to be performed again.  But since a copy is
returned, those results are stored only in the copy, and any other uses
of the same logical stash don't have access to them, so the lookups have
to be performed for each logical use.

Here's an example.  If you have 2 occurrences of /\p{Upper}/ in your
program, there are 2 different swashes created, both initialized
identically.  As you start matching against code points, say "A" =~
/\p{Upper}/, the swashes diverge, as the results for each match are
saved in the one applicable to that match.  If you match "A" in each
swash, it has to be looked up in each swash, and an (identical) element
will be saved for it in each swash.  This is wasteful of both time and

This patch renames the function and returns the original and not a copy,
thus eliminating the overhead for stashes accessed through the new
interface.  The old function name is serviced by a new function which
merely wraps the new name result with a copy, thus preserving the
interface for existing calls.

Thus, in the example above, there is only one swash, and matching "A"
against it results in only one new element, and so the second use will
find that, and not have to go out looking again.  In a program with lots
of regular expressions, the savings in time and memory can be quite

The new name is restricted to use only in regcomp.c and utf8.c (unless
XS code cheats the preprocessor), where we will code so as to not
destroy the original's data.  Otherwise, a change to that would change
the definition of a Unicode property everywhere in the program.

Note that there are no current callers of the new interface; these will
be added in future commits.

10 years Add inversion status to cache key
Karl Williamson [Tue, 22 Nov 2011 16:18:28 +0000 (09:18 -0700)] Add inversion status to cache key

Contrary to what the debug statement said, what is being returned is a
swash, and that swash is different from one that comes from the same
file but differs in inversion, and so changing the INVERT_IT element
messes things up for any existing one.  Heretofore it hasn't mattered
because the swash returned is always a copy, and so it actually hasn't
created any problems.  But future commits will stop the copying, so this
would create problems then.

The file will now have to be re-'do'ne to get an inverted list from it.

10 years agouni/cache.t: Fix to handle regex compile time Uni props
Karl Williamson [Mon, 21 Nov 2011 02:10:19 +0000 (19:10 -0700)]
uni/cache.t: Fix to handle regex compile time Uni props

Future commits are planned to move the resolution of Unicode properties
from regex execution time to compile time.  By moving the code into a
BEGIN block, this .t can now handle both types.  Before this patch, it
wouldn't show any activity at all if things are done at compile time.

10 years agoembed.fnc: swash_init() return value should not be ignored
Karl Williamson [Sun, 20 Nov 2011 16:03:26 +0000 (09:03 -0700)]
embed.fnc: swash_init() return value should not be ignored

Otherwise can have memory leaks

10 years agoutf8.c: Change name of static function
Karl Williamson [Sat, 19 Nov 2011 23:50:33 +0000 (16:50 -0700)]
utf8.c: Change name of static function

This function has always confused me, as it doesn't return a swash, but
a swatch.

10 years agoutf8_heavy: Allow to be called from regcomp.c
Karl Williamson [Sat, 19 Nov 2011 21:49:20 +0000 (14:49 -0700)]
utf8_heavy: Allow to be called from regcomp.c

Future commits will cause regcomp.c to try to compile user-defined
properties.  The caller stack is different for this, and there may be a
package name as well that differs from the existing scheme.  This commit
allows for this.

10 years agoutf8_heavy: Add DEBUG statement
Karl Williamson [Sat, 19 Nov 2011 21:47:33 +0000 (14:47 -0700)]
utf8_heavy: Add DEBUG statement

This helps keep track of the recursion used.

10 years agoutf8.c: Move test out of loops
Karl Williamson [Sat, 19 Nov 2011 21:41:26 +0000 (14:41 -0700)]
utf8.c: Move test out of loops

We set the upper limit of the loops before entering them to the min of
the two possible limits, thus avoiding a test each time through

10 years agomktables: Add a little stress to the tests
Karl Williamson [Sat, 19 Nov 2011 21:37:35 +0000 (14:37 -0700)]
mktables: Add a little stress to the tests

This simply reverses the sort order so that the generated tests
use the highest ranges instead of the lowest, making it less likely that
tests will pass by chance; and also increasing performance issues in
finding matches.

10 years agoutf8_heavy: Skip unnecessary operations
Karl Williamson [Sat, 19 Nov 2011 21:22:00 +0000 (14:22 -0700)]
utf8_heavy: Skip unnecessary operations

The mktables generated tables are well-formed, already sorted, and with
no extra items such as "+utf8::foo".  Thus we don't have to do these
operations on them, but they are required on user-defined properties,
and should $list be passed in as a parameter.

This patch moves the code that does this to just the user-defined area

10 years agouni/class.t: Add test
Karl Williamson [Sat, 19 Nov 2011 18:17:17 +0000 (11:17 -0700)]
uni/class.t: Add test

This new test makes sure that a regular expression that forward
references a user-defined property works.