mirror of
https://github.com/bdnugget/php-src.git
synced 2026-11-11 11:10:49 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5ec2cde79 |
No files matched your search
@@ -1,7 +1,8 @@
|
||||
set $zts = 0
|
||||
|
||||
define ____executor_globals
|
||||
if basic_functions_module.zts
|
||||
set $tsrm_ls = ts_resource_ex(0, 0)
|
||||
set $eg = ((zend_executor_globals) (*((void ***) $tsrm_ls))[executor_globals_id-1])
|
||||
if $zts
|
||||
set $eg = ((zend_executor_globals) (*((void ***) tsrm_ls))[executor_globals_id-1])
|
||||
else
|
||||
set $eg = executor_globals
|
||||
end
|
||||
@@ -9,7 +10,7 @@ end
|
||||
|
||||
document ____executor_globals
|
||||
portable way of accessing executor_globals
|
||||
ZTS detection is automatically based on ext/standard module struct
|
||||
type "set $zts = 1" if you use --enable-maintainer-zts on your configure line
|
||||
end
|
||||
|
||||
define dump_bt
|
||||
@@ -43,33 +44,55 @@ document printzv
|
||||
end
|
||||
|
||||
define ____printzv_contents
|
||||
____executor_globals
|
||||
set $zvalue = $arg0
|
||||
set $type = $zvalue->type
|
||||
|
||||
printf "(refcount=%d) ", $zvalue->refcount
|
||||
if $type == 0
|
||||
printf "NULL"
|
||||
if $zvalue.type == 0
|
||||
set $typename = "NULL"
|
||||
end
|
||||
if $type == 1
|
||||
printf "long: %ld", $zvalue->value.lval
|
||||
if $zvalue.type == 1
|
||||
set $typename = "long"
|
||||
end
|
||||
if $type == 2
|
||||
printf "double: %lf", $zvalue->value.dval
|
||||
if $zvalue.type == 2
|
||||
set $typename = "double"
|
||||
end
|
||||
if $type == 3
|
||||
printf "bool: "
|
||||
if $zvalue->value.lval
|
||||
printf "true"
|
||||
else
|
||||
printf "false"
|
||||
end
|
||||
if $zvalue.type == 3
|
||||
set $typename = "string"
|
||||
end
|
||||
if $type == 4
|
||||
printf "array(%d): ", $zvalue->value.ht->nNumOfElements
|
||||
if $zvalue.type == 4
|
||||
set $typename = "array"
|
||||
end
|
||||
if $zvalue.type == 5
|
||||
set $typename = "object"
|
||||
end
|
||||
if $zvalue.type == 6
|
||||
set $typename = "bool"
|
||||
end
|
||||
if $zvalue.type == 7
|
||||
set $typename = "resource"
|
||||
end
|
||||
if $zvalue.type == 8
|
||||
set $typename = "constant"
|
||||
end
|
||||
if $zvalue.type == 9
|
||||
set $typename = "const_array"
|
||||
end
|
||||
|
||||
printf "(refcount=%d) %s: ", $zvalue.refcount, $typename
|
||||
if $zvalue.type == 1
|
||||
printf "%ld", $zvalue.value.lval
|
||||
end
|
||||
if $zvalue->type == 2
|
||||
printf "%lf", $zvalue.value.dval
|
||||
end
|
||||
if $zvalue.type == 3
|
||||
printf "\"%s\"(%d)", $zvalue.value.str.val, $zvalue.value.str.len
|
||||
end
|
||||
if $zvalue.type == 4
|
||||
if ! $arg1
|
||||
printf "{\n"
|
||||
set $ind = $ind + 1
|
||||
____print_ht $zvalue->value.ht
|
||||
____print_ht $zvalue.value.ht
|
||||
set $ind = $ind - 1
|
||||
set $i = $ind
|
||||
while $i > 0
|
||||
@@ -78,60 +101,34 @@ define ____printzv_contents
|
||||
end
|
||||
printf "}"
|
||||
end
|
||||
set $type = 0
|
||||
end
|
||||
if $type == 5
|
||||
printf "object"
|
||||
____executor_globals
|
||||
set $handle = $zvalue->value.obj.handle
|
||||
set $handlers = $zvalue->value.obj.handlers
|
||||
if basic_functions_module.zts
|
||||
set $zobj = zend_objects_get_address($zvalue, $tsrm_ls)
|
||||
else
|
||||
set $zobj = zend_objects_get_address($zvalue)
|
||||
end
|
||||
if $handlers->get_class_entry == &zend_std_object_get_class
|
||||
set $cname = $zobj->ce.name
|
||||
else
|
||||
set $cname = "Unknown"
|
||||
end
|
||||
printf "(%s) #%d", $cname, $handle
|
||||
if $zvalue.type == 5
|
||||
if ! $arg1
|
||||
if $handlers->get_properties == &zend_std_get_properties
|
||||
set $ht = $zobj->properties
|
||||
if $ht
|
||||
printf "(%d): ", $ht->nNumOfElements
|
||||
printf "{\n"
|
||||
set $ind = $ind + 1
|
||||
____print_ht $ht
|
||||
set $ind = $ind - 1
|
||||
set $i = $ind
|
||||
while $i > 0
|
||||
printf " "
|
||||
set $i = $i - 1
|
||||
end
|
||||
printf "}"
|
||||
else
|
||||
echo "no properties found"
|
||||
end
|
||||
printf "(prop examination disabled due to a gdb bug)"
|
||||
if $zvalue.value.obj.handlers->get_properties
|
||||
# set $ht = $zvalue->value.obj.handlers->get_properties($zvalue)
|
||||
# printf "{\n"
|
||||
# set $ind = $ind + 1
|
||||
# ____print_ht $ht
|
||||
# set $ind = $ind - 1
|
||||
# set $i = $ind
|
||||
# while $i > 0
|
||||
# printf " "
|
||||
# set $i = $i - 1
|
||||
# end
|
||||
# printf "}"
|
||||
end
|
||||
end
|
||||
set $type = 0
|
||||
end
|
||||
if $type == 6
|
||||
printf "string(%d): \"%s\"", $zvalue->value.str.len, $zvalue->value.str.val
|
||||
if $zvalue.type == 6
|
||||
if $zvalue.value.lval
|
||||
printf "true"
|
||||
else
|
||||
printf "false"
|
||||
end
|
||||
end
|
||||
if $type == 7
|
||||
printf "resource: #%d", $zvalue->value.lval
|
||||
end
|
||||
if $type == 8
|
||||
printf "constant"
|
||||
end
|
||||
if $type == 9
|
||||
printf "const_array"
|
||||
end
|
||||
if $type > 9
|
||||
printf "unknown type %d", $type
|
||||
if $zvalue.type == 7
|
||||
printf "#%d", $zvalue.value.lval
|
||||
end
|
||||
printf "\n"
|
||||
end
|
||||
@@ -146,7 +143,7 @@ define ____printzv
|
||||
printf "*uninitialized* "
|
||||
end
|
||||
|
||||
set $zcontents = (zval*) $zvalue
|
||||
set $zcontents = *(struct _zval_struct *) $zvalue
|
||||
if $arg1
|
||||
____printzv_contents $zcontents $arg1
|
||||
else
|
||||
@@ -159,7 +156,7 @@ define ____print_const_table
|
||||
set $p = $ht->pListHead
|
||||
|
||||
while $p != 0
|
||||
set $const = (zend_constant *) $p->pData
|
||||
set $const = *(zend_constant *) $p->pData
|
||||
|
||||
set $i = $ind
|
||||
while $i > 0
|
||||
@@ -173,7 +170,7 @@ define ____print_const_table
|
||||
printf "%d => ", $p->h
|
||||
end
|
||||
|
||||
____printzv_contents &$const->value 0
|
||||
____printzv_contents $const.value 0
|
||||
set $p = $p->pListNext
|
||||
end
|
||||
end
|
||||
@@ -190,7 +187,7 @@ define ____print_ht
|
||||
set $p = $ht->pListHead
|
||||
|
||||
while $p != 0
|
||||
set $zval = *(zval **)$p->pData
|
||||
set $zval = *(struct _zval_struct **)$p->pData
|
||||
|
||||
set $i = $ind
|
||||
while $i > 0
|
||||
@@ -220,41 +217,6 @@ document print_ht
|
||||
dumps elements of HashTable made of zval
|
||||
end
|
||||
|
||||
define ____print_ft
|
||||
set $ht = $arg0
|
||||
set $p = $ht->pListHead
|
||||
|
||||
while $p != 0
|
||||
set $func = (zend_function*)$p->pData
|
||||
|
||||
set $i = $ind
|
||||
while $i > 0
|
||||
printf " "
|
||||
set $i = $i - 1
|
||||
end
|
||||
|
||||
if $p->nKeyLength > 0
|
||||
printf "\"%s\" => ", (char*)$p->arKey
|
||||
else
|
||||
printf "%d => ", $p->h
|
||||
end
|
||||
|
||||
printf "\"%s\"\n", $func->common.function_name
|
||||
set $p = $p->pListNext
|
||||
end
|
||||
end
|
||||
|
||||
define print_ft
|
||||
set $ind = 1
|
||||
printf "[0x%08x] {\n", $arg0
|
||||
____print_ft $arg0
|
||||
printf "}\n"
|
||||
end
|
||||
|
||||
document print_ft
|
||||
dumps a function table (HashTable)
|
||||
end
|
||||
|
||||
define printzn
|
||||
____executor_globals
|
||||
set $ind = 0
|
||||
|
||||
+7
-12
@@ -148,19 +148,20 @@ Naming Conventions
|
||||
'buildsomewidget'
|
||||
'getI()'
|
||||
|
||||
[7] Classes should be given descriptive names. Avoid using abbreviations where
|
||||
possible. Each word in the class name should start with a capital letter,
|
||||
without underscore delimiters (CampelCaps starting with a capital letter).
|
||||
The class name should be prefixed with the name of the 'parent set' (e.g.
|
||||
the name of the extension).
|
||||
[7] Classes should be given descriptive names. Avoid using abbreviations
|
||||
where possible. Each word in the class name should start with a capital
|
||||
letter, with words underscore delimited. The class name should be prefixed
|
||||
with the name of the 'parent set'.
|
||||
|
||||
Good:
|
||||
'Curl'
|
||||
'FooBar'
|
||||
'Foo_Bar'
|
||||
|
||||
Bad:
|
||||
'foobar'
|
||||
'foo_bar'
|
||||
'FooBar'
|
||||
|
||||
|
||||
Syntax and indentation
|
||||
----------------------
|
||||
@@ -207,12 +208,6 @@ Syntax and indentation
|
||||
indent preprocessor directives you should put the # at the beginning
|
||||
of a line, followed by any number of whitespace.
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
[1] Extensions should be well tested using *.phpt tests. Read about that
|
||||
in README.TESTING.
|
||||
|
||||
Documentation and Folding Hooks
|
||||
-------------------------------
|
||||
|
||||
|
||||
+13
-13
@@ -46,9 +46,9 @@ MAINTENANCE: Maintained
|
||||
STATUS: Experimental
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: apache2handler
|
||||
PRIMARY MAINTAINER: Aaron Bannert <aaron@php.net>, Ilia Alshanetsky <iliaa@php.net>
|
||||
PRIMARY MAINTAINER: Aaron Bannert <aaron@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
STATUS: Experimental
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: caudium
|
||||
MAINTENANCE: Unknown
|
||||
@@ -68,6 +68,11 @@ PRIMARY MAINTAINER: Alex Leigh <aleigh@php.net>
|
||||
MAINTENANCE: Unknown
|
||||
STATUS: Unknown
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: date
|
||||
PRIMARY MAINTAINER: Derick Rethans <derick@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: embed
|
||||
PRIMARY MAINTAINER: Edin Kadribasic <edink@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
@@ -171,9 +176,9 @@ MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: mysqli
|
||||
PRIMARY MAINTAINER: Georg Richter <georg@php.net>, Andrey Hristov <andrey@php.net>
|
||||
PRIMARY MAINTAINER: Georg Richter <georg@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
STATUS: Experimental
|
||||
SINCE: 5.0
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: oci8
|
||||
@@ -297,16 +302,11 @@ MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: curl
|
||||
PRIMARY MAINTAINER: Sterling Hughes <sterling@php.net>,Ilia Alshanetsky <iliaa@php.net>
|
||||
PRIMARY MAINTAINER: Sterling Hughes <sterling@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
SINCE: 4.0.2
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: date
|
||||
PRIMARY MAINTAINER: Derick Rethans <derick@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: exif
|
||||
PRIMARY MAINTAINER: Marcus Boerger <helly@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
@@ -357,8 +357,8 @@ MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: imap
|
||||
PRIMARY MAINTAINER: Chuck Hagenbuch <chuck@horde.org>, Ilia Alshanetsky <iliaa@php.net>
|
||||
MAINTENANCE: Maintained
|
||||
PRIMARY MAINTAINER: Chuck Hagenbuch <chuck@horde.org>
|
||||
MAINTENANCE: Odd Fixes
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: ircg
|
||||
@@ -465,7 +465,7 @@ MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: session
|
||||
PRIMARY MAINTAINER: Sascha Schumann <sascha@schumann.cx>, Ilia Alshanetsky <iliaa@php.net>
|
||||
PRIMARY MAINTAINER: Sascha Schumann <sascha@schumann.cx>
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
Installing PHP
|
||||
_________________________________________________________________
|
||||
|
||||
@@ -16,7 +17,6 @@ Installing PHP
|
||||
OpenBSD installation notes
|
||||
Solaris specific installation tips
|
||||
Gentoo installation notes
|
||||
Debian GNU/Linux installation notes
|
||||
|
||||
3. Installation on Mac OS X
|
||||
|
||||
@@ -43,8 +43,6 @@ Installing PHP
|
||||
|
||||
The configuration file
|
||||
How to change configuration settings
|
||||
|
||||
7. Installation FAQ
|
||||
_________________________________________________________________
|
||||
|
||||
Preface
|
||||
@@ -166,7 +164,7 @@ Apache 1.3.x on Unix systems
|
||||
your files.
|
||||
|
||||
Example 2-1. Installation Instructions (Apache Shared Module Version)
|
||||
for PHP
|
||||
for PHP
|
||||
1. gunzip apache_xxx.tar.gz
|
||||
2. tar -xvf apache_xxx.tar
|
||||
3. gunzip php-xxx.tar.gz
|
||||
@@ -250,38 +248,36 @@ Apache 1.3.x on Unix systems
|
||||
Alternatively, to install PHP as a static object:
|
||||
|
||||
Example 2-2. Installation Instructions (Static Module Installation for
|
||||
Apache) for PHP
|
||||
Apache) for PHP
|
||||
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
|
||||
2. cd apache_1.3.x
|
||||
3. ./configure
|
||||
4. cd ..
|
||||
|
||||
5. gunzip -c php-5.x.y.tar.gz | tar xf -
|
||||
6. cd php-5.x.y
|
||||
5. gunzip -c php-4.x.y.tar.gz | tar xf -
|
||||
6. cd php-4.x.y
|
||||
7. ./configure --with-mysql --with-apache=../apache_1.3.x
|
||||
8. make
|
||||
9. make install
|
||||
|
||||
10. cd ../apache_1.3.x
|
||||
|
||||
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
|
||||
(The above line is correct! Yes, we know libphp5.a does not exist at this
|
||||
11. ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a
|
||||
(The above line is correct! Yes, we know libphp4.a does not exist at this
|
||||
stage. It isn't supposed to. It will be created.)
|
||||
|
||||
12. make
|
||||
(you should now have an httpd binary which you can copy to your Apache bin
|
||||
dir if
|
||||
it is your first install then you need to "make install" as well)
|
||||
is is your first install then you need to "make install" as well)
|
||||
|
||||
13. cd ../php-5.x.y
|
||||
13. cd ../php-4.x.y
|
||||
14. cp php.ini-dist /usr/local/lib/php.ini
|
||||
|
||||
15. You can edit /usr/local/lib/php.ini file to set PHP options.
|
||||
Edit your httpd.conf or srm.conf file and add:
|
||||
AddType application/x-httpd-php .php
|
||||
|
||||
Note: Replace php-5 by php-4 and php5 by php4 in PHP 4.
|
||||
|
||||
Depending on your Apache install and Unix variant, there are many
|
||||
possible ways to stop and restart the server. Below are some typical
|
||||
lines used in restarting the server, for different apache/unix
|
||||
@@ -313,9 +309,9 @@ stop and start:
|
||||
|
||||
./configure --with-apxs --with-pgsql
|
||||
|
||||
This will create a libphp5.so (or libphp4.so in PHP 4) shared library
|
||||
that is loaded into Apache using a LoadModule line in Apache's
|
||||
httpd.conf file. The PostgreSQL support is embedded into this library.
|
||||
This will create a libphp4.so shared library that is loaded into
|
||||
Apache using a LoadModule line in Apache's httpd.conf file. The
|
||||
PostgreSQL support is embedded into this libphp4.so library.
|
||||
|
||||
./configure --with-apxs --with-pgsql=shared
|
||||
|
||||
@@ -326,14 +322,14 @@ stop and start:
|
||||
|
||||
./configure --with-apache=/path/to/apache_source --with-pgsql
|
||||
|
||||
This will create a libmodphp5.a library, a mod_php5.c and some
|
||||
accompanying files and copy this into the src/modules/php5 directory
|
||||
This will create a libmodphp4.a library, a mod_php4.c and some
|
||||
accompanying files and copy this into the src/modules/php4 directory
|
||||
in the Apache source tree. Then you compile Apache using
|
||||
--activate-module=src/modules/php5/libphp5.a and the Apache build
|
||||
system will create libphp5.a and link it statically into the httpd
|
||||
binary (replace php5 by php4 in PHP 4). The PostgreSQL support is
|
||||
included directly into this httpd binary, so the final result here is
|
||||
a single httpd binary that includes all of Apache and all of PHP.
|
||||
--activate-module=src/modules/php4/libphp4.a and the Apache build
|
||||
system will create libphp4.a and link it statically into the httpd
|
||||
binary. The PostgreSQL support is included directly into this httpd
|
||||
binary, so the final result here is a single httpd binary that
|
||||
includes all of Apache and all of PHP.
|
||||
|
||||
./configure --with-apache=/path/to/apache_source --with-pgsql=shared
|
||||
|
||||
@@ -384,8 +380,8 @@ Apache 2.0 on Unix systems
|
||||
|
||||
* PHP 4.3.0 or later available at http://www.php.net/downloads.php.
|
||||
* the latest stable development version. Get the source code
|
||||
http://snaps.php.net/php5-latest.tar.gz or download binaries for
|
||||
Windows http://snaps.php.net/win32/php5-win32-latest.zip.
|
||||
http://snaps.php.net/php4-latest.tar.gz or download binaries for
|
||||
Windows http://snaps.php.net/win32/php4-win32-latest.zip.
|
||||
* a prerelease version downloadable from http://qa.php.net/.
|
||||
* you have always the option to obtain PHP through anonymous CVS.
|
||||
|
||||
@@ -407,7 +403,7 @@ Apache 2.0 on Unix systems
|
||||
files.
|
||||
|
||||
Example 2-4. Installation Instructions (Apache 2 Shared Module
|
||||
Version)
|
||||
Version)
|
||||
1. gzip -d httpd-2_0_NN.tar.gz
|
||||
2. tar xvf httpd-2_0_NN.tar
|
||||
3. gunzip php-NN.tar.gz
|
||||
@@ -465,11 +461,11 @@ Apache 2.0 on Unix systems
|
||||
|
||||
For PHP 4:
|
||||
|
||||
LoadModule php4_module modules/libphp4.so
|
||||
LoadModule php4_module libexec/libphp4.so
|
||||
|
||||
For PHP 5:
|
||||
|
||||
LoadModule php5_module modules/libphp5.so
|
||||
LoadModule php5_module libexec/libphp5.so
|
||||
|
||||
15. Tell Apache to parse certain extensions as PHP. For example,
|
||||
let's have Apache parse the .php extension as PHP. You could
|
||||
@@ -1101,121 +1097,6 @@ Common Problems
|
||||
"Apache PHP".
|
||||
_________________________________________________________________
|
||||
|
||||
Debian GNU/Linux installation notes
|
||||
|
||||
This section contains notes and hints specific to installing PHP on
|
||||
Debian GNU/Linux.
|
||||
_________________________________________________________________
|
||||
|
||||
Using APT
|
||||
|
||||
While you can just download the PHP source and compile it yourself,
|
||||
using Debian's packaging system is the simplest and cleanest method of
|
||||
installing PHP. If you are not familiar with building software on
|
||||
Linux, this is the way to go.
|
||||
|
||||
The first decision you need to make is whether you want to install
|
||||
Apache 1.3.x or Apache 2.x. The corresponding PHP packages are
|
||||
respectively named libapache-mod-php* and libapache2-mod-php*. The
|
||||
steps given below will use Apache 1.3.x. Please note that, as of this
|
||||
writing, there is no official Debian packages of PHP 5. Then the steps
|
||||
given below will install PHP 4.
|
||||
|
||||
PHP is available in Debian as CGI or CLI flavour too, named
|
||||
respectively php4-cgi and php4-cli. If you need them, you'll just have
|
||||
to reproduce the following steps with the good package names. Another
|
||||
special package you'd want to install is php4-pear. It contains a
|
||||
minimal PEAR installation and the pear commandline utility.
|
||||
|
||||
If you need more recent packages of PHP than the Debian's stable ones
|
||||
or if some PHP modules lacks the Debian official repository, perhaps
|
||||
you should take a look at http://www.apt-get.org/. One of the results
|
||||
found should be Dotdeb. This unofficial repository is maintained by
|
||||
Guillaume Plessis and contains Debian packages of the most recent
|
||||
versions of PHP 4 and PHP 5. To use it, just add the to following two
|
||||
lines to your /etc/apt/sources.lists and run apt-get update :
|
||||
|
||||
Example 2-10. The two Dotdeb related lines
|
||||
deb http://packages.dotdeb.org stable all
|
||||
deb-src http://packages.dotdeb.org stable all
|
||||
|
||||
The last thing to consider is whether your list of packages is up to
|
||||
date. If you have not updated it recently, you need to run apt-get
|
||||
update before anything else. This way, you will be using the most
|
||||
recent stable version of the Apache and PHP packages.
|
||||
|
||||
Now that everything is in place, you can use the following example to
|
||||
install Apache and PHP:
|
||||
|
||||
Example 2-11. Debian Install Example with Apache 1.3
|
||||
# apt-get install libapache-mod-php4
|
||||
|
||||
APT will automatically install the PHP 4 module for Apache 1.3, and
|
||||
all its dependencies and then activate it. If you're not asked to
|
||||
restart Apache during the install process, you'll have to do it
|
||||
manually :
|
||||
|
||||
Example 2-12. Stopping and starting Apache once PHP 4 is installed
|
||||
# /etc/init.d/apache stop
|
||||
# /etc/init.d/apache start
|
||||
_________________________________________________________________
|
||||
|
||||
Better control on configuration
|
||||
|
||||
In the last section, PHP was installed with only core modules. This
|
||||
may not be what you want and you will soon discover that you need more
|
||||
activated modules, like MySQL, cURL, GD, etc.
|
||||
|
||||
When you compile PHP from source yourself, you need to activate
|
||||
modules via the configure command. With APT, you just have to install
|
||||
additional packages. They're all named 'php4-*' (or 'php5-*' if you
|
||||
installed PHP 5 from a third party repository).
|
||||
|
||||
Example 2-13. Getting the list of PHP additional packages
|
||||
# dpkg -l 'php4-*'
|
||||
|
||||
As you can see from the last output, there's a lot of PHP modules that
|
||||
you can install (excluding the php4-cgi, php4-cli or php4-pear special
|
||||
packages). Look at them closely and choose what you need. If you
|
||||
choose a module and you do not have the proper libraries, APT will
|
||||
automatically install all the dependencies for you.
|
||||
|
||||
If you choose to add the MySQL, cURL and GD support to PHP the command
|
||||
will look something like this:
|
||||
|
||||
Example 2-14. Install PHP with MySQL, cURL and GD
|
||||
# apt-get install php4-mysql php4-curl php4-gd
|
||||
|
||||
APT will automatically add the appropriate lines to your different
|
||||
php.ini (/etc/php4/apache/php.ini, /etc/php4/cgi/php.ini, etc).
|
||||
|
||||
Example 2-15. These lines activate MySQL, cURL and GD into PHP
|
||||
extension=mysql.so
|
||||
extension=curl.so
|
||||
extension=gd.so
|
||||
|
||||
You'll only have to stop/start Apache as previously to activate the
|
||||
modules.
|
||||
_________________________________________________________________
|
||||
|
||||
Common Problems
|
||||
|
||||
* If you see the PHP source instead of the result the script should
|
||||
produce, APT has probably not included /etc/apache/conf.d/php4 in
|
||||
your Apache 1.3 configuration. Please ensure that the following
|
||||
line is present in your /etc/apache/httpd.conf file then
|
||||
stop/start Apache:
|
||||
|
||||
Example 2-16. This line activates PHP 4 into Apache
|
||||
# Include /etc/apache/conf.d/
|
||||
|
||||
* If you installed an additional module and if its functions are not
|
||||
available in your scripts, please ensure that the appropriate line
|
||||
is present in your php.ini, as seen before. APT may fail during
|
||||
the installation of the additional module, due to a confusing
|
||||
debconf configuration.
|
||||
_________________________________________________________________
|
||||
|
||||
Chapter 3. Installation on Mac OS X
|
||||
|
||||
This section contains notes and hints specific to installing PHP on
|
||||
@@ -1238,7 +1119,7 @@ Using Packages
|
||||
|
||||
Compiling for OS X Server
|
||||
|
||||
Mac OS X Server install.
|
||||
Mac OS X Server install.
|
||||
|
||||
1. Get the latest distributions of Apache and PHP.
|
||||
2. Untar them, and run the configure program on Apache like so.
|
||||
@@ -1340,24 +1221,24 @@ Chapter 4. Installation of PECL extensions
|
||||
|
||||
Introduction to PECL Installations
|
||||
|
||||
PECL is a repository of PHP extensions that are made available to you
|
||||
via the PEAR packaging system. This section of the manual is intended
|
||||
to demonstrate how to obtain and install PECL extensions.
|
||||
PHP extensions may be installed in a variety of ways. PECL is a
|
||||
repository of PHP extensions living within the PEAR structure, and the
|
||||
following demonstrates how to install these extensions.
|
||||
|
||||
These instructions assume /your/phpsrcdir/ is the path to the PHP
|
||||
source distribution, and that extname is the name of the PECL
|
||||
extension. Adjust accordingly. These instructions also assume a
|
||||
familiarity with the pear command.
|
||||
source, and extname is the name of the PECL extension. Adjust
|
||||
accordingly. These instructions also assume a familiarity with the
|
||||
pear command.
|
||||
|
||||
To be useful, a shared extension must be built, installed, and loaded.
|
||||
The methods described below provide you with various instructions on
|
||||
how to build and install the extensions, but they do not automatically
|
||||
load them. Extensions can be loaded by adding an extension directive.
|
||||
To this php.ini file, or through the use of the dl() function.
|
||||
Shared extensions may be installed by including them inside of php.ini
|
||||
using the extension PHP directive. See also the extensions_dir
|
||||
directive, and dl(). The installation methods described below do not
|
||||
automatically configure PHP to include these extensions, this step
|
||||
must be done manually.
|
||||
|
||||
When building PHP modules, it's important to have known-good versions
|
||||
of the required tools (autoconf, automake, libtool, etc.) See the
|
||||
Anonymous CVS Instructions for details on the required tools, and
|
||||
When building PHP modules, it's important to have the appropriate
|
||||
versions of the required tools (autoconf, automake, libtool, etc.) See
|
||||
the Anonymous CVS Instructions for details on the required tools, and
|
||||
required versions.
|
||||
_________________________________________________________________
|
||||
|
||||
@@ -1366,19 +1247,16 @@ Downloading PECL extensions
|
||||
There are several options for downloading PECL extensions, such as:
|
||||
|
||||
* http://pecl.php.net
|
||||
The PECL web site contains information about the different
|
||||
extensions that are offered by the PHP Development Team. The
|
||||
information available here includes: ChangeLog, release notes,
|
||||
requirements and other similar details.
|
||||
Listed here is information like the ChangeLog, release
|
||||
information, requirements, revisions, etc. Although not every PECL
|
||||
extension has a webpage, most do.
|
||||
* pear download extname
|
||||
PECL extensions that have releases listed on the PECL web site are
|
||||
available for download and installation using the pear command.
|
||||
The pear command may also be used to download source files.
|
||||
Specific revisions may also be specified.
|
||||
* CVS
|
||||
Most PECL extensions also reside in CVS. A web-based view may be
|
||||
seen at http://cvs.php.net/pecl/. To download straight from CVS,
|
||||
the following sequence of commands may be used. Note that phpfi is
|
||||
the password for user cvsread:
|
||||
All PECL files reside in CVS. A web-based view may be seen at
|
||||
http://cvs.php.net/pecl/. To download straight from CVS, consider
|
||||
the following where phpfi is the password for user cvsread:
|
||||
|
||||
$ cvs -d:pserver:cvsread@cvs.php.net:/repository login
|
||||
$ cvs -d:pserver:cvsread@cvs.php.net:/repository co pecl/extname
|
||||
@@ -1392,10 +1270,9 @@ $ cvs -d:pserver:cvsread@cvs.php.net:/repository co pecl/extname
|
||||
|
||||
PECL for Windows users
|
||||
|
||||
As with any other PHP extension DLL, installation is as simple as
|
||||
copying the PECL extension DLLs into the extension_dir folder and
|
||||
loading them from php.ini. For example, add the following line to your
|
||||
php.ini:
|
||||
Like with any other PHP extension DLL, to install move the PECL
|
||||
extension DLLs into the extension_dir folder and include them within
|
||||
php.ini. For example:
|
||||
|
||||
extension=php_extname.dll
|
||||
|
||||
@@ -1409,76 +1286,67 @@ Compiling shared PECL extensions with PEAR
|
||||
|
||||
$ pear install extname
|
||||
|
||||
This will download the source for extname, compile, and install
|
||||
extname.so into your extension_dir. extname.so may then be loaded via
|
||||
php.ini
|
||||
That will download the source for extname, and compile it on the
|
||||
system. This results in an extname.so file that may then be included
|
||||
in php.ini
|
||||
|
||||
By default, the pear command will not install packages that are marked
|
||||
with the alpha or beta state. If no stable packages are available, you
|
||||
may install a beta package using the following command:
|
||||
In case the systems preferred_state is set higher than an available
|
||||
extname version, like it's set to stable and the extension is still in
|
||||
beta, either alter the preferred_state via pear config-set or specify
|
||||
a specific version of the PECL extension. For example:
|
||||
|
||||
$ pear install extname-beta
|
||||
$ pear install extname-0.1.1
|
||||
|
||||
You may also install a specific version using this variant:
|
||||
|
||||
$ pear install extname-0.1
|
||||
Regardless, pear will copy this extname.so into the extensions
|
||||
directory. Adjust php.ini accordingly.
|
||||
_________________________________________________________________
|
||||
|
||||
Compiling shared PECL extensions with phpize
|
||||
|
||||
Sometimes, using the pear installer is not an option. This could be
|
||||
because you're behind a firewall, or it could be because the extension
|
||||
you want to install is not available as a PEAR compatible package,
|
||||
such as unreleased extensions from CVS. If you need to build such an
|
||||
extension, you can use the lower-level build tools to perform the
|
||||
build manually.
|
||||
|
||||
The phpize command is used to prepare the build environment for a PHP
|
||||
extension. In the following sample, the sources for an extension are
|
||||
in a directory named extname:
|
||||
If using pear is not an option, like for building shared PECL
|
||||
extensions from CVS, or for unreleased PECL packages, then creating a
|
||||
shared extension may also be done by manually using the phpize
|
||||
command. The pear command essentially does this but it may also be
|
||||
done manually. Assuming the source file is named extname.tgz, and that
|
||||
it was downloaded into the current directory, consider the following:
|
||||
|
||||
$ pear download extname
|
||||
$ gzip -d < extname.tgz | tar -xvf -
|
||||
$ cd extname
|
||||
$ phpize
|
||||
$ ./configure
|
||||
$ make
|
||||
# make install
|
||||
$ ./configure && make
|
||||
|
||||
A successful install will have created extname.so and put it into the
|
||||
PHP extensions directory. You'll need to and adjust php.ini and add an
|
||||
extension=extname.so line before you can use the extension.
|
||||
Upon success, this will create extname.so and put it into the modules/
|
||||
and/or .libs/ directory within the extname/ source. Move this shared
|
||||
extension (extname.so) into the PHP extensions directory, and adjust
|
||||
php.ini accordingly.
|
||||
_________________________________________________________________
|
||||
|
||||
Compiling PECL extensions statically into PHP
|
||||
|
||||
You might find that you need to build a PECL extension statically into
|
||||
your PHP binary. To do this, you'll need to place the extension source
|
||||
under the php-src/ext/ directory and tell the PHP build system to
|
||||
regenerate its configure script.
|
||||
To statically include the extension within the PHP build, put the
|
||||
extensions source into the ext/ directory found in the PHP source. For
|
||||
example:
|
||||
|
||||
$ cd /your/phpsrcdir/ext
|
||||
$ pear download extname
|
||||
$ gzip -d < extname.tgz | tar -xvf -
|
||||
$ mv extname-x.x.x extname
|
||||
$ rm package.xml
|
||||
|
||||
This will result in the following directory:
|
||||
|
||||
/your/phpsrcdir/ext/extname
|
||||
|
||||
From here, force PHP to rebuild the configure script, and then build
|
||||
PHP as normal:
|
||||
From here, build PHP as normal:
|
||||
|
||||
$ cd /your/phpsrcdir
|
||||
$ rm configure
|
||||
$ ./buildconf --force
|
||||
$ ./buildconf
|
||||
$ ./configure --help
|
||||
$ ./configure --with-extname --enable-someotherext --with-foobar
|
||||
$ make
|
||||
$ make install
|
||||
|
||||
Note: To run the 'buildconf' script you need autoconf 2.13 and
|
||||
automake 1.4+ (newer versions of autoconf may work, but are not
|
||||
supported).
|
||||
|
||||
Whether --enable-extname or --with-extname is used depends on the
|
||||
extension. Typically an extension that does not require external
|
||||
libraries uses --enable. To be sure, run the following after
|
||||
@@ -1535,23 +1403,14 @@ The configuration file
|
||||
versions of PHP, this happens only once when the web server is
|
||||
started. For the CGI and CLI version, it happens on every invocation.
|
||||
|
||||
php.ini is searched in these locations (in order):
|
||||
|
||||
* SAPI module specific location (PHPIniDir directive in Apache 2, -c
|
||||
command line option in CGI and CLI, php_ini parameter in NSAPI,
|
||||
PHP_INI_PATH environment variable in THTTPD)
|
||||
* HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath (Windows Registry
|
||||
location)
|
||||
* The PHPRC environment variable
|
||||
* Current working directory (for CLI)
|
||||
* The web server's directory (for SAPI modules), or directory of PHP
|
||||
(otherwise in Windows)
|
||||
* Windows directory (C:\windows or C:\winnt) (for Windows), or
|
||||
--with-config-file-path compile time option
|
||||
The default location of php.ini is a compile time option (see the FAQ
|
||||
entry), but can be changed for the CGI and CLI version with the -c
|
||||
command line switch, see the chapter about using PHP from the command
|
||||
line. You can also use the environment variable PHPRC for an
|
||||
additional path to search for a php.ini file.
|
||||
|
||||
If php-SAPI.ini exists (where SAPI is used SAPI, so the filename is
|
||||
e.g. php-cli.ini or php-apache.ini), it's used instead of php.ini.
|
||||
SAPI name can be determined by php_sapi_name().
|
||||
|
||||
Note: The Apache web server changes the directory to root at
|
||||
startup causing PHP to attempt to read php.ini from the root
|
||||
@@ -1559,11 +1418,11 @@ The configuration file
|
||||
|
||||
The php.ini directives handled by extensions are documented
|
||||
respectively on the pages of the extensions themselves. The list of
|
||||
the core directives is available in the appendix. Probably not all PHP
|
||||
directives are documented in the manual though. For a complete list of
|
||||
directives available in your PHP version, please read your well
|
||||
commented php.ini file. Alternatively, you may find the the latest
|
||||
php.ini from CVS helpful too.
|
||||
the core directives is available in the appendix. Probably not all the
|
||||
PHP directives are documented in the manual though. For a completel
|
||||
list of directives available in your PHP version, please read your
|
||||
well commented php.ini file. Alternatively, you may find the the
|
||||
latest php.ini from CVS helpful too.
|
||||
|
||||
Example 6-1. php.ini example
|
||||
; any text on a line after an unquoted semicolon (;) is ignored
|
||||
@@ -1579,10 +1438,6 @@ include_path = ".:/usr/local/lib/php"
|
||||
|
||||
; backslashes are treated the same as any other character
|
||||
include_path = ".;c:\php\lib"
|
||||
|
||||
Since PHP 5.1.0, it is possible to refer to existing .ini variables
|
||||
from within .ini files. Example: open_basedir = ${open_basedir}
|
||||
":/new/dir".
|
||||
_________________________________________________________________
|
||||
|
||||
How to change configuration settings
|
||||
@@ -1678,420 +1533,3 @@ Other interfaces to PHP
|
||||
function, and review the resulting page. You can also access the
|
||||
values of individual configuration directives at runtime using
|
||||
ini_get() or get_cfg_var().
|
||||
_________________________________________________________________
|
||||
|
||||
Chapter 7. Installation FAQ
|
||||
|
||||
This section holds common questions about the way to install PHP. PHP
|
||||
is available for almost any OS (except maybe for MacOS before OSX),
|
||||
and almost any web server.
|
||||
|
||||
To install PHP, follow the instructions in the INSTALL file located in
|
||||
the distribution. Windows users should also read the install.txt file.
|
||||
There are also some helpful hints for Windows users here.
|
||||
|
||||
1. Why shouldn't I use Apache2 with a threaded MPM in a production
|
||||
environment?
|
||||
|
||||
2. Unix/Windows: Where should my php.ini file be located?
|
||||
3. Unix: I installed PHP, but every time I load a document, I get the
|
||||
message 'Document Contains No Data'! What's going on here?
|
||||
|
||||
4. Unix: I installed PHP using RPMS, but Apache isn't processing the
|
||||
PHP pages! What's going on here?
|
||||
|
||||
5. Unix: I installed PHP 3 using RPMS, but it doesn't compile with the
|
||||
database support I need! What's going on here?
|
||||
|
||||
6. Unix: I patched Apache with the FrontPage extensions patch, and
|
||||
suddenly PHP stopped working. Is PHP incompatible with the
|
||||
Apache FrontPage extensions?
|
||||
|
||||
7. Unix/Windows: I have installed PHP, but when I try to access a PHP
|
||||
script file via my browser, I get a blank screen.
|
||||
|
||||
8. Unix/Windows: I have installed PHP, but when try to access a PHP
|
||||
script file via my browser, I get a server 500 error.
|
||||
|
||||
9. Some operating systems: I have installed PHP without errors, but
|
||||
when I try to start apache I get undefined symbol errors:
|
||||
|
||||
[mybox:user /src/php4] root# apachectl configtest
|
||||
apachectl: /usr/local/apache/bin/httpd Undefined symbols:
|
||||
_compress
|
||||
_uncompress
|
||||
|
||||
10. Windows: I have installed PHP, but when I to access a PHP script
|
||||
file via my browser, I get the error:
|
||||
|
||||
cgi error:
|
||||
The specified CGI application misbehaved by not
|
||||
returning a complete set of HTTP headers.
|
||||
The headers it did return are:
|
||||
|
||||
11. Windows: I've followed all the instructions, but still can't get
|
||||
PHP and IIS to work together!
|
||||
|
||||
12. When running PHP as CGI with IIS, PWS, OmniHTTPD or Xitami, I get
|
||||
the following error: Security Alert! PHP CGI cannot be accessed
|
||||
directly..
|
||||
|
||||
13. How do I know if my php.ini is being found and read? It seems like
|
||||
it isn't as my changes aren't being implemented.
|
||||
|
||||
14. How do I add my PHP directory to the PATH on Windows?
|
||||
15. How do I make the php.ini file available to PHP on windows?
|
||||
16. Is it possible to use Apache content negotiation (MultiViews
|
||||
option) with PHP?
|
||||
|
||||
17. Is PHP limited to process GET and POST request methods only?
|
||||
|
||||
1. Why shouldn't I use Apache2 with a threaded MPM in a production
|
||||
environment?
|
||||
|
||||
PHP is glue. It is the glue used to build cool web applications by
|
||||
sticking dozens of 3rd-party libraries together and making it all
|
||||
appear as one coherent entity through an intuitive and easy to learn
|
||||
language interface. The flexibility and power of PHP relies on the
|
||||
stability and robustness of the underlying platform. It needs a
|
||||
working OS, a working web server and working 3rd-party libraries to
|
||||
glue together. When any of these stop working PHP needs ways to
|
||||
identify the problems and fix them quickly. When you make the
|
||||
underlying framework more complex by not having completely separate
|
||||
execution threads, completely separate memory segments and a strong
|
||||
sandbox for each request to play in, feet of clay are introduced into
|
||||
PHP's system.
|
||||
|
||||
If you feel you have to use a threaded MPM, look at a FastCGI
|
||||
configuration where PHP is running in its own memory space.
|
||||
|
||||
And finally, this warning against using a threaded MPM is not as
|
||||
strong for Windows systems because most libraries on that platform
|
||||
tend to be threadsafe.
|
||||
|
||||
2. Unix/Windows: Where should my php.ini file be located?
|
||||
|
||||
By default on Unix it should be in /usr/local/lib which is
|
||||
<install-path>/lib. Most people will want to change this at
|
||||
compile-time with the --with-config-file-path flag. You would, for
|
||||
example, set it with something like:
|
||||
--with-config-file-path=/etc
|
||||
|
||||
And then you would copy php.ini-dist from the distribution to
|
||||
/etc/php.ini and edit it to make any local changes you want.
|
||||
--with-config-file-scan-dir=PATH
|
||||
|
||||
On Windows the default path for the php.ini file is the Windows
|
||||
directory. If you're using the Apache webserver, php.ini is first
|
||||
searched in the Apaches install directory, e.g. c:\program
|
||||
files\apache group\apache. This way you can have different php.ini
|
||||
files for different versions of Apache on the same machine.
|
||||
|
||||
See also the chapter about the configuration file.
|
||||
|
||||
3. Unix: I installed PHP, but every time I load a document, I get the
|
||||
message 'Document Contains No Data'! What's going on here?
|
||||
|
||||
This probably means that PHP is having some sort of problem and is
|
||||
core-dumping. Look in your server error log to see if this is the
|
||||
case, and then try to reproduce the problem with a small test case. If
|
||||
you know how to use 'gdb', it is very helpful when you can provide a
|
||||
backtrace with your bug report to help the developers pinpoint the
|
||||
problem. If you are using PHP as an Apache module try something like:
|
||||
|
||||
* Stop your httpd processes
|
||||
* gdb httpd
|
||||
* Stop your httpd processes
|
||||
* > run -X -f /path/to/httpd.conf
|
||||
* Then fetch the URL causing the problem with your browser
|
||||
* > run -X -f /path/to/httpd.conf
|
||||
* If you are getting a core dump, gdb should inform you of this now
|
||||
* type: bt
|
||||
* You should include your backtrace in your bug report. This should
|
||||
be submitted to http://bugs.php.net/
|
||||
|
||||
If your script uses the regular expression functions (ereg() and
|
||||
friends), you should make sure that you compiled PHP and Apache with
|
||||
the same regular expression package. This should happen automatically
|
||||
with PHP and Apache 1.3.x
|
||||
|
||||
4. Unix: I installed PHP using RPMS, but Apache isn't processing the
|
||||
PHP pages! What's going on here?
|
||||
|
||||
Assuming you installed both Apache and PHP from RPM packages, you need
|
||||
to uncomment or add some or all of the following lines in your
|
||||
httpd.conf file:
|
||||
# Extra Modules
|
||||
AddModule mod_php.c
|
||||
AddModule mod_php3.c
|
||||
AddModule mod_perl.c
|
||||
|
||||
# Extra Modules
|
||||
LoadModule php_module modules/mod_php.so
|
||||
LoadModule php3_module modules/libphp3.so # for PHP 3
|
||||
LoadModule php4_module modules/libphp4.so # for PHP 4
|
||||
LoadModule perl_module modules/libperl.so
|
||||
|
||||
And add:
|
||||
AddType application/x-httpd-php3 .php3 # for PHP 3
|
||||
AddType application/x-httpd-php .php # for PHP 4
|
||||
|
||||
... to the global properties, or to the properties of the
|
||||
VirtualDomain you want to have PHP support added to.
|
||||
|
||||
5. Unix: I installed PHP 3 using RPMS, but it doesn't compile with the
|
||||
database support I need! What's going on here?
|
||||
|
||||
Due to the way PHP 3 built, it is not easy to build a complete
|
||||
flexible PHP RPM. This issue is addressed in PHP 4. For PHP 3, we
|
||||
currently suggest you use the mechanism described in the
|
||||
INSTALL.REDHAT file in the PHP distribution. If you insist on using an
|
||||
RPM version of PHP 3, read on...
|
||||
|
||||
The RPM packagers are setting up the RPMS to install without database
|
||||
support to simplify installations and because RPMS use /usr/ instead
|
||||
of the standard /usr/local/ directory for files. You need to tell the
|
||||
RPM spec file which databases to support and the location of the
|
||||
top-level of your database server.
|
||||
|
||||
This example will explain the process of adding support for the
|
||||
popular MySQL database server, using the mod installation for Apache.
|
||||
|
||||
Of course all of this information can be adjusted for any database
|
||||
server that PHP supports. We will assume you installed MySQL and
|
||||
Apache completely with RPMS for this example as well.
|
||||
|
||||
* First remove mod_php3 :
|
||||
|
||||
rpm -e mod_php3
|
||||
|
||||
* Then get the source rpm and INSTALL it, NOT --rebuild
|
||||
|
||||
rpm -Uvh mod_php3-3.0.5-2.src.rpm
|
||||
|
||||
* Then edit the /usr/src/redhat/SPECS/mod_php3.spec file
|
||||
In the %build section add the database support you want, and the
|
||||
path.
|
||||
For MySQL you would add --with-mysql=/usr The %build section will
|
||||
look something like this:
|
||||
|
||||
./configure --prefix=/usr \
|
||||
--with-apxs=/usr/sbin/apxs \
|
||||
--with-config-file-path=/usr/lib \
|
||||
--enable-debug=no \
|
||||
--enable-safe-mode \
|
||||
--with-exec-dir=/usr/bin \
|
||||
--with-mysql=/usr \
|
||||
--with-system-regex
|
||||
|
||||
* Once this modification is made then build the binary rpm as
|
||||
follows:
|
||||
|
||||
rpm -bb /usr/src/redhat/SPECS/mod_php3.spec
|
||||
|
||||
* Then install the rpm
|
||||
|
||||
rpm -ivh /usr/src/redhat/RPMS/i386/mod_php3-3.0.5-2.i386.rpm
|
||||
|
||||
Make sure you restart Apache, and you now have PHP 3 with MySQL
|
||||
support using RPM's. Note that it is probably much easier to just
|
||||
build from the distribution tarball of PHP 3 and follow the
|
||||
instructions in INSTALL.REDHAT found in that distribution.
|
||||
|
||||
6. Unix: I patched Apache with the FrontPage extensions patch, and
|
||||
suddenly PHP stopped working. Is PHP incompatible with the Apache
|
||||
FrontPage extensions?
|
||||
|
||||
No, PHP works fine with the FrontPage extensions. The problem is that
|
||||
the FrontPage patch modifies several Apache structures, that PHP
|
||||
relies on. Recompiling PHP (using 'make clean ; make') after the FP
|
||||
patch is applied would solve the problem.
|
||||
|
||||
7. Unix/Windows: I have installed PHP, but when I try to access a PHP
|
||||
script file via my browser, I get a blank screen.
|
||||
|
||||
Do a 'view source' in the web browser and you will probably find that
|
||||
you can see the source code of your PHP script. This means that the
|
||||
web server did not send the script to PHP for interpretation.
|
||||
Something is wrong with the server configuration - double check the
|
||||
server configuration against the PHP installation instructions.
|
||||
|
||||
8. Unix/Windows: I have installed PHP, but when try to access a PHP
|
||||
script file via my browser, I get a server 500 error.
|
||||
|
||||
Something went wrong when the server tried to run PHP. To get to see a
|
||||
sensible error message, from the command line, change to the directory
|
||||
containing the PHP executable (php.exe on Windows) and run php -i. If
|
||||
PHP has any problems running, then a suitable error message will be
|
||||
displayed which will give you a clue as to what needs to be done next.
|
||||
If you get a screen full of HTML codes (the output of the phpinfo()
|
||||
function) then PHP is working, and your problem may be related to your
|
||||
server configuration which you should double check.
|
||||
|
||||
9. Some operating systems: I have installed PHP without errors, but
|
||||
when I try to start apache I get undefined symbol errors:
|
||||
[mybox:user /src/php4] root# apachectl configtest
|
||||
apachectl: /usr/local/apache/bin/httpd Undefined symbols:
|
||||
_compress
|
||||
_uncompress
|
||||
|
||||
This has actually nothing to do with PHP, but with the MySQL client
|
||||
libraries. Some need --with-zlib, others do not. This is also covered
|
||||
in the MySQL FAQ.
|
||||
|
||||
10. Windows: I have installed PHP, but when I to access a PHP script
|
||||
file via my browser, I get the error:
|
||||
cgi error:
|
||||
The specified CGI application misbehaved by not
|
||||
returning a complete set of HTTP headers.
|
||||
The headers it did return are:
|
||||
|
||||
This error message means that PHP failed to output anything at all. To
|
||||
get to see a sensible error message, from the command line, change to
|
||||
the directory containing the PHP executable (php.exe on Windows) and
|
||||
run php -i. If PHP has any problems running, then a suitable error
|
||||
message will be displayed which will give you a clue as to what needs
|
||||
to be done next. If you get a screen full of HTML codes (the output of
|
||||
the phpinfo() function) then PHP is working.
|
||||
|
||||
Once PHP is working at the command line, try accessing the script via
|
||||
the browser again. If it still fails then it could be one of the
|
||||
following:
|
||||
|
||||
* File permissions on your PHP script, php.exe, php4ts.dll, php.ini
|
||||
or any PHP extensions you are trying to load are such that the
|
||||
anonymous internet user ISUR_<machinename> cannot access them.
|
||||
* The script file does not exist (or possibly isn't where you think
|
||||
it is relative to your web root directory). Note that for IIS you
|
||||
can trap this error by ticking the 'check file exists' box when
|
||||
setting up the script mappings in the Internet Services Manager.
|
||||
If a script file does not exist then the server will return a 404
|
||||
error instead. There is also the additional benefit that IIS will
|
||||
do any authentication required for you based on the NTLanMan
|
||||
permissions on your script file.
|
||||
|
||||
11. Windows: I've followed all the instructions, but still can't get
|
||||
PHP and IIS to work together!
|
||||
|
||||
Make sure any user who needs to run a PHP script has the rights to run
|
||||
php.exe! IIS uses an anonymous user which is added at the time IIS is
|
||||
installed. This user needs rights to php.exe. Also, any authenticated
|
||||
user will also need rights to execute php.exe. And for IIS4 you need
|
||||
to tell it that PHP is a script engine. Also, you will want to read
|
||||
this faq.
|
||||
|
||||
12. When running PHP as CGI with IIS, PWS, OmniHTTPD or Xitami, I get
|
||||
the following error: Security Alert! PHP CGI cannot be accessed
|
||||
directly..
|
||||
|
||||
You must set the cgi.force_redirect directive to 0. It defaults to 1
|
||||
so be sure the directive isn't commented out (with a ;). Like all
|
||||
directives, this is set in php.ini
|
||||
|
||||
Because the default is 1, it's critical that you're 100% sure that the
|
||||
correct php.ini file is being read. Read this faq for details.
|
||||
|
||||
13. How do I know if my php.ini is being found and read? It seems like
|
||||
it isn't as my changes aren't being implemented.
|
||||
|
||||
To be sure your php.ini is being read by PHP, make a call to phpinfo()
|
||||
and near the top will be a listing called Configuration File
|
||||
(php.ini). This will tell you where PHP is looking for php.ini and
|
||||
whether or not it's being read. If just a directory PATH exists than
|
||||
it's not being read and you should put your php.ini in that directory.
|
||||
If php.ini is included within the PATH than it is being read.
|
||||
|
||||
If php.ini is being read and you're running PHP as a module, then be
|
||||
sure to restart your web server after making changes to php.ini
|
||||
|
||||
14. How do I add my PHP directory to the PATH on Windows?
|
||||
|
||||
On Windows NT, 2000, XP and 2003:
|
||||
|
||||
* Go to Control Panel and open the System icon (Start -> Settings ->
|
||||
Control Panel -> System, or just Start -> Control Panel -> System
|
||||
for Windows XP/2003)
|
||||
* Go to the Advanced tab
|
||||
* Click on the 'Environment Variables' button
|
||||
* Look into the 'System Variables' pane
|
||||
* Find the Path entry (you may need to scroll to find it)
|
||||
* Double click on the Path entry
|
||||
* Enter your PHP directory ant the end, including ';' before (e.g.
|
||||
;C:\php)
|
||||
* Press OK and restart your computer
|
||||
|
||||
On Windows 98/Me you need to edit the autoexec.bat file:
|
||||
|
||||
* Open the Notepad (Start -> Run and enter notepad)
|
||||
* Open the C:\autoexec.bat file
|
||||
* Locate the line with PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;..... and
|
||||
add: ;C:\php to the end of the line
|
||||
* Save the file and restart your computer
|
||||
|
||||
Note: Be sure to reboot after following the steps above to ensure
|
||||
that the PATH changes are applied.
|
||||
|
||||
The PHP manual used to promote the copying of files into the Windows
|
||||
system directory, this is because this directory (C:\Windows,
|
||||
C:\WINNT, etc.) is by default in the systems PATH. Copying files into
|
||||
the Windows system directory has long since been deprecated and may
|
||||
cause problems.
|
||||
|
||||
15. How do I make the php.ini file available to PHP on windows?
|
||||
|
||||
There are several ways of doing this. If you are using Apache, read
|
||||
their installation specific instructions (Apache 1, Apache 2),
|
||||
otherwise you must set the PHPRC environment variable:
|
||||
|
||||
On Windows NT, 2000, XP and 2003:
|
||||
|
||||
* Go to Control Panel and open the System icon (Start -> Settings ->
|
||||
Control Panel -> System, or just Start -> Control Panel -> System
|
||||
for Windows XP/2003)
|
||||
* Go to the Advanced tab
|
||||
* Click on the 'Environment Variables' button
|
||||
* Look into the 'System variables' pane
|
||||
* Click on 'New' and enter 'PHPRC' as the variable name and the
|
||||
directory where php.ini is located as the variable value (e.g.
|
||||
C:\php)
|
||||
* Press OK and restart your computer
|
||||
|
||||
On Windows 98/Me you need to edit the autoexec.bat file:
|
||||
|
||||
* Open the Notepad (Start -> Run and enter notepad)
|
||||
* Open the C:\autoexec.bat file
|
||||
* Add a new line to the end of the file: set PHPRC=C:\php (replace
|
||||
C:\php with the directory where php.ini is located). Please note
|
||||
that the path cannot contain spaces. For instance, if you have
|
||||
installed PHP in C:\Program Files\PHP, you would enter
|
||||
C:\PROGRA~1\PHP instead.
|
||||
* Save the file and restart your computer
|
||||
|
||||
16. Is it possible to use Apache content negotiation (MultiViews
|
||||
option) with PHP?
|
||||
|
||||
If links to PHP files include extension, everything works perfect.
|
||||
This FAQ is only for the case when links to PHP files don't include
|
||||
extension and you want to use content negotiation to choose PHP files
|
||||
from URL with no extension. In this case, replace the line AddType
|
||||
application/x-httpd-php .php with:
|
||||
# PHP 4
|
||||
AddHandler php-script php
|
||||
AddType text/html php
|
||||
|
||||
# PHP 5
|
||||
AddHandler php5-script php
|
||||
AddType text/html php
|
||||
|
||||
This solution doesn't work for Apache 1 as PHP module doesn't catch
|
||||
php-script.
|
||||
|
||||
17. Is PHP limited to process GET and POST request methods only?
|
||||
|
||||
No, it is possible to handle any request method, e.g. CONNECT. Proper
|
||||
response status can be sent with header(). If only GET and POST
|
||||
methods should be handled, it can be achieved with this Apache
|
||||
configuration:
|
||||
<LimitExcept GET POST>
|
||||
Deny from all
|
||||
</LimitExcept>
|
||||
@@ -1,6 +1,6 @@
|
||||
--------------------------------------------------------------------
|
||||
The PHP License, version 3.01
|
||||
Copyright (c) 1999 - 2006 The PHP Group. All rights reserved.
|
||||
The PHP License, Version 3.0
|
||||
Copyright (c) 1999 - 2005 The PHP Group. All rights reserved.
|
||||
--------------------------------------------------------------------
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -38,8 +38,8 @@ are met:
|
||||
|
||||
6. Redistributions of any form whatsoever must retain the following
|
||||
acknowledgment:
|
||||
"This product includes PHP software, freely available from
|
||||
<http://www.php.net/software/>".
|
||||
"This product includes PHP, freely available from
|
||||
<http://www.php.net/>".
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND
|
||||
ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
@@ -64,5 +64,5 @@ The PHP Group can be contacted via Email at group@php.net.
|
||||
For more information on the PHP Group and the PHP project,
|
||||
please see <http://www.php.net>.
|
||||
|
||||
PHP includes the Zend Engine, freely available at
|
||||
This product includes the Zend Engine, freely available at
|
||||
<http://www.zend.com>.
|
||||
@@ -1,70 +0,0 @@
|
||||
|
||||
#
|
||||
# LCOV
|
||||
#
|
||||
|
||||
lcov: lcov-html
|
||||
|
||||
lcov-test: all
|
||||
@echo "Running test suite"
|
||||
@find . -name \*.gcda -o -name \*.da -o -name \*.bbg? | xargs rm -f
|
||||
-@if test ! -z "$(PHP_EXECUTABLE)" && test -x "$(PHP_EXECUTABLE)"; then \
|
||||
NO_INTERACTION=1 \
|
||||
TEST_PHP_EXECUTABLE=$(PHP_EXECUTABLE) \
|
||||
TEST_PHP_SRCDIR=$(top_srcdir) \
|
||||
CC="$(CC)" \
|
||||
$(PHP_EXECUTABLE) -d 'open_basedir=' -d 'safe_mode=0' -d 'output_buffering=0' -d 'memory_limit=-1' $(top_srcdir)/run-tests.php -d 'extension_dir=modules/' -d `( . $(PHP_MODULES) ; echo extension=$$dlname)` tests/; \
|
||||
elif test ! -z "$(SAPI_CLI_PATH)" && test -x "$(SAPI_CLI_PATH)"; then \
|
||||
NO_INTERACTION=1 \
|
||||
TEST_PHP_EXECUTABLE=$(top_builddir)/$(SAPI_CLI_PATH) \
|
||||
TEST_PHP_SRCDIR=$(top_srcdir) \
|
||||
CC="$(CC)" \
|
||||
$(top_builddir)/$(SAPI_CLI_PATH) -d 'open_basedir=' -d 'safe_mode=0' -d 'output_buffering=0' -d 'memory_limit=-1' $(top_srcdir)/run-tests.php $(TESTS); \
|
||||
else \
|
||||
echo "ERROR: Cannot run tests without CLI sapi."; \
|
||||
fi
|
||||
|
||||
php_lcov.info: lcov-test
|
||||
@echo "Generating data for $@"
|
||||
@rm -rf lcov_data/
|
||||
@$(mkinstalldirs) lcov_data/
|
||||
@echo
|
||||
-@find . -name \*.gcda -o -name \*.gcno -o -name \*.da | sed -e 's/^\.\///' | sed -e 's/\.gcda//g' -e 's/\.gcno//g' -e 's/\.da//g' | uniq | while read x; do \
|
||||
echo -n . ;\
|
||||
y=`echo $$x | sed -e 's!\.libs/!!'`; \
|
||||
dir=lcov_data/`dirname $$x`; \
|
||||
test -d "$$dir" || $(mkinstalldirs) "$$dir"; \
|
||||
if test -f "$(top_srcdir)/$$y.c"; then \
|
||||
ln -f -s $(top_srcdir)/$$y.c lcov_data/$$y.c; \
|
||||
fi; \
|
||||
if test -f "$(top_srcdir)/$$y.re"; then \
|
||||
ln -f -s $(top_srcdir)/$$y.re lcov_data/$$y.re; \
|
||||
fi; \
|
||||
if test -f "$(top_srcdir)/$$y.y"; then \
|
||||
ln -f -s $(top_srcdir)/$$y.y lcov_data/$$y.y; \
|
||||
fi; \
|
||||
if test -f "$(top_srcdir)/$$y.l"; then \
|
||||
ln -f -s $(top_srcdir)/$$y.l lcov_data/$$y.l; \
|
||||
fi; \
|
||||
if test -f "$(top_builddir)/$$y.c"; then \
|
||||
ln -f -s $(top_builddir)/$$y.c lcov_data/$$y.c; \
|
||||
fi; \
|
||||
test -f "$$x.gcno" && cp $$x.gcno lcov_data/$$y.gcno ; \
|
||||
test -f "$$x.gcda" && cp $$x.gcda lcov_data/$$y.gcda ; \
|
||||
test -f "$$x.da" && cp $$x.da lcov_data/$$y.da ; \
|
||||
test -f "$$x.bb" && cp $$x.bb lcov_data/$$y.bb ; \
|
||||
test -f "$$x.bbg" && cp $$x.bbg lcov_data/$$y.bbg ; \
|
||||
done
|
||||
@echo
|
||||
@echo "Generating $@"
|
||||
@$(LTP) --directory lcov_data/ --capture --base-directory=lcov_data --output-file $@
|
||||
|
||||
lcov-html: php_lcov.info
|
||||
@echo "Generating lcov HTML"
|
||||
@$(LTP_GENHTML) --legend --output-directory lcov_html/ --title "PHP Code Coverage" --show-details php_lcov.info
|
||||
|
||||
lcov-clean:
|
||||
rm -f php_lcov.info
|
||||
rm -rf lcov_data/
|
||||
rm -rf lcov_html/
|
||||
|
||||
+6
-28
@@ -5,6 +5,9 @@ INSTALL_DATA = $(INSTALL) -m 644
|
||||
DEFS = -DPHP_ATOM_INC -I$(top_builddir)/include -I$(top_builddir)/main -I$(top_srcdir)
|
||||
COMMON_FLAGS = $(DEFS) $(INCLUDES) $(EXTRA_INCLUDES) $(CPPFLAGS) $(PHP_FRAMEWORKPATH)
|
||||
|
||||
CORE_HEADERS = Zend/ TSRM/ include/ main/ main/streams/ regex/ ext/standard/
|
||||
INSTALL_HEADERS = $(CORE_HEADERS) $(INSTALL_EXT_HEADERS)
|
||||
|
||||
all: $(all_targets)
|
||||
@echo
|
||||
@echo "Build complete."
|
||||
@@ -25,10 +28,10 @@ install: $(all_targets) $(install_targets)
|
||||
install-sapi: $(OVERALL_TARGET)
|
||||
@echo "Installing PHP SAPI module: $(PHP_SAPI)"
|
||||
-@$(mkinstalldirs) $(INSTALL_ROOT)$(bindir)
|
||||
-@if test ! -r $(phptempdir)/libphp5.$(SHLIB_DL_SUFFIX_NAME); then \
|
||||
-@if test ! -r $(phptempdir)/libphp5.$(SHLIB_SUFFIX_NAME); then \
|
||||
for i in 0.0.0 0.0 0; do \
|
||||
if test -r $(phptempdir)/libphp5.$(SHLIB_DL_SUFFIX_NAME).$$i; then \
|
||||
$(LN_S) $(phptempdir)/libphp5.$(SHLIB_DL_SUFFIX_NAME).$$i $(phptempdir)/libphp5.$(SHLIB_DL_SUFFIX_NAME); \
|
||||
if test -r $(phptempdir)/libphp5.$(SHLIB_SUFFIX_NAME).$$i; then \
|
||||
$(LN_S) $(phptempdir)/libphp5.$(SHLIB_SUFFIX_NAME).$$i $(phptempdir)/libphp5.$(SHLIB_SUFFIX_NAME); \
|
||||
break; \
|
||||
fi; \
|
||||
done; \
|
||||
@@ -42,31 +45,6 @@ install-modules: build-modules
|
||||
@rm -f modules/*.la >/dev/null 2>&1
|
||||
@$(INSTALL) modules/* $(INSTALL_ROOT)$(EXTENSION_DIR)
|
||||
|
||||
install-headers:
|
||||
-@if test "$(INSTALL_HEADERS)"; then \
|
||||
for i in `echo $(INSTALL_HEADERS)`; do \
|
||||
i=`$(top_srcdir)/build/shtool path -d $$i`; \
|
||||
paths="$$paths $(INSTALL_ROOT)$(phpincludedir)/$$i"; \
|
||||
done; \
|
||||
$(mkinstalldirs) $$paths && \
|
||||
echo "Installing header files: $(INSTALL_ROOT)$(phpincludedir)/" && \
|
||||
for i in `echo $(INSTALL_HEADERS)`; do \
|
||||
if test "$(PHP_PECL_EXTENSION)"; then \
|
||||
src=`echo $$i | $(SED) -e "s#ext/$(PHP_PECL_EXTENSION)/##g"`; \
|
||||
else \
|
||||
src=$$i; \
|
||||
fi; \
|
||||
if test -f "$(top_srcdir)/$$src"; then \
|
||||
$(INSTALL_DATA) $(top_srcdir)/$$src $(INSTALL_ROOT)$(phpincludedir)/$$i; \
|
||||
elif test -f "$(top_builddir)/$$src"; then \
|
||||
$(INSTALL_DATA) $(top_builddir)/$$src $(INSTALL_ROOT)$(phpincludedir)/$$i; \
|
||||
else \
|
||||
(cd $(top_srcdir)/$$src && $(INSTALL_DATA) *.h $(INSTALL_ROOT)$(phpincludedir)/$$i; \
|
||||
cd $(top_builddir)/$$src && $(INSTALL_DATA) *.h $(INSTALL_ROOT)$(phpincludedir)/$$i) 2>/dev/null || true; \
|
||||
fi \
|
||||
done; \
|
||||
fi
|
||||
|
||||
install-su: install-pear
|
||||
|
||||
test: all
|
||||
|
||||
+3
-3
@@ -31,11 +31,11 @@ Having said that, here are the organizational rules:
|
||||
6. Test your changes before committing them. We mean it. Really.
|
||||
|
||||
Currently we have the following branches in use:
|
||||
HEAD Will become PHP 6.0. This CVS branch is for active development.
|
||||
PHP_5_1 Is used to release the PHP 5.1.x series. Only minor feature
|
||||
HEAD Will become PHP 5.1. This CVS branch is for active development.
|
||||
PHP_5_0 Is used to release the PHP 5.0.x series. Only minor feature
|
||||
enhancements may go in here, but please keep that as infrequent as
|
||||
possible.
|
||||
PHP_4_4 Is used to release the PHP 4.4.x series. Only bugfixes are permitted
|
||||
PHP_4_3 Is used to release the PHP 4.3.x series. Only bugfixes are permitted
|
||||
on this branch.
|
||||
|
||||
The next few rules are more of a technical nature.
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ ZEND_END_MODULE_GLOBALS(my_input_filter)
|
||||
|
||||
ZEND_DECLARE_MODULE_GLOBALS(my_input_filter)
|
||||
|
||||
zend_function_entry my_input_filter_functions[] = {
|
||||
function_entry my_input_filter_functions[] = {
|
||||
PHP_FE(my_get_raw, NULL)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 1999-2006, Andi Gutmans, Sascha Schumann, Zeev Suraski.
|
||||
Copyright (c) 1999, 2000, Andi Gutmans, Sascha Schumann, Zeev Suraski.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
||||
+1
-47
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Thread Safe Resource Manager |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1999-2006, Andi Gutmans, Sascha Schumann, Zeev Suraski |
|
||||
| Copyright (c) 1999, 2000, Andi Gutmans, Sascha Schumann, Zeev Suraski|
|
||||
| This source file is subject to the TSRM license, that is bundled |
|
||||
| with this package in the file LICENSE |
|
||||
+----------------------------------------------------------------------+
|
||||
@@ -480,52 +480,6 @@ void ts_free_thread(void)
|
||||
}
|
||||
|
||||
|
||||
/* frees all resources allocated for all threads except current */
|
||||
void ts_free_worker_threads(void)
|
||||
{
|
||||
tsrm_tls_entry *thread_resources;
|
||||
int i;
|
||||
THREAD_T thread_id = tsrm_thread_id();
|
||||
int hash_value;
|
||||
tsrm_tls_entry *last=NULL;
|
||||
|
||||
tsrm_mutex_lock(tsmm_mutex);
|
||||
hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size);
|
||||
thread_resources = tsrm_tls_table[hash_value];
|
||||
|
||||
while (thread_resources) {
|
||||
if (thread_resources->thread_id != thread_id) {
|
||||
for (i=0; i<thread_resources->count; i++) {
|
||||
if (resource_types_table[i].dtor) {
|
||||
resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage);
|
||||
}
|
||||
}
|
||||
for (i=0; i<thread_resources->count; i++) {
|
||||
free(thread_resources->storage[i]);
|
||||
}
|
||||
free(thread_resources->storage);
|
||||
if (last) {
|
||||
last->next = thread_resources->next;
|
||||
} else {
|
||||
tsrm_tls_table[hash_value] = thread_resources->next;
|
||||
}
|
||||
free(thread_resources);
|
||||
if (last) {
|
||||
thread_resources = last->next;
|
||||
} else {
|
||||
thread_resources = tsrm_tls_table[hash_value];
|
||||
}
|
||||
} else {
|
||||
if (thread_resources->next) {
|
||||
last = thread_resources;
|
||||
}
|
||||
thread_resources = thread_resources->next;
|
||||
}
|
||||
}
|
||||
tsrm_mutex_unlock(tsmm_mutex);
|
||||
}
|
||||
|
||||
|
||||
/* deallocates all occurrences of a given id */
|
||||
void ts_free_id(ts_rsrc_id id)
|
||||
{
|
||||
|
||||
+1
-4
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Thread Safe Resource Manager |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1999-2006, Andi Gutmans, Sascha Schumann, Zeev Suraski |
|
||||
| Copyright (c) 1999, 2000, Andi Gutmans, Sascha Schumann, Zeev Suraski|
|
||||
| This source file is subject to the TSRM license, that is bundled |
|
||||
| with this package in the file LICENSE |
|
||||
+----------------------------------------------------------------------+
|
||||
@@ -106,9 +106,6 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id);
|
||||
/* frees all resources allocated for the current thread */
|
||||
TSRM_API void ts_free_thread(void);
|
||||
|
||||
/* frees all resources allocated for all threads except current */
|
||||
void ts_free_worker_threads(void);
|
||||
|
||||
/* deallocates all occurrences of a given id */
|
||||
TSRM_API void ts_free_id(ts_rsrc_id id);
|
||||
|
||||
|
||||
@@ -42,8 +42,6 @@ char *alloca ();
|
||||
#ifndef MAXPATHLEN
|
||||
# ifdef PATH_MAX
|
||||
# define MAXPATHLEN PATH_MAX
|
||||
# elif defined(MAX_PATH)
|
||||
# define MAXPATHLEN MAX_PATH
|
||||
# else
|
||||
# define MAXPATHLEN 256
|
||||
# endif
|
||||
|
||||
+3
-3
@@ -2,12 +2,12 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) 1997-2005 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| http://www.php.net/license/3_0.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
|
||||
+3
-3
@@ -2,12 +2,12 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) 1997-2005 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| http://www.php.net/license/3_0.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
|
||||
+27
-47
@@ -2,12 +2,12 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) 1997-2005 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| http://www.php.net/license/3_0.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
@@ -163,15 +163,18 @@ static int php_is_file_ok(const cwd_state *state)
|
||||
static void cwd_globals_ctor(virtual_cwd_globals *cwd_globals TSRMLS_DC)
|
||||
{
|
||||
CWD_STATE_COPY(&cwd_globals->cwd, &main_cwd_state);
|
||||
#ifdef REALPATH_CACHE
|
||||
cwd_globals->realpath_cache_size = 0;
|
||||
cwd_globals->realpath_cache_size_limit = REALPATH_CACHE_SIZE;
|
||||
cwd_globals->realpath_cache_ttl = REALPATH_CACHE_TTL;
|
||||
memset(cwd_globals->realpath_cache, 0, sizeof(cwd_globals->realpath_cache));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC)
|
||||
{
|
||||
CWD_STATE_FREE(&cwd_globals->cwd);
|
||||
#ifdef REALPATH_CACHE
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -184,6 +187,7 @@ static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static char *tsrm_strndup(const char *s, size_t length)
|
||||
@@ -304,6 +308,7 @@ CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC)
|
||||
return buf;
|
||||
}
|
||||
|
||||
#ifdef REALPATH_CACHE
|
||||
static inline unsigned long realpath_cache_key(const char *path, int path_len)
|
||||
{
|
||||
register unsigned long h;
|
||||
@@ -347,18 +352,19 @@ static inline realpath_cache_bucket* realpath_cache_find(const char *path, int p
|
||||
while (*bucket != NULL) {
|
||||
if (CWDG(realpath_cache_ttl) && (*bucket)->expires < t) {
|
||||
realpath_cache_bucket *r = *bucket;
|
||||
*bucket = (*bucket)->next;
|
||||
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1;
|
||||
free(r);
|
||||
*bucket = (*bucket)->next;
|
||||
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1;
|
||||
free(r);
|
||||
} else if (key == (*bucket)->key && path_len == (*bucket)->path_len &&
|
||||
memcmp(path, (*bucket)->path, path_len) == 0) {
|
||||
return *bucket;
|
||||
} else {
|
||||
bucket = &(*bucket)->next;
|
||||
*bucket = (*bucket)->next;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Resolve path relatively to state and put the real path into state */
|
||||
@@ -379,17 +385,20 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
|
||||
#else
|
||||
char *new_path;
|
||||
#endif
|
||||
#ifdef REALPATH_CACHE
|
||||
char orig_path[MAXPATHLEN];
|
||||
int orig_path_len = 0;
|
||||
int orig_path_len;
|
||||
realpath_cache_bucket *bucket;
|
||||
time_t t = 0;
|
||||
time_t t;
|
||||
TSRMLS_FETCH();
|
||||
#endif
|
||||
|
||||
if (path_length == 0)
|
||||
return (0);
|
||||
if (path_length >= MAXPATHLEN)
|
||||
return (1);
|
||||
|
||||
#ifdef REALPATH_CACHE
|
||||
if (use_realpath && CWDG(realpath_cache_size_limit)) {
|
||||
if (IS_ABSOLUTE_PATH(path, path_length) || (state->cwd_length < 1)) {
|
||||
memcpy(orig_path, path, path_length+1);
|
||||
@@ -421,6 +430,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if !defined(TSRM_WIN32) && !defined(NETWARE)
|
||||
/* cwd_length can be 0 when getcwd() fails.
|
||||
* This can happen under solaris when a dir does not have read permissions
|
||||
@@ -468,14 +478,13 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
|
||||
#endif
|
||||
#if defined(TSRM_WIN32)
|
||||
{
|
||||
char *dummy = NULL;
|
||||
int new_path_length;
|
||||
|
||||
new_path_length = GetLongPathName(path, NULL, 0);
|
||||
new_path_length = GetLongPathName(path, dummy, 0) + 1;
|
||||
if (new_path_length == 0) {
|
||||
goto php_failed_getlongpath;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* GetLongPathName already counts the \0 */
|
||||
new_path = (char *) malloc(new_path_length);
|
||||
if (!new_path) {
|
||||
return 1;
|
||||
@@ -486,7 +495,6 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
|
||||
path_length = new_path_length;
|
||||
} else {
|
||||
free(new_path);
|
||||
php_failed_getlongpath:
|
||||
new_path = NULL;
|
||||
}
|
||||
}
|
||||
@@ -599,9 +607,11 @@ php_failed_getlongpath:
|
||||
#endif
|
||||
free(free_path);
|
||||
|
||||
#ifdef REALPATH_CACHE
|
||||
if (use_realpath && CWDG(realpath_cache_size_limit)) {
|
||||
realpath_cache_add(orig_path, orig_path_len, state->cwd, state->cwd_length, t TSRMLS_CC);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (verify_path && verify_path(state)) {
|
||||
CWD_STATE_FREE(state);
|
||||
@@ -765,7 +775,7 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC)
|
||||
}
|
||||
|
||||
#if !defined(TSRM_WIN32) && !defined(NETWARE)
|
||||
CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int link TSRMLS_DC)
|
||||
CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_DC)
|
||||
{
|
||||
cwd_state new_state;
|
||||
int ret;
|
||||
@@ -773,15 +783,7 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li
|
||||
CWD_STATE_COPY(&new_state, &CWDG(cwd));
|
||||
virtual_file_ex(&new_state, filename, NULL, 0);
|
||||
|
||||
if (link) {
|
||||
#if HAVE_LCHOWN
|
||||
ret = lchown(new_state.cwd, owner, group);
|
||||
#else
|
||||
ret = -1;
|
||||
#endif
|
||||
} else {
|
||||
ret = chown(new_state.cwd, owner, group);
|
||||
}
|
||||
ret = chown(new_state.cwd, owner, group);
|
||||
|
||||
CWD_STATE_FREE(&new_state);
|
||||
return ret;
|
||||
@@ -854,9 +856,7 @@ CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC)
|
||||
int retval;
|
||||
|
||||
CWD_STATE_COPY(&new_state, &CWDG(cwd));
|
||||
if (virtual_file_ex(&new_state, path, NULL, 1)) {
|
||||
return -1;
|
||||
}
|
||||
virtual_file_ex(&new_state, path, NULL, 1);
|
||||
|
||||
retval = stat(new_state.cwd, buf);
|
||||
|
||||
@@ -1043,26 +1043,6 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
|
||||
|
||||
#endif
|
||||
|
||||
/* On AIX & Tru64 when a file does not exist realpath() returns
|
||||
* NULL, and sets errno to ENOENT. Unlike in other libc implementations
|
||||
* the destination is not filled and remains undefined. Therefor, we
|
||||
* must populate it manually using strcpy as done on systems with no
|
||||
* realpath() function.
|
||||
*/
|
||||
#if defined(__osf__) || defined(_AIX)
|
||||
char *php_realpath_hack(char *src, char *dest)
|
||||
{
|
||||
char *ret;
|
||||
|
||||
if ((ret = realpath(src, dest)) == NULL && errno == ENOENT) {
|
||||
return strcpy(dest, src);
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
|
||||
+26
-12
@@ -2,12 +2,12 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) 1997-2005 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| http://www.php.net/license/3_0.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
@@ -166,8 +166,23 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* On AIX & Tru64 when a file does not exist realpath() returns
|
||||
* NULL, and sets errno to ENOENT. Unlike in other libc implementations
|
||||
* the destination is not filled and remains undefined. Therefor, we
|
||||
* must populate it manually using strcpy as done on systems with no
|
||||
* realpath() function.
|
||||
*/
|
||||
#if defined(__osf__) || defined(_AIX)
|
||||
char *php_realpath_hack(char *src, char *dest);
|
||||
static char *php_realpath_hack(char *src, char *dest)
|
||||
{
|
||||
char *ret;
|
||||
|
||||
if ((ret = realpath(src, dest)) == NULL && errno == ENOENT) {
|
||||
return strcpy(dest, src);
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAVE_UTIME
|
||||
@@ -175,14 +190,16 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC);
|
||||
#endif
|
||||
CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC);
|
||||
#if !defined(TSRM_WIN32) && !defined(NETWARE)
|
||||
CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int link TSRMLS_DC);
|
||||
CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_DC);
|
||||
#endif
|
||||
|
||||
CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath);
|
||||
|
||||
#define REALPATH_CACHE
|
||||
#define REALPATH_CACHE_TTL (2*60) /* 2 minutes */
|
||||
#define REALPATH_CACHE_SIZE 0 /* disabled while php.ini isn't loaded */
|
||||
|
||||
#ifdef REALPATH_CACHE
|
||||
typedef struct _realpath_cache_bucket {
|
||||
unsigned long key;
|
||||
char *path;
|
||||
@@ -192,13 +209,16 @@ typedef struct _realpath_cache_bucket {
|
||||
time_t expires;
|
||||
struct _realpath_cache_bucket *next;
|
||||
} realpath_cache_bucket;
|
||||
#endif
|
||||
|
||||
typedef struct _virtual_cwd_globals {
|
||||
cwd_state cwd;
|
||||
#ifdef REALPATH_CACHE
|
||||
long realpath_cache_size;
|
||||
long realpath_cache_size_limit;
|
||||
long realpath_cache_ttl;
|
||||
realpath_cache_bucket *realpath_cache[1024];
|
||||
#endif
|
||||
} virtual_cwd_globals;
|
||||
|
||||
#ifdef ZTS
|
||||
@@ -242,10 +262,7 @@ extern virtual_cwd_globals cwd_globals;
|
||||
#endif
|
||||
#define VCWD_CHMOD(path, mode) virtual_chmod(path, mode TSRMLS_CC)
|
||||
#if !defined(TSRM_WIN32) && !defined(NETWARE)
|
||||
#define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group, 0 TSRMLS_CC)
|
||||
#if HAVE_LCHOWN
|
||||
#define VCWD_LCHOWN(path, owner, group) virtual_chown(path, owner, group, 1 TSRMLS_CC)
|
||||
#endif
|
||||
#define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group TSRMLS_CC)
|
||||
#endif
|
||||
|
||||
#else
|
||||
@@ -288,9 +305,6 @@ extern virtual_cwd_globals cwd_globals;
|
||||
#define VCWD_CHMOD(path, mode) chmod(path, mode)
|
||||
#if !defined(TSRM_WIN32) && !defined(NETWARE)
|
||||
#define VCWD_CHOWN(path, owner, group) chown(path, owner, group)
|
||||
#if HAVE_LCHOWN
|
||||
#define VCWD_LCHOWN(path, owner, group) lchown(path, owner, group)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+3
-3
@@ -2,12 +2,12 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) 1997-2005 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| http://www.php.net/license/3_0.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
|
||||
+3
-3
@@ -2,12 +2,12 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) 1997-2005 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| This source file is subject to version 3.0 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| http://www.php.net/license/3_0.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
|
||||
@@ -1,548 +0,0 @@
|
||||
$Id$
|
||||
|
||||
UPGRADE NOTES - PHP 5.1
|
||||
|
||||
1. Changes in reference handling
|
||||
a. Overview
|
||||
b. Code that worked under PHP 4.3, but now fails
|
||||
c. Code that was valid under PHP 4.3, but now throws an error
|
||||
d. Code that failed under PHP 4.3, but now works
|
||||
e. Code that 'should have worked' under PHP 5.0
|
||||
f. Warnings that came and went
|
||||
2. Reading []
|
||||
3. instanceof, is_a(), is_subclass_of(), catch
|
||||
4. Integer values in function parameters
|
||||
5. Abstract private methods
|
||||
6. Access modifiers in interfaces
|
||||
7. Changes in inheritance rules
|
||||
8. Class constants
|
||||
9. Extensions
|
||||
a. Extensions that are gone from the PHP core
|
||||
b. Class constants in new PHP 5.1 extensions
|
||||
10. Date/time support
|
||||
11. Changes in database support
|
||||
a. PDO overview
|
||||
b. Changes in MySQL support
|
||||
c. Changes in SQLite support
|
||||
12. Further migration information
|
||||
13. Checking for E_STRICT errors
|
||||
|
||||
===============================================================================
|
||||
|
||||
1. Changes in reference handling
|
||||
================================
|
||||
|
||||
1a. Overview
|
||||
============
|
||||
|
||||
>From the PHP script writer's point of view, the change most likely to impact
|
||||
legacy code is in the way that references are handled in all PHP versions
|
||||
post-dating the PHP 4.4.0 release.
|
||||
|
||||
Until and including PHP 4.3, it was possible to send, assign or return variables
|
||||
by reference that should really be returned by value, such as a constant, a
|
||||
temporary value (e.g. the result of an expression), or the result of a function
|
||||
that had itself been returned by value, as here:
|
||||
|
||||
<?php
|
||||
|
||||
$foo = "123";
|
||||
|
||||
function return_value() {
|
||||
global $foo;
|
||||
return $foo;
|
||||
}
|
||||
|
||||
$bar = &return_value();
|
||||
|
||||
?>
|
||||
|
||||
Although this code would usually work as expected under PHP 4.3, in the general
|
||||
case the result is undefined. The Zend Engine could not act correctly on these
|
||||
values as references. This bug could and did lead to various hard-to-reproduce
|
||||
memory corruption problems, particularly where the code base was large.
|
||||
|
||||
In PHP 4.4.0, PHP 5.0.4 and all subsequent PHP releases, the Engine was fixed
|
||||
to 'know' when the reference operation is being used on a value that should
|
||||
not be referenced. The actual value is now used in such cases, and a warning
|
||||
is emitted. The warning takes the form of an E_NOTICE in PHP 4.4.0 and up,
|
||||
and E_STRICT in PHP 5.0.4 and up.
|
||||
|
||||
Code that could potentially produce memory corruption can no longer do so.
|
||||
However, some legacy code might work differently as a result.
|
||||
|
||||
1b. Code that worked under PHP 4.3, but now fails
|
||||
=================================================
|
||||
|
||||
<?php
|
||||
|
||||
function func(&$arraykey) {
|
||||
return $arraykey; // function returns by value!
|
||||
}
|
||||
|
||||
$array = array('a', 'b', 'c');
|
||||
foreach (array_keys($array) as $key) {
|
||||
$y = &func($array[$key]);
|
||||
$z[] =& $y;
|
||||
}
|
||||
|
||||
var_dump($z);
|
||||
|
||||
?>
|
||||
Running the above script under any version of PHP that pre-dates the reference
|
||||
fix would produce this output:
|
||||
|
||||
array(3) {
|
||||
[0]=>
|
||||
&string(1) "a"
|
||||
[1]=>
|
||||
&string(1) "b"
|
||||
[2]=>
|
||||
&string(1) "c"
|
||||
}
|
||||
|
||||
Following the reference fix, the same code would result in:
|
||||
|
||||
array(3) {
|
||||
[0]=>
|
||||
&string(1) "c"
|
||||
[1]=>
|
||||
&string(1) "c"
|
||||
[2]=>
|
||||
&string(1) "c"
|
||||
}
|
||||
|
||||
This is because, following the changes, func() assigns by value. The value
|
||||
of $y is re-assigned, and reference-binding is preserved from $z. Prior
|
||||
to the fix, the value was assigned by reference, leading $y to be
|
||||
re-bound on each assignment. The attempt to bind to a temporary value
|
||||
by reference was the cause of the memory corruption.
|
||||
|
||||
Such code can be made to work identically in both the pre-fix and the
|
||||
post-fix PHP versions. The signature of func() can be altered to return
|
||||
by reference, or the reference assignment can be removed from the result
|
||||
of func().
|
||||
|
||||
<?php
|
||||
|
||||
function func() {
|
||||
return 'function return';
|
||||
}
|
||||
|
||||
$x = 'original value';
|
||||
$y =& $x;
|
||||
$y = &func();
|
||||
echo $x;
|
||||
|
||||
?>
|
||||
|
||||
In PHP 4.3 $x would be 'original value', whereas after the changes it would
|
||||
be 'function return' - remember that where the function does not return by
|
||||
reference, the reference assignment is converted to a regular assignment.
|
||||
Again, this can be brought to a common base, either by forcing func() to
|
||||
return by reference or by eliminating the by-reference assignment.
|
||||
|
||||
1c. Code that was valid under PHP 4.3, but now throws an error
|
||||
==============================================================
|
||||
|
||||
<?php
|
||||
|
||||
class Foo {
|
||||
|
||||
function getThis() {
|
||||
return $this;
|
||||
}
|
||||
|
||||
function destroyThis() {
|
||||
$baz =& $this->getThis();
|
||||
}
|
||||
}
|
||||
|
||||
$bar = new Foo();
|
||||
$bar->destroyThis();
|
||||
var_dump($bar);
|
||||
|
||||
?>
|
||||
|
||||
In PHP 5.0.3, $bar evaluated to NULL instead of returning an object.
|
||||
That happened because getThis() returns by value, but the value here
|
||||
is assigned by reference. Although it now works in the expected way,
|
||||
this is actually invalid code which will throw an E_NOTICE under
|
||||
PHP 4.4 or an E_STRICT under PHP 5.0.4 and up.
|
||||
|
||||
1d. Code that failed under PHP 4.3, but now works
|
||||
=================================================
|
||||
|
||||
<?php
|
||||
|
||||
function &f() {
|
||||
$x = "foo";
|
||||
var_dump($x);
|
||||
print "$x\n";
|
||||
return($a);
|
||||
}
|
||||
|
||||
for ($i = 0; $i < 3; $i++) {
|
||||
$h = &f();
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
In PHP 4.3 the third call to var_dump produces NULL, due to the memory
|
||||
corruption caused by returning an uninitialized value by reference.
|
||||
This is valid code in PHP 5.0.4 and up, but threw errors in earlier
|
||||
releases of PHP.
|
||||
|
||||
<?php
|
||||
|
||||
$arr = array('a1' => array('alfa' => 'ok'));
|
||||
$arr =& $arr['a1'];
|
||||
echo '-'.$arr['alfa']."-\n";
|
||||
|
||||
?>
|
||||
|
||||
Until PHP 5.0.5, it wasn't possible to assign an array element by
|
||||
reference in this way. It now is.
|
||||
|
||||
1e. Code that 'should have worked' under PHP 5.0
|
||||
================================================
|
||||
|
||||
There are a couple of instances of bugs reported under PHP 5.0 prior
|
||||
to the reference fixes which now 'work'. However, in both cases errors
|
||||
are thrown by PHP 5.1, because the code was invalid in the first place.
|
||||
Returning values by reference using self:: now works in the general
|
||||
case but throws an E_STRICT warning, and although your mileage may
|
||||
vary when assigning by reference to an overloaded object, you will
|
||||
still see an E_ERROR when you try it, even where the assignment
|
||||
itself appears to work.
|
||||
|
||||
1f. Warnings that came and went
|
||||
===============================
|
||||
|
||||
<?php
|
||||
|
||||
function & foo() {
|
||||
$var = 'ok';
|
||||
return $var;
|
||||
}
|
||||
|
||||
function & bar() {
|
||||
return foo();
|
||||
}
|
||||
|
||||
$a =& bar();
|
||||
echo "$a\n";
|
||||
|
||||
?>
|
||||
|
||||
Nested calls to functions returning by reference are valid code under both
|
||||
PHP 4.3 and PHP 5.1, but threw an unwarranted E_NOTICE or E_STRICT under
|
||||
the intervening PHP releases.
|
||||
|
||||
2. Reading []
|
||||
=============
|
||||
|
||||
<?php
|
||||
|
||||
class XmlTest {
|
||||
|
||||
function test_ref(&$test) {
|
||||
$test = "ok";
|
||||
}
|
||||
|
||||
function test($test) { }
|
||||
|
||||
function run() {
|
||||
$ar = array();
|
||||
$this->test_ref($ar[]);
|
||||
var_dump($ar);
|
||||
$this->test($ar[]);
|
||||
}
|
||||
}
|
||||
|
||||
$o = new XmlTest();
|
||||
$o->run();
|
||||
|
||||
?>
|
||||
|
||||
This should always have thrown a fatal E_ERROR, because [] cannot be used
|
||||
for reading in PHP. It is invalid code in PHP 4.4.2 and PHP 5.0.5 upward.
|
||||
|
||||
3. instanceof, is_a(), is_subclass_of(), catch
|
||||
==============================================
|
||||
|
||||
In PHP 5.0, is_a() was deprecated and replaced by the "instanceof" operator.
|
||||
There were some issues with the initial implementation of "instanceof", which
|
||||
relied on __autoload() to search for missing classes. If the class was not
|
||||
present, "instanceof" would throw a fatal E_ERROR due to the failure of
|
||||
__autoload() to discover that class. The same behaviour occurred in the
|
||||
"catch" operator and the is_subclass_of() function, for the same reason.
|
||||
|
||||
None of these functions or operators call __autoload() in PHP 5.1, and
|
||||
the class_exists() workarounds used in code written for PHP 5.0, while
|
||||
not problematic in any way, are no longer necessary.
|
||||
|
||||
4. Integer values in function parameters
|
||||
========================================
|
||||
|
||||
With the advent of PHP 5.0, a new parameter parsing API was introduced
|
||||
which is used by a large number of PHP functions. In all versions of
|
||||
PHP between 5.0 and 5.1, the handling of integer values was very strict
|
||||
and would reject non-well formed numeric values when a PHP function
|
||||
expected an integer. These checks have now been relaxed to support
|
||||
non-well formed numeric strings such as " 123" and "123 ", and will
|
||||
no longer fail as they did under PHP 5.0. However, to promote code
|
||||
safety and input validation, PHP functions will now emit an E_NOTICE
|
||||
when such strings are passed as integers.
|
||||
|
||||
5. Abstract private methods
|
||||
===========================
|
||||
|
||||
Abstract private methods were supported between PHP 5.0.0 and PHP 5.0.4,
|
||||
but were then disallowed on the grounds that the behaviours of 'private'
|
||||
and 'abstract' are mutually exclusive.
|
||||
|
||||
6. Access modifiers in interfaces
|
||||
=================================
|
||||
|
||||
Under PHP 5.0, function declarations in interfaces were treated in exactly
|
||||
the same way as function declarations in classes. This has not been the case
|
||||
since October 2004, at which point only the 'public' access modifier was
|
||||
allowed in interface function declarations. Since April 2005 - which pre-dates
|
||||
the PHP 5.0b1 release - the 'static' modifier has also been allowed. However,
|
||||
the 'protected' and 'private' modifiers will now throw an E_ERROR, as will
|
||||
'abstract'. Note that this change should not affect your existing code, as
|
||||
none of these modifiers makes sense in the context of interfaces anyway.
|
||||
|
||||
7. Changes in inheritance rules
|
||||
===============================
|
||||
|
||||
Under PHP 5.0, it was possible to have a function declaration in a derived class
|
||||
that did not match the declaration of the same function in the base class, e.g.
|
||||
|
||||
class Base {
|
||||
function &return_by_ref() {
|
||||
$r = 1;
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
class Derived extends Base {
|
||||
function return_by_ref() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
This code will cause an E_STRICT error to be emitted under PHP 5.1.
|
||||
|
||||
8. Class constants
|
||||
==================
|
||||
|
||||
Under PHP 5.0, the following code was valid:
|
||||
|
||||
<?php
|
||||
|
||||
class test {
|
||||
const foobar = 'foo';
|
||||
const foobar = 'bar';
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
Under PHP 5.1, redefinition of a class constant will throw a fatal E_ERROR.
|
||||
|
||||
9. Extensions
|
||||
=============
|
||||
|
||||
9a. Extensions that are gone from the PHP core
|
||||
==============================================
|
||||
|
||||
One of the first things you're likely to notice when you download PHP 5.1 is that
|
||||
several of the older extensions have disappeared. Those extensions that are still
|
||||
actively maintained are available in the PHP Extension Community Library (PECL),
|
||||
at http://pecl.php.net. Windows binaries are built regularly, and you can obtain
|
||||
the binaries for PECL extensions built against PHP 5.1 from
|
||||
http://pecl4win.php.net/list.php/5_1.
|
||||
|
||||
Extension Alternative/status
|
||||
========= ========================
|
||||
ext/cpdf pecl/pdflib
|
||||
ext/dbx pecl/dbx
|
||||
ext/dio pecl/dio
|
||||
ext/fam not actively maintained
|
||||
ext/ingres_ii pecl/ingres
|
||||
ext/ircg not actively maintained
|
||||
ext/mcve pecl/mcve
|
||||
ext/mnogosearch not actively maintained
|
||||
ext/oracle ext/oci8 or ext/pdo_oci
|
||||
ext/ovrimos not actively maintained
|
||||
ext/pfpro not actively maintained
|
||||
- alternatives at http://pecl.php.net/packages.php?catpid=18&catname=Payment
|
||||
ext/w32api pecl/ffi
|
||||
ext/yp not actively maintained
|
||||
sapi/activescript http://pecl4win.php.net/ext.php/php5activescript.dll (PECL package)
|
||||
or pecl/activescript (CVS)
|
||||
|
||||
Modules in PECL that are not actively maintained (i.e. have not been supported
|
||||
for some time, have no active maintainer working on them currently, and do not
|
||||
have any PECL package releases), are still available in CVS at
|
||||
http://cvs.php.net/pecl/. However, unreleased PHP modules are by their nature
|
||||
unsupported, and your mileage may vary when attempting to install or use them.
|
||||
|
||||
9b. Class constants in new PHP 5.1 extensions
|
||||
=============================================
|
||||
|
||||
The Zend Engine 2.1 API allows extension developers to declare class constants
|
||||
in object oriented extensions. New extensions written for PHP 5.1, including SPL,
|
||||
PDO, ext/XMLReader and ext/date, have their constants in the format
|
||||
|
||||
PDO::CLASS_CONSTANT
|
||||
|
||||
rather than in the C format
|
||||
|
||||
PDO_CLASS_CONSTANT
|
||||
|
||||
in order to minimise pollution of the global namespace in PHP.
|
||||
|
||||
10. Date/time support
|
||||
====================
|
||||
|
||||
Date/time support has been fully rewritten in PHP 5.1, and no longer
|
||||
uses the system settings to 'know' the timezone in operation. It will
|
||||
instead utilize, in the following order:
|
||||
|
||||
* The timezone set using the date_default_timezone_set() function (if any)
|
||||
* The TZ environment variable (if non empty)
|
||||
* The date.timezone ini option (if set)
|
||||
* "magical" guess (if the operating system supports it)
|
||||
* If none of the above options succeeds, UTC
|
||||
|
||||
To ensure accuracy (and avoid an E_STRICT warning), you will need to define
|
||||
your timezone in your php.ini using the following format:
|
||||
|
||||
date.timezone = Europe/London
|
||||
|
||||
The supported timezones are listed, in this format, in the PHP manual at
|
||||
http://www.php.net/manual/en/timezones.php.
|
||||
|
||||
11. Changes in database support
|
||||
==============================
|
||||
|
||||
11a. PDO overview
|
||||
================
|
||||
|
||||
PHP Data Objects (PDO) were introduced as a PECL extension under PHP 5.0,
|
||||
and became part of the core PHP distribution in PHP 5.1. The PDO extension
|
||||
provides a consistent interface for database access, and is used alongside
|
||||
database-specific PDO drivers. Each driver may also have database-specific
|
||||
functions of its own, but basic data access functionality such as issuing
|
||||
queries and fetching data is covered by PDO functions, using the driver
|
||||
named in PDO::__construct().
|
||||
|
||||
Note that the PDO extension, and its drivers, are intended to be built as
|
||||
shared extensions. This will enable straightforward driver upgrades from
|
||||
PECL, without forcing you to rebuild all of PHP.
|
||||
|
||||
At the point of the PHP 5.1 release, PDO is more than ready for widespread
|
||||
testing and could be adopted in most situations. However, it is important
|
||||
to understand that PDO and its drivers are comparatively young and may be
|
||||
missing certain database-specific features; evaluate PDO carefully before
|
||||
you use it in new projects.
|
||||
|
||||
Legacy code will generally rely on the pre-existing database extensions,
|
||||
which are still maintained.
|
||||
|
||||
There is more in-depth information about the PDO extension in the manual
|
||||
at http://www.php.net/manual/ref.pdo.php.
|
||||
|
||||
11b. Changes in MySQL support
|
||||
============================
|
||||
|
||||
In PHP 4, MySQL 3 support was built-in. With the release of PHP 5.0 there
|
||||
were two MySQL extensions, named 'mysql' and 'mysqli', which were designed
|
||||
to support MySQL < 4.1 and MySQL 4.1 and up, respectively. With the
|
||||
introduction of PDO, which provides a very fast interface to all the
|
||||
database APIs supported by PHP, the PDO_MYSQL driver can support any
|
||||
of the current versions (MySQL 3, 4 or 5) in PHP code written for PDO,
|
||||
depending on the MySQL library version used during compilation. The
|
||||
older MySQL extensions remain in place for reasons of back compatibility,
|
||||
but are not enabled by default.
|
||||
|
||||
11c. Changes in SQLite support
|
||||
=============================
|
||||
|
||||
In PHP 5.0, SQLite 2 support was provided by the built-in sqlite
|
||||
extension, which was also available as a PECL extension in PHP 4.3
|
||||
and PHP 4.4. With the introduction of PDO, the sqlite extension doubles
|
||||
up to act as a 'sqlite2' driver for PDO; it is due to this that the
|
||||
sqlite extension in PHP 5.1 has a dependency upon the PDO extension.
|
||||
|
||||
PHP 5.1 ships with a number of alternative interfaces to sqlite:
|
||||
|
||||
The sqlite extension provides the "classic" sqlite procedural/OO API
|
||||
that you may have used in prior versions of PHP. It also provides the
|
||||
PDO 'sqlite2' driver, which allows you to access legacy SQLite 2
|
||||
databases using the PDO API.
|
||||
|
||||
PDO_SQLITE provides the 'sqlite' version 3 driver. SQLite version 3
|
||||
is vastly superior to SQLite version 2, but the file formats of the
|
||||
two versions are not compatible.
|
||||
|
||||
If your SQLite-based project is already written and working against
|
||||
earlier PHP versions, then you can continue to use ext/sqlite without
|
||||
problems, but will need to explicitly enable both PDO and sqlite. New
|
||||
projects should use PDO and the 'sqlite' (version 3) driver, as this is
|
||||
faster than SQLite 2, has improved locking concurrency, and supports
|
||||
both prepared statements and binary columns natively.
|
||||
|
||||
12. Further migration information
|
||||
================================
|
||||
|
||||
For general information about migrating from PHP 4 to PHP 5, please refer to
|
||||
the relevant section in the PHP manual at http://www.php.net/manual/migration5.php.
|
||||
|
||||
13. Checking for E_STRICT errors
|
||||
================================
|
||||
|
||||
If you only have a single script to check, you can pick up E_STRICT
|
||||
errors using PHP's commandline lint facility:
|
||||
|
||||
php -d error_reporting=4095 -l script_to_check.php
|
||||
|
||||
For larger projects, the shell script below will achieve the same task:
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
directory=$1
|
||||
|
||||
shift
|
||||
|
||||
# These extensions are checked
|
||||
extensions="php inc"
|
||||
|
||||
check_file ()
|
||||
{
|
||||
echo -ne "Doing PHP syntax check on $1 ..."
|
||||
|
||||
# Options:
|
||||
ERRORS=`/www/php/bin/php -d display_errors=1 -d html_errors=0 -d error_prepend_string=" " -d error_append_string=" " -d error_reporting=4095 -l $1 | grep -v "No syntax errors detected"`
|
||||
|
||||
if test -z "$ERRORS"; then
|
||||
echo -ne "OK."
|
||||
else
|
||||
echo -e "Errors found!\n$ERRORS"
|
||||
fi
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
# loop over remaining file args
|
||||
for FILE in "$@" ; do
|
||||
for ext in $extensions; do
|
||||
if echo $FILE | grep "\.$ext$" > /dev/null; then
|
||||
if test -f $FILE; then
|
||||
check_file "$FILE"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
--------------------------------------------------------------------
|
||||
The Zend Engine License, Version 2.00
|
||||
Copyright (c) 1999-2006 Zend Technologies Ltd. All rights reserved.
|
||||
Copyright (c) 1999-2005 Zend Technologies Ltd. All rights reserved.
|
||||
--------------------------------------------------------------------
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ libZend_la_SOURCES=\
|
||||
zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \
|
||||
zend_ini.c zend_qsort.c zend_objects.c zend_object_handlers.c \
|
||||
zend_objects_API.c zend_ts_hash.c zend_stream.c zend_mm.c \
|
||||
zend_default_classes.c \
|
||||
zend_default_classes.c zend_reflection_api.c \
|
||||
zend_iterators.c zend_interfaces.c zend_exceptions.c \
|
||||
zend_strtod.c zend_multibyte.c
|
||||
|
||||
|
||||
@@ -227,6 +227,10 @@ SOURCE=.\zend_qsort.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_reflection_api.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_sprintf.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@@ -403,6 +407,10 @@ SOURCE=.\zend_qsort.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_reflection_api.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_stack.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -260,6 +260,10 @@ SOURCE=.\zend_qsort.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_reflection_api.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_sprintf.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@@ -440,6 +444,10 @@ SOURCE=.\zend_qsort.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_reflection_api.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\zend_stack.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+3
-3
@@ -179,7 +179,7 @@ function fibo($n) {
|
||||
|
||||
/****/
|
||||
|
||||
function hash1($n) {
|
||||
function hash($n) {
|
||||
for ($i = 1; $i <= $n; $i++) {
|
||||
$X[dechex($i)] = $i;
|
||||
}
|
||||
@@ -401,8 +401,8 @@ ary3(2000);
|
||||
$t = end_test($t, "ary3(2000)");
|
||||
fibo(30);
|
||||
$t = end_test($t, "fibo(30)");
|
||||
hash1(50000);
|
||||
$t = end_test($t, "hash1(50000)");
|
||||
hash(50000);
|
||||
$t = end_test($t, "hash(50000)");
|
||||
hash2(500);
|
||||
$t = end_test($t, "hash2(500)");
|
||||
heapsort(20000);
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -8,7 +8,7 @@ class Test {
|
||||
function __copy()
|
||||
{
|
||||
$string = PHP_VERSION;
|
||||
$version = $string[0];
|
||||
$version = $string{0};
|
||||
if($string < 5)
|
||||
{
|
||||
return $this;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--TEST--
|
||||
Bug #26077 (Memory leaks when creating an instance of an object)
|
||||
Bug #26077 Memory leaks when creating an instance of an object
|
||||
--FILE--
|
||||
<?php
|
||||
class foo {} new foo();
|
||||
|
||||
@@ -3,7 +3,7 @@ Bug #26281 (switch() crash when condition is a string offset)
|
||||
--FILE--
|
||||
<?php
|
||||
$x = 'abc';
|
||||
switch ($x[0]) {
|
||||
switch ($x{0}) {
|
||||
case 'a':
|
||||
echo "no crash\n";
|
||||
break;
|
||||
|
||||
@@ -4,14 +4,14 @@ Bug #26801 (switch ($a{0}) crash)
|
||||
<?php
|
||||
|
||||
$a = '11';
|
||||
$b = $a[0];
|
||||
$b = $a{0};
|
||||
switch ($b) {
|
||||
case '-':
|
||||
break;
|
||||
}
|
||||
|
||||
$a = '22';
|
||||
switch ($a[0]) {
|
||||
switch ($a{0}) {
|
||||
case '-':
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ if (is_callable(array('test_class','test_func4'))) {
|
||||
$object = new foo();
|
||||
$object->test();
|
||||
?>
|
||||
--EXPECTF--
|
||||
--EXPECT--
|
||||
test_func1
|
||||
test_func2
|
||||
test_func3
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--TEST--
|
||||
Bug #30346 (arrayAccess and using $this)
|
||||
Bug 30346 (arrayAcces & using $this)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
@@ -21,4 +21,4 @@ echo "\n";
|
||||
===DONE===
|
||||
--EXPECT--
|
||||
page_show
|
||||
===DONE===
|
||||
===DONE===
|
||||
@@ -9,11 +9,11 @@ var_dump(isset($a->b));
|
||||
$a = '0';
|
||||
var_dump(isset($a->b));
|
||||
$a = '';
|
||||
var_dump(isset($a['b']));
|
||||
var_dump(isset($a{'b'}));
|
||||
$a = 'a';
|
||||
var_dump(isset($a['b']));
|
||||
var_dump(isset($a{'b'}));
|
||||
$a = '0';
|
||||
var_dump(isset($a['b']));
|
||||
var_dump(isset($a{'b'}));
|
||||
|
||||
$simpleString = "Bogus String Text";
|
||||
echo isset($simpleString->wrong)?"bug\n":"ok\n";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--TEST--
|
||||
Bug #31177 (memory corruption because of incorrect refcounting)
|
||||
Bug #31177 (menory corruption because of incorrect refcounting)
|
||||
--FILE--
|
||||
<?php
|
||||
class foo {
|
||||
|
||||
@@ -20,7 +20,7 @@ foreach ($a as $v) {
|
||||
--EXPECT--
|
||||
'$ \{ '
|
||||
' \{ $'
|
||||
' \{$ '
|
||||
' {$ '
|
||||
' $\{ '
|
||||
' $\{ '
|
||||
' \{$ '
|
||||
|
||||
@@ -7,31 +7,7 @@ class TestA
|
||||
{
|
||||
public function doSomething($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
return --$i;
|
||||
}
|
||||
|
||||
public function doSomethingThis($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
return --$i;
|
||||
}
|
||||
|
||||
public function doSomethingParent($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
return --$i;
|
||||
}
|
||||
|
||||
public function doSomethingParentThis($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
return --$i;
|
||||
}
|
||||
|
||||
public static function doSomethingStatic($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
echo __METHOD__ . "($this)\n";
|
||||
return --$i;
|
||||
}
|
||||
}
|
||||
@@ -40,87 +16,20 @@ class TestB extends TestA
|
||||
{
|
||||
public function doSomething($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
echo __METHOD__ . "($this)\n";
|
||||
$i++;
|
||||
if ($i >= 5) return 5;
|
||||
return call_user_func_array(array("TestA", "doSomething"), array($i));
|
||||
}
|
||||
|
||||
public function doSomethingThis($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
$i++;
|
||||
if ($i >= 5) return 5;
|
||||
return call_user_func_array(array($this, "TestA::doSomethingThis"), array($i));
|
||||
}
|
||||
|
||||
public function doSomethingParent($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
$i++;
|
||||
if ($i >= 5) return 5;
|
||||
return call_user_func_array(array("parent", "doSomethingParent"), array($i));
|
||||
}
|
||||
|
||||
public function doSomethingParentThis($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
$i++;
|
||||
if ($i >= 5) return 5;
|
||||
return call_user_func_array(array($this, "parent::doSomethingParentThis"), array($i));
|
||||
}
|
||||
|
||||
public static function doSomethingStatic($i)
|
||||
{
|
||||
echo __METHOD__ . "($i)\n";
|
||||
$i++;
|
||||
if ($i >= 5) return 5;
|
||||
return call_user_func_array(array("TestA", "doSomethingStatic"), array($i));
|
||||
return call_user_func_array(array("TestA","doSomething"), array($i));
|
||||
}
|
||||
}
|
||||
|
||||
$x = new TestB();
|
||||
echo "===A===\n";
|
||||
var_dump($x->doSomething(1));
|
||||
echo "\n===B===\n";
|
||||
var_dump($x->doSomethingThis(1));
|
||||
echo "\n===C===\n";
|
||||
var_dump($x->doSomethingParent(1));
|
||||
echo "\n===D===\n";
|
||||
var_dump($x->doSomethingParentThis(1));
|
||||
echo "\n===E===\n";
|
||||
var_dump($x->doSomethingStatic(1));
|
||||
|
||||
?>
|
||||
===DONE===
|
||||
<?php exit(0); ?>
|
||||
--EXPECTF--
|
||||
===A===
|
||||
TestB::doSomething(1)
|
||||
|
||||
Strict Standards: Non-static method TestA::doSomething() cannot be called statically, assuming $this from compatible context TestB in %sbug32290.php on line %d
|
||||
TestA::doSomething(2)
|
||||
int(1)
|
||||
|
||||
===B===
|
||||
TestB::doSomethingThis(1)
|
||||
TestA::doSomethingThis(2)
|
||||
int(1)
|
||||
|
||||
===C===
|
||||
TestB::doSomethingParent(1)
|
||||
|
||||
Strict Standards: Non-static method TestA::doSomethingParent() cannot be called statically, assuming $this from compatible context TestB in %sbug32290.php on line %d
|
||||
TestA::doSomethingParent(2)
|
||||
int(1)
|
||||
|
||||
===D===
|
||||
TestB::doSomethingParentThis(1)
|
||||
TestA::doSomethingParentThis(2)
|
||||
int(1)
|
||||
|
||||
===E===
|
||||
TestB::doSomethingStatic(1)
|
||||
TestA::doSomethingStatic(2)
|
||||
TestB::doSomething(Object id #%d)
|
||||
TestA::doSomething(Object id #%d)
|
||||
int(1)
|
||||
===DONE===
|
||||
@@ -1,45 +0,0 @@
|
||||
--TEST--
|
||||
Bug #33732 (Wrong behavior of constants in class and interface extending)
|
||||
--FILE--
|
||||
<?php
|
||||
interface iA {
|
||||
const cA = "const of iA\n";
|
||||
}
|
||||
|
||||
class A implements iA {
|
||||
}
|
||||
|
||||
class B extends A implements iA {
|
||||
}
|
||||
|
||||
echo iA::cA;
|
||||
echo A::cA;
|
||||
echo B::cA;
|
||||
|
||||
|
||||
interface iA2 {
|
||||
const cA = "const of iA2\n";
|
||||
}
|
||||
|
||||
interface iB2 extends iA2 {
|
||||
}
|
||||
|
||||
class A2 implements iA2 {
|
||||
}
|
||||
|
||||
class B2 extends A2 implements iB2 {
|
||||
}
|
||||
|
||||
echo iA2::cA;
|
||||
echo A2::cA;
|
||||
echo iB2::cA;
|
||||
echo B2::cA;
|
||||
?>
|
||||
--EXPECT--
|
||||
const of iA
|
||||
const of iA
|
||||
const of iA
|
||||
const of iA2
|
||||
const of iA2
|
||||
const of iA2
|
||||
const of iA2
|
||||
@@ -1,5 +1,5 @@
|
||||
--TEST--
|
||||
Bug #34873 (Segmentation Fault on foreach in object)
|
||||
bug #34873 (Segmentation Fault on foreach in object)
|
||||
--FILE--
|
||||
<?php
|
||||
class pwa {
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
--TEST--
|
||||
Bug #35393 (changing static protected members from outside the class)
|
||||
--INI--
|
||||
error_reporting=4095
|
||||
--FILE--
|
||||
<?php
|
||||
class ObjectPath
|
||||
{
|
||||
static protected $type = array(0=>'main');
|
||||
|
||||
static function getType()
|
||||
{
|
||||
return self::$type;
|
||||
}
|
||||
}
|
||||
print_r(ObjectPath::getType());
|
||||
$object_type = array_pop((ObjectPath::getType()));
|
||||
print_r(ObjectPath::getType());
|
||||
?>
|
||||
--EXPECTF--
|
||||
Array
|
||||
(
|
||||
[0] => main
|
||||
)
|
||||
|
||||
Strict Standards: Only variables should be passed by reference in %sbug35393.php on line 12
|
||||
Array
|
||||
(
|
||||
[0] => main
|
||||
)
|
||||
@@ -1,19 +0,0 @@
|
||||
--TEST--
|
||||
Bug #35411 (Regression with \{$ handling)
|
||||
--FILE--
|
||||
<?php
|
||||
$abc = "bar";
|
||||
echo "foo\{$abc}baz\n";
|
||||
echo "foo\{ $abc}baz\n";
|
||||
echo <<<TEST
|
||||
foo{$abc}baz
|
||||
foo\{$abc}baz
|
||||
foo\{ $abc}baz
|
||||
TEST;
|
||||
?>
|
||||
--EXPECT--
|
||||
foo\{bar}baz
|
||||
foo\{ bar}baz
|
||||
foobarbaz
|
||||
foo\{bar}baz
|
||||
foo\{ bar}baz
|
||||
@@ -1,27 +0,0 @@
|
||||
--TEST--
|
||||
Bug #35437 Segfault or Invalid Opcode 137/1/4
|
||||
--FILE--
|
||||
<?php
|
||||
function err2exception($errno, $errstr)
|
||||
{
|
||||
throw new Exception("Error occuried: " . $errstr);
|
||||
}
|
||||
|
||||
set_error_handler('err2exception');
|
||||
|
||||
class TestClass
|
||||
{
|
||||
function testMethod()
|
||||
{
|
||||
$GLOBALS['t'] = new stdClass;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
TestClass::testMethod();
|
||||
} catch (Exception $e) {
|
||||
echo "Catched: ".$e->getMessage()."\n";
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
Catched: Error occuried: Non-static method TestClass::testMethod() should not be called statically
|
||||
@@ -1,11 +0,0 @@
|
||||
--TEST--
|
||||
Bug #35470 (Assigning global using variable name from array doesn't function)
|
||||
--FILE--
|
||||
<?php
|
||||
$x = array("test", "55");
|
||||
global ${$x[0]};
|
||||
${$x[0]} = $x[1];
|
||||
echo "Test: $test\n";;
|
||||
?>
|
||||
--EXPECT--
|
||||
Test: 55
|
||||
@@ -1,31 +0,0 @@
|
||||
--TEST--
|
||||
Bug #35509 (string constant as array key has different behavior inside object)
|
||||
--FILE--
|
||||
<?php
|
||||
class mytest
|
||||
{
|
||||
const classConstant = '01';
|
||||
|
||||
private $classArray = array( mytest::classConstant => 'value' );
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
print_r($this->classArray);
|
||||
}
|
||||
}
|
||||
|
||||
$classtest = new mytest();
|
||||
|
||||
define( "normalConstant", '01' );
|
||||
$normalArray = array( normalConstant => 'value' );
|
||||
print_r($normalArray);
|
||||
?>
|
||||
--EXPECT--
|
||||
Array
|
||||
(
|
||||
[01] => value
|
||||
)
|
||||
Array
|
||||
(
|
||||
[01] => value
|
||||
)
|
||||
@@ -1,25 +0,0 @@
|
||||
--TEST--
|
||||
Bug #35655 (whitespace following end of heredoc is lost)
|
||||
--INI--
|
||||
highlight.string = #DD0000
|
||||
highlight.comment = #FF8000
|
||||
highlight.keyword = #007700
|
||||
highlight.bg = #FFFFFF
|
||||
highlight.default = #0000BB
|
||||
highlight.html = #000000
|
||||
--FILE--
|
||||
<?php
|
||||
$code = '
|
||||
<?php
|
||||
$x = <<<EOT
|
||||
some string
|
||||
EOT
|
||||
$y = 2;
|
||||
?>';
|
||||
highlight_string($code);
|
||||
?>
|
||||
--EXPECT--
|
||||
<code><span style="color: #000000">
|
||||
<br /><span style="color: #0000BB"><?php<br /> $x </span><span style="color: #007700">= <<<EOT<br /></span><span style="color: #0000BB">some string <br /></span><span style="color: #007700">EOT<br /> </span><span style="color: #0000BB">$y </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||||
</span>
|
||||
</code>
|
||||
@@ -1,30 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36006 (Problem with $this in __destruct())
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class Person {
|
||||
public $dad;
|
||||
public function __destruct() {
|
||||
$this->dad = null; /* no segfault if this is commented out */
|
||||
}
|
||||
}
|
||||
|
||||
class Dad extends Person {
|
||||
public $son;
|
||||
public function __construct() {
|
||||
$this->son = new Person;
|
||||
$this->son->dad = $this; /* no segfault if this is commented out */
|
||||
}
|
||||
public function __destruct() {
|
||||
$this->son = null;
|
||||
parent::__destruct(); /* segfault here */
|
||||
}
|
||||
}
|
||||
|
||||
$o = new Dad;
|
||||
unset($o);
|
||||
echo "ok\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
ok
|
||||
@@ -1,14 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36037 (heredoc adds extra line number)
|
||||
--FILE--
|
||||
<?php
|
||||
echo __LINE__, "\n";
|
||||
$x=<<<XXX
|
||||
123
|
||||
YYY;
|
||||
XXX;
|
||||
echo __LINE__, "\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
2
|
||||
7
|
||||
@@ -1,13 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36071 (Engine Crash related with 'clone')
|
||||
--INI--
|
||||
error_reporting=4095
|
||||
--FILE--
|
||||
<?php
|
||||
$a = clone 0;
|
||||
$a[0]->b = 0;
|
||||
echo "ok\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: __clone method called on non-object in %sbug36071.php on line 2
|
||||
ok
|
||||
@@ -1,14 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36268 (Object destructors called even after fatal errors)
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
function __destruct() {
|
||||
echo "Ha!\n";
|
||||
}
|
||||
}
|
||||
$x = new Foo();
|
||||
bar();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Call to undefined function bar() in %sbug36268.php on line 8
|
||||
@@ -1,12 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36303 (foreach on error_zval produces segfault)
|
||||
--FILE--
|
||||
<?php
|
||||
$x="test";
|
||||
foreach($x->a->b as &$v) {
|
||||
}
|
||||
echo "ok\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: Invalid argument supplied for foreach() in %sbug36303.php on line 3
|
||||
ok
|
||||
@@ -1,22 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36513 (comment will be outputed in last line)
|
||||
--FILE--
|
||||
<?php
|
||||
function test($s) {
|
||||
echo "'".trim(str_replace(" ", " ", htmlspecialchars_decode(strip_tags(highlight_string($s,1)))))."'\n";
|
||||
}
|
||||
|
||||
eval('echo "1";//2');
|
||||
eval('echo 3; //{ 4?>5');
|
||||
echo "\n";
|
||||
|
||||
//test('<?php echo "1";//');
|
||||
test('<?php echo "1";//2');
|
||||
test('<?php echo "1";//22');
|
||||
test('<?php echo 3; // 4 ?>5');
|
||||
?>
|
||||
--EXPECT--
|
||||
135
|
||||
'<?php echo "1";//2'
|
||||
'<?php echo "1";//22'
|
||||
'<?php echo 3; // 4 ?>5'
|
||||
@@ -1,15 +0,0 @@
|
||||
--TEST--
|
||||
Bug #36568 (memory_limit has no effect)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!function_exists('memory_get_usage')) die('skip PHP is configured without memory_limit');
|
||||
?>
|
||||
--INI--
|
||||
memory_limit=16M
|
||||
--FILE--
|
||||
<?php
|
||||
ini_set("memory_limit", "32M");
|
||||
echo ini_get("memory_limit");
|
||||
?>
|
||||
--EXPECT--
|
||||
32M
|
||||
@@ -1,23 +0,0 @@
|
||||
--TEST--
|
||||
Bug #37046 (foreach breaks static scope)
|
||||
--FILE--
|
||||
<?php
|
||||
function s() {
|
||||
static $storage = array(array('x', 'y'));
|
||||
return $storage[0];
|
||||
}
|
||||
|
||||
foreach (s() as $k => $function) {
|
||||
echo "op1 $k\n";
|
||||
if ($k == 0) {
|
||||
foreach (s() as $k => $function) {
|
||||
echo "op2 $k\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
op1 0
|
||||
op2 0
|
||||
op2 1
|
||||
op1 1
|
||||
@@ -1,21 +0,0 @@
|
||||
--TEST--
|
||||
Bug #37138 (__autoload tries to load callback'ed self and parent)
|
||||
--FILE--
|
||||
<?php
|
||||
function __autoload ($CN) {var_dump ($CN);}
|
||||
class st {
|
||||
public static function e () {echo ("EHLO\n");}
|
||||
public static function e2 () {call_user_func (array ('self', 'e'));}
|
||||
}
|
||||
class stch extends st {
|
||||
public static function g () {call_user_func (array ('parent', 'e'));}
|
||||
}
|
||||
st::e ();
|
||||
st::e2 ();
|
||||
stch::g ();
|
||||
?>
|
||||
--EXPECT--
|
||||
EHLO
|
||||
EHLO
|
||||
EHLO
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
--TEST--
|
||||
zend_strtod() leaks on big doubles
|
||||
--INI--
|
||||
precision=14
|
||||
--FILE--
|
||||
<?php
|
||||
var_dump("1139932690.21688500" - "1139932790.21688500");
|
||||
var_dump("1139932690000.21688500" - "331139932790.21688500");
|
||||
var_dump("339932690.21688500" - "4564645646456463461139932790.21688500");
|
||||
var_dump("123123139932690.21688500" - "11399327900000000.21688500");
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
float(-100)
|
||||
float(808792757210)
|
||||
float(-4.5646456464565E+27)
|
||||
float(-11276204760067000)
|
||||
Done
|
||||
+6
-25
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -102,7 +102,7 @@ ZEND_API zval zval_used_for_init; /* True global variable */
|
||||
/* version information */
|
||||
static char *zend_version_info;
|
||||
static uint zend_version_info_length;
|
||||
#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998-2006 Zend Technologies\n"
|
||||
#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998-2005 Zend Technologies\n"
|
||||
|
||||
|
||||
#define PRINT_ZVAL_INDENT 4
|
||||
@@ -237,19 +237,11 @@ ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_cop
|
||||
} else {
|
||||
if(Z_OBJ_HANDLER_P(expr, get)) {
|
||||
zval *z = Z_OBJ_HANDLER_P(expr, get)(expr TSRMLS_CC);
|
||||
|
||||
z->refcount++;
|
||||
if(Z_TYPE_P(z) != IS_OBJECT) {
|
||||
zend_make_printable_zval(z, expr_copy, use_copy);
|
||||
if (*use_copy) {
|
||||
zval_ptr_dtor(&z);
|
||||
} else {
|
||||
ZVAL_ZVAL(expr_copy, z, 0, 1);
|
||||
*use_copy = 1;
|
||||
}
|
||||
FREE_ZVAL(z);
|
||||
return;
|
||||
}
|
||||
zval_ptr_dtor(&z);
|
||||
}
|
||||
}
|
||||
if (EG(exception)) {
|
||||
@@ -461,13 +453,6 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals TSRMLS
|
||||
compiler_globals->auto_globals = (HashTable *) malloc(sizeof(HashTable));
|
||||
zend_hash_init_ex(compiler_globals->auto_globals, 8, NULL, NULL, 1, 0);
|
||||
zend_hash_copy(compiler_globals->auto_globals, global_auto_globals_table, NULL, NULL, sizeof(zend_auto_global) /* empty element */);
|
||||
|
||||
compiler_globals->last_static_member = zend_hash_num_elements(compiler_globals->class_table);
|
||||
if (compiler_globals->last_static_member) {
|
||||
compiler_globals->static_members = (HashTable**)calloc(compiler_globals->last_static_member, sizeof(HashTable*));
|
||||
} else {
|
||||
compiler_globals->static_members = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -485,10 +470,6 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals TSRMLS
|
||||
zend_hash_destroy(compiler_globals->auto_globals);
|
||||
free(compiler_globals->auto_globals);
|
||||
}
|
||||
if (compiler_globals->static_members) {
|
||||
free(compiler_globals->static_members);
|
||||
}
|
||||
compiler_globals->last_static_member = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -877,7 +858,7 @@ static int exec_done_cb(zend_module_entry *module TSRMLS_DC)
|
||||
void zend_post_deactivate_modules(TSRMLS_D)
|
||||
{
|
||||
zend_hash_apply(&module_registry, (apply_func_t) exec_done_cb TSRMLS_CC);
|
||||
zend_hash_reverse_apply(&module_registry, (apply_func_t) module_registry_unload_temp TSRMLS_CC);
|
||||
zend_hash_apply(&module_registry, (apply_func_t) module_registry_unload_temp TSRMLS_CC);
|
||||
}
|
||||
|
||||
|
||||
@@ -1025,7 +1006,7 @@ ZEND_API void zend_error(int type, const char *format, ...)
|
||||
}
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
} else if (!EG(exception)) {
|
||||
} else {
|
||||
/* The user error handler failed, use built-in error handler */
|
||||
zend_error_cb(type, error_filename, error_lineno, format, args);
|
||||
}
|
||||
@@ -1054,7 +1035,7 @@ ZEND_API void zend_error(int type, const char *format, ...)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
|
||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(DARWIN)
|
||||
void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((alias("zend_error"),noreturn));
|
||||
#endif
|
||||
|
||||
|
||||
+13
-5
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -22,7 +22,7 @@
|
||||
#ifndef ZEND_H
|
||||
#define ZEND_H
|
||||
|
||||
#define ZEND_VERSION "2.1.0"
|
||||
#define ZEND_VERSION "2.1.0-dev"
|
||||
|
||||
#define ZEND_ENGINE_2
|
||||
|
||||
@@ -91,7 +91,7 @@ const char *zend_mh_bundle_error(void);
|
||||
|
||||
#endif /* HAVE_MACH_O_DYLD_H */
|
||||
|
||||
#if defined(HAVE_LIBDL) && !defined(HAVE_MACH_O_DYLD_H) && !defined(ZEND_WIN32)
|
||||
#if defined(HAVE_LIBDL) && !defined(HAVE_MACH_O_DYLD_H)
|
||||
|
||||
# ifndef RTLD_LAZY
|
||||
# define RTLD_LAZY 1 /* Solaris 1, FreeBSD's (2.1.7.1 and older) */
|
||||
@@ -171,7 +171,7 @@ char *alloca ();
|
||||
# define ZEND_ATTRIBUTE_FORMAT(type, idx, first)
|
||||
#endif
|
||||
|
||||
#if ZEND_GCC_VERSION >= 3001 && !defined(__INTEL_COMPILER)
|
||||
#if ZEND_GCC_VERSION >= 3001
|
||||
# define ZEND_ATTRIBUTE_PTR_FORMAT(type, idx, first) __attribute__ ((format(type, idx, first)))
|
||||
#else
|
||||
# define ZEND_ATTRIBUTE_PTR_FORMAT(type, idx, first)
|
||||
@@ -250,7 +250,7 @@ char *alloca ();
|
||||
#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
|
||||
#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, return_value_ptr, this_ptr, return_value_used TSRMLS_CC
|
||||
|
||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
|
||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(DARWIN)
|
||||
# define ZEND_VM_ALWAYS_INLINE __attribute__ ((always_inline))
|
||||
void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((noreturn));
|
||||
#else
|
||||
@@ -279,8 +279,16 @@ typedef struct _zend_object {
|
||||
HashTable *guards; /* protects from __get/__set ... recursion */
|
||||
} zend_object;
|
||||
|
||||
typedef unsigned int zend_object_handle;
|
||||
typedef struct _zend_object_value zend_object_value;
|
||||
|
||||
#include "zend_object_handlers.h"
|
||||
|
||||
struct _zend_object_value {
|
||||
zend_object_handle handle;
|
||||
zend_object_handlers *handlers;
|
||||
};
|
||||
|
||||
typedef union _zvalue_value {
|
||||
long lval; /* long value */
|
||||
double dval; /* double value */
|
||||
|
||||
+123
-245
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -271,7 +271,7 @@ ZEND_API int zend_get_object_classname(zval *object, char **class_name, zend_uin
|
||||
}
|
||||
|
||||
|
||||
static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **spec TSRMLS_DC)
|
||||
static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec TSRMLS_DC)
|
||||
{
|
||||
char *spec_walk = *spec;
|
||||
char c = *spec_walk++;
|
||||
@@ -296,7 +296,7 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
|
||||
double d;
|
||||
int type;
|
||||
|
||||
if ((type = is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), p, &d, -1)) == 0) {
|
||||
if ((type = is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), p, &d, 0)) == 0) {
|
||||
return "long";
|
||||
} else if (type == IS_DOUBLE) {
|
||||
*p = (long) d;
|
||||
@@ -330,7 +330,7 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
|
||||
long l;
|
||||
int type;
|
||||
|
||||
if ((type = is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), &l, p, -1)) == 0) {
|
||||
if ((type = is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), &l, p, 0)) == 0) {
|
||||
return "double";
|
||||
} else if (type == IS_LONG) {
|
||||
*p = (double) l;
|
||||
@@ -445,21 +445,6 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
|
||||
}
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
{
|
||||
HashTable **p = va_arg(*va, HashTable **);
|
||||
if (Z_TYPE_PP(arg) != IS_ARRAY) {
|
||||
if (Z_TYPE_PP(arg) == IS_NULL && return_null) {
|
||||
*p = NULL;
|
||||
} else {
|
||||
return "array";
|
||||
}
|
||||
} else {
|
||||
*p = Z_ARRVAL_PP(arg);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
{
|
||||
zval **p = va_arg(*va, zval **);
|
||||
@@ -492,41 +477,6 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
|
||||
}
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
{
|
||||
zend_class_entry **lookup, **pce = va_arg(*va, zend_class_entry **);
|
||||
zend_class_entry *ce_base = *pce;
|
||||
|
||||
convert_to_string_ex(arg);
|
||||
if (zend_lookup_class(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), &lookup TSRMLS_CC) == FAILURE) {
|
||||
*pce = NULL;
|
||||
} else {
|
||||
*pce = *lookup;
|
||||
}
|
||||
if (ce_base) {
|
||||
if ((!*pce || !instanceof_function(*pce, ce_base TSRMLS_CC)) && !return_null) {
|
||||
char *space;
|
||||
char *class_name = get_active_class_name(&space TSRMLS_CC);
|
||||
zend_error(E_WARNING, "%s%s%s() expects parameter %d to be a class name derived from %s, '%s' given",
|
||||
class_name, space, get_active_function_name(TSRMLS_C),
|
||||
arg_num, ce_base->name, Z_STRVAL_PP(arg));
|
||||
*pce = NULL;
|
||||
return "";
|
||||
}
|
||||
}
|
||||
if (!*pce && !return_null) {
|
||||
char *space;
|
||||
char *class_name = get_active_class_name(&space TSRMLS_CC);
|
||||
zend_error(E_WARNING, "%s%s%s() expects parameter %d to be a valid class name, '%s' given",
|
||||
class_name, space, get_active_function_name(TSRMLS_C),
|
||||
arg_num, Z_STRVAL_PP(arg));
|
||||
return "";
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 'z':
|
||||
{
|
||||
zval **p = va_arg(*va, zval **);
|
||||
@@ -560,7 +510,7 @@ static int zend_parse_arg(int arg_num, zval **arg, va_list *va, char **spec, int
|
||||
{
|
||||
char *expected_type = NULL;
|
||||
|
||||
expected_type = zend_parse_arg_impl(arg_num, arg, va, spec TSRMLS_CC);
|
||||
expected_type = zend_parse_arg_impl(arg, va, spec TSRMLS_CC);
|
||||
if (expected_type) {
|
||||
if (!quiet) {
|
||||
char *space;
|
||||
@@ -595,7 +545,6 @@ static int zend_parse_va_args(int num_args, char *type_spec, va_list *va, int fl
|
||||
case 'r': case 'a':
|
||||
case 'o': case 'O':
|
||||
case 'z': case 'Z':
|
||||
case 'C': case 'h':
|
||||
max_num_args++;
|
||||
break;
|
||||
|
||||
@@ -774,13 +723,11 @@ static int zend_merge_property(zval **value, int num_args, va_list args, zend_ha
|
||||
if (hash_key->nKeyLength) {
|
||||
zval *obj = va_arg(args, zval *);
|
||||
zend_object_handlers *obj_ht = va_arg(args, zend_object_handlers *);
|
||||
zval *member;
|
||||
zval member;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
MAKE_STD_ZVAL(member);
|
||||
ZVAL_STRINGL(member, hash_key->arKey, hash_key->nKeyLength-1, 1);
|
||||
obj_ht->write_property(obj, member, *value TSRMLS_CC);
|
||||
zval_ptr_dtor(&member);
|
||||
ZVAL_STRINGL(&member, hash_key->arKey, hash_key->nKeyLength-1, 0);
|
||||
obj_ht->write_property(obj, &member, *value TSRMLS_CC);
|
||||
}
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
@@ -806,27 +753,22 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destro
|
||||
|
||||
ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC)
|
||||
{
|
||||
if (!class_type->constants_updated || !CE_STATIC_MEMBERS(class_type)) {
|
||||
if (!class_type->constants_updated || !class_type->static_members) {
|
||||
zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry);
|
||||
zend_class_entry *old_scope = *scope;
|
||||
|
||||
*scope = class_type;
|
||||
zend_hash_apply_with_argument(&class_type->constants_table, (apply_func_arg_t) zval_update_constant, (void*)1 TSRMLS_CC);
|
||||
zend_hash_apply_with_argument(&class_type->default_properties, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
|
||||
|
||||
if (!CE_STATIC_MEMBERS(class_type)) {
|
||||
if (!class_type->static_members) {
|
||||
HashPosition pos;
|
||||
zval **p;
|
||||
|
||||
if (class_type->parent) {
|
||||
zend_update_class_constants(class_type->parent TSRMLS_CC);
|
||||
}
|
||||
#if ZTS
|
||||
ALLOC_HASHTABLE(CG(static_members)[(long)(class_type->static_members)]);
|
||||
#else
|
||||
ALLOC_HASHTABLE(class_type->static_members);
|
||||
#endif
|
||||
zend_hash_init(CE_STATIC_MEMBERS(class_type), 0, NULL, ZVAL_PTR_DTOR, 0);
|
||||
zend_hash_init(class_type->static_members, 0, NULL, ZVAL_PTR_DTOR, 0);
|
||||
|
||||
zend_hash_internal_pointer_reset_ex(&class_type->default_static_members, &pos);
|
||||
while (zend_hash_get_current_data_ex(&class_type->default_static_members, (void**)&p, &pos) == SUCCESS) {
|
||||
@@ -840,23 +782,23 @@ ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC
|
||||
class_type->parent &&
|
||||
zend_hash_find(&class_type->parent->default_static_members, str_index, str_length, (void**)&q) == SUCCESS &&
|
||||
*p == *q &&
|
||||
zend_hash_find(CE_STATIC_MEMBERS(class_type->parent), str_index, str_length, (void**)&q) == SUCCESS) {
|
||||
zend_hash_find(class_type->parent->static_members, str_index, str_length, (void**)&q) == SUCCESS) {
|
||||
(*q)->refcount++;
|
||||
(*q)->is_ref = 1;
|
||||
zend_hash_add(CE_STATIC_MEMBERS(class_type), str_index, str_length, (void**)q, sizeof(zval*), NULL);
|
||||
zend_hash_add(class_type->static_members, str_index, str_length, (void**)q, sizeof(zval*), NULL);
|
||||
} else {
|
||||
zval *q;
|
||||
|
||||
ALLOC_ZVAL(q);
|
||||
*q = **p;
|
||||
INIT_PZVAL(q);
|
||||
INIT_PZVAL(q)
|
||||
zval_copy_ctor(q);
|
||||
zend_hash_add(CE_STATIC_MEMBERS(class_type), str_index, str_length, (void**)&q, sizeof(zval*), NULL);
|
||||
zend_hash_add(class_type->static_members, str_index, str_length, (void**)&q, sizeof(zval*), NULL);
|
||||
}
|
||||
zend_hash_move_forward_ex(&class_type->default_static_members, &pos);
|
||||
}
|
||||
}
|
||||
zend_hash_apply_with_argument(CE_STATIC_MEMBERS(class_type), (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
|
||||
zend_hash_apply_with_argument(class_type->static_members, (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
|
||||
|
||||
*scope = old_scope;
|
||||
class_type->constants_updated = 1;
|
||||
@@ -1227,68 +1169,58 @@ ZEND_API int add_get_index_stringl(zval *arg, ulong index, char *str, uint lengt
|
||||
ZEND_API int add_property_long_ex(zval *arg, char *key, uint key_len, long n TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_LONG(tmp, n);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
ZEND_API int add_property_bool_ex(zval *arg, char *key, uint key_len, int b TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_BOOL(tmp, b);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
ZEND_API int add_property_null_ex(zval *arg, char *key, uint key_len TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_NULL(tmp);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
ZEND_API int add_property_resource_ex(zval *arg, char *key, uint key_len, long n TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_RESOURCE(tmp, n);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1296,17 +1228,14 @@ ZEND_API int add_property_resource_ex(zval *arg, char *key, uint key_len, long n
|
||||
ZEND_API int add_property_double_ex(zval *arg, char *key, uint key_len, double d TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_DOUBLE(tmp, d);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1314,46 +1243,40 @@ ZEND_API int add_property_double_ex(zval *arg, char *key, uint key_len, double d
|
||||
ZEND_API int add_property_string_ex(zval *arg, char *key, uint key_len, char *str, int duplicate TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_STRING(tmp, str, duplicate);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
ZEND_API int add_property_stringl_ex(zval *arg, char *key, uint key_len, char *str, uint length, int duplicate TSRMLS_DC)
|
||||
{
|
||||
zval *tmp;
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(tmp);
|
||||
ZVAL_STRINGL(tmp, str, length, duplicate);
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, tmp TSRMLS_CC);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, tmp TSRMLS_CC);
|
||||
zval_ptr_dtor(&tmp); /* write_property will add 1 to refcount */
|
||||
zval_ptr_dtor(&z_key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
ZEND_API int add_property_zval_ex(zval *arg, char *key, uint key_len, zval *value TSRMLS_DC)
|
||||
{
|
||||
zval *z_key;
|
||||
zval z_key;
|
||||
|
||||
MAKE_STD_ZVAL(z_key);
|
||||
ZVAL_STRINGL(z_key, key, key_len-1, 1);
|
||||
ZVAL_STRINGL(&z_key, key, key_len-1, 0);
|
||||
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, z_key, value TSRMLS_CC);
|
||||
zval_ptr_dtor(&z_key);
|
||||
Z_OBJ_HANDLER_P(arg, write_property)(arg, &z_key, value TSRMLS_CC);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1546,8 +1469,8 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, zend_function_entr
|
||||
zend_function *ctor = NULL, *dtor = NULL, *clone = NULL, *__get = NULL, *__set = NULL, *__unset = NULL, *__isset = NULL, *__call = NULL;
|
||||
char *lowercase_name;
|
||||
int fname_len;
|
||||
char *lc_class_name = NULL;
|
||||
int class_name_len = 0;
|
||||
char *lc_class_name;
|
||||
int class_name_len;
|
||||
|
||||
if (type==MODULE_PERSISTENT) {
|
||||
error_type = E_CORE_WARNING;
|
||||
@@ -1590,10 +1513,8 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, zend_function_entr
|
||||
}
|
||||
if (ptr->flags) {
|
||||
if (!(ptr->flags & ZEND_ACC_PPP_MASK)) {
|
||||
if (ptr->flags != ZEND_ACC_DEPRECATED || scope) {
|
||||
zend_error(error_type, "Invalid access level for %s%s%s() - access must be exactly one of public, protected or private", scope ? scope->name : "", scope ? "::" : "", ptr->fname);
|
||||
}
|
||||
internal_function->fn_flags = ZEND_ACC_PUBLIC | ptr->flags;
|
||||
zend_error(error_type, "Invalid access level for %s%s%s() - access must be exactly one of public, protected or private", scope ? scope->name : "", scope ? "::" : "", ptr->fname);
|
||||
internal_function->fn_flags = ZEND_ACC_PUBLIC;
|
||||
} else {
|
||||
internal_function->fn_flags = ptr->flags;
|
||||
}
|
||||
@@ -1855,7 +1776,11 @@ int module_registry_cleanup(zend_module_entry *module TSRMLS_DC)
|
||||
|
||||
int module_registry_unload_temp(zend_module_entry *module TSRMLS_DC)
|
||||
{
|
||||
return (module->type == MODULE_TEMPORARY) ? ZEND_HASH_APPLY_REMOVE : ZEND_HASH_APPLY_STOP;
|
||||
switch (module->type) {
|
||||
case MODULE_TEMPORARY:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2024,101 +1949,16 @@ ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int zend_is_callable_check_func(int check_flags, zval ***zobj_ptr_ptr, zend_class_entry *ce_org, zval *callable, zend_class_entry **ce_ptr, zend_function **fptr_ptr TSRMLS_DC)
|
||||
{
|
||||
int retval;
|
||||
char *lcname, *lmname, *colon;
|
||||
int clen, mlen;
|
||||
zend_function *fptr;
|
||||
zend_class_entry **pce;
|
||||
HashTable *ftable;
|
||||
|
||||
*ce_ptr = NULL;
|
||||
*fptr_ptr = NULL;
|
||||
|
||||
if ((colon = strstr(Z_STRVAL_P(callable), "::")) != NULL) {
|
||||
clen = colon - Z_STRVAL_P(callable);
|
||||
mlen = Z_STRLEN_P(callable) - clen - 2;
|
||||
lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), clen);
|
||||
/* caution: lcname is not '\0' terminated */
|
||||
if (clen == sizeof("self") - 1 && memcmp(lcname, "self", sizeof("self") - 1) == 0) {
|
||||
*ce_ptr = EG(scope);
|
||||
} else if (clen == sizeof("parent") - 1 && memcmp(lcname, "parent", sizeof("parent") - 1) == 0 && EG(active_op_array)->scope) {
|
||||
*ce_ptr = EG(scope) ? EG(scope)->parent : NULL;
|
||||
} else if (zend_lookup_class(Z_STRVAL_P(callable), clen, &pce TSRMLS_CC) == SUCCESS) {
|
||||
*ce_ptr = *pce;
|
||||
}
|
||||
efree(lcname);
|
||||
if (!*ce_ptr) {
|
||||
return 0;
|
||||
}
|
||||
ftable = &(*ce_ptr)->function_table;
|
||||
if (ce_org && !instanceof_function(ce_org, *ce_ptr TSRMLS_CC)) {
|
||||
return 0;
|
||||
}
|
||||
lmname = zend_str_tolower_dup(Z_STRVAL_P(callable) + clen + 2, mlen);
|
||||
} else {
|
||||
mlen = Z_STRLEN_P(callable);
|
||||
lmname = zend_str_tolower_dup(Z_STRVAL_P(callable), mlen);
|
||||
if (ce_org) {
|
||||
ftable = &ce_org->function_table;
|
||||
*ce_ptr = ce_org;
|
||||
} else {
|
||||
ftable = EG(function_table);
|
||||
}
|
||||
}
|
||||
|
||||
retval = zend_hash_find(ftable, lmname, mlen+1, (void**)&fptr) == SUCCESS ? 1 : 0;
|
||||
|
||||
if (!retval) {
|
||||
if (*zobj_ptr_ptr && *ce_ptr && (*ce_ptr)->__call != 0) {
|
||||
retval = (*ce_ptr)->__call != NULL;
|
||||
*fptr_ptr = (*ce_ptr)->__call;
|
||||
}
|
||||
} else {
|
||||
*fptr_ptr = fptr;
|
||||
if (*ce_ptr) {
|
||||
if (!*zobj_ptr_ptr && !(fptr->common.fn_flags & ZEND_ACC_STATIC)) {
|
||||
if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0) {
|
||||
retval = 0;
|
||||
} else {
|
||||
if (EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), *ce_ptr TSRMLS_CC)) {
|
||||
*zobj_ptr_ptr = &EG(This);
|
||||
zend_error(E_STRICT, "Non-static method %s::%s() cannot be called statically, assuming $this from compatible context %s", (*ce_ptr)->name, fptr->common.function_name, Z_OBJCE_P(EG(This))->name);
|
||||
} else {
|
||||
zend_error(E_STRICT, "Non-static method %s::%s() cannot be called statically", (*ce_ptr)->name, fptr->common.function_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (retval && (check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0) {
|
||||
if (fptr->op_array.fn_flags & ZEND_ACC_PRIVATE) {
|
||||
if (!zend_check_private(fptr, *zobj_ptr_ptr ? Z_OBJCE_PP(*zobj_ptr_ptr) : EG(scope), lmname, mlen TSRMLS_CC)) {
|
||||
retval = 0;
|
||||
}
|
||||
} else if ((fptr->common.fn_flags & ZEND_ACC_PROTECTED)) {
|
||||
if (!zend_check_protected(fptr->common.scope, EG(scope))) {
|
||||
retval = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
efree(lmname);
|
||||
return retval;
|
||||
}
|
||||
|
||||
ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC)
|
||||
{
|
||||
char *lcname;
|
||||
char *lcname, *lmname, *colon;
|
||||
zend_bool retval = 0;
|
||||
int callable_name_len_local;
|
||||
int callable_name_len_local, clen, mlen;
|
||||
zend_class_entry *ce_local, **pce;
|
||||
zend_function *fptr_local;
|
||||
zval **zobj_ptr_local;
|
||||
HashTable *ftable;
|
||||
|
||||
if (callable_name) {
|
||||
*callable_name = NULL;
|
||||
}
|
||||
if (callable_name_len == NULL) {
|
||||
callable_name_len = &callable_name_len_local;
|
||||
}
|
||||
@@ -2145,7 +1985,33 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
|
||||
return 1;
|
||||
}
|
||||
|
||||
retval = zend_is_callable_check_func(check_flags|IS_CALLABLE_CHECK_IS_STATIC, zobj_ptr_ptr, NULL, callable, ce_ptr, fptr_ptr TSRMLS_CC);
|
||||
if ((colon = strstr(Z_STRVAL_P(callable), "::")) != NULL) {
|
||||
clen = colon - Z_STRVAL_P(callable);
|
||||
mlen = Z_STRLEN_P(callable) - clen - 2;
|
||||
lcname = estrndup(Z_STRVAL_P(callable), clen);
|
||||
lcname[clen] = '\0';
|
||||
lmname = zend_str_tolower_dup(Z_STRVAL_P(callable) + clen + 2, mlen);
|
||||
if (zend_lookup_class(lcname, clen, &pce TSRMLS_CC) == FAILURE) {
|
||||
efree(lcname);
|
||||
efree(lmname);
|
||||
return 0;
|
||||
}
|
||||
efree(lcname);
|
||||
*ce_ptr = *pce;
|
||||
ftable = &(*ce_ptr)->function_table;
|
||||
} else {
|
||||
mlen = Z_STRLEN_P(callable);
|
||||
lmname = zend_str_tolower_dup(Z_STRVAL_P(callable), mlen);
|
||||
ftable = EG(function_table);
|
||||
}
|
||||
|
||||
if (zend_hash_find(ftable, lmname, mlen+1, (void**)fptr_ptr) == SUCCESS) {
|
||||
retval = 1;
|
||||
}
|
||||
if (*ce_ptr && *fptr_ptr && !((*fptr_ptr)->common.fn_flags & ZEND_ACC_STATIC)) {
|
||||
retval = 0;
|
||||
}
|
||||
efree(lmname);
|
||||
break;
|
||||
|
||||
case IS_ARRAY:
|
||||
@@ -2174,18 +2040,21 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
|
||||
}
|
||||
|
||||
if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) {
|
||||
*ce_ptr = ce;
|
||||
return 1;
|
||||
}
|
||||
|
||||
lcname = zend_str_tolower_dup(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj));
|
||||
if (Z_STRLEN_PP(obj) == sizeof("self") - 1 && memcmp(lcname, "self", sizeof("self")) == 0) {
|
||||
ce = EG(active_op_array)->scope;
|
||||
} else if (Z_STRLEN_PP(obj) == sizeof("parent") - 1 && memcmp(lcname, "parent", sizeof("parent")) == 0 && EG(active_op_array)->scope) {
|
||||
ce = EG(active_op_array)->scope->parent;
|
||||
} else if (zend_lookup_class(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) {
|
||||
if (zend_lookup_class(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) {
|
||||
ce = *pce;
|
||||
} else if (EG(active_op_array)) {
|
||||
lcname = zend_str_tolower_dup(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj));
|
||||
if (Z_STRLEN_PP(obj) == sizeof("self") - 1 && memcmp(lcname, "self", sizeof("self")) == 0) {
|
||||
ce = EG(active_op_array)->scope;
|
||||
} else if (Z_STRLEN_PP(obj) == sizeof("parent") - 1 && memcmp(lcname, "parent", sizeof("parent")) == 0 && EG(active_op_array)->scope) {
|
||||
ce = EG(active_op_array)->scope->parent;
|
||||
}
|
||||
efree(lcname);
|
||||
}
|
||||
efree(lcname);
|
||||
} else {
|
||||
ce = Z_OBJCE_PP(obj); /* TBFixed: what if it's overloaded? */
|
||||
|
||||
@@ -2210,12 +2079,38 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
|
||||
}
|
||||
|
||||
if (ce) {
|
||||
retval = zend_is_callable_check_func(check_flags, zobj_ptr_ptr, ce, *method, ce_ptr, fptr_ptr TSRMLS_CC);
|
||||
zend_function *fbc;
|
||||
|
||||
lcname = zend_str_tolower_dup(Z_STRVAL_PP(method), Z_STRLEN_PP(method));
|
||||
if (zend_hash_find(&ce->function_table, lcname, Z_STRLEN_PP(method)+1, (void **)&fbc) == SUCCESS) {
|
||||
retval = 1;
|
||||
if ((check_flags & IS_CALLABLE_CHECK_NO_ACCESS) == 0) {
|
||||
if (fbc->op_array.fn_flags & ZEND_ACC_PRIVATE) {
|
||||
if (!zend_check_private(fbc, (Z_TYPE_PP(obj) == IS_STRING)?EG(scope):(*obj)->value.obj.handlers->get_class_entry(*obj TSRMLS_CC), lcname, Z_STRLEN_PP(method) TSRMLS_CC)) {
|
||||
retval = 0;
|
||||
}
|
||||
} else if ((fbc->common.fn_flags & ZEND_ACC_PROTECTED)) {
|
||||
if (!zend_check_protected(fbc->common.scope, EG(scope))) {
|
||||
retval = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
*fptr_ptr = fbc;
|
||||
}
|
||||
/* check for __call too */
|
||||
if (retval == 0 && *zobj_ptr_ptr && ce->__call != 0) {
|
||||
retval = 1;
|
||||
*fptr_ptr = ce->__call;
|
||||
}
|
||||
efree(lcname);
|
||||
}
|
||||
} else if (callable_name) {
|
||||
*callable_name = estrndup("Array", sizeof("Array")-1);
|
||||
*callable_name_len = sizeof("Array") - 1;
|
||||
}
|
||||
if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0 && !*zobj_ptr_ptr && (!*fptr_ptr || !((*fptr_ptr)->common.fn_flags & ZEND_ACC_STATIC))) {
|
||||
retval = 0;
|
||||
}
|
||||
*ce_ptr = ce;
|
||||
}
|
||||
break;
|
||||
@@ -2443,20 +2338,6 @@ ZEND_API int zend_declare_class_constant(zend_class_entry *ce, char *name, size_
|
||||
return zend_hash_update(&ce->constants_table, name, name_length+1, &value, sizeof(zval *), NULL);
|
||||
}
|
||||
|
||||
ZEND_API int zend_declare_class_constant_null(zend_class_entry *ce, char *name, size_t name_length TSRMLS_DC)
|
||||
{
|
||||
zval *constant;
|
||||
|
||||
if (ce->type & ZEND_INTERNAL_CLASS) {
|
||||
constant = malloc(sizeof(zval));
|
||||
} else {
|
||||
ALLOC_ZVAL(constant);
|
||||
}
|
||||
ZVAL_NULL(constant);
|
||||
INIT_PZVAL(constant);
|
||||
return zend_declare_class_constant(ce, name, name_length, constant TSRMLS_CC);
|
||||
}
|
||||
|
||||
ZEND_API int zend_declare_class_constant_long(zend_class_entry *ce, char *name, size_t name_length, long value TSRMLS_DC)
|
||||
{
|
||||
zval *constant;
|
||||
@@ -2521,7 +2402,7 @@ ZEND_API int zend_declare_class_constant_string(zend_class_entry *ce, char *name
|
||||
|
||||
ZEND_API void zend_update_property(zend_class_entry *scope, zval *object, char *name, int name_length, zval *value TSRMLS_DC)
|
||||
{
|
||||
zval *property;
|
||||
zval property;
|
||||
zend_class_entry *old_scope = EG(scope);
|
||||
|
||||
EG(scope) = scope;
|
||||
@@ -2534,10 +2415,8 @@ ZEND_API void zend_update_property(zend_class_entry *scope, zval *object, char *
|
||||
|
||||
zend_error(E_CORE_ERROR, "Property %s of class %s cannot be updated", name, class_name);
|
||||
}
|
||||
MAKE_STD_ZVAL(property);
|
||||
ZVAL_STRINGL(property, name, name_length, 1);
|
||||
Z_OBJ_HT_P(object)->write_property(object, property, value TSRMLS_CC);
|
||||
zval_ptr_dtor(&property);
|
||||
ZVAL_STRINGL(&property, name, name_length, 0);
|
||||
Z_OBJ_HT_P(object)->write_property(object, &property, value TSRMLS_CC);
|
||||
|
||||
EG(scope) = old_scope;
|
||||
}
|
||||
@@ -2710,7 +2589,7 @@ ZEND_API int zend_update_static_property_stringl(zend_class_entry *scope, char *
|
||||
|
||||
ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS_DC)
|
||||
{
|
||||
zval *property, *value;
|
||||
zval property, *value;
|
||||
zend_class_entry *old_scope = EG(scope);
|
||||
|
||||
EG(scope) = scope;
|
||||
@@ -2722,10 +2601,9 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *n
|
||||
zend_get_object_classname(object, &class_name, &class_name_len TSRMLS_CC);
|
||||
zend_error(E_CORE_ERROR, "Property %s of class %s cannot be read", name, class_name);
|
||||
}
|
||||
MAKE_STD_ZVAL(property);
|
||||
ZVAL_STRINGL(property, name, name_length, 1);
|
||||
value = Z_OBJ_HT_P(object)->read_property(object, property, silent TSRMLS_CC);
|
||||
zval_ptr_dtor(&property);
|
||||
ZVAL_STRINGL(&property, name, name_length, 0);
|
||||
value = Z_OBJ_HT_P(object)->read_property(object, &property, silent TSRMLS_CC);
|
||||
|
||||
EG(scope) = old_scope;
|
||||
return value;
|
||||
}
|
||||
|
||||
+1
-12
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -50,9 +50,7 @@ typedef struct _zend_function_entry {
|
||||
|
||||
#define ZEND_NAMED_FE(zend_name, name, arg_info) ZEND_FENTRY(zend_name, name, arg_info, 0)
|
||||
#define ZEND_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)
|
||||
#define ZEND_DEP_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED)
|
||||
#define ZEND_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0)
|
||||
#define ZEND_DEP_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
|
||||
#define ZEND_ME(classname, name, arg_info, flags) ZEND_FENTRY(name, ZEND_FN(classname##_##name), arg_info, flags)
|
||||
#define ZEND_ABSTRACT_ME(classname, name, arg_info) ZEND_FENTRY(name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
|
||||
#define ZEND_MALIAS(classname, name, alias, arg_info, flags) \
|
||||
@@ -148,12 +146,6 @@ typedef struct _zend_function_entry {
|
||||
#define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \
|
||||
INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset, NULL, NULL)
|
||||
|
||||
#ifdef ZTS
|
||||
# define CE_STATIC_MEMBERS(ce) (((ce)->type==ZEND_USER_CLASS)?(ce)->static_members:CG(static_members)[(long)(ce)->static_members])
|
||||
#else
|
||||
# define CE_STATIC_MEMBERS(ce) ((ce)->static_members)
|
||||
#endif
|
||||
|
||||
int zend_next_free_module(void);
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
@@ -206,8 +198,6 @@ ZEND_API void zend_wrong_param_count(TSRMLS_D);
|
||||
#define IS_CALLABLE_CHECK_NO_ACCESS (1<<1)
|
||||
#define IS_CALLABLE_CHECK_IS_STATIC (1<<2)
|
||||
|
||||
#define IS_CALLABLE_STRICT (IS_CALLABLE_CHECK_IS_STATIC)
|
||||
|
||||
ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC);
|
||||
ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, char **callable_name);
|
||||
ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRMLS_DC);
|
||||
@@ -223,7 +213,6 @@ ZEND_API int zend_declare_property_string(zend_class_entry *ce, char *name, int
|
||||
ZEND_API int zend_declare_property_stringl(zend_class_entry *ce, char *name, int name_length, char *value, int value_len, int access_type TSRMLS_DC);
|
||||
|
||||
ZEND_API int zend_declare_class_constant(zend_class_entry *ce, char *name, size_t name_length, zval *value TSRMLS_DC);
|
||||
ZEND_API int zend_declare_class_constant_null(zend_class_entry *ce, char *name, size_t name_length TSRMLS_DC);
|
||||
ZEND_API int zend_declare_class_constant_long(zend_class_entry *ce, char *name, size_t name_length, long value TSRMLS_DC);
|
||||
ZEND_API int zend_declare_class_constant_bool(zend_class_entry *ce, char *name, size_t name_length, zend_bool value TSRMLS_DC);
|
||||
ZEND_API int zend_declare_class_constant_double(zend_class_entry *ce, char *name, size_t name_length, double value TSRMLS_DC);
|
||||
|
||||
+1
-2
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -558,7 +558,6 @@ ZEND_API void shutdown_memory_manager(int silent, int full_shutdown TSRMLS_DC)
|
||||
|
||||
grand_total_leaks++;
|
||||
if (!silent) {
|
||||
zend_message_dispatcher(ZMSG_LOG_SCRIPT_NAME, NULL);
|
||||
zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t);
|
||||
}
|
||||
t->reported = 1;
|
||||
|
||||
+1
-2
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -125,7 +125,6 @@ ZEND_API char *_estrndup(const char *s, unsigned int length ZEND_FILE_LINE_DC ZE
|
||||
|
||||
#else
|
||||
|
||||
#undef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#include <string.h>
|
||||
#undef _GNU_SOURCE
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -40,14 +40,6 @@ ZEND_BEGIN_ARG_INFO(fourth_arg_force_ref, 0)
|
||||
ZEND_ARG_PASS_INFO(1)
|
||||
ZEND_END_ARG_INFO();
|
||||
|
||||
ZEND_BEGIN_ARG_INFO(fifth_arg_force_ref, 0)
|
||||
ZEND_ARG_PASS_INFO(0)
|
||||
ZEND_ARG_PASS_INFO(0)
|
||||
ZEND_ARG_PASS_INFO(0)
|
||||
ZEND_ARG_PASS_INFO(0)
|
||||
ZEND_ARG_PASS_INFO(1)
|
||||
ZEND_END_ARG_INFO();
|
||||
|
||||
ZEND_BEGIN_ARG_INFO(all_args_by_ref, 1)
|
||||
ZEND_END_ARG_INFO();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -314,12 +314,6 @@ ZEND_FUNCTION(strncmp)
|
||||
convert_to_string_ex(s1);
|
||||
convert_to_string_ex(s2);
|
||||
convert_to_long_ex(s3);
|
||||
|
||||
if (Z_LVAL_PP(s3) < 0) {
|
||||
zend_error(E_WARNING, "Length must be greater than or equal to 0");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_LONG(zend_binary_zval_strncmp(*s1, *s2, *s3));
|
||||
}
|
||||
/* }}} */
|
||||
@@ -353,12 +347,6 @@ ZEND_FUNCTION(strncasecmp)
|
||||
convert_to_string_ex(s1);
|
||||
convert_to_string_ex(s2);
|
||||
convert_to_long_ex(s3);
|
||||
|
||||
if (Z_LVAL_PP(s3) < 0) {
|
||||
zend_error(E_WARNING, "Length must be greater than or equal to 0");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_LONG(zend_binary_zval_strncasecmp(*s1, *s2, *s3));
|
||||
}
|
||||
/* }}} */
|
||||
@@ -750,7 +738,7 @@ ZEND_FUNCTION(get_class_vars)
|
||||
array_init(return_value);
|
||||
add_class_vars(*pce, &(*pce)->default_properties, return_value TSRMLS_CC);
|
||||
zend_update_class_constants(*pce TSRMLS_CC);
|
||||
add_class_vars(*pce, CE_STATIC_MEMBERS(*pce), return_value TSRMLS_CC);
|
||||
add_class_vars(*pce, (*pce)->static_members, return_value TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
@@ -780,16 +768,11 @@ ZEND_FUNCTION(get_object_vars)
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
properties = Z_OBJ_HT_PP(obj)->get_properties(*obj TSRMLS_CC);
|
||||
|
||||
if (properties == NULL) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
instanceof = EG(This) && instanceof_function(Z_OBJCE_P(EG(This)), Z_OBJCE_PP(obj) TSRMLS_CC);
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
properties = Z_OBJ_HT_PP(obj)->get_properties(*obj TSRMLS_CC);
|
||||
zend_hash_internal_pointer_reset_ex(properties, &pos);
|
||||
|
||||
while (zend_hash_get_current_data_ex(properties, (void **) &value, &pos) == SUCCESS) {
|
||||
@@ -1710,6 +1693,8 @@ ZEND_FUNCTION(debug_print_backtrace)
|
||||
}
|
||||
}
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
while (ptr) {
|
||||
char *free_class_name = NULL;
|
||||
|
||||
@@ -1816,11 +1801,7 @@ ZEND_FUNCTION(debug_print_backtrace)
|
||||
debug_print_backtrace_args(arg_array TSRMLS_CC);
|
||||
zval_ptr_dtor(&arg_array);
|
||||
}
|
||||
if (filename) {
|
||||
zend_printf(") called at [%s:%d]\n", filename, lineno);
|
||||
} else {
|
||||
ZEND_PUTS(")\n");
|
||||
}
|
||||
zend_printf(") called at [%s:%d]\n", filename, lineno);
|
||||
include_filename = filename;
|
||||
ptr = skip->prev_execute_data;
|
||||
++indent;
|
||||
@@ -1832,7 +1813,7 @@ ZEND_FUNCTION(debug_print_backtrace)
|
||||
|
||||
/* }}} */
|
||||
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int provide_object TSRMLS_DC)
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last TSRMLS_DC)
|
||||
{
|
||||
zend_execute_data *ptr, *skip;
|
||||
int lineno;
|
||||
@@ -1932,11 +1913,6 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
|
||||
add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, dup);
|
||||
|
||||
}
|
||||
if (provide_object) {
|
||||
add_assoc_zval_ex(stack_frame, "object", sizeof("object"), ptr->object);
|
||||
ptr->object->refcount++;
|
||||
}
|
||||
|
||||
add_assoc_string_ex(stack_frame, "type", sizeof("type"), "->", 1);
|
||||
} else if (ptr->function_state.function->common.scope) {
|
||||
add_assoc_string_ex(stack_frame, "class", sizeof("class"), ptr->function_state.function->common.scope->name, 1);
|
||||
@@ -2018,7 +1994,7 @@ ZEND_FUNCTION(debug_backtrace)
|
||||
ZEND_WRONG_PARAM_COUNT();
|
||||
}
|
||||
|
||||
zend_fetch_debug_backtrace(return_value, 1, 1 TSRMLS_CC);
|
||||
zend_fetch_debug_backtrace(return_value, 1 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -25,7 +25,7 @@
|
||||
int zend_startup_builtin_functions(TSRMLS_D);
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int provide_object TSRMLS_DC);
|
||||
ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last TSRMLS_DC);
|
||||
END_EXTERN_C()
|
||||
|
||||
#endif /* ZEND_BUILTIN_FUNCTIONS_H */
|
||||
|
||||
+17
-80
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -154,7 +154,6 @@ void zend_init_compiler_data_structures(TSRMLS_D)
|
||||
|
||||
void init_compiler(TSRMLS_D)
|
||||
{
|
||||
CG(active_op_array) = NULL;
|
||||
zend_init_compiler_data_structures(TSRMLS_C);
|
||||
zend_init_rsrc_list(TSRMLS_C);
|
||||
zend_hash_init(&CG(filenames_table), 5, NULL, (dtor_func_t) free_estring, 0);
|
||||
@@ -466,9 +465,7 @@ void fetch_array_dim(znode *result, znode *parent, znode *dim TSRMLS_DC)
|
||||
|
||||
void fetch_string_offset(znode *result, znode *parent, znode *offset TSRMLS_DC)
|
||||
{
|
||||
#ifdef ilia_0
|
||||
zend_error(E_STRICT, "Usage of {} to access string offsets is deprecated and will be removed in PHP 6");
|
||||
#endif
|
||||
fetch_array_dim(result, parent, offset TSRMLS_CC);
|
||||
}
|
||||
|
||||
@@ -1731,14 +1728,12 @@ void zend_do_mark_last_catch(znode *first_catch, znode *last_additional_catch TS
|
||||
} else {
|
||||
CG(active_op_array)->opcodes[last_additional_catch->u.opline_num].op1.u.EA.type = 1;
|
||||
}
|
||||
DEC_BPC(CG(active_op_array));
|
||||
}
|
||||
|
||||
|
||||
void zend_do_try(znode *try_token TSRMLS_DC)
|
||||
{
|
||||
try_token->u.opline_num = zend_add_try_element(get_next_op_number(CG(active_op_array)) TSRMLS_CC);
|
||||
INC_BPC(CG(active_op_array));
|
||||
}
|
||||
|
||||
|
||||
@@ -1842,12 +1837,6 @@ static void do_inherit_parent_constructor(zend_class_entry *ce)
|
||||
ce->destructor = ce->parent->destructor;
|
||||
}
|
||||
if (ce->constructor) {
|
||||
if (ce->parent->constructor && ce->parent->constructor->common.fn_flags & ZEND_ACC_FINAL) {
|
||||
zend_error(E_ERROR, "Cannot override final %s::%s() with %s::%s()",
|
||||
ce->parent->name, ce->parent->constructor->common.function_name,
|
||||
ce->name, ce->constructor->common.function_name
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2097,9 +2086,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro
|
||||
|
||||
if (parent_ce->type != ce->type) {
|
||||
/* User class extends internal class */
|
||||
TSRMLS_FETCH();
|
||||
|
||||
ht = CE_STATIC_MEMBERS(parent_ce);
|
||||
ht = parent_ce->static_members;
|
||||
} else {
|
||||
ht = &parent_ce->default_static_members;
|
||||
}
|
||||
@@ -2205,7 +2192,7 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
|
||||
if (parent_ce->type != ce->type) {
|
||||
/* User class extends internal class */
|
||||
zend_update_class_constants(parent_ce TSRMLS_CC);
|
||||
zend_hash_merge(&ce->default_static_members, CE_STATIC_MEMBERS(parent_ce), (void (*)(void *)) inherit_static_prop, NULL, sizeof(zval *), 0);
|
||||
zend_hash_merge(&ce->default_static_members, parent_ce->static_members, (void (*)(void *)) inherit_static_prop, NULL, sizeof(zval *), 0);
|
||||
} else {
|
||||
zend_hash_merge(&ce->default_static_members, &parent_ce->default_static_members, (void (*)(void *)) inherit_static_prop, NULL, sizeof(zval *), 0);
|
||||
}
|
||||
@@ -2219,14 +2206,10 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
|
||||
}
|
||||
|
||||
|
||||
static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zval **parent_constant, zend_hash_key *hash_key, zend_class_entry *iface)
|
||||
static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zval *parent_constant, zend_hash_key *hash_key, zend_class_entry *iface)
|
||||
{
|
||||
zval **old_constant;
|
||||
|
||||
if (zend_hash_quick_find(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) {
|
||||
if (*old_constant != *parent_constant) {
|
||||
zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %s from interface %s", hash_key->arKey, iface->name);
|
||||
}
|
||||
if (zend_hash_quick_exists(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h)) {
|
||||
zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %s from interface %s", hash_key->arKey, iface->name);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
@@ -2941,7 +2924,13 @@ void zend_do_declare_class_constant(znode *var_name, znode *value TSRMLS_DC)
|
||||
}
|
||||
|
||||
ALLOC_ZVAL(property);
|
||||
*property = value->u.constant;
|
||||
|
||||
if (value) {
|
||||
*property = value->u.constant;
|
||||
} else {
|
||||
INIT_PZVAL(property);
|
||||
property->type = IS_NULL;
|
||||
}
|
||||
|
||||
if (zend_hash_add(&CG(active_class_entry)->constants_table, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL)==FAILURE) {
|
||||
FREE_ZVAL(property);
|
||||
@@ -3090,33 +3079,6 @@ void zend_do_end_new_object(znode *result, znode *new_token, znode *argument_lis
|
||||
*result = CG(active_op_array)->opcodes[new_token->u.opline_num].result;
|
||||
}
|
||||
|
||||
static int zend_constant_ct_subst(znode *result, zval *const_name TSRMLS_DC)
|
||||
{
|
||||
zend_constant *c = NULL;
|
||||
|
||||
if (zend_hash_find(EG(zend_constants), Z_STRVAL_P(const_name), Z_STRLEN_P(const_name)+1, (void **) &c) == FAILURE) {
|
||||
char *lookup_name = zend_str_tolower_dup(Z_STRVAL_P(const_name), Z_STRLEN_P(const_name));
|
||||
|
||||
if (zend_hash_find(EG(zend_constants), lookup_name, Z_STRLEN_P(const_name)+1, (void **) &c)==SUCCESS) {
|
||||
if ((c->flags & CONST_CS) && memcmp(c->name, Z_STRVAL_P(const_name), Z_STRLEN_P(const_name))!=0) {
|
||||
c = NULL;
|
||||
}
|
||||
} else {
|
||||
c = NULL;
|
||||
}
|
||||
efree(lookup_name);
|
||||
}
|
||||
if (c && (c->flags & CONST_CT_SUBST)) {
|
||||
zval_dtor(const_name);
|
||||
result->op_type = IS_CONST;
|
||||
result->u.constant = c->value;
|
||||
zval_copy_ctor(&result->u.constant);
|
||||
INIT_PZVAL(&result->u.constant);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void zend_do_fetch_constant(znode *result, znode *constant_container, znode *constant_name, int mode TSRMLS_DC)
|
||||
{
|
||||
switch (mode) {
|
||||
@@ -3124,15 +3086,13 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con
|
||||
if (constant_container) {
|
||||
zend_do_fetch_class_name(NULL, constant_container, constant_name TSRMLS_CC);
|
||||
*result = *constant_container;
|
||||
result->u.constant.type = IS_CONSTANT;
|
||||
} else if (!zend_constant_ct_subst(result, &constant_name->u.constant TSRMLS_CC)) {
|
||||
} else {
|
||||
*result = *constant_name;
|
||||
result->u.constant.type = IS_CONSTANT;
|
||||
}
|
||||
result->u.constant.type = IS_CONSTANT;
|
||||
break;
|
||||
case ZEND_RT:
|
||||
if (constant_container ||
|
||||
!zend_constant_ct_subst(result, &constant_name->u.constant TSRMLS_CC)) {
|
||||
{
|
||||
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
|
||||
|
||||
opline->opcode = ZEND_FETCH_CONSTANT;
|
||||
@@ -3251,9 +3211,6 @@ void zend_do_add_static_array_element(znode *result, znode *offset, znode *expr)
|
||||
case IS_DOUBLE:
|
||||
zend_hash_index_update(result->u.constant.value.ht, (long)offset->u.constant.value.dval, &element, sizeof(zval *), NULL);
|
||||
break;
|
||||
case IS_CONSTANT_ARRAY:
|
||||
zend_error(E_ERROR, "Illegal offset type");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
zend_hash_next_index_insert(result->u.constant.value.ht, &element, sizeof(zval *), NULL);
|
||||
@@ -3782,8 +3739,6 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC)
|
||||
}
|
||||
efree(val->u.constant.value.str.val);
|
||||
#endif /* ZEND_MULTIBYTE */
|
||||
} else {
|
||||
zval_dtor(&val->u.constant);
|
||||
}
|
||||
zval_dtor(&var->u.constant);
|
||||
}
|
||||
@@ -4035,8 +3990,6 @@ again:
|
||||
case T_END_HEREDOC:
|
||||
efree(zendlval->u.constant.value.str.val);
|
||||
break;
|
||||
case EOF:
|
||||
return EOF;
|
||||
}
|
||||
|
||||
INIT_PZVAL(&zendlval->u.constant);
|
||||
@@ -4063,23 +4016,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
|
||||
zend_hash_init_ex(&ce->constants_table, 0, NULL, zval_ptr_dtor_func, persistent_hashes, 0);
|
||||
zend_hash_init_ex(&ce->function_table, 0, NULL, ZEND_FUNCTION_DTOR, persistent_hashes, 0);
|
||||
|
||||
if (ce->type == ZEND_INTERNAL_CLASS) {
|
||||
#ifdef ZTS
|
||||
int n = zend_hash_num_elements(CG(class_table));
|
||||
|
||||
if (CG(static_members) && n >= CG(last_static_member)) {
|
||||
/* Support for run-time declaration: dl() */
|
||||
CG(last_static_member) = n+1;
|
||||
CG(static_members) = realloc(CG(static_members), (n+1)*sizeof(HashTable*));
|
||||
CG(static_members)[n] = NULL;
|
||||
}
|
||||
ce->static_members = (HashTable*)n;
|
||||
#else
|
||||
ce->static_members = NULL;
|
||||
#endif
|
||||
} else {
|
||||
ce->static_members = &ce->default_static_members;
|
||||
}
|
||||
ce->static_members = (ce->type == ZEND_INTERNAL_CLASS) ? NULL : &ce->default_static_members;
|
||||
|
||||
if (nullify_handlers) {
|
||||
ce->constructor = NULL;
|
||||
|
||||
+1
-5
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -136,9 +136,6 @@ typedef struct _zend_try_catch_element {
|
||||
/* shadow of parent's private method/property */
|
||||
#define ZEND_ACC_SHADOW 0x20000
|
||||
|
||||
/* deprecation flag */
|
||||
#define ZEND_ACC_DEPRECATED 0x40000
|
||||
|
||||
char *zend_visibility_string(zend_uint fn_flags);
|
||||
|
||||
|
||||
@@ -517,7 +514,6 @@ ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC);
|
||||
ZEND_API void zend_file_handle_dtor(zend_file_handle *fh);
|
||||
ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC);
|
||||
ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC);
|
||||
ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC);
|
||||
|
||||
ZEND_API void destroy_zend_function(zend_function *function TSRMLS_DC);
|
||||
ZEND_API void zend_function_dtor(zend_function *function);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+15
-6
@@ -2,10 +2,10 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.zend.com/license/2_00.txt. |
|
||||
| If you did not receive a copy of the Zend license and are unable to |
|
||||
@@ -23,9 +23,8 @@
|
||||
#define ZEND_CONFIG_W32_H
|
||||
|
||||
#define USE_ZEND_ALLOC 1
|
||||
|
||||
#include <../main/config.w32.h>
|
||||
|
||||
#define HAVE_ALLOCA 1
|
||||
#define HAVE_LIMITS_H 1
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
|
||||
#include <malloc.h>
|
||||
@@ -45,9 +44,19 @@
|
||||
typedef unsigned long ulong;
|
||||
typedef unsigned int uint;
|
||||
|
||||
#undef HAVE_KILL
|
||||
#define HAVE_GETPID 1
|
||||
/* #define HAVE_ALLOCA_H 1 */
|
||||
#define HAVE_MEMCPY 1
|
||||
#define HAVE_STRDUP 1
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
#define HAVE_STDIOSTR_H 1
|
||||
#define HAVE_CLASS_ISTDIOSTREAM
|
||||
#define istdiostream stdiostream
|
||||
#define HAVE_STDARG_H 1
|
||||
#define HAVE_SNPRINTF 1
|
||||
#define HAVE_VSNPRINTF 1
|
||||
#define HAVE_STRCOLL 1
|
||||
|
||||
#define snprintf _snprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
@@ -78,7 +87,7 @@ typedef unsigned int uint;
|
||||
#define ZEND_DLEXPORT __declspec(dllexport)
|
||||
#define ZEND_DLIMPORT __declspec(dllimport)
|
||||
|
||||
/* 0x00200000L is MB_SERVICE_NOTIFICATION, which is only supported under Windows NT
|
||||
/* 0x00200000L is MB_SERVICE_NOTIFICATION, which is only supported under Windows NT
|
||||
* (and requires _WIN32_WINNT to be defined, which prevents the resulting executable
|
||||
* from running under Windows 9x
|
||||
* Windows 9x should silently ignore it, so it's being used here directly
|
||||
|
||||
+16
-19
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -55,13 +55,11 @@ void zend_copy_constants(HashTable *target, HashTable *source)
|
||||
|
||||
static int clean_non_persistent_constant(zend_constant *c TSRMLS_DC)
|
||||
{
|
||||
return (c->flags & CONST_PERSISTENT) ? ZEND_HASH_APPLY_STOP : ZEND_HASH_APPLY_REMOVE;
|
||||
}
|
||||
|
||||
|
||||
static int clean_non_persistent_constant_full(zend_constant *c TSRMLS_DC)
|
||||
{
|
||||
return (c->flags & CONST_PERSISTENT) ? 0 : 1;
|
||||
if (c->flags & CONST_PERSISTENT) {
|
||||
return EG(full_tables_cleanup) ? 0 : ZEND_HASH_APPLY_STOP;
|
||||
} else {
|
||||
return EG(full_tables_cleanup) ? 1 : ZEND_HASH_APPLY_REMOVE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +112,8 @@ void zend_register_standard_constants(TSRMLS_D)
|
||||
{
|
||||
zend_constant c;
|
||||
|
||||
c.flags = CONST_PERSISTENT | CONST_CT_SUBST;
|
||||
c.value.type = IS_BOOL;
|
||||
c.flags = CONST_PERSISTENT;
|
||||
c.module_number = 0;
|
||||
|
||||
c.name = zend_strndup(ZEND_STRL("TRUE"));
|
||||
@@ -129,18 +128,16 @@ void zend_register_standard_constants(TSRMLS_D)
|
||||
c.value.type = IS_BOOL;
|
||||
zend_register_constant(&c TSRMLS_CC);
|
||||
|
||||
c.name = zend_strndup(ZEND_STRL("NULL"));
|
||||
c.name_len = sizeof("NULL");
|
||||
c.value.type = IS_NULL;
|
||||
zend_register_constant(&c TSRMLS_CC);
|
||||
|
||||
c.flags = CONST_PERSISTENT;
|
||||
|
||||
c.name = zend_strndup(ZEND_STRL("ZEND_THREAD_SAFE"));
|
||||
c.name_len = sizeof("ZEND_THREAD_SAFE");
|
||||
c.value.value.lval = ZTS_V;
|
||||
c.value.type = IS_BOOL;
|
||||
zend_register_constant(&c TSRMLS_CC);
|
||||
|
||||
c.name = zend_strndup(ZEND_STRL("NULL"));
|
||||
c.name_len = sizeof("NULL");
|
||||
c.value.type = IS_NULL;
|
||||
zend_register_constant(&c TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,7 +153,7 @@ int zend_shutdown_constants(TSRMLS_D)
|
||||
void clean_non_persistent_constants(TSRMLS_D)
|
||||
{
|
||||
if (EG(full_tables_cleanup)) {
|
||||
zend_hash_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC);
|
||||
zend_hash_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant TSRMLS_CC);
|
||||
} else {
|
||||
zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant TSRMLS_CC);
|
||||
}
|
||||
@@ -312,8 +309,8 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC)
|
||||
|
||||
if (!(c->flags & CONST_CS)) {
|
||||
/* keep in mind that c->name_len already contains the '\0' */
|
||||
lowercase_name = estrndup(c->name, c->name_len-1);
|
||||
zend_str_tolower(lowercase_name, c->name_len-1);
|
||||
lowercase_name = estrndup(c->name, c->name_len);
|
||||
zend_str_tolower(lowercase_name, c->name_len);
|
||||
name = lowercase_name;
|
||||
} else {
|
||||
name = c->name;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONST_CS (1<<0) /* Case Sensitive */
|
||||
#define CONST_PERSISTENT (1<<1) /* Persistent */
|
||||
#define CONST_CT_SUBST (2<<1) /* Allow compile-time substitution */
|
||||
|
||||
#define PHP_USER_CONSTANT INT_MAX /* a constant defined in user space */
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "zend.h"
|
||||
#include "zend_API.h"
|
||||
#include "zend_reflection_api.h"
|
||||
#include "zend_builtin_functions.h"
|
||||
#include "zend_interfaces.h"
|
||||
#include "zend_exceptions.h"
|
||||
@@ -30,6 +31,7 @@ ZEND_API void zend_register_default_classes(TSRMLS_D)
|
||||
{
|
||||
zend_register_interfaces(TSRMLS_C);
|
||||
zend_register_default_exception(TSRMLS_C);
|
||||
zend_register_reflection_api(TSRMLS_C);
|
||||
zend_register_iterator_wrapper(TSRMLS_C);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "zend.h"
|
||||
#include "zend_API.h"
|
||||
#include "zend_reflection_api.h"
|
||||
#include "zend_builtin_functions.h"
|
||||
#include "zend_interfaces.h"
|
||||
#include "zend_exceptions.h"
|
||||
@@ -91,7 +92,7 @@ static zend_object_value zend_default_exception_new_ex(zend_class_entry *class_t
|
||||
ALLOC_ZVAL(trace);
|
||||
trace->is_ref = 0;
|
||||
trace->refcount = 0;
|
||||
zend_fetch_debug_backtrace(trace, skip_top_traces, 0 TSRMLS_CC);
|
||||
zend_fetch_debug_backtrace(trace, skip_top_traces TSRMLS_CC);
|
||||
|
||||
zend_update_property_string(default_exception_ce, &obj, "file", sizeof("file")-1, zend_get_executed_filename(TSRMLS_C) TSRMLS_CC);
|
||||
zend_update_property_long(default_exception_ce, &obj, "line", sizeof("line")-1, zend_get_executed_lineno(TSRMLS_C) TSRMLS_CC);
|
||||
@@ -131,7 +132,7 @@ ZEND_METHOD(exception, __construct)
|
||||
int argc = ZEND_NUM_ARGS(), message_len;
|
||||
|
||||
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|sl", &message, &message_len, &code) == FAILURE) {
|
||||
zend_error(E_ERROR, "Wrong parameters for Exception([string $exception [, long $code ]])");
|
||||
zend_error(E_ERROR, "Wrong parameter count for exception([string $exception [, long $code ]])");
|
||||
}
|
||||
|
||||
object = getThis();
|
||||
@@ -157,7 +158,7 @@ ZEND_METHOD(error_exception, __construct)
|
||||
int argc = ZEND_NUM_ARGS(), message_len, filename_len;
|
||||
|
||||
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|sllsl", &message, &message_len, &code, &severity, &filename, &filename_len, &lineno) == FAILURE) {
|
||||
zend_error(E_ERROR, "Wrong parameters for ErrorException([string $exception [, long $code, [ long $severity, [ string $filename, [ long $lineno ]]]]])");
|
||||
zend_error(E_ERROR, "Wrong parameter count for exception([string $exception [, long $code ]])");
|
||||
}
|
||||
|
||||
object = getThis();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+4
-15
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -177,8 +177,8 @@ static inline zval *_get_zval_ptr_var(znode *node, temp_variable *Ts, zend_free_
|
||||
should_free->var = ptr;
|
||||
|
||||
if (T->str_offset.str->type != IS_STRING
|
||||
|| ((int)T->str_offset.offset < 0)
|
||||
|| (T->str_offset.str->value.str.len <= (int)T->str_offset.offset)) {
|
||||
|| ((int)T->str_offset.offset<0)
|
||||
|| (T->str_offset.str->value.str.len <= T->str_offset.offset)) {
|
||||
zend_error(E_NOTICE, "Uninitialized string offset: %d", T->str_offset.offset);
|
||||
ptr->value.str.val = STR_EMPTY_ALLOC();
|
||||
ptr->value.str.len = 0;
|
||||
@@ -440,7 +440,6 @@ static inline void make_real_object(zval **object_ptr TSRMLS_DC)
|
||||
SEPARATE_ZVAL(object_ptr);
|
||||
}
|
||||
zend_error(E_STRICT, "Creating default object from empty value");
|
||||
zval_dtor(*object_ptr);
|
||||
object_init(*object_ptr);
|
||||
}
|
||||
}
|
||||
@@ -545,16 +544,6 @@ static inline void zend_assign_to_object(znode *result, zval **object_ptr, znode
|
||||
zval *value = get_zval_ptr(value_op, Ts, &free_value, BP_VAR_R);
|
||||
zval **retval = &T(result->u.var).var.ptr;
|
||||
|
||||
if (*object_ptr == EG(error_zval_ptr)) {
|
||||
FREE_OP(free_op2);
|
||||
if (!RETURN_VALUE_UNUSED(result)) {
|
||||
*retval = EG(uninitialized_zval_ptr);
|
||||
PZVAL_LOCK(*retval);
|
||||
}
|
||||
FREE_OP(free_value);
|
||||
return;
|
||||
}
|
||||
|
||||
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
|
||||
object = *object_ptr;
|
||||
|
||||
@@ -658,7 +647,7 @@ static inline void zend_assign_to_variable(znode *result, znode *op1, znode *op2
|
||||
zend_error(E_WARNING, "Illegal string offset: %d", T->str_offset.offset);
|
||||
break;
|
||||
}
|
||||
if ((int)T->str_offset.offset >= T->str_offset.str->value.str.len) {
|
||||
if (T->str_offset.offset >= T->str_offset.str->value.str.len) {
|
||||
zend_uint i;
|
||||
|
||||
if (T->str_offset.str->value.str.len==0) {
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+41
-113
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -46,12 +46,11 @@ ZEND_API zend_fcall_info_cache empty_fcall_info_cache = { 0, NULL, NULL, NULL };
|
||||
static WNDCLASS wc;
|
||||
static HWND timeout_window;
|
||||
static HANDLE timeout_thread_event;
|
||||
static HANDLE timeout_thread_handle;
|
||||
static DWORD timeout_thread_id;
|
||||
static int timeout_thread_initialized=0;
|
||||
#endif
|
||||
|
||||
#if 0&&ZEND_DEBUG
|
||||
#if ZEND_DEBUG
|
||||
static void (*original_sigsegv_handler)(int);
|
||||
static void zend_handle_sigsegv(int dummy)
|
||||
{
|
||||
@@ -95,27 +94,23 @@ static void zend_extension_deactivator(zend_extension *extension TSRMLS_DC)
|
||||
}
|
||||
|
||||
|
||||
static int clean_non_persistent_function(zend_function *function TSRMLS_DC)
|
||||
static int is_not_internal_function(zend_function *function TSRMLS_DC)
|
||||
{
|
||||
return (function->type == ZEND_INTERNAL_FUNCTION) ? ZEND_HASH_APPLY_STOP : ZEND_HASH_APPLY_REMOVE;
|
||||
if (function->type == ZEND_INTERNAL_FUNCTION) {
|
||||
return EG(full_tables_cleanup) ? 0 : ZEND_HASH_APPLY_STOP;
|
||||
} else {
|
||||
return EG(full_tables_cleanup) ? 1 : ZEND_HASH_APPLY_REMOVE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC)
|
||||
static int is_not_internal_class(zend_class_entry **ce TSRMLS_DC)
|
||||
{
|
||||
return (function->type != ZEND_INTERNAL_FUNCTION);
|
||||
}
|
||||
|
||||
|
||||
static int clean_non_persistent_class(zend_class_entry **ce TSRMLS_DC)
|
||||
{
|
||||
return ((*ce)->type == ZEND_INTERNAL_CLASS) ? ZEND_HASH_APPLY_STOP : ZEND_HASH_APPLY_REMOVE;
|
||||
}
|
||||
|
||||
|
||||
static int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC)
|
||||
{
|
||||
return ((*ce)->type != ZEND_INTERNAL_CLASS);
|
||||
if ((*ce)->type == ZEND_INTERNAL_CLASS) {
|
||||
return EG(full_tables_cleanup) ? 0 : ZEND_HASH_APPLY_STOP;
|
||||
} else {
|
||||
return EG(full_tables_cleanup) ? 1 : ZEND_HASH_APPLY_REMOVE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -255,22 +250,18 @@ void shutdown_executor(TSRMLS_D)
|
||||
So we want first of all to clean up all data and then move to tables destruction.
|
||||
Note that only run-time accessed data need to be cleaned up, pre-defined data can
|
||||
not contain objects and thus are not probelmatic */
|
||||
if (EG(full_tables_cleanup)) {
|
||||
zend_hash_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data_full TSRMLS_CC);
|
||||
} else {
|
||||
zend_hash_reverse_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data TSRMLS_CC);
|
||||
}
|
||||
zend_hash_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data TSRMLS_CC);
|
||||
zend_hash_apply(EG(class_table), (apply_func_t) zend_cleanup_class_data TSRMLS_CC);
|
||||
|
||||
zend_ptr_stack_destroy(&EG(argument_stack));
|
||||
|
||||
/* Destroy all op arrays */
|
||||
if (EG(full_tables_cleanup)) {
|
||||
zend_hash_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full TSRMLS_CC);
|
||||
zend_hash_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC);
|
||||
zend_hash_apply(EG(function_table), (apply_func_t) is_not_internal_function TSRMLS_CC);
|
||||
zend_hash_apply(EG(class_table), (apply_func_t) is_not_internal_class TSRMLS_CC);
|
||||
} else {
|
||||
zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function TSRMLS_CC);
|
||||
zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class TSRMLS_CC);
|
||||
zend_hash_reverse_apply(EG(function_table), (apply_func_t) is_not_internal_function TSRMLS_CC);
|
||||
zend_hash_reverse_apply(EG(class_table), (apply_func_t) is_not_internal_class TSRMLS_CC);
|
||||
}
|
||||
|
||||
while (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
|
||||
@@ -286,7 +277,7 @@ void shutdown_executor(TSRMLS_D)
|
||||
} zend_end_try();
|
||||
|
||||
zend_try {
|
||||
#if 0&&ZEND_DEBUG
|
||||
#if ZEND_DEBUG
|
||||
signal(SIGSEGV, original_sigsegv_handler);
|
||||
#endif
|
||||
|
||||
@@ -490,7 +481,7 @@ ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (const_value.type == IS_STRING && const_value.value.str.len == (int)str_index_len-1 &&
|
||||
if (const_value.type == IS_STRING && const_value.value.str.len == str_index_len-1 &&
|
||||
!strncmp(const_value.value.str.val, str_index, str_index_len)) {
|
||||
/* constant value is the same as its name */
|
||||
zval_dtor(&const_value);
|
||||
@@ -510,9 +501,17 @@ ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC)
|
||||
*element = new_val;
|
||||
|
||||
switch (const_value.type) {
|
||||
case IS_STRING:
|
||||
zend_symtable_update_current_key(p->value.ht, const_value.value.str.val, const_value.value.str.len+1);
|
||||
case IS_STRING: {
|
||||
long lval;
|
||||
double dval;
|
||||
|
||||
if (is_numeric_string(const_value.value.str.val, const_value.value.str.len, &lval, &dval, 0) == IS_LONG) {
|
||||
zend_hash_update_current_key(p->value.ht, HASH_KEY_IS_LONG, NULL, 0, lval);
|
||||
} else {
|
||||
zend_hash_update_current_key(p->value.ht, HASH_KEY_IS_STRING, const_value.value.str.val, const_value.value.str.len+1, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
zend_hash_update_current_key(p->value.ht, HASH_KEY_IS_LONG, NULL, 0, const_value.value.lval);
|
||||
@@ -590,14 +589,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
zend_op **original_opline_ptr;
|
||||
zend_class_entry *current_scope;
|
||||
zend_class_entry *calling_scope = NULL;
|
||||
zend_class_entry *check_scope_or_static = NULL;
|
||||
zval *current_this;
|
||||
zend_execute_data execute_data;
|
||||
zval *method_name;
|
||||
zval *params_array;
|
||||
int call_via_handler = 0;
|
||||
char *fname, *colon;
|
||||
int fname_len;
|
||||
|
||||
if (EG(exception)) {
|
||||
return FAILURE; /* we would result in an instable executor otherwise */
|
||||
@@ -616,7 +612,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
execute_data = *EG(current_execute_data);
|
||||
EX(op_array) = NULL;
|
||||
EX(opline) = NULL;
|
||||
EX(object) = NULL;
|
||||
} else {
|
||||
/* This only happens when we're called outside any execute()'s
|
||||
* It shouldn't be strictly necessary to NULL execute_data out,
|
||||
@@ -672,7 +667,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
ce = &(EG(active_op_array)->scope);
|
||||
found = (*ce != NULL?SUCCESS:FAILURE);
|
||||
fci->object_pp = EG(This)?&EG(This):NULL;
|
||||
EX(object) = EG(This);
|
||||
} else if (strcmp(Z_STRVAL_PP(fci->object_pp), "parent") == 0 && EG(active_op_array)) {
|
||||
|
||||
if (!EG(active_op_array)->scope) {
|
||||
@@ -684,7 +678,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
ce = &(EG(active_op_array)->scope->parent);
|
||||
found = (*ce != NULL?SUCCESS:FAILURE);
|
||||
fci->object_pp = EG(This)?&EG(This):NULL;
|
||||
EX(object) = EG(This);
|
||||
} else {
|
||||
zend_class_entry *scope;
|
||||
scope = EG(active_op_array) ? EG(active_op_array)->scope : NULL;
|
||||
@@ -697,7 +690,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
instanceof_function(Z_OBJCE_P(EG(This)), scope TSRMLS_CC) &&
|
||||
instanceof_function(scope, *ce TSRMLS_CC)) {
|
||||
fci->object_pp = &EG(This);
|
||||
EX(object) = EG(This);
|
||||
} else {
|
||||
fci->object_pp = NULL;
|
||||
}
|
||||
@@ -721,67 +713,30 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
fname = Z_STRVAL_P(fci->function_name);
|
||||
fname_len = Z_STRLEN_P(fci->function_name);
|
||||
if (calling_scope && (colon = strstr(fname, "::")) != NULL) {
|
||||
int clen = colon - fname;
|
||||
int mlen = fname_len - clen - 2;
|
||||
zend_class_entry **pce, *ce_child = NULL;
|
||||
if (zend_lookup_class(fname, clen, &pce TSRMLS_CC) == SUCCESS) {
|
||||
ce_child = *pce;
|
||||
} else {
|
||||
char *lcname = zend_str_tolower_dup(fname, clen);
|
||||
/* caution: lcname is not '\0' terminated */
|
||||
if (calling_scope) {
|
||||
if (clen == sizeof("self") - 1 && memcmp(lcname, "self", sizeof("self") - 1) == 0) {
|
||||
ce_child = EG(active_op_array) ? EG(active_op_array)->scope : NULL;
|
||||
} else if (clen == sizeof("parent") - 1 && memcmp(lcname, "parent", sizeof("parent") - 1) == 0 && EG(active_op_array)->scope) {
|
||||
ce_child = EG(active_op_array) && EG(active_op_array)->scope ? EG(scope)->parent : NULL;
|
||||
}
|
||||
}
|
||||
efree(lcname);
|
||||
}
|
||||
if (!ce_child) {
|
||||
zend_error(E_ERROR, "Cannot call method %s() or method does not exist", fname);
|
||||
return FAILURE;
|
||||
}
|
||||
check_scope_or_static = calling_scope;
|
||||
fci->function_table = &ce_child->function_table;
|
||||
calling_scope = ce_child;
|
||||
fname = fname + clen + 2;
|
||||
fname_len = mlen;
|
||||
}
|
||||
|
||||
if (fci->object_pp) {
|
||||
if (Z_OBJ_HT_PP(fci->object_pp)->get_method == NULL) {
|
||||
zend_error(E_ERROR, "Object does not support method calls");
|
||||
}
|
||||
EX(function_state).function =
|
||||
Z_OBJ_HT_PP(fci->object_pp)->get_method(fci->object_pp, fname, fname_len TSRMLS_CC);
|
||||
Z_OBJ_HT_PP(fci->object_pp)->get_method(fci->object_pp, Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name) TSRMLS_CC);
|
||||
if (EX(function_state).function && calling_scope != EX(function_state).function->common.scope) {
|
||||
char *function_name_lc = zend_str_tolower_dup(fname, fname_len);
|
||||
if (zend_hash_find(&calling_scope->function_table, function_name_lc, fname_len+1, (void **) &EX(function_state).function)==FAILURE) {
|
||||
char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
|
||||
if (zend_hash_find(&calling_scope->function_table, function_name_lc, fci->function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {
|
||||
efree(function_name_lc);
|
||||
zend_error(E_ERROR, "Cannot call method %s::%s() or method does not exist", calling_scope->name, fname);
|
||||
zend_error(E_ERROR, "Cannot call method %s::%s() or method does not exist", calling_scope->name, Z_STRVAL_P(fci->function_name));
|
||||
}
|
||||
efree(function_name_lc);
|
||||
}
|
||||
} else if (calling_scope) {
|
||||
char *function_name_lc = zend_str_tolower_dup(fname, fname_len);
|
||||
char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
|
||||
|
||||
EX(function_state).function =
|
||||
zend_std_get_static_method(calling_scope, function_name_lc, fname_len TSRMLS_CC);
|
||||
zend_std_get_static_method(calling_scope, function_name_lc, Z_STRLEN_P(fci->function_name) TSRMLS_CC);
|
||||
efree(function_name_lc);
|
||||
if (check_scope_or_static && EX(function_state).function
|
||||
&& !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC)
|
||||
&& !instanceof_function(check_scope_or_static, calling_scope TSRMLS_CC)) {
|
||||
zend_error(E_ERROR, "Cannot call method %s() of class %s which is not a derived from %s", fname, calling_scope->name, check_scope_or_static->name);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
char *function_name_lc = zend_str_tolower_dup(fname, fname_len);
|
||||
char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
|
||||
|
||||
if (zend_hash_find(fci->function_table, function_name_lc, fname_len+1, (void **) &EX(function_state).function)==FAILURE) {
|
||||
if (zend_hash_find(fci->function_table, function_name_lc, fci->function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {
|
||||
EX(function_state).function = NULL;
|
||||
}
|
||||
efree(function_name_lc);
|
||||
@@ -814,19 +769,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
EX(function_state).function = fci_cache->function_handler;
|
||||
calling_scope = fci_cache->calling_scope;
|
||||
fci->object_pp = fci_cache->object_pp;
|
||||
EX(object) = fci->object_pp ? *fci->object_pp : NULL;
|
||||
}
|
||||
|
||||
if (EX(function_state).function->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) {
|
||||
if (EX(function_state).function->common.fn_flags & ZEND_ACC_ABSTRACT) {
|
||||
zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
|
||||
}
|
||||
if (EX(function_state).function->common.fn_flags & ZEND_ACC_DEPRECATED) {
|
||||
zend_error(E_STRICT, "Function %s%s%s() is deprecated",
|
||||
EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name : "",
|
||||
EX(function_state).function->common.scope ? "::" : "",
|
||||
EX(function_state).function->common.function_name);
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<fci->param_count; i++) {
|
||||
@@ -978,7 +920,7 @@ ZEND_API int zend_lookup_class_ex(char *name, int name_length, int use_autoload,
|
||||
zval **args[1];
|
||||
zval autoload_function;
|
||||
zval *class_name_ptr;
|
||||
zval *retval_ptr = NULL;
|
||||
zval *retval_ptr;
|
||||
int retval;
|
||||
char *lc_name;
|
||||
zval *exception;
|
||||
@@ -1061,8 +1003,6 @@ ZEND_API int zend_lookup_class_ex(char *name, int name_length, int use_autoload,
|
||||
}
|
||||
if (!EG(exception)) {
|
||||
EG(exception) = exception;
|
||||
}
|
||||
if (retval_ptr) {
|
||||
zval_ptr_dtor(&retval_ptr);
|
||||
}
|
||||
|
||||
@@ -1175,8 +1115,6 @@ void execute_new_code(TSRMLS_D)
|
||||
INIT_ZVAL(ret_opline->op1.u.constant);
|
||||
SET_UNUSED(ret_opline->op2);
|
||||
|
||||
zend_do_handle_exception(TSRMLS_C);
|
||||
|
||||
if (!CG(active_op_array)->start_op) {
|
||||
CG(active_op_array)->start_op = CG(active_op_array)->opcodes;
|
||||
}
|
||||
@@ -1215,11 +1153,7 @@ void execute_new_code(TSRMLS_D)
|
||||
zval_ptr_dtor(&local_retval);
|
||||
}
|
||||
|
||||
if (EG(exception)) {
|
||||
zend_exception_error(EG(exception) TSRMLS_CC);
|
||||
}
|
||||
|
||||
CG(active_op_array)->last -= 2; /* get rid of that ZEND_RETURN and ZEND_HANDLE_EXCEPTION */
|
||||
CG(active_op_array)->last--; /* get rid of that ZEND_RETURN */
|
||||
CG(active_op_array)->start_op = CG(active_op_array)->opcodes+CG(active_op_array)->last;
|
||||
}
|
||||
|
||||
@@ -1315,7 +1249,6 @@ static unsigned __stdcall timeout_thread_proc(void *pArgs)
|
||||
}
|
||||
DestroyWindow(timeout_window);
|
||||
UnregisterClass(wc.lpszClassName, NULL);
|
||||
SetEvent(timeout_thread_handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1323,7 +1256,6 @@ static unsigned __stdcall timeout_thread_proc(void *pArgs)
|
||||
void zend_init_timeout_thread()
|
||||
{
|
||||
timeout_thread_event = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
timeout_thread_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
_beginthreadex(NULL, 0, timeout_thread_proc, NULL, 0, &timeout_thread_id);
|
||||
WaitForSingleObject(timeout_thread_event, INFINITE);
|
||||
}
|
||||
@@ -1335,10 +1267,6 @@ void zend_shutdown_timeout_thread()
|
||||
return;
|
||||
}
|
||||
PostThreadMessage(timeout_thread_id, WM_QUIT, 0, 0);
|
||||
|
||||
/* Wait for thread termination */
|
||||
WaitForSingleObject(timeout_thread_handle, 5000);
|
||||
CloseHandle(timeout_thread_handle);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-6
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -144,11 +144,6 @@ struct _zend_compiler_globals {
|
||||
zend_encoding_converter encoding_converter;
|
||||
zend_encoding_oddlen encoding_oddlen;
|
||||
#endif /* ZEND_MULTIBYTE */
|
||||
|
||||
#ifdef ZTS
|
||||
HashTable **static_members;
|
||||
int last_static_member;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+19
-17
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -102,14 +102,14 @@ ZEND_API ulong zend_hash_func(char *arKey, uint nKeyLength)
|
||||
|
||||
#define UPDATE_DATA(ht, p, pData, nDataSize) \
|
||||
if (nDataSize == sizeof(void*)) { \
|
||||
if ((p)->pData != &(p)->pDataPtr) { \
|
||||
pefree_rel((p)->pData, (ht)->persistent); \
|
||||
if (!(p)->pDataPtr) { \
|
||||
pefree_rel((p)->pData, (ht)->persistent); \
|
||||
} \
|
||||
memcpy(&(p)->pDataPtr, pData, sizeof(void *)); \
|
||||
(p)->pData = &(p)->pDataPtr; \
|
||||
} else { \
|
||||
if ((p)->pData == &(p)->pDataPtr) { \
|
||||
(p)->pData = (void *) pemalloc_rel(nDataSize, (ht)->persistent); \
|
||||
if ((p)->pDataPtr) { \
|
||||
(p)->pData = (void *) pemalloc_rel(nDataSize, (ht)->persistent); \
|
||||
(p)->pDataPtr=NULL; \
|
||||
} else { \
|
||||
(p)->pData = (void *) perealloc_rel((p)->pData, nDataSize, (ht)->persistent); \
|
||||
@@ -123,9 +123,9 @@ ZEND_API ulong zend_hash_func(char *arKey, uint nKeyLength)
|
||||
memcpy(&(p)->pDataPtr, pData, sizeof(void *)); \
|
||||
(p)->pData = &(p)->pDataPtr; \
|
||||
} else { \
|
||||
(p)->pData = (void *) pemalloc_rel(nDataSize, (ht)->persistent);\
|
||||
(p)->pData = (void *) pemalloc_rel(nDataSize, (ht)->persistent); \
|
||||
if (!(p)->pData) { \
|
||||
pefree_rel(p, (ht)->persistent); \
|
||||
pefree_rel(p, (ht)->persistent); \
|
||||
return FAILURE; \
|
||||
} \
|
||||
memcpy((p)->pData, pData, nDataSize); \
|
||||
@@ -461,10 +461,8 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen
|
||||
|
||||
p = ht->arBuckets[nIndex];
|
||||
while (p != NULL) {
|
||||
if ((p->h == h)
|
||||
&& (p->nKeyLength == nKeyLength)
|
||||
&& ((p->nKeyLength == 0) /* Numeric index (short circuits the memcmp() check) */
|
||||
|| !memcmp(p->arKey, arKey, nKeyLength))) { /* String index */
|
||||
if ((p->h == h) && ((p->nKeyLength == 0) || /* Numeric index */
|
||||
((p->nKeyLength == nKeyLength) && (!memcmp(p->arKey, arKey, nKeyLength))))) {
|
||||
HANDLE_BLOCK_INTERRUPTIONS();
|
||||
if (p == ht->arBuckets[nIndex]) {
|
||||
ht->arBuckets[nIndex] = p->pNext;
|
||||
@@ -491,7 +489,7 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen
|
||||
if (ht->pDestructor) {
|
||||
ht->pDestructor(p->pData);
|
||||
}
|
||||
if (p->pData != &p->pDataPtr) {
|
||||
if (!p->pDataPtr) {
|
||||
pefree(p->pData, ht->persistent);
|
||||
}
|
||||
pefree(p, ht->persistent);
|
||||
@@ -520,7 +518,7 @@ ZEND_API void zend_hash_destroy(HashTable *ht)
|
||||
if (ht->pDestructor) {
|
||||
ht->pDestructor(q->pData);
|
||||
}
|
||||
if (q->pData != &q->pDataPtr) {
|
||||
if (!q->pDataPtr && q->pData) {
|
||||
pefree(q->pData, ht->persistent);
|
||||
}
|
||||
pefree(q, ht->persistent);
|
||||
@@ -546,7 +544,7 @@ ZEND_API void zend_hash_clean(HashTable *ht)
|
||||
if (ht->pDestructor) {
|
||||
ht->pDestructor(q->pData);
|
||||
}
|
||||
if (q->pData != &q->pDataPtr) {
|
||||
if (!q->pDataPtr && q->pData) {
|
||||
pefree(q->pData, ht->persistent);
|
||||
}
|
||||
pefree(q, ht->persistent);
|
||||
@@ -575,7 +573,7 @@ static Bucket *zend_hash_apply_deleter(HashTable *ht, Bucket *p)
|
||||
if (ht->pDestructor) {
|
||||
ht->pDestructor(p->pData);
|
||||
}
|
||||
if (p->pData != &p->pDataPtr) {
|
||||
if (!p->pDataPtr) {
|
||||
pefree(p->pData, ht->persistent);
|
||||
}
|
||||
retval = p->pListNext;
|
||||
@@ -734,7 +732,11 @@ ZEND_API void zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func TSR
|
||||
q = p;
|
||||
p = p->pListLast;
|
||||
if (result & ZEND_HASH_APPLY_REMOVE) {
|
||||
zend_hash_apply_deleter(ht, q);
|
||||
if (q->nKeyLength>0) {
|
||||
zend_hash_del(ht, q->arKey, q->nKeyLength);
|
||||
} else {
|
||||
zend_hash_index_del(ht, q->h);
|
||||
}
|
||||
}
|
||||
if (result & ZEND_HASH_APPLY_STOP) {
|
||||
break;
|
||||
@@ -1257,7 +1259,7 @@ ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func,
|
||||
|
||||
ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC)
|
||||
{
|
||||
Bucket *p1, *p2 = NULL;
|
||||
Bucket *p1, *p2;
|
||||
int result;
|
||||
void *pData2;
|
||||
|
||||
|
||||
+1
-7
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -353,12 +353,6 @@ static inline int zend_symtable_exists(HashTable *ht, char *arKey, uint nKeyLeng
|
||||
return zend_hash_exists(ht, arKey, nKeyLength);
|
||||
}
|
||||
|
||||
static inline int zend_symtable_update_current_key(HashTable *ht, char *arKey, uint nKeyLength)
|
||||
{
|
||||
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_update_current_key(ht, HASH_KEY_IS_LONG, NULL, 0, idx));
|
||||
return zend_hash_update_current_key(ht, HASH_KEY_IS_STRING, arKey, nKeyLength, 0);
|
||||
}
|
||||
|
||||
#endif /* ZEND_HASH_H */
|
||||
|
||||
/*
|
||||
|
||||
+19
-19
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -94,7 +94,7 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
|
||||
int token_type;
|
||||
char *last_color = syntax_highlighter_ini->highlight_html;
|
||||
char *next_color;
|
||||
int in_string=0;
|
||||
int in_string=0, post_heredoc = 0;
|
||||
|
||||
zend_printf("<code>");
|
||||
zend_printf("<span style=\"color: %s\">\n", last_color);
|
||||
@@ -151,16 +151,19 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
|
||||
switch (token_type) {
|
||||
case T_END_HEREDOC:
|
||||
zend_html_puts(token.value.str.val, token.value.str.len TSRMLS_CC);
|
||||
post_heredoc = 1;
|
||||
break;
|
||||
default:
|
||||
zend_html_puts(LANG_SCNG(yy_text), LANG_SCNG(yy_leng) TSRMLS_CC);
|
||||
if (post_heredoc) {
|
||||
zend_html_putc('\n');
|
||||
post_heredoc = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (token.type == IS_STRING) {
|
||||
switch (token_type) {
|
||||
case EOF:
|
||||
goto done;
|
||||
case T_OPEN_TAG:
|
||||
case T_OPEN_TAG_WITH_ECHO:
|
||||
case T_CLOSE_TAG:
|
||||
@@ -177,7 +180,6 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
|
||||
}
|
||||
token.type = 0;
|
||||
}
|
||||
done:
|
||||
if (last_color != syntax_highlighter_ini->highlight_html) {
|
||||
zend_printf("</span>\n");
|
||||
}
|
||||
@@ -206,22 +208,20 @@ ZEND_API void zend_strip(TSRMLS_D)
|
||||
case T_DOC_COMMENT:
|
||||
token.type = 0;
|
||||
continue;
|
||||
|
||||
case EOF:
|
||||
return;
|
||||
|
||||
case T_END_HEREDOC:
|
||||
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
|
||||
efree(token.value.str.val);
|
||||
/* read the following character, either newline or ; */
|
||||
if (lex_scan(&token TSRMLS_CC) != T_WHITESPACE) {
|
||||
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
|
||||
}
|
||||
zend_write("\n", sizeof("\n") - 1);
|
||||
prev_space = 1;
|
||||
token.type = 0;
|
||||
continue;
|
||||
case T_END_HEREDOC: {
|
||||
char *ptr = LANG_SCNG(yy_text);
|
||||
|
||||
zend_write(ptr, LANG_SCNG(yy_leng) - 1);
|
||||
/* The ensure that we only write one ; and that it followed by the required newline */
|
||||
zend_write("\n", sizeof("\n") - 1);
|
||||
if (ptr[LANG_SCNG(yy_leng) - 1] == ';') {
|
||||
lex_scan(&token TSRMLS_CC);
|
||||
}
|
||||
efree(token.value.str.val);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
|
||||
break;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -249,26 +249,25 @@ string_or_value:
|
||||
expr { $$ = $1; }
|
||||
| CFG_TRUE { $$ = $1; }
|
||||
| CFG_FALSE { $$ = $1; }
|
||||
| var_string_list { $$ = $1; }
|
||||
| '\n' { zend_ini_init_string(&$$); }
|
||||
| /* empty */ { zend_ini_init_string(&$$); }
|
||||
;
|
||||
|
||||
|
||||
var_string_list:
|
||||
cfg_var_ref { $$ = $1; }
|
||||
| TC_ENCAPSULATED_STRING { $$ = $1; }
|
||||
| constant_string { $$ = $1; }
|
||||
| var_string_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
|
||||
var_string_list cfg_var_ref { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
|
||||
| var_string_list TC_ENCAPSULATED_STRING { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
|
||||
| var_string_list constant_string { zend_ini_add_string(&$$, &$1, &$2); free($2.value.str.val); }
|
||||
| var_string_list constant_string { zend_ini_add_string(&$$, &$1, &$2); }
|
||||
| /* empty */ { zend_ini_init_string(&$$); }
|
||||
;
|
||||
|
||||
cfg_var_ref:
|
||||
TC_DOLLAR_CURLY TC_STRING '}' { zend_ini_get_var(&$$, &$2); free($2.value.str.val); }
|
||||
TC_DOLLAR_CURLY TC_STRING '}' { zend_ini_get_var(&$$, &$2); }
|
||||
;
|
||||
|
||||
expr:
|
||||
var_string_list { $$ = $1; }
|
||||
constant_string { $$ = $1; }
|
||||
| expr '|' expr { zend_ini_do_op('|', &$$, &$1, &$3); }
|
||||
| expr '&' expr { zend_ini_do_op('&', &$$, &$1, &$3); }
|
||||
| '~' expr { zend_ini_do_op('~', &$$, &$2, NULL); }
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
+1
-11
@@ -3,7 +3,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -139,18 +139,8 @@ NEWLINE ("\r"|"\n"|"\r\n")
|
||||
|
||||
|
||||
<INITIAL>["][^"]*["] {
|
||||
char *p = yytext;
|
||||
|
||||
/* ENCAPSULATED TC_STRING */
|
||||
|
||||
while ((p = strpbrk(p, "\r\n"))) {
|
||||
if (*p == '\r' && *(p + 1) == '\n') {
|
||||
p++;
|
||||
}
|
||||
SCNG(lineno)++;
|
||||
p++;
|
||||
}
|
||||
|
||||
/* eat trailing " */
|
||||
yytext[yyleng-1]=0;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
@@ -287,7 +287,7 @@ static zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce,
|
||||
if (!ce || !ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) {
|
||||
if (!EG(exception))
|
||||
{
|
||||
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce ? ce->name : Z_OBJCE_P(object)->name);
|
||||
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce->name);
|
||||
}
|
||||
if (iterator)
|
||||
{
|
||||
@@ -336,7 +336,7 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
|
||||
} else if (class_type->get_iterator != zend_user_it_get_new_iterator) {
|
||||
/* c-level get_iterator cannot be changed (exception being only Traversable is implmented) */
|
||||
if (class_type->num_interfaces) {
|
||||
for (i = 0; i < (int)class_type->num_interfaces; i++) {
|
||||
for (i = 0; i < class_type->num_interfaces; i++) {
|
||||
if (class_type->interfaces[i] == zend_ce_iterator) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+----------------------------------------------------------------------+
|
||||
| Zend Engine |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
| Copyright (c) 1998-2005 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
||||
Loaded 100 of 1621 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user