mirror of
https://github.com/bdnugget/php-src.git
synced 2026-11-10 02:30:50 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7c3d28e89 | ||
|
|
28ce2acb7a |
No files matched your search
@@ -23,8 +23,6 @@ sapi/continuity/capi.c ident
|
||||
Zend/RFCs/002.txt ident
|
||||
Zend/RFCs/003.txt 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
|
||||
|
||||
+2
-2
@@ -8,7 +8,7 @@ notifications:
|
||||
email: false
|
||||
|
||||
env:
|
||||
- REPORT_EXIT_STATUS=1
|
||||
- REPORT_EXIT_STATUS=1 TEST_PHP_EXECUTABLE=./sapi/cli/php
|
||||
|
||||
before_script:
|
||||
# Compile PHP
|
||||
@@ -21,4 +21,4 @@ before_script:
|
||||
- . ./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
|
||||
script: ./sapi/cli/php run-tests.php -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP"
|
||||
@@ -1,164 +1,6 @@
|
||||
PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
28 Mar 2013, PHP 5.5.0 Beta 2
|
||||
|
||||
- Core:
|
||||
. Fixed bug #64515 (Memoryleak when using the same variablename 2times in
|
||||
function declaration). (Laruence)
|
||||
. Fixed bug #64503 (Compilation fails with error: conflicting types for
|
||||
'zendparse'). (Laruence)
|
||||
. Fixed bug #64239 (Debug backtrace changed behavior since 5.4.10 or 5.4.11).
|
||||
(Dmitry, Laruence)
|
||||
|
||||
- Opcache:
|
||||
. Fixed bug # 64490 (struct flock undefined on FreeBSD). (Joe Watkins)
|
||||
|
||||
21 Mar 2013, PHP 5.5.0 Beta 1
|
||||
|
||||
- Core:
|
||||
. Added Zend Opcache extension and enable building it by default.
|
||||
More details here: https://wiki.php.net/rfc/optimizerplus. (Dmitry)
|
||||
. Added array_column function which returns a column in a multidimensional
|
||||
array. https://wiki.php.net/rfc/array_column. (Ben Ramsey)
|
||||
. Fixed bug #64354 (Unserialize array of objects whose class can't
|
||||
be autoloaded fail). (Laruence)
|
||||
. Added support for changing the process's title in CLI/CLI-Server SAPIs.
|
||||
The implementation is more robust that the proctitle PECL module. More
|
||||
details here: https://wiki.php.net/rfc/cli_process_title. (Keyur)
|
||||
. Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']).
|
||||
(Anatol)
|
||||
. Added support for non-scalar Iterator keys in foreach
|
||||
(https://wiki.php.net/rfc/foreach-non-scalar-keys). (Nikita Popov)
|
||||
|
||||
- mysqlnd
|
||||
. Fixed bug #63530 (mysqlnd_stmt::bind_one_parameter crashes, uses wrong alloc
|
||||
for stmt->param_bind). (Andrey)
|
||||
|
||||
- DateTime
|
||||
. Fixed bug #53437 (Crash when using unserialized DatePeriod instance).
|
||||
(Gustavo, Derick, Anatol)
|
||||
. Fixed bug #62852 (Unserialize Invalid Date causes crash). (Anatol)
|
||||
|
||||
- SPL:
|
||||
. Implement FR #48358 (Add SplDoublyLinkedList::add() to insert an element
|
||||
at a given offset). (Mark Baker, David Soria Parra)
|
||||
|
||||
- Zip:
|
||||
. Bug #64452 (Zip crash intermittently). (Anatol)
|
||||
|
||||
07 Mar 2013, PHP 5.5.0 Alpha 6
|
||||
|
||||
- Core:
|
||||
. Fixed bug #61025 (__invoke() visibility not honored). (Laruence)
|
||||
. Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
|
||||
(Stas)
|
||||
|
||||
- Sockets:
|
||||
. Fixed bug #64287 (sendmsg/recvmsg shutdown handler causes segfault).
|
||||
(Gustavo)
|
||||
|
||||
- PCRE:
|
||||
. Merged PCRE 8.32. (Anatol)
|
||||
|
||||
- DateTime:
|
||||
. Fixed bug #64359 (strftime crash with VS2012). (Anatol)
|
||||
|
||||
- SNMP:
|
||||
. Fixed bug #61981 (OO API, walk: $suffix_as_key is not working correctly).
|
||||
(Boris Lytochkin)
|
||||
|
||||
21 Feb 2013, PHP 5.5.0 Alpha 5
|
||||
|
||||
- Core:
|
||||
. Implemented FR #64175 (Added HTTP codes as of RFC 6585). (Jonh Wendell)
|
||||
. Fixed bug #64135 (Exceptions from set_error_handler are not always
|
||||
propagated). (Laruence)
|
||||
. Fixed bug #63830 (Segfault on undefined function call in nested generator).
|
||||
(Nikita Popov)
|
||||
. Fixed bug #60833 (self, parent, static behave inconsistently
|
||||
case-sensitive). (Stas, mario at include-once dot org)
|
||||
. Implemented FR #60524 (specify temp dir by php.ini). (ALeX Kazik).
|
||||
. Fixed bug #64142 (dval to lval different behavior on ppc64). (Remi)
|
||||
. Added ARMv7/v8 versions of various Zend arithmetic functions that are
|
||||
implemented using inline assembler (Ard Biesheuvel)
|
||||
. Fix undefined behavior when converting double variables to integers.
|
||||
The double is now always rounded towards zero, the remainder of its division
|
||||
by 2^32 or 2^64 (depending on sizeof(long)) is calculated and it's made
|
||||
signed assuming a two's complement representation. (Gustavo)
|
||||
|
||||
- CLI server:
|
||||
. Fixed bug #64128 (buit-in web server is broken on ppc64). (Remi)
|
||||
|
||||
- cURL:
|
||||
. Implemented FR #46439 - added CURLFile for safer file uploads.
|
||||
(Stas)
|
||||
|
||||
- Intl:
|
||||
. Cherry-picked UConverter wrapper, which had accidentaly been committed only
|
||||
to master.
|
||||
|
||||
- mysqli
|
||||
. Added mysqli_begin_transaction()/mysqli::begin_transaction(). Implemented
|
||||
all options, per MySQL 5.6, which can be used with START TRANSACTION, COMMIT
|
||||
and ROLLBACK through options to mysqli_commit()/mysqli_rollback() and their
|
||||
respective OO counterparts. They work in libmysql and mysqlnd mode. (Andrey)
|
||||
. Added mysqli_savepoint(), mysqli_release_savepoint(). (Andrey)
|
||||
|
||||
- mysqlnd
|
||||
. Add new begin_transaction() call to the connection object. Implemented all
|
||||
options, per MySQL 5.6, which can be used with START TRANSACTION, COMMIT
|
||||
and ROLLBACK. (Andrey)
|
||||
. Added mysqlnd_savepoint(), mysqlnd_release_savepoint(). (Andrey)
|
||||
|
||||
- Sockets:
|
||||
. Added recvmsg() and sendmsg() wrappers. (Gustavo)
|
||||
See https://wiki.php.net/rfc/sendrecvmsg
|
||||
|
||||
- Filter:
|
||||
. Implemented FR #49180 - added MAC address validation. (Martin)
|
||||
|
||||
- Phar:
|
||||
. Fixed timestamp update on Phar contents modification. (Dmitry)
|
||||
|
||||
- SPL:
|
||||
. Fixed bug #64264 (SPLFixedArray toArray problem). (Laruence)
|
||||
. Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS).
|
||||
(patch by kriss@krizalys.com, Laruence)
|
||||
. Fixed bug #64106 (Segfault on SplFixedArray[][x] = y when extended).
|
||||
(Nikita Popov)
|
||||
. Fixed bug #52861 (unset fails with ArrayObject and deep arrays).
|
||||
(Mike Willbanks)
|
||||
|
||||
- SNMP:
|
||||
. Fixed bug #64124 (IPv6 malformed). (Boris Lytochkin)
|
||||
|
||||
24 Jan 2013, PHP 5.5.0 Alpha 4
|
||||
|
||||
- Core:
|
||||
. Fixed bug #63980 (object members get trimmed by zero bytes). (Laruence)
|
||||
. Implemented RFC for Class Name Resolution As Scalar Via "class" Keyword.
|
||||
(Ralph Schindler, Nikita Popov, Lars)
|
||||
|
||||
- DateTime
|
||||
. Added DateTimeImmutable - a variant of DateTime that only returns the
|
||||
modified state instead of changing itself. (Derick)
|
||||
|
||||
- FPM:
|
||||
. Fixed bug #63999 (php with fpm fails to build on Solaris 10 or 11). (Adam)
|
||||
|
||||
- pgsql:
|
||||
. Bug #46408: Locale number format settings can cause pg_query_params to
|
||||
break with numerics. (asmecher, Lars)
|
||||
|
||||
- dba:
|
||||
. Bug #62489: dba_insert not working as expected.
|
||||
(marc-bennewitz at arcor dot de, Lars)
|
||||
|
||||
- Reflection:
|
||||
. Fixed bug #64007 (There is an ability to create instance of Generator by
|
||||
hand). (Laruence)
|
||||
|
||||
10 Jan 2013, PHP 5.5.0 Alpha 3
|
||||
10 Jan 2012, PHP 5.5.0 Alpha 3
|
||||
|
||||
- General improvements:
|
||||
. Fixed bug #63874 (Segfault if php_strip_whitespace has heredoc). (Pierrick)
|
||||
@@ -174,11 +16,11 @@ PHP NEWS
|
||||
|
||||
- cURL:
|
||||
. Added new functions curl_escape, curl_multi_setopt, curl_multi_strerror
|
||||
curl_pause, curl_reset, curl_share_close, curl_share_init,
|
||||
curl_share_setopt curl_strerror and curl_unescape. (Pierrick)
|
||||
curl_pause, curl_reset, curl_share_close, curl_share_init,
|
||||
curl_share_setopt curl_strerror and curl_unescape. (Pierrick)
|
||||
. Addes new curl options CURLOPT_TELNETOPTIONS, CURLOPT_GSSAPI_DELEGATION,
|
||||
CURLOPT_ACCEPTTIMEOUT_MS, CURLOPT_SSL_OPTIONS, CURLOPT_TCP_KEEPALIVE,
|
||||
CURLOPT_TCP_KEEPIDLE and CURLOPT_TCP_KEEPINTVL. (Pierrick)
|
||||
CURLOPT_TCP_KEEPIDLE and CURLOPT_TCP_KEEPINTVL. (Pierrick)
|
||||
|
||||
18 Dec 2012, PHP 5.5.0 Alpha 2
|
||||
|
||||
@@ -247,22 +89,22 @@ PHP NEWS
|
||||
set_exception_handler. (Nikita Popov)
|
||||
|
||||
- cURL:
|
||||
. Added support for CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPT_APPEND,
|
||||
CURLOPT_DIRLISTONLY, CURLOPT_NEW_DIRECTORY_PERMS, CURLOPT_NEW_FILE_PERMS,
|
||||
. Added support for CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPT_APPEND,
|
||||
CURLOPT_DIRLISTONLY, CURLOPT_NEW_DIRECTORY_PERMS, CURLOPT_NEW_FILE_PERMS,
|
||||
CURLOPT_NETRC_FILE, CURLOPT_PREQUOTE, CURLOPT_KRBLEVEL, CURLOPT_MAXFILESIZE,
|
||||
CURLOPT_FTP_ACCOUNT, CURLOPT_COOKIELIST, CURLOPT_IGNORE_CONTENT_LENGTH,
|
||||
CURLOPT_CONNECT_ONLY, CURLOPT_LOCALPORT, CURLOPT_LOCALPORTRANGE,
|
||||
CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPT_SSL_SESSIONID_CACHE,
|
||||
CURLOPT_FTP_SSL_CCC, CURLOPT_HTTP_CONTENT_DECODING,
|
||||
CURLOPT_HTTP_TRANSFER_DECODING, CURLOPT_PROXY_TRANSFER_MODE,
|
||||
CURLOPT_ADDRESS_SCOPE, CURLOPT_CRLFILE, CURLOPT_ISSUERCERT,
|
||||
CURLOPT_USERNAME, CURLOPT_PASSWORD, CURLOPT_PROXYUSERNAME,
|
||||
CURLOPT_PROXYPASSWORD, CURLOPT_NOPROXY, CURLOPT_SOCKS5_GSSAPI_NEC,
|
||||
CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPT_TFTP_BLKSIZE,
|
||||
CURLOPT_SSH_KNOWNHOSTS, CURLOPT_FTP_USE_PRET, CURLOPT_MAIL_FROM,
|
||||
CURLOPT_MAIL_RCPT, CURLOPT_RTSP_CLIENT_CSEQ, CURLOPT_RTSP_SERVER_CSEQ,
|
||||
CURLOPT_CONNECT_ONLY, CURLOPT_LOCALPORT, CURLOPT_LOCALPORTRANGE,
|
||||
CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPT_SSL_SESSIONID_CACHE,
|
||||
CURLOPT_FTP_SSL_CCC, CURLOPT_HTTP_CONTENT_DECODING,
|
||||
CURLOPT_HTTP_TRANSFER_DECODING, CURLOPT_PROXY_TRANSFER_MODE,
|
||||
CURLOPT_ADDRESS_SCOPE, CURLOPT_CRLFILE, CURLOPT_ISSUERCERT,
|
||||
CURLOPT_USERNAME, CURLOPT_PASSWORD, CURLOPT_PROXYUSERNAME,
|
||||
CURLOPT_PROXYPASSWORD, CURLOPT_NOPROXY, CURLOPT_SOCKS5_GSSAPI_NEC,
|
||||
CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPT_TFTP_BLKSIZE,
|
||||
CURLOPT_SSH_KNOWNHOSTS, CURLOPT_FTP_USE_PRET, CURLOPT_MAIL_FROM,
|
||||
CURLOPT_MAIL_RCPT, CURLOPT_RTSP_CLIENT_CSEQ, CURLOPT_RTSP_SERVER_CSEQ,
|
||||
CURLOPT_RTSP_SESSION_ID, CURLOPT_RTSP_STREAM_URI, CURLOPT_RTSP_TRANSPORT,
|
||||
CURLOPT_RTSP_REQUEST, CURLOPT_RESOLVE, CURLOPT_ACCEPT_ENCODING,
|
||||
CURLOPT_RTSP_REQUEST, CURLOPT_RESOLVE, CURLOPT_ACCEPT_ENCODING,
|
||||
CURLOPT_TRANSFER_ENCODING, CURLOPT_DNS_SERVERS and CURLOPT_USE_SSL.
|
||||
(Pierrick)
|
||||
. Fixed bug #55635 (CURLOPT_BINARYTRANSFER no longer used. The constant
|
||||
@@ -270,8 +112,8 @@ PHP NEWS
|
||||
. Fixed bug #54995 (Missing CURLINFO_RESPONSE_CODE support). (Pierrick)
|
||||
|
||||
- Datetime
|
||||
. Fixed bug #61642 (modify("+5 weekdays") returns Sunday).
|
||||
(Dmitri Iouchtchenko)
|
||||
. Fixed bug #61642 (modify("+5 weekdays") returns Sunday).
|
||||
(Dmitri Iouchtchenko)
|
||||
|
||||
- Hash
|
||||
. Added support for PBKDF2 via hash_pbkdf2(). (Anthony Ferrara)
|
||||
@@ -366,8 +208,7 @@ PHP NEWS
|
||||
- MySQLi
|
||||
. Dropped support for LOAD DATA LOCAL INFILE handlers when using libmysql.
|
||||
Known for stability problems. (Andrey)
|
||||
. Added support for SHA256 authentication available with MySQL 5.6.6+.
|
||||
(Andrey)
|
||||
. Added support for SHA256 authentication available with MySQL 5.6.6+. (Andrey)
|
||||
|
||||
- PCRE:
|
||||
. Deprecated the /e modifier
|
||||
@@ -391,8 +232,4 @@ PHP NEWS
|
||||
. Fixed bug #63248 (Load multiple magic files from a directory under Windows).
|
||||
(Anatoliy)
|
||||
|
||||
- General improvements:
|
||||
. Implemented FR #46487 (Dereferencing process-handles no longer waits on
|
||||
those processes). (Jille Timmermans)
|
||||
|
||||
<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
|
||||
@@ -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
|
||||
|
||||
+3
-12
@@ -64,10 +64,9 @@ Do not use abbreviations for alpha and beta.
|
||||
``git push --tags origin HEAD``
|
||||
|
||||
8. run: ``./makedist 5.4.2RC2``, this will export the tree, create configure
|
||||
and build three tarballs (gz,bz2 and xz). Make sure you use the same GNU Bison
|
||||
version as snaps. Recent bison version are known to break ZTS.
|
||||
and build two tarballs (one gz and one bz2).
|
||||
|
||||
9. Copy those three tarballs to www.php.net, in your homedir there should be a
|
||||
9. Copy those two tarballs to www.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.
|
||||
|
||||
@@ -155,15 +154,7 @@ origin <branch>``".
|
||||
11. run: ``./makedist php 5.4.1``, this will export the tree, create configure
|
||||
and build two tarballs (one gz and one bz2).
|
||||
|
||||
12. Commit those two tarballs to web/php-distributions.git, then update the git
|
||||
submodule reference in web/php.git:
|
||||
git submodule init;
|
||||
git submodule update;
|
||||
cd distributions;
|
||||
git pull origin master;
|
||||
cd ..;
|
||||
git commit distributions;
|
||||
git push;
|
||||
12. Commit those two tarballs to Git (php-distributions.git)
|
||||
|
||||
13. 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
|
||||
|
||||
@@ -24,12 +24,42 @@ PHP 5.5 UPGRADE NOTES
|
||||
- Drop Windows XP and 2003 support. (Pierre)
|
||||
- All internal case insensitivity handling for class, function and constant
|
||||
names is done according to ASCII rules, current locale settings are ignored.
|
||||
- self, parent & static keywords now are always case-insensitive (see bug
|
||||
#60833).
|
||||
- php_logo_guid(), php_egg_logo_guid(), php_real_logo_guid() and
|
||||
zend_logo_guid() have been removed
|
||||
- Removal of Logo GUIDs
|
||||
|
||||
- extensions can't override zend_execute() any more, they should override
|
||||
zend_execute_ex() instead. The EG(current_execute_data) is already
|
||||
initialized in zend_execute_ex(), so for compatibility extensions
|
||||
may need to use EG(current_execute_data)->prev_execute_data instead.
|
||||
- removed EG(arg_types_stack), EX(fbc), EX(called_scope), EX(current_object)
|
||||
- added op_array->nested_calls. It's calculated at compile time.
|
||||
- added EX(call_slots). It is an array to store information about syntaticaly
|
||||
nested calls (e.g. foo(bar())). It's preallocated together with execute_data.
|
||||
- added EX(call) - pointer to a current calling function. Actually an
|
||||
element of EX(call_slots)
|
||||
- opcodes INIT_METHOD_CALL, ZEND_INIT_STATIC_METHOD_CALL,
|
||||
ZEND_INIT_FCALL_BY_NAME, ZEND_INIT_NS_FCALL_BY_NAME use result.num as
|
||||
an index in EX(call_slots)
|
||||
- opcode ZEND_NEW uses extended_vallue as an index in EX(call_slots)
|
||||
- opcoes ZEND_DO_FCALL and ZEND_DO_FCALL_BY_NAME use op2.num as
|
||||
an index in EX(call_slots)
|
||||
- added op_array->used_stack. It's calculated at compile time and the
|
||||
corresponding stack space is preallocated together with execute_data.
|
||||
ZEND_SEND* and ZEND_DO_FCALL* don't need to check for stack overflow
|
||||
anymore.
|
||||
- Removed execute_data->Ts field. The VM temporary variables always allocated
|
||||
immediately before execute_data structure. Now they are accessed by offset
|
||||
from the execute_data base pointer (instead of execute_data->Ts). Compiler
|
||||
stores new offsets in op_array->opcodes[*].op?.num. You can use macros
|
||||
EX_TMP_VAR() and EX_TMP_VAR_NUM() to access temp_variable by offset or
|
||||
number. You can convert number to offset using EX_TMP_VAR_NUM(0, num) or
|
||||
offset to number (EX_TMP_VAR_NUM(0,0)-EX_TMP_VAR(0,offset)).
|
||||
- Removed execute_data->CVs field. The VM compiled variables always allocated
|
||||
immediately after execute_data structure. Now they are accessed by offset
|
||||
from the execute_data base pointer (instead of execute_data->CVs). You can
|
||||
use macros EX_CV_NUM() to access compiled variables by number.
|
||||
|
||||
========================================
|
||||
2. New Features
|
||||
========================================
|
||||
@@ -45,19 +75,11 @@ PHP 5.5 UPGRADE NOTES
|
||||
for example. (https://wiki.php.net/rfc/empty_isset_exprs)
|
||||
- Added generators.
|
||||
(https://wiki.php.net/rfc/generators)
|
||||
- ClassName::class syntax returning full class name for a class as
|
||||
a string constant. (https://wiki.php.net/rfc/class_name_scalars)
|
||||
- Added support for non-scalar Iterator keys in foreach.
|
||||
(https://wiki.php.net/rfc/foreach-non-scalar-keys).
|
||||
- Bundled Zend OPcache extension
|
||||
(https://wiki.php.net/rfc/optimizerplus)
|
||||
|
||||
========================================
|
||||
2. Changes in SAPI modules
|
||||
========================================
|
||||
|
||||
- Support for changing the process's title in CLI/CLI-Server SAPIs. (Keyur)
|
||||
(https://wiki.php.net/rfc/cli_process_title)
|
||||
|
||||
========================================
|
||||
3. Deprecated Functionality
|
||||
@@ -83,11 +105,10 @@ PHP 5.5 UPGRADE NOTES
|
||||
|
||||
- pack()/unpack() had the following changes, which bring it more in line
|
||||
with Perl's behavior:
|
||||
- Implemented format character "Z": NULL padded string, with trailing NULL
|
||||
bytes removed.
|
||||
- Changed format character "a": this no longer removes trailing NULL bytes.
|
||||
- Changed format character "A": all trailing ASCII whitespace is now removed
|
||||
(defined as spaces, tabs, \r, \n and NULL).
|
||||
- Implemented format character "Z": NUL-padded string
|
||||
- "a" now does not remove trailing NUL characters on unpack() anymore
|
||||
- "A" will now strip all trailing ASCII whitespace on unpack() (it used to
|
||||
remove only trailing spaces).
|
||||
- MessageFormatter::format() and related functions now accepted named arguments
|
||||
and mixed numeric/named arguments in ICU 4.8+.
|
||||
- MessageFormatter::format() and related functions now don't error out when
|
||||
@@ -127,38 +148,18 @@ PHP 5.5 UPGRADE NOTES
|
||||
Furthermore both set_error_handler(NULL) and set_exception_handler(NULL) will
|
||||
now return the previously defined error/exception handler. Previously
|
||||
bool(true) was returned.
|
||||
- setcookie(), setrawcookie() and ext/session now send Max-Age headers alongside
|
||||
Expires headers. (see https://wiki.php.net/rfc/cookie_max-age)
|
||||
- curl_setopt now accepts new option CURLOPT_SAFE_UPLOAD and CURLFile object for
|
||||
safer file uploads (see https://wiki.php.net/rfc/curl-file-upload)
|
||||
- Functions in the socket extension now do not emit warnings when the errno is
|
||||
EAGAIN, EWOULDBLOCK or EINPROGRESS.
|
||||
|
||||
========================================
|
||||
5. New Functions
|
||||
========================================
|
||||
|
||||
- Core:
|
||||
- array_column()
|
||||
- boolval()
|
||||
- password_get_info()
|
||||
- password_hash()
|
||||
- password_needs_rehash()
|
||||
- password_verify()
|
||||
|
||||
- cURL:
|
||||
- curl_file_create
|
||||
|
||||
- GD
|
||||
- imageflip
|
||||
- imagecrop
|
||||
- imagecropauto
|
||||
- imagesetinterpolation
|
||||
- imageaffine
|
||||
- imageaffinematrixget
|
||||
- imageaffinematrixconcat
|
||||
- imagescale
|
||||
|
||||
- Hash:
|
||||
- hash_pbkdf2()
|
||||
|
||||
@@ -244,19 +245,8 @@ PHP 5.5 UPGRADE NOTES
|
||||
- IntlDateFormatter::getTimeZone()
|
||||
- IntlDateFormatter::setTimeZone()
|
||||
|
||||
- Sockets:
|
||||
- socket_sendmsg()
|
||||
- socket_recvmsg()
|
||||
- socket_cmsg_space()
|
||||
|
||||
- SPL:
|
||||
- SplFixedArray::__wakeup()
|
||||
- SplDoublyLinkedList::add()
|
||||
|
||||
- Zend OPcache
|
||||
- opcache_get_configuration()
|
||||
- opcache_get_status()
|
||||
- opcache_reset()
|
||||
|
||||
========================================
|
||||
6. New Classes and Interfaces
|
||||
@@ -269,10 +259,6 @@ PHP 5.5 UPGRADE NOTES
|
||||
- IntlBreakIterator
|
||||
- IntlRuleBasedBreakIterator
|
||||
- IntlCodePointBreakIterator
|
||||
- UConverter
|
||||
|
||||
- cURL:
|
||||
- CURLFile
|
||||
|
||||
========================================
|
||||
7. Removed Extensions
|
||||
@@ -293,58 +279,10 @@ PHP 5.5 UPGRADE NOTES
|
||||
- mysqli:
|
||||
- Added MYSQLI_SERVER_PUBLIC_KEY constant to be used with mysqli_options()
|
||||
|
||||
- cURL:
|
||||
- Added CURLOPT_SAFE_UPLOAD to be used with curl_setopt().
|
||||
|
||||
- GD
|
||||
- Added constants for imageflip:
|
||||
. IMG_FLIP_HORIZONTAL
|
||||
. IMG_FLIP_VERTICAL
|
||||
. IMG_FLIP_BOTH
|
||||
- Added constants for imagecrop
|
||||
. IMG_CROP_DEFAULT
|
||||
. IMG_CROP_TRANSPARENT
|
||||
. IMG_CROP_BLACK
|
||||
. IMG_CROP_WHITE
|
||||
. IMG_CROP_SIDES
|
||||
. IMG_CROP_THRESHOLD
|
||||
- Added constants for imagesetinterpolation, used by imagescale
|
||||
imagerotate and imageaffine:
|
||||
. IMG_BELL
|
||||
. IMG_BESSEL
|
||||
. IMG_BILINEAR_FIXED
|
||||
. IMG_BICUBIC
|
||||
. IMG_BICUBIC_FIXED
|
||||
. IMG_BLACKMAN
|
||||
. IMG_BOX
|
||||
. IMG_BSPLINE
|
||||
. IMG_CATMULLROM
|
||||
. IMG_GAUSSIAN
|
||||
. IMG_GENERALIZED_CUBIC
|
||||
. IMG_HERMITE
|
||||
. IMG_HAMMING
|
||||
. IMG_HANNING
|
||||
. IMG_MITCHELL
|
||||
. IMG_POWER
|
||||
. IMG_QUADRATIC
|
||||
. IMG_SINC
|
||||
. IMG_NEAREST_NEIGHBOUR
|
||||
. IMG_WEIGHTED4
|
||||
. IMG_TRIANGLE
|
||||
- Added constants for imageaffinematrixget
|
||||
. IMG_AFFINE_TRANSLATE
|
||||
. IMG_AFFINE_SCALE
|
||||
. IMG_AFFINE_ROTATE
|
||||
. IMG_AFFINE_SHEAR_HORIZONTAL
|
||||
. IMG_AFFINE_SHEAR_VERTICAL
|
||||
|
||||
========================================
|
||||
10. Changes to INI File Handling
|
||||
========================================
|
||||
|
||||
- Core:
|
||||
- Added sys_temp_dir INI directive, for specifying temp directory.
|
||||
|
||||
- Intl:
|
||||
- Added intl.use_exceptions INI directive, which controls what happens when
|
||||
global errors are set together with intl.error_level.
|
||||
@@ -354,33 +292,6 @@ PHP 5.5 UPGRADE NOTES
|
||||
APIs which use(are built) for mysqlnd. This allows ext/mysqli to be used
|
||||
with the new auth protocol, although at coarser level.
|
||||
|
||||
- Zend OPcache (See ext/opcache/README for more details)
|
||||
- Added the following directives:
|
||||
- opcache.enable (default "1")
|
||||
- opcache.memory_consumption (default "64")
|
||||
- opcache.interned_strings_buffer (default "4")
|
||||
- opcache.max_accelerated_files (default "2000")
|
||||
- opcache.max_wasted_percentage (default "5")
|
||||
- opcache.use_cwd (default "1")
|
||||
- opcache.validate_timestamps (default "1")
|
||||
- opcache.revalidate_freq (default "2")
|
||||
- opcache.revalidate_path (default "0")
|
||||
- opcache.save_comments (default "1")
|
||||
- opcache.load_comments (default "1")
|
||||
- opcache.fast_shutdown (default "0")
|
||||
- opcache.enable_file_override (default "0")
|
||||
- opcache.optimization_level (default "0xffffffff")
|
||||
- opcache.inherited_hack (default "1")
|
||||
- opcache.blacklist_filename (default "")
|
||||
- opcache.max_file_size (default "0")
|
||||
- opcache.consistency_checks (default "0")
|
||||
- opcache.force_restart_timeout (default "180")
|
||||
- opcache.error_log (default "" which means stderr)
|
||||
- opcache.log_verbosity_level (default "1")
|
||||
- opcache.preferred_memory_model (default "")
|
||||
- opcache.protect_memory (default "0")
|
||||
- opcache.mmap_base (Windows-only)
|
||||
|
||||
========================================
|
||||
11. Windows Support
|
||||
========================================
|
||||
|
||||
+4
-59
@@ -3,11 +3,8 @@ $Id$
|
||||
UPGRADE NOTES - PHP X.Y
|
||||
|
||||
1. Internal API changes
|
||||
a. Executor changes
|
||||
b. Streams pooling API
|
||||
c. Lowercasing and locales
|
||||
d. zend_qsort_r
|
||||
e. get_current_key
|
||||
a. Streams pooling API
|
||||
b. Lowercasing and locales
|
||||
|
||||
2. Build system changes
|
||||
a. Unix build system changes
|
||||
@@ -18,41 +15,7 @@ UPGRADE NOTES - PHP X.Y
|
||||
1. Internal API changes
|
||||
========================
|
||||
|
||||
a. Executor changes
|
||||
|
||||
* extensions can't override zend_execute() any more, they should override
|
||||
zend_execute_ex() instead. The EG(current_execute_data) is already
|
||||
initialized in zend_execute_ex(), so for compatibility extensions
|
||||
may need to use EG(current_execute_data)->prev_execute_data instead.
|
||||
* removed EG(arg_types_stack), EX(fbc), EX(called_scope), EX(current_object)
|
||||
* added op_array->nested_calls. It's calculated at compile time.
|
||||
* added EX(call_slots). It is an array to store information about syntaticaly
|
||||
nested calls (e.g. foo(bar())). It's preallocated together with execute_data.
|
||||
* added EX(call) - pointer to a current calling function. Actually an
|
||||
element of EX(call_slots)
|
||||
* opcodes INIT_METHOD_CALL, ZEND_INIT_STATIC_METHOD_CALL,
|
||||
ZEND_INIT_FCALL_BY_NAME, ZEND_INIT_NS_FCALL_BY_NAME use result.num as
|
||||
an index in EX(call_slots)
|
||||
* opcode ZEND_NEW uses extended_vallue as an index in EX(call_slots)
|
||||
* opcoes ZEND_DO_FCALL and ZEND_DO_FCALL_BY_NAME use op2.num as
|
||||
an index in EX(call_slots)
|
||||
* added op_array->used_stack. It's calculated at compile time and the
|
||||
corresponding stack space is preallocated together with execute_data.
|
||||
ZEND_SEND* and ZEND_DO_FCALL* don't need to check for stack overflow
|
||||
anymore.
|
||||
* Removed execute_data->Ts field. The VM temporary variables always allocated
|
||||
immediately before execute_data structure. Now they are accessed by offset
|
||||
from the execute_data base pointer (instead of execute_data->Ts). Compiler
|
||||
stores new offsets in op_array->opcodes[*].op?.num. You can use macros
|
||||
EX_TMP_VAR() and EX_TMP_VAR_NUM() to access temp_variable by offset or
|
||||
number. You can convert number to offset using EX_TMP_VAR_NUM(0, num) or
|
||||
offset to number (EX_TMP_VAR_NUM(0,0)-EX_TMP_VAR(0,offset)).
|
||||
* Removed execute_data->CVs field. The VM compiled variables always allocated
|
||||
immediately after execute_data structure. Now they are accessed by offset
|
||||
from the execute_data base pointer (instead of execute_data->CVs). You can
|
||||
use macros EX_CV_NUM() to access compiled variables by number.
|
||||
|
||||
b. Streams pooling API
|
||||
a. Streams pooling API
|
||||
|
||||
The streams pooling API has been removed. The following functions no longer
|
||||
exist:
|
||||
@@ -64,7 +27,7 @@ PHPAPI int php_stream_context_set_link(php_stream_context *context,
|
||||
PHPAPI int php_stream_context_del_link(php_stream_context *context,
|
||||
php_stream *stream);
|
||||
|
||||
c. Lowercasing and locales
|
||||
b. Lowercasing and locales
|
||||
|
||||
The lowercasing functions in zend_operators.c were split into those that do
|
||||
lowercasing according to locale rules and those that do ASCII lowercasing.
|
||||
@@ -90,24 +53,6 @@ such as strcasecmp, will be using locale rules.
|
||||
Two new functions - zend_binary_strncasecmp_l and zend_binary_strcasecmp_l - added as
|
||||
locale-based counterparts to zend_binary_strcasecmp and zend_binary_strncasecmp.
|
||||
|
||||
d. zend_qsort_r
|
||||
|
||||
Added the function zend_qsort_r():
|
||||
|
||||
typedef int (*compare_r_func_t)(const void *, const void * TSRMLS_DC, void *);
|
||||
void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_t compare, void *arg TSRMLS_DC);
|
||||
|
||||
The extra argument it has (relatively to zend_qsort()) is passed to the
|
||||
comparison function.
|
||||
|
||||
e. get_current_key
|
||||
|
||||
The signature of the get_current_key iteration handler has been changed to:
|
||||
|
||||
void (*get_current_key)(zend_object_iterator *iter, zval *key TSRMLS_DC);
|
||||
|
||||
The key should be written into the zval* using the ZVAL_* macros.
|
||||
|
||||
========================
|
||||
2. Build system changes
|
||||
========================
|
||||
|
||||
@@ -15,7 +15,7 @@ $f = fopen("/tmp/blah", "r");
|
||||
?>
|
||||
===DONE===
|
||||
--EXPECTF--
|
||||
fopen(/tmp/blah): failed to open stream: %s (2) in %s:%d
|
||||
fopen(/tmp/blah): failed to open stream: No such file or directory (2) in %s:%d
|
||||
|
||||
Warning: fopen(/tmp/blah): failed to open stream: %s in %s on line %d
|
||||
Warning: fopen(/tmp/blah): failed to open stream: No such file or directory in %s on line %d
|
||||
===DONE===
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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: a in %sbug52041.php on line 8
|
||||
|
||||
Notice: Undefined variable: x in %sbug52041.php on line 3
|
||||
|
||||
Notice: Undefined property: a in %sbug52041.php on line 9
|
||||
|
||||
Warning: Creating default object from empty value in %sbug52041.php on line 9
|
||||
|
||||
Notice: Undefined property: 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: a in %sbug52041.php on line 10
|
||||
|
||||
Notice: Undefined variable: x in %sbug52041.php on line 3
|
||||
|
||||
Notice: Undefined property: a in %sbug52041.php on line 11
|
||||
|
||||
Warning: Creating default object from empty value in %sbug52041.php on line 11
|
||||
|
||||
Notice: Undefined property: 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,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
|
||||
|
||||
|
||||
@@ -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: x in %s on line 14
|
||||
DONE
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ set_error_handler(function($errno, $errstr, $errfile, $errline){
|
||||
|
||||
require 'notfound.php';
|
||||
--EXPECTF--
|
||||
error(require(notfound.php): failed to open stream: %s)
|
||||
error(require(notfound.php): failed to open stream: No such file or directory)
|
||||
Warning: Uncaught exception 'Exception' with message 'Foo' in %sbug60909_1.php:5
|
||||
Stack trace:
|
||||
#0 %sbug60909_1.php(8): {closure}(2, 'require(notfoun...', '%s', 8, Array)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
)
|
||||
@@ -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: energy in %sbug62005.php on line 3
|
||||
stdClass Object
|
||||
(
|
||||
[energy] => 2
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
--TEST--
|
||||
Bug #62343 (Show class_alias In get_declared_classes())
|
||||
--FILE--
|
||||
<?php
|
||||
class a { }
|
||||
class_alias("a", "b");
|
||||
$c = get_declared_classes();
|
||||
var_dump(end($c));
|
||||
var_dump(prev($c));
|
||||
?>
|
||||
--EXPECT--
|
||||
string(1) "b"
|
||||
string(1) "a"
|
||||
@@ -1,74 +0,0 @@
|
||||
--TEST--
|
||||
Test script to verify that magic methods should be called only once when accessing an unset property.
|
||||
--CREDITS--
|
||||
Marco Pivetta <ocramius@gmail.com>
|
||||
--FILE--
|
||||
<?php
|
||||
class Test {
|
||||
public $publicProperty;
|
||||
protected $protectedProperty;
|
||||
private $privateProperty;
|
||||
|
||||
public function __construct() {
|
||||
unset(
|
||||
$this->publicProperty,
|
||||
$this->protectedProperty,
|
||||
$this->privateProperty
|
||||
);
|
||||
}
|
||||
|
||||
function __get($name) {
|
||||
echo '__get ' . $name . "\n";
|
||||
return $this->$name;
|
||||
}
|
||||
|
||||
function __set($name, $value) {
|
||||
echo '__set ' . $name . "\n";
|
||||
$this->$name = $value;
|
||||
}
|
||||
|
||||
function __isset($name) {
|
||||
echo '__isset ' . $name . "\n";
|
||||
return isset($this->$name);
|
||||
}
|
||||
}
|
||||
|
||||
$test = new Test();
|
||||
|
||||
$test->nonExisting;
|
||||
$test->publicProperty;
|
||||
$test->protectedProperty;
|
||||
$test->privateProperty;
|
||||
isset($test->nonExisting);
|
||||
isset($test->publicProperty);
|
||||
isset($test->protectedProperty);
|
||||
isset($test->privateProperty);
|
||||
$test->nonExisting = 'value';
|
||||
$test->publicProperty = 'value';
|
||||
$test->protectedProperty = 'value';
|
||||
$test->privateProperty = 'value';
|
||||
|
||||
?>
|
||||
|
||||
--EXPECTF--
|
||||
__get nonExisting
|
||||
|
||||
Notice: Undefined property: Test::$nonExisting in %s on line %d
|
||||
__get publicProperty
|
||||
|
||||
Notice: Undefined property: Test::$publicProperty in %s on line %d
|
||||
__get protectedProperty
|
||||
|
||||
Notice: Undefined property: Test::$protectedProperty in %s on line %d
|
||||
__get privateProperty
|
||||
|
||||
Notice: Undefined property: Test::$privateProperty in %s on line %d
|
||||
__isset nonExisting
|
||||
__isset publicProperty
|
||||
__isset protectedProperty
|
||||
__isset privateProperty
|
||||
__set nonExisting
|
||||
__set publicProperty
|
||||
__set protectedProperty
|
||||
__set privateProperty
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
--TEST--
|
||||
Bug #63976 (Parent class incorrectly using child constant in class property)
|
||||
--FILE--
|
||||
<?php
|
||||
if (1) {
|
||||
class Foo {
|
||||
const TABLE = "foo";
|
||||
public $table = self::TABLE;
|
||||
}
|
||||
}
|
||||
if (1) {
|
||||
class Bar extends Foo {
|
||||
const TABLE = "bar";
|
||||
}
|
||||
}
|
||||
$bar = new Bar();
|
||||
var_dump($bar->table);
|
||||
?>
|
||||
--EXPECT--
|
||||
string(3) "foo"
|
||||
@@ -1,15 +0,0 @@
|
||||
--TEST--
|
||||
Bug #63982 (isset() inconsistently produces a fatal error on protected property)
|
||||
--FILE--
|
||||
<?php
|
||||
class Test {
|
||||
protected $protectedProperty;
|
||||
}
|
||||
|
||||
$test = new Test();
|
||||
|
||||
var_dump(isset($test->protectedProperty));
|
||||
var_dump(isset($test->protectedProperty->foo));
|
||||
--EXPECTF--
|
||||
bool(false)
|
||||
bool(false)
|
||||
@@ -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
|
||||
@@ -1,28 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64239 (get_class_methods() changed behavior)
|
||||
--FILE--
|
||||
<?php
|
||||
class A {
|
||||
use T2 { t2method as Bmethod; }
|
||||
}
|
||||
|
||||
class B extends A {
|
||||
}
|
||||
|
||||
trait T2 {
|
||||
public function t2method() {
|
||||
}
|
||||
}
|
||||
print_r(get_class_methods("A"));
|
||||
print_r(get_class_methods("B"));
|
||||
--EXPECT--
|
||||
Array
|
||||
(
|
||||
[0] => Bmethod
|
||||
[1] => t2method
|
||||
)
|
||||
Array
|
||||
(
|
||||
[0] => Bmethod
|
||||
[1] => t2method
|
||||
)
|
||||
@@ -1,58 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64239 (debug_backtrace() changed behavior)
|
||||
--FILE--
|
||||
<?php
|
||||
class A {
|
||||
use T1;
|
||||
public function test() { $this->backtrace(); }
|
||||
}
|
||||
|
||||
class B {
|
||||
use T2 { t2method as Bmethod; }
|
||||
}
|
||||
|
||||
class C extends A {
|
||||
}
|
||||
|
||||
trait T1 {
|
||||
protected function backtrace() {
|
||||
$b = new B();
|
||||
$b->Bmethod();
|
||||
}
|
||||
}
|
||||
trait T2 {
|
||||
public function t2method() {
|
||||
print_r(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1));
|
||||
}
|
||||
}
|
||||
$a = new A();
|
||||
$a->test();
|
||||
|
||||
$c = new C();
|
||||
$c->test();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Array
|
||||
(
|
||||
[0] => Array
|
||||
(
|
||||
[file] => %sbug64239_2.php
|
||||
[line] => %d
|
||||
[function] => Bmethod
|
||||
[class] => B
|
||||
[type] => ->
|
||||
)
|
||||
|
||||
)
|
||||
Array
|
||||
(
|
||||
[0] => Array
|
||||
(
|
||||
[file] => %sbug64239_2.php
|
||||
[line] => %d
|
||||
[function] => Bmethod
|
||||
[class] => B
|
||||
[type] => ->
|
||||
)
|
||||
|
||||
)
|
||||
@@ -1,33 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64239 (debug_print_backtrace() changed behavior)
|
||||
--FILE--
|
||||
<?php
|
||||
class A {
|
||||
use T2 { t2method as Bmethod; }
|
||||
}
|
||||
|
||||
class C extends A {
|
||||
public function Bmethod() {
|
||||
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
|
||||
}
|
||||
}
|
||||
|
||||
trait T2 {
|
||||
public function t2method() {
|
||||
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
|
||||
}
|
||||
}
|
||||
|
||||
$a = new A();
|
||||
$a->Bmethod();
|
||||
$a->t2method();
|
||||
|
||||
$c = new C();
|
||||
$c->Bmethod();
|
||||
$c->t2method();
|
||||
?>
|
||||
--EXPECTF--
|
||||
#0 A->Bmethod() called at [%sbug64239_3.php:%d]
|
||||
#0 A->t2method() called at [%sbug64239_3.php:%d]
|
||||
#0 C->Bmethod() called at [%sbug64239_3.php:%d]
|
||||
#0 A->t2method() called at [%sbug64239_3.php:%d]
|
||||
@@ -1,31 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64239 (debug_print_backtrace() changed behavior)
|
||||
--FILE--
|
||||
<?php
|
||||
class A {
|
||||
use T2 { t2method as Bmethod; }
|
||||
}
|
||||
|
||||
class C extends A {
|
||||
public static function Bmethod() {
|
||||
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
|
||||
}
|
||||
}
|
||||
|
||||
trait T2 {
|
||||
public static function t2method() {
|
||||
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
|
||||
}
|
||||
}
|
||||
|
||||
A::Bmethod();
|
||||
A::t2method();
|
||||
|
||||
C::Bmethod();
|
||||
C::t2method();
|
||||
?>
|
||||
--EXPECTF--
|
||||
#0 A::Bmethod() called at [%sbug64239_4.php:%d]
|
||||
#0 A::t2method() called at [%sbug64239_4.php:%d]
|
||||
#0 C::Bmethod() called at [%sbug64239_4.php:%d]
|
||||
#0 A::t2method() called at [%sbug64239_4.php:%d]
|
||||
@@ -1,24 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64354 (Unserialize array of objects whose class can't be autoloaded fail)
|
||||
--FILE--
|
||||
<?php
|
||||
class B implements Serializable {
|
||||
public function serialize() {
|
||||
throw new Exception("serialize");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
public function unserialize($data) {
|
||||
}
|
||||
}
|
||||
|
||||
$data = array(new B);
|
||||
|
||||
try {
|
||||
serialize($data);
|
||||
} catch (Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
string(9) "serialize"
|
||||
@@ -1,39 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64417 (BC break: ArrayAccess::&offsetGet() in a trait causes fatal error)
|
||||
--FILE--
|
||||
<?php
|
||||
trait aa {
|
||||
private $container = array();
|
||||
public function offsetSet($offset, $value) {
|
||||
if (is_null($offset)) {
|
||||
$this->container[] = $value;
|
||||
} else {
|
||||
$this->container[$offset] = $value;
|
||||
}
|
||||
}
|
||||
public function offsetExists($offset) {
|
||||
return isset($this->container[$offset]);
|
||||
}
|
||||
public function offsetUnset($offset) {
|
||||
unset($this->container[$offset]);
|
||||
}
|
||||
public function &offsetGet($offset) {
|
||||
$result = null;
|
||||
if (isset($this->container[$offset])) {
|
||||
$result = &$this->container[$offset];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
class obj implements ArrayAccess {
|
||||
use aa;
|
||||
}
|
||||
|
||||
$o = new obj;
|
||||
$o['x'] = 1;
|
||||
++$o['x'];
|
||||
echo $o['x'], "\n";
|
||||
--EXPECT--
|
||||
2
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64515 (Memoryleak when using the same variablename 2times in function declaration)
|
||||
--FILE--
|
||||
<?php
|
||||
function foo($unused = null, $unused = null, $arg = array()) {
|
||||
return 1;
|
||||
}
|
||||
foo();
|
||||
echo "okey";
|
||||
?>
|
||||
--EXPECT--
|
||||
okey
|
||||
@@ -1,77 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
namespace Foo\Bar {
|
||||
class One {
|
||||
// compile time constants
|
||||
const A = self::class;
|
||||
const B = Two::class;
|
||||
}
|
||||
class Two extends One {
|
||||
public static function run() {
|
||||
var_dump(self::class); // self compile time lookup
|
||||
var_dump(static::class); // runtime lookup
|
||||
var_dump(parent::class); // runtime lookup
|
||||
var_dump(Baz::class); // default compile time lookup
|
||||
}
|
||||
}
|
||||
class Three extends Two {
|
||||
// compile time static lookups
|
||||
public static function checkCompileTime(
|
||||
$one = self::class,
|
||||
$two = Baz::class,
|
||||
$three = One::A,
|
||||
$four = self::B
|
||||
) {
|
||||
var_dump($one, $two, $three, $four);
|
||||
}
|
||||
}
|
||||
echo "In NS\n";
|
||||
var_dump(Moo::CLASS); // resolve in namespace
|
||||
}
|
||||
|
||||
namespace {
|
||||
use Bee\Bop as Moo,
|
||||
Foo\Bar\One;
|
||||
echo "Top\n";
|
||||
var_dump(One::class); // resolve from use
|
||||
var_dump(Boo::class); // resolve in global namespace
|
||||
var_dump(Moo::CLASS); // resolve from use as
|
||||
var_dump(\Moo::Class); // resolve fully qualified
|
||||
$class = One::class; // assign class as scalar to var
|
||||
$x = new $class; // create new class from original scalar assignment
|
||||
var_dump($x);
|
||||
Foo\Bar\Two::run(); // resolve runtime lookups
|
||||
echo "Parent\n";
|
||||
Foo\Bar\Three::run(); // resolve runtime lookups with inheritance
|
||||
echo "Compile Check\n";
|
||||
Foo\Bar\Three::checkCompileTime();
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
In NS
|
||||
string(11) "Foo\Bar\Moo"
|
||||
Top
|
||||
string(11) "Foo\Bar\One"
|
||||
string(3) "Boo"
|
||||
string(7) "Bee\Bop"
|
||||
string(3) "Moo"
|
||||
object(Foo\Bar\One)#1 (0) {
|
||||
}
|
||||
string(11) "Foo\Bar\Two"
|
||||
string(11) "Foo\Bar\Two"
|
||||
string(11) "Foo\Bar\One"
|
||||
string(11) "Foo\Bar\Baz"
|
||||
Parent
|
||||
string(11) "Foo\Bar\Two"
|
||||
string(13) "Foo\Bar\Three"
|
||||
string(11) "Foo\Bar\One"
|
||||
string(11) "Foo\Bar\Baz"
|
||||
Compile Check
|
||||
string(13) "Foo\Bar\Three"
|
||||
string(11) "Foo\Bar\Baz"
|
||||
string(11) "Foo\Bar\One"
|
||||
string(11) "Foo\Bar\Two"
|
||||
@@ -1,13 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword error using static in class constant
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
namespace Foo\Bar {
|
||||
class One {
|
||||
const Baz = static::class;
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: static::class cannot be used for compile-time class name resolution in %s on line %d
|
||||
@@ -1,13 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword error using parent in class constant
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
namespace Foo\Bar {
|
||||
class One {
|
||||
const Baz = parent::class;
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: parent::class cannot be used for compile-time class name resolution in %s on line %d
|
||||
@@ -1,13 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword error using static in method signature
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
namespace Foo\Bar {
|
||||
class One {
|
||||
public function baz($x = static::class) {}
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: static::class cannot be used for compile-time class name resolution in %s on line %d
|
||||
@@ -1,13 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword error using parent in method signature
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
namespace Foo\Bar {
|
||||
class One {
|
||||
public function baz($x = parent::class) {}
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: parent::class cannot be used for compile-time class name resolution in %s on line %d
|
||||
@@ -1,10 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword error using static non class context
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$x = static::class;
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Cannot access static::class when no class scope is active in %s on line %d
|
||||
@@ -1,10 +0,0 @@
|
||||
--TEST--
|
||||
class name as scalar from ::class keyword error using parent in non class context
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$x = parent::class;
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Cannot access parent::class when no class scope is active in %s on line %d
|
||||
@@ -1,32 +0,0 @@
|
||||
--TEST--
|
||||
zend_dval_to_lval preserves low bits (32 bit long)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (PHP_INT_SIZE != 4)
|
||||
die("skip for machines with 32-bit longs");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
/* test doubles around -4e21 */
|
||||
$values = [
|
||||
-4000000000000001048576.,
|
||||
-4000000000000000524288.,
|
||||
-4000000000000000000000.,
|
||||
-3999999999999999475712.,
|
||||
-3999999999999998951424.,
|
||||
];
|
||||
/* see if we're rounding negative numbers right */
|
||||
$values[] = -2147483649.8;
|
||||
|
||||
foreach ($values as $v) {
|
||||
var_dump((int)$v);
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
int(-2056257536)
|
||||
int(-2055733248)
|
||||
int(-2055208960)
|
||||
int(-2054684672)
|
||||
int(-2054160384)
|
||||
int(2147483647)
|
||||
@@ -1,29 +0,0 @@
|
||||
--TEST--
|
||||
zend_dval_to_lval preserves low bits (64 bit long)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (PHP_INT_SIZE != 8)
|
||||
die("skip for machines with 64-bit longs");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
/* test doubles around -4e21 */
|
||||
$values = [
|
||||
-4000000000000001048576.,
|
||||
-4000000000000000524288.,
|
||||
-4000000000000000000000.,
|
||||
-3999999999999999475712.,
|
||||
-3999999999999998951424.,
|
||||
];
|
||||
|
||||
foreach ($values as $v) {
|
||||
var_dump((int)$v);
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
int(2943463994971652096)
|
||||
int(2943463994972176384)
|
||||
int(2943463994972700672)
|
||||
int(2943463994973224960)
|
||||
int(2943463994973749248)
|
||||
@@ -1,64 +0,0 @@
|
||||
--TEST--
|
||||
Exceptions before fatal error
|
||||
--FILE--
|
||||
<?php
|
||||
function exception_error_handler($code, $msg) {
|
||||
throw new Exception($msg);
|
||||
}
|
||||
|
||||
set_error_handler("exception_error_handler");
|
||||
|
||||
try {
|
||||
$foo->a();
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
new $foo();
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
throw $foo;
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
$foo();
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
$foo::b();
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
$b = clone $foo;
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
|
||||
class b {
|
||||
}
|
||||
|
||||
try {
|
||||
b::$foo();
|
||||
} catch(Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
string(23) "Undefined variable: foo"
|
||||
string(23) "Undefined variable: foo"
|
||||
string(23) "Undefined variable: foo"
|
||||
string(23) "Undefined variable: foo"
|
||||
string(23) "Undefined variable: foo"
|
||||
string(23) "Undefined variable: foo"
|
||||
string(23) "Undefined variable: foo"
|
||||
@@ -1,18 +0,0 @@
|
||||
--TEST--
|
||||
Tests cloning a generator with properties
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function gen() { yield; }
|
||||
|
||||
$g1 = gen();
|
||||
$g1->prop = 'val';
|
||||
|
||||
$g2 = clone $g1;
|
||||
unset($g1);
|
||||
|
||||
var_dump($g2->prop);
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
string(3) "val"
|
||||
@@ -38,6 +38,8 @@ Stack trace:
|
||||
#1 %s(%d): unserialize('O:9:"Generator"...')
|
||||
#2 {main}
|
||||
|
||||
|
||||
Notice: unserialize(): Error at offset 19 of 20 bytes in %s on line %d
|
||||
exception 'Exception' with message 'Unserialization of 'Generator' is not allowed' in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): unserialize('C:9:"Generator"...')
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
--TEST--
|
||||
finally is run on object dtor, not free
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function gen() {
|
||||
try {
|
||||
yield;
|
||||
} finally {
|
||||
var_dump($_GET);
|
||||
}
|
||||
}
|
||||
|
||||
$gen = gen();
|
||||
$gen->rewind();
|
||||
|
||||
set_error_handler(function() use($gen) {});
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
array(0) {
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
--TEST--
|
||||
Generators can return non-scalar keys
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function gen() {
|
||||
yield [1, 2, 3] => [4, 5, 6];
|
||||
yield (object) ['a' => 'b'] => (object) ['b' => 'a'];
|
||||
yield 3.14 => 2.73;
|
||||
yield false => true;
|
||||
yield true => false;
|
||||
yield null => null;
|
||||
}
|
||||
|
||||
foreach (gen() as $k => $v) {
|
||||
var_dump($k, $v);
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
array(3) {
|
||||
[0]=>
|
||||
int(1)
|
||||
[1]=>
|
||||
int(2)
|
||||
[2]=>
|
||||
int(3)
|
||||
}
|
||||
array(3) {
|
||||
[0]=>
|
||||
int(4)
|
||||
[1]=>
|
||||
int(5)
|
||||
[2]=>
|
||||
int(6)
|
||||
}
|
||||
object(stdClass)#3 (1) {
|
||||
["a"]=>
|
||||
string(1) "b"
|
||||
}
|
||||
object(stdClass)#4 (1) {
|
||||
["b"]=>
|
||||
string(1) "a"
|
||||
}
|
||||
float(3.14)
|
||||
float(2.73)
|
||||
bool(false)
|
||||
bool(true)
|
||||
bool(true)
|
||||
bool(false)
|
||||
NULL
|
||||
NULL
|
||||
@@ -1,30 +0,0 @@
|
||||
--TEST--
|
||||
Test nested calls with die() in a generator
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function gen() {
|
||||
die('Test');
|
||||
yield; // force generator
|
||||
}
|
||||
|
||||
function function_with_3_args() {
|
||||
$gen = gen();
|
||||
$gen->rewind();
|
||||
}
|
||||
|
||||
function function_with_4_args() {
|
||||
function_with_3_args(4, 5, 6);
|
||||
}
|
||||
|
||||
function outerGen() {
|
||||
function_with_4_args(0, 1, 2, 3);
|
||||
yield; // force generator
|
||||
}
|
||||
|
||||
$outerGen = outerGen();
|
||||
$outerGen->rewind();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
Test
|
||||
@@ -1,7 +1,5 @@
|
||||
--TEST--
|
||||
026: Name ambiguity (class name & namespace name)
|
||||
--INI--
|
||||
opcache.optimization_level=0
|
||||
--FILE--
|
||||
<?php
|
||||
namespace Foo;
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64070 (Inheritance with Traits failed with error)
|
||||
--FILE--
|
||||
<?php
|
||||
trait first_trait
|
||||
{
|
||||
function first_function()
|
||||
{
|
||||
echo "From First Trait\n";
|
||||
}
|
||||
}
|
||||
|
||||
trait second_trait
|
||||
{
|
||||
use first_trait {
|
||||
first_trait::first_function as second_function;
|
||||
}
|
||||
|
||||
function first_function()
|
||||
{
|
||||
echo "From Second Trait\n";
|
||||
}
|
||||
}
|
||||
|
||||
class first_class
|
||||
{
|
||||
use second_trait;
|
||||
}
|
||||
|
||||
$obj = new first_class();
|
||||
$obj->first_function();
|
||||
$obj->second_function();
|
||||
?>
|
||||
--EXPECT--
|
||||
From Second Trait
|
||||
From First Trait
|
||||
@@ -1,34 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64235 (Insteadof not work for class method in 5.4.11)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class TestParentClass
|
||||
{
|
||||
public function method()
|
||||
{
|
||||
print_r('Parent method');
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
|
||||
trait TestTrait
|
||||
{
|
||||
public function method()
|
||||
{
|
||||
print_r('Trait method');
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
|
||||
class TestChildClass extends TestParentClass
|
||||
{
|
||||
use TestTrait
|
||||
{
|
||||
TestTrait::method as methodAlias;
|
||||
TestParentClass::method insteadof TestTrait;
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Class TestParentClass is not a trait, Only traits may be used in 'as' and 'insteadof' statements in %sbug64235.php on line %d
|
||||
@@ -1,35 +0,0 @@
|
||||
--TEST--
|
||||
Bug #64235 (Insteadof not work for class method in 5.4.11)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class TestParentClass
|
||||
{
|
||||
public function method()
|
||||
{
|
||||
print_r('Parent method');
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
|
||||
trait TestTrait
|
||||
{
|
||||
public function method()
|
||||
{
|
||||
print_r('Trait method');
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
|
||||
class TestChildClass extends TestParentClass
|
||||
{
|
||||
use TestTrait
|
||||
{
|
||||
TestTrait::method as methodAlias;
|
||||
TestParentClass::method as TestParent;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Class TestParentClass is not a trait, Only traits may be used in 'as' and 'insteadof' statements in %sbug64235b.php on line %d
|
||||
@@ -14,4 +14,4 @@ class C {
|
||||
}
|
||||
}
|
||||
--EXPECTF--
|
||||
Fatal error: Required Trait T2 wasn't added to C in %slanguage015.php on line %d
|
||||
Fatal error: Trait T2 is not used in %s on line %d
|
||||
@@ -14,4 +14,4 @@ class C {
|
||||
}
|
||||
}
|
||||
--EXPECTF--
|
||||
Fatal error: Required Trait T2 wasn't added to C in %slanguage016.php on line %d
|
||||
Fatal error: Trait T2 is not used in %s on line %d
|
||||
@@ -14,4 +14,4 @@ class C {
|
||||
}
|
||||
}
|
||||
--EXPECTF--
|
||||
Fatal error: Required Trait T2 wasn't added to C in %slanguage017.php on line %d
|
||||
Fatal error: Trait T2 is not used in %s on line %d
|
||||
+2
-3
@@ -158,10 +158,9 @@ static void print_hash(zend_write_func_t write_func, HashTable *ht, int indent,
|
||||
case HASH_KEY_IS_STRING:
|
||||
if (is_object) {
|
||||
const char *prop_name, *class_name;
|
||||
int prop_len;
|
||||
int mangled = zend_unmangle_property_name_ex(string_key, str_len - 1, &class_name, &prop_name, &prop_len);
|
||||
int mangled = zend_unmangle_property_name(string_key, str_len - 1, &class_name, &prop_name);
|
||||
|
||||
ZEND_WRITE_EX(prop_name, prop_len);
|
||||
ZEND_PUTS_EX(prop_name);
|
||||
if (class_name && mangled == SUCCESS) {
|
||||
if (class_name[0]=='*') {
|
||||
ZEND_PUTS_EX(":protected");
|
||||
|
||||
+2
-5
@@ -299,6 +299,7 @@ void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((nore
|
||||
/*
|
||||
* zval
|
||||
*/
|
||||
typedef struct _zval_struct zval;
|
||||
typedef struct _zend_class_entry zend_class_entry;
|
||||
|
||||
typedef struct _zend_guard {
|
||||
@@ -364,10 +365,6 @@ struct _zval_struct {
|
||||
#define Z_UNSET_ISREF(z) Z_UNSET_ISREF_P(&(z))
|
||||
#define Z_SET_ISREF_TO(z, isref) Z_SET_ISREF_TO_P(&(z), isref)
|
||||
|
||||
#if ZEND_DEBUG
|
||||
#define zend_always_inline inline
|
||||
#define zend_never_inline
|
||||
#else
|
||||
#if defined(__GNUC__)
|
||||
#if __GNUC__ >= 3
|
||||
#define zend_always_inline inline __attribute__((always_inline))
|
||||
@@ -376,6 +373,7 @@ struct _zval_struct {
|
||||
#define zend_always_inline inline
|
||||
#define zend_never_inline
|
||||
#endif
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
#define zend_always_inline __forceinline
|
||||
#define zend_never_inline
|
||||
@@ -383,7 +381,6 @@ struct _zval_struct {
|
||||
#define zend_always_inline inline
|
||||
#define zend_never_inline
|
||||
#endif
|
||||
#endif /* ZEND_DEBUG */
|
||||
|
||||
#if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
|
||||
# define EXPECTED(condition) __builtin_expect(condition, 1)
|
||||
|
||||
+16
-170
@@ -306,14 +306,16 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
{
|
||||
const char *spec_walk = *spec;
|
||||
char c = *spec_walk++;
|
||||
int check_null = 0;
|
||||
int return_null = 0;
|
||||
|
||||
/* scan through modifiers */
|
||||
while (1) {
|
||||
if (*spec_walk == '/') {
|
||||
SEPARATE_ZVAL_IF_NOT_REF(arg);
|
||||
} else if (*spec_walk == '!') {
|
||||
check_null = 1;
|
||||
if (Z_TYPE_PP(arg) == IS_NULL) {
|
||||
return_null = 1;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -325,12 +327,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'L':
|
||||
{
|
||||
long *p = va_arg(*va, long *);
|
||||
|
||||
if (check_null) {
|
||||
zend_bool *p = va_arg(*va, zend_bool *);
|
||||
*p = (Z_TYPE_PP(arg) == IS_NULL);
|
||||
}
|
||||
|
||||
switch (Z_TYPE_PP(arg)) {
|
||||
case IS_STRING:
|
||||
{
|
||||
@@ -384,12 +380,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'd':
|
||||
{
|
||||
double *p = va_arg(*va, double *);
|
||||
|
||||
if (check_null) {
|
||||
zend_bool *p = va_arg(*va, zend_bool *);
|
||||
*p = (Z_TYPE_PP(arg) == IS_NULL);
|
||||
}
|
||||
|
||||
switch (Z_TYPE_PP(arg)) {
|
||||
case IS_STRING:
|
||||
{
|
||||
@@ -428,7 +418,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
int *pl = va_arg(*va, int *);
|
||||
switch (Z_TYPE_PP(arg)) {
|
||||
case IS_NULL:
|
||||
if (check_null) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
*pl = 0;
|
||||
break;
|
||||
@@ -472,12 +462,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'b':
|
||||
{
|
||||
zend_bool *p = va_arg(*va, zend_bool *);
|
||||
|
||||
if (check_null) {
|
||||
zend_bool *p = va_arg(*va, zend_bool *);
|
||||
*p = (Z_TYPE_PP(arg) == IS_NULL);
|
||||
}
|
||||
|
||||
switch (Z_TYPE_PP(arg)) {
|
||||
case IS_NULL:
|
||||
case IS_STRING:
|
||||
@@ -500,7 +484,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'r':
|
||||
{
|
||||
zval **p = va_arg(*va, zval **);
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -515,7 +499,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'a':
|
||||
{
|
||||
zval **p = va_arg(*va, zval **);
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -530,7 +514,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'h':
|
||||
{
|
||||
HashTable **p = va_arg(*va, HashTable **);
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -550,7 +534,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'o':
|
||||
{
|
||||
zval **p = va_arg(*va, zval **);
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -567,7 +551,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
zval **p = va_arg(*va, zval **);
|
||||
zend_class_entry *ce = va_arg(*va, zend_class_entry *);
|
||||
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -589,7 +573,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
zend_class_entry **lookup, **pce = va_arg(*va, zend_class_entry **);
|
||||
zend_class_entry *ce_base = *pce;
|
||||
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*pce = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -623,7 +607,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
zend_fcall_info_cache *fcc = va_arg(*va, zend_fcall_info_cache *);
|
||||
char *is_callable_error = NULL;
|
||||
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
fci->size = 0;
|
||||
fcc->initialized = 0;
|
||||
break;
|
||||
@@ -653,7 +637,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'z':
|
||||
{
|
||||
zval **p = va_arg(*va, zval **);
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
} else {
|
||||
*p = *arg;
|
||||
@@ -664,7 +648,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, con
|
||||
case 'Z':
|
||||
{
|
||||
zval ***p = va_arg(*va, zval ***);
|
||||
if (check_null && Z_TYPE_PP(arg) == IS_NULL) {
|
||||
if (return_null) {
|
||||
*p = NULL;
|
||||
} else {
|
||||
*p = arg;
|
||||
@@ -713,19 +697,6 @@ static int zend_parse_arg(int arg_num, zval **arg, va_list *va, const char **spe
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API int zend_parse_parameter(int flags, int arg_num TSRMLS_DC, zval **arg, const char *spec, ...)
|
||||
{
|
||||
va_list va;
|
||||
int ret;
|
||||
int quiet = flags & ZEND_PARSE_PARAMS_QUIET;
|
||||
|
||||
va_start(va, spec);
|
||||
ret = zend_parse_arg(arg_num, arg, &va, &spec, quiet TSRMLS_CC);
|
||||
va_end(va);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, int flags TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
const char *spec_walk;
|
||||
@@ -1051,41 +1022,6 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destro
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int zval_update_class_constant(zval **pp, int is_static, int offset TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
if ((Z_TYPE_PP(pp) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT ||
|
||||
(Z_TYPE_PP(pp) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT_ARRAY) {
|
||||
zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry);
|
||||
|
||||
if ((*scope)->parent) {
|
||||
zend_class_entry *ce = *scope;
|
||||
HashPosition pos;
|
||||
zend_property_info *prop_info;
|
||||
|
||||
do {
|
||||
for (zend_hash_internal_pointer_reset_ex(&ce->properties_info, &pos);
|
||||
zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop_info, &pos) == SUCCESS;
|
||||
zend_hash_move_forward_ex(&ce->properties_info, &pos)) {
|
||||
if (is_static == ((prop_info->flags & ZEND_ACC_STATIC) != 0) &&
|
||||
offset == prop_info->offset) {
|
||||
int ret;
|
||||
zend_class_entry *old_scope = *scope;
|
||||
*scope = prop_info->ce;
|
||||
ret = zval_update_constant(pp, (void*)1 TSRMLS_CC);
|
||||
*scope = old_scope;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
ce = ce->parent;
|
||||
} while (ce);
|
||||
|
||||
}
|
||||
return zval_update_constant(pp, (void*)1 TSRMLS_CC);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
if ((class_type->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) == 0 || (!CE_STATIC_MEMBERS(class_type) && class_type->default_static_members_count)) {
|
||||
@@ -1098,7 +1034,7 @@ ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC
|
||||
|
||||
for (i = 0; i < class_type->default_properties_count; i++) {
|
||||
if (class_type->default_properties_table[i]) {
|
||||
zval_update_class_constant(&class_type->default_properties_table[i], 0, i TSRMLS_CC);
|
||||
zval_update_constant(&class_type->default_properties_table[i], (void**)1 TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1139,7 +1075,7 @@ ZEND_API void zend_update_class_constants(zend_class_entry *class_type TSRMLS_DC
|
||||
}
|
||||
|
||||
for (i = 0; i < class_type->default_static_members_count; i++) {
|
||||
zval_update_class_constant(&CE_STATIC_MEMBERS(class_type)[i], 1, i TSRMLS_CC);
|
||||
zval_update_constant(&CE_STATIC_MEMBERS(class_type)[i], (void**)1 TSRMLS_CC);
|
||||
}
|
||||
|
||||
*scope = old_scope;
|
||||
@@ -1537,40 +1473,6 @@ ZEND_API int add_get_index_stringl(zval *arg, ulong index, const char *str, uint
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */
|
||||
{
|
||||
int result;
|
||||
|
||||
switch (Z_TYPE_P(key)) {
|
||||
case IS_STRING:
|
||||
result = zend_symtable_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL);
|
||||
break;
|
||||
case IS_NULL:
|
||||
result = zend_symtable_update(ht, "", 1, &value, sizeof(zval *), NULL);
|
||||
break;
|
||||
case IS_RESOURCE:
|
||||
zend_error(E_STRICT, "Resource ID#%ld used as offset, casting to integer (%ld)", Z_LVAL_P(key), Z_LVAL_P(key));
|
||||
/* break missing intentionally */
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
result = zend_hash_index_update(ht, Z_LVAL_P(key), &value, sizeof(zval *), NULL);
|
||||
break;
|
||||
case IS_DOUBLE:
|
||||
result = zend_hash_index_update(ht, zend_dval_to_lval(Z_DVAL_P(key)), &value, sizeof(zval *), NULL);
|
||||
break;
|
||||
default:
|
||||
zend_error(E_WARNING, "Illegal offset type");
|
||||
result = FAILURE;
|
||||
}
|
||||
|
||||
if (result == SUCCESS) {
|
||||
Z_ADDREF_P(value);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API int add_property_long_ex(zval *arg, const char *key, uint key_len, long n TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zval *tmp;
|
||||
@@ -3976,62 +3878,6 @@ ZEND_API void zend_restore_error_handling(zend_error_handling *saved TSRMLS_DC)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API const char* zend_find_alias_name(zend_class_entry *ce, const char *name, zend_uint len) /* {{{ */
|
||||
{
|
||||
zend_trait_alias *alias, **alias_ptr;
|
||||
|
||||
alias_ptr = ce->trait_aliases;
|
||||
alias = *alias_ptr;
|
||||
while (alias) {
|
||||
if (alias->alias_len == len &&
|
||||
!strncasecmp(name, alias->alias, alias->alias_len)) {
|
||||
return alias->alias;
|
||||
}
|
||||
alias_ptr++;
|
||||
alias = *alias_ptr;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API const char* zend_resolve_method_name(zend_class_entry *ce, zend_function *f) /* {{{ */
|
||||
{
|
||||
zend_function *func;
|
||||
HashPosition iterator;
|
||||
HashTable *function_table;
|
||||
|
||||
if (f->common.type != ZEND_USER_FUNCTION ||
|
||||
*(f->op_array.refcount) < 2 ||
|
||||
!f->common.scope ||
|
||||
!f->common.scope->trait_aliases) {
|
||||
return f->common.function_name;
|
||||
}
|
||||
|
||||
function_table = &ce->function_table;
|
||||
zend_hash_internal_pointer_reset_ex(function_table, &iterator);
|
||||
while (zend_hash_get_current_data_ex(function_table, (void **)&func, &iterator) == SUCCESS) {
|
||||
if (func == f) {
|
||||
char *name;
|
||||
uint len;
|
||||
ulong idx;
|
||||
|
||||
if (zend_hash_get_current_key_ex(function_table, &name, &len, &idx, 0, &iterator) != HASH_KEY_IS_STRING) {
|
||||
return f->common.function_name;
|
||||
}
|
||||
--len;
|
||||
if (len == strlen(f->common.function_name) &&
|
||||
!strncasecmp(name, f->common.function_name, len)) {
|
||||
return f->common.function_name;
|
||||
}
|
||||
return zend_find_alias_name(f->common.scope, name, len);
|
||||
}
|
||||
zend_hash_move_forward_ex(function_table, &iterator);
|
||||
}
|
||||
return f->common.function_name;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
|
||||
+3
-10
@@ -60,7 +60,7 @@ typedef struct _zend_fcall_info_cache {
|
||||
zval *object_ptr;
|
||||
} zend_fcall_info_cache;
|
||||
|
||||
#define ZEND_NS_NAME(ns, name) ns "\\" name
|
||||
#define ZEND_NS_NAME(ns, name) ns"\\"name
|
||||
|
||||
#define ZEND_FN(name) zif_##name
|
||||
#define ZEND_MN(name) zim_##name
|
||||
@@ -258,8 +258,6 @@ ZEND_API char *zend_zval_type_name(const zval *arg);
|
||||
ZEND_API int zend_parse_method_parameters(int num_args TSRMLS_DC, zval *this_ptr, const char *type_spec, ...);
|
||||
ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args TSRMLS_DC, zval *this_ptr, const char *type_spec, ...);
|
||||
|
||||
ZEND_API int zend_parse_parameter(int flags, int arg_num TSRMLS_DC, zval **arg, const char *spec, ...);
|
||||
|
||||
/* End of parameter parsing API -- andrei */
|
||||
|
||||
ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_function_entry *functions, HashTable *function_table, int type TSRMLS_DC);
|
||||
@@ -281,9 +279,9 @@ ZEND_API void zend_class_implements(zend_class_entry *class_entry TSRMLS_DC, int
|
||||
ZEND_API int zend_register_class_alias_ex(const char *name, int name_len, zend_class_entry *ce TSRMLS_DC);
|
||||
|
||||
#define zend_register_class_alias(name, ce) \
|
||||
zend_register_class_alias_ex(name, sizeof(name)-1, ce TSRMLS_CC)
|
||||
zend_register_class_alias_ex(name, sizeof(name)-1, ce TSRMLS_DC)
|
||||
#define zend_register_ns_class_alias(ns, name, ce) \
|
||||
zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce TSRMLS_CC)
|
||||
zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce TSRMLS_DC)
|
||||
|
||||
ZEND_API int zend_disable_function(char *function_name, uint function_name_length TSRMLS_DC);
|
||||
ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_DC);
|
||||
@@ -426,8 +424,6 @@ ZEND_API int add_get_index_double(zval *arg, ulong idx, double d, void **dest);
|
||||
ZEND_API int add_get_index_string(zval *arg, ulong idx, const char *str, void **dest, int duplicate);
|
||||
ZEND_API int add_get_index_stringl(zval *arg, ulong idx, const char *str, uint length, void **dest, int duplicate);
|
||||
|
||||
ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value);
|
||||
|
||||
ZEND_API int add_property_long_ex(zval *arg, const char *key, uint key_len, long l TSRMLS_DC);
|
||||
ZEND_API int add_property_null_ex(zval *arg, const char *key, uint key_len TSRMLS_DC);
|
||||
ZEND_API int add_property_bool_ex(zval *arg, const char *key, uint key_len, int b TSRMLS_DC);
|
||||
@@ -521,9 +517,6 @@ ZEND_API void zend_reset_all_cv(HashTable *symbol_table TSRMLS_DC);
|
||||
|
||||
ZEND_API void zend_rebuild_symbol_table(TSRMLS_D);
|
||||
|
||||
ZEND_API const char* zend_find_alias_name(zend_class_entry *ce, const char *name, zend_uint len);
|
||||
ZEND_API const char* zend_resolve_method_name(zend_class_entry *ce, zend_function *f);
|
||||
|
||||
#define add_method(arg, key, method) add_assoc_function((arg), (key), (method))
|
||||
|
||||
ZEND_API ZEND_FUNCTION(display_disabled_function);
|
||||
|
||||
+5
-50
@@ -667,19 +667,17 @@ static inline unsigned int zend_mm_high_bit(size_t _size)
|
||||
#if defined(__GNUC__) && (defined(__native_client__) || defined(i386))
|
||||
unsigned int n;
|
||||
|
||||
__asm__("bsrl %1,%0\n\t" : "=r" (n) : "rm" (_size) : "cc");
|
||||
__asm__("bsrl %1,%0\n\t" : "=r" (n) : "rm" (_size));
|
||||
return n;
|
||||
#elif defined(__GNUC__) && defined(__x86_64__)
|
||||
unsigned long n;
|
||||
|
||||
__asm__("bsrq %1,%0\n\t" : "=r" (n) : "rm" (_size) : "cc");
|
||||
__asm__("bsrq %1,%0\n\t" : "=r" (n) : "rm" (_size));
|
||||
return (unsigned int)n;
|
||||
#elif defined(_MSC_VER) && defined(_M_IX86)
|
||||
__asm {
|
||||
bsr eax, _size
|
||||
}
|
||||
#elif defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))
|
||||
return (8 * SIZEOF_SIZE_T - 1) - __builtin_clzl(_size);
|
||||
#else
|
||||
unsigned int n = 0;
|
||||
while (_size != 0) {
|
||||
@@ -695,19 +693,17 @@ static inline unsigned int zend_mm_low_bit(size_t _size)
|
||||
#if defined(__GNUC__) && (defined(__native_client__) || defined(i386))
|
||||
unsigned int n;
|
||||
|
||||
__asm__("bsfl %1,%0\n\t" : "=r" (n) : "rm" (_size) : "cc");
|
||||
__asm__("bsfl %1,%0\n\t" : "=r" (n) : "rm" (_size));
|
||||
return n;
|
||||
#elif defined(__GNUC__) && defined(__x86_64__)
|
||||
unsigned long n;
|
||||
|
||||
__asm__("bsfq %1,%0\n\t" : "=r" (n) : "rm" (_size) : "cc");
|
||||
__asm__("bsfq %1,%0\n\t" : "=r" (n) : "rm" (_size));
|
||||
return (unsigned int)n;
|
||||
#elif defined(_MSC_VER) && defined(_M_IX86)
|
||||
__asm {
|
||||
bsf eax, _size
|
||||
}
|
||||
#elif defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))
|
||||
return __builtin_ctzl(_size);
|
||||
}
|
||||
#else
|
||||
static const int offset[16] = {4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};
|
||||
unsigned int n;
|
||||
@@ -2498,47 +2494,6 @@ static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
|
||||
return res;
|
||||
}
|
||||
|
||||
#elif defined(__GNUC__) && defined(__arm__)
|
||||
|
||||
static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
|
||||
{
|
||||
size_t res;
|
||||
unsigned long overflow;
|
||||
|
||||
__asm__ ("umlal %0,%1,%2,%3"
|
||||
: "=r"(res), "=r"(overflow)
|
||||
: "r"(nmemb),
|
||||
"r"(size),
|
||||
"0"(offset),
|
||||
"1"(0));
|
||||
|
||||
if (UNEXPECTED(overflow)) {
|
||||
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%zu * %zu + %zu)", nmemb, size, offset);
|
||||
return 0;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
#elif defined(__GNUC__) && defined(__aarch64__)
|
||||
|
||||
static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
|
||||
{
|
||||
size_t res;
|
||||
unsigned long overflow;
|
||||
|
||||
__asm__ ("mul %0,%2,%3\n\tumulh %1,%2,%3\n\tadds %0,%0,%4\n\tadc %1,%1,%1"
|
||||
: "=&r"(res), "=&r"(overflow)
|
||||
: "r"(nmemb),
|
||||
"r"(size),
|
||||
"r"(offset));
|
||||
|
||||
if (UNEXPECTED(overflow)) {
|
||||
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%zu * %zu + %zu)", nmemb, size, offset);
|
||||
return 0;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
#elif SIZEOF_SIZE_T == 4 && defined(HAVE_ZEND_LONG64)
|
||||
|
||||
static inline size_t safe_address(size_t nmemb, size_t size, size_t offset)
|
||||
|
||||
@@ -987,7 +987,7 @@ ZEND_FUNCTION(get_object_vars)
|
||||
HashPosition pos;
|
||||
char *key;
|
||||
const char *prop_name, *class_name;
|
||||
uint key_len, prop_len;
|
||||
uint key_len;
|
||||
ulong num_index;
|
||||
zend_object *zobj;
|
||||
|
||||
@@ -1014,10 +1014,10 @@ ZEND_FUNCTION(get_object_vars)
|
||||
while (zend_hash_get_current_data_ex(properties, (void **) &value, &pos) == SUCCESS) {
|
||||
if (zend_hash_get_current_key_ex(properties, &key, &key_len, &num_index, 0, &pos) == HASH_KEY_IS_STRING) {
|
||||
if (zend_check_property_access(zobj, key, key_len-1 TSRMLS_CC) == SUCCESS) {
|
||||
zend_unmangle_property_name_ex(key, key_len - 1, &class_name, &prop_name, &prop_len);
|
||||
zend_unmangle_property_name(key, key_len-1, &class_name, &prop_name);
|
||||
/* Not separating references */
|
||||
Z_ADDREF_PP(value);
|
||||
add_assoc_zval_ex(return_value, prop_name, prop_len + 1, *value);
|
||||
add_assoc_zval_ex(return_value, prop_name, strlen(prop_name)+1, *value);
|
||||
}
|
||||
}
|
||||
zend_hash_move_forward_ex(properties, &pos);
|
||||
@@ -1025,13 +1025,6 @@ ZEND_FUNCTION(get_object_vars)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int same_name(const char *key, const char *name, zend_uint name_len)
|
||||
{
|
||||
char *lcname = zend_str_tolower_dup(name, name_len);
|
||||
int ret = memcmp(lcname, key, name_len) == 0;
|
||||
efree(lcname);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* {{{ proto array get_class_methods(mixed class)
|
||||
Returns an array of method names for class or class instance. */
|
||||
@@ -1079,26 +1072,14 @@ ZEND_FUNCTION(get_class_methods)
|
||||
uint len = strlen(mptr->common.function_name);
|
||||
|
||||
/* Do not display old-style inherited constructors */
|
||||
if (zend_hash_get_current_key_ex(&ce->function_table, &key, &key_len, &num_index, 0, &pos) != HASH_KEY_IS_STRING) {
|
||||
if ((mptr->common.fn_flags & ZEND_ACC_CTOR) == 0 ||
|
||||
mptr->common.scope == ce ||
|
||||
zend_hash_get_current_key_ex(&ce->function_table, &key, &key_len, &num_index, 0, &pos) != HASH_KEY_IS_STRING ||
|
||||
zend_binary_strcasecmp(key, key_len-1, mptr->common.function_name, len) == 0) {
|
||||
|
||||
MAKE_STD_ZVAL(method_name);
|
||||
ZVAL_STRINGL(method_name, mptr->common.function_name, len, 1);
|
||||
zend_hash_next_index_insert(return_value->value.ht, &method_name, sizeof(zval *), NULL);
|
||||
} else if ((mptr->common.fn_flags & ZEND_ACC_CTOR) == 0 ||
|
||||
mptr->common.scope == ce ||
|
||||
zend_binary_strcasecmp(key, key_len-1, mptr->common.function_name, len) == 0) {
|
||||
|
||||
if (mptr->type == ZEND_USER_FUNCTION &&
|
||||
*mptr->op_array.refcount > 1 &&
|
||||
(len != key_len - 1 ||
|
||||
!same_name(key, mptr->common.function_name, len))) {
|
||||
MAKE_STD_ZVAL(method_name);
|
||||
ZVAL_STRINGL(method_name, zend_find_alias_name(mptr->common.scope, key, key_len - 1), key_len - 1, 1);
|
||||
zend_hash_next_index_insert(return_value->value.ht, &method_name, sizeof(zval *), NULL);
|
||||
} else {
|
||||
MAKE_STD_ZVAL(method_name);
|
||||
ZVAL_STRINGL(method_name, mptr->common.function_name, len, 1);
|
||||
zend_hash_next_index_insert(return_value->value.ht, &method_name, sizeof(zval *), NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
zend_hash_move_forward_ex(&ce->function_table, &pos);
|
||||
@@ -1644,6 +1625,7 @@ ZEND_FUNCTION(restore_exception_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
static int copy_class_or_interface_name(zend_class_entry **pce TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
|
||||
{
|
||||
zval *array = va_arg(args, zval *);
|
||||
@@ -1654,13 +1636,7 @@ static int copy_class_or_interface_name(zend_class_entry **pce TSRMLS_DC, int nu
|
||||
|
||||
if ((hash_key->nKeyLength==0 || hash_key->arKey[0]!=0)
|
||||
&& (comply_mask == (ce->ce_flags & mask))) {
|
||||
if (ce->refcount > 1 &&
|
||||
(ce->name_length != hash_key->nKeyLength - 1 ||
|
||||
!same_name(hash_key->arKey, ce->name, ce->name_length))) {
|
||||
add_next_index_stringl(array, hash_key->arKey, hash_key->nKeyLength - 1, 1);
|
||||
} else {
|
||||
add_next_index_stringl(array, ce->name, ce->name_length, 1);
|
||||
}
|
||||
add_next_index_stringl(array, ce->name, ce->name_length, 1);
|
||||
}
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
@@ -2103,14 +2079,7 @@ ZEND_FUNCTION(debug_print_backtrace)
|
||||
lineno = 0;
|
||||
}
|
||||
|
||||
function_name = (ptr->function_state.function->common.scope &&
|
||||
ptr->function_state.function->common.scope->trait_aliases) ?
|
||||
zend_resolve_method_name(
|
||||
ptr->object ?
|
||||
Z_OBJCE_P(ptr->object) :
|
||||
ptr->function_state.function->common.scope,
|
||||
ptr->function_state.function) :
|
||||
ptr->function_state.function->common.function_name;
|
||||
function_name = ptr->function_state.function->common.function_name;
|
||||
|
||||
if (function_name) {
|
||||
if (ptr->object) {
|
||||
@@ -2291,14 +2260,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
|
||||
filename = NULL;
|
||||
}
|
||||
|
||||
function_name = (ptr->function_state.function->common.scope &&
|
||||
ptr->function_state.function->common.scope->trait_aliases) ?
|
||||
zend_resolve_method_name(
|
||||
ptr->object ?
|
||||
Z_OBJCE_P(ptr->object) :
|
||||
ptr->function_state.function->common.scope,
|
||||
ptr->function_state.function) :
|
||||
ptr->function_state.function->common.function_name;
|
||||
function_name = ptr->function_state.function->common.function_name;
|
||||
|
||||
if (function_name) {
|
||||
add_assoc_string_ex(stack_frame, "function", sizeof("function"), (char*)function_name, 1);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
| Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.zend.com/license/2_00.txt. |
|
||||
| If you did not receive a copy of the Zend license and are unable to |
|
||||
@@ -88,7 +88,7 @@ ZEND_METHOD(Closure, bind)
|
||||
RETURN_NULL();
|
||||
}
|
||||
|
||||
closure = (zend_closure *)zend_object_store_get_object(zclosure TSRMLS_CC);
|
||||
closure = (zend_closure *)zend_object_store_get_object(zclosure TSRMLS_CC);
|
||||
|
||||
if ((newthis != NULL) && (closure->func.common.fn_flags & ZEND_ACC_STATIC)) {
|
||||
zend_error(E_WARNING, "Cannot bind an instance to a static closure");
|
||||
@@ -152,7 +152,7 @@ static int zend_closure_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{{ */
|
||||
|
||||
ZEND_API zend_function *zend_get_closure_invoke_method(zval *obj TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
zend_function *invoke = (zend_function*)emalloc(sizeof(zend_function));
|
||||
|
||||
invoke->common = closure->func.common;
|
||||
@@ -168,14 +168,14 @@ ZEND_API zend_function *zend_get_closure_invoke_method(zval *obj TSRMLS_DC) /* {
|
||||
|
||||
ZEND_API const zend_function *zend_get_closure_method_def(zval *obj TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
return &closure->func;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API zval* zend_get_closure_this_ptr(zval *obj TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
return closure->this_ptr;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -212,7 +212,7 @@ static void zend_closure_write_property(zval *object, zval *member, zval *value,
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static zval **zend_closure_get_property_ptr_ptr(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */
|
||||
static zval **zend_closure_get_property_ptr_ptr(zval *object, zval *member, const zend_literal *key TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
ZEND_CLOSURE_PROPERTY_ERROR();
|
||||
return NULL;
|
||||
@@ -291,6 +291,7 @@ static zend_object_value zend_closure_clone(zval *zobject TSRMLS_DC) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
int zend_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_closure *closure;
|
||||
@@ -377,7 +378,7 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp TSRMLS_
|
||||
|
||||
static HashTable *zend_closure_get_gc(zval *obj, zval ***table, int *n TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||
|
||||
*table = closure->this_ptr ? &closure->this_ptr : NULL;
|
||||
*n = closure->this_ptr ? 1 : 0;
|
||||
@@ -473,7 +474,7 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
|
||||
zend_error(E_WARNING, "Cannot bind function %s::%s to scope class %s", func->common.scope->name, func->common.function_name, scope->name);
|
||||
scope = NULL;
|
||||
}
|
||||
if(scope && this_ptr && (func->common.fn_flags & ZEND_ACC_STATIC) == 0 &&
|
||||
if(scope && this_ptr && (func->common.fn_flags & ZEND_ACC_STATIC) == 0 &&
|
||||
!instanceof_function(Z_OBJCE_P(this_ptr), closure->func.common.scope TSRMLS_CC)) {
|
||||
zend_error(E_WARNING, "Cannot bind function %s::%s to object of class %s", func->common.scope->name, func->common.function_name, Z_OBJCE_P(this_ptr)->name);
|
||||
scope = NULL;
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
|
||||
#define ZEND_INVOKE_FUNC_NAME "__invoke"
|
||||
|
||||
void zend_register_closure_ce(TSRMLS_D);
|
||||
|
||||
extern ZEND_API zend_class_entry *zend_ce_closure;
|
||||
|
||||
+113
-181
@@ -5,7 +5,7 @@
|
||||
| Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.00 of the Zend license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.zend.com/license/2_00.txt. |
|
||||
| If you did not receive a copy of the Zend license and are unable to |
|
||||
@@ -107,7 +107,7 @@ ZEND_API zend_executor_globals executor_globals;
|
||||
|
||||
static void zend_duplicate_property_info(zend_property_info *property_info) /* {{{ */
|
||||
{
|
||||
if (!IS_INTERNED(property_info->name)) {
|
||||
if (!IS_INTERNED(property_info->name)) {
|
||||
property_info->name = estrndup(property_info->name, property_info->name_length);
|
||||
}
|
||||
if (property_info->doc_comment) {
|
||||
@@ -118,7 +118,7 @@ static void zend_duplicate_property_info(zend_property_info *property_info) /* {
|
||||
|
||||
static void zend_duplicate_property_info_internal(zend_property_info *property_info) /* {{{ */
|
||||
{
|
||||
if (!IS_INTERNED(property_info->name)) {
|
||||
if (!IS_INTERNED(property_info->name)) {
|
||||
property_info->name = zend_strndup(property_info->name, property_info->name_length);
|
||||
}
|
||||
}
|
||||
@@ -383,7 +383,7 @@ int zend_add_func_name_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC
|
||||
zval c;
|
||||
int lc_literal;
|
||||
|
||||
if (op_array->last_literal > 0 &&
|
||||
if (op_array->last_literal > 0 &&
|
||||
&op_array->literals[op_array->last_literal - 1].constant == zv &&
|
||||
op_array->literals[op_array->last_literal - 1].cache_slot == -1) {
|
||||
/* we already have function name as last literal (do nothing) */
|
||||
@@ -391,7 +391,7 @@ int zend_add_func_name_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC
|
||||
} else {
|
||||
ret = zend_add_literal(op_array, zv TSRMLS_CC);
|
||||
}
|
||||
|
||||
|
||||
lc_name = zend_str_tolower_dup(Z_STRVAL_P(zv), Z_STRLEN_P(zv));
|
||||
ZVAL_STRINGL(&c, lc_name, Z_STRLEN_P(zv), 0);
|
||||
lc_literal = zend_add_literal(CG(active_op_array), &c TSRMLS_CC);
|
||||
@@ -410,7 +410,7 @@ int zend_add_ns_func_name_literal(zend_op_array *op_array, const zval *zv TSRMLS
|
||||
zval c;
|
||||
int lc_literal;
|
||||
|
||||
if (op_array->last_literal > 0 &&
|
||||
if (op_array->last_literal > 0 &&
|
||||
&op_array->literals[op_array->last_literal - 1].constant == zv &&
|
||||
op_array->literals[op_array->last_literal - 1].cache_slot == -1) {
|
||||
/* we already have function name as last literal (do nothing) */
|
||||
@@ -443,7 +443,7 @@ int zend_add_class_name_literal(zend_op_array *op_array, const zval *zv TSRMLS_D
|
||||
zval c;
|
||||
int lc_literal;
|
||||
|
||||
if (op_array->last_literal > 0 &&
|
||||
if (op_array->last_literal > 0 &&
|
||||
&op_array->literals[op_array->last_literal - 1].constant == zv &&
|
||||
op_array->literals[op_array->last_literal - 1].cache_slot == -1) {
|
||||
/* we already have function name as last literal (do nothing) */
|
||||
@@ -477,7 +477,7 @@ int zend_add_const_name_literal(zend_op_array *op_array, const zval *zv, int unq
|
||||
int name_len, ns_len;
|
||||
zval c;
|
||||
|
||||
if (op_array->last_literal > 0 &&
|
||||
if (op_array->last_literal > 0 &&
|
||||
&op_array->literals[op_array->last_literal - 1].constant == zv &&
|
||||
op_array->literals[op_array->last_literal - 1].cache_slot == -1) {
|
||||
/* we already have function name as last literal (do nothing) */
|
||||
@@ -486,7 +486,7 @@ int zend_add_const_name_literal(zend_op_array *op_array, const zval *zv, int unq
|
||||
ret = zend_add_literal(op_array, zv TSRMLS_CC);
|
||||
}
|
||||
|
||||
/* skip leading '\\' */
|
||||
/* skip leading '\\' */
|
||||
if (Z_STRVAL_P(zv)[0] == '\\') {
|
||||
name_len = Z_STRLEN_P(zv) - 1;
|
||||
name = Z_STRVAL_P(zv) + 1;
|
||||
@@ -816,7 +816,7 @@ void fetch_array_dim(znode *result, const znode *parent, const znode *dim TSRMLS
|
||||
opline.result.var = opline.op1.var;
|
||||
zend_llist_add_element(fetch_list_ptr, &opline);
|
||||
}
|
||||
|
||||
|
||||
init_op(&opline TSRMLS_CC);
|
||||
opline.opcode = ZEND_FETCH_DIM_W; /* the backpatching routine assumes W */
|
||||
opline.result_type = IS_VAR;
|
||||
@@ -830,12 +830,12 @@ void fetch_array_dim(znode *result, const znode *parent, const znode *dim TSRMLS
|
||||
ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(CONSTANT(opline.op2.constant)), Z_STRLEN(CONSTANT(opline.op2.constant))+1, index, numeric = 1);
|
||||
if (numeric) {
|
||||
zval_dtor(&CONSTANT(opline.op2.constant));
|
||||
ZVAL_LONG(&CONSTANT(opline.op2.constant), index);
|
||||
ZVAL_LONG(&CONSTANT(opline.op2.constant), index);
|
||||
} else {
|
||||
CALCULATE_LITERAL_HASH(opline.op2.constant);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GET_NODE(result, opline.result);
|
||||
|
||||
zend_llist_add_element(fetch_list_ptr, &opline);
|
||||
@@ -940,7 +940,7 @@ void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC) /* {
|
||||
opline->result.var = get_temporary_variable(CG(active_op_array));
|
||||
opline->op1_type = IS_CONST;
|
||||
LITERAL_STRINGL(opline->op1,
|
||||
CG(active_op_array)->vars[value->u.op.var].name,
|
||||
CG(active_op_array)->vars[value->u.op.var].name,
|
||||
CG(active_op_array)->vars[value->u.op.var].name_len, 1);
|
||||
CALCULATE_LITERAL_HASH(opline->op1.constant);
|
||||
SET_UNUSED(opline->op2);
|
||||
@@ -1569,7 +1569,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
|
||||
|
||||
if (is_method) {
|
||||
int result;
|
||||
|
||||
|
||||
lcname = zend_new_interned_string(zend_str_tolower_dup(name, name_len), name_len + 1, 1 TSRMLS_CC);
|
||||
|
||||
if (IS_INTERNED(lcname)) {
|
||||
@@ -1621,14 +1621,10 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
|
||||
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||
zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
|
||||
}
|
||||
} else if ((name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1))) {
|
||||
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||
zend_error(E_WARNING, "The magic method __invoke() must have public visibility and cannot be static");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
char *class_lcname;
|
||||
|
||||
|
||||
class_lcname = do_alloca(CG(active_class_entry)->name_length + 1, use_heap);
|
||||
zend_str_tolower_copy(class_lcname, CG(active_class_entry)->name, CG(active_class_entry)->name_length);
|
||||
/* Improve after RC: cache the lowercase class name */
|
||||
@@ -1679,12 +1675,8 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
|
||||
} else if ((name_len == sizeof(ZEND_TOSTRING_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_TOSTRING_FUNC_NAME, sizeof(ZEND_TOSTRING_FUNC_NAME)-1))) {
|
||||
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||
zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
|
||||
}
|
||||
}
|
||||
CG(active_class_entry)->__tostring = (zend_function *) CG(active_op_array);
|
||||
} else if ((name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1))) {
|
||||
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||
zend_error(E_WARNING, "The magic method __invoke() must have public visibility and cannot be static");
|
||||
}
|
||||
} else if (!(fn_flags & ZEND_ACC_STATIC)) {
|
||||
CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC;
|
||||
}
|
||||
@@ -1814,14 +1806,14 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /*
|
||||
if (CG(active_class_entry)) {
|
||||
zend_check_magic_method_implementation(CG(active_class_entry), (zend_function*)CG(active_op_array), E_COMPILE_ERROR TSRMLS_CC);
|
||||
} else {
|
||||
/* we don't care if the function name is longer, in fact lowercasing only
|
||||
/* we don't care if the function name is longer, in fact lowercasing only
|
||||
* the beginning of the name speeds up the check process */
|
||||
name_len = strlen(CG(active_op_array)->function_name);
|
||||
zend_str_tolower_copy(lcname, CG(active_op_array)->function_name, MIN(name_len, sizeof(lcname)-1));
|
||||
lcname[sizeof(lcname)-1] = '\0'; /* zend_str_tolower_copy won't necessarily set the zero byte */
|
||||
if (name_len == sizeof(ZEND_AUTOLOAD_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_AUTOLOAD_FUNC_NAME, sizeof(ZEND_AUTOLOAD_FUNC_NAME)) && CG(active_op_array)->num_args != 1) {
|
||||
zend_error(E_COMPILE_ERROR, "%s() must take exactly 1 argument", ZEND_AUTOLOAD_FUNC_NAME);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CG(active_op_array)->line_end = zend_get_compiled_lineno(TSRMLS_C);
|
||||
@@ -1947,7 +1939,7 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace
|
||||
internal function with short name */
|
||||
zend_do_begin_dynamic_function_call(function_name, 1 TSRMLS_CC);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
lcname = zend_str_tolower_dup(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len);
|
||||
if ((zend_hash_find(CG(function_table), lcname, function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) ||
|
||||
@@ -1956,10 +1948,10 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace
|
||||
zend_do_begin_dynamic_function_call(function_name, 0 TSRMLS_CC);
|
||||
efree(lcname);
|
||||
return 1; /* Dynamic */
|
||||
}
|
||||
}
|
||||
efree(function_name->u.constant.value.str.val);
|
||||
function_name->u.constant.value.str.val = lcname;
|
||||
|
||||
|
||||
zend_stack_push(&CG(function_call_stack), (void *) &function, sizeof(zend_function *));
|
||||
if (CG(context).nested_calls + 1 > CG(active_op_array)->nested_calls) {
|
||||
CG(active_op_array)->nested_calls = CG(context).nested_calls + 1;
|
||||
@@ -1992,7 +1984,7 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) /* {{{ */
|
||||
name = CONSTANT(last_op->op2.constant);
|
||||
if (Z_TYPE(name) != IS_STRING) {
|
||||
zend_error(E_COMPILE_ERROR, "Method name must be a string");
|
||||
}
|
||||
}
|
||||
if (!IS_INTERNED(Z_STRVAL(name))) {
|
||||
Z_STRVAL(name) = estrndup(Z_STRVAL(name), Z_STRLEN(name));
|
||||
}
|
||||
@@ -2127,53 +2119,6 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
char *lcname;
|
||||
int lctype;
|
||||
znode constant_name;
|
||||
|
||||
lcname = zend_str_tolower_dup(Z_STRVAL(class_name->u.constant), class_name->u.constant.value.str.len);
|
||||
lctype = zend_get_class_fetch_type(lcname, strlen(lcname));
|
||||
switch (lctype) {
|
||||
case ZEND_FETCH_CLASS_SELF:
|
||||
if (!CG(active_class_entry)) {
|
||||
zend_error(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active");
|
||||
}
|
||||
zval_dtor(&class_name->u.constant);
|
||||
class_name->op_type = IS_CONST;
|
||||
ZVAL_STRINGL(&class_name->u.constant, CG(active_class_entry)->name, CG(active_class_entry)->name_length, 1);
|
||||
*result = *class_name;
|
||||
break;
|
||||
case ZEND_FETCH_CLASS_STATIC:
|
||||
case ZEND_FETCH_CLASS_PARENT:
|
||||
if (is_static) {
|
||||
zend_error(E_COMPILE_ERROR,
|
||||
"%s::class cannot be used for compile-time class name resolution",
|
||||
lctype == ZEND_FETCH_CLASS_STATIC ? "static" : "parent"
|
||||
);
|
||||
}
|
||||
if (!CG(active_class_entry)) {
|
||||
zend_error(E_COMPILE_ERROR,
|
||||
"Cannot access %s::class when no class scope is active",
|
||||
lctype == ZEND_FETCH_CLASS_STATIC ? "static" : "parent"
|
||||
);
|
||||
}
|
||||
constant_name.op_type = IS_CONST;
|
||||
ZVAL_STRINGL(&constant_name.u.constant, "class", sizeof("class")-1, 1);
|
||||
zend_do_fetch_constant(result, class_name, &constant_name, ZEND_RT, 1 TSRMLS_CC);
|
||||
break;
|
||||
case ZEND_FETCH_CLASS_DEFAULT:
|
||||
zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC);
|
||||
*result = *class_name;
|
||||
break;
|
||||
}
|
||||
|
||||
efree(lcname);
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
char *compound;
|
||||
@@ -2196,7 +2141,7 @@ void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_n
|
||||
if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant))) {
|
||||
zend_error(E_COMPILE_ERROR, "'\\%s' is an invalid class name", Z_STRVAL(class_name->u.constant));
|
||||
}
|
||||
} else {
|
||||
} else {
|
||||
if (CG(current_import)) {
|
||||
len = compound - Z_STRVAL(class_name->u.constant);
|
||||
lcname = zend_str_tolower_dup(Z_STRVAL(class_name->u.constant), len);
|
||||
@@ -2561,8 +2506,8 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC) /* {{
|
||||
zend_error(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (function_ptr) {
|
||||
if (ARG_MAY_BE_SENT_BY_REF(function_ptr, (zend_uint) offset)) {
|
||||
if (param->op_type & (IS_VAR|IS_CV) && original_op != ZEND_SEND_VAL) {
|
||||
@@ -2733,7 +2678,7 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC) /* {{{ */
|
||||
SET_UNUSED(opline->op1);
|
||||
SET_UNUSED(opline->op2);
|
||||
}
|
||||
|
||||
|
||||
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
|
||||
|
||||
opline->opcode = returns_reference ? ZEND_RETURN_BY_REF : ZEND_RETURN;
|
||||
@@ -2948,10 +2893,10 @@ void zend_do_end_finally(znode *try_token, znode* catch_token, znode *finally_to
|
||||
{
|
||||
if (catch_token->op_type == IS_UNUSED && finally_token->op_type == IS_UNUSED) {
|
||||
zend_error(E_COMPILE_ERROR, "Cannot use try without catch or finally");
|
||||
}
|
||||
}
|
||||
if (finally_token->op_type != IS_UNUSED) {
|
||||
zend_op *opline;
|
||||
|
||||
|
||||
CG(active_op_array)->try_catch_array[try_token->u.op.opline_num].finally_op = finally_token->u.op.opline_num + 1;
|
||||
CG(active_op_array)->try_catch_array[try_token->u.op.opline_num].finally_end = get_next_op_number(CG(active_op_array));
|
||||
CG(active_op_array)->has_finally_block = 1;
|
||||
@@ -2960,11 +2905,11 @@ void zend_do_end_finally(znode *try_token, znode* catch_token, znode *finally_to
|
||||
opline->opcode = ZEND_FAST_RET;
|
||||
SET_UNUSED(opline->op1);
|
||||
SET_UNUSED(opline->op2);
|
||||
|
||||
|
||||
CG(active_op_array)->opcodes[finally_token->u.op.opline_num].op1.opline_num = get_next_op_number(CG(active_op_array));
|
||||
|
||||
CG(context).in_finally--;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -3071,7 +3016,7 @@ static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */
|
||||
lc_class_name = zend_str_tolower_dup(ce->name, ce->name_length);
|
||||
if (!zend_hash_exists(&ce->function_table, lc_class_name, ce->name_length+1)) {
|
||||
lc_parent_class_name = zend_str_tolower_dup(ce->parent->name, ce->parent->name_length);
|
||||
if (!zend_hash_exists(&ce->function_table, lc_parent_class_name, ce->parent->name_length+1) &&
|
||||
if (!zend_hash_exists(&ce->function_table, lc_parent_class_name, ce->parent->name_length+1) &&
|
||||
zend_hash_find(&ce->parent->function_table, lc_parent_class_name, ce->parent->name_length+1, (void **)&function)==SUCCESS) {
|
||||
if (function->common.fn_flags & ZEND_ACC_CTOR) {
|
||||
/* inherit parent's constructor */
|
||||
@@ -3210,8 +3155,8 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fe->common.arg_info[i].type_hint != proto->common.arg_info[i].type_hint) {
|
||||
/* Incompatible type hint */
|
||||
return 0;
|
||||
@@ -3240,7 +3185,7 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
|
||||
buf = erealloc(buf, length); \
|
||||
}
|
||||
|
||||
static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{{ */
|
||||
static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
char *offset, *buf;
|
||||
zend_uint length = 1024;
|
||||
@@ -3257,7 +3202,7 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{
|
||||
*(offset++) = ':';
|
||||
*(offset++) = ':';
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
size_t name_len = strlen(fptr->common.function_name);
|
||||
REALLOC_BUF_IF_EXCEED(buf, offset, length, name_len);
|
||||
@@ -3298,7 +3243,7 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{
|
||||
offset += type_name_len;
|
||||
*(offset++) = ' ';
|
||||
}
|
||||
|
||||
|
||||
if (arg_info->pass_by_reference) {
|
||||
*(offset++) = '&';
|
||||
}
|
||||
@@ -3400,7 +3345,7 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{
|
||||
*offset = '\0';
|
||||
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void do_inheritance_check_on_method(zend_function *child, zend_function *parent TSRMLS_DC) /* {{{ */
|
||||
@@ -3412,7 +3357,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
|
||||
&& parent->common.fn_flags & ZEND_ACC_ABSTRACT
|
||||
&& parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope)
|
||||
&& child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT)) {
|
||||
zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)",
|
||||
zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)",
|
||||
parent->common.scope->name,
|
||||
child->common.function_name,
|
||||
child->common.prototype ? child->common.prototype->common.scope->name : child->common.scope->name);
|
||||
@@ -3452,7 +3397,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
|
||||
}
|
||||
|
||||
if (parent_flags & ZEND_ACC_PRIVATE) {
|
||||
child->common.prototype = NULL;
|
||||
child->common.prototype = NULL;
|
||||
} else if (parent_flags & ZEND_ACC_ABSTRACT) {
|
||||
child->common.fn_flags |= ZEND_ACC_IMPLEMENTED_ABSTRACT;
|
||||
child->common.prototype = parent;
|
||||
@@ -3463,12 +3408,12 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
|
||||
|
||||
if (child->common.prototype && (child->common.prototype->common.fn_flags & ZEND_ACC_ABSTRACT)) {
|
||||
if (!zend_do_perform_implementation_check(child, child->common.prototype TSRMLS_CC)) {
|
||||
zend_error(E_COMPILE_ERROR, "Declaration of %s::%s() must be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_get_function_declaration(child->common.prototype? child->common.prototype : parent TSRMLS_CC));
|
||||
zend_error(E_COMPILE_ERROR, "Declaration of %s::%s() must be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_get_function_declaration(child->common.prototype? child->common.prototype : parent TSRMLS_CC));
|
||||
}
|
||||
} else if (EG(error_reporting) & E_STRICT || EG(user_error_handler)) { /* Check E_STRICT (or custom error handler) before the check so that we save some time */
|
||||
if (!zend_do_perform_implementation_check(child, parent TSRMLS_CC)) {
|
||||
char *method_prototype = zend_get_function_declaration(child->common.prototype? child->common.prototype : parent TSRMLS_CC);
|
||||
zend_error(E_STRICT, "Declaration of %s::%s() should be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, method_prototype);
|
||||
zend_error(E_STRICT, "Declaration of %s::%s() should be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, method_prototype);
|
||||
efree(method_prototype);
|
||||
}
|
||||
}
|
||||
@@ -3487,9 +3432,9 @@ static zend_bool do_inherit_method_check(HashTable *child_function_table, zend_f
|
||||
}
|
||||
return 1; /* method doesn't exist in child, copy from parent */
|
||||
}
|
||||
|
||||
|
||||
do_inheritance_check_on_method(child, parent TSRMLS_CC);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -3520,7 +3465,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro
|
||||
zend_error(E_COMPILE_ERROR, "Cannot redeclare %s%s::$%s as %s%s::$%s",
|
||||
(parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", parent_ce->name, hash_key->arKey,
|
||||
(child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ce->name, hash_key->arKey);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if(parent_info->flags & ZEND_ACC_CHANGED) {
|
||||
@@ -3786,10 +3731,10 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry
|
||||
}
|
||||
}
|
||||
ce->interfaces[ce->num_interfaces++] = iface;
|
||||
|
||||
|
||||
zend_hash_merge_ex(&ce->constants_table, &iface->constants_table, (copy_ctor_func_t) zval_add_ref, sizeof(zval *), (merge_checker_func_t) do_inherit_constant_check, iface);
|
||||
zend_hash_merge_ex(&ce->function_table, &iface->function_table, (copy_ctor_func_t) do_inherit_method, sizeof(zend_function), (merge_checker_func_t) do_inherit_method_check, ce);
|
||||
|
||||
|
||||
do_implement_interface(ce, iface TSRMLS_CC);
|
||||
zend_do_inherit_interfaces(ce, iface TSRMLS_CC);
|
||||
}
|
||||
@@ -3829,10 +3774,10 @@ static zend_bool zend_traits_method_compatibility_check(zend_function *fn, zend_
|
||||
{
|
||||
zend_uint fn_flags = fn->common.scope->ce_flags;
|
||||
zend_uint other_flags = other_fn->common.scope->ce_flags;
|
||||
|
||||
|
||||
return zend_do_perform_implementation_check(fn, other_fn TSRMLS_CC)
|
||||
&& ((other_fn->common.scope->ce_flags & ZEND_ACC_INTERFACE) || zend_do_perform_implementation_check(other_fn, fn TSRMLS_CC))
|
||||
&& ((fn_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC)) ==
|
||||
&& zend_do_perform_implementation_check(other_fn, fn TSRMLS_CC)
|
||||
&& ((fn_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC)) ==
|
||||
(other_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC))); /* equal final and static qualifier */
|
||||
}
|
||||
/* }}} */
|
||||
@@ -3845,7 +3790,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, const char* mname, uint
|
||||
if (ce->constructor) {
|
||||
zend_error(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name);
|
||||
}
|
||||
ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR;
|
||||
ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR;
|
||||
} else if (!strncmp(mname, ZEND_DESTRUCTOR_FUNC_NAME, mname_len)) {
|
||||
ce->destructor = fe; fe->common.fn_flags |= ZEND_ACC_DTOR;
|
||||
} else if (!strncmp(mname, ZEND_GET_FUNC_NAME, mname_len)) {
|
||||
@@ -3982,8 +3927,8 @@ static int zend_traits_copy_functions(zend_function *fn TSRMLS_DC, int num_args,
|
||||
ce = va_arg(args, zend_class_entry*);
|
||||
overriden = va_arg(args, HashTable**);
|
||||
exclude_table = va_arg(args, HashTable*);
|
||||
|
||||
fnname_len = hash_key->nKeyLength - 1;
|
||||
|
||||
fnname_len = strlen(fn->common.function_name);
|
||||
|
||||
/* apply aliases which are qualified with a class name, there should not be any ambiguity */
|
||||
if (ce->trait_aliases) {
|
||||
@@ -3994,11 +3939,11 @@ static int zend_traits_copy_functions(zend_function *fn TSRMLS_DC, int num_args,
|
||||
if (alias->alias != NULL
|
||||
&& (!alias->trait_method->ce || fn->common.scope == alias->trait_method->ce)
|
||||
&& alias->trait_method->mname_len == fnname_len
|
||||
&& (zend_binary_strcasecmp(alias->trait_method->method_name, alias->trait_method->mname_len, hash_key->arKey, fnname_len) == 0)) {
|
||||
&& (zend_binary_strcasecmp(alias->trait_method->method_name, alias->trait_method->mname_len, fn->common.function_name, fnname_len) == 0)) {
|
||||
fn_copy = *fn;
|
||||
|
||||
|
||||
/* if it is 0, no modifieres has been changed */
|
||||
if (alias->modifiers) {
|
||||
if (alias->modifiers) {
|
||||
fn_copy.common.fn_flags = alias->modifiers | (fn->common.fn_flags ^ (fn->common.fn_flags & ZEND_ACC_PPP_MASK));
|
||||
}
|
||||
|
||||
@@ -4016,7 +3961,7 @@ static int zend_traits_copy_functions(zend_function *fn TSRMLS_DC, int num_args,
|
||||
}
|
||||
}
|
||||
|
||||
lcname = hash_key->arKey;
|
||||
lcname = zend_str_tolower_dup(fn->common.function_name, fnname_len);
|
||||
|
||||
if (exclude_table == NULL || zend_hash_find(exclude_table, lcname, fnname_len, &dummy) == FAILURE) {
|
||||
/* is not in hashtable, thus, function is not to be excluded */
|
||||
@@ -4031,7 +3976,7 @@ static int zend_traits_copy_functions(zend_function *fn TSRMLS_DC, int num_args,
|
||||
if (alias->alias == NULL && alias->modifiers != 0
|
||||
&& (!alias->trait_method->ce || fn->common.scope == alias->trait_method->ce)
|
||||
&& (alias->trait_method->mname_len == fnname_len)
|
||||
&& (zend_binary_strcasecmp(alias->trait_method->method_name, alias->trait_method->mname_len, lcname, fnname_len) == 0)) {
|
||||
&& (zend_binary_strcasecmp(alias->trait_method->method_name, alias->trait_method->mname_len, fn->common.function_name, fnname_len) == 0)) {
|
||||
|
||||
fn_copy.common.fn_flags = alias->modifiers | (fn->common.fn_flags ^ (fn->common.fn_flags & ZEND_ACC_PPP_MASK));
|
||||
|
||||
@@ -4048,6 +3993,8 @@ static int zend_traits_copy_functions(zend_function *fn TSRMLS_DC, int num_args,
|
||||
zend_add_trait_method(ce, fn->common.function_name, lcname, fnname_len+1, &fn_copy, overriden TSRMLS_CC);
|
||||
}
|
||||
|
||||
efree(lcname);
|
||||
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -4056,16 +4003,12 @@ static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait
|
||||
{
|
||||
zend_uint i;
|
||||
|
||||
if ((trait->ce_flags & ZEND_ACC_TRAIT) != ZEND_ACC_TRAIT) {
|
||||
zend_error(E_COMPILE_ERROR, "Class %s is not a trait, Only traits may be used in 'as' and 'insteadof' statements", trait->name);
|
||||
}
|
||||
|
||||
for (i = 0; i < ce->num_traits; i++) {
|
||||
if (ce->traits[i] == trait) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
zend_error(E_COMPILE_ERROR, "Required Trait %s wasn't added to %s", trait->name, ce->name);
|
||||
zend_error(E_COMPILE_ERROR, "Trait %s is not used", trait->name);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -4103,7 +4046,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
|
||||
cur_method_ref->ce->name,
|
||||
cur_method_ref->method_name);
|
||||
}
|
||||
|
||||
|
||||
/** With the other traits, we are more permissive.
|
||||
We do not give errors for those. This allows to be more
|
||||
defensive in such definitions.
|
||||
@@ -4117,20 +4060,20 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
|
||||
|
||||
if (!(cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
|
||||
zend_error(E_COMPILE_ERROR, "Could not find trait %s", class_name);
|
||||
}
|
||||
}
|
||||
zend_check_trait_usage(ce, cur_precedence->exclude_from_classes[j] TSRMLS_CC);
|
||||
|
||||
/* make sure that the trait method is not from a class mentioned in
|
||||
exclude_from_classes, for consistency */
|
||||
if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[i]) {
|
||||
zend_error(E_COMPILE_ERROR,
|
||||
"Inconsistent insteadof definition. "
|
||||
"Inconsistent insteadof definition. "
|
||||
"The method %s is to be used from %s, but %s is also on the exclude list",
|
||||
cur_method_ref->method_name,
|
||||
cur_precedence->trait_method->ce->name,
|
||||
cur_precedence->trait_method->ce->name);
|
||||
}
|
||||
|
||||
|
||||
efree(class_name);
|
||||
j++;
|
||||
}
|
||||
@@ -4170,7 +4113,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
|
||||
static void zend_traits_compile_exclude_table(HashTable* exclude_table, zend_trait_precedence **precedences, zend_class_entry *trait) /* {{{ */
|
||||
{
|
||||
size_t i = 0, j;
|
||||
|
||||
|
||||
if (!precedences) {
|
||||
return;
|
||||
}
|
||||
@@ -4181,7 +4124,7 @@ static void zend_traits_compile_exclude_table(HashTable* exclude_table, zend_tra
|
||||
if (precedences[i]->exclude_from_classes[j] == trait) {
|
||||
zend_uint lcname_len = precedences[i]->trait_method->mname_len;
|
||||
char *lcname = zend_str_tolower_dup(precedences[i]->trait_method->method_name, lcname_len);
|
||||
|
||||
|
||||
if (zend_hash_add(exclude_table, lcname, lcname_len, NULL, 0, NULL) == FAILURE) {
|
||||
efree(lcname);
|
||||
zend_error(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", precedences[i]->trait_method->method_name, trait->name);
|
||||
@@ -4218,7 +4161,7 @@ static void zend_do_traits_method_binding(zend_class_entry *ce TSRMLS_DC) /* {{{
|
||||
zend_hash_apply_with_arguments(&ce->traits[i]->function_table TSRMLS_CC, (apply_func_args_t)zend_traits_copy_functions, 3, ce, &overriden, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
zend_hash_apply_with_argument(&ce->function_table, (apply_func_arg_t)zend_fixup_trait_method, ce TSRMLS_CC);
|
||||
|
||||
if (overriden) {
|
||||
@@ -4256,7 +4199,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* {
|
||||
const char* class_name_unused;
|
||||
zend_bool not_compatible;
|
||||
zval* prop_value;
|
||||
char* doc_comment;
|
||||
char* doc_comment;
|
||||
zend_uint flags;
|
||||
|
||||
/* In the following steps the properties are inserted into the property table
|
||||
@@ -4278,17 +4221,18 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* {
|
||||
prop_name_length = property_info->name_length;
|
||||
} else {
|
||||
/* for private and protected we need to unmangle the names */
|
||||
zend_unmangle_property_name_ex(property_info->name, property_info->name_length,
|
||||
&class_name_unused, &prop_name, &prop_name_length);
|
||||
zend_unmangle_property_name(property_info->name, property_info->name_length,
|
||||
&class_name_unused, &prop_name);
|
||||
prop_name_length = strlen(prop_name);
|
||||
prop_hash = zend_get_hash_value(prop_name, prop_name_length + 1);
|
||||
}
|
||||
|
||||
/* next: check for conflicts with current class */
|
||||
if (zend_hash_quick_find(&ce->properties_info, prop_name, prop_name_length+1, prop_hash, (void **) &coliding_prop) == SUCCESS) {
|
||||
if (coliding_prop->flags & ZEND_ACC_SHADOW) {
|
||||
if (coliding_prop->flags & ZEND_ACC_SHADOW) {
|
||||
zend_hash_quick_del(&ce->properties_info, prop_name, prop_name_length+1, prop_hash);
|
||||
flags |= ZEND_ACC_CHANGED;
|
||||
} else {
|
||||
} else {
|
||||
if ((coliding_prop->flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))
|
||||
== (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) {
|
||||
/* flags are identical, now the value needs to be checked */
|
||||
@@ -4309,14 +4253,14 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* {
|
||||
}
|
||||
|
||||
if (not_compatible) {
|
||||
zend_error(E_COMPILE_ERROR,
|
||||
zend_error(E_COMPILE_ERROR,
|
||||
"%s and %s define the same property ($%s) in the composition of %s. However, the definition differs and is considered incompatible. Class was composed",
|
||||
find_first_definition(ce, i, prop_name, prop_name_length, prop_hash, coliding_prop->ce)->name,
|
||||
property_info->ce->name,
|
||||
prop_name,
|
||||
ce->name);
|
||||
} else {
|
||||
zend_error(E_STRICT,
|
||||
zend_error(E_STRICT,
|
||||
"%s and %s define the same property ($%s) in the composition of %s. This might be incompatible, to improve maintainability consider using accessor methods in traits instead. Class was composed",
|
||||
find_first_definition(ce, i, prop_name, prop_name_length, prop_hash, coliding_prop->ce)->name,
|
||||
property_info->ce->name,
|
||||
@@ -4336,8 +4280,8 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* {
|
||||
Z_ADDREF_P(prop_value);
|
||||
|
||||
doc_comment = property_info->doc_comment ? estrndup(property_info->doc_comment, property_info->doc_comment_len) : NULL;
|
||||
zend_declare_property_ex(ce, prop_name, prop_name_length,
|
||||
prop_value, flags,
|
||||
zend_declare_property_ex(ce, prop_name, prop_name_length,
|
||||
prop_value, flags,
|
||||
doc_comment, property_info->doc_comment_len TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
@@ -4349,7 +4293,7 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce
|
||||
int i = 0;
|
||||
zend_trait_alias* cur_alias;
|
||||
char* lc_method_name;
|
||||
|
||||
|
||||
if (ce->trait_aliases) {
|
||||
while (ce->trait_aliases[i]) {
|
||||
cur_alias = ce->trait_aliases[i];
|
||||
@@ -4370,7 +4314,7 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce
|
||||
we check against it and abort.
|
||||
2) it is just a plain old inconsitency/typo/bug
|
||||
as in the case where alias is set. */
|
||||
|
||||
|
||||
lc_method_name = zend_str_tolower_dup(cur_alias->trait_method->method_name,
|
||||
cur_alias->trait_method->mname_len);
|
||||
if (zend_hash_exists(&ce->function_table,
|
||||
@@ -4407,7 +4351,7 @@ ZEND_API void zend_do_bind_traits(zend_class_entry *ce TSRMLS_DC) /* {{{ */
|
||||
|
||||
/* first care about all methods to be flattened into the class */
|
||||
zend_do_traits_method_binding(ce TSRMLS_CC);
|
||||
|
||||
|
||||
/* Aliases which have not been applied indicate typos/bugs. */
|
||||
zend_do_check_for_inconsistent_traits_aliasing(ce TSRMLS_CC);
|
||||
|
||||
@@ -4416,7 +4360,7 @@ ZEND_API void zend_do_bind_traits(zend_class_entry *ce TSRMLS_DC) /* {{{ */
|
||||
|
||||
/* verify that all abstract methods from traits have been implemented */
|
||||
zend_verify_abstract_class(ce TSRMLS_CC);
|
||||
|
||||
|
||||
/* now everything should be fine and an added ZEND_ACC_IMPLICIT_ABSTRACT_CLASS should be removed */
|
||||
if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) {
|
||||
ce->ce_flags -= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS;
|
||||
@@ -4466,7 +4410,7 @@ void zend_prepare_reference(znode *result, znode *class_name, znode *method_name
|
||||
zend_trait_method_reference *method_ref = emalloc(sizeof(zend_trait_method_reference));
|
||||
method_ref->ce = NULL;
|
||||
|
||||
/* REM: There should not be a need for copying,
|
||||
/* REM: There should not be a need for copying,
|
||||
zend_do_begin_class_declaration is also just using that string */
|
||||
if (class_name) {
|
||||
zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC);
|
||||
@@ -5040,7 +4984,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name
|
||||
build_runtime_defined_function_key(&key, lcname, new_class_entry->name_length TSRMLS_CC);
|
||||
opline->op1.constant = zend_add_literal(CG(active_op_array), &key TSRMLS_CC);
|
||||
Z_HASH_P(&CONSTANT(opline->op1.constant)) = zend_hash_func(Z_STRVAL(CONSTANT(opline->op1.constant)), Z_STRLEN(CONSTANT(opline->op1.constant)));
|
||||
|
||||
|
||||
opline->op2_type = IS_CONST;
|
||||
|
||||
if (doing_inheritance) {
|
||||
@@ -5057,7 +5001,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name
|
||||
|
||||
LITERAL_STRINGL(opline->op2, lcname, new_class_entry->name_length, 0);
|
||||
CALCULATE_LITERAL_HASH(opline->op2.constant);
|
||||
|
||||
|
||||
zend_hash_quick_update(CG(class_table), Z_STRVAL(key), Z_STRLEN(key), Z_HASH_P(&CONSTANT(opline->op1.constant)), &new_class_entry, sizeof(zend_class_entry *), NULL);
|
||||
CG(active_class_entry) = new_class_entry;
|
||||
|
||||
@@ -5108,7 +5052,7 @@ void zend_do_end_class_declaration(const znode *class_token, const znode *parent
|
||||
}
|
||||
|
||||
ce->info.user.line_end = zend_get_compiled_lineno(TSRMLS_C);
|
||||
|
||||
|
||||
/* Check for traits and proceed like with interfaces.
|
||||
* The only difference will be a combined handling of them in the end.
|
||||
* Thus, we need another opcode here. */
|
||||
@@ -5133,7 +5077,7 @@ void zend_do_end_class_declaration(const znode *class_token, const znode *parent
|
||||
}
|
||||
}
|
||||
/* Inherit interfaces; reset number to zero, we need it for above check and
|
||||
* will restore it during actual implementation.
|
||||
* will restore it during actual implementation.
|
||||
* The ZEND_ACC_IMPLEMENT_INTERFACES flag disables double call to
|
||||
* zend_verify_abstract_class() */
|
||||
if (ce->num_interfaces > 0) {
|
||||
@@ -5234,7 +5178,7 @@ static int zend_strnlen(const char* s, int maxlen) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API int zend_unmangle_property_name_ex(const char *mangled_property, int len, const char **class_name, const char **prop_name, int *prop_len) /* {{{ */
|
||||
ZEND_API int zend_unmangle_property_name(const char *mangled_property, int len, const char **class_name, const char **prop_name) /* {{{ */
|
||||
{
|
||||
int class_name_len;
|
||||
|
||||
@@ -5242,34 +5186,22 @@ ZEND_API int zend_unmangle_property_name_ex(const char *mangled_property, int le
|
||||
|
||||
if (mangled_property[0]!=0) {
|
||||
*prop_name = mangled_property;
|
||||
if (prop_len) {
|
||||
*prop_len = len;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
if (len < 3 || mangled_property[1]==0) {
|
||||
zend_error(E_NOTICE, "Illegal member variable name");
|
||||
*prop_name = mangled_property;
|
||||
if (prop_len) {
|
||||
*prop_len = len;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
class_name_len = zend_strnlen(mangled_property + 1, --len - 1) + 1;
|
||||
class_name_len = zend_strnlen(mangled_property+1, --len - 1) + 1;
|
||||
if (class_name_len >= len || mangled_property[class_name_len]!=0) {
|
||||
zend_error(E_NOTICE, "Corrupt member variable name");
|
||||
*prop_name = mangled_property;
|
||||
if (prop_len) {
|
||||
*prop_len = len + 1;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
*class_name = mangled_property + 1;
|
||||
*prop_name = (*class_name) + class_name_len;
|
||||
if (prop_len) {
|
||||
*prop_len = len - class_name_len;
|
||||
}
|
||||
*class_name = mangled_property+1;
|
||||
*prop_name = (*class_name)+class_name_len;
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -5335,7 +5267,7 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D
|
||||
|
||||
ALLOC_ZVAL(property);
|
||||
*property = value->u.constant;
|
||||
|
||||
|
||||
cname = zend_new_interned_string(var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, 0 TSRMLS_CC);
|
||||
|
||||
if (IS_INTERNED(cname)) {
|
||||
@@ -5348,7 +5280,7 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D
|
||||
zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, var_name->u.constant.value.str.val);
|
||||
}
|
||||
FREE_PNODE(var_name);
|
||||
|
||||
|
||||
if (CG(doc_comment)) {
|
||||
efree(CG(doc_comment));
|
||||
CG(doc_comment) = NULL;
|
||||
@@ -5437,17 +5369,17 @@ void zend_do_halt_compiler_register(TSRMLS_D) /* {{{ */
|
||||
char *name, *cfilename;
|
||||
char haltoff[] = "__COMPILER_HALT_OFFSET__";
|
||||
int len, clen;
|
||||
|
||||
|
||||
if (CG(has_bracketed_namespaces) && CG(in_namespace)) {
|
||||
zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope");
|
||||
}
|
||||
|
||||
|
||||
cfilename = zend_get_compiled_filename(TSRMLS_C);
|
||||
clen = strlen(cfilename);
|
||||
zend_mangle_property_name(&name, &len, haltoff, sizeof(haltoff) - 1, cfilename, clen, 0);
|
||||
zend_register_long_constant(name, len+1, zend_get_scanned_file_offset(TSRMLS_C), CONST_CS, 0 TSRMLS_CC);
|
||||
pefree(name, 0);
|
||||
|
||||
|
||||
if (CG(in_namespace)) {
|
||||
zend_do_end_namespace(TSRMLS_C);
|
||||
}
|
||||
@@ -5524,7 +5456,7 @@ static zend_constant* zend_get_ct_const(const zval *const_name, int all_internal
|
||||
}
|
||||
} else if (zend_hash_find(EG(zend_constants), Z_STRVAL_P(const_name), Z_STRLEN_P(const_name)+1, (void **) &c) == FAILURE) {
|
||||
char *lookup_name = zend_str_tolower_dup(Z_STRVAL_P(const_name), Z_STRLEN_P(const_name));
|
||||
|
||||
|
||||
if (zend_hash_find(EG(zend_constants), lookup_name, Z_STRLEN_P(const_name)+1, (void **) &c)==SUCCESS) {
|
||||
if ((c->flags & CONST_CT_SUBST) && !(c->flags & CONST_CS)) {
|
||||
efree(lookup_name);
|
||||
@@ -5577,7 +5509,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con
|
||||
case ZEND_CT:
|
||||
/* this is a class constant */
|
||||
type = zend_get_class_fetch_type(Z_STRVAL(constant_container->u.constant), Z_STRLEN(constant_container->u.constant));
|
||||
|
||||
|
||||
if (ZEND_FETCH_CLASS_STATIC == type) {
|
||||
zend_error(E_ERROR, "\"static::\" is not allowed in compile-time constants");
|
||||
} else if (ZEND_FETCH_CLASS_DEFAULT == type) {
|
||||
@@ -5641,7 +5573,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con
|
||||
compound = memchr(Z_STRVAL(constant_name->u.constant), '\\', Z_STRLEN(constant_name->u.constant));
|
||||
|
||||
zend_resolve_non_class_name(constant_name, check_namespace TSRMLS_CC);
|
||||
|
||||
|
||||
if(zend_constant_ct_subst(result, &constant_name->u.constant, 1 TSRMLS_CC)) {
|
||||
break;
|
||||
}
|
||||
@@ -5657,7 +5589,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con
|
||||
/* the name is unambiguous */
|
||||
opline->extended_value = 0;
|
||||
opline->op2.constant = zend_add_const_name_literal(CG(active_op_array), &constant_name->u.constant, 0 TSRMLS_CC);
|
||||
} else {
|
||||
} else {
|
||||
opline->extended_value = IS_CONSTANT_UNQUALIFIED;
|
||||
if (CG(current_namespace)) {
|
||||
opline->extended_value |= IS_CONSTANT_IN_NAMESPACE;
|
||||
@@ -5731,7 +5663,7 @@ void zend_do_init_array(znode *result, const znode *expr, const znode *offset, z
|
||||
ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(CONSTANT(opline->op2.constant)), Z_STRLEN(CONSTANT(opline->op2.constant))+1, index, numeric = 1);
|
||||
if (numeric) {
|
||||
zval_dtor(&CONSTANT(opline->op2.constant));
|
||||
ZVAL_LONG(&CONSTANT(opline->op2.constant), index);
|
||||
ZVAL_LONG(&CONSTANT(opline->op2.constant), index);
|
||||
} else {
|
||||
CALCULATE_LITERAL_HASH(opline->op2.constant);
|
||||
}
|
||||
@@ -5763,7 +5695,7 @@ void zend_do_add_array_element(znode *result, const znode *expr, const znode *of
|
||||
ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(CONSTANT(opline->op2.constant)), Z_STRLEN(CONSTANT(opline->op2.constant))+1, index, numeric = 1);
|
||||
if (numeric) {
|
||||
zval_dtor(&CONSTANT(opline->op2.constant));
|
||||
ZVAL_LONG(&CONSTANT(opline->op2.constant), index);
|
||||
ZVAL_LONG(&CONSTANT(opline->op2.constant), index);
|
||||
} else {
|
||||
CALCULATE_LITERAL_HASH(opline->op2.constant);
|
||||
}
|
||||
@@ -6023,7 +5955,7 @@ void zend_do_fetch_lexical_variable(znode *varname, zend_bool is_ref TSRMLS_DC)
|
||||
Z_TYPE(value.u.constant) |= is_ref ? IS_LEXICAL_REF : IS_LEXICAL_VAR;
|
||||
Z_SET_REFCOUNT_P(&value.u.constant, 1);
|
||||
Z_UNSET_ISREF_P(&value.u.constant);
|
||||
|
||||
|
||||
zend_do_fetch_static_variable(varname, &value, is_ref ? ZEND_FETCH_STATIC : ZEND_FETCH_LEXICAL TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
@@ -6539,7 +6471,7 @@ void zend_do_jmp_set(const znode *value, znode *jmp_token, znode *colon_token TS
|
||||
opline->result.var = get_temporary_variable(CG(active_op_array));
|
||||
SET_NODE(opline->op1, value);
|
||||
SET_UNUSED(opline->op2);
|
||||
|
||||
|
||||
GET_NODE(colon_token, opline->result);
|
||||
|
||||
jmp_token->u.op.opline_num = op_number;
|
||||
@@ -6568,11 +6500,11 @@ void zend_do_jmp_set_else(znode *result, const znode *false_value, const znode *
|
||||
opline->extended_value = 0;
|
||||
SET_NODE(opline->op1, false_value);
|
||||
SET_UNUSED(opline->op2);
|
||||
|
||||
|
||||
GET_NODE(result, opline->result);
|
||||
|
||||
CG(active_op_array)->opcodes[jmp_token->u.op.opline_num].op2.opline_num = get_next_op_number(CG(active_op_array));
|
||||
|
||||
|
||||
DEC_BPC(CG(active_op_array));
|
||||
}
|
||||
/* }}} */
|
||||
@@ -6785,7 +6717,7 @@ again:
|
||||
CG(increment_lineno) = 1;
|
||||
}
|
||||
if (CG(has_bracketed_namespaces) && !CG(in_namespace)) {
|
||||
goto again;
|
||||
goto again;
|
||||
}
|
||||
retval = ';'; /* implicit ; */
|
||||
break;
|
||||
@@ -6875,13 +6807,13 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify
|
||||
int zend_get_class_fetch_type(const char *class_name, uint class_name_len) /* {{{ */
|
||||
{
|
||||
if ((class_name_len == sizeof("self")-1) &&
|
||||
!strncasecmp(class_name, "self", sizeof("self")-1)) {
|
||||
return ZEND_FETCH_CLASS_SELF;
|
||||
!memcmp(class_name, "self", sizeof("self")-1)) {
|
||||
return ZEND_FETCH_CLASS_SELF;
|
||||
} else if ((class_name_len == sizeof("parent")-1) &&
|
||||
!strncasecmp(class_name, "parent", sizeof("parent")-1)) {
|
||||
!memcmp(class_name, "parent", sizeof("parent")-1)) {
|
||||
return ZEND_FETCH_CLASS_PARENT;
|
||||
} else if ((class_name_len == sizeof("static")-1) &&
|
||||
!strncasecmp(class_name, "static", sizeof("static")-1)) {
|
||||
!memcmp(class_name, "static", sizeof("static")-1)) {
|
||||
return ZEND_FETCH_CLASS_STATIC;
|
||||
} else {
|
||||
return ZEND_FETCH_CLASS_DEFAULT;
|
||||
@@ -6994,7 +6926,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC
|
||||
efree(CG(current_import));
|
||||
CG(current_import) = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (CG(doc_comment)) {
|
||||
efree(CG(doc_comment));
|
||||
CG(doc_comment) = NULL;
|
||||
@@ -7166,7 +7098,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
|
||||
len_adjust += 2;
|
||||
if (2 == len) {
|
||||
/* Return "c:" on Win32 for dirname("c:").
|
||||
* It would be more consistent to return "c:."
|
||||
* It would be more consistent to return "c:."
|
||||
* but that would require making the string *longer*.
|
||||
*/
|
||||
return len;
|
||||
@@ -7174,7 +7106,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
|
||||
}
|
||||
#elif defined(NETWARE)
|
||||
/*
|
||||
* Find the first occurence of : from the left
|
||||
* Find the first occurence of : from the left
|
||||
* move the path pointer to the position just after :
|
||||
* increment the len_adjust to the length of path till colon character(inclusive)
|
||||
* If there is no character beyond : simple return len
|
||||
|
||||
+1
-6
@@ -638,8 +638,6 @@ void zend_verify_namespace(TSRMLS_D);
|
||||
void zend_do_use(znode *name, znode *new_name, int is_global TSRMLS_DC);
|
||||
void zend_do_end_compilation(TSRMLS_D);
|
||||
|
||||
void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static TSRMLS_DC);
|
||||
|
||||
void zend_do_label(znode *label TSRMLS_DC);
|
||||
void zend_do_goto(const znode *label TSRMLS_DC);
|
||||
void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 TSRMLS_DC);
|
||||
@@ -673,9 +671,7 @@ ZEND_API void destroy_zend_class(zend_class_entry **pce);
|
||||
void zend_class_add_ref(zend_class_entry **ce);
|
||||
|
||||
ZEND_API void zend_mangle_property_name(char **dest, int *dest_length, const char *src1, int src1_length, const char *src2, int src2_length, int internal);
|
||||
#define zend_unmangle_property_name(mangled_property, mangled_property_len, class_name, prop_name) \
|
||||
zend_unmangle_property_name_ex(mangled_property, mangled_property_len, class_name, prop_name, NULL)
|
||||
ZEND_API int zend_unmangle_property_name_ex(const char *mangled_property, int mangled_property_len, const char **class_name, const char **prop_name, int *prop_len);
|
||||
ZEND_API int zend_unmangle_property_name(const char *mangled_property, int mangled_property_len, const char **class_name, const char **prop_name);
|
||||
|
||||
#define ZEND_FUNCTION_DTOR (void (*)(void *)) zend_function_dtor
|
||||
#define ZEND_CLASS_DTOR (void (*)(void *)) destroy_zend_class
|
||||
@@ -856,7 +852,6 @@ END_EXTERN_C()
|
||||
#define ZEND_CALLSTATIC_FUNC_NAME "__callstatic"
|
||||
#define ZEND_TOSTRING_FUNC_NAME "__tostring"
|
||||
#define ZEND_AUTOLOAD_FUNC_NAME "__autoload"
|
||||
#define ZEND_INVOKE_FUNC_NAME "__invoke"
|
||||
|
||||
/* The following constants may be combined in CG(compiler_options)
|
||||
* to change the default compiler behavior */
|
||||
|
||||
+3
-3
@@ -1384,7 +1384,7 @@ static void zend_fetch_property_address(temp_variable *result, zval **container_
|
||||
}
|
||||
|
||||
if (Z_OBJ_HT_P(container)->get_property_ptr_ptr) {
|
||||
zval **ptr_ptr = Z_OBJ_HT_P(container)->get_property_ptr_ptr(container, prop_ptr, type, key TSRMLS_CC);
|
||||
zval **ptr_ptr = Z_OBJ_HT_P(container)->get_property_ptr_ptr(container, prop_ptr, key TSRMLS_CC);
|
||||
if (NULL == ptr_ptr) {
|
||||
zval *ptr;
|
||||
|
||||
@@ -1523,9 +1523,9 @@ void zend_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
/*
|
||||
* Stack Frame Layout (the whole stack frame is allocated at once)
|
||||
* ==================
|
||||
* ==================
|
||||
*
|
||||
* +========================================+
|
||||
* | zend_execute_data |<---+
|
||||
|
||||
+66
-75
@@ -27,8 +27,6 @@
|
||||
ZEND_API zend_class_entry *zend_ce_generator;
|
||||
static zend_object_handlers zend_generator_handlers;
|
||||
|
||||
static zend_object_value zend_generator_create(zend_class_entry *class_type TSRMLS_DC);
|
||||
|
||||
ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
if (generator->value) {
|
||||
@@ -45,6 +43,41 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
|
||||
zend_execute_data *execute_data = generator->execute_data;
|
||||
zend_op_array *op_array = execute_data->op_array;
|
||||
|
||||
if (!finished_execution) {
|
||||
if (op_array->has_finally_block) {
|
||||
/* -1 required because we want the last run opcode, not the
|
||||
* next to-be-run one. */
|
||||
zend_uint op_num = execute_data->opline - op_array->opcodes - 1;
|
||||
zend_uint finally_op_num = 0;
|
||||
|
||||
/* Find next finally block */
|
||||
int i;
|
||||
for (i = 0; i < op_array->last_try_catch; i++) {
|
||||
zend_try_catch_element *try_catch = &op_array->try_catch_array[i];
|
||||
|
||||
if (op_num < try_catch->try_op) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (op_num < try_catch->finally_op) {
|
||||
finally_op_num = try_catch->finally_op;
|
||||
}
|
||||
}
|
||||
|
||||
/* If a finally block was found we jump directly to it and
|
||||
* resume the generator. Furthermore we abort this close call
|
||||
* because the generator will already be closed somewhere in
|
||||
* the resume. */
|
||||
if (finally_op_num) {
|
||||
execute_data->opline = &op_array->opcodes[finally_op_num];
|
||||
execute_data->fast_ret = NULL;
|
||||
generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
|
||||
zend_generator_resume(generator TSRMLS_CC);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!execute_data->symbol_table) {
|
||||
zend_free_compiled_variables(execute_data);
|
||||
} else {
|
||||
@@ -94,16 +127,10 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
|
||||
|
||||
/* Clear any backed up stack arguments */
|
||||
if (generator->stack != EG(argument_stack)) {
|
||||
void **ptr = generator->stack->top - 1;
|
||||
void **end = zend_vm_stack_frame_base(execute_data);
|
||||
|
||||
/* If the top stack element is the argument count, skip it */
|
||||
if (execute_data->function_state.arguments) {
|
||||
ptr--;
|
||||
}
|
||||
|
||||
for (; ptr >= end; --ptr) {
|
||||
zval_ptr_dtor((zval**) ptr);
|
||||
void **stack_frame = zend_vm_stack_frame_base(execute_data);
|
||||
while (generator->stack->top != stack_frame) {
|
||||
zval_ptr_dtor((zval**)stack_frame);
|
||||
stack_frame++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,45 +175,6 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void zend_generator_dtor_storage(zend_generator *generator, zend_object_handle handle TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_execute_data *ex = generator->execute_data;
|
||||
zend_uint op_num, finally_op_num;
|
||||
int i;
|
||||
|
||||
if (!ex || !ex->op_array->has_finally_block) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* -1 required because we want the last run opcode, not the
|
||||
* next to-be-run one. */
|
||||
op_num = ex->opline - ex->op_array->opcodes - 1;
|
||||
|
||||
/* Find next finally block */
|
||||
finally_op_num = 0;
|
||||
for (i = 0; i < ex->op_array->last_try_catch; i++) {
|
||||
zend_try_catch_element *try_catch = &ex->op_array->try_catch_array[i];
|
||||
|
||||
if (op_num < try_catch->try_op) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (op_num < try_catch->finally_op) {
|
||||
finally_op_num = try_catch->finally_op;
|
||||
}
|
||||
}
|
||||
|
||||
/* If a finally block was found we jump directly to it and
|
||||
* resume the generator. */
|
||||
if (finally_op_num) {
|
||||
ex->opline = &ex->op_array->opcodes[finally_op_num];
|
||||
ex->fast_ret = NULL;
|
||||
generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
|
||||
zend_generator_resume(generator TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void zend_generator_free_storage(zend_generator *generator TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_generator_close(generator, 0 TSRMLS_CC);
|
||||
@@ -196,19 +184,10 @@ static void zend_generator_free_storage(zend_generator *generator TSRMLS_DC) /*
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static zend_object_value zend_generator_clone(zval *object TSRMLS_DC) /* {{{ */
|
||||
static void zend_generator_clone_storage(zend_generator *orig, zend_generator **clone_ptr TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_generator *orig = zend_object_store_get_object(object TSRMLS_CC);
|
||||
zend_object_value clone_val = zend_generator_create(Z_OBJCE_P(object) TSRMLS_CC);
|
||||
zend_generator *clone = zend_object_store_get_object_by_handle(clone_val.handle TSRMLS_CC);
|
||||
|
||||
zend_objects_clone_members(
|
||||
&clone->std, clone_val, &orig->std, Z_OBJ_HANDLE_P(object) TSRMLS_CC
|
||||
);
|
||||
|
||||
clone->execute_data = orig->execute_data;
|
||||
clone->largest_used_integer_key = orig->largest_used_integer_key;
|
||||
clone->flags = orig->flags;
|
||||
zend_generator *clone = emalloc(sizeof(zend_generator));
|
||||
memcpy(clone, orig, sizeof(zend_generator));
|
||||
|
||||
if (orig->execute_data) {
|
||||
/* Create a few shorter aliases to the old execution data */
|
||||
@@ -352,16 +331,14 @@ static zend_object_value zend_generator_clone(zval *object TSRMLS_DC) /* {{{ */
|
||||
|
||||
/* The value and key are known not to be references, so simply add refs */
|
||||
if (orig->value) {
|
||||
clone->value = orig->value;
|
||||
Z_ADDREF_P(orig->value);
|
||||
}
|
||||
|
||||
if (orig->key) {
|
||||
clone->key = orig->key;
|
||||
Z_ADDREF_P(orig->key);
|
||||
}
|
||||
|
||||
return clone_val;
|
||||
*clone_ptr = clone;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -378,10 +355,10 @@ static zend_object_value zend_generator_create(zend_class_entry *class_type TSRM
|
||||
|
||||
zend_object_std_init(&generator->std, class_type TSRMLS_CC);
|
||||
|
||||
object.handle = zend_objects_store_put(generator,
|
||||
(zend_objects_store_dtor_t) zend_generator_dtor_storage,
|
||||
object.handle = zend_objects_store_put(generator, NULL,
|
||||
(zend_objects_free_object_storage_t) zend_generator_free_storage,
|
||||
NULL TSRMLS_CC
|
||||
(zend_objects_store_clone_t) zend_generator_clone_storage
|
||||
TSRMLS_CC
|
||||
);
|
||||
object.handlers = &zend_generator_handlers;
|
||||
|
||||
@@ -755,17 +732,31 @@ static void zend_generator_iterator_get_data(zend_object_iterator *iterator, zva
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void zend_generator_iterator_get_key(zend_object_iterator *iterator, zval *key TSRMLS_DC) /* {{{ */
|
||||
static int zend_generator_iterator_get_key(zend_object_iterator *iterator, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_generator *generator = (zend_generator *) iterator->data;
|
||||
|
||||
zend_generator_ensure_initialized(generator TSRMLS_CC);
|
||||
|
||||
if (generator->key) {
|
||||
ZVAL_ZVAL(key, generator->key, 1, 0);
|
||||
} else {
|
||||
ZVAL_NULL(key);
|
||||
if (!generator->key) {
|
||||
return HASH_KEY_NON_EXISTANT;
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(generator->key) == IS_LONG) {
|
||||
*int_key = Z_LVAL_P(generator->key);
|
||||
return HASH_KEY_IS_LONG;
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(generator->key) == IS_STRING) {
|
||||
*str_key = estrndup(Z_STRVAL_P(generator->key), Z_STRLEN_P(generator->key));
|
||||
*str_key_len = Z_STRLEN_P(generator->key) + 1;
|
||||
return HASH_KEY_IS_STRING;
|
||||
}
|
||||
|
||||
/* Waiting for Etienne's patch to allow arbitrary zval keys. Until then
|
||||
* error out on non-int and non-string keys. */
|
||||
zend_error_noreturn(E_ERROR, "Currently only int and string keys can be yielded");
|
||||
return HASH_KEY_NON_EXISTANT; /* Nerver reached */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -867,7 +858,7 @@ void zend_register_generator_ce(TSRMLS_D) /* {{{ */
|
||||
|
||||
memcpy(&zend_generator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
||||
zend_generator_handlers.get_constructor = zend_generator_get_constructor;
|
||||
zend_generator_handlers.clone_obj = zend_generator_clone;
|
||||
zend_generator_handlers.clone_obj = zend_objects_store_clone_obj;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
@@ -1171,24 +1171,6 @@ ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index,
|
||||
return HASH_KEY_NON_EXISTANT;
|
||||
}
|
||||
|
||||
ZEND_API void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos) {
|
||||
Bucket *p;
|
||||
|
||||
IS_CONSISTENT(ht);
|
||||
|
||||
p = pos ? (*pos) : ht->pInternalPointer;
|
||||
|
||||
if (!p) {
|
||||
Z_TYPE_P(key) = IS_NULL;
|
||||
} else if (p->nKeyLength) {
|
||||
Z_TYPE_P(key) = IS_STRING;
|
||||
Z_STRVAL_P(key) = IS_INTERNED(p->arKey) ? (char *) p->arKey : estrndup(p->arKey, p->nKeyLength - 1);
|
||||
Z_STRLEN_P(key) = p->nKeyLength - 1;
|
||||
} else {
|
||||
Z_TYPE_P(key) = IS_LONG;
|
||||
Z_LVAL_P(key) = p->h;
|
||||
}
|
||||
}
|
||||
|
||||
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
|
||||
{
|
||||
|
||||
+1
-3
@@ -170,13 +170,13 @@ ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint
|
||||
ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h);
|
||||
ZEND_API ulong zend_hash_next_free_element(const HashTable *ht);
|
||||
|
||||
|
||||
/* traversing */
|
||||
#define zend_hash_has_more_elements_ex(ht, pos) \
|
||||
(zend_hash_get_current_key_type_ex(ht, pos) == HASH_KEY_NON_EXISTANT ? FAILURE : SUCCESS)
|
||||
ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos);
|
||||
ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos);
|
||||
ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos);
|
||||
ZEND_API void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos);
|
||||
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos);
|
||||
ZEND_API int zend_hash_get_current_data_ex(HashTable *ht, void **pData, HashPosition *pos);
|
||||
ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos);
|
||||
@@ -199,8 +199,6 @@ ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr);
|
||||
zend_hash_move_backwards_ex(ht, NULL)
|
||||
#define zend_hash_get_current_key(ht, str_index, num_index, duplicate) \
|
||||
zend_hash_get_current_key_ex(ht, str_index, NULL, num_index, duplicate, NULL)
|
||||
#define zend_hash_get_current_key_zval(ht, key) \
|
||||
zend_hash_get_current_key_zval_ex(ht, key, NULL)
|
||||
#define zend_hash_get_current_key_type(ht) \
|
||||
zend_hash_get_current_key_type_ex(ht, NULL)
|
||||
#define zend_hash_get_current_data(ht, pData) \
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
#define ZEND_INI_ALL (ZEND_INI_USER|ZEND_INI_PERDIR|ZEND_INI_SYSTEM)
|
||||
|
||||
#ifndef XtOffsetOf
|
||||
# if defined(CRAY) || (defined(__ARMCC_VERSION) && !defined(LINUX))
|
||||
# if defined(CRAY) || (defined(__arm) && !defined(LINUX))
|
||||
# ifdef __STDC__
|
||||
# define XtOffset(p_type, field) _Offsetof(p_type, field)
|
||||
# else
|
||||
|
||||
+33
-7
@@ -195,7 +195,7 @@ static int zend_user_it_get_current_key_default(zend_object_iterator *_iter, cha
|
||||
/* }}} */
|
||||
|
||||
/* {{{ zend_user_it_get_current_key */
|
||||
ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *key TSRMLS_DC)
|
||||
ZEND_API int zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC)
|
||||
{
|
||||
zend_user_iterator *iter = (zend_user_iterator*)_iter;
|
||||
zval *object = (zval*)iter->it.data;
|
||||
@@ -203,16 +203,42 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke
|
||||
|
||||
zend_call_method_with_0_params(&object, iter->ce, &iter->ce->iterator_funcs.zf_key, "key", &retval);
|
||||
|
||||
if (retval) {
|
||||
ZVAL_ZVAL(key, retval, 1, 1);
|
||||
} else {
|
||||
if (!EG(exception)) {
|
||||
if (!retval) {
|
||||
*int_key = 0;
|
||||
if (!EG(exception))
|
||||
{
|
||||
zend_error(E_WARNING, "Nothing returned from %s::key()", iter->ce->name);
|
||||
}
|
||||
return HASH_KEY_IS_LONG;
|
||||
}
|
||||
switch (Z_TYPE_P(retval)) {
|
||||
default:
|
||||
zend_error(E_WARNING, "Illegal type returned from %s::key()", iter->ce->name);
|
||||
case IS_NULL:
|
||||
*int_key = 0;
|
||||
zval_ptr_dtor(&retval);
|
||||
return HASH_KEY_IS_LONG;
|
||||
|
||||
ZVAL_LONG(key, 0);
|
||||
case IS_STRING:
|
||||
*str_key = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
|
||||
*str_key_len = Z_STRLEN_P(retval)+1;
|
||||
zval_ptr_dtor(&retval);
|
||||
return HASH_KEY_IS_STRING;
|
||||
|
||||
case IS_DOUBLE:
|
||||
*int_key = (long)Z_DVAL_P(retval);
|
||||
zval_ptr_dtor(&retval);
|
||||
return HASH_KEY_IS_LONG;
|
||||
|
||||
case IS_RESOURCE:
|
||||
case IS_BOOL:
|
||||
case IS_LONG:
|
||||
*int_key = (long)Z_LVAL_P(retval);
|
||||
zval_ptr_dtor(&retval);
|
||||
return HASH_KEY_IS_LONG;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ zend_user_it_move_forward */
|
||||
ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC)
|
||||
@@ -426,7 +452,7 @@ ZEND_API int zend_user_serialize(zval *object, unsigned char **buffer, zend_uint
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
|
||||
if (result == FAILURE && !EG(exception)) {
|
||||
if (result == FAILURE) {
|
||||
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "%s::serialize() must return a string or NULL", ce->name);
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -51,7 +51,7 @@ ZEND_API zval* zend_call_method(zval **object_pp, zend_class_entry *obj_ce, zend
|
||||
|
||||
ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter TSRMLS_DC);
|
||||
ZEND_API int zend_user_it_valid(zend_object_iterator *_iter TSRMLS_DC);
|
||||
ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *key TSRMLS_DC);
|
||||
ZEND_API int zend_user_it_get_current_key(zend_object_iterator *_iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC);
|
||||
ZEND_API void zend_user_it_get_current_data(zend_object_iterator *_iter, zval ***data TSRMLS_DC);
|
||||
ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC);
|
||||
ZEND_API void zend_user_it_invalidate_current(zend_object_iterator *_iter TSRMLS_DC);
|
||||
|
||||
@@ -38,11 +38,8 @@ typedef struct _zend_object_iterator_funcs {
|
||||
/* fetch the item data for the current element */
|
||||
void (*get_current_data)(zend_object_iterator *iter, zval ***data TSRMLS_DC);
|
||||
|
||||
/* fetch the key for the current element (optional, may be NULL). The key
|
||||
* should be written into the provided zval* using the ZVAL_* macros. If
|
||||
* this handler is not provided auto-incrementing integer keys will be
|
||||
* used. */
|
||||
void (*get_current_key)(zend_object_iterator *iter, zval *key TSRMLS_DC);
|
||||
/* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
|
||||
int (*get_current_key)(zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC);
|
||||
|
||||
/* step forwards to next element */
|
||||
void (*move_forward)(zend_object_iterator *iter TSRMLS_DC);
|
||||
|
||||
@@ -41,19 +41,17 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
|
||||
|
||||
#define YYERROR_VERBOSE
|
||||
#define YYSTYPE znode
|
||||
#ifdef ZTS
|
||||
# define YYPARSE_PARAM tsrm_ls
|
||||
# define YYLEX_PARAM tsrm_ls
|
||||
#endif
|
||||
|
||||
|
||||
%}
|
||||
|
||||
%pure_parser
|
||||
%expect 3
|
||||
|
||||
%code requires {
|
||||
#ifdef ZTS
|
||||
# define YYPARSE_PARAM tsrm_ls
|
||||
# define YYLEX_PARAM tsrm_ls
|
||||
#endif
|
||||
}
|
||||
|
||||
%token END 0 "end of file"
|
||||
%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
|
||||
%token T_INCLUDE "include (T_INCLUDE)"
|
||||
@@ -944,7 +942,6 @@ common_scalar:
|
||||
|
||||
static_scalar: /* compile-time evaluated scalars */
|
||||
common_scalar { $$ = $1; }
|
||||
| static_class_name_scalar { $$ = $1; }
|
||||
| namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_CT, 1 TSRMLS_CC); }
|
||||
| T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_CT, 0 TSRMLS_CC); }
|
||||
| T_NS_SEPARATOR namespace_name { char *tmp = estrndup(Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); memcpy(&(tmp[1]), Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1); tmp[0] = '\\'; efree(Z_STRVAL($2.u.constant)); Z_STRVAL($2.u.constant) = tmp; ++Z_STRLEN($2.u.constant); zend_do_fetch_constant(&$$, NULL, &$2, ZEND_CT, 0 TSRMLS_CC); }
|
||||
@@ -962,7 +959,6 @@ static_class_constant:
|
||||
|
||||
scalar:
|
||||
T_STRING_VARNAME { $$ = $1; }
|
||||
| class_name_scalar { $$ = $1; }
|
||||
| class_constant { $$ = $1; }
|
||||
| namespace_name { zend_do_fetch_constant(&$$, NULL, &$1, ZEND_RT, 1 TSRMLS_CC); }
|
||||
| T_NAMESPACE T_NS_SEPARATOR namespace_name { $$.op_type = IS_CONST; ZVAL_EMPTY_STRING(&$$.u.constant); zend_do_build_namespace_name(&$$, &$$, &$3 TSRMLS_CC); $3 = $$; zend_do_fetch_constant(&$$, NULL, &$3, ZEND_RT, 0 TSRMLS_CC); }
|
||||
@@ -1204,14 +1200,6 @@ class_constant:
|
||||
| variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { zend_do_fetch_constant(&$$, &$1, &$3, ZEND_RT, 0 TSRMLS_CC); }
|
||||
;
|
||||
|
||||
static_class_name_scalar:
|
||||
class_name T_PAAMAYIM_NEKUDOTAYIM T_CLASS { zend_do_resolve_class_name(&$$, &$1, 1 TSRMLS_CC); }
|
||||
;
|
||||
|
||||
class_name_scalar:
|
||||
class_name T_PAAMAYIM_NEKUDOTAYIM T_CLASS { zend_do_resolve_class_name(&$$, &$1, 0 TSRMLS_CC); }
|
||||
;
|
||||
|
||||
%%
|
||||
|
||||
/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
|
||||
|
||||
+10
-35
@@ -13,7 +13,7 @@
|
||||
| license@zend.com so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Authors: Sascha Schumann <sascha@schumann.cx> |
|
||||
| Ard Biesheuvel <ard.biesheuvel@linaro.org> |
|
||||
| Ard Biesheuvel <ard@ard.nu> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
@@ -43,31 +43,6 @@
|
||||
else (lval) = __tmpvar; \
|
||||
} while (0)
|
||||
|
||||
#elif defined(__arm__) && defined(__GNUC__)
|
||||
|
||||
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
|
||||
long __tmpvar; \
|
||||
__asm__("smull %0, %1, %2, %3\n" \
|
||||
"sub %1, %1, %0, asr #31" \
|
||||
: "=r"(__tmpvar), "=r"(usedval) \
|
||||
: "r"(a), "r"(b)); \
|
||||
if (usedval) (dval) = (double) (a) * (double) (b); \
|
||||
else (lval) = __tmpvar; \
|
||||
} while (0)
|
||||
|
||||
#elif defined(__aarch64__) && defined(__GNUC__)
|
||||
|
||||
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
|
||||
long __tmpvar; \
|
||||
__asm__("mul %0, %2, %3\n" \
|
||||
"smulh %1, %2, %3\n" \
|
||||
"sub %1, %1, %0, asr #63\n" \
|
||||
: "=X"(__tmpvar), "=X"(usedval) \
|
||||
: "X"(a), "X"(b)); \
|
||||
if (usedval) (dval) = (double) (a) * (double) (b); \
|
||||
else (lval) = __tmpvar; \
|
||||
} while (0)
|
||||
|
||||
#elif SIZEOF_LONG == 4 && defined(HAVE_ZEND_LONG64)
|
||||
|
||||
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
|
||||
@@ -83,15 +58,15 @@
|
||||
|
||||
#else
|
||||
|
||||
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
|
||||
long __lres = (a) * (b); \
|
||||
long double __dres = (long double)(a) * (long double)(b); \
|
||||
long double __delta = (long double) __lres - __dres; \
|
||||
if ( ((usedval) = (( __dres + __delta ) != __dres))) { \
|
||||
(dval) = __dres; \
|
||||
} else { \
|
||||
(lval) = __lres; \
|
||||
} \
|
||||
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
|
||||
long __lres = (a) * (b); \
|
||||
long double __dres = (long double)(a) * (long double)(b); \
|
||||
long double __delta = (long double) __lres - __dres; \
|
||||
if ( ((usedval) = (( __dres + __delta ) != __dres))) { \
|
||||
(dval) = __dres; \
|
||||
} else { \
|
||||
(lval) = __lres; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
@@ -363,10 +363,9 @@ ZEND_API int zend_check_property_access(zend_object *zobj, const char *prop_info
|
||||
zend_property_info *property_info;
|
||||
const char *class_name, *prop_name;
|
||||
zval member;
|
||||
int prop_name_len;
|
||||
|
||||
zend_unmangle_property_name_ex(prop_info_name, prop_info_name_len, &class_name, &prop_name, &prop_name_len);
|
||||
ZVAL_STRINGL(&member, prop_name, prop_name_len, 0);
|
||||
zend_unmangle_property_name(prop_info_name, prop_info_name_len, &class_name, &prop_name);
|
||||
ZVAL_STRING(&member, prop_name, 0);
|
||||
property_info = zend_get_property_info_quick(zobj->ce, &member, 1, NULL TSRMLS_CC);
|
||||
if (!property_info) {
|
||||
return FAILURE;
|
||||
@@ -394,16 +393,6 @@ static int zend_get_property_guard(zend_object *zobj, zend_property_info *proper
|
||||
info.name = Z_STRVAL_P(member);
|
||||
info.name_length = Z_STRLEN_P(member);
|
||||
info.h = zend_get_hash_value(Z_STRVAL_P(member), Z_STRLEN_P(member) + 1);
|
||||
} else if(property_info->name[0] == '\0'){
|
||||
const char *class_name = NULL, *prop_name = NULL;
|
||||
zend_unmangle_property_name(property_info->name, property_info->name_length, &class_name, &prop_name);
|
||||
if(class_name) {
|
||||
/* use unmangled name for protected properties */
|
||||
info.name = prop_name;
|
||||
info.name_length = strlen(prop_name);
|
||||
info.h = zend_get_hash_value(info.name, info.name_length+1);
|
||||
property_info = &info;
|
||||
}
|
||||
}
|
||||
if (!zobj->guards) {
|
||||
ALLOC_HASHTABLE(zobj->guards);
|
||||
@@ -446,7 +435,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, const zend_li
|
||||
#endif
|
||||
|
||||
/* make zend_get_property_info silent if we have getter - we may want to use it */
|
||||
property_info = zend_get_property_info_quick(zobj->ce, member, silent || (zobj->ce->__get != NULL), key TSRMLS_CC);
|
||||
property_info = zend_get_property_info_quick(zobj->ce, member, (zobj->ce->__get != NULL), key TSRMLS_CC);
|
||||
|
||||
if (UNEXPECTED(!property_info) ||
|
||||
((EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&
|
||||
@@ -714,7 +703,7 @@ static int zend_std_has_dimension(zval *object, zval *offset, int check_empty TS
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */
|
||||
static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, const zend_literal *key TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zend_object *zobj;
|
||||
zval tmp_member;
|
||||
@@ -754,9 +743,7 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, int type
|
||||
/* we don't have access controls - will just add it */
|
||||
new_zval = &EG(uninitialized_zval);
|
||||
|
||||
if(UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) {
|
||||
zend_error(E_NOTICE, "Undefined property: %s", Z_STRVAL_P(member));
|
||||
}
|
||||
/* zend_error(E_NOTICE, "Undefined property: %s", Z_STRVAL_P(member)); */
|
||||
Z_ADDREF_P(new_zval);
|
||||
if (EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&
|
||||
property_info->offset >= 0) {
|
||||
|
||||
@@ -50,7 +50,7 @@ typedef void (*zend_object_write_dimension_t)(zval *object, zval *offset, zval *
|
||||
|
||||
|
||||
/* Used to create pointer to the property of the object, for future direct r/w access */
|
||||
typedef zval **(*zend_object_get_property_ptr_ptr_t)(zval *object, zval *member, int type, const struct _zend_literal *key TSRMLS_DC);
|
||||
typedef zval **(*zend_object_get_property_ptr_ptr_t)(zval *object, zval *member, const struct _zend_literal *key TSRMLS_DC);
|
||||
|
||||
/* Used to set object value. Can be used to override assignments and scalar
|
||||
write ops (like ++, +=) on the object */
|
||||
|
||||
@@ -572,24 +572,6 @@ ZEND_API void convert_to_boolean(zval *op) /* {{{ */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API void _convert_to_cstring(zval *op ZEND_FILE_LINE_DC) /* {{{ */
|
||||
{
|
||||
double dval;
|
||||
switch (Z_TYPE_P(op)) {
|
||||
case IS_DOUBLE: {
|
||||
TSRMLS_FETCH();
|
||||
dval = Z_DVAL_P(op);
|
||||
Z_STRLEN_P(op) = zend_spprintf(&Z_STRVAL_P(op), 0, "%.*H", (int) EG(precision), dval);
|
||||
/* %H already handles removing trailing zeros from the fractional part, yay */
|
||||
break;
|
||||
}
|
||||
default:
|
||||
_convert_to_string(op ZEND_FILE_LINE_CC);
|
||||
}
|
||||
Z_TYPE_P(op) = IS_STRING;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */
|
||||
{
|
||||
long lval;
|
||||
|
||||
+38
-87
@@ -68,40 +68,21 @@ END_EXTERN_C()
|
||||
|
||||
#if ZEND_DVAL_TO_LVAL_CAST_OK
|
||||
# define zend_dval_to_lval(d) ((long) (d))
|
||||
#elif SIZEOF_LONG == 4
|
||||
#elif SIZEOF_LONG == 4 && defined(HAVE_ZEND_LONG64)
|
||||
static zend_always_inline long zend_dval_to_lval(double d)
|
||||
{
|
||||
if (d > LONG_MAX || d < LONG_MIN) {
|
||||
double two_pow_32 = pow(2., 32.),
|
||||
dmod;
|
||||
|
||||
dmod = fmod(d, two_pow_32);
|
||||
if (dmod < 0) {
|
||||
/* we're going to make this number positive; call ceil()
|
||||
* to simulate rounding towards 0 of the negative number */
|
||||
dmod = ceil(dmod) + two_pow_32;
|
||||
}
|
||||
return (long)(unsigned long)dmod;
|
||||
return (long)(unsigned long)(zend_long64) d;
|
||||
}
|
||||
return (long)d;
|
||||
return (long) d;
|
||||
}
|
||||
#else
|
||||
static zend_always_inline long zend_dval_to_lval(double d)
|
||||
{
|
||||
/* >= as (double)LONG_MAX is outside signed range */
|
||||
if (d >= LONG_MAX || d < LONG_MIN) {
|
||||
double two_pow_64 = pow(2., 64.),
|
||||
dmod;
|
||||
|
||||
dmod = fmod(d, two_pow_64);
|
||||
if (dmod < 0) {
|
||||
/* no need to call ceil; original double must have had no
|
||||
* fractional part, hence dmod does not have one either */
|
||||
dmod += two_pow_64;
|
||||
}
|
||||
return (long)(unsigned long)dmod;
|
||||
if (d > LONG_MAX) {
|
||||
return (long)(unsigned long) d;
|
||||
}
|
||||
return (long)d;
|
||||
return (long) d;
|
||||
}
|
||||
#endif
|
||||
/* }}} */
|
||||
@@ -320,7 +301,6 @@ ZEND_API int increment_function(zval *op1);
|
||||
ZEND_API int decrement_function(zval *op2);
|
||||
|
||||
ZEND_API void convert_scalar_to_number(zval *op TSRMLS_DC);
|
||||
ZEND_API void _convert_to_cstring(zval *op ZEND_FILE_LINE_DC);
|
||||
ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC);
|
||||
ZEND_API void convert_to_long(zval *op);
|
||||
ZEND_API void convert_to_double(zval *op);
|
||||
@@ -334,7 +314,6 @@ ZEND_API void multi_convert_to_double_ex(int argc, ...);
|
||||
ZEND_API void multi_convert_to_string_ex(int argc, ...);
|
||||
ZEND_API int add_char_to_string(zval *result, const zval *op1, const zval *op2);
|
||||
ZEND_API int add_string_to_string(zval *result, const zval *op1, const zval *op2);
|
||||
#define convert_to_cstring(op) if ((op)->type != IS_STRING) { _convert_to_cstring((op) ZEND_FILE_LINE_CC); }
|
||||
#define convert_to_string(op) if ((op)->type != IS_STRING) { _convert_to_string((op) ZEND_FILE_LINE_CC); }
|
||||
|
||||
ZEND_API double zend_string_to_double(const char *number, zend_uint length);
|
||||
@@ -495,10 +474,6 @@ ZEND_API void zend_update_current_locale(void);
|
||||
#define zend_update_current_locale()
|
||||
#endif
|
||||
|
||||
/* The offset in bytes between the value and type fields of a zval */
|
||||
#define ZVAL_OFFSETOF_TYPE \
|
||||
(__builtin_offsetof(zval,type) - __builtin_offsetof(zval,value))
|
||||
|
||||
static zend_always_inline int fast_increment_function(zval *op1)
|
||||
{
|
||||
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
|
||||
@@ -508,26 +483,20 @@ static zend_always_inline int fast_increment_function(zval *op1)
|
||||
"jno 0f\n\t"
|
||||
"movl $0x0, (%0)\n\t"
|
||||
"movl $0x41e00000, 0x4(%0)\n\t"
|
||||
"movb %1, %c2(%0)\n"
|
||||
"movb $0x2,0xc(%0)\n"
|
||||
"0:"
|
||||
:
|
||||
: "r"(&op1->value),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "cc");
|
||||
: "r"(op1));
|
||||
#elif defined(__GNUC__) && defined(__x86_64__)
|
||||
__asm__(
|
||||
"incq (%0)\n\t"
|
||||
"jno 0f\n\t"
|
||||
"movl $0x0, (%0)\n\t"
|
||||
"movl $0x43e00000, 0x4(%0)\n\t"
|
||||
"movb %1, %c2(%0)\n"
|
||||
"movb $0x2,0x14(%0)\n"
|
||||
"0:"
|
||||
:
|
||||
: "r"(&op1->value),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "cc");
|
||||
: "r"(op1));
|
||||
#else
|
||||
if (UNEXPECTED(Z_LVAL_P(op1) == LONG_MAX)) {
|
||||
/* switch to double */
|
||||
@@ -551,26 +520,20 @@ static zend_always_inline int fast_decrement_function(zval *op1)
|
||||
"jno 0f\n\t"
|
||||
"movl $0x00200000, (%0)\n\t"
|
||||
"movl $0xc1e00000, 0x4(%0)\n\t"
|
||||
"movb %1,%c2(%0)\n"
|
||||
"movb $0x2,0xc(%0)\n"
|
||||
"0:"
|
||||
:
|
||||
: "r"(&op1->value),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "cc");
|
||||
: "r"(op1));
|
||||
#elif defined(__GNUC__) && defined(__x86_64__)
|
||||
__asm__(
|
||||
"decq (%0)\n\t"
|
||||
"jno 0f\n\t"
|
||||
"movl $0x00000000, (%0)\n\t"
|
||||
"movl $0xc3e00000, 0x4(%0)\n\t"
|
||||
"movb %1,%c2(%0)\n"
|
||||
"movb $0x2,0x14(%0)\n"
|
||||
"0:"
|
||||
:
|
||||
: "r"(&op1->value),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "cc");
|
||||
: "r"(op1));
|
||||
#else
|
||||
if (UNEXPECTED(Z_LVAL_P(op1) == LONG_MIN)) {
|
||||
/* switch to double */
|
||||
@@ -595,46 +558,40 @@ static zend_always_inline int fast_add_function(zval *result, zval *op1, zval *o
|
||||
"addl (%2), %%eax\n\t"
|
||||
"jo 0f\n\t"
|
||||
"movl %%eax, (%0)\n\t"
|
||||
"movb %3, %c5(%0)\n\t"
|
||||
"movb $0x1,0xc(%0)\n\t"
|
||||
"jmp 1f\n"
|
||||
"0:\n\t"
|
||||
"fildl (%1)\n\t"
|
||||
"fildl (%2)\n\t"
|
||||
"faddp %%st, %%st(1)\n\t"
|
||||
"movb %4, %c5(%0)\n\t"
|
||||
"movb $0x2,0xc(%0)\n\t"
|
||||
"fstpl (%0)\n"
|
||||
"1:"
|
||||
:
|
||||
: "r"(&result->value),
|
||||
"r"(&op1->value),
|
||||
"r"(&op2->value),
|
||||
"n"(IS_LONG),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "eax","cc");
|
||||
: "r"(result),
|
||||
"r"(op1),
|
||||
"r"(op2)
|
||||
: "eax");
|
||||
#elif defined(__GNUC__) && defined(__x86_64__)
|
||||
__asm__(
|
||||
"movq (%1), %%rax\n\t"
|
||||
"addq (%2), %%rax\n\t"
|
||||
"jo 0f\n\t"
|
||||
"movq %%rax, (%0)\n\t"
|
||||
"movb %3, %c5(%0)\n\t"
|
||||
"movb $0x1,0x14(%0)\n\t"
|
||||
"jmp 1f\n"
|
||||
"0:\n\t"
|
||||
"fildq (%1)\n\t"
|
||||
"fildq (%2)\n\t"
|
||||
"faddp %%st, %%st(1)\n\t"
|
||||
"movb %4, %c5(%0)\n\t"
|
||||
"movb $0x2,0x14(%0)\n\t"
|
||||
"fstpl (%0)\n"
|
||||
"1:"
|
||||
:
|
||||
: "r"(&result->value),
|
||||
"r"(&op1->value),
|
||||
"r"(&op2->value),
|
||||
"n"(IS_LONG),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "rax","cc");
|
||||
: "r"(result),
|
||||
"r"(op1),
|
||||
"r"(op2)
|
||||
: "rax");
|
||||
#else
|
||||
Z_LVAL_P(result) = Z_LVAL_P(op1) + Z_LVAL_P(op2);
|
||||
|
||||
@@ -676,7 +633,7 @@ static zend_always_inline int fast_sub_function(zval *result, zval *op1, zval *o
|
||||
"subl (%2), %%eax\n\t"
|
||||
"jo 0f\n\t"
|
||||
"movl %%eax, (%0)\n\t"
|
||||
"movb %3, %c5(%0)\n\t"
|
||||
"movb $0x1,0xc(%0)\n\t"
|
||||
"jmp 1f\n"
|
||||
"0:\n\t"
|
||||
"fildl (%2)\n\t"
|
||||
@@ -686,24 +643,21 @@ static zend_always_inline int fast_sub_function(zval *result, zval *op1, zval *o
|
||||
#else
|
||||
"fsubp %%st, %%st(1)\n\t"
|
||||
#endif
|
||||
"movb %4, %c5(%0)\n\t"
|
||||
"movb $0x2,0xc(%0)\n\t"
|
||||
"fstpl (%0)\n"
|
||||
"1:"
|
||||
:
|
||||
: "r"(&result->value),
|
||||
"r"(&op1->value),
|
||||
"r"(&op2->value),
|
||||
"n"(IS_LONG),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "eax","cc");
|
||||
: "r"(result),
|
||||
"r"(op1),
|
||||
"r"(op2)
|
||||
: "eax");
|
||||
#elif defined(__GNUC__) && defined(__x86_64__)
|
||||
__asm__(
|
||||
"movq (%1), %%rax\n\t"
|
||||
"subq (%2), %%rax\n\t"
|
||||
"jo 0f\n\t"
|
||||
"movq %%rax, (%0)\n\t"
|
||||
"movb %3, %c5(%0)\n\t"
|
||||
"movb $0x1,0x14(%0)\n\t"
|
||||
"jmp 1f\n"
|
||||
"0:\n\t"
|
||||
"fildq (%2)\n\t"
|
||||
@@ -713,17 +667,14 @@ static zend_always_inline int fast_sub_function(zval *result, zval *op1, zval *o
|
||||
#else
|
||||
"fsubp %%st, %%st(1)\n\t"
|
||||
#endif
|
||||
"movb %4, %c5(%0)\n\t"
|
||||
"movb $0x2,0x14(%0)\n\t"
|
||||
"fstpl (%0)\n"
|
||||
"1:"
|
||||
:
|
||||
: "r"(&result->value),
|
||||
"r"(&op1->value),
|
||||
"r"(&op2->value),
|
||||
"n"(IS_LONG),
|
||||
"n"(IS_DOUBLE),
|
||||
"n"(ZVAL_OFFSETOF_TYPE)
|
||||
: "rax","cc");
|
||||
: "r"(result),
|
||||
"r"(op1),
|
||||
"r"(op2)
|
||||
: "rax");
|
||||
#else
|
||||
Z_LVAL_P(result) = Z_LVAL_P(op1) - Z_LVAL_P(op2);
|
||||
|
||||
|
||||
+3
-9
@@ -19,7 +19,6 @@
|
||||
/* $Id$ */
|
||||
|
||||
#include "zend.h"
|
||||
#include "zend_qsort.h"
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
@@ -54,7 +53,7 @@ static void _zend_qsort_swap(void *a, void *b, size_t siz)
|
||||
}
|
||||
}
|
||||
|
||||
ZEND_API void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_t compare, void *arg TSRMLS_DC)
|
||||
ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t compare TSRMLS_DC)
|
||||
{
|
||||
void *begin_stack[QSORT_STACK_SIZE];
|
||||
void *end_stack[QSORT_STACK_SIZE];
|
||||
@@ -81,10 +80,10 @@ ZEND_API void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_
|
||||
seg2 = end;
|
||||
|
||||
while (1) {
|
||||
for (; seg1 < seg2 && compare(begin, seg1 TSRMLS_CC, arg) > 0;
|
||||
for (; seg1 < seg2 && compare(begin, seg1 TSRMLS_CC) > 0;
|
||||
seg1 += siz);
|
||||
|
||||
for (; seg2 >= seg1 && compare(seg2, begin TSRMLS_CC, arg) > 0;
|
||||
for (; seg2 >= seg1 && compare(seg2, begin TSRMLS_CC) > 0;
|
||||
seg2 -= siz);
|
||||
|
||||
if (seg1 >= seg2)
|
||||
@@ -118,11 +117,6 @@ ZEND_API void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_
|
||||
}
|
||||
}
|
||||
|
||||
ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t compare TSRMLS_DC)
|
||||
{
|
||||
zend_qsort_r(base, nmemb, siz, (compare_r_func_t)compare, NULL TSRMLS_CC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* c-basic-offset: 4
|
||||
|
||||
@@ -22,9 +22,7 @@
|
||||
#define ZEND_QSORT_H
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
typedef int (*compare_r_func_t)(const void *, const void * TSRMLS_DC, void *);
|
||||
ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t compare TSRMLS_DC);
|
||||
ZEND_API void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_t compare, void *arg TSRMLS_DC);
|
||||
END_EXTERN_C()
|
||||
|
||||
#endif /* ZEND_QSORT_H */
|
||||
|
||||
@@ -52,7 +52,6 @@ typedef unsigned long zend_uintptr_t;
|
||||
|
||||
typedef unsigned int zend_object_handle;
|
||||
typedef struct _zend_object_handlers zend_object_handlers;
|
||||
typedef struct _zval_struct zval;
|
||||
|
||||
typedef struct _zend_object_value {
|
||||
zend_object_handle handle;
|
||||
|
||||
+96
-87
@@ -363,7 +363,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
|
||||
/* here property is a string */
|
||||
if (opline->extended_value == ZEND_ASSIGN_OBJ
|
||||
&& Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
|
||||
zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
|
||||
zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
|
||||
if (zptr != NULL) { /* NULL means no success in getting PTR */
|
||||
SEPARATE_ZVAL_IF_NOT_REF(zptr);
|
||||
|
||||
@@ -625,7 +625,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|
|
||||
}
|
||||
|
||||
if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
|
||||
zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
|
||||
zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
|
||||
if (zptr != NULL) { /* NULL means no success in getting PTR */
|
||||
SEPARATE_ZVAL_IF_NOT_REF(zptr);
|
||||
|
||||
@@ -726,7 +726,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR
|
||||
}
|
||||
|
||||
if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
|
||||
zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
|
||||
zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
|
||||
if (zptr != NULL) { /* NULL means no success in getting PTR */
|
||||
have_get_ptr = 1;
|
||||
SEPARATE_ZVAL_IF_NOT_REF(zptr);
|
||||
@@ -974,15 +974,27 @@ ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY)
|
||||
{
|
||||
USE_OPLINE
|
||||
zend_free_op free_op1;
|
||||
zval z_copy;
|
||||
zval *z;
|
||||
|
||||
SAVE_OPLINE();
|
||||
z = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
|
||||
if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
|
||||
INIT_PZVAL(z);
|
||||
if (OP1_TYPE != IS_CONST &&
|
||||
UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) &&
|
||||
Z_OBJ_HT_P(z)->get_method != NULL) {
|
||||
if (OP1_TYPE == IS_TMP_VAR) {
|
||||
INIT_PZVAL(z);
|
||||
}
|
||||
if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
|
||||
zend_print_variable(&z_copy);
|
||||
zval_dtor(&z_copy);
|
||||
} else {
|
||||
zend_print_variable(z);
|
||||
}
|
||||
} else {
|
||||
zend_print_variable(z);
|
||||
}
|
||||
zend_print_variable(z);
|
||||
|
||||
FREE_OP1();
|
||||
CHECK_EXCEPTION();
|
||||
@@ -1967,6 +1979,13 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
|
||||
LOAD_OPLINE();
|
||||
|
||||
if (fbc->type == ZEND_INTERNAL_FUNCTION) {
|
||||
temp_variable *ret = &EX_T(opline->result.var);
|
||||
|
||||
MAKE_STD_ZVAL(ret->var.ptr);
|
||||
ZVAL_NULL(ret->var.ptr);
|
||||
ret->var.ptr_ptr = &ret->var.ptr;
|
||||
ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
|
||||
|
||||
if (fbc->common.arg_info) {
|
||||
zend_uint i=0;
|
||||
zval **p = (zval**)EX(function_state).arguments;
|
||||
@@ -1978,24 +1997,15 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
|
||||
}
|
||||
}
|
||||
|
||||
if (EXPECTED(EG(exception) == NULL)) {
|
||||
temp_variable *ret = &EX_T(opline->result.var);
|
||||
if (!zend_execute_internal) {
|
||||
/* saves one function call if zend_execute_internal is not used */
|
||||
fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
|
||||
} else {
|
||||
zend_execute_internal(execute_data, NULL, RETURN_VALUE_USED(opline) TSRMLS_CC);
|
||||
}
|
||||
|
||||
MAKE_STD_ZVAL(ret->var.ptr);
|
||||
ZVAL_NULL(ret->var.ptr);
|
||||
ret->var.ptr_ptr = &ret->var.ptr;
|
||||
ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
|
||||
|
||||
if (!zend_execute_internal) {
|
||||
/* saves one function call if zend_execute_internal is not used */
|
||||
fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
|
||||
} else {
|
||||
zend_execute_internal(execute_data, NULL, RETURN_VALUE_USED(opline) TSRMLS_CC);
|
||||
}
|
||||
|
||||
if (!RETURN_VALUE_USED(opline)) {
|
||||
zval_ptr_dtor(&ret->var.ptr);
|
||||
}
|
||||
if (!RETURN_VALUE_USED(opline)) {
|
||||
zval_ptr_dtor(&ret->var.ptr);
|
||||
}
|
||||
} else if (fbc->type == ZEND_USER_FUNCTION) {
|
||||
EX(original_return_value) = EG(return_value_ptr_ptr);
|
||||
@@ -2407,9 +2417,6 @@ ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
|
||||
} else if (Z_TYPE_P(class_name) == IS_STRING) {
|
||||
EX_T(opline->result.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
|
||||
} else {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
|
||||
}
|
||||
|
||||
@@ -2434,9 +2441,6 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
|
||||
|
||||
if (OP2_TYPE != IS_CONST &&
|
||||
UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Method name must be a string");
|
||||
}
|
||||
|
||||
@@ -2470,10 +2474,6 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
FREE_OP2();
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
|
||||
}
|
||||
|
||||
@@ -2552,9 +2552,6 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
|
||||
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
|
||||
if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Function name must be a string");
|
||||
} else {
|
||||
function_name_strval = Z_STRVAL_P(function_name);
|
||||
@@ -2758,9 +2755,6 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
} else {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Function name must be a string");
|
||||
ZEND_VM_NEXT_OPCODE(); /* Never reached */
|
||||
}
|
||||
@@ -2841,17 +2835,17 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
|
||||
if (OP1_TYPE == IS_TMP_VAR) {
|
||||
FREE_OP1();
|
||||
}
|
||||
} else {
|
||||
} else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */
|
||||
if (*EG(return_value_ptr_ptr)) {
|
||||
zval_ptr_dtor(EG(return_value_ptr_ptr));
|
||||
}
|
||||
if (OP1_TYPE == IS_CONST ||
|
||||
OP1_TYPE == IS_TMP_VAR ||
|
||||
PZVAL_IS_REF(retval_ptr)) {
|
||||
(PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
|
||||
zval *ret;
|
||||
|
||||
ALLOC_ZVAL(ret);
|
||||
INIT_PZVAL_COPY(ret, retval_ptr);
|
||||
if (OP1_TYPE != IS_TMP_VAR) {
|
||||
zval_copy_ctor(ret);
|
||||
}
|
||||
zval_copy_ctor(ret);
|
||||
*EG(return_value_ptr_ptr) = ret;
|
||||
} else if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
|
||||
retval_ptr == &EG(uninitialized_zval)) {
|
||||
@@ -2863,6 +2857,16 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
|
||||
*EG(return_value_ptr_ptr) = retval_ptr;
|
||||
Z_ADDREF_P(retval_ptr);
|
||||
}
|
||||
} else {
|
||||
zval *ret;
|
||||
|
||||
if (*EG(return_value_ptr_ptr)) {
|
||||
zval_ptr_dtor(EG(return_value_ptr_ptr));
|
||||
}
|
||||
|
||||
ALLOC_ZVAL(ret);
|
||||
INIT_PZVAL_COPY(ret, retval_ptr);
|
||||
*EG(return_value_ptr_ptr) = ret;
|
||||
}
|
||||
FREE_OP1_IF_VAR();
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
|
||||
@@ -2878,6 +2882,10 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
|
||||
SAVE_OPLINE();
|
||||
|
||||
do {
|
||||
if (EG(return_value_ptr_ptr) && *EG(return_value_ptr_ptr)) {
|
||||
zval_ptr_dtor(EG(return_value_ptr_ptr));
|
||||
}
|
||||
|
||||
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) {
|
||||
/* Not supposed to happen, but we'll allow it */
|
||||
zend_error(E_NOTICE, "Only variable references should be returned by reference");
|
||||
@@ -2959,12 +2967,8 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
|
||||
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
|
||||
|
||||
if (OP1_TYPE == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "Can only throw objects");
|
||||
}
|
||||
|
||||
zend_exception_save(TSRMLS_C);
|
||||
/* Not sure if a complete copy is what we want here */
|
||||
ALLOC_ZVAL(exception);
|
||||
@@ -3262,7 +3266,7 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
|
||||
|
||||
zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
|
||||
var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
|
||||
zval_ptr_dtor(var_ptr);
|
||||
Z_DELREF_PP(var_ptr);
|
||||
*var_ptr = assignment_value;
|
||||
|
||||
CHECK_EXCEPTION();
|
||||
@@ -3427,9 +3431,6 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY)
|
||||
|
||||
if (OP1_TYPE == IS_CONST ||
|
||||
UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
zend_error_noreturn(E_ERROR, "__clone method called on non-object");
|
||||
}
|
||||
|
||||
@@ -3562,9 +3563,6 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
|
||||
}
|
||||
ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
|
||||
zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
|
||||
} else if (Z_STRLEN_P(opline->op2.zv) == sizeof("class")-1 && strcmp(Z_STRVAL_P(opline->op2.zv), "class") == 0) {
|
||||
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
|
||||
ZVAL_STRINGL(&EX_T(opline->result.var).tmp_var, ce->name, ce->name_length, 1);
|
||||
} else {
|
||||
zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
|
||||
}
|
||||
@@ -4233,13 +4231,13 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
|
||||
zend_free_op free_op1;
|
||||
zval *array = EX_T(opline->op1.var).fe.ptr;
|
||||
zval **value;
|
||||
char *str_key;
|
||||
uint str_key_len;
|
||||
ulong int_key;
|
||||
HashTable *fe_ht;
|
||||
zend_object_iterator *iter = NULL;
|
||||
|
||||
zval *key = NULL;
|
||||
if (opline->extended_value & ZEND_FE_FETCH_WITH_KEY) {
|
||||
key = &EX_T((opline+1)->result.var).tmp_var;
|
||||
}
|
||||
int key_type = 0;
|
||||
zend_bool use_key = (zend_bool)(opline->extended_value & ZEND_FE_FETCH_WITH_KEY);
|
||||
|
||||
SAVE_OPLINE();
|
||||
|
||||
@@ -4250,11 +4248,8 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
|
||||
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
|
||||
|
||||
case ZEND_ITER_PLAIN_OBJECT: {
|
||||
const char *class_name, *prop_name;
|
||||
zend_object *zobj = zend_objects_get_address(array TSRMLS_CC);
|
||||
int key_type;
|
||||
char *str_key;
|
||||
zend_uint str_key_len;
|
||||
zend_ulong int_key;
|
||||
|
||||
fe_ht = Z_OBJPROP_P(array);
|
||||
zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
|
||||
@@ -4266,23 +4261,16 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
|
||||
key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
|
||||
|
||||
zend_hash_move_forward(fe_ht);
|
||||
} while (key_type != HASH_KEY_IS_LONG &&
|
||||
zend_check_property_access(zobj, str_key, str_key_len - 1 TSRMLS_CC) != SUCCESS);
|
||||
|
||||
if (key) {
|
||||
if (key_type == HASH_KEY_IS_LONG) {
|
||||
ZVAL_LONG(key, int_key);
|
||||
} else {
|
||||
const char *class_name, *prop_name;
|
||||
int prop_name_len;
|
||||
zend_unmangle_property_name_ex(
|
||||
str_key, str_key_len - 1, &class_name, &prop_name, &prop_name_len
|
||||
);
|
||||
ZVAL_STRINGL(key, prop_name, prop_name_len, 1);
|
||||
}
|
||||
}
|
||||
|
||||
} while (key_type == HASH_KEY_NON_EXISTANT ||
|
||||
(key_type != HASH_KEY_IS_LONG &&
|
||||
zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS));
|
||||
zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
|
||||
if (use_key && key_type != HASH_KEY_IS_LONG) {
|
||||
zend_unmangle_property_name(str_key, str_key_len-1, &class_name, &prop_name);
|
||||
str_key_len = strlen(prop_name);
|
||||
str_key = estrndup(prop_name, str_key_len);
|
||||
str_key_len++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -4293,8 +4281,8 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
|
||||
/* reached end of iteration */
|
||||
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
|
||||
}
|
||||
if (key) {
|
||||
zend_hash_get_current_key_zval(fe_ht, key);
|
||||
if (use_key) {
|
||||
key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL);
|
||||
}
|
||||
zend_hash_move_forward(fe_ht);
|
||||
zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
|
||||
@@ -4329,15 +4317,16 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
|
||||
/* failure in get_current_data */
|
||||
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
|
||||
}
|
||||
if (key) {
|
||||
if (use_key) {
|
||||
if (iter->funcs->get_current_key) {
|
||||
iter->funcs->get_current_key(iter, key TSRMLS_CC);
|
||||
key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
|
||||
if (UNEXPECTED(EG(exception) != NULL)) {
|
||||
zval_ptr_dtor(&array);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
} else {
|
||||
ZVAL_LONG(key, iter->index);
|
||||
key_type = HASH_KEY_IS_LONG;
|
||||
int_key = iter->index;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -4353,6 +4342,26 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
|
||||
AI_SET_PTR(&EX_T(opline->result.var), *value);
|
||||
}
|
||||
|
||||
if (use_key) {
|
||||
zval *key = &EX_T((opline+1)->result.var).tmp_var;
|
||||
|
||||
switch (key_type) {
|
||||
case HASH_KEY_IS_STRING:
|
||||
Z_STRVAL_P(key) = (char*)str_key;
|
||||
Z_STRLEN_P(key) = str_key_len-1;
|
||||
Z_TYPE_P(key) = IS_STRING;
|
||||
break;
|
||||
case HASH_KEY_IS_LONG:
|
||||
Z_LVAL_P(key) = int_key;
|
||||
Z_TYPE_P(key) = IS_LONG;
|
||||
break;
|
||||
default:
|
||||
case HASH_KEY_NON_EXISTANT:
|
||||
ZVAL_NULL(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_INC_OPCODE();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
@@ -5389,7 +5398,7 @@ ZEND_VM_HANDLER(162, ZEND_FAST_CALL, ANY, ANY)
|
||||
USE_OPLINE
|
||||
|
||||
if (opline->extended_value &&
|
||||
UNEXPECTED(EG(prev_exception) != NULL)) {
|
||||
UNEXPECTED(EG(prev_exception) != NULL)) {
|
||||
/* in case of unhandled exception jump to catch block instead of finally */
|
||||
ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.opline_num]);
|
||||
ZEND_VM_CONTINUE();
|
||||
|
||||
+236
-332
File diff suppressed because it is too large.
Load diff
Vendored
+247
-258
@@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Attempt to guess a canonical system name.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
# 2011, 2012, 2013 Free Software Foundation, Inc.
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2012-12-23'
|
||||
timestamp='2008-01-23'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
@@ -17,7 +17,9 @@ timestamp='2012-12-23'
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
@@ -25,16 +27,16 @@ timestamp='2012-12-23'
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
|
||||
# Originally written by Per Bothner. Please send patches (context
|
||||
# diff format) to <config-patches@gnu.org> and include a ChangeLog
|
||||
# entry.
|
||||
# Originally written by Per Bothner <per@bothner.com>.
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
#
|
||||
# This script attempts to guess a canonical system name similar to
|
||||
# config.sub. If it succeeds, it prints the system name on stdout, and
|
||||
# exits with 0. Otherwise, it exits with 1.
|
||||
#
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
|
||||
# The plan is that this can be called by configure scripts if you
|
||||
# don't specify an explicit build system type.
|
||||
|
||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||
|
||||
@@ -54,9 +56,8 @@ version="\
|
||||
GNU config.guess ($timestamp)
|
||||
|
||||
Originally written by Per Bothner.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
|
||||
2012, 2013 Free Software Foundation, Inc.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
@@ -143,7 +144,7 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
|
||||
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
*:NetBSD:*:*)
|
||||
# NetBSD (nbsd) targets should (where applicable) match one or
|
||||
# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
|
||||
# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
|
||||
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
|
||||
# switched to ELF, *-*-netbsd* would select the old
|
||||
# object file format. This provides both forward
|
||||
@@ -169,7 +170,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
|
||||
eval $set_cc_for_build
|
||||
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ELF__
|
||||
| grep __ELF__ >/dev/null
|
||||
then
|
||||
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
|
||||
# Return netbsd for either. FIX?
|
||||
@@ -179,7 +180,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
os=netbsd
|
||||
os=netbsd
|
||||
;;
|
||||
esac
|
||||
# The OS release
|
||||
@@ -200,10 +201,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
|
||||
echo "${machine}-${os}${release}"
|
||||
exit ;;
|
||||
*:Bitrig:*:*)
|
||||
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
|
||||
echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:OpenBSD:*:*)
|
||||
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
|
||||
echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
|
||||
@@ -226,7 +223,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||
;;
|
||||
*5.*)
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
||||
;;
|
||||
esac
|
||||
# According to Compaq, /usr/sbin/psrinfo has been available on
|
||||
@@ -272,10 +269,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
# A Xn.n version is an unreleased experimental baselevel.
|
||||
# 1.2 uses "1.2" for uname -r.
|
||||
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
|
||||
exitcode=$?
|
||||
trap '' 0
|
||||
exit $exitcode ;;
|
||||
exit ;;
|
||||
Alpha\ *:Windows_NT*:*)
|
||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
||||
# Should we change UNAME_MACHINE based on the output of uname instead
|
||||
@@ -301,12 +295,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
echo s390-ibm-zvmoe
|
||||
exit ;;
|
||||
*:OS400:*:*)
|
||||
echo powerpc-ibm-os400
|
||||
echo powerpc-ibm-os400
|
||||
exit ;;
|
||||
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
arm*:riscos:*:*|arm*:RISCOS:*:*)
|
||||
arm:riscos:*:*|arm:RISCOS:*:*)
|
||||
echo arm-unknown-riscos
|
||||
exit ;;
|
||||
SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
|
||||
@@ -330,33 +324,14 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
case `/usr/bin/uname -p` in
|
||||
sparc) echo sparc-icl-nx7; exit ;;
|
||||
esac ;;
|
||||
s390x:SunOS:*:*)
|
||||
echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
sun4H:SunOS:5.*:*)
|
||||
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
|
||||
echo i386-pc-auroraux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
|
||||
eval $set_cc_for_build
|
||||
SUN_ARCH="i386"
|
||||
# If there is a compiler, see if it is configured for 64-bit objects.
|
||||
# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
|
||||
# This test works for both compilers.
|
||||
if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
|
||||
if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
|
||||
(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
|
||||
grep IS_64BIT_ARCH >/dev/null
|
||||
then
|
||||
SUN_ARCH="x86_64"
|
||||
fi
|
||||
fi
|
||||
echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
sun4*:SunOS:6*:*)
|
||||
# According to config.sub, this is the proper way to canonicalize
|
||||
@@ -400,23 +375,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
# MiNT. But MiNT is downward compatible to TOS, so this should
|
||||
# be no problem.
|
||||
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
exit ;;
|
||||
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
|
||||
echo m68k-milan-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
echo m68k-milan-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
|
||||
echo m68k-hades-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
echo m68k-hades-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
|
||||
echo m68k-unknown-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
echo m68k-unknown-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
m68k:machten:*:*)
|
||||
echo m68k-apple-machten${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -486,8 +461,8 @@ EOF
|
||||
echo m88k-motorola-sysv3
|
||||
exit ;;
|
||||
AViiON:dgux:*:*)
|
||||
# DG/UX returns AViiON for all architectures
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
# DG/UX returns AViiON for all architectures
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
|
||||
then
|
||||
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
|
||||
@@ -500,7 +475,7 @@ EOF
|
||||
else
|
||||
echo i586-dg-dgux${UNAME_RELEASE}
|
||||
fi
|
||||
exit ;;
|
||||
exit ;;
|
||||
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
||||
echo m88k-dolphin-sysv3
|
||||
exit ;;
|
||||
@@ -600,52 +575,52 @@ EOF
|
||||
9000/[678][0-9][0-9])
|
||||
if [ -x /usr/bin/getconf ]; then
|
||||
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
|
||||
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
||||
case "${sc_cpu_version}" in
|
||||
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
|
||||
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
|
||||
532) # CPU_PA_RISC2_0
|
||||
case "${sc_kernel_bits}" in
|
||||
32) HP_ARCH="hppa2.0n" ;;
|
||||
64) HP_ARCH="hppa2.0w" ;;
|
||||
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
||||
case "${sc_cpu_version}" in
|
||||
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
|
||||
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
|
||||
532) # CPU_PA_RISC2_0
|
||||
case "${sc_kernel_bits}" in
|
||||
32) HP_ARCH="hppa2.0n" ;;
|
||||
64) HP_ARCH="hppa2.0w" ;;
|
||||
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
|
||||
esac ;;
|
||||
esac
|
||||
esac ;;
|
||||
esac
|
||||
fi
|
||||
if [ "${HP_ARCH}" = "" ]; then
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
|
||||
#define _HPUX_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#define _HPUX_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
long bits = sysconf(_SC_KERNEL_BITS);
|
||||
#endif
|
||||
long cpu = sysconf (_SC_CPU_VERSION);
|
||||
int main ()
|
||||
{
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
long bits = sysconf(_SC_KERNEL_BITS);
|
||||
#endif
|
||||
long cpu = sysconf (_SC_CPU_VERSION);
|
||||
|
||||
switch (cpu)
|
||||
{
|
||||
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
||||
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
||||
case CPU_PA_RISC2_0:
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
switch (bits)
|
||||
{
|
||||
case 64: puts ("hppa2.0w"); break;
|
||||
case 32: puts ("hppa2.0n"); break;
|
||||
default: puts ("hppa2.0"); break;
|
||||
} break;
|
||||
#else /* !defined(_SC_KERNEL_BITS) */
|
||||
puts ("hppa2.0"); break;
|
||||
#endif
|
||||
default: puts ("hppa1.0"); break;
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
switch (cpu)
|
||||
{
|
||||
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
||||
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
||||
case CPU_PA_RISC2_0:
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
switch (bits)
|
||||
{
|
||||
case 64: puts ("hppa2.0w"); break;
|
||||
case 32: puts ("hppa2.0n"); break;
|
||||
default: puts ("hppa2.0"); break;
|
||||
} break;
|
||||
#else /* !defined(_SC_KERNEL_BITS) */
|
||||
puts ("hppa2.0"); break;
|
||||
#endif
|
||||
default: puts ("hppa1.0"); break;
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
EOF
|
||||
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
|
||||
test -z "$HP_ARCH" && HP_ARCH=hppa
|
||||
@@ -665,7 +640,7 @@ EOF
|
||||
# => hppa64-hp-hpux11.23
|
||||
|
||||
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
|
||||
grep -q __LP64__
|
||||
grep __LP64__ >/dev/null
|
||||
then
|
||||
HP_ARCH="hppa2.0w"
|
||||
else
|
||||
@@ -736,22 +711,22 @@ EOF
|
||||
exit ;;
|
||||
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
||||
echo c1-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
||||
if getsysinfo -f scalar_acc
|
||||
then echo c32-convex-bsd
|
||||
else echo c2-convex-bsd
|
||||
fi
|
||||
exit ;;
|
||||
exit ;;
|
||||
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
||||
echo c34-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
||||
echo c38-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
||||
echo c4-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
CRAY*Y-MP:*:*:*)
|
||||
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||
exit ;;
|
||||
@@ -775,14 +750,14 @@ EOF
|
||||
exit ;;
|
||||
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
|
||||
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
5000:UNIX_System_V:4.*:*)
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
|
||||
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
|
||||
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
||||
@@ -794,39 +769,34 @@ EOF
|
||||
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:FreeBSD:*:*)
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
case ${UNAME_PROCESSOR} in
|
||||
case ${UNAME_MACHINE} in
|
||||
pc98)
|
||||
echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
amd64)
|
||||
echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
*)
|
||||
echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
esac
|
||||
exit ;;
|
||||
i*:CYGWIN*:*)
|
||||
echo ${UNAME_MACHINE}-pc-cygwin
|
||||
exit ;;
|
||||
*:MINGW64*:*)
|
||||
echo ${UNAME_MACHINE}-pc-mingw64
|
||||
exit ;;
|
||||
*:MINGW*:*)
|
||||
echo ${UNAME_MACHINE}-pc-mingw32
|
||||
exit ;;
|
||||
i*:MSYS*:*)
|
||||
echo ${UNAME_MACHINE}-pc-msys
|
||||
exit ;;
|
||||
i*:windows32*:*)
|
||||
# uname -m includes "-pc" on this system.
|
||||
echo ${UNAME_MACHINE}-mingw32
|
||||
# uname -m includes "-pc" on this system.
|
||||
echo ${UNAME_MACHINE}-mingw32
|
||||
exit ;;
|
||||
i*:PW*:*)
|
||||
echo ${UNAME_MACHINE}-pc-pw32
|
||||
exit ;;
|
||||
*:Interix*:*)
|
||||
case ${UNAME_MACHINE} in
|
||||
*:Interix*:[3456]*)
|
||||
case ${UNAME_MACHINE} in
|
||||
x86)
|
||||
echo i586-pc-interix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
authenticamd | genuineintel | EM64T)
|
||||
EM64T | authenticamd)
|
||||
echo x86_64-unknown-interix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
IA64)
|
||||
@@ -836,9 +806,6 @@ EOF
|
||||
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
||||
echo i${UNAME_MACHINE}-pc-mks
|
||||
exit ;;
|
||||
8664:Windows_NT:*)
|
||||
echo x86_64-pc-mks
|
||||
exit ;;
|
||||
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
|
||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
||||
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
|
||||
@@ -868,27 +835,6 @@ EOF
|
||||
i*86:Minix:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-minix
|
||||
exit ;;
|
||||
aarch64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
aarch64_be:Linux:*:*)
|
||||
UNAME_MACHINE=aarch64_be
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
alpha:Linux:*:*)
|
||||
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
||||
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||
EV56) UNAME_MACHINE=alphaev56 ;;
|
||||
PCA56) UNAME_MACHINE=alphapca56 ;;
|
||||
PCA57) UNAME_MACHINE=alphapca56 ;;
|
||||
EV6) UNAME_MACHINE=alphaev6 ;;
|
||||
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||
esac
|
||||
objdump --private-headers /bin/sh | grep -q ld.so.1
|
||||
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||
exit ;;
|
||||
arm*:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
@@ -896,40 +842,20 @@ EOF
|
||||
then
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
else
|
||||
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ARM_PCS_VFP
|
||||
then
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnueabi
|
||||
else
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
|
||||
fi
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnueabi
|
||||
fi
|
||||
exit ;;
|
||||
avr32*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
cris:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-axis-linux-gnu
|
||||
echo cris-axis-linux-gnu
|
||||
exit ;;
|
||||
crisv32:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-axis-linux-gnu
|
||||
echo crisv32-axis-linux-gnu
|
||||
exit ;;
|
||||
frv:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
hexagon:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
i*86:Linux:*:*)
|
||||
LIBC=gnu
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#ifdef __dietlibc__
|
||||
LIBC=dietlibc
|
||||
#endif
|
||||
EOF
|
||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
|
||||
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
|
||||
echo frv-unknown-linux-gnu
|
||||
exit ;;
|
||||
ia64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
@@ -940,33 +866,74 @@ EOF
|
||||
m68*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
mips:Linux:*:* | mips64:Linux:*:*)
|
||||
mips:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef ${UNAME_MACHINE}
|
||||
#undef ${UNAME_MACHINE}el
|
||||
#undef mips
|
||||
#undef mipsel
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=${UNAME_MACHINE}el
|
||||
CPU=mipsel
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=${UNAME_MACHINE}
|
||||
CPU=mips
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^CPU/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
mips64:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef mips64
|
||||
#undef mips64el
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=mips64el
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=mips64
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^CPU/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
or32:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
echo or32-unknown-linux-gnu
|
||||
exit ;;
|
||||
padre:Linux:*:*)
|
||||
echo sparc-unknown-linux-gnu
|
||||
ppc:Linux:*:*)
|
||||
echo powerpc-unknown-linux-gnu
|
||||
exit ;;
|
||||
parisc64:Linux:*:* | hppa64:Linux:*:*)
|
||||
echo hppa64-unknown-linux-gnu
|
||||
ppc64:Linux:*:*)
|
||||
echo powerpc64-unknown-linux-gnu
|
||||
exit ;;
|
||||
alpha:Linux:*:*)
|
||||
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
||||
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||
EV56) UNAME_MACHINE=alphaev56 ;;
|
||||
PCA56) UNAME_MACHINE=alphapca56 ;;
|
||||
PCA57) UNAME_MACHINE=alphapca56 ;;
|
||||
EV6) UNAME_MACHINE=alphaev6 ;;
|
||||
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||
esac
|
||||
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
|
||||
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||
exit ;;
|
||||
parisc:Linux:*:* | hppa:Linux:*:*)
|
||||
# Look for CPU level
|
||||
@@ -976,17 +943,14 @@ EOF
|
||||
*) echo hppa-unknown-linux-gnu ;;
|
||||
esac
|
||||
exit ;;
|
||||
ppc64:Linux:*:*)
|
||||
echo powerpc64-unknown-linux-gnu
|
||||
exit ;;
|
||||
ppc:Linux:*:*)
|
||||
echo powerpc-unknown-linux-gnu
|
||||
parisc64:Linux:*:* | hppa64:Linux:*:*)
|
||||
echo hppa64-unknown-linux-gnu
|
||||
exit ;;
|
||||
s390:Linux:*:* | s390x:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-ibm-linux
|
||||
exit ;;
|
||||
sh64*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
sh*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
@@ -994,18 +958,78 @@ EOF
|
||||
sparc:Linux:*:* | sparc64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
tile*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
vax:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-dec-linux-gnu
|
||||
exit ;;
|
||||
x86_64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
echo x86_64-unknown-linux-gnu
|
||||
exit ;;
|
||||
xtensa*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
i*86:Linux:*:*)
|
||||
# The BFD linker knows what the default object file format is, so
|
||||
# first see if it will tell us. cd to the root directory to prevent
|
||||
# problems with other programs or directories called `ld' in the path.
|
||||
# Set LC_ALL=C to ensure ld outputs messages in English.
|
||||
ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
|
||||
| sed -ne '/supported targets:/!d
|
||||
s/[ ][ ]*/ /g
|
||||
s/.*supported targets: *//
|
||||
s/ .*//
|
||||
p'`
|
||||
case "$ld_supported_targets" in
|
||||
elf32-i386)
|
||||
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
|
||||
;;
|
||||
a.out-i386-linux)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
||||
exit ;;
|
||||
coff-i386)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
|
||||
exit ;;
|
||||
"")
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld) or
|
||||
# one that does not give us useful --help.
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
|
||||
exit ;;
|
||||
esac
|
||||
# Determine whether the default compiler is a.out or elf
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#include <features.h>
|
||||
#ifdef __ELF__
|
||||
# ifdef __GLIBC__
|
||||
# if __GLIBC__ >= 2
|
||||
LIBC=gnu
|
||||
# else
|
||||
LIBC=gnulibc1
|
||||
# endif
|
||||
# else
|
||||
LIBC=gnulibc1
|
||||
# endif
|
||||
#else
|
||||
#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||
LIBC=gnu
|
||||
#else
|
||||
LIBC=gnuaout
|
||||
#endif
|
||||
#endif
|
||||
#ifdef __dietlibc__
|
||||
LIBC=dietlibc
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^LIBC/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${LIBC}" != x && {
|
||||
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
|
||||
exit
|
||||
}
|
||||
test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
|
||||
;;
|
||||
i*86:DYNIX/ptx:4*:*)
|
||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
|
||||
# earlier versions are messed up and put the nodename in both
|
||||
@@ -1013,11 +1037,11 @@ EOF
|
||||
echo i386-sequent-sysv4
|
||||
exit ;;
|
||||
i*86:UNIX_SV:4.2MP:2.*)
|
||||
# Unixware is an offshoot of SVR4, but it has its own version
|
||||
# number series starting with 2...
|
||||
# I am not positive that other SVR4 systems won't match this,
|
||||
# Unixware is an offshoot of SVR4, but it has its own version
|
||||
# number series starting with 2...
|
||||
# I am not positive that other SVR4 systems won't match this,
|
||||
# I just have to hope. -- rms.
|
||||
# Use sysv4.2uw... so that sysv4* matches it.
|
||||
# Use sysv4.2uw... so that sysv4* matches it.
|
||||
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||
exit ;;
|
||||
i*86:OS/2:*:*)
|
||||
@@ -1034,7 +1058,7 @@ EOF
|
||||
i*86:syllable:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-syllable
|
||||
exit ;;
|
||||
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
|
||||
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
|
||||
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
i*86:*DOS:*:*)
|
||||
@@ -1049,7 +1073,7 @@ EOF
|
||||
fi
|
||||
exit ;;
|
||||
i*86:*:5:[678]*)
|
||||
# UnixWare 7.x, OpenUNIX and OpenServer 6.
|
||||
# UnixWare 7.x, OpenUNIX and OpenServer 6.
|
||||
case `/bin/uname -X | grep "^Machine"` in
|
||||
*486*) UNAME_MACHINE=i486 ;;
|
||||
*Pentium) UNAME_MACHINE=i586 ;;
|
||||
@@ -1077,13 +1101,10 @@ EOF
|
||||
exit ;;
|
||||
pc:*:*:*)
|
||||
# Left here for compatibility:
|
||||
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||
# the processor, so we play safe by assuming i586.
|
||||
# Note: whatever this is, it MUST be the same as what config.sub
|
||||
# prints for the "djgpp" host, or else GDB configury will decide that
|
||||
# this is a cross-build.
|
||||
echo i586-pc-msdosdjgpp
|
||||
exit ;;
|
||||
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||
# the processor, so we play safe by assuming i386.
|
||||
echo i386-pc-msdosdjgpp
|
||||
exit ;;
|
||||
Intel:Mach:3*:*)
|
||||
echo i386-pc-mach3
|
||||
exit ;;
|
||||
@@ -1118,18 +1139,8 @@ EOF
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
|
||||
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4; exit; } ;;
|
||||
NCR*:*:4.2:* | MPRAS*:*:4.2:*)
|
||||
OS_REL='.3'
|
||||
test -r /etc/.relid \
|
||||
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4.3${OS_REL}; exit; }
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; }
|
||||
/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
|
||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4; exit; } ;;
|
||||
m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
|
||||
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -1142,7 +1153,7 @@ EOF
|
||||
rs6000:LynxOS:2.*:*)
|
||||
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
|
||||
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
|
||||
echo powerpc-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
SM[BE]S:UNIX_SV:*:*)
|
||||
@@ -1162,10 +1173,10 @@ EOF
|
||||
echo ns32k-sni-sysv
|
||||
fi
|
||||
exit ;;
|
||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||
echo i586-unisys-sysv4
|
||||
exit ;;
|
||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||
echo i586-unisys-sysv4
|
||||
exit ;;
|
||||
*:UNIX_System_V:4*:FTX*)
|
||||
# From Gerald Hewes <hewes@openmarket.com>.
|
||||
# How about differentiating between stratus architectures? -djm
|
||||
@@ -1191,11 +1202,11 @@ EOF
|
||||
exit ;;
|
||||
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
|
||||
if [ -d /usr/nec ]; then
|
||||
echo mips-nec-sysv${UNAME_RELEASE}
|
||||
echo mips-nec-sysv${UNAME_RELEASE}
|
||||
else
|
||||
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||
fi
|
||||
exit ;;
|
||||
exit ;;
|
||||
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
|
||||
echo powerpc-be-beos
|
||||
exit ;;
|
||||
@@ -1205,12 +1216,6 @@ EOF
|
||||
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
|
||||
echo i586-pc-beos
|
||||
exit ;;
|
||||
BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
|
||||
echo i586-pc-haiku
|
||||
exit ;;
|
||||
x86_64:Haiku:*:*)
|
||||
echo x86_64-unknown-haiku
|
||||
exit ;;
|
||||
SX-4:SUPER-UX:*:*)
|
||||
echo sx4-nec-superux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -1238,16 +1243,6 @@ EOF
|
||||
*:Darwin:*:*)
|
||||
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
|
||||
case $UNAME_PROCESSOR in
|
||||
i386)
|
||||
eval $set_cc_for_build
|
||||
if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
|
||||
if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
|
||||
(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
|
||||
grep IS_64BIT_ARCH >/dev/null
|
||||
then
|
||||
UNAME_PROCESSOR="x86_64"
|
||||
fi
|
||||
fi ;;
|
||||
unknown) UNAME_PROCESSOR=powerpc ;;
|
||||
esac
|
||||
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
|
||||
@@ -1263,10 +1258,7 @@ EOF
|
||||
*:QNX:*:4*)
|
||||
echo i386-pc-qnx
|
||||
exit ;;
|
||||
NEO-?:NONSTOP_KERNEL:*:*)
|
||||
echo neo-tandem-nsk${UNAME_RELEASE}
|
||||
exit ;;
|
||||
NSE-*:NONSTOP_KERNEL:*:*)
|
||||
NSE-?:NONSTOP_KERNEL:*:*)
|
||||
echo nse-tandem-nsk${UNAME_RELEASE}
|
||||
exit ;;
|
||||
NSR-?:NONSTOP_KERNEL:*:*)
|
||||
@@ -1311,13 +1303,13 @@ EOF
|
||||
echo pdp10-unknown-its
|
||||
exit ;;
|
||||
SEI:*:*:SEIUX)
|
||||
echo mips-sei-seiux${UNAME_RELEASE}
|
||||
echo mips-sei-seiux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:DragonFly:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
||||
exit ;;
|
||||
*:*VMS:*:*)
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
case "${UNAME_MACHINE}" in
|
||||
A*) echo alpha-dec-vms ; exit ;;
|
||||
I*) echo ia64-dec-vms ; exit ;;
|
||||
@@ -1332,14 +1324,11 @@ EOF
|
||||
i*86:rdos:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-rdos
|
||||
exit ;;
|
||||
i*86:AROS:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-aros
|
||||
exit ;;
|
||||
x86_64:VMkernel:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-esx
|
||||
exit ;;
|
||||
esac
|
||||
|
||||
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
||||
|
||||
eval $set_cc_for_build
|
||||
cat >$dummy.c <<EOF
|
||||
#ifdef _SEQUENT_
|
||||
@@ -1357,11 +1346,11 @@ main ()
|
||||
#include <sys/param.h>
|
||||
printf ("m68k-sony-newsos%s\n",
|
||||
#ifdef NEWSOS4
|
||||
"4"
|
||||
"4"
|
||||
#else
|
||||
""
|
||||
""
|
||||
#endif
|
||||
); exit (0);
|
||||
); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
Vendored
+81
-216
@@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
# 2011, 2012, 2013 Free Software Foundation, Inc.
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2012-12-23'
|
||||
timestamp='2008-01-16'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
@@ -21,7 +21,9 @@ timestamp='2012-12-23'
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
@@ -30,16 +32,13 @@ timestamp='2012-12-23'
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted GNU ChangeLog entry.
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
#
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
# that are meaningful with *any* GNU software.
|
||||
@@ -73,9 +72,8 @@ Report bugs and patches to <config-patches@gnu.org>."
|
||||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
|
||||
2012, 2013 Free Software Foundation, Inc.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
@@ -122,18 +120,12 @@ esac
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
kopensolaris*-gnu* | \
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
android-linux)
|
||||
os=-linux-android
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
@@ -156,13 +148,10 @@ case $os in
|
||||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis | -knuth | -cray | -microblaze*)
|
||||
-apple | -axis | -knuth | -cray)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
;;
|
||||
-sim | -cisco | -oki | -wec | -winbond)
|
||||
os=
|
||||
basic_machine=$1
|
||||
@@ -177,10 +166,10 @@ case $os in
|
||||
os=-chorusos
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
basic_machine=$1
|
||||
;;
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
@@ -225,12 +214,6 @@ case $os in
|
||||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-lynx*178)
|
||||
os=-lynxos178
|
||||
;;
|
||||
-lynx*5)
|
||||
os=-lynxos5
|
||||
;;
|
||||
-lynx*)
|
||||
os=-lynxos
|
||||
;;
|
||||
@@ -255,34 +238,24 @@ case $basic_machine in
|
||||
# Some are omitted here because they have special meanings below.
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
| aarch64 | aarch64_be \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc \
|
||||
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
||||
| avr | avr32 \
|
||||
| be32 | be64 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| epiphany \
|
||||
| fido | fr30 | frv \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| hexagon \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
|
||||
| maxq | mb | microblaze | mcore | mep \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
| mips64octeon | mips64octeonel \
|
||||
| mips64orion | mips64orionel \
|
||||
| mips64r5900 | mips64r5900el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64orion | mips64orionel \
|
||||
| mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr4300 | mips64vr4300el \
|
||||
| mips64vr5000 | mips64vr5000el \
|
||||
@@ -295,42 +268,29 @@ case $basic_machine in
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| moxie \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nds32 | nds32le | nds32be \
|
||||
| nios | nios2 \
|
||||
| ns16k | ns32k \
|
||||
| open8 \
|
||||
| or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| pyramid \
|
||||
| rl78 | rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| spu \
|
||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||
| spu | strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| v850 | v850e \
|
||||
| we32k \
|
||||
| x86 | xc16x | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| z8k)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
c54x)
|
||||
basic_machine=tic54x-unknown
|
||||
;;
|
||||
c55x)
|
||||
basic_machine=tic55x-unknown
|
||||
;;
|
||||
c6x)
|
||||
basic_machine=tic6x-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
|
||||
m6811 | m68hc11 | m6812 | m68hc12)
|
||||
# Motorola 68HC11/12.
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
@@ -340,21 +300,6 @@ case $basic_machine in
|
||||
basic_machine=mt-unknown
|
||||
;;
|
||||
|
||||
strongarm | thumb | xscale)
|
||||
basic_machine=arm-unknown
|
||||
;;
|
||||
xgate)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
xscaleeb)
|
||||
basic_machine=armeb-unknown
|
||||
;;
|
||||
|
||||
xscaleel)
|
||||
basic_machine=armel-unknown
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
# (2) the word "unknown" tends to confuse beginning users.
|
||||
@@ -369,37 +314,29 @@ case $basic_machine in
|
||||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
| aarch64-* | aarch64_be-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* | avr32-* \
|
||||
| be32-* | be64-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| hexagon-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| le32-* | le64-* \
|
||||
| lm32-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
|
||||
| microblaze-* | microblazeel-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
| mips64octeon-* | mips64octeonel-* \
|
||||
| mips64orion-* | mips64orionel-* \
|
||||
| mips64r5900-* | mips64r5900el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64orion-* | mips64orionel-* \
|
||||
| mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* \
|
||||
| mips64vr5000-* | mips64vr5000el-* \
|
||||
@@ -414,32 +351,27 @@ case $basic_machine in
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| nds32-* | nds32le-* | nds32be-* \
|
||||
| nios-* | nios2-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| open8-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| pyramid-* \
|
||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| romp-* | rs6000-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||
| tahoe-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tile*-* \
|
||||
| tron-* \
|
||||
| ubicom32-* \
|
||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||
| vax-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
| xstormy16-* | xtensa*-* \
|
||||
| ymp-* \
|
||||
| z8k-* | z80-*)
|
||||
| z8k-*)
|
||||
;;
|
||||
# Recognize the basic CPU types without company name, with glob match.
|
||||
xtensa*)
|
||||
@@ -461,7 +393,7 @@ case $basic_machine in
|
||||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
abacus)
|
||||
abacus)
|
||||
basic_machine=abacus-unknown
|
||||
;;
|
||||
adobe68k)
|
||||
@@ -507,10 +439,6 @@ case $basic_machine in
|
||||
basic_machine=m68k-apollo
|
||||
os=-bsd
|
||||
;;
|
||||
aros)
|
||||
basic_machine=i386-pc
|
||||
os=-aros
|
||||
;;
|
||||
aux)
|
||||
basic_machine=m68k-apple
|
||||
os=-aux
|
||||
@@ -527,27 +455,10 @@ case $basic_machine in
|
||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
bluegene*)
|
||||
basic_machine=powerpc-ibm
|
||||
os=-cnk
|
||||
;;
|
||||
c54x-*)
|
||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c55x-*)
|
||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c6x-*)
|
||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cegcc)
|
||||
basic_machine=arm-unknown
|
||||
os=-cegcc
|
||||
;;
|
||||
convex-c1)
|
||||
basic_machine=c1-convex
|
||||
os=-bsd
|
||||
@@ -576,7 +487,7 @@ case $basic_machine in
|
||||
basic_machine=craynv-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
cr16 | cr16-*)
|
||||
cr16)
|
||||
basic_machine=cr16-unknown
|
||||
os=-elf
|
||||
;;
|
||||
@@ -615,10 +526,6 @@ case $basic_machine in
|
||||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
dicos)
|
||||
basic_machine=i686-pc
|
||||
os=-dicos
|
||||
;;
|
||||
djgpp)
|
||||
basic_machine=i586-pc
|
||||
os=-msdosdjgpp
|
||||
@@ -734,6 +641,7 @@ case $basic_machine in
|
||||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i*86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
@@ -791,13 +699,6 @@ case $basic_machine in
|
||||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
microblaze*)
|
||||
basic_machine=microblaze-xilinx
|
||||
;;
|
||||
mingw64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-mingw64
|
||||
;;
|
||||
mingw32)
|
||||
basic_machine=i386-pc
|
||||
os=-mingw32
|
||||
@@ -834,18 +735,10 @@ case $basic_machine in
|
||||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
msys)
|
||||
basic_machine=i386-pc
|
||||
os=-msys
|
||||
;;
|
||||
mvs)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
nacl)
|
||||
basic_machine=le32-unknown
|
||||
os=-nacl
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
@@ -910,12 +803,6 @@ case $basic_machine in
|
||||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
neo-tandem)
|
||||
basic_machine=neo-tandem
|
||||
;;
|
||||
nse-tandem)
|
||||
basic_machine=nse-tandem
|
||||
;;
|
||||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
@@ -998,10 +885,9 @@ case $basic_machine in
|
||||
;;
|
||||
power) basic_machine=power-ibm
|
||||
;;
|
||||
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-* | ppcbe-*)
|
||||
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
@@ -1011,7 +897,7 @@ case $basic_machine in
|
||||
;;
|
||||
ppc64) basic_machine=powerpc64-unknown
|
||||
;;
|
||||
ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
|
||||
basic_machine=powerpc64le-unknown
|
||||
@@ -1026,11 +912,7 @@ case $basic_machine in
|
||||
basic_machine=i586-unknown
|
||||
os=-pw32
|
||||
;;
|
||||
rdos | rdos64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-rdos
|
||||
;;
|
||||
rdos32)
|
||||
rdos)
|
||||
basic_machine=i386-pc
|
||||
os=-rdos
|
||||
;;
|
||||
@@ -1099,9 +981,6 @@ case $basic_machine in
|
||||
basic_machine=i860-stratus
|
||||
os=-sysv4
|
||||
;;
|
||||
strongarm-* | thumb-*)
|
||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
@@ -1158,8 +1037,20 @@ case $basic_machine in
|
||||
basic_machine=t90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
tic54x | c54x*)
|
||||
basic_machine=tic54x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic55x | c55x*)
|
||||
basic_machine=tic55x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic6x | c6x*)
|
||||
basic_machine=tic6x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tile*)
|
||||
basic_machine=$basic_machine-unknown
|
||||
basic_machine=tile-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
tx39)
|
||||
@@ -1229,9 +1120,6 @@ case $basic_machine in
|
||||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||
;;
|
||||
ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
@@ -1240,10 +1128,6 @@ case $basic_machine in
|
||||
basic_machine=z8k-unknown
|
||||
os=-sim
|
||||
;;
|
||||
z80-*-coff)
|
||||
basic_machine=z80-unknown
|
||||
os=-sim
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
@@ -1282,7 +1166,7 @@ case $basic_machine in
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||
@@ -1329,12 +1213,9 @@ esac
|
||||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
;;
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
@@ -1355,23 +1236,21 @@ case $os in
|
||||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* | -aros* \
|
||||
| -aos* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -bitrig* | -openbsd* | -solidbsd* \
|
||||
| -openbsd* | -solidbsd* \
|
||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
@@ -1379,7 +1258,7 @@ case $os in
|
||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
@@ -1418,7 +1297,7 @@ case $os in
|
||||
-opened*)
|
||||
os=-openedition
|
||||
;;
|
||||
-os400*)
|
||||
-os400*)
|
||||
os=-os400
|
||||
;;
|
||||
-wince*)
|
||||
@@ -1467,7 +1346,7 @@ case $os in
|
||||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-tpf*)
|
||||
-tpf*)
|
||||
os=-tpf
|
||||
;;
|
||||
-triton*)
|
||||
@@ -1509,11 +1388,6 @@ case $os in
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-nacl*)
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
@@ -1536,10 +1410,10 @@ else
|
||||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
score-*)
|
||||
score-*)
|
||||
os=-elf
|
||||
;;
|
||||
spu-*)
|
||||
spu-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-acorn)
|
||||
@@ -1551,20 +1425,8 @@ case $basic_machine in
|
||||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
hexagon-*)
|
||||
os=-elf
|
||||
;;
|
||||
tic54x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic55x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic6x-*)
|
||||
os=-coff
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
# This must come before the *-dec entry.
|
||||
pdp10-*)
|
||||
@@ -1584,11 +1446,14 @@ case $basic_machine in
|
||||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
m68*-cisco)
|
||||
os=-aout
|
||||
;;
|
||||
mep-*)
|
||||
mep-*)
|
||||
os=-elf
|
||||
;;
|
||||
mips*-cisco)
|
||||
@@ -1615,7 +1480,7 @@ case $basic_machine in
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-knuth)
|
||||
*-knuth)
|
||||
os=-mmixware
|
||||
;;
|
||||
*-wec)
|
||||
@@ -1720,7 +1585,7 @@ case $basic_machine in
|
||||
-sunos*)
|
||||
vendor=sun
|
||||
;;
|
||||
-cnk*|-aix*)
|
||||
-aix*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-beos*)
|
||||
|
||||
+1
-1
@@ -120,7 +120,7 @@ int zend_sprintf(char *buffer, const char *format, ...);
|
||||
PHP_MAJOR_VERSION=5
|
||||
PHP_MINOR_VERSION=5
|
||||
PHP_RELEASE_VERSION=0
|
||||
PHP_EXTRA_VERSION="beta2"
|
||||
PHP_EXTRA_VERSION="alpha3"
|
||||
PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION"
|
||||
PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION`
|
||||
|
||||
|
||||
@@ -74,15 +74,16 @@ static void com_iter_get_data(zend_object_iterator *iter, zval ***data TSRMLS_DC
|
||||
*data = &I->zdata;
|
||||
}
|
||||
|
||||
static void com_iter_get_key(zend_object_iterator *iter, zval *key TSRMLS_DC)
|
||||
static int com_iter_get_key(zend_object_iterator *iter, char **str_key, uint *str_key_len,
|
||||
ulong *int_key TSRMLS_DC)
|
||||
{
|
||||
struct php_com_iterator *I = (struct php_com_iterator*)iter->data;
|
||||
|
||||
if (I->key == (ulong)-1) {
|
||||
ZVAL_NULL(key);
|
||||
} else {
|
||||
ZVAL_LONG(key, I->key);
|
||||
return HASH_KEY_NON_EXISTANT;
|
||||
}
|
||||
*int_key = I->key;
|
||||
return HASH_KEY_IS_LONG;
|
||||
}
|
||||
|
||||
static int com_iter_move_forwards(zend_object_iterator *iter TSRMLS_DC)
|
||||
|
||||
@@ -519,15 +519,16 @@ static void saproxy_iter_get_data(zend_object_iterator *iter, zval ***data TSRML
|
||||
*data = ptr_ptr;
|
||||
}
|
||||
|
||||
static void saproxy_iter_get_key(zend_object_iterator *iter, zval *key TSRMLS_DC)
|
||||
static int saproxy_iter_get_key(zend_object_iterator *iter, char **str_key, uint *str_key_len,
|
||||
ulong *int_key TSRMLS_DC)
|
||||
{
|
||||
php_com_saproxy_iter *I = (php_com_saproxy_iter*)iter->data;
|
||||
|
||||
if (I->key == -1) {
|
||||
ZVAL_NULL(key);
|
||||
} else {
|
||||
ZVAL_LONG(key, I->key);
|
||||
return HASH_KEY_NON_EXISTANT;
|
||||
}
|
||||
*int_key = (ulong)I->key;
|
||||
return HASH_KEY_IS_LONG;
|
||||
}
|
||||
|
||||
static int saproxy_iter_move_forwards(zend_object_iterator *iter TSRMLS_DC)
|
||||
|
||||
+1
-1
@@ -149,6 +149,6 @@ int main(int argc, char *argv[])
|
||||
AC_DEFINE(PHP_CURL_URL_WRAPPERS,1,[ ])
|
||||
fi
|
||||
|
||||
PHP_NEW_EXTENSION(curl, interface.c multi.c share.c streams.c curl_file.c, $ext_shared)
|
||||
PHP_NEW_EXTENSION(curl, interface.c multi.c share.c streams.c, $ext_shared)
|
||||
PHP_SUBST(CURL_SHARED_LIBADD)
|
||||
fi
|
||||
+1
-1
@@ -13,7 +13,7 @@ if (PHP_CURL != "no") {
|
||||
&& (((PHP_ZLIB=="no") && (CHECK_LIB("zlib_a.lib;zlib.lib", "curl", PHP_CURL))) ||
|
||||
(PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "curl", PHP_CURL)) || (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED)))
|
||||
) {
|
||||
EXTENSION("curl", "interface.c multi.c share.c streams.c curl_file.c", true);
|
||||
EXTENSION("curl", "interface.c multi.c share.c streams.c", true);
|
||||
AC_DEFINE('HAVE_CURL', 1, 'Have cURL library');
|
||||
AC_DEFINE('HAVE_CURL_SSL', 1, 'Have SSL suppurt in cURL');
|
||||
AC_DEFINE('HAVE_CURL_EASY_STRERROR', 1, 'Have curl_easy_strerror in cURL');
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2013 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available through the world-wide-web at the following url: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: Stanislav Malyshev <stas@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "php.h"
|
||||
#include "Zend/zend_exceptions.h"
|
||||
#include "php_curl.h"
|
||||
#if HAVE_CURL
|
||||
|
||||
PHP_CURL_API zend_class_entry *curl_CURLFile_class;
|
||||
|
||||
static void curlfile_ctor(INTERNAL_FUNCTION_PARAMETERS)
|
||||
{
|
||||
char *fname = NULL, *mime = NULL, *postname = NULL;
|
||||
int fname_len, mime_len, postname_len;
|
||||
zval *cf = return_value;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ss", &fname, &fname_len, &mime, &mime_len, &postname, &postname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (fname) {
|
||||
zend_update_property_string(curl_CURLFile_class, cf, "name", sizeof("name")-1, fname TSRMLS_CC);
|
||||
}
|
||||
|
||||
if (mime) {
|
||||
zend_update_property_string(curl_CURLFile_class, cf, "mime", sizeof("mime")-1, mime TSRMLS_CC);
|
||||
}
|
||||
|
||||
if (postname) {
|
||||
zend_update_property_string(curl_CURLFile_class, cf, "postname", sizeof("postname")-1, postname TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
|
||||
/* {{{ proto void CURLFile::__construct(string $name, [string $mimetype [, string $postfilename]])
|
||||
Create the CURLFile object */
|
||||
ZEND_METHOD(CURLFile, __construct)
|
||||
{
|
||||
return_value = getThis();
|
||||
curlfile_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto CURLFile curl_file_create(string $name, [string $mimetype [, string $postfilename]])
|
||||
Create the CURLFile object */
|
||||
PHP_FUNCTION(curl_file_create)
|
||||
{
|
||||
object_init_ex( return_value, curl_CURLFile_class );
|
||||
curlfile_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static void curlfile_get_property(char *name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
{
|
||||
zval *res;
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
res = zend_read_property(curl_CURLFile_class, getThis(), name, strlen(name), 1 TSRMLS_CC);
|
||||
*return_value = *res;
|
||||
zval_copy_ctor(return_value);
|
||||
INIT_PZVAL(return_value);
|
||||
}
|
||||
|
||||
static void curlfile_set_property(char *name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
{
|
||||
char *arg = NULL;
|
||||
int arg_len;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
zend_update_property_string(curl_CURLFile_class, getThis(), name, strlen(name), arg TSRMLS_CC);
|
||||
}
|
||||
|
||||
/* {{{ proto string CURLFile::getFilename()
|
||||
Get file name */
|
||||
ZEND_METHOD(CURLFile, getFilename)
|
||||
{
|
||||
curlfile_get_property("name", INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string CURLFile::getMimeType()
|
||||
Get MIME type */
|
||||
ZEND_METHOD(CURLFile, getMimeType)
|
||||
{
|
||||
curlfile_get_property("mime", INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string CURLFile::getPostFilename()
|
||||
Get file name for POST */
|
||||
ZEND_METHOD(CURLFile, getPostFilename)
|
||||
{
|
||||
curlfile_get_property("postname", INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void CURLFile::setMimeType(string $mime)
|
||||
Set MIME type */
|
||||
ZEND_METHOD(CURLFile, setMimeType)
|
||||
{
|
||||
curlfile_set_property("mime", INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void CURLFile::setPostFilename(string $name)
|
||||
Set file name for POST */
|
||||
ZEND_METHOD(CURLFile, setPostFilename)
|
||||
{
|
||||
curlfile_set_property("postname", INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void CURLFile::__wakeup()
|
||||
Unserialization handler */
|
||||
ZEND_METHOD(CURLFile, __wakeup)
|
||||
{
|
||||
zend_update_property_string(curl_CURLFile_class, getThis(), "name", sizeof("name")-1, "" TSRMLS_CC);
|
||||
zend_throw_exception(NULL, "Unserialization of CURLFile instances is not allowed", 0 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_curlfile_create, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, filename)
|
||||
ZEND_ARG_INFO(0, mimetype)
|
||||
ZEND_ARG_INFO(0, postname)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_curlfile_name, 0)
|
||||
ZEND_ARG_INFO(0, name)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
|
||||
static const zend_function_entry curlfile_funcs[] = {
|
||||
PHP_ME(CURLFile, __construct, arginfo_curlfile_create, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC)
|
||||
PHP_ME(CURLFile, getFilename, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(CURLFile, getMimeType, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(CURLFile, setMimeType, arginfo_curlfile_name, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(CURLFile, getPostFilename, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(CURLFile, setPostFilename, arginfo_curlfile_name, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(CURLFile, __wakeup, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
void curlfile_register_class(TSRMLS_D)
|
||||
{
|
||||
zend_class_entry ce;
|
||||
INIT_CLASS_ENTRY( ce, "CURLFile", curlfile_funcs );
|
||||
curl_CURLFile_class = zend_register_internal_class(&ce TSRMLS_CC);
|
||||
zend_declare_property_string(curl_CURLFile_class, "name", sizeof("name")-1, "", ZEND_ACC_PUBLIC TSRMLS_CC);
|
||||
zend_declare_property_string(curl_CURLFile_class, "mime", sizeof("mime")-1, "", ZEND_ACC_PUBLIC TSRMLS_CC);
|
||||
zend_declare_property_string(curl_CURLFile_class, "postname", sizeof("postname")-1, "", ZEND_ACC_PUBLIC TSRMLS_CC);
|
||||
}
|
||||
|
||||
#endif
|
||||
+46
-102
@@ -317,7 +317,7 @@ ZEND_END_ARG_INFO()
|
||||
#if LIBCURL_VERSION_NUM >= 0x070c01 /* 7.12.1 */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_curl_reset, 0)
|
||||
ZEND_ARG_INFO(0, ch)
|
||||
ZEND_END_ARG_INFO()
|
||||
ZEND_END_ARG_INFO()
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM > 0x070f03 /* 7.15.4 */
|
||||
@@ -403,12 +403,6 @@ ZEND_BEGIN_ARG_INFO(arginfo_curl_pause, 0)
|
||||
ZEND_ARG_INFO(0, bitmask)
|
||||
ZEND_END_ARG_INFO()
|
||||
#endif
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_curlfile_create, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, filename)
|
||||
ZEND_ARG_INFO(0, mimetype)
|
||||
ZEND_ARG_INFO(0, postname)
|
||||
ZEND_END_ARG_INFO()
|
||||
/* }}} */
|
||||
|
||||
/* {{{ curl_functions[]
|
||||
@@ -452,7 +446,6 @@ const zend_function_entry curl_functions[] = {
|
||||
PHP_FE(curl_share_init, arginfo_curl_share_init)
|
||||
PHP_FE(curl_share_close, arginfo_curl_share_close)
|
||||
PHP_FE(curl_share_setopt, arginfo_curl_share_setopt)
|
||||
PHP_FE(curl_file_create, arginfo_curlfile_create)
|
||||
PHP_FE_END
|
||||
};
|
||||
/* }}} */
|
||||
@@ -533,7 +526,7 @@ PHP_MINFO_FUNCTION(curl)
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071600 /* 7.22.0 */
|
||||
{"NTLMWB", CURL_VERSION_NTLM_WB},
|
||||
#endif
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x070a08 /* 7.10.8 */
|
||||
{"SPNEGO", CURL_VERSION_SPNEGO},
|
||||
#endif
|
||||
@@ -811,7 +804,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
REGISTER_CURL_CONSTANT(CURLINFO_STARTTRANSFER_TIME);
|
||||
REGISTER_CURL_CONSTANT(CURLINFO_TOTAL_TIME);
|
||||
|
||||
/* Other */
|
||||
/* Other */
|
||||
REGISTER_CURL_CONSTANT(CURLMSG_DONE);
|
||||
REGISTER_CURL_CONSTANT(CURLVERSION_NOW);
|
||||
|
||||
@@ -853,7 +846,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
REGISTER_CURL_CONSTANT(CURL_SSLVERSION_SSLv2);
|
||||
REGISTER_CURL_CONSTANT(CURL_SSLVERSION_SSLv3);
|
||||
REGISTER_CURL_CONSTANT(CURL_SSLVERSION_TLSv1);
|
||||
|
||||
|
||||
/* Curl TIMECOND constants (CURLOPT_TIMECONDITION) */
|
||||
REGISTER_CURL_CONSTANT(CURL_TIMECOND_IFMODSINCE);
|
||||
REGISTER_CURL_CONSTANT(CURL_TIMECOND_IFUNMODSINCE);
|
||||
@@ -917,7 +910,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x070d00 /* Available since 7.13.0 */
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_FTP_ACCOUNT);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x070b02 /* Available since 7.11.2 */
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_TCP_NODELAY);
|
||||
@@ -925,7 +918,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x070c02 /* Available since 7.12.2 */
|
||||
REGISTER_CURL_CONSTANT(CURLINFO_OS_ERRNO);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x070c03 /* Available since 7.12.3 */
|
||||
REGISTER_CURL_CONSTANT(CURLINFO_NUM_CONNECTS);
|
||||
@@ -966,7 +959,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_FTP_ALTERNATIVE_TO_USER);
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_MAX_RECV_SPEED_LARGE);
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_MAX_SEND_SPEED_LARGE);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x071000 /* Available since 7.16.0 */
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_SSL_SESSIONID_CACHE);
|
||||
@@ -1010,7 +1003,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
REGISTER_CURL_CONSTANT(CURLUSESSL_CONTROL);
|
||||
REGISTER_CURL_CONSTANT(CURLUSESSL_NONE);
|
||||
REGISTER_CURL_CONSTANT(CURLUSESSL_TRY);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x071101 /* Available since 7.17.1 */
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_SSH_HOST_PUBLIC_KEY_MD5);
|
||||
@@ -1060,7 +1053,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_USERNAME);
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x071303 /* Available since 7.19.3 */
|
||||
#if LIBCURL_VERSION_NUM >= 0x071303 /* Available since 7.19.3 */
|
||||
REGISTER_CURL_CONSTANT(CURLAUTH_DIGEST_IE);
|
||||
#endif
|
||||
|
||||
@@ -1142,7 +1135,7 @@ PHP_MINIT_FUNCTION(curl)
|
||||
REGISTER_CURL_CONSTANT(CURL_FNMATCHFUNC_FAIL);
|
||||
REGISTER_CURL_CONSTANT(CURL_FNMATCHFUNC_MATCH);
|
||||
REGISTER_CURL_CONSTANT(CURL_FNMATCHFUNC_NOMATCH);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LIBCURL_VERSION_NUM >= 0x071502 /* Available since 7.21.2 */
|
||||
REGISTER_CURL_CONSTANT(CURLPROTO_GOPHER);
|
||||
@@ -1194,7 +1187,6 @@ PHP_MINIT_FUNCTION(curl)
|
||||
#if CURLOPT_PASSWDFUNCTION != 0
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_PASSWDFUNCTION);
|
||||
#endif
|
||||
REGISTER_CURL_CONSTANT(CURLOPT_SAFE_UPLOAD);
|
||||
|
||||
#ifdef PHP_CURL_NEED_OPENSSL_TSL
|
||||
if (!CRYPTO_get_id_callback()) {
|
||||
@@ -1237,8 +1229,6 @@ PHP_MINIT_FUNCTION(curl)
|
||||
}
|
||||
#endif
|
||||
|
||||
curlfile_register_class(TSRMLS_C);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1285,7 +1275,7 @@ PHP_MSHUTDOWN_FUNCTION(curl)
|
||||
/* {{{ curl_write_nothing
|
||||
* Used as a work around. See _php_curl_close_ex
|
||||
*/
|
||||
static size_t curl_write_nothing(char *data, size_t size, size_t nmemb, void *ctx)
|
||||
static size_t curl_write_nothing(char *data, size_t size, size_t nmemb, void *ctx)
|
||||
{
|
||||
return size * nmemb;
|
||||
}
|
||||
@@ -1822,7 +1812,6 @@ static void alloc_curl_handle(php_curl **ch)
|
||||
zend_llist_init(&(*ch)->to_free->str, sizeof(char *), (llist_dtor_func_t) curl_free_string, 0);
|
||||
zend_llist_init(&(*ch)->to_free->slist, sizeof(struct curl_slist), (llist_dtor_func_t) curl_free_slist, 0);
|
||||
zend_llist_init(&(*ch)->to_free->post, sizeof(struct HttpPost), (llist_dtor_func_t) curl_free_post, 0);
|
||||
(*ch)->safe_upload = 0; /* for now, for BC reason we allow unsafe API */
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -1844,7 +1833,7 @@ static void split_certinfo(char *string, zval *hash)
|
||||
split = strstr(s, "; ");
|
||||
if(split)
|
||||
*split = '\0';
|
||||
|
||||
|
||||
key = s;
|
||||
tmp = memchr(key, '=', 64);
|
||||
if(tmp) {
|
||||
@@ -1864,13 +1853,13 @@ static void split_certinfo(char *string, zval *hash)
|
||||
static void create_certinfo(struct curl_certinfo *ci, zval *listcode TSRMLS_DC)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if(ci) {
|
||||
zval *certhash = NULL;
|
||||
|
||||
|
||||
for(i=0; i<ci->num_of_certs; i++) {
|
||||
struct curl_slist *slist;
|
||||
|
||||
|
||||
MAKE_STD_ZVAL(certhash);
|
||||
array_init(certhash);
|
||||
for(slist = ci->certinfo[i]; slist; slist = slist->next) {
|
||||
@@ -1887,14 +1876,14 @@ static void create_certinfo(struct curl_certinfo *ci, zval *listcode TSRMLS_DC)
|
||||
|
||||
MAKE_STD_ZVAL(hash);
|
||||
array_init(hash);
|
||||
|
||||
|
||||
split_certinfo(&slist->data[len+1], hash);
|
||||
add_assoc_zval(certhash, s, hash);
|
||||
} else {
|
||||
add_assoc_string(certhash, s, &slist->data[len+1], 1);
|
||||
}
|
||||
} else {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not extract hash key from certificate info");
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not extract hash key from certificate info");
|
||||
}
|
||||
}
|
||||
add_next_index_zval(listcode, certhash);
|
||||
@@ -2067,7 +2056,7 @@ PHP_FUNCTION(curl_copy_handle)
|
||||
if (ch->handlers->fnmatch->func_name) {
|
||||
zval_add_ref(&ch->handlers->fnmatch->func_name);
|
||||
dupch->handlers->fnmatch->func_name = ch->handlers->fnmatch->func_name;
|
||||
}
|
||||
}
|
||||
dupch->handlers->fnmatch->method = ch->handlers->fnmatch->method;
|
||||
curl_easy_setopt(dupch->cp, CURLOPT_FNMATCH_DATA, (void *) dupch);
|
||||
}
|
||||
@@ -2146,7 +2135,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
|
||||
#if LIBCURL_VERSION_NUM >= 0x070a06 /* Available since 7.10.6 */
|
||||
case CURLOPT_HTTPAUTH:
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x070a07 /* Available since 7.10.7 */
|
||||
#if LIBCURL_VERSION_NUM >= 0x070a07 /* Available since 7.10.7 */
|
||||
case CURLOPT_FTP_CREATE_MISSING_DIRS:
|
||||
case CURLOPT_PROXYAUTH:
|
||||
#endif
|
||||
@@ -2196,11 +2185,11 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
|
||||
case CURLOPT_USE_SSL:
|
||||
#elif LIBCURL_VERSION_NUM >= 0x070b00 /* Available since 7.11.0 */
|
||||
case CURLOPT_FTP_SSL:
|
||||
#endif
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071100 /* Available since 7.17.0 */
|
||||
case CURLOPT_APPEND:
|
||||
case CURLOPT_DIRLISTONLY:
|
||||
#else
|
||||
#else
|
||||
case CURLOPT_FTPAPPEND:
|
||||
case CURLOPT_FTPLISTONLY:
|
||||
#endif
|
||||
@@ -2258,10 +2247,6 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
|
||||
#endif
|
||||
error = curl_easy_setopt(ch->cp, option, Z_LVAL_PP(zvalue));
|
||||
break;
|
||||
case CURLOPT_SAFE_UPLOAD:
|
||||
convert_to_long_ex(zvalue);
|
||||
ch->safe_upload = (Z_LVAL_PP(zvalue) != 0);
|
||||
break;
|
||||
|
||||
/* String options */
|
||||
case CURLOPT_CAINFO:
|
||||
@@ -2297,7 +2282,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071004 /* Available since 7.16.4 */
|
||||
case CURLOPT_KRBLEVEL:
|
||||
#else
|
||||
#else
|
||||
case CURLOPT_KRB4LEVEL:
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071101 /* Available since 7.17.1 */
|
||||
@@ -2322,7 +2307,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
|
||||
case CURLOPT_TLSAUTH_PASSWORD:
|
||||
case CURLOPT_TLSAUTH_USERNAME:
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071506 /* Available since 7.21.6 */
|
||||
#if LIBCURL_VERSION_NUM >= 0x071506 /* Available since 7.21.6 */
|
||||
case CURLOPT_ACCEPT_ENCODING:
|
||||
case CURLOPT_TRANSFER_ENCODING:
|
||||
#else
|
||||
@@ -2330,7 +2315,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071800 /* Available since 7.24.0 */
|
||||
case CURLOPT_DNS_SERVERS:
|
||||
#endif
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071900 /* Available since 7.25.0 */
|
||||
case CURLOPT_MAIL_AUTH:
|
||||
#endif
|
||||
@@ -2354,8 +2339,8 @@ string_copy:
|
||||
#if LIBCURL_VERSION_NUM >= 0x071100
|
||||
/* Strings passed to libcurl as ’char *’ arguments, are copied by the library... NOTE: before 7.17.0 strings were not copied. */
|
||||
error = curl_easy_setopt(ch->cp, option, Z_STRVAL_PP(zvalue));
|
||||
#else
|
||||
goto string_copy;
|
||||
#else
|
||||
goto string_copy;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -2365,7 +2350,7 @@ string_copy:
|
||||
/* Curl file handle options */
|
||||
case CURLOPT_FILE:
|
||||
case CURLOPT_INFILE:
|
||||
case CURLOPT_STDERR:
|
||||
case CURLOPT_STDERR:
|
||||
case CURLOPT_WRITEHEADER: {
|
||||
FILE *fp = NULL;
|
||||
int type;
|
||||
@@ -2575,6 +2560,9 @@ string_copy:
|
||||
ulong num_key;
|
||||
int numeric_key;
|
||||
|
||||
SEPARATE_ZVAL(current);
|
||||
convert_to_string_ex(current);
|
||||
|
||||
zend_hash_get_current_key_ex(postfields, &string_key, &string_key_len, &num_key, 0, NULL);
|
||||
|
||||
/* Pretend we have a string_key here */
|
||||
@@ -2586,59 +2574,15 @@ string_copy:
|
||||
numeric_key = 0;
|
||||
}
|
||||
|
||||
if(Z_TYPE_PP(current) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(current), curl_CURLFile_class TSRMLS_CC)) {
|
||||
/* new-style file upload */
|
||||
zval *prop;
|
||||
char *type = NULL, *filename = NULL;
|
||||
|
||||
prop = zend_read_property(curl_CURLFile_class, *current, "name", sizeof("name")-1, 0 TSRMLS_CC);
|
||||
if(Z_TYPE_P(prop) != IS_STRING) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid filename for key %s", string_key);
|
||||
} else {
|
||||
postval = Z_STRVAL_P(prop);
|
||||
|
||||
if (php_check_open_basedir(postval TSRMLS_CC)) {
|
||||
RETVAL_FALSE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
prop = zend_read_property(curl_CURLFile_class, *current, "mime", sizeof("mime")-1, 0 TSRMLS_CC);
|
||||
if(Z_TYPE_P(prop) == IS_STRING && Z_STRLEN_P(prop) > 0) {
|
||||
type = Z_STRVAL_P(prop);
|
||||
}
|
||||
prop = zend_read_property(curl_CURLFile_class, *current, "postname", sizeof("postname")-1, 0 TSRMLS_CC);
|
||||
if(Z_TYPE_P(prop) == IS_STRING && Z_STRLEN_P(prop) > 0) {
|
||||
filename = Z_STRVAL_P(prop);
|
||||
}
|
||||
error = curl_formadd(&first, &last,
|
||||
CURLFORM_COPYNAME, string_key,
|
||||
CURLFORM_NAMELENGTH, (long)string_key_len - 1,
|
||||
CURLFORM_FILENAME, filename ? filename : postval,
|
||||
CURLFORM_CONTENTTYPE, type ? type : "application/octet-stream",
|
||||
CURLFORM_FILE, postval,
|
||||
CURLFORM_END);
|
||||
}
|
||||
|
||||
if (numeric_key) {
|
||||
efree(string_key);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
SEPARATE_ZVAL(current);
|
||||
convert_to_string_ex(current);
|
||||
|
||||
postval = Z_STRVAL_PP(current);
|
||||
|
||||
/* The arguments after _NAMELENGTH and _CONTENTSLENGTH
|
||||
* must be explicitly cast to long in curl_formadd
|
||||
* use since curl needs a long not an int. */
|
||||
if (!ch->safe_upload && *postval == '@') {
|
||||
if (*postval == '@') {
|
||||
char *type, *filename;
|
||||
++postval;
|
||||
|
||||
php_error_docref("curl.curlfile" TSRMLS_CC, E_DEPRECATED, "The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead");
|
||||
|
||||
if ((type = php_memnstr(postval, ";type=", sizeof(";type=") - 1, postval + Z_STRLEN_PP(current)))) {
|
||||
*type = '\0';
|
||||
}
|
||||
@@ -2781,7 +2725,7 @@ string_copy:
|
||||
/* the following options deal with files, therefore the open_basedir check
|
||||
* is required.
|
||||
*/
|
||||
case CURLOPT_COOKIEFILE:
|
||||
case CURLOPT_COOKIEFILE:
|
||||
case CURLOPT_COOKIEJAR:
|
||||
case CURLOPT_RANDOM_FILE:
|
||||
case CURLOPT_SSLCERT:
|
||||
@@ -2885,7 +2829,7 @@ PHP_FUNCTION(curl_setopt)
|
||||
|
||||
ZEND_FETCH_RESOURCE(ch, php_curl *, &zid, -1, le_curl_name, le_curl);
|
||||
|
||||
if (options <= 0 && options != CURLOPT_SAFE_UPLOAD) {
|
||||
if (options <= 0) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid curl configuration option");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -3101,7 +3045,7 @@ PHP_FUNCTION(curl_getinfo)
|
||||
CAAS("redirect_url", s_code);
|
||||
}
|
||||
#endif
|
||||
#if LIBCURL_VERSION_NUM >= 0x071300 /* Available since 7.19.0 */
|
||||
#if LIBCURL_VERSION_NUM >= 0x071300 /* Available since 7.19.0 */
|
||||
if (curl_easy_getinfo(ch->cp, CURLINFO_PRIMARY_IP, &s_code) == CURLE_OK) {
|
||||
CAAS("primary_ip", s_code);
|
||||
}
|
||||
@@ -3141,7 +3085,7 @@ PHP_FUNCTION(curl_getinfo)
|
||||
struct curl_certinfo *ci = NULL;
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
|
||||
if (curl_easy_getinfo(ch->cp, CURLINFO_CERTINFO, &ci) == CURLE_OK) {
|
||||
create_certinfo(ci, return_value TSRMLS_CC);
|
||||
} else {
|
||||
@@ -3156,7 +3100,7 @@ PHP_FUNCTION(curl_getinfo)
|
||||
case CURLINFO_STRING:
|
||||
{
|
||||
char *s_code = NULL;
|
||||
|
||||
|
||||
if (curl_easy_getinfo(ch->cp, option, &s_code) == CURLE_OK && s_code) {
|
||||
RETURN_STRING(s_code, 1);
|
||||
} else {
|
||||
@@ -3167,7 +3111,7 @@ PHP_FUNCTION(curl_getinfo)
|
||||
case CURLINFO_LONG:
|
||||
{
|
||||
long code = 0;
|
||||
|
||||
|
||||
if (curl_easy_getinfo(ch->cp, option, &code) == CURLE_OK) {
|
||||
RETURN_LONG(code);
|
||||
} else {
|
||||
@@ -3277,16 +3221,16 @@ static void _php_curl_close_ex(php_curl *ch TSRMLS_DC)
|
||||
|
||||
_php_curl_verify_handlers(ch, 0 TSRMLS_CC);
|
||||
|
||||
/*
|
||||
/*
|
||||
* Libcurl is doing connection caching. When easy handle is cleaned up,
|
||||
* if the handle was previously used by the curl_multi_api, the connection
|
||||
* if the handle was previously used by the curl_multi_api, the connection
|
||||
* remains open un the curl multi handle is cleaned up. Some protocols are
|
||||
* sending content like the FTP one, and libcurl try to use the
|
||||
* sending content like the FTP one, and libcurl try to use the
|
||||
* WRITEFUNCTION or the HEADERFUNCTION. Since structures used in those
|
||||
* callback are freed, we need to use an other callback to which avoid
|
||||
* segfaults.
|
||||
*
|
||||
* Libcurl commit d021f2e8a00 fix this issue and should be part of 7.28.2
|
||||
* Libcurl commit d021f2e8a00 fix this issue and should be part of 7.28.2
|
||||
*/
|
||||
curl_easy_setopt(ch->cp, CURLOPT_HEADERFUNCTION, curl_write_nothing);
|
||||
curl_easy_setopt(ch->cp, CURLOPT_WRITEFUNCTION, curl_write_nothing);
|
||||
@@ -3405,7 +3349,7 @@ static void _php_curl_reset_handlers(php_curl *ch)
|
||||
}
|
||||
ch->handlers->write->fp = NULL;
|
||||
ch->handlers->write->method = PHP_CURL_STDOUT;
|
||||
|
||||
|
||||
if (ch->handlers->write_header->stream) {
|
||||
Z_DELREF_P(ch->handlers->write_header->stream);
|
||||
ch->handlers->write_header->stream = NULL;
|
||||
@@ -3490,7 +3434,7 @@ PHP_FUNCTION(curl_escape)
|
||||
|
||||
if ((res = curl_easy_escape(ch->cp, str, str_len))) {
|
||||
RETVAL_STRING(res, 1);
|
||||
curl_free(res);
|
||||
free(res);
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -3499,7 +3443,7 @@ PHP_FUNCTION(curl_escape)
|
||||
|
||||
/* {{{ proto void curl_unescape(resource ch, string str)
|
||||
URL decodes the given string */
|
||||
PHP_FUNCTION(curl_unescape)
|
||||
PHP_FUNCTION(curl_unescape)
|
||||
{
|
||||
char *str = NULL, *out = NULL;
|
||||
int str_len = 0, out_len;
|
||||
@@ -3514,7 +3458,7 @@ PHP_FUNCTION(curl_unescape)
|
||||
|
||||
if ((out = curl_easy_unescape(ch->cp, str, str_len, &out_len))) {
|
||||
RETVAL_STRINGL(out, out_len, 1);
|
||||
curl_free(out);
|
||||
free(out);
|
||||
} else {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -3537,7 +3481,7 @@ PHP_FUNCTION(curl_pause)
|
||||
|
||||
ZEND_FETCH_RESOURCE(ch, php_curl *, &zid, -1, le_curl_name, le_curl);
|
||||
|
||||
RETURN_LONG(curl_easy_pause(ch->cp, bitmask));
|
||||
RETURN_LONG(curl_easy_pause(ch->cp, bitmask));
|
||||
}
|
||||
/* }}} */
|
||||
#endif
|
||||
|
||||
+1
-16
@@ -34,14 +34,6 @@
|
||||
|
||||
#define PHP_CURL_DEBUG 0
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
# define PHP_CURL_API __declspec(dllexport)
|
||||
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||||
# define PHP_CURL_API __attribute__ ((visibility("default")))
|
||||
#else
|
||||
# define PHP_CURL_API
|
||||
#endif
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/multi.h>
|
||||
|
||||
@@ -111,8 +103,6 @@ PHP_FUNCTION(curl_multi_setopt);
|
||||
#if LIBCURL_VERSION_NUM >= 0x071200 /* 7.18.0 */
|
||||
PHP_FUNCTION(curl_pause);
|
||||
#endif
|
||||
PHP_FUNCTION(curl_file_create);
|
||||
|
||||
|
||||
void _php_curl_multi_close(zend_rsrc_list_entry * TSRMLS_DC);
|
||||
void _php_curl_share_close(zend_rsrc_list_entry * TSRMLS_DC);
|
||||
@@ -181,11 +171,8 @@ typedef struct {
|
||||
long id;
|
||||
zend_bool in_callback;
|
||||
zval *clone;
|
||||
zend_bool safe_upload;
|
||||
} php_curl;
|
||||
|
||||
#define CURLOPT_SAFE_UPLOAD -1
|
||||
|
||||
typedef struct {
|
||||
int still_running;
|
||||
CURLM *multi;
|
||||
@@ -224,7 +211,7 @@ typedef struct {
|
||||
|
||||
fd_set readfds, writefds, excfds;
|
||||
int maxfd;
|
||||
|
||||
|
||||
char errstr[CURL_ERROR_SIZE + 1];
|
||||
CURLMcode mcode;
|
||||
int pending;
|
||||
@@ -232,8 +219,6 @@ typedef struct {
|
||||
struct curl_slist *headers_slist; /* holds custom headers sent out in the request */
|
||||
} php_curl_stream;
|
||||
|
||||
void curlfile_register_class(TSRMLS_D);
|
||||
PHP_CURL_API extern zend_class_entry *curl_CURLFile_class;
|
||||
|
||||
#else
|
||||
#define curl_module_ptr NULL
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
--TEST--
|
||||
Bug #27023 (CURLOPT_POSTFIELDS does not parse content types for files)
|
||||
--INI--
|
||||
error_reporting = E_ALL & ~E_DEPRECATED
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("curl")) {
|
||||
|
||||
@@ -38,4 +38,4 @@ curl_close($ch);
|
||||
?>
|
||||
--EXPECTF--
|
||||
== Testing curl_error with a fake URL ==
|
||||
string(%d) "%sfakeURL%S"
|
||||
string(%d) "%sfakeURL%s"
|
||||
@@ -1,21 +0,0 @@
|
||||
--TEST--
|
||||
CURL file uploading
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("curl")) {
|
||||
exit("skip curl extension not loaded");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$data = 'a:2:{s:4:"file";O:8:"CURLFile":3:{s:4:"name";s:13:"testdata1.txt";s:4:"mime";s:0:"";s:8:"postname";s:0:"";}s:4:"data";s:3:"foo";}';
|
||||
var_dump(unserialize($data));
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught exception 'Exception' with message 'Unserialization of CURLFile instances is not allowed' in %s
|
||||
Stack trace:
|
||||
#0 [internal function]: CURLFile->__wakeup()
|
||||
#1 %s
|
||||
#2 {main}
|
||||
thrown in %s on line %d
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
--TEST--
|
||||
CURL file uploading
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("curl")) {
|
||||
exit("skip curl extension not loaded");
|
||||
}
|
||||
if (false === getenv('PHP_CURL_HTTP_REMOTE_SERVER')) {
|
||||
exit("skip PHP_CURL_HTTP_REMOTE_SERVER env variable is not defined");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function testcurl($ch, $name, $mime = '', $postname = '')
|
||||
{
|
||||
if(!empty($postname)) {
|
||||
$file = new CurlFile($name, $mime, $postname);
|
||||
} else if(!empty($mime)) {
|
||||
$file = new CurlFile($name, $mime);
|
||||
} else {
|
||||
$file = new CurlFile($name);
|
||||
}
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
|
||||
var_dump(curl_exec($ch));
|
||||
}
|
||||
|
||||
$host = getenv('PHP_CURL_HTTP_REMOTE_SERVER');
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "{$host}/get.php?test=file");
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
testcurl($ch, __DIR__ . '/curl_testdata1.txt');
|
||||
testcurl($ch, __DIR__ . '/curl_testdata1.txt', 'text/plain');
|
||||
testcurl($ch, __DIR__ . '/curl_testdata1.txt', '', 'foo.txt');
|
||||
testcurl($ch, __DIR__ . '/curl_testdata1.txt', 'text/plain', 'foo.txt');
|
||||
|
||||
$file = new CurlFile(__DIR__ . '/curl_testdata1.txt');
|
||||
$file->setMimeType('text/plain');
|
||||
var_dump($file->getMimeType());
|
||||
var_dump($file->getFilename());
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
|
||||
var_dump(curl_exec($ch));
|
||||
|
||||
$file = curl_file_create(__DIR__ . '/curl_testdata1.txt');
|
||||
$file->setPostFilename('foo.txt');
|
||||
var_dump($file->getPostFilename());
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $file));
|
||||
var_dump(curl_exec($ch));
|
||||
|
||||
$params = array('file' => '@' . __DIR__ . '/curl_testdata1.txt');
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
|
||||
var_dump(curl_exec($ch));
|
||||
|
||||
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
|
||||
$params = array('file' => '@' . __DIR__ . '/curl_testdata1.txt');
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
|
||||
var_dump(curl_exec($ch));
|
||||
|
||||
curl_setopt($ch, CURLOPT_URL, "{$host}/get.php?test=post");
|
||||
$params = array('file' => '@' . __DIR__ . '/curl_testdata1.txt');
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
|
||||
var_dump(curl_exec($ch));
|
||||
|
||||
curl_close($ch);
|
||||
?>
|
||||
--EXPECTF--
|
||||
string(%d) "curl_testdata1.txt|application/octet-stream"
|
||||
string(%d) "curl_testdata1.txt|text/plain"
|
||||
string(%d) "foo.txt|application/octet-stream"
|
||||
string(%d) "foo.txt|text/plain"
|
||||
string(%d) "text/plain"
|
||||
string(%d) "%s/curl_testdata1.txt"
|
||||
string(%d) "curl_testdata1.txt|text/plain"
|
||||
string(%d) "foo.txt"
|
||||
string(%d) "foo.txt|application/octet-stream"
|
||||
|
||||
Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in %s on line %d
|
||||
string(%d) "curl_testdata1.txt|application/octet-stream"
|
||||
string(0) ""
|
||||
string(%d) "array(1) {
|
||||
["file"]=>
|
||||
string(%d) "@%s/curl_testdata1.txt"
|
||||
}
|
||||
"
|
||||
@@ -14,14 +14,14 @@ curl_setopt(false);
|
||||
|
||||
curl_setopt($ch);
|
||||
curl_setopt($ch, false);
|
||||
curl_setopt($ch, -10);
|
||||
curl_setopt($ch, -1);
|
||||
curl_setopt($ch, '');
|
||||
curl_setopt($ch, 1, false);
|
||||
|
||||
curl_setopt(false, false, false);
|
||||
curl_setopt($ch, '', false);
|
||||
curl_setopt($ch, 1, '');
|
||||
curl_setopt($ch, -10, 0);
|
||||
curl_setopt($ch, -1, 0);
|
||||
?>
|
||||
--EXPECTF--
|
||||
*** curl_setopt() call with incorrect parameters
|
||||
|
||||
+699
-843
File diff suppressed because it is too large.
Load diff
+106
-733
File diff suppressed because it is too large.
Load diff
@@ -51,9 +51,7 @@ PHP_METHOD(DateTime, __construct);
|
||||
PHP_METHOD(DateTime, __wakeup);
|
||||
PHP_METHOD(DateTime, __set_state);
|
||||
PHP_FUNCTION(date_create);
|
||||
PHP_FUNCTION(date_create_immutable);
|
||||
PHP_FUNCTION(date_create_from_format);
|
||||
PHP_FUNCTION(date_create_immutable_from_format);
|
||||
PHP_FUNCTION(date_parse);
|
||||
PHP_FUNCTION(date_parse_from_format);
|
||||
PHP_FUNCTION(date_get_last_errors);
|
||||
@@ -72,17 +70,6 @@ PHP_FUNCTION(date_isodate_set);
|
||||
PHP_FUNCTION(date_timestamp_set);
|
||||
PHP_FUNCTION(date_timestamp_get);
|
||||
|
||||
PHP_METHOD(DateTimeImmutable, __construct);
|
||||
PHP_METHOD(DateTimeImmutable, __set_state);
|
||||
PHP_METHOD(DateTimeImmutable, modify);
|
||||
PHP_METHOD(DateTimeImmutable, add);
|
||||
PHP_METHOD(DateTimeImmutable, sub);
|
||||
PHP_METHOD(DateTimeImmutable, setTimezone);
|
||||
PHP_METHOD(DateTimeImmutable, setTime);
|
||||
PHP_METHOD(DateTimeImmutable, setDate);
|
||||
PHP_METHOD(DateTimeImmutable, setISODate);
|
||||
PHP_METHOD(DateTimeImmutable, setTimestamp);
|
||||
|
||||
PHP_METHOD(DateTimeZone, __construct);
|
||||
PHP_FUNCTION(timezone_open);
|
||||
PHP_FUNCTION(timezone_name_get);
|
||||
@@ -101,8 +88,6 @@ PHP_FUNCTION(date_interval_format);
|
||||
PHP_FUNCTION(date_interval_create_from_date_string);
|
||||
|
||||
PHP_METHOD(DatePeriod, __construct);
|
||||
PHP_METHOD(DatePeriod, __wakeup);
|
||||
PHP_METHOD(DatePeriod, __set_state);
|
||||
|
||||
/* Options and Configuration */
|
||||
PHP_FUNCTION(date_default_timezone_set);
|
||||
@@ -156,7 +141,6 @@ struct _php_interval_obj {
|
||||
struct _php_period_obj {
|
||||
zend_object std;
|
||||
timelib_time *start;
|
||||
zend_class_entry *start_ce;
|
||||
timelib_time *current;
|
||||
timelib_time *end;
|
||||
timelib_rel_time *interval;
|
||||
|
||||
@@ -11,8 +11,8 @@ $other = new DateTime("31-July-2008");
|
||||
$diff = date_diff($date, $other);
|
||||
|
||||
var_dump($diff);
|
||||
--EXPECTF--
|
||||
object(DateInterval)#%d (15) {
|
||||
--EXPECT--
|
||||
object(DateInterval)#3 (8) {
|
||||
["y"]=>
|
||||
int(0)
|
||||
["m"]=>
|
||||
@@ -25,22 +25,8 @@ object(DateInterval)#%d (15) {
|
||||
int(0)
|
||||
["s"]=>
|
||||
int(0)
|
||||
["weekday"]=>
|
||||
int(0)
|
||||
["weekday_behavior"]=>
|
||||
int(0)
|
||||
["first_last_day_of"]=>
|
||||
int(0)
|
||||
["invert"]=>
|
||||
int(0)
|
||||
["days"]=>
|
||||
string(1) "3"
|
||||
["special_type"]=>
|
||||
int(0)
|
||||
["special_amount"]=>
|
||||
string(1) "0"
|
||||
["have_weekday_relative"]=>
|
||||
int(0)
|
||||
["have_special_relative"]=>
|
||||
int(0)
|
||||
int(3)
|
||||
}
|
||||
Loaded 100 of 487 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user