mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
8.40
This commit is contained in:
parent
1592fbd332
commit
dfd7749120
48 changed files with 1628 additions and 1234 deletions
|
@ -8,7 +8,7 @@ Email domain: cam.ac.uk
|
|||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
Copyright (c) 1997-2017 University of Cambridge
|
||||
All rights reserved
|
||||
|
||||
|
||||
|
@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2016 Zoltan Herczeg
|
||||
Copyright(c) 2010-2017 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2016 Zoltan Herczeg
|
||||
Copyright(c) 2009-2017 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
# 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".")
|
||||
# 2013-11-05 PH added support for PARENS_NEST_LIMIT
|
||||
# 2016-03-01 PH applied Chris Wilson's patch for MSVC static build
|
||||
# 2016-06-24 PH applied Chris Wilson's revised patch (adds a separate option)
|
||||
|
||||
PROJECT(PCRE C CXX)
|
||||
|
||||
|
@ -190,6 +191,9 @@ IF (MINGW)
|
|||
ENDIF(MINGW)
|
||||
|
||||
IF(MSVC)
|
||||
OPTION(PCRE_STATIC_RUNTIME OFF CACHE BOOL
|
||||
"ON=Compile against the static runtime (/MT)."
|
||||
OFF)
|
||||
OPTION(INSTALL_MSVC_PDB
|
||||
"ON=Install .pdb files built by MSVC, if generated"
|
||||
OFF)
|
||||
|
@ -573,8 +577,8 @@ ENDIF(MSVC AND NOT PCRE_STATIC)
|
|||
# Fix static compilation with MSVC: https://bugs.exim.org/show_bug.cgi?id=1681
|
||||
# This code was taken from the CMake wiki, not from WebM.
|
||||
|
||||
IF(MSVC AND PCRE_STATIC)
|
||||
MESSAGE(STATUS "** MSVC and PCRE_STATIC: modifying compiler flags to use static runtime library")
|
||||
IF(MSVC AND PCRE_STATIC_RUNTIME)
|
||||
MESSAGE(STATUS "** MSVC and PCRE_STATIC_RUNTIME: modifying compiler flags to use static runtime library")
|
||||
foreach(flag_var
|
||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
|
||||
|
@ -582,7 +586,7 @@ IF(MSVC AND PCRE_STATIC)
|
|||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
||||
endforeach()
|
||||
ENDIF(MSVC AND PCRE_STATIC)
|
||||
ENDIF(MSVC AND PCRE_STATIC_RUNTIME)
|
||||
|
||||
SET(PCRECPP_HEADERS
|
||||
pcrecpp.h
|
||||
|
|
|
@ -4,6 +4,53 @@ ChangeLog for PCRE
|
|||
Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
|
||||
development is happening in the PCRE2 10.xx series.
|
||||
|
||||
Version 8.40 11-January-2017
|
||||
----------------------------
|
||||
|
||||
1. Using -o with -M in pcregrep could cause unnecessary repeated output when
|
||||
the match extended over a line boundary.
|
||||
|
||||
2. Applied Chris Wilson's second patch (Bugzilla #1681) to CMakeLists.txt for
|
||||
MSVC static compilation, putting the first patch under a new option.
|
||||
|
||||
3. Fix register overwite in JIT when SSE2 acceleration is enabled.
|
||||
|
||||
4. Ignore "show all captures" (/=) for DFA matching.
|
||||
|
||||
5. Fix JIT unaligned accesses on x86. Patch by Marc Mutz.
|
||||
|
||||
6. In any wide-character mode (8-bit UTF or any 16-bit or 32-bit mode),
|
||||
without PCRE_UCP set, a negative character type such as \D in a positive
|
||||
class should cause all characters greater than 255 to match, whatever else
|
||||
is in the class. There was a bug that caused this not to happen if a
|
||||
Unicode property item was added to such a class, for example [\D\P{Nd}] or
|
||||
[\W\pL].
|
||||
|
||||
7. When pcretest was outputing information from a callout, the caret indicator
|
||||
for the current position in the subject line was incorrect if it was after
|
||||
an escape sequence for a character whose code point was greater than
|
||||
\x{ff}.
|
||||
|
||||
8. A pattern such as (?<RA>abc)(?(R)xyz) was incorrectly compiled such that
|
||||
the conditional was interpreted as a reference to capturing group 1 instead
|
||||
of a test for recursion. Any group whose name began with R was
|
||||
misinterpreted in this way. (The reference interpretation should only
|
||||
happen if the group's name is precisely "R".)
|
||||
|
||||
9. A number of bugs have been mended relating to match start-up optimizations
|
||||
when the first thing in a pattern is a positive lookahead. These all
|
||||
applied only when PCRE_NO_START_OPTIMIZE was *not* set:
|
||||
|
||||
(a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed
|
||||
both an initial 'X' and a following 'X'.
|
||||
(b) Some patterns starting with an assertion that started with .* were
|
||||
incorrectly optimized as having to match at the start of the subject or
|
||||
after a newline. There are cases where this is not true, for example,
|
||||
(?=.*[A-Z])(?=.{8,16})(?!.*[\s]) matches after the start in lines that
|
||||
start with spaces. Starting .* in an assertion is no longer taken as an
|
||||
indication of matching at the start (or after a newline).
|
||||
|
||||
|
||||
Version 8.39 14-June-2016
|
||||
-------------------------
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ Email domain: cam.ac.uk
|
|||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
Copyright (c) 1997-2017 University of Cambridge
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2016 Zoltan Herczeg
|
||||
Copyright(c) 2010-2017 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2016 Zoltan Herczeg
|
||||
Copyright(c) 2009-2017 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
|
|
@ -2832,7 +2832,7 @@ distdir: $(DISTFILES)
|
|||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r "$(distdir)"
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
||||
$(am__post_remove_distdir)
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||
|
@ -2857,7 +2857,7 @@ dist-shar: distdir
|
|||
@echo WARNING: "Support for shar distribution archives is" \
|
||||
"deprecated." >&2
|
||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||
shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
|
||||
$(am__post_remove_distdir)
|
||||
dist-zip: distdir
|
||||
-rm -f $(distdir).zip
|
||||
|
@ -2874,7 +2874,7 @@ dist dist-all:
|
|||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lz*) \
|
||||
|
@ -2884,7 +2884,7 @@ distcheck: dist
|
|||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
esac
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
News about PCRE releases
|
||||
------------------------
|
||||
|
||||
Release 8.40 11-January-2017
|
||||
----------------------------
|
||||
|
||||
This is a bug-fix release.
|
||||
|
||||
|
||||
Release 8.39 14-June-2016
|
||||
-------------------------
|
||||
|
||||
|
|
|
@ -235,7 +235,7 @@ sure both macros are undefined; an emulation function will then be used. */
|
|||
#define PACKAGE_NAME "PCRE"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "PCRE 8.39"
|
||||
#define PACKAGE_STRING "PCRE 8.40"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "pcre"
|
||||
|
@ -244,7 +244,7 @@ sure both macros are undefined; an emulation function will then be used. */
|
|||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "8.39"
|
||||
#define PACKAGE_VERSION "8.40"
|
||||
|
||||
/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
|
||||
parentheses (of any kind) in a pattern. This limits the amount of system
|
||||
|
@ -336,7 +336,7 @@ sure both macros are undefined; an emulation function will then be used. */
|
|||
/* #undef SUPPORT_VALGRIND */
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "8.39"
|
||||
#define VERSION "8.40"
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
|
30
pcre/configure
vendored
30
pcre/configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for PCRE 8.39.
|
||||
# Generated by GNU Autoconf 2.69 for PCRE 8.40.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
||||
|
@ -587,8 +587,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='PCRE'
|
||||
PACKAGE_TARNAME='pcre'
|
||||
PACKAGE_VERSION='8.39'
|
||||
PACKAGE_STRING='PCRE 8.39'
|
||||
PACKAGE_VERSION='8.40'
|
||||
PACKAGE_STRING='PCRE 8.40'
|
||||
PACKAGE_BUGREPORT=''
|
||||
PACKAGE_URL=''
|
||||
|
||||
|
@ -1418,7 +1418,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures PCRE 8.39 to adapt to many kinds of systems.
|
||||
\`configure' configures PCRE 8.40 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1488,7 +1488,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of PCRE 8.39:";;
|
||||
short | recursive ) echo "Configuration of PCRE 8.40:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1662,7 +1662,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
PCRE configure 8.39
|
||||
PCRE configure 8.40
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
|
@ -2419,7 +2419,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by PCRE $as_me 8.39, which was
|
||||
It was created by PCRE $as_me 8.40, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
|
@ -3283,7 +3283,7 @@ fi
|
|||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='pcre'
|
||||
VERSION='8.39'
|
||||
VERSION='8.40'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
|
@ -17634,9 +17634,9 @@ _ACEOF
|
|||
# Versioning
|
||||
|
||||
PCRE_MAJOR="8"
|
||||
PCRE_MINOR="39"
|
||||
PCRE_MINOR="40"
|
||||
PCRE_PRERELEASE=""
|
||||
PCRE_DATE="2016-06-14"
|
||||
PCRE_DATE="2017-01-11"
|
||||
|
||||
if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09"
|
||||
then
|
||||
|
@ -19658,13 +19658,13 @@ esac
|
|||
# (Note: The libpcre*_version bits are m4 variables, assigned above)
|
||||
|
||||
EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \
|
||||
$NO_UNDEFINED -version-info 3:7:2"
|
||||
$NO_UNDEFINED -version-info 3:8:2"
|
||||
|
||||
EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \
|
||||
$NO_UNDEFINED -version-info 2:7:2"
|
||||
$NO_UNDEFINED -version-info 2:8:2"
|
||||
|
||||
EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \
|
||||
$NO_UNDEFINED -version-info 0:7:0"
|
||||
$NO_UNDEFINED -version-info 0:8:0"
|
||||
|
||||
EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \
|
||||
$NO_UNDEFINED -version-info 0:4:0"
|
||||
|
@ -20719,7 +20719,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by PCRE $as_me 8.39, which was
|
||||
This file was extended by PCRE $as_me 8.40, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -20785,7 +20785,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
PCRE config.status 8.39
|
||||
PCRE config.status 8.40
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -9,17 +9,17 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
|
|||
dnl be defined as -RC2, for example. For real releases, it should be empty.
|
||||
|
||||
m4_define(pcre_major, [8])
|
||||
m4_define(pcre_minor, [39])
|
||||
m4_define(pcre_minor, [40])
|
||||
m4_define(pcre_prerelease, [])
|
||||
m4_define(pcre_date, [2016-06-14])
|
||||
m4_define(pcre_date, [2017-01-11])
|
||||
|
||||
# NOTE: The CMakeLists.txt file searches for the above variables in the first
|
||||
# 50 lines of this file. Please update that if the variables above are moved.
|
||||
|
||||
# Libtool shared library interface versions (current:revision:age)
|
||||
m4_define(libpcre_version, [3:7:2])
|
||||
m4_define(libpcre16_version, [2:7:2])
|
||||
m4_define(libpcre32_version, [0:7:0])
|
||||
m4_define(libpcre_version, [3:8:2])
|
||||
m4_define(libpcre16_version, [2:8:2])
|
||||
m4_define(libpcre32_version, [0:8:0])
|
||||
m4_define(libpcreposix_version, [0:4:0])
|
||||
m4_define(libpcrecpp_version, [0:1:0])
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b".
|
|||
14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern
|
||||
names is not as general as Perl's. This is a consequence of the fact the PCRE
|
||||
works internally just with numbers, using an external table to translate
|
||||
between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b)B),
|
||||
between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B),
|
||||
where the two capturing parentheses have the same number but different names,
|
||||
is not supported, and causes an error at compile time. If it were allowed, it
|
||||
would not be possible to distinguish which parentheses matched, because both
|
||||
|
|
|
@ -358,24 +358,24 @@ When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t
|
|||
generate the appropriate EBCDIC code values. The \c escape is processed
|
||||
as specified for Perl in the <b>perlebcdic</b> document. The only characters
|
||||
that are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. Any
|
||||
other character provokes a compile-time error. The sequence \@ encodes
|
||||
character code 0; the letters (in either case) encode characters 1-26 (hex 01
|
||||
to hex 1A); [, \, ], ^, and _ encode characters 27-31 (hex 1B to hex 1F), and
|
||||
\? becomes either 255 (hex FF) or 95 (hex 5F).
|
||||
other character provokes a compile-time error. The sequence \c@ encodes
|
||||
character code 0; after \c the letters (in either case) encode characters 1-26
|
||||
(hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31 (hex 1B to hex
|
||||
1F), and \c? becomes either 255 (hex FF) or 95 (hex 5F).
|
||||
</P>
|
||||
<P>
|
||||
Thus, apart from \?, these escapes generate the same character code values as
|
||||
Thus, apart from \c?, these escapes generate the same character code values as
|
||||
they do in an ASCII environment, though the meanings of the values mostly
|
||||
differ. For example, \G always generates code value 7, which is BEL in ASCII
|
||||
differ. For example, \cG always generates code value 7, which is BEL in ASCII
|
||||
but DEL in EBCDIC.
|
||||
</P>
|
||||
<P>
|
||||
The sequence \? generates DEL (127, hex 7F) in an ASCII environment, but
|
||||
The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, but
|
||||
because 127 is not a control character in EBCDIC, Perl makes it generate the
|
||||
APC character. Unfortunately, there are several variants of EBCDIC. In most of
|
||||
them the APC character has the value 255 (hex FF), but in the one Perl calls
|
||||
POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC
|
||||
values, PCRE makes \? generate 95; otherwise it generates 255.
|
||||
values, PCRE makes \c? generate 95; otherwise it generates 255.
|
||||
</P>
|
||||
<P>
|
||||
After \0 up to two further octal digits are read. If there are fewer than two
|
||||
|
@ -1512,13 +1512,8 @@ J, U and X respectively.
|
|||
<P>
|
||||
When one of these option changes occurs at top level (that is, not inside
|
||||
subpattern parentheses), the change applies to the remainder of the pattern
|
||||
that follows. If the change is placed right at the start of a pattern, PCRE
|
||||
extracts it into the global options (and it will therefore show up in data
|
||||
extracted by the <b>pcre_fullinfo()</b> function).
|
||||
</P>
|
||||
<P>
|
||||
An option change within a subpattern (see below for a description of
|
||||
subpatterns) affects only that part of the subpattern that follows it, so
|
||||
that follows. An option change within a subpattern (see below for a description
|
||||
of subpatterns) affects only that part of the subpattern that follows it, so
|
||||
<pre>
|
||||
(a(?i)b)c
|
||||
</pre>
|
||||
|
@ -2160,6 +2155,14 @@ capturing is carried out only for positive assertions. (Perl sometimes, but not
|
|||
always, does do capturing in negative assertions.)
|
||||
</P>
|
||||
<P>
|
||||
WARNING: If a positive assertion containing one or more capturing subpatterns
|
||||
succeeds, but failure to match later in the pattern causes backtracking over
|
||||
this assertion, the captures within the assertion are reset only if no higher
|
||||
numbered captures are already set. This is, unfortunately, a fundamental
|
||||
limitation of the current implementation, and as PCRE1 is now in
|
||||
maintenance-only status, it is unlikely ever to change.
|
||||
</P>
|
||||
<P>
|
||||
For compatibility with Perl, assertion subpatterns may be repeated; though
|
||||
it makes no sense to assert the same thing several times, the side effect of
|
||||
capturing parentheses may occasionally be useful. In practice, there only three
|
||||
|
@ -3264,9 +3267,9 @@ Cambridge CB2 3QH, England.
|
|||
</P>
|
||||
<br><a name="SEC30" href="#TOC1">REVISION</a><br>
|
||||
<P>
|
||||
Last updated: 14 June 2015
|
||||
Last updated: 23 October 2016
|
||||
<br>
|
||||
Copyright © 1997-2015 University of Cambridge.
|
||||
Copyright © 1997-2016 University of Cambridge.
|
||||
<br>
|
||||
<p>
|
||||
Return to the <a href="index.html">PCRE index page</a>.
|
||||
|
|
2107
pcre/doc/pcre.txt
2107
pcre/doc/pcre.txt
File diff suppressed because it is too large
Load diff
|
@ -113,7 +113,7 @@ the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b".
|
|||
14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern
|
||||
names is not as general as Perl's. This is a consequence of the fact the PCRE
|
||||
works internally just with numbers, using an external table to translate
|
||||
between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b)B),
|
||||
between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B),
|
||||
where the two capturing parentheses have the same number but different names,
|
||||
is not supported, and causes an error at compile time. If it were allowed, it
|
||||
would not be possible to distinguish which parentheses matched, because both
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.TH PCREPATTERN 3 "14 June 2015" "PCRE 8.38"
|
||||
.TH PCREPATTERN 3 "23 October 2016" "PCRE 8.40"
|
||||
.SH NAME
|
||||
PCRE - Perl-compatible regular expressions
|
||||
.SH "PCRE REGULAR EXPRESSION DETAILS"
|
||||
|
@ -336,22 +336,22 @@ When PCRE is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et
|
|||
generate the appropriate EBCDIC code values. The \ec escape is processed
|
||||
as specified for Perl in the \fBperlebcdic\fP document. The only characters
|
||||
that are allowed after \ec are A-Z, a-z, or one of @, [, \e, ], ^, _, or ?. Any
|
||||
other character provokes a compile-time error. The sequence \e@ encodes
|
||||
character code 0; the letters (in either case) encode characters 1-26 (hex 01
|
||||
to hex 1A); [, \e, ], ^, and _ encode characters 27-31 (hex 1B to hex 1F), and
|
||||
\e? becomes either 255 (hex FF) or 95 (hex 5F).
|
||||
other character provokes a compile-time error. The sequence \ec@ encodes
|
||||
character code 0; after \ec the letters (in either case) encode characters 1-26
|
||||
(hex 01 to hex 1A); [, \e, ], ^, and _ encode characters 27-31 (hex 1B to hex
|
||||
1F), and \ec? becomes either 255 (hex FF) or 95 (hex 5F).
|
||||
.P
|
||||
Thus, apart from \e?, these escapes generate the same character code values as
|
||||
Thus, apart from \ec?, these escapes generate the same character code values as
|
||||
they do in an ASCII environment, though the meanings of the values mostly
|
||||
differ. For example, \eG always generates code value 7, which is BEL in ASCII
|
||||
differ. For example, \ecG always generates code value 7, which is BEL in ASCII
|
||||
but DEL in EBCDIC.
|
||||
.P
|
||||
The sequence \e? generates DEL (127, hex 7F) in an ASCII environment, but
|
||||
The sequence \ec? generates DEL (127, hex 7F) in an ASCII environment, but
|
||||
because 127 is not a control character in EBCDIC, Perl makes it generate the
|
||||
APC character. Unfortunately, there are several variants of EBCDIC. In most of
|
||||
them the APC character has the value 255 (hex FF), but in the one Perl calls
|
||||
POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC
|
||||
values, PCRE makes \e? generate 95; otherwise it generates 255.
|
||||
values, PCRE makes \ec? generate 95; otherwise it generates 255.
|
||||
.P
|
||||
After \e0 up to two further octal digits are read. If there are fewer than two
|
||||
digits, just those that are present are used. Thus the sequence \e0\ex\e015
|
||||
|
@ -1511,12 +1511,8 @@ J, U and X respectively.
|
|||
.P
|
||||
When one of these option changes occurs at top level (that is, not inside
|
||||
subpattern parentheses), the change applies to the remainder of the pattern
|
||||
that follows. If the change is placed right at the start of a pattern, PCRE
|
||||
extracts it into the global options (and it will therefore show up in data
|
||||
extracted by the \fBpcre_fullinfo()\fP function).
|
||||
.P
|
||||
An option change within a subpattern (see below for a description of
|
||||
subpatterns) affects only that part of the subpattern that follows it, so
|
||||
that follows. An option change within a subpattern (see below for a description
|
||||
of subpatterns) affects only that part of the subpattern that follows it, so
|
||||
.sp
|
||||
(a(?i)b)c
|
||||
.sp
|
||||
|
@ -2171,6 +2167,13 @@ numbering the capturing subpatterns in the whole pattern. However, substring
|
|||
capturing is carried out only for positive assertions. (Perl sometimes, but not
|
||||
always, does do capturing in negative assertions.)
|
||||
.P
|
||||
WARNING: If a positive assertion containing one or more capturing subpatterns
|
||||
succeeds, but failure to match later in the pattern causes backtracking over
|
||||
this assertion, the captures within the assertion are reset only if no higher
|
||||
numbered captures are already set. This is, unfortunately, a fundamental
|
||||
limitation of the current implementation, and as PCRE1 is now in
|
||||
maintenance-only status, it is unlikely ever to change.
|
||||
.P
|
||||
For compatibility with Perl, assertion subpatterns may be repeated; though
|
||||
it makes no sense to assert the same thing several times, the side effect of
|
||||
capturing parentheses may occasionally be useful. In practice, there only three
|
||||
|
@ -3296,6 +3299,6 @@ Cambridge CB2 3QH, England.
|
|||
.rs
|
||||
.sp
|
||||
.nf
|
||||
Last updated: 14 June 2015
|
||||
Copyright (c) 1997-2015 University of Cambridge.
|
||||
Last updated: 23 October 2016
|
||||
Copyright (c) 1997-2016 University of Cambridge.
|
||||
.fi
|
||||
|
|
|
@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
/* The current PCRE version information. */
|
||||
|
||||
#define PCRE_MAJOR 8
|
||||
#define PCRE_MINOR 39
|
||||
#define PCRE_MINOR 40
|
||||
#define PCRE_PRERELEASE
|
||||
#define PCRE_DATE 2016-06-14
|
||||
#define PCRE_DATE 2017-01-11
|
||||
|
||||
/* When an application links to a PCRE DLL in Windows, the symbols that are
|
||||
imported have to be identified as such. When building PCRE, the appropriate
|
||||
|
|
|
@ -5579,6 +5579,34 @@ for (;; ptr++)
|
|||
#endif
|
||||
#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
|
||||
{
|
||||
/* For non-UCP wide characters, in a non-negative class containing \S or
|
||||
similar (should_flip_negation is set), all characters greater than 255
|
||||
must be in the class. */
|
||||
|
||||
if (
|
||||
#if defined COMPILE_PCRE8
|
||||
utf &&
|
||||
#endif
|
||||
should_flip_negation && !negate_class && (options & PCRE_UCP) == 0)
|
||||
{
|
||||
*class_uchardata++ = XCL_RANGE;
|
||||
if (utf) /* Will always be utf in the 8-bit library */
|
||||
{
|
||||
class_uchardata += PRIV(ord2utf)(0x100, class_uchardata);
|
||||
class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata);
|
||||
}
|
||||
else /* Can only happen for the 16-bit & 32-bit libraries */
|
||||
{
|
||||
#if defined COMPILE_PCRE16
|
||||
*class_uchardata++ = 0x100;
|
||||
*class_uchardata++ = 0xffffu;
|
||||
#elif defined COMPILE_PCRE32
|
||||
*class_uchardata++ = 0x100;
|
||||
*class_uchardata++ = 0xffffffffu;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
*class_uchardata++ = XCL_END; /* Marks the end of extra data */
|
||||
*code++ = OP_XCLASS;
|
||||
code += LINK_SIZE;
|
||||
|
@ -6923,7 +6951,8 @@ for (;; ptr++)
|
|||
slot = cd->name_table;
|
||||
for (i = 0; i < cd->names_found; i++)
|
||||
{
|
||||
if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0) break;
|
||||
if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 &&
|
||||
slot[IMM2_SIZE+namelen] == 0) break;
|
||||
slot += cd->name_entry_size;
|
||||
}
|
||||
|
||||
|
@ -7889,15 +7918,17 @@ for (;; ptr++)
|
|||
}
|
||||
}
|
||||
|
||||
/* For a forward assertion, we take the reqchar, if set. This can be
|
||||
helpful if the pattern that follows the assertion doesn't set a different
|
||||
char. For example, it's useful for /(?=abcde).+/. We can't set firstchar
|
||||
for an assertion, however because it leads to incorrect effect for patterns
|
||||
such as /(?=a)a.+/ when the "real" "a" would then become a reqchar instead
|
||||
of a firstchar. This is overcome by a scan at the end if there's no
|
||||
firstchar, looking for an asserted first char. */
|
||||
/* For a forward assertion, we take the reqchar, if set, provided that the
|
||||
group has also set a first char. This can be helpful if the pattern that
|
||||
follows the assertion doesn't set a different char. For example, it's
|
||||
useful for /(?=abcde).+/. We can't set firstchar for an assertion, however
|
||||
because it leads to incorrect effect for patterns such as /(?=a)a.+/ when
|
||||
the "real" "a" would then become a reqchar instead of a firstchar. This is
|
||||
overcome by a scan at the end if there's no firstchar, looking for an
|
||||
asserted first char. */
|
||||
|
||||
else if (bravalue == OP_ASSERT && subreqcharflags >= 0)
|
||||
else if (bravalue == OP_ASSERT && subreqcharflags >= 0 &&
|
||||
subfirstcharflags >= 0)
|
||||
{
|
||||
reqchar = subreqchar;
|
||||
reqcharflags = subreqcharflags;
|
||||
|
@ -8686,8 +8717,8 @@ matching and for non-DOTALL patterns that start with .* (which must start at
|
|||
the beginning or after \n). As in the case of is_anchored() (see above), we
|
||||
have to take account of back references to capturing brackets that contain .*
|
||||
because in that case we can't make the assumption. Also, the appearance of .*
|
||||
inside atomic brackets or in a pattern that contains *PRUNE or *SKIP does not
|
||||
count, because once again the assumption no longer holds.
|
||||
inside atomic brackets or in an assertion, or in a pattern that contains *PRUNE
|
||||
or *SKIP does not count, because once again the assumption no longer holds.
|
||||
|
||||
Arguments:
|
||||
code points to start of expression (the bracket)
|
||||
|
@ -8696,13 +8727,14 @@ Arguments:
|
|||
the less precise approach
|
||||
cd points to the compile data
|
||||
atomcount atomic group level
|
||||
inassert TRUE if in an assertion
|
||||
|
||||
Returns: TRUE or FALSE
|
||||
*/
|
||||
|
||||
static BOOL
|
||||
is_startline(const pcre_uchar *code, unsigned int bracket_map,
|
||||
compile_data *cd, int atomcount)
|
||||
compile_data *cd, int atomcount, BOOL inassert)
|
||||
{
|
||||
do {
|
||||
const pcre_uchar *scode = first_significant_code(
|
||||
|
@ -8729,7 +8761,7 @@ do {
|
|||
return FALSE;
|
||||
|
||||
default: /* Assertion */
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount)) return FALSE;
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount, TRUE)) return FALSE;
|
||||
do scode += GET(scode, 1); while (*scode == OP_ALT);
|
||||
scode += 1 + LINK_SIZE;
|
||||
break;
|
||||
|
@ -8743,7 +8775,7 @@ do {
|
|||
if (op == OP_BRA || op == OP_BRAPOS ||
|
||||
op == OP_SBRA || op == OP_SBRAPOS)
|
||||
{
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount)) return FALSE;
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount, inassert)) return FALSE;
|
||||
}
|
||||
|
||||
/* Capturing brackets */
|
||||
|
@ -8753,33 +8785,33 @@ do {
|
|||
{
|
||||
int n = GET2(scode, 1+LINK_SIZE);
|
||||
int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
|
||||
if (!is_startline(scode, new_map, cd, atomcount)) return FALSE;
|
||||
if (!is_startline(scode, new_map, cd, atomcount, inassert)) return FALSE;
|
||||
}
|
||||
|
||||
/* Positive forward assertions */
|
||||
|
||||
else if (op == OP_ASSERT)
|
||||
{
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount)) return FALSE;
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount, TRUE)) return FALSE;
|
||||
}
|
||||
|
||||
/* Atomic brackets */
|
||||
|
||||
else if (op == OP_ONCE || op == OP_ONCE_NC)
|
||||
{
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount + 1)) return FALSE;
|
||||
if (!is_startline(scode, bracket_map, cd, atomcount + 1, inassert)) return FALSE;
|
||||
}
|
||||
|
||||
/* .* means "start at start or after \n" if it isn't in atomic brackets or
|
||||
brackets that may be referenced, as long as the pattern does not contain
|
||||
*PRUNE or *SKIP, because these break the feature. Consider, for example,
|
||||
/.*?a(*PRUNE)b/ with the subject "aab", which matches "ab", i.e. not at the
|
||||
start of a line. */
|
||||
brackets that may be referenced or an assertion, as long as the pattern does
|
||||
not contain *PRUNE or *SKIP, because these break the feature. Consider, for
|
||||
example, /.*?a(*PRUNE)b/ with the subject "aab", which matches "ab", i.e.
|
||||
not at the start of a line. */
|
||||
|
||||
else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR)
|
||||
{
|
||||
if (scode[1] != OP_ANY || (bracket_map & cd->backref_map) != 0 ||
|
||||
atomcount > 0 || cd->had_pruneorskip)
|
||||
atomcount > 0 || cd->had_pruneorskip || inassert)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -9634,7 +9666,7 @@ if ((re->options & PCRE_ANCHORED) == 0)
|
|||
re->flags |= PCRE_FIRSTSET;
|
||||
}
|
||||
|
||||
else if (is_startline(codestart, 0, cd, 0)) re->flags |= PCRE_STARTLINE;
|
||||
else if (is_startline(codestart, 0, cd, 0, FALSE)) re->flags |= PCRE_STARTLINE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4004,12 +4004,12 @@ sljit_emit_op_custom(compiler, instruction, 4);
|
|||
|
||||
if (load_twice)
|
||||
{
|
||||
OP1(SLJIT_MOV, TMP3, 0, TMP2, 0);
|
||||
OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP2, 0);
|
||||
instruction[3] = 0xc0 | (tmp2_ind << 3) | 1;
|
||||
sljit_emit_op_custom(compiler, instruction, 4);
|
||||
|
||||
OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);
|
||||
OP1(SLJIT_MOV, TMP2, 0, TMP3, 0);
|
||||
OP1(SLJIT_MOV, TMP2, 0, RETURN_ADDR, 0);
|
||||
}
|
||||
|
||||
OP2(SLJIT_ASHR, TMP1, 0, TMP1, 0, TMP2, 0);
|
||||
|
|
|
@ -687,6 +687,7 @@ static struct regression_test_case regression_test_cases[] = {
|
|||
{ PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" },
|
||||
{ MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
|
||||
{ PCRE_NEWLINE_ANY | PCRE_FIRSTLINE | PCRE_DOTALL, 0, "....a", "012\n0a" },
|
||||
{ MUA | PCRE_FIRSTLINE, 0, "[aC]", "a" },
|
||||
|
||||
/* Recurse. */
|
||||
{ MUA, 0, "(a)(?1)", "aa" },
|
||||
|
|
|
@ -1803,6 +1803,12 @@ while (ptr < endptr)
|
|||
match = FALSE;
|
||||
if (line_buffered) fflush(stdout);
|
||||
rc = 0; /* Had some success */
|
||||
|
||||
/* If the current match ended past the end of the line (only possible
|
||||
in multiline mode), we are done with this line. */
|
||||
|
||||
if ((unsigned int)offsets[1] > linelength) goto END_ONE_MATCH;
|
||||
|
||||
startoffset = offsets[1]; /* Restart after the match */
|
||||
if (startoffset <= oldstartoffset)
|
||||
{
|
||||
|
|
|
@ -1982,6 +1982,7 @@ return(result);
|
|||
static int pchar(pcre_uint32 c, FILE *f)
|
||||
{
|
||||
int n = 0;
|
||||
char tempbuffer[16];
|
||||
if (PRINTOK(c))
|
||||
{
|
||||
if (f != NULL) fprintf(f, "%c", c);
|
||||
|
@ -2003,6 +2004,8 @@ if (c < 0x100)
|
|||
}
|
||||
|
||||
if (f != NULL) n = fprintf(f, "\\x{%02x}", c);
|
||||
else n = sprintf(tempbuffer, "\\x{%02x}", c);
|
||||
|
||||
return n >= 0 ? n : 0;
|
||||
}
|
||||
|
||||
|
@ -5042,7 +5045,7 @@ while (!done)
|
|||
|
||||
if ((all_use_dfa || use_dfa) && find_match_limit)
|
||||
{
|
||||
printf("**Match limit not relevant for DFA matching: ignored\n");
|
||||
printf("** Match limit not relevant for DFA matching: ignored\n");
|
||||
find_match_limit = 0;
|
||||
}
|
||||
|
||||
|
@ -5255,10 +5258,17 @@ while (!done)
|
|||
|
||||
if (do_allcaps)
|
||||
{
|
||||
if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) < 0)
|
||||
goto SKIP_DATA;
|
||||
count++; /* Allow for full match */
|
||||
if (count * 2 > use_size_offsets) count = use_size_offsets/2;
|
||||
if (all_use_dfa || use_dfa)
|
||||
{
|
||||
fprintf(outfile, "** Show all captures ignored after DFA matching\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) < 0)
|
||||
goto SKIP_DATA;
|
||||
count++; /* Allow for full match */
|
||||
if (count * 2 > use_size_offsets) count = use_size_offsets/2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Output the captured substrings. Note that, for the matched string,
|
||||
|
|
|
@ -82,7 +82,7 @@
|
|||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/* If SLJIT_STD_MACROS_DEFINED is not defined, the application should
|
||||
define SLJIT_MALLOC, SLJIT_FREE, SLJIT_MEMMOVE, and NULL. */
|
||||
define SLJIT_MALLOC, SLJIT_FREE, SLJIT_MEMCPY, and NULL. */
|
||||
#ifndef SLJIT_STD_MACROS_DEFINED
|
||||
/* Disabled by default. */
|
||||
#define SLJIT_STD_MACROS_DEFINED 0
|
||||
|
@ -90,10 +90,20 @@
|
|||
|
||||
/* Executable code allocation:
|
||||
If SLJIT_EXECUTABLE_ALLOCATOR is not defined, the application should
|
||||
define both SLJIT_MALLOC_EXEC and SLJIT_FREE_EXEC. */
|
||||
define SLJIT_MALLOC_EXEC, SLJIT_FREE_EXEC, and SLJIT_ENABLE_EXEC. */
|
||||
#ifndef SLJIT_EXECUTABLE_ALLOCATOR
|
||||
/* Enabled by default. */
|
||||
#define SLJIT_EXECUTABLE_ALLOCATOR 1
|
||||
|
||||
/* When SLJIT_PROT_EXECUTABLE_ALLOCATOR is enabled SLJIT uses
|
||||
an allocator which does not set writable and executable
|
||||
permission flags at the same time. The trade-of is increased
|
||||
memory consumption and disabled dynamic code modifications. */
|
||||
#ifndef SLJIT_PROT_EXECUTABLE_ALLOCATOR
|
||||
/* Disabled by default. */
|
||||
#define SLJIT_PROT_EXECUTABLE_ALLOCATOR 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Force cdecl calling convention even if a better calling
|
||||
|
|
|
@ -210,8 +210,8 @@
|
|||
#define SLJIT_FREE(ptr, allocator_data) free(ptr)
|
||||
#endif
|
||||
|
||||
#ifndef SLJIT_MEMMOVE
|
||||
#define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len)
|
||||
#ifndef SLJIT_MEMCPY
|
||||
#define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len)
|
||||
#endif
|
||||
|
||||
#ifndef SLJIT_ZEROMEM
|
||||
|
@ -545,6 +545,14 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
|
|||
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);
|
||||
#define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)
|
||||
#define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
|
||||
|
||||
#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
|
||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_enable_exec(void* from, void *to);
|
||||
#define SLJIT_ENABLE_EXEC(from, to) sljit_enable_exec((from), (to))
|
||||
#else
|
||||
#define SLJIT_ENABLE_EXEC(from, to)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/**********************************************/
|
||||
|
|
|
@ -242,9 +242,15 @@
|
|||
#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
||||
|
||||
#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
|
||||
|
||||
#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
|
||||
#include "sljitProtExecAllocator.c"
|
||||
#else
|
||||
#include "sljitExecAllocator.c"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Argument checking features. */
|
||||
|
||||
#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||
|
@ -283,6 +289,13 @@
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#define CHECK_DYN_CODE_MOD(extra_check) \
|
||||
if ((extra_check) && !sljit_is_dyn_code_modification_enabled()) \
|
||||
{ \
|
||||
compiler->error = SLJIT_ERR_DYN_CODE_MOD; \
|
||||
return NULL; \
|
||||
}
|
||||
|
||||
#elif (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
||||
|
||||
/* Assertion failure occures if an invalid argument is passed. */
|
||||
|
@ -295,6 +308,7 @@
|
|||
#define CHECK(x) x
|
||||
#define CHECK_PTR(x) x
|
||||
#define CHECK_REG_INDEX(x) x
|
||||
#define CHECK_DYN_CODE_MOD(extra_check) SLJIT_ASSERT(!(extra_check) || sljit_is_dyn_code_modification_enabled())
|
||||
|
||||
#elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
|
||||
|
||||
|
@ -304,6 +318,7 @@
|
|||
#define CHECK(x) x
|
||||
#define CHECK_PTR(x) x
|
||||
#define CHECK_REG_INDEX(x) x
|
||||
#define CHECK_DYN_CODE_MOD(extra_check)
|
||||
|
||||
#else
|
||||
|
||||
|
@ -311,6 +326,7 @@
|
|||
#define CHECK(x)
|
||||
#define CHECK_PTR(x)
|
||||
#define CHECK_REG_INDEX(x)
|
||||
#define CHECK_DYN_CODE_MOD(extra_check)
|
||||
|
||||
#endif /* SLJIT_ARGUMENT_CHECKS */
|
||||
|
||||
|
@ -441,6 +457,15 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compi
|
|||
compiler->error = SLJIT_ERR_ALLOC_FAILED;
|
||||
}
|
||||
|
||||
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_dyn_code_modification_enabled(void)
|
||||
{
|
||||
#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) \
|
||||
&& (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
|
||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)
|
||||
{
|
||||
|
@ -1601,6 +1626,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||
sljit_sw tmp_srcw;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
|
||||
|
||||
condition = type & 0xff;
|
||||
|
@ -1681,6 +1707,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compile
|
|||
sljit_s32 flags, condition;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
|
||||
|
||||
condition = type & 0xff;
|
||||
|
|
|
@ -99,6 +99,8 @@ of sljitConfigInternal.h */
|
|||
#define SLJIT_ERR_UNSUPPORTED 4
|
||||
/* An ivalid argument is passed to any SLJIT function. */
|
||||
#define SLJIT_ERR_BAD_ARGUMENT 5
|
||||
/* Dynamic code modification is not enabled. */
|
||||
#define SLJIT_ERR_DYN_CODE_MOD 6
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
/* Registers */
|
||||
|
@ -455,7 +457,19 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compile
|
|||
SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose);
|
||||
#endif
|
||||
|
||||
/* Returns with non-zero if dynamic code modification is enabled. */
|
||||
|
||||
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_dyn_code_modification_enabled(void);
|
||||
|
||||
/*
|
||||
Create executable code from the sljit instruction stream. This is the final step
|
||||
of the code generation so no more instructions can be added after this call.
|
||||
*/
|
||||
|
||||
SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler);
|
||||
|
||||
/* Free executable code. */
|
||||
|
||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code);
|
||||
|
||||
/*
|
||||
|
|
|
@ -793,6 +793,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_uw);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
return code;
|
||||
}
|
||||
|
@ -2402,6 +2403,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
struct sljit_jump *jump;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||
|
@ -2534,6 +2536,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
sljit_s32 reg;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -309,6 +309,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
return code;
|
||||
}
|
||||
|
@ -1882,6 +1883,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
struct sljit_jump *jump;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||
|
@ -2020,6 +2022,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
sljit_s32 dst_r;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -415,6 +415,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_u16);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
/* Set thumb mode flag. */
|
||||
return (void*)((sljit_uw)code | 0x1);
|
||||
|
@ -1917,6 +1918,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
sljit_ins cc;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||
|
@ -2060,6 +2062,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
sljit_s32 dst_r;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -477,6 +477,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
#ifndef __GNUC__
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
#else
|
||||
|
@ -1625,6 +1626,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
sljit_s32 delay_check = UNMOVABLE_INS;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||
|
@ -1742,6 +1744,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||
sljit_ins inst;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
|
||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||
|
@ -1863,6 +1866,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compile
|
|||
sljit_s32 if_true;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
|
||||
|
||||
compiler->cache_arg = 0;
|
||||
|
@ -2121,6 +2125,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
sljit_s32 reg;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -493,6 +493,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
|
||||
#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
|
||||
|
@ -2138,6 +2139,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
sljit_ins bo_bi_flags;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
bo_bi_flags = get_bo_bi_flags(type & 0xff);
|
||||
|
@ -2362,6 +2364,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
sljit_s32 reg;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -379,6 +379,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
return code;
|
||||
}
|
||||
|
@ -1295,6 +1296,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
struct sljit_jump *jump;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||
|
@ -1422,6 +1424,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
struct sljit_const *const_;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -1113,6 +1113,7 @@ SLJIT_API_FUNC_ATTRIBUTE void * sljit_generate_code(struct sljit_compiler *compi
|
|||
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
SLJIT_CACHE_FLUSH(code, code_ptr);
|
||||
return code;
|
||||
}
|
||||
|
@ -2412,6 +2413,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compil
|
|||
flush_buffer(compiler);
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
jump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||
|
@ -2510,6 +2512,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const * sljit_emit_const(struct sljit_comp
|
|||
flush_buffer(compiler);
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ static sljit_s32 emit_do_imm(struct sljit_compiler *compiler, sljit_u8 opcode, s
|
|||
FAIL_IF(!inst);
|
||||
INC_SIZE(1 + sizeof(sljit_sw));
|
||||
*inst++ = opcode;
|
||||
*(sljit_sw*)inst = imm;
|
||||
sljit_unaligned_store_sw(inst, imm);
|
||||
return SLJIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_
|
|||
if (jump->flags & JUMP_LABEL)
|
||||
jump->flags |= PATCH_MW;
|
||||
else
|
||||
*(sljit_sw*)code_ptr = jump->u.target - (jump->addr + 4);
|
||||
sljit_unaligned_store_sw(code_ptr, jump->u.target - (jump->addr + 4));
|
||||
code_ptr += 4;
|
||||
|
||||
return code_ptr;
|
||||
|
@ -151,12 +151,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi
|
|||
inst[1] = MOD_REG | (reg_map[TMP_REG1] << 3) | reg_map[SLJIT_SP];
|
||||
inst[2] = GROUP_F7;
|
||||
inst[3] = MOD_REG | (0 << 3) | reg_map[SLJIT_SP];
|
||||
*(sljit_sw*)(inst + 4) = 0x4;
|
||||
sljit_unaligned_store_sw(inst + 4, 0x4);
|
||||
inst[8] = JNE_i8;
|
||||
inst[9] = 6;
|
||||
inst[10] = GROUP_BINARY_81;
|
||||
inst[11] = MOD_REG | (5 << 3) | reg_map[SLJIT_SP];
|
||||
*(sljit_sw*)(inst + 12) = 0x4;
|
||||
sljit_unaligned_store_sw(inst + 12, 0x4);
|
||||
inst[16] = PUSH_r + reg_map[TMP_REG1];
|
||||
}
|
||||
else
|
||||
|
@ -406,7 +406,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
|
|||
if (immb <= 127 && immb >= -128)
|
||||
*buf_ptr++ = immb; /* 8 bit displacement. */
|
||||
else {
|
||||
*(sljit_sw*)buf_ptr = immb; /* 32 bit displacement. */
|
||||
sljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */
|
||||
buf_ptr += sizeof(sljit_sw);
|
||||
}
|
||||
}
|
||||
|
@ -418,7 +418,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
|
|||
}
|
||||
else {
|
||||
*buf_ptr++ |= 0x05;
|
||||
*(sljit_sw*)buf_ptr = immb; /* 32 bit displacement. */
|
||||
sljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */
|
||||
buf_ptr += sizeof(sljit_sw);
|
||||
}
|
||||
|
||||
|
@ -426,9 +426,9 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
|
|||
if (flags & EX86_BYTE_ARG)
|
||||
*buf_ptr = imma;
|
||||
else if (flags & EX86_HALF_ARG)
|
||||
*(short*)buf_ptr = imma;
|
||||
sljit_unaligned_store_s16(buf_ptr, imma);
|
||||
else if (!(flags & EX86_SHIFT_INS))
|
||||
*(sljit_sw*)buf_ptr = imma;
|
||||
sljit_unaligned_store_sw(buf_ptr, imma);
|
||||
}
|
||||
|
||||
return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);
|
||||
|
@ -541,7 +541,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler
|
|||
|
||||
INC_SIZE(5 + 1);
|
||||
*inst++ = PUSH_i32;
|
||||
*(sljit_sw*)inst = srcw;
|
||||
sljit_unaligned_store_sw(inst, srcw);
|
||||
inst += sizeof(sljit_sw);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ static sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg,
|
|||
INC_SIZE(2 + sizeof(sljit_sw));
|
||||
*inst++ = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B);
|
||||
*inst++ = MOV_r_i32 + (reg_map[reg] & 0x7);
|
||||
*(sljit_sw*)inst = imm;
|
||||
sljit_unaligned_store_sw(inst, imm);
|
||||
return SLJIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_
|
|||
if (jump->flags & JUMP_LABEL)
|
||||
jump->flags |= PATCH_MD;
|
||||
else
|
||||
*(sljit_sw*)code_ptr = jump->u.target;
|
||||
sljit_unaligned_store_sw(code_ptr, jump->u.target);
|
||||
|
||||
code_ptr += sizeof(sljit_sw);
|
||||
*code_ptr++ = REX_B;
|
||||
|
@ -71,13 +71,13 @@ static sljit_u8* generate_fixed_jump(sljit_u8 *code_ptr, sljit_sw addr, sljit_s3
|
|||
|
||||
if (delta <= HALFWORD_MAX && delta >= HALFWORD_MIN) {
|
||||
*code_ptr++ = (type == 2) ? CALL_i32 : JMP_i32;
|
||||
*(sljit_sw*)code_ptr = delta;
|
||||
sljit_unaligned_store_sw(code_ptr, delta);
|
||||
}
|
||||
else {
|
||||
SLJIT_COMPILE_ASSERT(reg_map[TMP_REG3] == 9, tmp3_is_9_second);
|
||||
*code_ptr++ = REX_W | REX_B;
|
||||
*code_ptr++ = MOV_r_i32 + 1;
|
||||
*(sljit_sw*)code_ptr = addr;
|
||||
sljit_unaligned_store_sw(code_ptr, addr);
|
||||
code_ptr += sizeof(sljit_sw);
|
||||
*code_ptr++ = REX_B;
|
||||
*code_ptr++ = GROUP_FF;
|
||||
|
@ -193,7 +193,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi
|
|||
*inst++ = REX_W;
|
||||
*inst++ = MOV_rm_i32;
|
||||
*inst++ = MOD_REG | reg_lmap[SLJIT_R0];
|
||||
*(sljit_s32*)inst = local_size;
|
||||
sljit_unaligned_store_s32(inst, local_size);
|
||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||
compiler->skip_checks = 1;
|
||||
|
@ -219,7 +219,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi
|
|||
*inst++ = REX_W;
|
||||
*inst++ = GROUP_BINARY_81;
|
||||
*inst++ = MOD_REG | SUB | 4;
|
||||
*(sljit_s32*)inst = local_size;
|
||||
sljit_unaligned_store_s32(inst, local_size);
|
||||
inst += sizeof(sljit_s32);
|
||||
}
|
||||
|
||||
|
@ -230,7 +230,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compi
|
|||
FAIL_IF(!inst);
|
||||
INC_SIZE(5);
|
||||
*inst++ = GROUP_0F;
|
||||
*(sljit_s32*)inst = 0x20247429;
|
||||
sljit_unaligned_store_s32(inst, 0x20247429);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -271,7 +271,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp
|
|||
FAIL_IF(!inst);
|
||||
INC_SIZE(5);
|
||||
*inst++ = GROUP_0F;
|
||||
*(sljit_s32*)inst = 0x20247428;
|
||||
sljit_unaligned_store_s32(inst, 0x20247428);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -292,7 +292,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *comp
|
|||
*inst++ = REX_W;
|
||||
*inst++ = GROUP_BINARY_81;
|
||||
*inst++ = MOD_REG | ADD | 4;
|
||||
*(sljit_s32*)inst = compiler->local_size;
|
||||
sljit_unaligned_store_s32(inst, compiler->local_size);
|
||||
}
|
||||
|
||||
tmp = compiler->scratches;
|
||||
|
@ -339,7 +339,7 @@ static sljit_s32 emit_do_imm32(struct sljit_compiler *compiler, sljit_u8 rex, sl
|
|||
if (rex)
|
||||
*inst++ = rex;
|
||||
*inst++ = opcode;
|
||||
*(sljit_s32*)inst = imm;
|
||||
sljit_unaligned_store_s32(inst, imm);
|
||||
return SLJIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -516,7 +516,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
|
|||
if (immb <= 127 && immb >= -128)
|
||||
*buf_ptr++ = immb; /* 8 bit displacement. */
|
||||
else {
|
||||
*(sljit_s32*)buf_ptr = immb; /* 32 bit displacement. */
|
||||
sljit_unaligned_store_s32(buf_ptr, immb); /* 32 bit displacement. */
|
||||
buf_ptr += sizeof(sljit_s32);
|
||||
}
|
||||
}
|
||||
|
@ -533,7 +533,7 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
|
|||
else {
|
||||
*buf_ptr++ |= 0x04;
|
||||
*buf_ptr++ = 0x25;
|
||||
*(sljit_s32*)buf_ptr = immb; /* 32 bit displacement. */
|
||||
sljit_unaligned_store_s32(buf_ptr, immb); /* 32 bit displacement. */
|
||||
buf_ptr += sizeof(sljit_s32);
|
||||
}
|
||||
|
||||
|
@ -541,9 +541,9 @@ static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32
|
|||
if (flags & EX86_BYTE_ARG)
|
||||
*buf_ptr = imma;
|
||||
else if (flags & EX86_HALF_ARG)
|
||||
*(short*)buf_ptr = imma;
|
||||
sljit_unaligned_store_s16(buf_ptr, imma);
|
||||
else if (!(flags & EX86_SHIFT_INS))
|
||||
*(sljit_s32*)buf_ptr = imma;
|
||||
sljit_unaligned_store_s32(buf_ptr, imma);
|
||||
}
|
||||
|
||||
return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);
|
||||
|
@ -676,7 +676,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler
|
|||
|
||||
INC_SIZE(5 + 1);
|
||||
*inst++ = PUSH_i32;
|
||||
*(sljit_s32*)inst = srcw;
|
||||
sljit_unaligned_store_s32(inst, srcw);
|
||||
inst += sizeof(sljit_s32);
|
||||
}
|
||||
|
||||
|
|
|
@ -279,6 +279,29 @@ static sljit_s32 cpu_has_cmov = -1;
|
|||
#include <intrin.h>
|
||||
#endif
|
||||
|
||||
/******************************************************/
|
||||
/* Unaligned-store functions */
|
||||
/******************************************************/
|
||||
|
||||
static SLJIT_INLINE void sljit_unaligned_store_s16(void *addr, sljit_s16 value)
|
||||
{
|
||||
SLJIT_MEMCPY(addr, &value, sizeof(value));
|
||||
}
|
||||
|
||||
static SLJIT_INLINE void sljit_unaligned_store_s32(void *addr, sljit_s32 value)
|
||||
{
|
||||
SLJIT_MEMCPY(addr, &value, sizeof(value));
|
||||
}
|
||||
|
||||
static SLJIT_INLINE void sljit_unaligned_store_sw(void *addr, sljit_sw value)
|
||||
{
|
||||
SLJIT_MEMCPY(addr, &value, sizeof(value));
|
||||
}
|
||||
|
||||
/******************************************************/
|
||||
/* Utility functions */
|
||||
/******************************************************/
|
||||
|
||||
static void get_cpu_features(void)
|
||||
{
|
||||
sljit_u32 features;
|
||||
|
@ -478,7 +501,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
len = *buf_ptr++;
|
||||
if (len > 0) {
|
||||
/* The code is already generated. */
|
||||
SLJIT_MEMMOVE(code_ptr, buf_ptr, len);
|
||||
SLJIT_MEMCPY(code_ptr, buf_ptr, len);
|
||||
code_ptr += len;
|
||||
buf_ptr += len;
|
||||
}
|
||||
|
@ -504,7 +527,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||
*code_ptr++ = (*buf_ptr == 2) ? CALL_i32 : JMP_i32;
|
||||
buf_ptr++;
|
||||
*(sljit_sw*)code_ptr = *(sljit_sw*)buf_ptr - ((sljit_sw)code_ptr + sizeof(sljit_sw));
|
||||
sljit_unaligned_store_sw(code_ptr, *(sljit_sw*)buf_ptr - ((sljit_sw)code_ptr + sizeof(sljit_sw)));
|
||||
code_ptr += sizeof(sljit_sw);
|
||||
buf_ptr += sizeof(sljit_sw) - 1;
|
||||
#else
|
||||
|
@ -531,24 +554,24 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
} else if (jump->flags & PATCH_MW) {
|
||||
if (jump->flags & JUMP_LABEL) {
|
||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||
*(sljit_sw*)jump->addr = (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_sw)));
|
||||
sljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_sw))));
|
||||
#else
|
||||
SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_s32))) >= HALFWORD_MIN && (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_s32))) <= HALFWORD_MAX);
|
||||
*(sljit_s32*)jump->addr = (sljit_s32)(jump->u.label->addr - (jump->addr + sizeof(sljit_s32)));
|
||||
sljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)(jump->u.label->addr - (jump->addr + sizeof(sljit_s32))));
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||
*(sljit_sw*)jump->addr = (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_sw)));
|
||||
sljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_sw))));
|
||||
#else
|
||||
SLJIT_ASSERT((sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_s32))) >= HALFWORD_MIN && (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_s32))) <= HALFWORD_MAX);
|
||||
*(sljit_s32*)jump->addr = (sljit_s32)(jump->u.target - (jump->addr + sizeof(sljit_s32)));
|
||||
sljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)(jump->u.target - (jump->addr + sizeof(sljit_s32))));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
|
||||
else if (jump->flags & PATCH_MD)
|
||||
*(sljit_sw*)jump->addr = jump->u.label->addr;
|
||||
sljit_unaligned_store_sw((void*)jump->addr, jump->u.label->addr);
|
||||
#endif
|
||||
|
||||
jump = jump->next;
|
||||
|
@ -558,6 +581,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||
SLJIT_ASSERT(code_ptr <= code + compiler->size);
|
||||
compiler->error = SLJIT_ERR_COMPILED;
|
||||
compiler->executable_size = code_ptr - code;
|
||||
SLJIT_ENABLE_EXEC(code, code_ptr);
|
||||
return (void*)code;
|
||||
}
|
||||
|
||||
|
@ -1699,7 +1723,7 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler,
|
|||
inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
|
||||
FAIL_IF(!inst);
|
||||
INC_SIZE(4);
|
||||
*(sljit_sw*)inst = src1w;
|
||||
sljit_unaligned_store_sw(inst, src1w);
|
||||
}
|
||||
#else
|
||||
else if (IS_HALFWORD(src1w)) {
|
||||
|
@ -1709,7 +1733,7 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler,
|
|||
inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
|
||||
FAIL_IF(!inst);
|
||||
INC_SIZE(4);
|
||||
*(sljit_s32*)inst = (sljit_s32)src1w;
|
||||
sljit_unaligned_store_s32(inst, (sljit_s32)src1w);
|
||||
}
|
||||
else {
|
||||
EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, src1w);
|
||||
|
@ -1742,7 +1766,7 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler,
|
|||
inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
|
||||
FAIL_IF(!inst);
|
||||
INC_SIZE(4);
|
||||
*(sljit_sw*)inst = src2w;
|
||||
sljit_unaligned_store_sw(inst, src2w);
|
||||
}
|
||||
#else
|
||||
else if (IS_HALFWORD(src2w)) {
|
||||
|
@ -1752,7 +1776,7 @@ static sljit_s32 emit_mul(struct sljit_compiler *compiler,
|
|||
inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
|
||||
FAIL_IF(!inst);
|
||||
INC_SIZE(4);
|
||||
*(sljit_s32*)inst = (sljit_s32)src2w;
|
||||
sljit_unaligned_store_s32(inst, (sljit_s32)src2w);
|
||||
}
|
||||
else {
|
||||
EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, src2w);
|
||||
|
@ -2248,7 +2272,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *c
|
|||
inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
|
||||
FAIL_IF(!inst);
|
||||
INC_SIZE(size);
|
||||
SLJIT_MEMMOVE(inst, instruction, size);
|
||||
SLJIT_MEMCPY(inst, instruction, size);
|
||||
return SLJIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -2557,6 +2581,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||
struct sljit_jump *jump;
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(type & SLJIT_REWRITABLE_JUMP);
|
||||
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||
|
||||
if (SLJIT_UNLIKELY(compiler->flags_saved)) {
|
||||
|
@ -2885,6 +2910,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
#endif
|
||||
|
||||
CHECK_ERROR_PTR();
|
||||
CHECK_DYN_CODE_MOD(1);
|
||||
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||
|
||||
|
@ -2926,15 +2952,15 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
|
||||
{
|
||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||
*(sljit_sw*)addr = new_addr - (addr + 4);
|
||||
sljit_unaligned_store_sw((void*)addr, new_addr - (addr + 4));
|
||||
#else
|
||||
*(sljit_uw*)addr = new_addr;
|
||||
sljit_unaligned_store_sw((void*)addr, (sljit_sw) new_addr);
|
||||
#endif
|
||||
}
|
||||
|
||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
|
||||
{
|
||||
*(sljit_sw*)addr = new_constant;
|
||||
sljit_unaligned_store_sw((void*)addr, new_constant);
|
||||
}
|
||||
|
||||
SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_x86_is_sse2_available(void)
|
||||
|
|
6
pcre/testdata/testinput1
vendored
6
pcre/testdata/testinput1
vendored
|
@ -5733,4 +5733,10 @@ AbcdCBefgBhiBqz
|
|||
"(?|(\k'Pm')|(?'Pm'))"
|
||||
abcd
|
||||
|
||||
/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/
|
||||
\ Fred:099
|
||||
|
||||
/(?=.*X)X$/
|
||||
\ X
|
||||
|
||||
/-- End of testinput1 --/
|
||||
|
|
26
pcre/testdata/testinput16
vendored
26
pcre/testdata/testinput16
vendored
|
@ -38,4 +38,30 @@
|
|||
/s+/i8SI
|
||||
SSss\x{17f}
|
||||
|
||||
/[\W\p{Any}]/BZ
|
||||
abc
|
||||
123
|
||||
|
||||
/[\W\pL]/BZ
|
||||
abc
|
||||
** Failers
|
||||
123
|
||||
|
||||
/[\D]/8
|
||||
\x{1d7cf}
|
||||
|
||||
/[\D\P{Nd}]/8
|
||||
\x{1d7cf}
|
||||
|
||||
/[^\D]/8
|
||||
a9b
|
||||
** Failers
|
||||
\x{1d7cf}
|
||||
|
||||
/[^\D\P{Nd}]/8
|
||||
a9b
|
||||
\x{1d7cf}
|
||||
** Failers
|
||||
\x{10000}
|
||||
|
||||
/-- End of testinput16 --/
|
||||
|
|
17
pcre/testdata/testinput19
vendored
17
pcre/testdata/testinput19
vendored
|
@ -25,4 +25,21 @@
|
|||
/s+/i8SI
|
||||
SSss\x{17f}
|
||||
|
||||
/[\D]/8
|
||||
\x{1d7cf}
|
||||
|
||||
/[\D\P{Nd}]/8
|
||||
\x{1d7cf}
|
||||
|
||||
/[^\D]/8
|
||||
a9b
|
||||
** Failers
|
||||
\x{1d7cf}
|
||||
|
||||
/[^\D\P{Nd}]/8
|
||||
a9b
|
||||
\x{1d7cf}
|
||||
** Failers
|
||||
\x{10000}
|
||||
|
||||
/-- End of testinput19 --/
|
||||
|
|
6
pcre/testdata/testinput2
vendored
6
pcre/testdata/testinput2
vendored
|
@ -4243,4 +4243,10 @@ backtracking verbs. --/
|
|||
|
||||
/\N(?(?C)0?!.)*/
|
||||
|
||||
/(?<RA>abc)(?(R)xyz)/BZ
|
||||
|
||||
/(?<R>abc)(?(R)xyz)/BZ
|
||||
|
||||
/(?=.*[A-Z])/I
|
||||
|
||||
/-- End of testinput2 --/
|
||||
|
|
6
pcre/testdata/testinput6
vendored
6
pcre/testdata/testinput6
vendored
|
@ -1562,4 +1562,10 @@
|
|||
\x{389}
|
||||
\x{20ac}
|
||||
|
||||
/(?=.*b)\pL/
|
||||
11bb
|
||||
|
||||
/(?(?=.*b)(?=.*b)\pL|.*c)/
|
||||
11bb
|
||||
|
||||
/-- End of testinput6 --/
|
||||
|
|
9
pcre/testdata/testinput7
vendored
9
pcre/testdata/testinput7
vendored
|
@ -838,15 +838,6 @@ of case for anything other than the ASCII letters. --/
|
|||
/^s?c/mi8I
|
||||
scat
|
||||
|
||||
/[\W\p{Any}]/BZ
|
||||
abc
|
||||
123
|
||||
|
||||
/[\W\pL]/BZ
|
||||
abc
|
||||
** Failers
|
||||
123
|
||||
|
||||
/a[[:punct:]b]/WBZ
|
||||
|
||||
/a[[:punct:]b]/8WBZ
|
||||
|
|
4
pcre/testdata/testinput8
vendored
4
pcre/testdata/testinput8
vendored
|
@ -4841,4 +4841,8 @@
|
|||
bbb
|
||||
aaa
|
||||
|
||||
/()()a+/O=
|
||||
aaa\D
|
||||
a\D
|
||||
|
||||
/-- End of testinput8 --/
|
||||
|
|
8
pcre/testdata/testoutput1
vendored
8
pcre/testdata/testoutput1
vendored
|
@ -9434,4 +9434,12 @@ No match
|
|||
0:
|
||||
1:
|
||||
|
||||
/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/
|
||||
\ Fred:099
|
||||
0:
|
||||
|
||||
/(?=.*X)X$/
|
||||
\ X
|
||||
0: X
|
||||
|
||||
/-- End of testinput1 --/
|
||||
|
|
52
pcre/testdata/testoutput16
vendored
52
pcre/testdata/testoutput16
vendored
|
@ -138,4 +138,56 @@ Starting chars: S s \xc5
|
|||
SSss\x{17f}
|
||||
0: SSss\x{17f}
|
||||
|
||||
/[\W\p{Any}]/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
[\x00-/:-@[-^`{-\xff\p{Any}]
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
abc
|
||||
0: a
|
||||
123
|
||||
0: 1
|
||||
|
||||
/[\W\pL]/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
[\x00-/:-@[-^`{-\xff\p{L}]
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
abc
|
||||
0: a
|
||||
** Failers
|
||||
0: *
|
||||
123
|
||||
No match
|
||||
|
||||
/[\D]/8
|
||||
\x{1d7cf}
|
||||
0: \x{1d7cf}
|
||||
|
||||
/[\D\P{Nd}]/8
|
||||
\x{1d7cf}
|
||||
0: \x{1d7cf}
|
||||
|
||||
/[^\D]/8
|
||||
a9b
|
||||
0: 9
|
||||
** Failers
|
||||
No match
|
||||
\x{1d7cf}
|
||||
No match
|
||||
|
||||
/[^\D\P{Nd}]/8
|
||||
a9b
|
||||
0: 9
|
||||
\x{1d7cf}
|
||||
0: \x{1d7cf}
|
||||
** Failers
|
||||
No match
|
||||
\x{10000}
|
||||
No match
|
||||
|
||||
/-- End of testinput16 --/
|
||||
|
|
26
pcre/testdata/testoutput19
vendored
26
pcre/testdata/testoutput19
vendored
|
@ -105,4 +105,30 @@ Starting chars: S s \xff
|
|||
SSss\x{17f}
|
||||
0: SSss\x{17f}
|
||||
|
||||
/[\D]/8
|
||||
\x{1d7cf}
|
||||
0: \x{1d7cf}
|
||||
|
||||
/[\D\P{Nd}]/8
|
||||
\x{1d7cf}
|
||||
0: \x{1d7cf}
|
||||
|
||||
/[^\D]/8
|
||||
a9b
|
||||
0: 9
|
||||
** Failers
|
||||
No match
|
||||
\x{1d7cf}
|
||||
No match
|
||||
|
||||
/[^\D\P{Nd}]/8
|
||||
a9b
|
||||
0: 9
|
||||
\x{1d7cf}
|
||||
0: \x{1d7cf}
|
||||
** Failers
|
||||
No match
|
||||
\x{10000}
|
||||
No match
|
||||
|
||||
/-- End of testinput19 --/
|
||||
|
|
37
pcre/testdata/testoutput2
vendored
37
pcre/testdata/testoutput2
vendored
|
@ -9380,7 +9380,7 @@ No need char
|
|||
/(?(?=.*b).*b|^d)/I
|
||||
Capturing subpattern count = 0
|
||||
No options
|
||||
First char at start or follows newline
|
||||
No first char
|
||||
No need char
|
||||
|
||||
/xyz/C
|
||||
|
@ -14670,4 +14670,39 @@ No match
|
|||
/\N(?(?C)0?!.)*/
|
||||
Failed: assertion expected after (?( or (?(?C) at offset 4
|
||||
|
||||
/(?<RA>abc)(?(R)xyz)/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
CBra 1
|
||||
abc
|
||||
Ket
|
||||
Cond
|
||||
Cond recurse any
|
||||
xyz
|
||||
Ket
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/(?<R>abc)(?(R)xyz)/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
CBra 1
|
||||
abc
|
||||
Ket
|
||||
Cond
|
||||
1 Cond ref
|
||||
xyz
|
||||
Ket
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/(?=.*[A-Z])/I
|
||||
Capturing subpattern count = 0
|
||||
May match empty string
|
||||
No options
|
||||
No first char
|
||||
No need char
|
||||
|
||||
/-- End of testinput2 --/
|
||||
|
|
8
pcre/testdata/testoutput6
vendored
8
pcre/testdata/testoutput6
vendored
|
@ -2573,4 +2573,12 @@ No match
|
|||
\x{20ac}
|
||||
No match
|
||||
|
||||
/(?=.*b)\pL/
|
||||
11bb
|
||||
0: b
|
||||
|
||||
/(?(?=.*b)(?=.*b)\pL|.*c)/
|
||||
11bb
|
||||
0: b
|
||||
|
||||
/-- End of testinput6 --/
|
||||
|
|
26
pcre/testdata/testoutput7
vendored
26
pcre/testdata/testoutput7
vendored
|
@ -2295,32 +2295,6 @@ Need char = 'c' (caseless)
|
|||
scat
|
||||
0: sc
|
||||
|
||||
/[\W\p{Any}]/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
[\x00-/:-@[-^`{-\xff\p{Any}]
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
abc
|
||||
0: a
|
||||
123
|
||||
0: 1
|
||||
|
||||
/[\W\pL]/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
[\x00-/:-@[-^`{-\xff\p{L}]
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
abc
|
||||
0: a
|
||||
** Failers
|
||||
0: *
|
||||
123
|
||||
No match
|
||||
|
||||
/a[[:punct:]b]/WBZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
|
|
10
pcre/testdata/testoutput8
vendored
10
pcre/testdata/testoutput8
vendored
|
@ -7791,4 +7791,14 @@ Matched, but offsets vector is too small to show all matches
|
|||
aaa
|
||||
No match
|
||||
|
||||
/()()a+/O=
|
||||
aaa\D
|
||||
** Show all captures ignored after DFA matching
|
||||
0: aaa
|
||||
1: aa
|
||||
2: a
|
||||
a\D
|
||||
** Show all captures ignored after DFA matching
|
||||
0: a
|
||||
|
||||
/-- End of testinput8 --/
|
||||
|
|
Loading…
Reference in a new issue