Compare commits

..
Author SHA1 Message Date
Stanislav Malyshev 46ee0e087e Revert "Fixed Bug #67724"
This reverts commit e4ff7f2ee3.
Reverted since it causes https://bugs.php.net/bug.php?id=67865
2014-08-20 13:15:22 -07:00
3339 changed files with 210362 additions and 408834 deletions

No files matched your search

+216 -179
View File
@@ -48,80 +48,110 @@ define print_cvs
end
define dump_bt
set $ex = $arg0->prev_execute_data
while $ex
printf "[%p] ", $ex
set $func = $ex->func
if $func
if $ex->object
if $func->common.scope
printf "%s->", $func->common.scope->name->val
set $t = $arg0
while $t
printf "[%p] ", $t
set $fst = $t->function_state
if $fst.function->common.function_name
if $fst.arguments
set $count = (int)*($fst.arguments)
if $t->object
if $fst.function.common.scope
printf "%s->", $fst.function.common.scope->name
else
if !$eg
____executor_globals
end
set $known_class = 0
if $eg
set $handle = $t->object.value.obj.handle
set $handlers = $t->object.value.obj.handlers
set $zobj = (zend_object *)$eg.objects_store.object_buckets[$handle].bucket.obj.object
if $handlers->get_class_entry == &zend_std_object_get_class
set $known_class = 1
if $handlers.get_class_name
if $handlers.get_class_name != &zend_std_object_get_class_name
set $known_class = 0
end
end
if $known_class
printf "%s->", $zobj->ce.name
end
end
end
if !$known_class
printf "(Unknown)->"
end
end
else
printf "%s->", $ex->object->ce.name->val
if $fst.function.common.scope
printf "%s::", $fst.function.common.scope->name
end
end
printf "%s(", $fst.function->common.function_name
while $count > 0
set $zvalue = *(zval **)($fst.arguments - $count)
set $type = $zvalue->type
if $type == 0
printf "NULL"
end
if $type == 1
printf "%ld", $zvalue->value.lval
end
if $type == 2
printf "%lf", $zvalue->value.dval
end
if $type == 3
if $zvalue->value.lval
printf "true"
else
printf "false"
end
end
if $type == 4
printf "array(%d)[%p]", $zvalue->value.ht->nNumOfElements, $zvalue
end
if $type == 5
printf "object[%p]", $zvalue
end
if $type == 6
____print_str $zvalue->value.str.val $zvalue->value.str.len
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
end
set $count = $count -1
if $count > 0
printf ", "
end
end
printf ") "
else
if $func->common.scope
printf "%s::", $func->common.scope->name->val
end
printf "%s() ", $fst.function->common.function_name
end
printf "%s(", $func->common.function_name->val
set $callFrameSize = (sizeof(zend_execute_data) + sizeof(zval) - 1) / sizeof(zval)
set $count = $ex->num_args
set $arg = 0
while $arg < $count
if $arg > 0
printf ", "
end
set $zvalue = (zval *) $ex + $callFrameSize + $arg
set $type = $zvalue->u1.v.type
if $type == 1
printf "NULL"
end
if $type == 2
printf "false"
end
if $type == 3
printf "true"
end
if $type == 4
printf "%ld", $zvalue->value.lval
end
if $type == 5
printf "%f", $zvalue->value.dval
end
if $type == 6
____print_str $zvalue->value.str->val $zvalue->value.str->len
end
if $type == 7
printf "array(%d)[%p]", $zvalue->value.arr->ht->nNumOfElements, $zvalue
end
if $type == 8
printf "object[%p]", $zvalue
end
if $type == 9
printf "resource(#%d)", $zvalue->value.lval
end
if $type == 10
printf "reference"
end
if $type > 10
printf "unknown type %d", $type
end
set $arg = $arg + 1
end
printf ") "
else
printf "??? "
end
if $func != 0
printf "%s:%d ", $func->op_array.filename->val, $ex->opline->lineno
if $t->op_array != 0
printf "%s:%d ", $t->op_array->filename, $t->opline->lineno
end
set $ex = $ex->prev_execute_data
set $t = $t->prev_execute_data
printf "\n"
end
end
@@ -141,37 +171,34 @@ end
define ____printzv_contents
set $zvalue = $arg0
set $type = $zvalue->u1.v.type
set $type = $zvalue->type
# 15 == IS_INDIRECT
if $type >= 5 && $type != 15
printf "(refcount=%d) ", $zvalue->value.counted->refcount
printf "(refcount=%d", $zvalue->refcount__gc
if $zvalue->is_ref__gc
printf ",is_ref"
end
printf ") "
if $type == 0
printf "UNDEF"
printf "NULL"
end
if $type == 1
printf "NULL"
printf "long: %ld", $zvalue->value.lval
end
if $type == 2
printf "bool: false"
printf "double: %lf", $zvalue->value.dval
end
if $type == 3
printf "bool: true"
printf "bool: "
if $zvalue->value.lval
printf "true"
else
printf "false"
end
end
if $type == 4
printf "long: %ld", $zvalue->value.lval
end
if $type == 5
printf "double: %f", $zvalue->value.dval
end
if $type == 6
printf "string: %s", $zvalue->value.str->val
end
if $type == 7
printf "array: "
if $type == 4
printf "array(%d): ", $zvalue->value.ht->nNumOfElements
if ! $arg1
printf "{\n"
set $ind = $ind + 1
____print_ht $zvalue->value.ht 1
set $ind = $ind - 1
@@ -180,21 +207,32 @@ define ____printzv_contents
printf " "
set $i = $i - 1
end
printf "}"
end
set $type = 0
end
if $type == 8
if $type == 5
printf "object"
____executor_globals
set $handle = $zvalue->value.obj.handle
set $handlers = $zvalue->value.obj.handlers
set $zobj = $zvalue->value.obj
set $cname = $zobj->ce->name->val
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 ! $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 1
set $ind = $ind - 1
@@ -203,6 +241,7 @@ define ____printzv_contents
printf " "
set $i = $i - 1
end
printf "}"
else
echo "no properties found"
end
@@ -210,36 +249,20 @@ define ____printzv_contents
end
set $type = 0
end
if $type == 6
printf "string(%d): ", $zvalue->value.str.len
____print_str $zvalue->value.str.val $zvalue->value.str.len
end
if $type == 7
printf "resource: #%d", $zvalue->value.lval
end
if $type == 8
printf "constant"
end
if $type == 9
printf "resource: #%d", $zvalue->value.res->handle
printf "const_array"
end
if $type == 10
printf "reference: "
____printzv &$zvalue->value.ref->val $arg1
end
if $type == 11
printf "const: %s", $zvalue->value.str->val
end
if $type == 12
printf "const_ast"
end
if $type == 13
printf "_IS_BOOL"
end
if $type == 14
printf "IS_CALLABLE"
end
if $type == 15
printf "indirect: "
____printzv $zvalue->value.zv $arg1
end
if $type == 16
printf "string_offset"
end
if $type == 17
printf "pointer: %p", $zvalue->value.ptr
end
if $type > 17
if $type > 9
printf "unknown type %d", $type
end
printf "\n"
@@ -251,6 +274,10 @@ define ____printzv
printf "[%p] ", $zvalue
if $zvalue == $eg.uninitialized_zval_ptr
printf "*uninitialized* "
end
set $zcontents = (zval*) $zvalue
if $arg1
____printzv_contents $zcontents $arg1
@@ -293,60 +320,42 @@ end
define ____print_ht
set $ht = (HashTable*)$arg0
set $n = $ind
while $n > 0
printf " "
set $n = $n - 1
end
set $p = $ht->pListHead
if $ht->u.v.flags & 4
printf "Packed"
else
printf "Hash"
end
printf "(%d)[%p]: {\n", $ht->nNumOfElements, $ht
set $num = $ht->nNumUsed
set $i = 0
set $ind = $ind + 1
while $i < $num
set $p = (Bucket*)($ht->arData + $i)
set $n = $ind
if $p->val.u1.v.type > 0
while $n > 0
printf " "
set $n = $n - 1
end
printf "[%d] ", $i
if $p->key
printf "%s => ", $p->key->val
else
printf "%d => ", $p->h
end
if $arg1 == 0
printf "%p\n", (zval *)&$p->val
end
if $arg1 == 1
set $zval = (zval *)&$p->val
____printzv $zval 1
end
if $arg1 == 2
printf "%s\n", (char*)$p->val.value.ptr
end
if $arg1 == 3
set $func = (zend_function*)$p->val.value.ptr
printf "\"%s\"\n", $func->common.function_name->val
end
while $p != 0
set $i = $ind
while $i > 0
printf " "
set $i = $i - 1
end
set $i = $i + 1
if $p->nKeyLength > 0
____print_str $p->arKey $p->nKeyLength
printf " => "
else
printf "%d => ", $p->h
end
if $arg1 == 0
printf "%p\n", (void*)$p->pData
end
if $arg1 == 1
set $zval = *(zval **)$p->pData
____printzv $zval 1
end
if $arg1 == 2
printf "%s\n", (char*)$p->pData
end
set $p = $p->pListNext
end
set $ind = $ind - 1
printf "}\n"
end
define print_ht
set $ind = 0
set $ind = 1
printf "[%p] {\n", $arg0
____print_ht $arg0 1
printf "}\n"
end
document print_ht
@@ -354,8 +363,10 @@ document print_ht
end
define print_htptr
set $ind = 0
set $ind = 1
printf "[%p] {\n", $arg0
____print_ht $arg0 0
printf "}\n"
end
document print_htptr
@@ -363,17 +374,46 @@ document print_htptr
end
define print_htstr
set $ind = 0
set $ind = 1
printf "[%p] {\n", $arg0
____print_ht $arg0 2
printf "}\n"
end
document print_htstr
dumps elements of HashTable made of strings
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
____print_str $p->arKey $p->nKeyLength
printf " => "
else
printf "%d => ", $p->h
end
printf "\"%s\"\n", $func->common.function_name
set $p = $p->pListNext
end
end
define print_ft
set $ind = 0
____print_ht $arg0 3
set $ind = 1
printf "[%p] {\n", $arg0
____print_ft $arg0
printf "}\n"
end
document print_ft
@@ -389,15 +429,15 @@ define ____print_inh_class
printf "final "
end
end
printf "class %s", $ce->name->val
printf "class %s", $ce->name
if $ce->parent != 0
printf " extends %s", $ce->parent->name->val
printf " extends %s", $ce->parent->name
end
if $ce->num_interfaces != 0
printf " implements"
set $tmp = 0
while $tmp < $ce->num_interfaces
printf " %s", $ce->interfaces[$tmp]->name->val
printf " %s", $ce->interfaces[$tmp]->name
set $tmp = $tmp + 1
if $tmp < $ce->num_interfaces
printf ","
@@ -409,10 +449,10 @@ end
define ____print_inh_iface
set $ce = $arg0
printf "interface %s", $ce->name->val
printf "interface %s", $ce->name
if $ce->num_interfaces != 0
set $ce = $ce->interfaces[0]
printf " extends %s", $ce->name->val
printf " extends %s", $ce->name
else
set $ce = 0
end
@@ -476,7 +516,7 @@ define ____print_str
set $tmp = 0
set $str = $arg0
printf "\""
while $tmp < $arg1 && $tmp < 256
while $tmp < $arg1
if $str[$tmp] > 32 && $str[$tmp] < 127
printf "%c", $str[$tmp]
else
@@ -484,9 +524,6 @@ define ____print_str
end
set $tmp = $tmp + 1
end
if $tmp != $arg1
printf "..."
end
printf "\""
end
@@ -581,9 +618,9 @@ define zmemcheck
if $p->magic == 0xfb8277dc
set $stat = "CACHED"
end
set $filename = strrchr($p->filename->val, '/')
set $filename = strrchr($p->filename, '/')
if !$filename
set $filename = $p->filename->val
set $filename = $p->filename
else
set $filename = $filename + 1
end
-2
View File
@@ -27,8 +27,6 @@ ext/ldap/ldap.c ident
ext/pdo_pgsql/pdo_pgsql.c ident
ext/tidy/tidy.c ident
NEWS merge=NEWS
UPGRADING merge=NEWS
UPGRADING.INTERNALS merge=NEWS
/ext/bz2/tests/with_strings.phpt -crlf
/ext/dom/tests/bug40836.phpt -crlf
/ext/dom/tests/domelement.phpt -crlf
-4
View File
@@ -96,8 +96,6 @@ stamp-h.in
scan_makefile_in.awk
TSRM/tsrm_config.h
Zend/zend_config.h
Zend/zend_dtrace_gen.h
Zend/zend_dtrace_gen.hbak
Zend/zend_ini_parser.c
Zend/zend_ini_parser.h
Zend/zend_ini_parser.output
@@ -246,8 +244,6 @@ sapi/fpm/php-fpm.1
sapi/fpm/init.d.php-fpm
sapi/fpm/php-fpm.conf
sapi/fpm/fpm/php-cgi
sapi/phpdbg/phpdbg_parser.c
sapi/phpdbg/phpdbg_parser.h
sapi/phpdbg/phpdbg
scripts/php-config
scripts/phpize
+3 -43
View File
@@ -1,49 +1,9 @@
language: php
php:
# We only specify one version so we only get one worker
- 5.4
branches:
except:
- phpng
- /^PHP-5\.3.*/
- /^PHP-5\.4.*/
notifications:
email:
on_failure: change
cache:
- apt
env:
global:
- MYSQL_TEST_HOST=127.0.0.1
- MYSQL_TEST_USER=travis
- PDO_MYSQL_TEST_DSN="mysql:host=127.0.0.1;dbname=test"
- PDO_MYSQL_TEST_USER=travis
- PDO_MYSQL_TEST_PASS=
- PDO_MYSQL_TEST_HOST=127.0.0.1
- REPORT_EXIT_STATUS=1
matrix:
- ENABLE_MAINTAINER_ZTS=0 ENABLE_DEBUG=0
- ENABLE_MAINTAINER_ZTS=1 ENABLE_DEBUG=1
before_install:
- sudo apt-get update -qq
- sudo apt-get install -y libenchant-dev libaspell-dev libpspell-dev librecode-dev
- sudo cp ./travis/de /var/lib/locales/supported.d/de
- sudo dpkg-reconfigure locales
before_script:
# Compile PHP
- ./travis/compile.sh
# Setup Extensions
- . ./travis/ext/mysql/setup.sh
- . ./travis/ext/mysqli/setup.sh
- . ./travis/ext/pdo_mysql/setup.sh
- . ./travis/ext/pgsql/setup.sh
- . ./travis/ext/pdo_pgsql/setup.sh
# Run PHPs run-tests.php
script:
- ./sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --show-diff --set-timeout 120
email: false
+1 -4
View File
@@ -279,10 +279,7 @@ The file labelled 'EXPERIMENTAL' should include the following
information::
Any authoring information (known bugs, future directions of the module).
Ongoing status notes which may not be appropriate for Git comments.
In general new features should go to PECL or experimental branches until
there are specific reasons for directly adding it to the core distribution.
Ongoing status notes which may not be appropriate for SVN comments.
Aliases & Legacy Documentation
-----------------------------------
+2 -2
View File
@@ -147,7 +147,7 @@ STATUS: Working
COMMENT: Tested on phpts and isapi versions
-------------------------------------------------------------------------------
EXTENSION: mysql
PRIMARY MAINTAINER: Zak Greant <zak@mysql.com>, Georg Richter <georg@php.net>, Andrey Hristov <andrey@php.net>, Johannes Schlüter <johannes@php.net>, Ulf Wendel <uw@php.net>
PRIMARY MAINTAINER: Zak Greant <zak@mysql.com>, Georg Richter <georg@php.net>, Johannes Schlüter <johannes@php.net>, Ulf Wendel <uw@php.net>
MAINTENANCE: Maintained
STATUS: Working
-------------------------------------------------------------------------------
@@ -158,7 +158,7 @@ STATUS: Working
SINCE: 5.0
-------------------------------------------------------------------------------
EXTENSION: mysqlnd
PRIMARY MAINTAINER: Andrey Hristov <andrey@php.net>, Johannes Schlüter <johannes@php.net>, Ulf Wendel <uw@php.net>
PRIMARY MAINTAINER: Georg Richter <georg@php.net>, Andrey Hristov <andrey@php.net>, Johannes Schlüter <johannes@php.net>, Ulf Wendel <uw@php.net>
MAINTENANCE: Maintained
STATUS: Working
SINCE: 5.3
+2 -2
View File
@@ -1819,7 +1819,7 @@ Installation
set of HTTP headers. The headers it did return are:
10. Windows: I've followed all the instructions, but still can't get
PHP and IIS to work together!
11. When running PHP as CGI with IIS, OmniHTTPD or Xitami, I get
11. When running PHP as CGI with IIS, PWS, OmniHTTPD or Xitami, I get
the following error: Security Alert! PHP CGI cannot be accessed
directly..
12. How do I know if my php.ini is being found and read? It seems like
@@ -2007,7 +2007,7 @@ cgi error:
And for IIS4 you need to tell it that PHP is a script engine.
Also, you will want to read this faq.
When running PHP as CGI with IIS, OmniHTTPD or Xitami, I get the
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
+1 -1
View File
@@ -1,6 +1,6 @@
--------------------------------------------------------------------
The PHP License, version 3.01
Copyright (c) 1999 - 2014 The PHP Group. All rights reserved.
Copyright (c) 1999 - 2010 The PHP Group. All rights reserved.
--------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
+2 -2
View File
@@ -7,7 +7,7 @@ $(builddir)/zend_language_scanner.lo: $(srcdir)/zend_language_parser.h
$(builddir)/zend_ini_scanner.lo: $(srcdir)/zend_ini_parser.h
$(srcdir)/zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l)
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l)
$(srcdir)/zend_language_parser.h: $(srcdir)/zend_language_parser.c
$(srcdir)/zend_language_parser.c: $(srcdir)/zend_language_parser.y
@@ -18,6 +18,6 @@ $(srcdir)/zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
@$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o $@
$(srcdir)/zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
$(builddir)/zend_indent.lo $(builddir)/zend_highlight.lo $(builddir)/zend_compile.lo: $(srcdir)/zend_language_parser.h
+8 -22
View File
@@ -3,8 +3,6 @@
# LCOV
#
LCOV_INCLUDE="."
lcov: lcov-html
lcov-test: lcov-clean-data test
@@ -14,7 +12,7 @@ php_lcov.info: lcov-test
@rm -rf lcov_data/
@$(mkinstalldirs) lcov_data/
@echo
-@files=`find . -name \*.gcda -o -name \*.gcno -o -name \*.da -o -name \*.c -o -name \*.h | sed -e 's/^\.\///' | sed -e 's/\.gcda//g' -e 's/\.gcno//g' -e 's/\.da//g' | $(EGREP) $(LCOV_INCLUDE) | sed -e 's/.libs/zzzz/g' | sort | sed -e 's/zzzz/.libs/g' | uniq` ;\
-@files=`find . -name \*.gcda -o -name \*.gcno -o -name \*.da -o -name \*.h | sed -e 's/^\.\///' | sed -e 's/\.gcda//g' -e 's/\.gcno//g' -e 's/\.da//g' | uniq` ;\
for x in $$files; do \
echo -n . ;\
y=`echo $$x | sed -e 's!\.libs/!!'`; \
@@ -41,26 +39,14 @@ php_lcov.info: lcov-test
if test -f "$(top_builddir)/$$y.c"; then \
ln -f -s $(top_builddir)/$$y.c lcov_data/$$y.c; \
fi; \
if test -f "$$x.gcno"; then \
cp $$x.gcno lcov_data/$$y.gcno ; \
fi; \
if test -f "$$x.gcda"; then \
cp $$x.gcda lcov_data/$$y.gcda ; \
fi; \
if test -f "$$x.da"; then \
cp $$x.da lcov_data/$$y.da ; \
fi; \
if test -f "$$x.bb"; then \
cp $$x.bb lcov_data/$$y.bb ; \
fi; \
if test -f "$$x.bbg"; then \
cp $$x.bbg lcov_data/$$y.bbg ; \
fi; \
done; \
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
for dir in ext/bcmath/libbcmath ext/fileinfo/libmagic ext/gd/libgd ext/mbstring/libmbfl ext/mbstring/oniguruma ext/pcre/pcrelib ext/pdo_sqlite/libsqlite ext/sqlite/libsqlite ext/sqlite3/libsqlite ext/xmlrpc/libxmlrpc ext/zip/lib; do \
if test -d lcov_data/$$dir; then \
rm -rf lcov_data/$$dir ; \
fi; \
test -d lcov_data/$$dir && rm -rf lcov_data/$$dir ; \
done
@echo
@echo "Generating $@"
+4 -14
View File
@@ -86,7 +86,7 @@ PHP_TEST_SHARED_EXTENSIONS = ` \
PHP_DEPRECATED_DIRECTIVES_REGEX = '^(magic_quotes_(gpc|runtime|sybase)?|(zend_)?extension(_debug)?(_ts)?)[\t\ ]*='
test: all
@if test ! -z "$(PHP_EXECUTABLE)" && test -x "$(PHP_EXECUTABLE)"; then \
-@if test ! -z "$(PHP_EXECUTABLE)" && test -x "$(PHP_EXECUTABLE)"; then \
INI_FILE=`$(PHP_EXECUTABLE) -d 'display_errors=stderr' -r 'echo php_ini_loaded_file();' 2> /dev/null`; \
if test "$$INI_FILE"; then \
$(EGREP) -h -v $(PHP_DEPRECATED_DIRECTIVES_REGEX) "$$INI_FILE" > $(top_builddir)/tmp-php.ini; \
@@ -102,9 +102,7 @@ test: all
TEST_PHP_SRCDIR=$(top_srcdir) \
CC="$(CC)" \
$(PHP_EXECUTABLE) -n -c $(top_builddir)/tmp-php.ini $(PHP_TEST_SETTINGS) $(top_srcdir)/run-tests.php -n -c $(top_builddir)/tmp-php.ini -d extension_dir=$(top_builddir)/modules/ $(PHP_TEST_SHARED_EXTENSIONS) $(TESTS); \
TEST_RESULT_EXIT_CODE=$$?; \
rm $(top_builddir)/tmp-php.ini; \
exit $$TEST_RESULT_EXIT_CODE; \
else \
echo "ERROR: Cannot run tests without CLI sapi."; \
fi
@@ -115,19 +113,11 @@ clean:
find . -name \*.la -o -name \*.a | xargs rm -f
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
rm -f libphp$(PHP_MAJOR_VERSION).la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_MILTER_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/*
find . -name \*.1 | xargs rm -f
rm -f libphp$(PHP_MAJOR_VERSION).la $(SAPI_CLI_PATH) $(OVERALL_TARGET) modules/* libs/*
distclean: clean
rm -f Makefile config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h main/internal_functions_cli.c main/internal_functions.c stamp-h sapi/apache/libphp$(PHP_MAJOR_VERSION).module sapi/apache_hooks/libphp$(PHP_MAJOR_VERSION).module buildmk.stamp Zend/zend_dtrace_gen.h Zend/zend_dtrace_gen.h.bak Zend/zend_config.h TSRM/tsrm_config.h
rm -f php5.spec main/build-defs.h scripts/phpize
rm -f ext/date/lib/timelib_config.h ext/mbstring/oniguruma/config.h ext/mbstring/libmbfl/config.h ext/oci8/oci8_dtrace_gen.h ext/oci8/oci8_dtrace_gen.h.bak
rm -f scripts/man1/phpize.1 scripts/php-config scripts/man1/php-config.1 sapi/cli/php.1 sapi/cgi/php-cgi.1 ext/phar/phar.1 ext/phar/phar.phar.1
rm -f sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html
rm -f ext/iconv/php_have_bsd_iconv.h ext/iconv/php_have_glibc_iconv.h ext/iconv/php_have_ibm_iconv.h ext/iconv/php_have_iconv.h ext/iconv/php_have_libiconv.h ext/iconv/php_iconv_aliased_libiconv.h ext/iconv/php_iconv_supports_errno.h ext/iconv/php_php_iconv_h_path.h ext/iconv/php_php_iconv_impl.h
rm -f ext/phar/phar.phar ext/phar/phar.php
if test "$(srcdir)" != "$(builddir)"; then \
rm -f ext/phar/phar/phar.inc; \
fi
rm -f Makefile config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h stamp-h sapi/apache/libphp$(PHP_MAJOR_VERSION).module buildmk.stamp Zend/zend_dtrace_gen.h Zend/zend_dtrace_gen.h.bak
$(EGREP) define'.*include/php' $(top_srcdir)/configure | $(SED) 's/.*>//'|xargs rm -f
.PHONY: all clean install distclean test
+8662 -26
View File
File diff suppressed because it is too large. Load diff
+47
View File
@@ -0,0 +1,47 @@
This file describes extension module API details. Refer to
README.EXT_SKEL to create extension skeleton files. Refer to
Hacker's Guide for PHP internals.
http://www.php.net/manual/en/internals2.php
Between PHP 4.0.6 and 4.1.0, the Zend module struct changed in a way
that broke both source and binary compatibility. If you are
maintaining a third party extension, here's how to update it:
If this was your old module entry:
zend_module_entry foo_module_entry = {
"foo", /* extension name */
foo_functions, /* extension function list */
NULL, /* extension-wide startup function */
NULL, /* extension-wide shutdown function */
PHP_RINIT(foo), /* per-request startup function */
PHP_RSHUTDOWN(foo), /* per-request shutdown function */
PHP_MINFO(foo), /* information function */
STANDARD_MODULE_PROPERTIES
};
Here's how it should look if you want your code to build with PHP
4.1.0 and up:
zend_module_entry foo_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"foo", /* extension name */
foo_functions, /* extension function list */
NULL, /* extension-wide startup function */
NULL, /* extension-wide shutdown function */
PHP_RINIT(foo), /* per-request startup function */
PHP_RSHUTDOWN(foo), /* per-request shutdown function */
PHP_MINFO(foo), /* information function */
#if ZEND_MODULE_API_NO >= 20010901
PHP_FOO_VERSION, /* extension version number (string) */
#endif
STANDARD_MODULE_PROPERTIES
};
If you don't care about source compatibility with earlier PHP releases
than 4.1.0, you can drop the #if/#endif lines.
+4 -2
View File
@@ -51,7 +51,9 @@ Currently we have the following branches in use::
PHP-5.4 Is used to release the PHP 5.4.x series. This is a current
stable version and is open for bugfixes only.
PHP-5.3 This branch is closed.
PHP-5.3 Is used to release the PHP 5.3.x series. This is currently
in extended support and open forsecurity fixes only. Triaged
via security@php.net
PHP-5.2 This branch is closed.
@@ -61,7 +63,7 @@ Currently we have the following branches in use::
The next few rules are more of a technical nature::
1. All changes should first go to the lowest branch (i.e. 5.4) and then
1. All changes should first go to the lowest branch (i.e. 5.3) and then
get merged up to all other branches. If a change is not needed for
later branches (i.e. fixes for features which where dropped from later
branches) an empty merge should be done.
+3 -18
View File
@@ -28,17 +28,6 @@ Both functions return SUCCESS or FAILURE depending on the result.
The auto-conversions are performed as necessary. Arrays, objects, and
resources cannot be auto-converted.
PHP 5.5 includes a new function:
int zend_parse_parameter(int flags, int arg_num TSRMLS_DC, zval **arg, const char *spec, ...);
This function behaves like zend_parse_parameters_ex() except that instead of
reading the arguments from the stack, it receives a single zval to convert
(passed with double indirection). The passed zval may be changed in place as
part of the conversion process.
See also https://wiki.php.net/rfc/zpp_improv#expose_zend_parse_arg_as_zend_parse_parameter
Type specifiers
---------------
@@ -76,13 +65,9 @@ Type specifiers
will not be touched by the parsing function if they are not
passed to it.
/ - use SEPARATE_ZVAL_IF_NOT_REF() on the parameter it follows
! - the parameter it follows can be of specified type or NULL. If NULL is
passed and the output for such type is a pointer, then the output
pointer is set to a native NULL pointer.
For 'b', 'l' and 'd', an extra argument of type zend_bool* must be
passed after the corresponding bool*, long* or double* arguments,
respectively. A non-zero value will be written to the zend_bool iif a
PHP NULL is passed.
! - the parameter it follows can be of specified type or NULL (applies
to all specifiers except for 'b', 'l', and 'd'). If NULL is passed, the
results pointer is set to NULL as well.
Note on 64bit compatibility
+155
View File
@@ -0,0 +1,155 @@
1. strrpos() and strripos() now use the entire string as a needle. Be aware
that the existing scripts may no longer work as you expect.
EX :
<?php
var_dump(strrpos("ABCDEF","DEF"));
var_dump(strrpos("ABCDEF","DAF"));
?>
Will give you different results. The former returns 3 while the latter
returns false rather than the position of the last occurrence of 'D'.
The same applies to strripos().
2. Illegal use of string offsets causes E_ERROR instead of E_WARNING.
EX :
<?php
$a = "foo";
unset($a[0][1][2]);
?>
Fatal error: Cannot use string offset as an array in ... on line 1
3. array_merge() was changed to accept only arrays. If a non-array variable is
passed, a E_WARNING will be thrown for every such parameter. Be careful
because your code may start emitting E_WARNING out of the blue.
4. Be careful when porting from ext/mysql to ext/mysqli. The following
functions return NULL when no more data is available in the result set
(ext/mysql's functions return FALSE).
- mysqli_fetch_row()
- mysqli_fetch_array()
- mysqli_fetch_assoc()
5. PATH_TRANSLATED server variable is no longer set implicitly under
Apache2 SAPI in contrast to the situation in PHP 4, where it is set to the
same value as the SCRIPT_FILENAME server variable when it is not populated
by Apache. This change was made to comply with the CGI specification.
Please refer to bug #23610 for further information.
6. Starting PHP 5.0.0 the T_ML_CONSTANT constant is no longer defined by the
ext/tokenizer extension. If error_reporting is set to E_ALL notices will
be produced. Instead of T_ML_CONSTANT for /* */ the T_COMMENT constant
is used, thus both // and /* */ are resolved as the T_COMMENT constant.
However the PHPDoc style comments /** */ ,which starting PHP 5 are parsed
by PHP, are recongnized as T_DOC_COMMENT.
7. $_SERVER should be populated with argc and argv if variables_order
includes "S". If you have specifically configured your system to not
create $_SERVER, then of course it shouldn't be there. The change was to
always make argc and argv available in the CLI version regardless of the
variables_order setting. As in, the CLI version will now always populate
the global $argc and $argv variables.
8. In some cases classes must be declared before used. It only happens only
if some of the new features of PHP 5 are used. Otherwise the behaviour is
the old.
Example 1 (works with no errors):
<?php
$a = new a();
class a {
}
?>
Example 2 (throws an error):
<?php
$a = new a();
interface b{
}
class a implements b {
}
?>
Output (example 2) :
Fatal error: Class 'a' not found in /tmp/cl.php on line 2
9. get_class() starting PHP 5 returns the name of the class as it was
declared which may lead to problems in older scripts that rely on
the previous behaviour - the class name is lowercased. Expect the
same behaviour from get_parent_class() when applicable.
Example :
<?php
class FooBar {
}
class ExtFooBar extends FooBar{}
$a = new FooBar();
var_dump(get_class($a), get_parent_class($a));
?>
Output (PHP 4):
string(6) "foobar"
string(9) "extfoobar"
Output (PHP 5):
string(6) "FooBar"
string(9) "ExtFooBar"
----------------------------------------------------------------------
Example code that will break :
//....
function someMethod($p) {
if (get_class($p) != 'helpingclass') {
return FALSE;
}
//...
}
//...
Possible solution is to search for get_class() and get_parent_class() in
all your scripts and use strtolower().
10. get_class_methods() returns the names of the methods of a class as they
declared. In PHP4 the names are all lowercased.
Example code :
<?php
class Foo{
function doFoo(){}
function hasFoo(){}
}
var_dump(get_class_methods("Foo"));
?>
Output (PHP4):
array(2) {
[0]=>
string(5) "dofoo"
[1]=>
string(6) "hasfoo"
}
Output (PHP5):
array(2) {
[0]=>
string(5) "doFoo"
[1]=>
string(6) "hasFoo"
}
11. Assignment $this is impossible. Starting PHP 5.0.0 $this has special
meaning in class methods and is recognized by the PHP parser. The latter
will generate a parse error when assignment to $this is found
Example code :
<?php
class Foo {
function assignNew($obj) {
$this = $obj;
}
}
$a = new Foo();
$b = new Foo();
$a->assignNew($b);
echo "I was executed\n";
?>
Output (PHP 4):
I was executed
Output (PHP 5):
PHP Fatal error: Cannot re-assign $this in /tmp/this_ex.php on line 4
+19 -32
View File
@@ -11,27 +11,17 @@ because the sysadmins can not upgrade stuff then.
2. Package two days before a release. So if the release is to be on Thursday,
package on Tuesday. Think about timezones as well.
3. Ensure that the tests on Travis CI are green.
See: https://travis-ci.org/php/php-src/builds
It is recommended to do so a couple of days before the packaging day, to
have enough time to investigate failures, communicate with the authors and
commit the fixes.
The RM for the branch is also responsible for keeping the CI green on
ongoing bases between the releases. Check the CI status for your branch
periodically and resolve the failures ASAP. See more in:
https://wiki.php.net/rfc/travis_ci
3. Ensure that Windows builds will work before packaging
4. Ensure that Windows builds will work before packaging
5. Follow all steps to the letter. When unclear ask previous RM's (David/Julien/
4. Follow all steps to the letter. When unclear ask previous RM's (David/Julien/
Johannes/Stas/Derick/Ilia) before proceeding. Ideally make sure that for the
first releases one of the previous RM's is around to answer questions. For the
steps related to the php/QA/bug websites try to have someone from the webmaster
team (Bjori) on hand.
6. Verify the tags to be extra sure everything was tagged properly.
5. Verify the tags to be extra sure everything was tagged properly.
7. Moving extensions from/to PECL requires write acces to the destination.
6. Moving extensions from/to PECL requires write acces to the destination.
Most developers should have this.
Moving extensions from php-src to PECL
@@ -58,49 +48,47 @@ Rolling a non stable release (alpha/beta/RC)
1. Check windows snapshot builder logs (http://windows.php.net/downloads/snaps/ the last revision)
2. Check the tests at https://travis-ci.org/php/php-src/builds
3. run the "scripts/dev/credits" script in php-src and commit the changes in the
2. run the "scripts/dev/credits" script in php-src and commit the changes in the
credits files in ext/standard.
4. Checkout the release branch for this release (e.g., PHP-5.4.2) from the main branch.
3. Checkout the release branch for this release (e.g., PHP-5.4.2) from the main branch.
5. Bump the version numbers in ``main/php_version.h``, ``configure.in`` and possibly ``NEWS``.
4. Bump the version numbers in ``main/php_version.h``, ``configure.in`` and possibly ``NEWS``.
Do not use abbreviations for alpha and beta. Do not use dashes, you should
``#define PHP_VERSION "5.4.22RC1"`` and not ``#define PHP_VERSION "5.4.22-RC1"``
6. Compile and make test, with and without ZTS, using the right Bison version
5. Compile and make test, with and without ZTS, using the right Bison version
(for example, for 5.5, Bison 2.4.1 is used)
7. Check ./sapi/cli/php -v output for version matching.
6. Check ./sapi/cli/php -v output for version matching.
8. If all is right, commit the changes to the release branch with ``git commit -a``.
7. If all is right, commit the changes to the release branch with ``git commit -a``.
9. Tag the repository release branch with the version, e.g.:
8. Tag the repository release branch with the version, e.g.:
``git tag -u YOURKEYID php-5.4.2RC2``
10. Bump the version numbers in ``main/php_version.h``, ``configure.in`` and ``NEWS``
9. Bump the version numbers in ``main/php_version.h``, ``configure.in`` and ``NEWS``
in the *main* branch (PHP-5.4 for example) to prepare for the **next** version.
F.e. if the RC is "5.4.1RC1" then the new one should be "5.4.2-dev" - regardless if we get
a new RC or not. This is to make sure ``version_compare()`` can correctly work.
Commit the changes to the main branch.
11. Push the changes to the main repo, the tag, the main branch and the release branch :
10. Push the changes to the main repo, the tag, the main branch and the release branch :
``git push --tags origin HEAD``
``git push origin {main branch}``
``git push origin {release branch}``
12. run: ``PHPROOT=. ./makedist 5.4.2RC2``, this will export the tree, create configure
11. run: ``PHPROOT=. ./makedist 5.4.2RC2``, this will export the tree, create configure
and build three tarballs (gz, bz2 and xz).
13. Copy those tarballs (scp, rsync) to downloads.php.net, in your homedir there should be a
12. Copy those tarballs (scp, rsync) to downloads.php.net, in your homedir there should be a
directory "downloads/". Copy them into there, so that the system can generate
MD5 sums. If you do not have this directory, talk to Derick or Dan.
14. Now the RC can be found on http://downloads.php.net/yourname,
13. Now the RC can be found on http://downloads.php.net/yourname,
f.e. http://downloads.php.net/derick/
15. Once the release has been tagged, contact the PHP Windows development team
14. Once the release has been tagged, contact the PHP Windows development team
(internals-win@lists.php.net) so that Windows binaries can be created. Once
those are made, they should be placed into the same directory as the source snapshots.
@@ -156,8 +144,7 @@ the base branches and merged upwards as usual (f.e commit the CVE fix to 5.3,
merge to 5.4, 5.5 etc...). Then you can cherry-pick it in your release branch.
Don't forget to update NEWS manually in an extra commit then.
3. Commit those changes. Ensure the tests at https://travis-ci.org/php/php-src/builds are
still passing.
3. Commit those changes
4. run the "scripts/dev/credits" script in php-src and commit the changes in the
credits files in ext/standard.
@@ -167,7 +154,7 @@ credits files in ext/standard.
6. Check ./sapi/cli/php -v output for version matching.
7. tag the repository with the version f.e. "``git tag -u YOURKEYID -s php-5.4.1``"
7. tag the repository with the version f.e. "``git tag -s php-5.4.1``"
8. Push the tag f.e. "``git push origin php-5.4.1``"
+1 -1
View File
@@ -46,7 +46,7 @@ Opening Streams
===============
In most cases, you should use this API:
PHPAPI php_stream *php_stream_open_wrapper(const char *path, const char *mode,
PHPAPI php_stream *php_stream_open_wrapper(char *path, char *mode,
int options, char **opened_path TSRMLS_DC);
Where:
+30 -31
View File
@@ -5,7 +5,7 @@ This document describes how to submit an enhancement or patch for PHP.
It's easy!
You don't need any login accounts or special access to download,
build, debug and begin submitting PHP or PECL code, tests or
build, debug and begin submitting PHP, PECL or PEAR code, tests or
documentation. Once you've followed this README and had several
patches accepted, commit privileges are often quickly granted.
@@ -16,8 +16,8 @@ http://phpadvent.org/2008/less-whining-more-coding-by-elizabeth-smith
Online Forums
-------------
There are several IRC channels where PHP developers are often
available to discuss questions. They include #php.pecl and #php.doc
on the EFNet network and #winphp-dev on FreeNode.
available to discuss questions. They include #php.pecl, #php.doc and
#pear on the EFNet network and #php-dev-win on FreeNode.
PHP Patches
@@ -33,27 +33,16 @@ and discuss it on the development mail list internals@lists.php.net.
RFC Wiki accounts can be requested on
http://wiki.php.net/start?do=register. PHP extension maintainers can
be found in the EXTENSIONS file in the PHP source. Mail list
subscription is explained on http://php.net/mailing-lists.php.
subscription is explained on http://www.php.net/mailing-lists.php.
Information on PHP internal C functions is at
http://php.net/internals, though this is considered incomplete.
Various external resources can be found on the web. See
https://wiki.php.net/internals for some references. A standard
http://www.php.net/internals, though this is considered incomplete.
Various external resources can be found on the web. A standard
printed reference is the book "Extending and Embedding PHP" by Sara
Golemon.
The preferred way to propose PHP patch is sending pull request from
GitHub: https://github.com/php/php-src
Fork the official PHP repository and send a pull request. A
notification will be sent to the pull request mailing list. Sending a
note to PHP Internals list (internals@lists.php.net) may help getting
more feedback and quicker turnaround. You can also add pull requests
to bug reports at http://bugs.php.net/.
If you are not using GitHub, attach your patch to a PHP bug and
consider sending a notification email about the change to
internals@lists.php.net. If the bug is for an extension, also CC the
Attach the patch to the PHP bug and consider sending a notification
email about the change to internals@lists.php.net. Also CC the
extension maintainer. Explain what has been changed by your patch.
Test scripts should be included.
@@ -61,6 +50,16 @@ Please make the mail subject prefix "[PATCH]". If attaching a patch,
ensure it has a file extension of ".txt". This is because only MIME
attachments of type 'text/*' are accepted.
The preferred way to propose PHP patch is sending pull request from
github.
https://github.com/php/php-src
Fork the official PHP repository and send a pull request. A
notification will be sent to the pull request mailing list. Sending a
note to PHP Internals list (internals@lists.php.net) may help getting
more feedback and quicker turnaround. You can also add pull requests
to bug reports at http://bugs.php.net/.
PHP Documentation Patches
@@ -72,7 +71,7 @@ the PHP mail archives.
If your change is large, then first discuss it with the mail list
phpdoc@lists.php.net. Subscription is explained on
http://php.net/mailing-lists.php.
http://www.php.net/mailing-lists.php.
Information on contributing to PHP documentation is at
http://php.net/dochowto and http://wiki.php.net/doc/howto
@@ -90,7 +89,7 @@ of type 'text/*' are accepted.
PECL Extension Patches: http://pecl.php.net/
--------------------------------------------
If you are fixing broken functionality in a PECL extension then create
a bug or identify an existing bug at http://bugs.php.net/. A bug
a bug or identify an existing bug at http://pecl.php.net/bugs/. A bug
can be used to track the patch progress and prevent your changes
getting lost in the PHP mail archives.
@@ -126,15 +125,15 @@ http://pear.php.net/manual/en/guide-developers.php
How to create your PHP, PHP Documentation or PECL patch
-------------------------------------------------------
PHP and most PECL packages use Git for revision control. Some PECL
packages use Subversion (SVN) Read http://www.php.net/git.php for help
on using Git to get and build PHP source code. We recommend to look
at our workflow on https://wiki.php.net/vcs/gitworkflow and our FAQ
https://wiki.php.net/vcs/gitfaq.
PHP and PECL use Subversion (SVN) for revision control. Read
http://www.php.net/svn.php for help on using SVN to get and build PHP
source code. We recommend using a Sparse Directory checkout described
in http://wiki.php.net/vcs/svnfaq. If you are new to SVN, read
http://svnbook.red-bean.com.
Generally we ask that bug fix patches work on the current stable PHP
development branches and on "master". New PHP features only need to
work on "master".
development branches and on "trunk". New PHP features only need to
work on "trunk".
Read CODING_STANDARDS before you start working.
@@ -146,7 +145,7 @@ comprehensive.
After testing is finished, create a patch file using the command:
git diff > your_patch.txt
svn diff > your_patch.txt
For ease of review and later troubleshooting, submit individual
patches for each bug or feature.
@@ -154,7 +153,7 @@ patches for each bug or feature.
Checklist for submitting your PHP or PECL code patch
----------------------------------------------------
- Update git source just before running your final 'diff' and
- Update SVN source just before running your final 'diff' and
before testing.
- Add in-line comments and/or have external documentation ready.
Use only "/* */" style comments, not "//".
@@ -187,7 +186,7 @@ about these questions:
What happens when your PHP or PECL patch is applied
---------------------------------------------------
Your name will likely be included in the Git commit log. If your
Your name will likely be included in the SVN commit log. If your
patch affects end users, a brief description and your name might be
added to the NEWS file.
+1 -1
View File
@@ -2,7 +2,7 @@
------------------
Failed tests usually indicate a problem with your local system setup
and not within PHP itself (at least for official PHP release versions).
You may decide to automatically submit a test summary to our QA workflow
You may decide to automaticaly submit a test summary to our QA workflow
at the end of a test run.
Please do *not* submit a failed test as a bug or ask for help on why
it failed on your system without providing substantial backup information
-39
View File
@@ -1,39 +0,0 @@
The PHP Interpreter
===================
This is the github mirror of the official PHP repository located at
http://git.php.net.
[![Build Status](https://secure.travis-ci.org/php/php-src.png?branch=master)](http://travis-ci.org/php/php-src)
Pull Requests
=============
PHP accepts pull requests via github. Discussions are done on github, but
depending on the topic can also be relayed to the official PHP developer
mailinglist internals@lists.php.net.
New features require an RFC and must be accepted by the developers.
See https://wiki.php.net/rfc and https://wiki.php.net/rfc/voting for more
information on the process.
Bug fixes **do not** require an RFC, but require a bugtracker ticket. Always
open a ticket at https://bugs.php.net and reference the bug id using #NNNNNN.
Fix #55371: get_magic_quotes_gpc() throws deprecation warning
After removing magic quotes, the get_magic_quotes_gpc function caused
a deprecate warning. get_magic_quotes_gpc can be used to detected
the magic_quotes behavior and therefore should not raise a warning at any
time. The patch removes this warning
We do not merge pull requests directly on github. All PRs will be
pulled and pushed through http://git.php.net.
Guidelines for contributors
===========================
- [CODING_STANDARDS](/CODING_STANDARDS)
- [README.GIT-RULES](/README.GIT-RULES)
- [README.MAILINGLIST_RULES](/README.MAILINGLIST_RULES)
- [README.RELEASE_PROCESS](/README.RELEASE_PROCESS)
+1 -1
View File
@@ -1,6 +1,6 @@
## process this file with automake to produce Makefile.am
AUTOMAKE_OPTIONS=foreign
noinst_LTLIBRARIES=libtsrm.la
libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c
libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c
depend:
+8
View File
@@ -143,6 +143,10 @@ SOURCE=.\tsrm_strtok_r.c
# End Source File
# Begin Source File
SOURCE=.\tsrm_virtual_cwd.c
# End Source File
# Begin Source File
SOURCE=.\tsrm_win32.c
# End Source File
# End Group
@@ -171,6 +175,10 @@ SOURCE=.\tsrm_strtok_r.h
# End Source File
# Begin Source File
SOURCE=.\tsrm_virtual_cwd.h
# End Source File
# Begin Source File
SOURCE=.\tsrm_win32.h
# End Source File
# End Group
+1 -1
View File
@@ -64,7 +64,7 @@ typedef int ts_rsrc_id;
/* Define THREAD_T and MUTEX_T */
#ifdef TSRM_WIN32
# define THREAD_T UINT_PTR
# define THREAD_T DWORD
# define MUTEX_T CRITICAL_SECTION *
#elif defined(GNUPTH)
# define THREAD_T pth_t
+1 -1
View File
@@ -1,5 +1,5 @@
// vim:ft=javascript
// $Id$
ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_win32.c");
ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c tsrm_win32.c");
+8 -1
View File
@@ -2,7 +2,6 @@
#define TSRM_CONFIG_W32_H
#include <../main/config.w32.h>
#include "Zend/zend_config.w32.h"
#define HAVE_UTIME 1
#define HAVE_ALLOCA 1
@@ -12,4 +11,12 @@
#include <stdlib.h>
#include <crtdbg.h>
#undef inline
#ifdef ZEND_WIN32_FORCE_INLINE
# define inline __forceinline
#else
# define inline
#endif
#endif
@@ -30,8 +30,7 @@
#include <fcntl.h>
#include <time.h>
#include "zend.h"
#include "zend_virtual_cwd.h"
#include "tsrm_virtual_cwd.h"
#include "tsrm_strtok_r.h"
#ifdef TSRM_WIN32
@@ -127,6 +126,7 @@ static int php_check_dots(const char *element, int n)
#define TOKENIZER_STRING "/"
#endif
/* default macros */
#ifndef IS_DIRECTORY_UP
@@ -149,21 +149,11 @@ static int php_check_dots(const char *element, int n)
#define CWD_STATE_COPY(d, s) \
(d)->cwd_length = (s)->cwd_length; \
(d)->cwd = (char *) emalloc((s)->cwd_length+1); \
(d)->cwd = (char *) malloc((s)->cwd_length+1); \
memcpy((d)->cwd, (s)->cwd, (s)->cwd_length+1);
#define CWD_STATE_FREE(s) \
efree((s)->cwd);
#ifdef TSRM_WIN32
# define CWD_STATE_FREE_ERR(state) do { \
DWORD last_error = GetLastError(); \
CWD_STATE_FREE(state); \
SetLastError(last_error); \
} while (0)
#else
# define CWD_STATE_FREE_ERR(state) CWD_STATE_FREE(state)
#endif
free((s)->cwd);
#ifdef TSRM_WIN32
@@ -178,7 +168,7 @@ static int php_check_dots(const char *element, int n)
#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
typedef struct {
zend_ulong ReparseTag;
unsigned long ReparseTag;
unsigned short ReparseDataLength;
unsigned short Reserved;
union {
@@ -187,7 +177,7 @@ typedef struct {
unsigned short SubstituteNameLength;
unsigned short PrintNameOffset;
unsigned short PrintNameLength;
zend_ulong Flags;
unsigned long Flags;
wchar_t ReparseTarget[1];
} SymbolicLinkReparseBuffer;
struct {
@@ -291,15 +281,14 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){
}
/* }}} */
CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{{ */
CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{{ */
{
WIN32_FILE_ATTRIBUTE_DATA data;
__int64 t;
const size_t path_len = strlen(path);
ALLOCA_FLAG(use_heap_large);
if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) {
return zend_stat(path, buf);
return stat(path, buf);
}
if (path_len >= 1 && path[1] == ':') {
@@ -348,15 +337,16 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{
HANDLE hLink = NULL;
REPARSE_DATA_BUFFER * pbuffer;
unsigned int retlength = 0;
TSRM_ALLOCA_FLAG(use_heap_large);
hLink = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
if(hLink == INVALID_HANDLE_VALUE) {
return -1;
}
pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
pbuffer = (REPARSE_DATA_BUFFER *)tsrm_do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
CloseHandle(hLink);
return -1;
}
@@ -373,7 +363,7 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{
buf->st_mode |=;
}
#endif
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
} else {
buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG;
buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6));
@@ -407,7 +397,7 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{
static int php_is_dir_ok(const cwd_state *state) /* {{{ */
{
zend_stat_t buf;
struct stat buf;
if (php_sys_stat(state->cwd, &buf) == 0 && S_ISDIR(buf.st_mode))
return (0);
@@ -418,7 +408,7 @@ static int php_is_dir_ok(const cwd_state *state) /* {{{ */
static int php_is_file_ok(const cwd_state *state) /* {{{ */
{
zend_stat_t buf;
struct stat buf;
if (php_sys_stat(state->cwd, &buf) == 0 && S_ISREG(buf.st_mode))
return (0);
@@ -439,6 +429,7 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */
static void cwd_globals_dtor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */
{
CWD_STATE_FREE(&cwd_g->cwd);
realpath_cache_clean(TSRMLS_C);
}
/* }}} */
@@ -499,25 +490,6 @@ CWD_API void virtual_cwd_shutdown(void) /* {{{ */
}
/* }}} */
CWD_API int virtual_cwd_activate(TSRMLS_D) /* {{{ */
{
if (CWDG(cwd).cwd == NULL) {
CWD_STATE_COPY(&CWDG(cwd), &main_cwd_state);
}
return 0;
}
/* }}} */
CWD_API int virtual_cwd_deactivate(TSRMLS_D) /* {{{ */
{
if (CWDG(cwd).cwd != NULL) {
CWD_STATE_FREE(&CWDG(cwd));
CWDG(cwd).cwd = NULL;
}
return 0;
}
/* }}} */
CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */
{
cwd_state *state;
@@ -528,7 +500,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */
char *retval;
*length = 1;
retval = (char *) emalloc(2);
retval = (char *) malloc(2);
if (retval == NULL) {
return NULL;
}
@@ -543,7 +515,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */
char *retval;
*length = state->cwd_length+1;
retval = (char *) emalloc(*length+1);
retval = (char *) malloc(*length+1);
if (retval == NULL) {
return NULL;
}
@@ -555,7 +527,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */
}
#endif
*length = state->cwd_length;
return estrdup(state->cwd);
return strdup(state->cwd);
}
/* }}} */
@@ -571,20 +543,20 @@ CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC) /* {{{ */
return cwd;
}
if (length > size-1) {
efree(cwd);
free(cwd);
errno = ERANGE; /* Is this OK? */
return NULL;
}
memcpy(buf, cwd, length+1);
efree(cwd);
free(cwd);
return buf;
}
/* }}} */
#ifdef PHP_WIN32
static inline zend_ulong realpath_cache_key(const char *path, int path_len TSRMLS_DC) /* {{{ */
static inline unsigned long realpath_cache_key(const char *path, int path_len TSRMLS_DC) /* {{{ */
{
register zend_ulong h;
register unsigned long h;
char *bucket_key_start = tsrm_win32_get_path_sid_key(path TSRMLS_CC);
char *bucket_key = (char *)bucket_key_start;
const char *e = bucket_key + strlen(bucket_key);
@@ -593,8 +565,8 @@ static inline zend_ulong realpath_cache_key(const char *path, int path_len TSRML
return 0;
}
for (h = Z_UL(2166136261); bucket_key < e;) {
h *= Z_UL(16777619);
for (h = 2166136261U; bucket_key < e;) {
h *= 16777619;
h ^= *bucket_key++;
}
HeapFree(GetProcessHeap(), 0, (LPVOID)bucket_key_start);
@@ -602,13 +574,13 @@ static inline zend_ulong realpath_cache_key(const char *path, int path_len TSRML
}
/* }}} */
#else
static inline zend_ulong realpath_cache_key(const char *path, int path_len) /* {{{ */
static inline unsigned long realpath_cache_key(const char *path, int path_len) /* {{{ */
{
register zend_ulong h;
register unsigned long h;
const char *e = path + path_len;
for (h = Z_UL(2166136261); path < e;) {
h *= Z_UL(16777619);
for (h = 2166136261U; path < e;) {
h *= 16777619;
h ^= *path++;
}
@@ -637,11 +609,11 @@ CWD_API void realpath_cache_clean(TSRMLS_D) /* {{{ */
CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC) /* {{{ */
{
#ifdef PHP_WIN32
zend_ulong key = realpath_cache_key(path, path_len TSRMLS_CC);
unsigned long key = realpath_cache_key(path, path_len TSRMLS_CC);
#else
zend_ulong key = realpath_cache_key(path, path_len);
unsigned long key = realpath_cache_key(path, path_len);
#endif
zend_ulong n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0]));
unsigned long n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0]));
realpath_cache_bucket **bucket = &CWDG(realpath_cache)[n];
while (*bucket != NULL) {
@@ -668,7 +640,7 @@ CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC) /* {{{
static inline void realpath_cache_add(const char *path, int path_len, const char *realpath, int realpath_len, int is_dir, time_t t TSRMLS_DC) /* {{{ */
{
zend_long size = sizeof(realpath_cache_bucket) + path_len + 1;
long size = sizeof(realpath_cache_bucket) + path_len + 1;
int same = 1;
if (realpath_len != path_len ||
@@ -679,7 +651,7 @@ static inline void realpath_cache_add(const char *path, int path_len, const char
if (CWDG(realpath_cache_size) + size <= CWDG(realpath_cache_size_limit)) {
realpath_cache_bucket *bucket = malloc(size);
zend_ulong n;
unsigned long n;
if (bucket == NULL) {
return;
@@ -719,12 +691,12 @@ static inline void realpath_cache_add(const char *path, int path_len, const char
static inline realpath_cache_bucket* realpath_cache_find(const char *path, int path_len, time_t t TSRMLS_DC) /* {{{ */
{
#ifdef PHP_WIN32
zend_ulong key = realpath_cache_key(path, path_len TSRMLS_CC);
unsigned long key = realpath_cache_key(path, path_len TSRMLS_CC);
#else
zend_ulong key = realpath_cache_key(path, path_len);
unsigned long key = realpath_cache_key(path, path_len);
#endif
zend_ulong n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0]));
unsigned long n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0]));
realpath_cache_bucket **bucket = &CWDG(realpath_cache)[n];
while (*bucket != NULL) {
@@ -756,12 +728,12 @@ CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_
}
/* }}} */
CWD_API zend_long realpath_cache_size(TSRMLS_D)
CWD_API int realpath_cache_size(TSRMLS_D)
{
return CWDG(realpath_cache_size);
}
CWD_API zend_long realpath_cache_max_buckets(TSRMLS_D)
CWD_API int realpath_cache_max_buckets(TSRMLS_D)
{
return (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0]));
}
@@ -782,13 +754,13 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
#ifdef TSRM_WIN32
WIN32_FIND_DATA data;
HANDLE hFind;
ALLOCA_FLAG(use_heap_large)
TSRM_ALLOCA_FLAG(use_heap_large)
#else
zend_stat_t st;
struct stat st;
#endif
realpath_cache_bucket *bucket;
char *tmp;
ALLOCA_FLAG(use_heap)
TSRM_ALLOCA_FLAG(use_heap)
while (1) {
if (len <= start) {
@@ -888,7 +860,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
FindClose(hFind);
}
tmp = do_alloca(len+1, use_heap);
tmp = tsrm_do_alloca(len+1, use_heap);
memcpy(tmp, path, len+1);
if(save &&
@@ -915,12 +887,12 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
return -1;
}
pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
pbuffer = (REPARSE_DATA_BUFFER *)tsrm_do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large);
if (pbuffer == NULL) {
return -1;
}
if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
CloseHandle(hLink);
return -1;
}
@@ -936,7 +908,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
printname_len + 1,
printname, MAX_PATH, NULL, NULL
)) {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
return -1;
};
printname_len = pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR);
@@ -948,7 +920,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
substitutename_len + 1,
substitutename, MAX_PATH, NULL, NULL
)) {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
return -1;
};
substitutename[substitutename_len] = 0;
@@ -962,7 +934,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
printname_len + 1,
printname, MAX_PATH, NULL, NULL
)) {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
return -1;
};
printname[pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR)] = 0;
@@ -973,7 +945,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
substitutename_len + 1,
substitutename, MAX_PATH, NULL, NULL
)) {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
return -1;
};
substitutename[substitutename_len] = 0;
@@ -983,7 +955,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
memcpy(substitutename, path, len + 1);
substitutename_len = len;
} else {
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
return -1;
}
@@ -1027,21 +999,21 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
fprintf(stderr, "sub: %s ", substitutename);
fprintf(stderr, "resolved: %s ", path);
#endif
free_alloca(pbuffer, use_heap_large);
tsrm_free_alloca(pbuffer, use_heap_large);
if(isabsolute == 1) {
if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) {
/* use_realpath is 0 in the call below coz path is absolute*/
j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC);
if(j < 0) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
}
}
else {
if(i + j >= MAXPATHLEN - 1) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
@@ -1050,7 +1022,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
path[i-1] = DEFAULT_SLASH;
j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC);
if(j < 0) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
}
@@ -1071,7 +1043,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
#elif defined(NETWARE)
save = 0;
tmp = do_alloca(len+1, use_heap);
tmp = tsrm_do_alloca(len+1, use_heap);
memcpy(tmp, path, len+1);
#else
if (save && php_sys_lstat(path, &st) < 0) {
@@ -1083,25 +1055,25 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
save = 0;
}
tmp = do_alloca(len+1, use_heap);
tmp = tsrm_do_alloca(len+1, use_heap);
memcpy(tmp, path, len+1);
if (save && S_ISLNK(st.st_mode)) {
if (++(*ll) > LINK_MAX || (j = php_sys_readlink(tmp, path, MAXPATHLEN)) < 0) {
/* too many links or broken symlinks */
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
path[j] = 0;
if (IS_ABSOLUTE_PATH(path, j)) {
j = tsrm_realpath_r(path, 1, j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC);
if (j < 0) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
} else {
if (i + j >= MAXPATHLEN-1) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1; /* buffer overflow */
}
memmove(path+i, path, j+1);
@@ -1109,7 +1081,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
path[i-1] = DEFAULT_SLASH;
j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC);
if (j < 0) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
}
@@ -1124,7 +1096,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
}
if (is_dir && !directory) {
/* not a directory */
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
}
@@ -1140,7 +1112,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
}
#ifdef TSRM_WIN32
if (j < 0 || j + len - i >= MAXPATHLEN-1) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
if (save) {
@@ -1155,7 +1127,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
}
#else
if (j < 0 || j + len - i >= MAXPATHLEN-1) {
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return -1;
}
memcpy(path+j, tmp+i, len-i+1);
@@ -1168,7 +1140,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
realpath_cache_add(tmp, len, path, j, directory, *t TSRMLS_CC);
}
free_alloca(tmp, use_heap);
tsrm_free_alloca(tmp, use_heap);
return j;
}
}
@@ -1344,7 +1316,7 @@ verify:
CWD_STATE_COPY(&old_state, state);
state->cwd_length = path_length;
tmp = erealloc(state->cwd, state->cwd_length+1);
tmp = realloc(state->cwd, state->cwd_length+1);
if (tmp == NULL) {
#if VIRTUAL_CWD_DEBUG
fprintf (stderr, "Out of memory\n");
@@ -1364,7 +1336,7 @@ verify:
}
} else {
state->cwd_length = path_length;
tmp = erealloc(state->cwd, state->cwd_length+1);
tmp = realloc(state->cwd, state->cwd_length+1);
if (tmp == NULL) {
#if VIRTUAL_CWD_DEBUG
fprintf (stderr, "Out of memory\n");
@@ -1395,7 +1367,7 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path
int length = strlen(path);
char *temp;
int retval;
ALLOCA_FLAG(use_heap)
TSRM_ALLOCA_FLAG(use_heap)
if (length == 0) {
return 1; /* Can't cd to empty string */
@@ -1412,14 +1384,14 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path
if (length == COPY_WHEN_ABSOLUTE(path) && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */
length++;
}
temp = (char *) do_alloca(length+1, use_heap);
temp = (char *) tsrm_do_alloca(length+1, use_heap);
memcpy(temp, path, length);
temp[length] = 0;
#if VIRTUAL_CWD_DEBUG
fprintf (stderr, "Changing directory to %s\n", temp);
#endif
retval = p_chdir(temp TSRMLS_CC);
free_alloca(temp, use_heap);
tsrm_free_alloca(temp, use_heap);
return retval;
}
/* }}} */
@@ -1432,7 +1404,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) /* {
/* realpath("") returns CWD */
if (!*path) {
new_state.cwd = (char*)emalloc(1);
new_state.cwd = (char*)malloc(1);
if (new_state.cwd == NULL) {
retval = NULL;
goto end;
@@ -1445,7 +1417,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) /* {
} else if (!IS_ABSOLUTE_PATH(path, strlen(path))) {
CWD_STATE_COPY(&new_state, &CWDG(cwd));
} else {
new_state.cwd = (char*)emalloc(1);
new_state.cwd = (char*)malloc(1);
if (new_state.cwd == NULL) {
retval = NULL;
goto end;
@@ -1502,14 +1474,13 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return NULL;
}
f = fopen(new_state.cwd, mode);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return f;
}
/* }}} */
@@ -1521,7 +1492,7 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
@@ -1531,7 +1502,7 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC) /* {{{ */
ret = access(new_state.cwd, mode);
#endif
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return ret;
}
@@ -1594,7 +1565,7 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC) /
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
@@ -1604,7 +1575,7 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC) /
ret = utime(new_state.cwd, buf);
#endif
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return ret;
}
/* }}} */
@@ -1617,13 +1588,13 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
ret = chmod(new_state.cwd, mode);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return ret;
}
/* }}} */
@@ -1636,7 +1607,7 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
@@ -1650,7 +1621,7 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li
ret = chown(new_state.cwd, owner, group);
}
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return ret;
}
/* }}} */
@@ -1663,7 +1634,7 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
@@ -1679,7 +1650,7 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */
} else {
f = open(new_state.cwd, flags);
}
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return f;
}
/* }}} */
@@ -1691,18 +1662,18 @@ CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
f = creat(new_state.cwd, mode);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return f;
}
/* }}} */
CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) /* {{{ */
CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC) /* {{{ */
{
cwd_state old_state;
cwd_state new_state;
@@ -1710,15 +1681,15 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) /
CWD_STATE_COPY(&old_state, &CWDG(cwd));
if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&old_state);
CWD_STATE_FREE(&old_state);
return -1;
}
oldname = old_state.cwd;
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, newname, NULL, CWD_EXPAND TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&old_state);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&old_state);
CWD_STATE_FREE(&new_state);
return -1;
}
newname = new_state.cwd;
@@ -1732,45 +1703,45 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) /
retval = rename(oldname, newname);
#endif
CWD_STATE_FREE_ERR(&old_state);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&old_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
CWD_API int virtual_stat(const char *path, zend_stat_t *buf TSRMLS_DC) /* {{{ */
CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ */
{
cwd_state new_state;
int retval;
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
retval = php_sys_stat(new_state.cwd, buf);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
CWD_API int virtual_lstat(const char *path, zend_stat_t *buf TSRMLS_DC) /* {{{ */
CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ */
{
cwd_state new_state;
int retval;
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
retval = php_sys_lstat(new_state.cwd, buf);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
@@ -1782,13 +1753,13 @@ CWD_API int virtual_unlink(const char *path TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
retval = unlink(new_state.cwd);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
@@ -1800,7 +1771,7 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, pathname, NULL, CWD_FILEPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
@@ -1809,7 +1780,7 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC) /* {{{ */
#else
retval = mkdir(new_state.cwd, mode);
#endif
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
@@ -1821,13 +1792,13 @@ CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, pathname, NULL, CWD_EXPAND TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return -1;
}
retval = rmdir(new_state.cwd);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
@@ -1843,13 +1814,13 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC) /* {{{ */
CWD_STATE_COPY(&new_state, &CWDG(cwd));
if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) {
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return NULL;
}
retval = opendir(new_state.cwd);
CWD_STATE_FREE_ERR(&new_state);
CWD_STATE_FREE(&new_state);
return retval;
}
/* }}} */
@@ -1911,7 +1882,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) /*
dir_length = CWDG(cwd).cwd_length;
dir = CWDG(cwd).cwd;
ptr = command_line = (char *) emalloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1);
ptr = command_line = (char *) malloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1);
if (!command_line) {
return NULL;
}
@@ -1945,7 +1916,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) /*
memcpy(ptr, command, command_length+1);
retval = popen(command_line, type);
efree(command_line);
free(command_line);
return retval;
}
/* }}} */
@@ -1958,7 +1929,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{
/* realpath("") returns CWD */
if (!*path) {
new_state.cwd = (char*)emalloc(1);
new_state.cwd = (char*)malloc(1);
if (new_state.cwd == NULL) {
return NULL;
}
@@ -1969,10 +1940,10 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{
}
} else if (!IS_ABSOLUTE_PATH(path, strlen(path)) &&
VCWD_GETCWD(cwd, MAXPATHLEN)) {
new_state.cwd = estrdup(cwd);
new_state.cwd = strdup(cwd);
new_state.cwd_length = strlen(cwd);
} else {
new_state.cwd = (char*)emalloc(1);
new_state.cwd = (char*)malloc(1);
if (new_state.cwd == NULL) {
return NULL;
}
@@ -1981,7 +1952,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{
}
if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) {
efree(new_state.cwd);
free(new_state.cwd);
return NULL;
}
@@ -1989,7 +1960,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{
int copy_len = new_state.cwd_length>MAXPATHLEN-1 ? MAXPATHLEN-1 : new_state.cwd_length;
memcpy(real_path, new_state.cwd, copy_len);
real_path[copy_len] = '\0';
efree(new_state.cwd);
free(new_state.cwd);
return real_path;
} else {
return new_state.cwd;
@@ -130,7 +130,7 @@ typedef unsigned short mode_t;
#endif
#ifdef TSRM_WIN32
CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat);
CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat);
# define php_sys_stat(path, buf) php_sys_stat_ex(path, buf, 0)
# define php_sys_lstat(path, buf) php_sys_stat_ex(path, buf, 1)
CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len);
@@ -151,8 +151,6 @@ typedef int (*verify_path_func)(const cwd_state *);
CWD_API void virtual_cwd_startup(void);
CWD_API void virtual_cwd_shutdown(void);
CWD_API int virtual_cwd_activate(TSRMLS_D);
CWD_API int virtual_cwd_deactivate(TSRMLS_D);
CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC);
CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC);
CWD_API int virtual_chdir(const char *path TSRMLS_DC);
@@ -163,9 +161,9 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC);
CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC);
CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...);
CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC);
CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC);
CWD_API int virtual_stat(const char *path, zend_stat_t *buf TSRMLS_DC);
CWD_API int virtual_lstat(const char *path, zend_stat_t *buf TSRMLS_DC);
CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC);
CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC);
CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC);
CWD_API int virtual_unlink(const char *path TSRMLS_DC);
CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC);
CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC);
@@ -211,7 +209,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC);
#define REALPATH_CACHE_SIZE 0 /* disabled while php.ini isn't loaded */
typedef struct _realpath_cache_bucket {
zend_ulong key;
unsigned long key;
char *path;
int path_len;
char *realpath;
@@ -229,9 +227,9 @@ typedef struct _realpath_cache_bucket {
typedef struct _virtual_cwd_globals {
cwd_state cwd;
zend_long realpath_cache_size;
zend_long realpath_cache_size_limit;
zend_long realpath_cache_ttl;
long realpath_cache_size;
long realpath_cache_size_limit;
long realpath_cache_ttl;
realpath_cache_bucket *realpath_cache[1024];
} virtual_cwd_globals;
@@ -246,8 +244,8 @@ extern virtual_cwd_globals cwd_globals;
CWD_API void realpath_cache_clean(TSRMLS_D);
CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC);
CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_len, time_t t TSRMLS_DC);
CWD_API zend_long realpath_cache_size(TSRMLS_D);
CWD_API zend_long realpath_cache_max_buckets(TSRMLS_D);
CWD_API int realpath_cache_size(TSRMLS_D);
CWD_API int realpath_cache_max_buckets(TSRMLS_D);
CWD_API realpath_cache_bucket** realpath_cache_get_buckets(TSRMLS_D);
/* The actual macros to be used in programs using TSRM
+1 -1
View File
@@ -32,7 +32,7 @@
#ifdef TSRM_WIN32
#include <Sddl.h>
#include "tsrm_win32.h"
#include "zend_virtual_cwd.h"
#include "tsrm_virtual_cwd.h"
#ifdef ZTS
static ts_rsrc_id win32_globals_id;
+833 -67
View File
@@ -1,99 +1,865 @@
$Id$
PHP X.Y UPGRADE NOTES
PHP 5.4 UPGRADE NOTES
1. Backward Incompatible Changes
2. New Features
3. Changes in SAPI modules
4. Deprecated Functionality
5. Changed Functions
6. New Functions
7. New Classes and Interfaces
8. Removed Extensions
9. Other Changes to Extensions
10. New Global Constants
11. Changes to INI File Handling
12. Windows Support
13. Other Changes
===========
0. Contents
===========
1. Changes to INI directives
2. Changes to reserved words and classes
3. Changes to engine behavior
4. Changes to existing functions
a. unserialize() change
5. Changes to existing classes
6. Changes to existing methods
7. Deprecated Functionality
8. Removed Functionality
a. Removed features
b. Removed functions
c. Removed syntax
d. Removed hash algorithms
9. Extension Changes:
a. Extensions no longer maintained
b. Extensions with changed behavior
10. Changes in SAPI support
11. Windows support
12. New in PHP 5.4:
a. New features
b. Syntax additions
c. New functions
d. New global constants
e. New classes
f. New methods
g. New hash algorithms
=============================
1. Changes to INI directives
=============================
- PHP 5.4 now checks at compile time if /dev/urandom or /dev/arandom
are present. If either is available, session.entropy_file now
defaults to that file and session.entropy_length defaults to 32.
This provides non-blocking entropy to session id generation. If you
do not want extra entropy for your session ids, add:
session.entropy_file=
session.entropy_length=0
to your php.ini to preserve pre-PHP 5.4 behavior.
- Deprecated php.ini directives will now throw an E_CORE_WARNING's
instead of the previous E_WARNING's.
- The following php.ini directives are no longer available in PHP 5.4
and will now throw an E_CORE_ERROR upon startup:
- allow_call_time_pass_reference
- define_syslog_variables
- highlight.bg
- magic_quotes_gpc
- magic_quotes_runtime
- magic_quotes_sybase
- register_globals
- register_long_arrays
- safe_mode
- safe_mode_gid
- safe_mode_include_dir
- safe_mode_exec_dir
- safe_mode_allowed_env_vars
- safe_mode_protected_env_vars
- session.bug_compat_42
- session.bug_compat_warn
- y2k_compliance
- zend.ze1_compatibility_mode
- the following new php.ini directives were added:
- max_input_vars - specifies how many GET/POST/COOKIE input
variables may be accepted. The default value is 1000.
- E_ALL now includes E_STRICT.
- The recommended production value for error_reporting changed to E_ALL &
~E_DEPRECATED & ~E_STRICT.
- Added new session support directives:
session.upload_progress.enabled
session.upload_progress.cleanup
session.upload_progress.prefix
session.upload_progress.name
session.upload_progress.freq
session.upload_progress.min_freq
- Added a zend.multibyte directive as a replacement of the PHP compile time
configuration option --enable-zend-multibyte. Now the Zend Engine always
contains code for multibyte support, which can be enabled or disabled at
runtime. Note: It doesn't make a lot of sense to enable this option if
ext/mbstring is not enabled, because most functionality is implemented by
mbstrings callbacks.
- Added zend.script_encoding. This value will be used unless a
"declare(encoding=...)" directive appears at the top of the script.
- Added zend.signal_check to check for replaced signal handlers on shutdown
- Added enable_post_data_reading, which is enabled by default. When it's
disabled, the POST data is not read (or processed); the behavior is similar
to that of other request methods with body, like PUT. This allows reading
the raw POST data in multipart requests and reading/processing the POST data
in a stream fashion (through php://input) without having it copied in memory
multiple times.
- Added windows_show_crt_warning. This directive shows the CRT warnings when
enabled. These warnings were displayed by default until now. It is disabled
by default.
- Added cli.pager to set a pager for CLI interactive shell output.
- Added cli.prompt to configure the CLI interactive shell prompt.
- Added cli_server.color to enable the CLI web server to use ANSI color coding
in terminal output.
========================================
1. Backward Incompatible Changes
2. Changes to reserved words and classes
========================================
- DBA
. dba_delete() now returns false if the key was not found for the inifile
handler, too.
- "callable", "insteadof" and "trait" are now reserved words.
========================================
2. New Features
========================================
=============================
3. Changes to engine behavior
=============================
- Core
. Support for strings with length >= 2^31 bytes in 64 bit builds
- The __construct arguments of an extended abstract constructor must
now match:
- Standard
. intdiv() function for integer division added.
abstract class Base
{
abstract public function __construct();
}
class Foo extends Base
{
public function __construct($bar) {}
}
========================================
3. Changes in SAPI modules
========================================
This now emits a Fatal error due the incompatible declaration.
- FPM
. Fixed bug #65933 (Cannot specify config lines longer than 1024 bytes).
- In previous versions, superglobal names could be used for parameter
names, thereby shadowing the corresponding superglobal. In PHP 5.4
this now causes a fatal error such as "Cannot re-assign auto-global
variable GLOBALS".
========================================
4. Deprecated Functionality
========================================
- Turning null, false or an empty string into an object by adding a
property will now emit a warning instead of an E_STRICT error.
$test = null;
$test->baz = 1;
To create a generic object you can use StdClass:
$test = new StdClass;
$test->baz = 1;
- Converting an array to a string now will cause an E_NOTICE warning.
- Non-numeric string offsets, e.g. $a['foo'] where $a is a string, now
return false on isset() and true on empty(), and produce warning if
trying to use them. Offsets of types double, bool and null produce
notice. Numeric strings ($a['2']) still work as before.
Note that offsets like '12.3' and '5 and a half' are considered
non-numeric and produce warning, but are converted to 12 and 5
respectively for backwards compatibility reasons.
- Long numeric strings that do not fit in integer or double (such as
"92233720368547758070") are compared using string comparison if
they could otherwise result in precision loss - since 5.4.4.
- Closures now support scopes and $this and can be rebound to
objects using Closure::bind() and Closure::bindTo().
- <?= is now always available regardless of the short_open_tag
setting.
- Parse error messages are changed to contain more information about
the error.
- __clone and __destruct since 5.4.4 follow the same scoping rules as
the rest of the methods (see bug #61782 for details).
================================
4. Changes to existing functions
================================
- array_combine now returns array() instead of FALSE when two empty arrays are
provided as parameters.
- dns_get_record() has an extra parameter which allows requesting DNS records
by numeric type and makes the result include only the raw data of the
response.
- call_user_func_array() no longer allows call-time pass by reference.
- the default character set for htmlspecialchars() and htmlentities() is
now UTF-8. In previous versions it was ISO-8859-1. Note that changing
your output charset via the php.ini default_charset directive does not
affect htmlspecialchars/htmlentities unless you are passing "" (an
empty string) as the encoding parameter to your htmlspecialchars/htmlentities
calls.
- htmlentities() and htmlspecialchars() are stricter in the code units they
accept for the asian encodings. For Big5-HKSCS, the octets 0x80 and 0xFF are
rejected. For GB2312/EUC-CN, the octets 0x8E, 0x8F, 0xA0 and 0xFF are
rejected. For SJIS, the octets 0x80, 0xA0, 0xFD, 0xFE and 0xFF are rejected,
except maybe after a valid starting byte. For EUC-JP, the octets 0xA0 and
0xFF are rejected.
- htmlentities() now emits an E_STRICT warning when used with asian characters,
as in that case htmlentities has (and already had before this version) the
same functionality as htmlspecialchars.
- htmlentities() no longer numerically encodes high characters for single-byte
encodings (except when there's actually a corresponding named entity). This
behavior was not documented and was inconsistent with that for "UTF-8".
- html_entity_decode() and htmlspecialchars_decode() behave more consistently,
now decoding entities in malformed strings such as "&&amp;" or "&#&amp;".
- htmlentities(), htmlspecialchars(), html_entity_decode(), and
htmlspecialchars_decode: Added the flags ENT_HTML401, ENT_XML1, ENT_XHTML,
and ENT_HTML5. The behavior of these functions including, but not limited to,
the characters that are encoded and the entities that are decoded depend on
the document type that is specified by those flags.
- htmlentities() and htmlspecialchars() with !$double_encode do more strict
checks on the validity of the entities. Numerical entities are checked for a
valid range (0 to 0x10FFFF); if the flag ENT_DISALLOWED is given, the
validity of such numerical entity in the target document type is also
checked. Named entities are checked for necessary existence in the target
document type instead of only checking whether they were constituted by
alphanumeric characters.
- The flag ENT_DISALLOWED was added. In addition to the behavior described in
the item before, it also makes htmlentities() and htmlspecialchars()
substitute characters that appear literally in the argument string and which
are not allowed in the target document type with U+FFFD (UTF-8) or &#xFFFD;.
- The flag ENT_SUBSTITUTE was added. This flag makes invalid multibyte
sequences be replaced by U+FFFD (UTF-8) or &#FFFD; by htmlspecialchars() and
htmlentities(). It is an alternative to the default behavior, which just
returns an empty string and to ENT_IGNORE, which is a security risk. The
behavior follows the recommendations of Unicode Technical Report #36.
- htmlspecialchars_decode() and html_entity_decode() now decode &apos; if the
document type is ENT_XML1, ENT_XHTML, or ENT_HTML5.
- Charset detection with $charset == '' no longer turns to mbstring's
internal encoding defined through mb_internal_encoding(). Only the encoding
defined through the php.ini setting mbstring.internal_encoding is considered.
- number_format() no longer truncates multibyte decimal points and thousand
separators to the first byte.
- The third parameter ($matches) to preg_match_all() is now optional. If
omitted, the function will simply return the number of times the pattern was
matched in the subject and will have no other side effects.
- The second argument of scandir() now accepts SCANDIR_SORT_NONE (2) as a
possible value. This value results in scandir() performing no sorting: on
local filesystems, this allows files to be returned in native filesystem
order.
- stream_select() now preserves the keys of the passed array, be they numeric or
strings. This breaks code that iterated the resulting stream array using a
numeric index, but makes easier to identify which of the passed streams are
present in the result.
- stream_set_write_buffer() no longer disables the read buffer of a plain
stream when 0 is given as the second argument.
- stream_set_write_buffer() no longer changes the chunk size in socket streams.
- fclose() closes streams with resource refcount > 1; it doesn't merely
decrement the resource refcount.
- socket_set_options() and socket_get_options() now support multicast options.
- The raw data parameter in openssl_encrypt() and openssl_decrypt() is now an
options integer rather than a boolean. A value of true produces the same
behavior.
- Write operations within XSLT (for example with the extension sax:output) are
disabled by default. You can define what is forbidden with the method
XsltProcess::setSecurityPrefs($options).
- Added AES support to OpenSSL.
- openssl_csr_new() expects the textual data to be in UTF-8.
- Added no-padding option to openssl_encrypt() and openssl_decrypt().
- Added a "no_ticket" SSL context option to disable the SessionTicket TLS
extension.
- Added new json_encode() options: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES,
JSON_NUMERIC_CHECK, JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE.
- Added Tokyo Cabinet and Berkley DB 5 support to DBA extension.
- Added support for CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE
to cURL.
- Added optional argument to debug_backtrace() and debug_print_backtrace()
to limit the amount of stack frames returned.
- Fixed crypt_blowfish handling of 8-bit characters. crypt() in Blowfish mode
now supports hashes marked $2a$, $2x$ and $2y$.
- mbstring now supports following encodings: Shift_JIS/UTF-8 Emoji,
JIS X0213:2004 (Shift_JIS-2004, EUC-JP-2004, ISO-2022-JP-2004),
MacJapanese (Shift_JIS), gb18030.
- Added encode and decode in hex format to mb_encode_numericentity() and
mb_decode_numericentity().
- Added support for SORT_NATURAL and SORT_FLAG_CASE in array sort functions:
sort(), rsort(), ksort(), krsort(), asort(), arsort() and array_multisort().
- is_a() and is_subclass_of() now have third boolean parameter, which specifies
if the first argument can be a string class name. Default if false for is_a
and true for is_subclass_of() for BC reasons.
- ob_start() will now treat a chunk size of 1 as meaning 1 byte, rather than
the previous special case behavior of treating it as 4096 bytes.
- idn_to_ascii() and idn_to_utf8() now take two extra parameters, one indicating
the variant (IDNA 2003 or UTS #46) and another, passed by reference, to return
details about the operation in case UTS #46 is chosen.
- gzencode() used with FORCE_DEFLATE now generates RFC1950 compliant data.
- ob_start() no longer starts multiple output buffers when passed
array("callback1", "callback2", "callback3", ...).
- Since 5.4.4, "php://fd" stream syntax is available only in CLI build.
- Since 5.4.5, resourcebundle_create() accepts null for the first two arguments.
- Since 5.4.6, SimpleXMLElement::getDocNamespaces() has and extra parameter which
allows for toggling if the list of namespaces starts from the document root
or from the node you call the method on
- Since 5.4.7, ctor is always called when new user stream wrapper object is created.
Before, it was called only when stream_open was called.
4a. unserialize() change
------------------------
- Starting PHP 5.4.29, the bug fix for bug #67072 introduces a change to
unserialize() function, detailed below:
If the string looking like 'O:..:"ClassName":...' is unserialized, and
the class named is an internal class that declares custom unserializer
function, or extends such class, unserialize would fail.
Using O: for user classes not extending internal classes (including
those implementing Serializable) is still supported in 5.4, though
it is deprecated and may not be supported in 5.6 for classes that do not
originally serialize to O:. Same for using O: for internal classes
implementing Serializable (like ArrayObject) and classes that extend
them.
The reason for that is that O: format is meant to be used with classes
that do not define custom handlers, and was never intended for the use
with classes that do. When used with the class that relies on custom
unserializer, it can leave the object of such internal class in an
inconsistent state which has been observed to result in crashes and may
also lead to memory corruption and ultimately even arbitrary code
execution. This was never the intended use of unserializer, and mere
possibility of doing this constitutes a bug, since the data passed to
unserialize() is not a valid serialization of any object. Since there
are many applications applying unserialize() to untrusted data, this
presents a potential security vulnerability. Thus, keeping such bug in
the code base was considered too dangerous.
We are aware that some applications use O: format as a way to
instantiate classes. This was never the intended usage of serializer,
and ReflectionClass methods such as newInstance or
newInstanceWithoutConstructor can be used for that. We're working on
providing more comprehensive solution for such use cases in PHP 5.6 and
welcome the ideas in this area.
We note also that using unserialize() on any data that is not the result
of serialize() call continues to be an unsupported scenario and should
not be relied on to produce any specific result.
==============================
5. Changes to existing classes
==============================
- Classes that implement stream wrappers can define a method called
stream_truncate that will respond to truncation, e.g. through ftruncate.
Strictly speaking, this is an addition to the user-space stream wrapper
template, not a change to an actual class.
- Classes that implement stream wrappers can define a method called
stream_metadata that will be called on touch(), chmod(), chgrp(), chown().
- Arrays cast from SimpleXMLElement now always contain all nodes instead of
just the first matching node.
- All SimpleXMLElement children are now always printed when using var_dump(),
var_export(), and print_r().
- Added iterator support in MySQLi. mysqli_result implements Traversable.
- Since 5.4.30, SOAPClient has __getCookies() method.
==============================
6. Changes to existing methods
==============================
- DateTime::parseFromFormat() now has a "+" modifier to allow trailing text in
the string to parse without throwing an error.
- Added the ability to pass options to DOMDocument::loadHTML().
- FilesystemIterator, GlobIterator and (Recursive)DirectoryIterator now use
the default stream context.
- Since 5.4.5, the constructor of ResourceBundle accepts NULL for the first two
arguments.
===========================
7. Deprecated Functionality
===========================
- The following functions are deprecated in PHP 5.4:
- mcrypt_generic_end(): use mcrypt_generic_deinit() instead
- mysql_list_dbs()
========================
8. Removed Functionality
========================
a. Removed features
The following features have been removed from PHP 5.4:
- Magic quotes
- Register globals
- Safe mode
- Session extension bug compatibility mode
- Y2K compliance mode
b. Removed functions
The following functions are no longer available in PHP 5.4:
- define_syslog_variables()
- import_request_variables()
- session_is_registered()
- session_register()
- session_unregister()
- set_magic_quotes_runtime()
- mysqli_bind_param() (alias of mysqli_stmt_bind_param())
- mysqli_bind_result() (alias of mysqli_stmt_bind_result())
- mysqli_client_encoding() (alias of mysqli_character_set_name())
- mysqli_fetch() (alias of mysqli_stmt_fetch())
- mysqli_param_count() (alias of mysqli_stmt_param_count())
- mysqli_get_metadata() (alias of mysqli_stmt_result_metadata())
- mysqli_send_long_data() (alias of mysqli_stmt_send_long_data())
- mysqli::client_encoding() (alias of mysqli::character_set_name)
- mysqli_stmt::stmt() (never worked/always throws, undocumented)
c. Removed syntax
- break $var;
- continue $var;
d. Removed hash algorithms
- Salsa10 and Salsa20, which are actually stream ciphers
====================
9. Extension Changes
====================
a. Extensions no longer maintained
- ext/sqlite is no longer part of the base distribution and has been moved
to PECL. Use sqlite3 or PDO_SQLITE instead.
b. Extensions with changed behavior
- The MySQL extensions (ext/mysql, mysqli and PDO_MYSQL) use mysqlnd
as the default library now. It is still possible to use libmysql by
specifying a path to the configure options.
- PDO_MYSQL: Support for linking with MySQL client libraries older
than 4.1 is removed.
- The session extension now can hook into the file upload feature
in order to provide upload progress information through session
variables.
- SNMP extension
- Functions in SNMP extension now returns FALSE on every error
condition including SNMP-related (no such instance, end of MIB,
etc). Thus, in patricular, breaks previous behavior of get/walk
functions returning an empty string on SNMP-related errors.
- Multi OID get/getnext/set queries are now supported.
- New constants added for use in snmp_set_oid_output_format()
function.
- Function snmp_set_valueretrieval() changed it's behavior:
SNMP_VALUE_OBJECT can be combined with one of
SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY resulting OID value
changes. When no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY
is supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_LIBRARY is used.
Prior to 5.4.0 when no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY
was supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_PLAIN was used.
- Added feature-rich OO API (SNMP class)
- Dropped UCD-SNMP compatibility code. Consider upgrading to
net-snmp v5.3+. Net-SNMP v5.4+ is required for Windows version.
- In sake of adding support for IPv6 DNS name resolution of
remote SNMP agent (peer) is done by extension now, not by Net-SNMP
library anymore.
- Date extension
- Setting the timezone with the TZ environment variable is no longer
supported, instead date.timezone and/or date_default_timezone_set()
have to be used.
- The extension will no longer guess the default timezone if none
is set with date.timezone and/or date_default_timezone_set().
Instead it will always fall back to "UTC".
- Hash extension
- the output of the tiger hash family has been corrected, see
https://bugs.php.net/61307
===========================
10. Changes in SAPI support
===========================
- A REQUEST_TIME_FLOAT value returns a floating point number indicating the
time with microsecond precision. All SAPIs providing this value should be
returning float and not time_t.
- apache_child_terminate(), getallheaders(), apache_request_headers()
and apache_response_headers() are now supported on FastCGI.
- The interactive shell allows a shortcut #inisetting=value to change php.ini
settings at run-time.
- The interactive shell now works with the shared readline extension.
- The interactive shell no longer terminates on fatal errors.
- A new PHP CLI command line option --rz <name> shows information about the
named Zend extension.
===================
11. Windows support
===================
- is_link now works properly for symbolic links on Windows Vista
or later. Earlier systems do not support symbolic links.
- As of PHP 5.4.5 and above the COM extension isn't compiled statically in PHP
anymore but shared. It'll still be delivered with the standard PHP release but
must be activated manually with the "extension = php_com_dotnet.dll" directive
in php.ini.
- Apache 2.4 handler is supported as of PHP 5.4.9
==================
12. New in PHP 5.4
==================
a. New Features
- A built-in CLI web server for testing purposes is now available:
$ php -S 127.0.0.1:8888
- File Upload Progress support is implemented in the Session extension.
b. Syntax additions
- Traits:
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class CanIGetHello {
use HelloWorld;
}
$hello = new CanIGetHello();
$hello->sayHello();
- Function call result array access, e.g.:
foo()[0]
$foo->bar()[0]
- Callable typehint indicating argument must be callable:
function foo(callable $do) {
}
foo("strcmp");
foo(function() {});
$o = new ArrayObject();
foo(array($o, "count"));
- Short array syntax:
$a = [1, 2, 3, 4];
$a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
$a = ['one' => 1, 2, 'three' => 3, 4];
- Binary number format:
0b00100 0b010101
- Chained string array offsets now work.
$a = "abc";
echo $a[0][0];
- Anonymous functions now support using $this and class scope.
Anonymous function can be declared as "static" to ignore the scope.
- Class::{expr}() syntax is now supported:
class A {
static function foo() {
echo "Hello world!\n";
}
}
$x = "f";
$y = "o";
A::{$x.$y.$y}();
- Class member access on instantiation:
(new foo)->method()
(new foo)->property
(new foo)[0]
========================================
5. Changed Functions
========================================
c. New functions
- Core:
- get_declared_traits()
- getimagesizefromstring()
- hex2bin()
- header_register_callback()
- http_response_code()
- stream_set_chunk_size()
- socket_import_stream()
- trait_exists()
========================================
6. New Functions
========================================
- Intl:
- transliterator_create()
- transliterator_create_from_rules()
- transliterator_create_inverse()
- transliterator_get_error_code()
- transliterator_get_error_message()
- transliterator_list_ids()
- transliterator_transliterate()
- LDAP:
- ldap_control_paged_result()
- ldap_control_paged_result_response()
- ldap_modify_batch (5.4.26)
========================================
7. New Classes and Interfaces
========================================
- libxml:
- libxml_set_external_entity_loader()
- mysqli:
- mysqli_error_list()
- mysqli_stmt_error_list()
========================================
8. Removed Extensions
========================================
- pgsql
- pg_escape_identifier() (5.4.4)
- pg_escape_literal() (5.4.4)
- Session:
- session_register_shutdown()
- session_status()
========================================
9. Other Changes to Extensions
========================================
- SPL
- class_uses()
- SplFixedArray
- SplFixedArray::__wakeup() (5.4.18)
========================================
10. New Global Constants
========================================
d. New global constants
- Core
. PHP_INT_MIN added.
- CURLOPT_MAX_RECV_SPEED_LARGE
- CURLOPT_MAX_SEND_SPEED_LARGE
- ENT_DISALLOWED
- ENT_HTML401
- ENT_HTML5
- ENT_SUBSTITUTE
- ENT_XHTML
- ENT_XML1
- IPPROTO_IP
- IPPROTO_IPV6
- IPV6_MULTICAST_HOPS
- IPV6_MULTICAST_IF
- IPV6_MULTICAST_LOOP
- IP_MULTICAST_IF
- IP_MULTICAST_LOOP
- IP_MULTICAST_TTL
- JSON_BIGINT_AS_STRING
- JSON_OBJECT_AS_ARRAY
- JSON_PRETTY_PRINT
- JSON_UNESCAPED_SLASHES
- JSON_UNESCAPED_UNICODE
- LIBXML_HTML_NODEFDTD
- LIBXML_HTML_NOIMPLIED
- LIBXML_PEDANTIC
- MCAST_JOIN_GROUP
- MCAST_LEAVE_GROUP
- MCAST_BLOCK_SOURCE
- MCAST_UNBLOCK_SOURCE
- MCAST_JOIN_SOURCE_GROUP
- MCAST_LEAVE_SOURCE_GROUP
- OPENSSL_CIPHER_AES_128_CBC
- OPENSSL_CIPHER_AES_192_CBC
- OPENSSL_CIPHER_AES_256_CBC
- OPENSSL_RAW_DATA
- OPENSSL_ZERO_PADDING
- PHP_OUTPUT_HANDLER_CLEAN
- PHP_OUTPUT_HANDLER_CLEANABLE
- PHP_OUTPUT_HANDLER_DISABLED
- PHP_OUTPUT_HANDLER_FINAL
- PHP_OUTPUT_HANDLER_FLUSH
- PHP_OUTPUT_HANDLER_FLUSHABLE
- PHP_OUTPUT_HANDLER_REMOVABLE
- PHP_OUTPUT_HANDLER_STARTED
- PHP_OUTPUT_HANDLER_STDFLAGS
- PHP_OUTPUT_HANDLER_WRITE
- PHP_QUERY_RFC1738
- PHP_QUERY_RFC3986
- PHP_SESSION_ACTIVE
- PHP_SESSION_DISABLED
- PHP_SESSION_NONE
- SCANDIR_SORT_ASCENDING
- SCANDIR_SORT_DESCENDING
- SCANDIR_SORT_NONE
- SORT_FLAG_CASE
- SORT_NATURAL
- STREAM_META_ACCESS
- STREAM_META_GROUP
- STREAM_META_GROUP_NAME
- STREAM_META_OWNER
- STREAM_META_OWNER_NAME
- STREAM_META_TOUCH
- T_CALLABLE
- T_INSTEADOF
- T_TRAIT
- T_TRAIT_C
- ZLIB_ENCODING_DEFLATE
- ZLIB_ENCODING_GZIP
- ZLIB_ENCODING_RAW
- U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR
- IDNA_CHECK_BIDI
- IDNA_CHECK_CONTEXTJ
- IDNA_NONTRANSITIONAL_TO_ASCII
- IDNA_NONTRANSITIONAL_TO_UNICODE
- INTL_IDNA_VARIANT_2003
- INTL_IDNA_VARIANT_UTS46
- IDNA_ERROR_EMPTY_LABEL
- IDNA_ERROR_LABEL_TOO_LONG
- IDNA_ERROR_DOMAIN_NAME_TOO_LONG
- IDNA_ERROR_LEADING_HYPHEN
- IDNA_ERROR_TRAILING_HYPHEN
- IDNA_ERROR_HYPHEN_3_4
- IDNA_ERROR_LEADING_COMBINING_MARK
- IDNA_ERROR_DISALLOWED
- IDNA_ERROR_PUNYCODE
- IDNA_ERROR_LABEL_HAS_DOT
- IDNA_ERROR_INVALID_ACE_LABEL
- IDNA_ERROR_BIDI
- IDNA_ERROR_CONTEXTJ
========================================
11. Changes to INI File Handling
========================================
e. New classes
========================================
12. Windows Support
========================================
- Reflection:
- ReflectionZendExtension
- Core
. Support for native 64 bit integers in 64 bit builds
. Support for large files in 64 bit builds
- Intl:
- Transliterator
- Spoofchecker
========================================
13. Other Changes
========================================
- JSON:
- JsonSerializable
- Standard
. call_user_method() and call_user_method_array() no longer exists.
- Session:
- SessionHandler
- SNMP:
- SNMP
- SPL:
- CallbackFilterIterator
- RecursiveCallbackFilterIterator
f. New methods
- Closure:
- Closure::bind()
- Closure::bindTo()
- Reflection:
- ReflectionClass::getTraitAliases()
- ReflectionClass::getTraitNames()
- ReflectionClass::getTraits()
- ReflectionClass::isCloneable()
- ReflectionClass::isTrait()
- ReflectionClass::newInstanceWithoutConstructor()
- ReflectionExtension::isPersistent()
- ReflectionExtension::isTemporary()
- ReflectionFunction::getClosure()
- ReflectionFunction::getClosureScopeClass()
- ReflectionFunction::getClosureThis()
- ReflectionFunctionAbstract::getClosureScopeClass()
- ReflectionFunctionAbstract::getClosureThis()
- ReflectionMethod::getClosure()
- ReflectionMethod::getClosureScopeClass()
- ReflectionMethod::getClosureThis()
- ReflectionObject::getTraitAliases()
- ReflectionObject::getTraitNames()
- ReflectionObject::getTraits()
- ReflectionObject::isCloneable()
- ReflectionObject::isTrait()
- ReflectionObject::newInstanceWithoutConstructor()
- ReflectionParameter::canBePassedByValue()
- ReflectionParameter::isCallable()
- PDO_DBLIB:
- PDO::newRowset()
- SPL:
- DirectoryIterator::getExtension()
- RegexIterator::getRegex()
- SplDoublyLinkedList::serialize()
- SplDoublyLinkedList::unserialize()
- SplFileInfo::getExtension()
- SplFileObject::fputcsv()
- SplObjectStorage::getHash()
- SplQueue::serialize
- SplQueue::unserialize
- SplStack::serialize
- SplStack::unserialize
- SplTempFileObject::fputcsv
- XSLT:
- XsltProcessor::setSecurityPrefs()
- XsltProcessor::getSecurityPrefs()
- Zlib:
- zlib_decode()
- zlib_encode()
g. New Hash algorithms
- fnv132
- fnv164
- joaat
+180 -73
View File
@@ -3,16 +3,16 @@ $Id$
UPGRADE NOTES - PHP X.Y
1. Internal API changes
a. Addition of do_operation and compare object handlers
b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros
c. POST data handling
d. Arginfo changes
e. New data types
f. zend_parse_parameters() specs
g. sprintf() formats
h. HashTable API
i. New portable macros for large file support
j. New portable macros for integers
a. virtual_file_ex
b. stat/lstat support
c. readlink support
d. layout of some core ZE structures (zend_op_array, zend_class_entry, ...)
e. Zend\zend_fast_cache.h has been removed
f. streams that enclose private streams
g. leak_variable
h. API Signature changes
i. new TSRM function expand_filepath_with_mode
j. unserialization of manipulated object strings
2. Build system changes
a. Unix build system changes
@@ -23,93 +23,200 @@ UPGRADE NOTES - PHP X.Y
1. Internal API changes
========================
a. zend_set_memory_limit() now takes the TSRMLS_CC macro as its last argument
e. New data types
a. virtual_file_ex
String
virtual_file_ex takes now a TSRM context as last parameter:
CWD_API int virtual_file_ex(cwd_state *state, const char *path,
verify_path_func verify_path, int use_realpath TSRLS_DC);
Besides the old way of accepting the strings with 's', the new 'S' ZPP spec
was introduced. It expects an argument of the type zend_string *. String lengths
in it do no more depend on the firm 'int' datatype. The replacement
is a platform dependent size_t datatype called php_size_t.
String length is defined as zend_size_t inside Zend and aliased as php_size_t
anywhere else. The inclusion of php.h is necessary.
b. stat/lstat support
Integer types
lstat is now available on all platforms. On unix-like platform
php_sys_lstat is an alias to lstat (when avaible). On Windows it is now
available using php_sys_lstat. php_sys_stat and php_sys_lstat usage is recommended
instead of calling lstat directly, to ensure portability.
Integers do no more depend on the firm 'long' type. Instead a platform
dependent integer type is used. That datatype is defined dynamically to
guarantee the consistent 64 bit support. The zval field representing user
land integer it bound to php_int_t.
Signed integer is defined as zend_int_t, unsigned integer as zend_uint_t
inside Zend. Both are aliased as php_int_t and php_uint_t anywhere else,
respectively. The inclusion of php.h is necessary.
c. readlink support
Other datatypes
readlink is now available on all platforms. On unix-like platform
php_sys_readlink is an alias to readlink (when avaible). On Windows it is now
available using php_sys_readlink. php_sys_readlink usage is recommended
instead of calling readlink directly, to ensure portability.
zend_off_t - portable off_t analogue
zend_stat_t - portable 'struct stat' analogue
These datatypes are declared to be portable across platforms. Thus, direct
usage of the functions like fseek, stat, etc. as well as direct usage of
off_t and struct stat is strongly not recommended. Instead the portable
macros should be used.
d. layout of some core ZE structures (zend_op_array, zend_class_entry, ...)
zend_fseek - portable fseek equivalent
zend_ftell - portable ftell equivalent
zend_lseek - portable lseek equivalent
zend_fstat - portable fstat equivalent
zend_stat - portable stat equivalent
. zend_function.pass_rest_by_reference is replaced by
ZEND_ACC_PASS_REST_BY_REFERENCE in zend_function.fn_flags
. zend_function.return_reference is replaced by ZEND_ACC_RETURN_REFERENCE
in zend_function.fn_flags
. zend_arg_info.required_num_args removed. it was needed only for internal
functions. Now the first arg_info for internal function (which has special
meaning) is represented by zend_internal_function_info structure.
. zend_op_array.size, size_var, size_literal, current_brk_cont,
backpatch_count moved into CG(context), because they are used only during
compilation.
. zend_op_array.start_op is moved into EG(start_op), because it's used
only for 'interactive' execution of single top-level op-array.
. zend_op_array.done_pass_two is replaced by ZEND_ACC_DONE_PASS_TWO in
zend_op_array.fn_flags.
. op_array.vars array is trimmed (reallocated) during pass_two.
. zend_class_entry.constants_updated is replaced by
ZEND_ACC_CONSTANTS_UPDATED in zend_class_entry.ce_flags
. the size of zend_class_entry is reduced by sharing the same memory space
by different information for internal and user classes.
See zend_class_inttry.info union.
f. zend_parse_parameters() specs
e. Zend\zend_fast_cache.h
The new spec 'S' introduced, which expects an argument of type zend_string *.
The new specs 'i' and 'I' introduced, which expect an argument of type php_int_t.
It should not have been used anymore since php5, but now this header has
been removed. The following macros are not available anymore:
g. sprintf() formats
ZEND_FAST_ALLOC(p, type, fc_type)
ZEND_FAST_FREE(p, fc_type)
ZEND_FAST_ALLOC_REL(p, type, fc_type)
ZEND_FAST_FREE_REL(p, fc_type)
New printf modifier 'p' was implemented to platform independently output php_int_t,
php_uint_t and php_size_t datatypes. That modifier can be used with'd', 'u', 'x' and 'o'
printf format specs with spprintf, snprintf and the wrapping printf implementations.
%pu is sufficient for both php_uint_t and php_size_t. the code using %p spec to output
pointer address might need to be enclosed into #ifdef when it unlickily followed by 'd',
'u', 'x' or 'o'.
Use emalloc, emalloc_rel, efree or efree_rel instead.
The only exceptions are the snprintf and zend_sprintf functions yet, because in some cases
they can use the implemenations available on the system, not the PHP one. Fro snprintf the
the macros ZEND_INT_FMT ZEND_UINT_FMT should be used.
h. HashTable API
f. Streams that enclose private streams
Datatype for array indexes was changed to php_uint_t, for string keys to zend_string *.
Some streams, like the temp:// stream, may enclose private streams. If the
outer stream leaks due to a programming error or is not exposed through a
zval (and therefore is not deleted when all the zvals are gone), it will
be destroyed on shutdown.
The problem is that the outer usually wants itself to close the inner stream,
so that it may do any other shutdown action that requires the inner stream to
be live (e.g. commit data to it). If the outer stream is exposed through a
zval and the inner one isn't, this is not a problem because the outer stream
will be freed when the zval is destroyed, which happens before the resources
are destroyed on shutdown.
On resource list shutdown, the cleanup happens in reverse order of resource
creation, so if the inner stream was created in the opener of the outer stream,
it will be destroyed first.
The following functions were added to the streams API to force a predictable
destruction order:
i. New portable macros for large file support
PHPAPI php_stream *php_stream_encloses(php_stream *enclosing, php_stream *enclosed);
#define php_stream_free_enclosed(stream_enclosed, close_options)
PHPAPI int _php_stream_free_enclosed(php_stream *stream_enclosed, int close_options TSRMLS_DC);
Function(s) Alias Comment
stat, _stat64 zend_stat for use with zend_stat_t
fstat, _fstat64 zend_fstat for use with zend_stat_t
lseek, _lseeki64 zend_lseek for use with zend_off_t
ftell, _ftelli64 zend_ftell for use with zend_off_t
fseek, _fseeki64 zend_fseek for use with zend_off_t
Additionally, the following member was added to php_stream:
j. New portable macros for integers
struct _php_stream *enclosing_stream;
and the following macro was added:
Function(s) Alias Comment
snprintf with "%ld" or "%lld", _ltoa_s, _i64toa_s ZEND_ITOA for use with zend_int_t
atol, atoll, _atoi64 ZEND_ATOI for use with zend_int_t
strtol, strtoll, _strtoi64 ZEND_STRTOI for use with zend_int_t
strtoul, strtoull, _strtoui64 ZEND_STRTOUI for use with zend_int_t
abs, llabs, _abs64 ZEND_ABS for use with zend_int_t
- ZEND_INT_MAX Aliased with PHP_INT_MAX in php.h, replaces LONG_MAX where appropriate
- ZEND_INT_MIN Aliased with PHP_INT_MIN in php.h, replaces LONG_MIN where appropriate
- ZEND_UINT_MAX ULONG_MAX
- SIZEOF_ZEND_INT Replaces SIZEOF_ZEND_LONG where appropriate
- ZEND_SIZE_MAX Max value of zend_size_t
#define PHP_STREAM_FREE_IGNORE_ENCLOSING 32
The function php_stream_encloses declares the first stream encloses the second.
This has the effect that, when the inner stream is closed from a resource
destructor it will abort and try to free its enclosing stream instead.
To prevent this from happening when the inner stream is freed from the outer
stream, the macro php_stream_free_enclosed should be used instead of
php_stream_free/php_stream_close/php_stream_pclose, or the flag
PHP_STREAM_FREE_IGNORE_ENCLOSING should be directly passed to php_stream_free.
The outer stream cannot abstain, in its close callback, from closing the inner
stream or clear the enclosing_stream pointer in its enclosed stream by calling
php_stream_encloses with the 2nd argument NULL. If this is not done, there will
be problems, so observe this requirement when using php_stream_encloses.
g. leak_variable
The function leak_variable(variable [, leak_data]) was added. It is only
available on debug builds. It increments the refcount of a zval or, if the
second argument is true and the variable is either an object or a resource
it increments the refcounts of those objects instead.
h. API Signature changes
. zend_list_insert
ZEND_API int zend_list_insert(void *ptr, int type TSRMLS_DC);
call: zend_list_insert(a, SOMETYPE TSRMLS_CC);
NB: If zend_list_insert is used to register a resource,
ZEND_REGISTER_RESOURCE could be used instead.
. php_le_stream_context(TSRMLS_C)
PHPAPI php_stream_context *php_stream_context_alloc(TSRMLS_D)
call: context = php_stream_context_alloc(TSRMLS_C);
. php_stream_context_alloc
PHPAPI php_stream_context *php_stream_context_alloc(TSRMLS_D);
call: context = php_stream_context_alloc(TSRMLS_C);
. sapi_get_request_time(TSRMLS_D);
SAPI_API double sapi_get_request_time(TSRMLS_D);
. sapi_register_default_post_reader
SAPI_API int sapi_register_default_post_reader(void (*default_post_reader)(TSRMLS_D) TSRMLS_DC);
. sapi_register_treat_data
SAPI_API int sapi_register_treat_data(void (*treat_data)(int arg, char *str, zval *destArray TSRMLS_DC) TSRMLS_DC);
. sapi_register_input_filter
SAPI_API int sapi_register_input_filter(unsigned int (*input_filter)(int arg, char *var, char **val, unsigned int val_len, unsigned int *new_val_len TSRMLS_DC), unsigned int (*input_filter_init)(TSRMLS_D) TSRMLS_DC);
. tsrm_win32_access
TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC);
. popen_ex (win32)
TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env TSRMLS_DC);
. php_get_current_user
PHPAPI php_get_current_user(TSRMLS_D)
Call: char *user = php_get_current_user(TSRMLS_C);
. php_idate
PHPAPI php_idate(char format, time_t ts, int localtime TSRMLS_DC)
Call: int ret = php_idate(format, ts, localtime TSRMLS_CC)
. php_escape_html_entities
(size_t parameters were ints, previous "quote_style" (now flags) has expanded meaning)
PHPAPI char *php_escape_html_entities(unsigned char *old, size_t oldlen, size_t *newlen, int all, int flags, char *hint_charset TSRMLS_DC);
. php_escape_html_entities_ex
PHPAPI char *php_escape_html_entities_ex(unsigned char *old, size_t oldlen, size_t *newlen, int all, int flags, char *hint_charset, zend_bool double_encode TSRMLS_DC);
. php_unescape_html_entities
PHPAPI char *php_unescape_html_entities(unsigned char *old, size_t oldlen, size_t *newlen, int all, int flags, char *hint_charset TSRMLS_DC);
i.
PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, const char *relative_to, size_t relative_to_len, int realpath_mode TSRMLS_DC);
expand_filepath_with_mode lets define how realpath will behave, using one of the existing mode: CWD_EXPAND , CWD_FILEPATH or CWD_REALPATH.
j.
Strings requiring unserialization of objects are now explicitly checked
whether the object they contain implements the Serializable interface.
This solves the situation where manipulated strings could be passed for
objects using Serializable to disallow serialization. An object
implementing Serializable will always start with "C:" in the serialized
string, all other objects are represented with starting "O:". Objects
implementing Serializable to disable serialization using
zend_class_unserialize_deny and zend_class_serialize_deny, when
instantiated from the serializer with a manipulated "O:" string at the
start, will most likely be defectively initialized. This is now
fixed at the appropriate place by checking for the presence of the
serialize callback in the class entry.
========================
2. Build system changes
========================
a. Unix build system changes
- Changes in SAPI module build:
. When adding new binary SAPI (executable, like CLI/CGI/FPM) use CLI config.m4 and Makefile.frag files as templates and replace CLI/cli with your SAPI name.
- New macros:
. PHP_INIT_DTRACE(providerdesc, header-file, sources [, module])
b. Windows build system changes
-
+3 -4
View File
@@ -17,8 +17,7 @@ libZend_la_SOURCES=\
zend_objects_API.c zend_ts_hash.c zend_stream.c \
zend_default_classes.c \
zend_iterators.c zend_interfaces.c zend_exceptions.c \
zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \
zend_generators.c zend_virtual_cwd.c zend_ast.c
zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c
libZend_la_LDFLAGS =
libZend_la_LIBADD = @ZEND_EXTRA_LIBS@
@@ -32,7 +31,7 @@ zend_ini_scanner.lo: zend_ini_parser.h
# Language parser/scanner rules
zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
$(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
zend_language_parser.h: zend_language_parser.c
zend_language_parser.c: $(srcdir)/zend_language_parser.y
@@ -44,7 +43,7 @@ zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c
zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
$(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
zend_ini_parser.h: zend_ini_parser.c
+3 -3
View File
@@ -9,11 +9,11 @@ Modified: 2001-09-17
1. Background/Need
==================
Many internal functions of PHP will reject parameters because of their
Many internal function of PHP will reject parameters because of their
type (the array and variable function come to mind). For userland
this is not an easy task as there is no uniform way to do it. An
addition to the engine for requiring loose types would allow
developers to know that the data passed to their functions are of the
delevopers to know that the data passed to their functions is of the
correct type and reduce the need for duplicating the same code in
every function to check for the type of data.
@@ -57,7 +57,7 @@ function foo (array $var){
===========
Mis-matches in type should be reported as fatal errors and should halt
the execution of a script as that function cannot be run and code
the execution of a script as that function can not be run and code
following could not reliably run.
-12
View File
@@ -119,10 +119,6 @@ SOURCE=.\zend_API.c
# End Source File
# Begin Source File
SOURCE=.\zend_ast.c
# End Source File
# Begin Source File
SOURCE=.\zend_builtin_functions.c
# End Source File
# Begin Source File
@@ -163,10 +159,6 @@ SOURCE=.\zend_float.c
# End Source File
# Begin Source File
SOURCE=.\zend_generators.c
# End Source File
# Begin Source File
SOURCE=.\zend_hash.c
# End Source File
# Begin Source File
@@ -269,10 +261,6 @@ SOURCE=.\zend_variables.c
SOURCE=.\zend_vm_opcodes.c
# End Source File
# Begin Source File
SOURCE=.\zend_virtual_cwd.c
# End Source File
# End Group
# Begin Group "Header Files"
-8
View File
@@ -140,10 +140,6 @@ SOURCE=.\zend_alloc.c
# End Source File
# Begin Source File
SOURCE=.\zend_ast.c
# End Source File
# Begin Source File
SOURCE=.\zend_API.c
# End Source File
# Begin Source File
@@ -189,10 +185,6 @@ SOURCE=.\zend_extensions.c
# End Source File
# Begin Source File
SOURCE=.\zend_generators.c
# End Source File
# Begin Source File
SOURCE=.\zend_hash.c
# End Source File
# Begin Source File
+9 -18
View File
@@ -3,13 +3,8 @@ dnl
dnl This file contains local autoconf functions.
AC_DEFUN([LIBZEND_BISON_CHECK],[
# we only support certain bison versions;
# min: 2.4 (i.e. 204, major * 100 + minor for easier comparison)
bison_version_min="204"
# non-working versions, e.g. "3.0 3.2";
# remove "none" when introducing the first incompatible bison version an
# separate any following additions by spaces
bison_version_exclude="3.0"
# we only support certain bison versions
bison_version_list="1.28 1.35 1.75 1.875 2.0 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.4"
# for standalone build of Zend Engine
test -z "$SED" && SED=sed
@@ -22,22 +17,18 @@ AC_DEFUN([LIBZEND_BISON_CHECK],[
if test -n "$bison_version_vars"; then
set $bison_version_vars
bison_version="${1}.${2}"
bison_version_num="`expr ${1} \* 100 + ${2}`"
if test $bison_version_num -ge $bison_version_min; then
php_cv_bison_version="$bison_version (ok)"
for bison_check_version in $bison_version_exclude; do
if test "$bison_version" = "$bison_check_version"; then
php_cv_bison_version=invalid
break
fi
done
fi
for bison_check_version in $bison_version_list; do
if test "$bison_version" = "$bison_check_version"; then
php_cv_bison_version="$bison_check_version (ok)"
break
fi
done
fi
])
fi
case $php_cv_bison_version in
""|invalid[)]
bison_msg="This bison version is not supported for regeneration of the Zend/PHP parsers (found: $bison_version, min: $bison_version_min, excluded: $bison_version_exclude)."
bison_msg="bison versions supported for regeneration of the Zend/PHP parsers: $bison_version_list (found: $bison_version)."
AC_MSG_WARN([$bison_msg])
YACC="exit 0;"
;;
+1 -1
View File
@@ -44,7 +44,7 @@ int(0)
int(2)
int(0)
Warning: Missing argument 2 for test3()%s
Warning: Missing argument 2 for test3() in %s on line %d
int(1)
int(2)
int(1)
+1 -1
View File
@@ -85,7 +85,7 @@ bool(false)
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d
bool(false)
Warning: Missing argument 2 for test3()%s
Warning: Missing argument 2 for test3() in %s on line %d
int(1)
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d
+1 -1
View File
@@ -60,7 +60,7 @@ array(2) {
array(0) {
}
Warning: Missing argument 2 for test3()%s
Warning: Missing argument 2 for test3() in %s on line %d
array(1) {
[0]=>
int(1)
+1 -1
View File
@@ -11,7 +11,7 @@ var_dump($a++);
var_dump(++$b);
var_dump($a->$b);
var_dump($a->$b);
var_dump($a->$b->{$c[1]});
var_dump($a->$b->$c[1]);
?>
--EXPECTF--
-11
View File
@@ -1,11 +0,0 @@
--TEST--
Bug #67468 (Segfault in highlight_file()/highlight_string())
--SKIPIF--
<?php if(!function_exists("leak")) print "skip only for debug builds"; ?>
--FILE--
<?php
highlight_string("<?php __CLASS__;", true);
echo "done";
?>
--EXPECT--
done
-110
View File
@@ -1,110 +0,0 @@
--TEST--
Basic argument unpacking
--FILE--
<?php
function test(...$args) {
var_dump($args);
}
function test2($arg1, $arg2, $arg3 = null) {
var_dump($arg1, $arg2, $arg3);
}
function getArray($array) {
return $array;
}
function arrayGen($array) {
foreach ($array as $element) {
yield $element;
}
}
$array = [1, 2, 3];
test(...[]);
test(...[1, 2, 3]);
test(...$array);
test(...getArray([1, 2, 3]));
test(...arrayGen([]));
test(...arrayGen([1, 2, 3]));
test(1, ...[2, 3], ...[4, 5]);
test(1, ...getArray([2, 3]), ...arrayGen([4, 5]));
test2(...[1, 2]);
test2(...[1, 2, 3]);
test2(...[1], ...[], ...[], ...[2, 3], ...[4, 5]);
?>
--EXPECT--
array(0) {
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(0) {
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
int(1)
int(2)
NULL
int(1)
int(2)
int(3)
int(1)
int(2)
int(3)
-145
View File
@@ -1,145 +0,0 @@
--TEST--
Argument unpacking with by-ref arguments
--FILE--
<?php
error_reporting(E_ALL);
function test1(&...$args) {
foreach ($args as &$arg) {
$arg++;
}
}
test1(...[1, 2, 3]);
$array = [1, 2, 3];
test1(...$array);
var_dump($array);
$array1 = [1, 2]; $array2 = [3, 4];
test1(...$array1, ...$array2);
var_dump($array1, $array2);
function test2($val1, &$ref1, $val2, &$ref2) {
$ref1++;
$ref2++;
}
$array = [0, 0, 0, 0];
test2(...$array);
var_dump($array);
$array1 = [1, 2]; $array2 = [4, 5];
test1(...$array1, ...$array2);
var_dump($array1, $array2);
$a = $b = $c = $d = 0;
$array = [0, 0, 0, 0];
test2($a, ...$array);
var_dump($a, $array);
test2($a, $b, ...$array);
var_dump($a, $b, $array);
test2($a, $b, $c, ...$array);
var_dump($a, $b, $c, $array);
test2($a, $b, $c, $d, ...$array);
var_dump($a, $b, $c, $d, $array);
?>
--EXPECTF--
array(3) {
[0]=>
int(2)
[1]=>
int(3)
[2]=>
int(4)
}
array(2) {
[0]=>
int(2)
[1]=>
int(3)
}
array(2) {
[0]=>
int(4)
[1]=>
int(5)
}
array(4) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(0)
[3]=>
int(1)
}
array(2) {
[0]=>
int(2)
[1]=>
int(3)
}
array(2) {
[0]=>
int(5)
[1]=>
int(6)
}
int(0)
array(4) {
[0]=>
int(1)
[1]=>
int(0)
[2]=>
int(1)
[3]=>
int(0)
}
int(0)
int(1)
array(4) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
[3]=>
int(0)
}
int(0)
int(2)
int(0)
array(4) {
[0]=>
int(2)
[1]=>
int(1)
[2]=>
int(1)
[3]=>
int(0)
}
int(0)
int(3)
int(0)
int(1)
array(4) {
[0]=>
int(2)
[1]=>
int(1)
[2]=>
int(1)
[3]=>
int(0)
}
-37
View File
@@ -1,37 +0,0 @@
--TEST--
Unpack arguments for dynamic call
--FILE--
<?php
$fn = function(...$args) {
var_dump($args);
};
$fn(...[]);
$fn(...[1, 2, 3]);
$fn(1, ...[2, 3], ...[], ...[4, 5]);
?>
--EXPECT--
array(0) {
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
-43
View File
@@ -1,43 +0,0 @@
--TEST--
Argument unpacking with internal functions
--FILE--
<?php
$arrays = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
var_dump(array_map(null, ...$arrays));
?>
--EXPECT--
array(3) {
[0]=>
array(3) {
[0]=>
int(1)
[1]=>
int(4)
[2]=>
int(7)
}
[1]=>
array(3) {
[0]=>
int(2)
[1]=>
int(5)
[2]=>
int(8)
}
[2]=>
array(3) {
[0]=>
int(3)
[1]=>
int(6)
[2]=>
int(9)
}
}
-59
View File
@@ -1,59 +0,0 @@
--TEST--
Only arrays and Traversables can be unpacked
--FILE--
<?php
function test(...$args) {
var_dump($args);
}
test(...null);
test(...42);
test(...new stdClass);
test(1, 2, 3, ..."foo", ...[4, 5]);
test(1, 2, 3, ...new StdClass, ...3.14, ...[4, 5]);
?>
--EXPECTF--
Warning: Only arrays and Traversables can be unpacked in %s on line %d
array(0) {
}
Warning: Only arrays and Traversables can be unpacked in %s on line %d
array(0) {
}
Warning: Only arrays and Traversables can be unpacked in %s on line %d
array(0) {
}
Warning: Only arrays and Traversables can be unpacked in %s on line %d
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
Warning: Only arrays and Traversables can be unpacked in %s on line %d
Warning: Only arrays and Traversables can be unpacked in %s on line %d
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
-15
View File
@@ -1,15 +0,0 @@
--TEST--
Argument unpacking with many arguments
--FILE--
<?php
function fn(...$args) {
var_dump(count($args));
}
$array = array_fill(0, 10000, 42);
fn(...$array, ...$array);
?>
--EXPECT--
int(20000)
-32
View File
@@ -1,32 +0,0 @@
--TEST--
Unpack arguments for method calls
--FILE--
<?php
class Foo {
public function test(...$args) {
var_dump($args);
}
public static function test2(...$args) {
var_dump($args);
}
}
$foo = new Foo;
Foo::test2(1, 2, ...[3, 4], ...[], ...[5]);
?>
--EXPECT--
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
-35
View File
@@ -1,35 +0,0 @@
--TEST--
Unpack arguments for new expression
--FILE--
<?php
class Foo {
public function __construct(...$args) {
var_dump($args);
}
}
new Foo(...[]);
new Foo(...[1, 2, 3]);
new Foo(...[1], ...[], ...[2, 3]);
?>
--EXPECT--
array(0) {
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
@@ -1,10 +0,0 @@
--TEST--
Positional arguments cannot be used after argument unpacking
--FILE--
<?php
var_dump(...[1, 2, 3], 4);
?>
--EXPECTF--
Fatal error: Cannot use positional argument after argument unpacking in %s on line %d
-20
View File
@@ -1,20 +0,0 @@
--TEST--
Argument unpacking does not work with string keys (forward compatibility for named args)
--FILE--
<?php
set_error_handler(function($errno, $errstr) {
var_dump($errstr);
});
var_dump(...[1, 2, "foo" => 3, 4]);
var_dump(...new ArrayIterator([1, 2, "foo" => 3, 4]));
?>
--EXPECTF--
string(36) "Cannot unpack array with string keys"
int(1)
int(2)
string(42) "Cannot unpack Traversable with string keys"
int(1)
int(2)
@@ -1,33 +0,0 @@
--TEST--
Traversables that throw exceptions are properly handled during argument unpack
--FILE--
<?php
function test(...$args) {
var_dump($args);
}
class Foo implements IteratorAggregate {
public function getIterator() {
throw new Exception('getIterator');
}
}
function gen() {
yield 1;
yield 2;
throw new Exception('gen');
}
try {
test(1, 2, ...new Foo, ...[3, 4]);
} catch (Exception $e) { var_dump($e->getMessage()); }
try {
test(1, 2, ...gen(), ...[3, 4]);
} catch (Exception $e) { var_dump($e->getMessage()); }
?>
--EXPECT--
string(11) "getIterator"
string(3) "gen"
@@ -1,31 +0,0 @@
--TEST--
Traversables cannot be unpacked into by-reference parameters
--FILE--
<?php
function test($val1, $val2, $val3, &$ref) {
$ref = 42;
}
function gen($array) {
foreach ($array as $element) {
yield $element;
}
}
test(1, 2, 3, $b, ...gen([4, 5, 6]));
var_dump($b);
test(...gen([1, 2, 3, 4]));
test(1, 2, ...gen([3, 4]));
test(...gen([1, 2]), ...gen([3, 4]));
?>
--EXPECTF--
int(42)
Warning: Cannot pass by-reference argument 4 of test() by unpacking a Traversable, passing by-value instead in %s on line %d
Warning: Cannot pass by-reference argument 4 of test() by unpacking a Traversable, passing by-value instead in %s on line %d
Warning: Cannot pass by-reference argument 4 of test() by unpacking a Traversable, passing by-value instead in %s on line %d
-13
View File
@@ -1,13 +0,0 @@
--TEST--
Identical comparison of array with references
--FILE--
<?php
$foo = 42;
$array1 = [&$foo];
$array2 = [$foo];
var_dump($array1 === $array2);
?>
--EXPECT--
bool(true)
-37
View File
@@ -1,37 +0,0 @@
--TEST--
Bug #18556 (Setting locale to 'tr_TR' lowercases class names)
--FILE--
<?php
$g_lang = 'tr_TR';
putenv("LANG=$g_lang");
setlocale(LC_ALL, $g_lang);
class InfoBlob {
var $foo;
function InfoBlob() {
$this->foo = "Foo";
}
}
echo "Instantiating an infoBlob with a lowercase i\n";
$foobar = new infoBlob();
echo $foobar->foo;
echo "\nInstantiating an InfoBlob with an uppercase I\n";
$foobar = new InfoBlob();
echo $foobar->foo;
echo "\n";
setlocale(LC_ALL, "tr_TR.utf8");
foreach(get_declared_classes() as $class)
{
if(!class_exists($class))
echo "$class No Longer Exists!\n";
}
echo "Done.\n";
?>
--EXPECT--
Instantiating an infoBlob with a lowercase i
Foo
Instantiating an InfoBlob with an uppercase I
Foo
Done.
+1 -1
View File
@@ -6,4 +6,4 @@ Bug #24773 (unset() of integers treated as arrays causes a crash)
unset($array["lvl1"]["lvl2"]["b"]);
?>
--EXPECTF--
Fatal error: Cannot use string offset as an array in %s on line %d
Fatal error: Cannot unset string offsets in %s on line %d
+1 -1
View File
@@ -10,7 +10,7 @@ Bug #27669 (PHP 5 didn't support all possibilities for calling static methods dy
}
}
$y[0] = 'hello';
A::{$y[0]}();
A::$y[0]();
?>
===DONE===
--EXPECTF--
+2 -2
View File
@@ -10,9 +10,9 @@ class foo {
new foo(array(new stdClass));
?>
--EXPECTF--
--EXPECT--
array(1) {
[0]=>
object(stdClass)#%d (0) {
object(stdClass)#2 (0) {
}
}
-1
View File
@@ -2,7 +2,6 @@
Bug #30820 (static member conflict with $this->member silently ignored)
--INI--
error_reporting=4095
opcache.optimization_level=0
--FILE--
<?php
class Blah {
+1
View File
@@ -42,6 +42,7 @@ $page["name"] = A::A_ftk();
Non-static method A::A_ftk() should not be called statically
1 %sbug38047.php:13 get_error_context()
2 %sbug38047.php:36 kalus_error_handler()
3 %sbug38047.php:36 A_ftk()
Missing argument 1 for A::A_ftk(), called in %sbug38047.php on line 36 and defined
1 %sbug38047.php:13 get_error_context()
-2
View File
@@ -64,8 +64,6 @@ print "\nDone\n";
--EXPECTF--
Notice: String offset cast occurred in %s on line %d
Notice: Uninitialized string offset: %s in %s on line 6
Notice: Uninitialized string offset: 0 in %s on line %d
Notice: Uninitialized string offset: 0 in %s on line %d
+2 -2
View File
@@ -9,8 +9,8 @@ echo "I am alive";
--EXPECTF--
Notice: Uninitialized string offset: 0 in %sbug39304.php on line %d
Notice: Uninitialized string offset: 0 in %sbug39304.php on line %d
Notice: Uninitialized string offset: 1 in %sbug39304.php on line %d
Notice: Uninitialized string offset: 0 in %sbug39304.php on line %d
I am alive
+2 -2
View File
@@ -11,8 +11,8 @@ Bug #39304 (Segmentation fault with list unpacking of string offset)
--EXPECTF--
Notice: Uninitialized string offset: 0 in %sbug39304_2_4.php on line %d
Notice: Uninitialized string offset: 0 in %sbug39304_2_4.php on line %d
Notice: Uninitialized string offset: 1 in %sbug39304_2_4.php on line %d
Notice: Uninitialized string offset: 0 in %sbug39304_2_4.php on line %d
string(0) ""
string(0) ""
+1 -1
View File
@@ -24,6 +24,6 @@ Warning: feof(): wrapper::stream_eof is not implemented! Assuming EOF in %s on l
Fatal error: Uncaught exception 'Exception' in %s:%d
Stack trace:
#0 [internal function]: wrapper->stream_eof()
#1 %s(%d): feof(Resource id #%d)
#1 %s(%d): feof(Resource id #6)
#2 {main}
thrown in %s on line %d
+3 -5
View File
@@ -2,8 +2,6 @@
Bug #43450 (Memory leak on some functions with implicit object __toString() call)
--SKIPIF--
<?php if (!function_exists('memory_get_usage')) die('memory_get_usage() not installed'); ?>
--INI--
opcache.enable_cli=0
--FILE--
<?php
error_reporting(E_ALL|E_STRICT);
@@ -18,15 +16,15 @@ class Foo
$num_repeats = 100000;
$start = memory_get_usage() / 1024;
$start = (memory_get_usage() / 1024) + 16;
for ($i=1;$i<$num_repeats;$i++)
{
$foo = new Foo();
md5($foo);
}
$end = memory_get_usage() / 1024;
$end = memory_get_peak_usage() / 1024;
if ($start + 16 < $end) {
if ($start < $end) {
echo 'FAIL';
} else {
echo 'PASS';
+1 -1
View File
@@ -12,4 +12,4 @@ class C extends A implements B {
}
?>
--EXPECTF--
Fatal error: Class C contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (A::foo, B::bar) in %sbug44414.php on line 8
Fatal error: Class C contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (A::foo, B::bar) in %sbug44414.php on line 9
+5 -3
View File
@@ -13,8 +13,10 @@ function eh()
set_error_handler("eh");
$a = $empty($b);
--EXPECTF--
Fatal error: Uncaught exception 'Exception' with message 'error!' in %sbug51394.php:%d
Warning: Uncaught exception 'Exception' with message 'error!' in %sbug51394.php:4
Stack trace:
#0 %sbug51394.php(%d): eh(8, 'Undefined varia%s', '%s', %d, Array)
#0 %sbug51394.php(9): eh(8, 'Undefined varia...', '%s', 9, Array)
#1 {main}
thrown in %sbug51394.php on line %d
thrown in %sbug51394.php on line 4
Fatal error: Function name must be a string in %sbug51394.php on line 9
-12
View File
@@ -35,30 +35,18 @@ Notice: Undefined variable: x in %sbug52041.php on line 3
Warning: Creating default object from empty value in %sbug52041.php on line 8
Notice: Undefined property: stdClass::$a in %sbug52041.php on line 8
Notice: Undefined variable: x in %sbug52041.php on line 3
Notice: Undefined property: stdClass::$a in %sbug52041.php on line 9
Warning: Creating default object from empty value in %sbug52041.php on line 9
Notice: Undefined property: stdClass::$b in %sbug52041.php on line 9
Notice: Undefined variable: x in %sbug52041.php on line 3
Warning: Creating default object from empty value in %sbug52041.php on line 10
Notice: Undefined property: stdClass::$a in %sbug52041.php on line 10
Notice: Undefined variable: x in %sbug52041.php on line 3
Notice: Undefined property: stdClass::$a in %sbug52041.php on line 11
Warning: Creating default object from empty value in %sbug52041.php on line 11
Notice: Undefined property: stdClass::$b in %sbug52041.php on line 11
Notice: Undefined variable: x in %sbug52041.php on line 3
Notice: Undefined variable: x in %sbug52041.php on line 3
+1 -1
View File
@@ -25,7 +25,7 @@ try {
--EXPECTF--
1. exception 'Exception' with message 'aaa' in %sbug52361.php:5
Stack trace:
#0 %sbug52361.php(13): aaa->__destruct()
#0 %sbug52361.php(16): aaa->__destruct()
#1 %sbug52361.php(16): bbb()
#2 {main}
2. exception 'Exception' with message 'bbb' in %sbug52361.php:13
+9 -2
View File
@@ -1,5 +1,5 @@
--TEST--
Bug #54013 (ReflectionParam for duplicate parameter contains garbage) (PHP7)
Bug #54013 (ReflectionParam for duplicate parameter contains garbage)
--FILE--
<?php
@@ -21,4 +21,11 @@ var_dump($params[0], $params[1]);
?>
--EXPECTF--
Fatal error: Redefinition of parameter $aaaaaaaa in %sbug54013.php on line 5
object(ReflectionParameter)#%d (1) {
["name"]=>
string(8) "aaaaaaaa"
}
object(ReflectionParameter)#%d (1) {
["name"]=>
string(8) "aaaaaaaa"
}
+1 -1
View File
@@ -4,7 +4,7 @@ Bug #55007 (compiler fail after previous fail)
<?php
function __autoload($classname) {
if ('CompileErrorClass'==$classname) eval('class CompileErrorClass { function foo() { $a[]; } }');
if ('CompileErrorClass'==$classname) eval('class CompileErrorClass { function foo() { $a[] } }');
if ('MyErrorHandler'==$classname) eval('class MyErrorHandler { function __construct() { print "My error handler runs.\n"; } }');
}
-3
View File
@@ -1,8 +1,5 @@
--TEST--
Bug #55156 (ReflectionClass::getDocComment() returns comment even though the class has none)
--INI--
opcache.save_comments=1
opcache.load_comments=1
--FILE--
<?php
+1 -1
View File
@@ -7,4 +7,4 @@ namespace foo {
?>
--EXPECTF--
Parse error: syntax error, unexpected end of file in %s on line %d
Fatal error: __HALT_COMPILER() can only be used from the outermost scope in %s on line %d
+3 -5
View File
@@ -3,18 +3,18 @@ Bug #60536 (Traits Segfault)
--FILE--
<?php
trait T { private $x = 0; }
class X {
class X {
use T;
}
class Y extends X {
use T;
function x() {
return ++$this->x;
return ++$this->x;
}
}
class Z extends Y {
function z() {
return ++$this->x;
return ++$this->x;
}
}
$a = new Z();
@@ -22,6 +22,4 @@ $a->x();
echo "DONE";
?>
--EXPECTF--
Notice: Undefined property: Z::$x in %s on line 14
DONE
-22
View File
@@ -1,22 +0,0 @@
--TEST--
Bug #60738 Allow 'set_error_handler' to handle NULL
--FILE--
<?php
var_dump(set_error_handler(
function() { echo 'Intercepted error!', "\n"; }
));
trigger_error('Error!');
var_dump(set_error_handler(null));
trigger_error('Error!');
?>
--EXPECTF--
NULL
Intercepted error!
object(Closure)#1 (0) {
}
Notice: Error! in %s on line %d
-23
View File
@@ -1,23 +0,0 @@
--TEST--
Bug #60738 Allow 'set_error_handler' to handle NULL
--FILE--
<?php
var_dump(set_exception_handler(
function() { echo 'Intercepted exception!', "\n"; }
));
var_dump(set_exception_handler(null));
throw new Exception('Exception!');
?>
--EXPECTF--
NULL
object(Closure)#1 (0) {
}
Fatal error: Uncaught exception 'Exception' with message 'Exception!' in %s:%d
Stack trace:
#0 {main}
thrown in %s on line %d
+3 -6
View File
@@ -1,5 +1,5 @@
--TEST--
Bug #60825 (Segfault when running symfony 2 tests) (PHP7)
Bug #60825 (Segfault when running symfony 2 tests)
--DESCRIPTION--
run this with valgrind
--FILE--
@@ -13,10 +13,7 @@ class test {
}
$a = new test;
require_once $a;
debug_zval_dump($a, test::$x);
debug_zval_dump(test::$x);
?>
--EXPECTF--
object(test)#%d (0) refcount(%d){
}
object(test)#%d (0) refcount(%d){
}
string(%d) "%sbug60825.php" refcount(2)
-40
View File
@@ -1,40 +0,0 @@
--TEST--
Bug #60833 (self, parent, static behave inconsistently case-sensitive)
--FILE--
<?php
class A {
static $x = "A";
function testit() {
$this->v1 = new sELF;
$this->v2 = new SELF;
}
}
class B extends A {
static $x = "B";
function testit() {
PARENT::testit();
$this->v3 = new sELF;
$this->v4 = new PARENT;
$this->v4 = STATIC::$x;
}
}
$t = new B();
$t->testit();
var_dump($t);
?>
--EXPECTF--
object(B)#%d (4) {
["v1"]=>
object(A)#%d (0) {
}
["v2"]=>
object(A)#%d (0) {
}
["v3"]=>
object(B)#%d (0) {
}
["v4"]=>
string(1) "B"
}
-27
View File
@@ -1,27 +0,0 @@
--TEST--
Bug #61025 (__invoke() visibility not honored)
--FILE--
<?php
Interface InvokeAble {
static function __invoke();
}
class Bar {
private function __invoke() {
return __CLASS__;
}
}
$b = new Bar;
echo $b();
echo $b->__invoke();
?>
--EXPECTF--
Warning: The magic method __invoke() must have public visibility and cannot be static in %sbug61025.php on line %d
Warning: The magic method __invoke() must have public visibility and cannot be static in %sbug61025.php on line %d
Bar
Fatal error: Call to private method Bar::__invoke() from context '' in %sbug61025.php on line %d
-11
View File
@@ -1,11 +0,0 @@
--TEST--
Bug #61681: Malformed grammar
--FILE--
<?php
$la = "ooxx";
echo "${substr('laruence', 0, 2)}";
?>
--EXPECT--
ooxx
+7 -5
View File
@@ -17,16 +17,18 @@ $undefined->foo();
--EXPECTF--
Error handler called (Undefined variable: undefined)
Fatal error: Uncaught exception 'ErrorException' with message 'Undefined variable: undefined' in %sbug61767.php:%d
Warning: Uncaught exception 'ErrorException' with message 'Undefined variable: undefined' in %sbug61767.php:13
Stack trace:
#0 %sbug61767.php(%d): {closure}(%s, 'Undefined varia...', '%s', %d, Array)
#0 %sbug61767.php(13): {closure}(8, 'Undefined varia...', '%s', 13, Array)
#1 {main}
thrown in %sbug61767.php on line %d
thrown in %sbug61767.php on line 13
Fatal error: Call to a member function foo() on a non-object in %sbug61767.php on line 13
Shutting down
Array
(
[type] => 1
[message] => %a
[message] => Call to a member function foo() on a non-object
[file] => %sbug61767.php
[line] => %d
[line] => 13
)
-2
View File
@@ -9,8 +9,6 @@ function add_points($player, $points) {
add_points(NULL, 2);
--EXPECTF--
Warning: Creating default object from empty value in %sbug62005.php on line %d
Notice: Undefined property: stdClass::$energy in %sbug62005.php on line 3
stdClass Object
(
[energy] => 2
-50
View File
@@ -1,50 +0,0 @@
--TEST--
Bug #62991 (Segfault with generator and closure)
--FILE--
<?php
function test( array $array )
{
$closure = function() use ( $array ) {
print_r( $array );
yield "hi";
};
return $closure();
}
function test2( array $array )
{
$closure = function() use ( $array ) {
print_r( $array );
yield "hi";
};
return $closure; // if you return the $closure and call it outside this function it works.
}
$generator = test(array( 1, 2, 3 ) );
foreach($generator as $something) {
}
$generator = test2(array( 1, 2, 3 ) );
foreach($generator() as $something) {
}
$generator = test2(array( 1, 2, 3 ) );
echo "okey\n";
?>
--EXPECT--
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 3
)
okey
-50
View File
@@ -1,50 +0,0 @@
--TEST--
Bug #63741 (Crash when autoloading from spl)
--FILE--
<?php
file_put_contents(dirname(__FILE__)."/bug63741.tmp.php",
<<<'EOT'
<?php
if (isset($autoloading))
{
class ClassToLoad
{
static function func ()
{
print "OK!\n";
}
}
return;
}
else
{
class autoloader
{
static function autoload($classname)
{
print "autoloading...\n";
$autoloading = true;
include __FILE__;
}
}
spl_autoload_register(["autoloader", "autoload"]);
function start()
{
ClassToLoad::func();
}
start();
}
?>
EOT
);
include dirname(__FILE__)."/bug63741.tmp.php";
?>
--CLEAN--
<?php unlink(dirname(__FILE__)."/bug63741.tmp.php"); ?>
--EXPECT--
autoloading...
OK!
-17
View File
@@ -1,17 +0,0 @@
--TEST--
Bug #64135 (Exceptions from set_error_handler are not always propagated)
--FILE--
<?php
function exception_error_handler() {
throw new Exception();
}
set_error_handler("exception_error_handler");
try {
$undefined->undefined();
} catch(Exception $e) {
echo "Exception is thrown";
}
--EXPECT--
Exception is thrown
+3 -3
View File
@@ -1,5 +1,5 @@
--TEST--
Bug #64515 (Memoryleak when using the same variablename 2times in function declaration) (PHP7)
Bug #64515 (Memoryleak when using the same variablename 2times in function declaration)
--FILE--
<?php
function foo($unused = null, $unused = null, $arg = array()) {
@@ -8,5 +8,5 @@ function foo($unused = null, $unused = null, $arg = array()) {
foo();
echo "okey";
?>
--EXPECTF--
Fatal error: Redefinition of parameter $unused in %sbug64515.php on line 2
--EXPECT--
okey
-42
View File
@@ -1,42 +0,0 @@
--TEST--
Bug #64555: Array key within interned string gets wrong hash value
--FILE--
<?php
class Foo {
protected $unsetme = 1;
protected $keepme = 2;
public function test() {
$a = get_object_vars($this);
foreach ($a as $k => $v) {
if ($k == 'unsetme') {
echo "Unsetting: $k\n";
unset($a[$k]);
} else if ($k == 'keepme') {
echo "Changing: $k\n";
$a[$k] = 42;
$a['keepme'] = 43;
}
}
var_dump($a, array_keys($a));
}
}
$f = new Foo;
$f->test();
?>
--EXPECT--
Unsetting: unsetme
Changing: keepme
array(1) {
["keepme"]=>
int(43)
}
array(1) {
[0]=>
string(6) "keepme"
}
-21
View File
@@ -1,21 +0,0 @@
--TEST--
Bug #64677 (execution operator `` stealing surrounding arguments)
--FILE--
<?PHP
class cat {
public function show_output($prepend, $output = '') {
}
}
$cat = new cat();
$cat->show_output('Files: ', trim(`cd .`)); // this gives invalid args to shell_exec
$cat->show_output('Files: ', `cd .`); // this causes a segmentation fault
$cat->show_output(`cd .`); // this causes a segmentation fault
function show_outputa($prepend, $output) {
echo "Okey";
}
show_outputa('Files: ', `cd .`); // this works as expected
?>
--EXPECT--
Okey
+3 -1
View File
@@ -1,5 +1,7 @@
--TEST--
Bug #64896 (Segfault with gc_collect_cycles using unserialize on certain objects)
--XFAIL--
We can not fix this bug without a significant (performace slow down) change to gc
--FILE--
<?php
$bar = NULL;
@@ -36,7 +38,7 @@ object(bad)#4 (1) {
*/
?>
--EXPECTF--
object(bad)#%d (1) {
bject(bad)#%d (1) {
["_private":"bad":private]=>
array(1) {
[0]=>
-30
View File
@@ -1,30 +0,0 @@
--TEST--
Bug #64979 (Wrong behavior of static variables in closure generators)
--FILE--
<?php
function new_closure_gen() {
return function() {
static $foo = 0;
yield ++$foo;
};
}
$closure1 = new_closure_gen();
$closure2 = new_closure_gen();
$gen1 = $closure1();
$gen2 = $closure1();
$gen3 = $closure2();
foreach (array($gen1, $gen2, $gen3) as $gen) {
foreach ($gen as $val) {
var_dump($val);
}
}
?>
--EXPECT--
int(1)
int(2)
int(1)
-23
View File
@@ -1,23 +0,0 @@
--TEST--
Bug #65051: count() off by one inside unset()
--FILE--
<?php
class Foo {
public $array;
public function __destruct() {
var_dump(count($this->array[0]));
var_dump($this->array[0]);
}
}
$array = [[new Foo]];
$array[0][0]->array =& $array;
unset($array[0][0]);
?>
--EXPECT--
int(0)
array(0) {
}
-60
View File
@@ -1,60 +0,0 @@
--TEST--
Fixed Bug #65784 (Segfault with finally)
--FILE--
<?php
function foo1() {
try {
throw new Exception("not catch");
return true;
} finally {
try {
throw new Exception("catched");
} catch (Exception $e) {
}
}
}
try {
$foo = foo1();
var_dump($foo);
} catch (Exception $e) {
do {
var_dump($e->getMessage());
} while ($e = $e->getPrevious());
}
function foo2() {
try {
try {
throw new Exception("catched");
return true;
} finally {
try {
throw new Exception("catched");
} catch (Exception $e) {
}
}
} catch (Exception $e) {
}
}
$foo = foo2();
var_dump($foo);
function foo3() {
try {
throw new Exception("not catched");
return true;
} finally {
try {
throw new NotExists();
} catch (Exception $e) {
}
}
}
$bar = foo3();
--EXPECTF--
string(9) "not catch"
NULL
Fatal error: Class 'NotExists' not found in %sbug65784.php on line %d
-35
View File
@@ -1,35 +0,0 @@
--TEST--
Bug #66015 (wrong array indexing in class's static property)
--FILE--
<?php
class Test
{
const FIRST = 1;
const SECOND = 2;
const THIRD = 3;
protected static $array = [
self::FIRST => 'first',
'second',
'third',
4,
];
public function __construct()
{
var_export(self::$array);
}
}
$test = new Test();
?>
===DONE===
--EXPECTF--
array (
1 => 'first',
2 => 'second',
3 => 'third',
4 => 4,
)
===DONE===
-14
View File
@@ -1,14 +0,0 @@
--TEST--
Bug #66252 (Problems in AST evaluation invalidating valid parent:: reference)
--FILE--
<?php
class A {
const HW = "this is A";
}
class B extends A {
const BHW = parent::HW . " extended by B";
}
const C = B::BHW;
echo C, "\n";
--EXPECT--
this is A extended by B
-73
View File
@@ -1,73 +0,0 @@
--TEST--
Bug #66608 (Incorrect behavior with nested "finally" blocks)
--FILE--
<?php
function bar() {
try {
echo "1\n";
try {
} finally {
try {
} finally {
}
echo "2\n";
}
} finally {
try {
throw new Exception ("");
} catch (Exception $ab) {
echo "3\n";
} finally {
try {
} finally {
echo "4\n";
try {
} finally {
}
echo "5\n";
}
}
echo "6\n";
try {
} finally {
while (1) {
try {
echo "7\n";
break;
} finally {
echo "8\n";
}
echo "bad";
}
echo "9\n";
while (1) {
try {
throw new Exception("");
} catch(Exception $e) {
echo "10\n";
break;
} finally {
echo "11\n";
}
echo "bak\n";
}
}
echo "12\n";
}
echo "13\n";
}
bar();
--EXPECT--
1
2
3
4
5
6
7
8
9
10
11
12
13
-13
View File
@@ -1,13 +0,0 @@
--TEST--
Bug #66660 (Composer.phar install/update fails)
--STDIN--
<?php __CLASS__ ?>
--FILE--
<?php
file_put_contents(__DIR__."/bug66660.tmp.php", "<?php __CLASS__ ?>");
echo php_strip_whitespace(__DIR__."/bug66660.tmp.php");
?>
--CLEAN--
<?php unlink(__DIR__."/bug66660.tmp.php"); ?>
--EXPECT--
<?php __CLASS__ ?>
-26
View File
@@ -1,26 +0,0 @@
--TEST--
Bug #67169: array_splice all elements, then []= gives wrong index
--FILE--
<?php
$array = array('a', 'b');
array_splice($array, 0, 2);
$array[] = 'c';
var_dump($array);
$array = array('a', 'b');
array_shift($array);
array_shift($array);
$array[] = 'c';
var_dump($array);
?>
--EXPECT--
array(1) {
[0]=>
string(1) "c"
}
array(1) {
[0]=>
string(1) "c"
}
-12
View File
@@ -1,12 +0,0 @@
--TEST--
Bug #67368 (Memory leak with immediately dereferenced array in class constant)
--INI--
report_memleaks=1
--FILE--
<?php
class FooBar {
const bar = ["bar" => 3]["bar"];
}
echo "okey";
--EXPECTF--
okey
-11
View File
@@ -1,11 +0,0 @@
--TEST--
Bug #67856 (Leak when using array_reduce with by-ref function)
--FILE--
<?php
$array = [1, 2, 3];
var_dump(array_reduce($array, function(&$a, &$b) {
return $a + $b;
}, 0));
?>
--EXPECT--
int(6)
-19
View File
@@ -1,19 +0,0 @@
--TEST--
Bug #67858: Leak when $php_errormsg already set
--INI--
track_errors=1
error_reporting=E_ALL
--FILE--
<?php
function f() {
$php_errormsg = [1, 2, 3];
echo $var;
var_dump($php_errormsg);
}
f();
?>
--EXPECTF--
Notice: Undefined variable: var in %s on line %d
string(23) "Undefined variable: var"
Loaded 100 of 3339 files, more files were not shown because too many files have changed in this diff. Show more