summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-12-05 03:50:02 +0100
committerAnatol Belski <ab@php.net>2014-12-05 03:50:02 +0100
commit88bb9fedc4b5fc750524a7b00be1d46fde2f5929 (patch)
treee799ee0cdf4a5d8a8236f599ab8c85a9a05d8673
parent864cd82acef03b75b994f3fd98d9b4a51a99204a (diff)
parentf0a17c293b5b240a4da27e6b5f89dbd9c9183488 (diff)
downloadphp-git-88bb9fedc4b5fc750524a7b00be1d46fde2f5929.tar.gz
Merge remote-tracking branch 'origin/master' into native-tls
* origin/master: (111 commits) Fix zend_fcall_info_arg*() to use ZVAL_COPY Fixed #65213 - cannot cast SplFileInfo to boolean add initial install switch to C travis project instead of PHP use the generic TRAVIS environment var to check for travis (see http://docs.travis-ci.com/user/ci-environment/) fix TS build add config option to target codegen architectures updated NEWS updated NEWS Fixed bug #55541 errors spawn MessageBox, which blocks test automation Get rid of duplicate handlers (ZEND_ADD_SPEC_TMP_TMP and ZEND_ADD_SPEC_VAR_VAR are absolutely the same). Use zend_string* for op_array->arg_info[]->name and op_array->arg_info[]->class_name. For internal functions we still use char*. Fixed __debugInfo() support Update UPGRADING for the new variadic functions, and re-sort. Improved POST INC/DEC make sure that we don't truncate the stack trace and cause false test failures when the test is executed in a directory with long path Missed closed folder mark Revert "Unecessary assignment" Fixed improper memory release Unecessary assignment ...
-rw-r--r--.travis.yml9
-rw-r--r--NEWS7
-rw-r--r--UPGRADING3
-rw-r--r--Zend/tests/bug65419.phpt23
-rw-r--r--Zend/zend_API.c18
-rw-r--r--Zend/zend_API.h24
-rw-r--r--Zend/zend_alloc.c29
-rw-r--r--Zend/zend_builtin_functions.c26
-rw-r--r--Zend/zend_closures.c3
-rw-r--r--Zend/zend_compile.c31
-rw-r--r--Zend/zend_compile.h87
-rw-r--r--Zend/zend_execute.c79
-rw-r--r--Zend/zend_execute.h17
-rw-r--r--Zend/zend_execute_API.c11
-rw-r--r--Zend/zend_generators.c7
-rw-r--r--Zend/zend_inheritance.c57
-rw-r--r--Zend/zend_ini_parser.y9
-rw-r--r--Zend/zend_multiply.h18
-rw-r--r--Zend/zend_opcode.c12
-rw-r--r--Zend/zend_types.h3
-rw-r--r--Zend/zend_vm_def.h180
-rw-r--r--Zend/zend_vm_execute.h2835
-rw-r--r--Zend/zend_vm_execute.skl2
-rw-r--r--Zend/zend_vm_gen.php58
-rw-r--r--ext/curl/multi.c7
-rw-r--r--ext/curl/tests/bug67643.phpt30
-rw-r--r--ext/date/php_date.c79
-rw-r--r--ext/date/php_date.h3
-rw-r--r--ext/date/tests/DatePeriod_getter.phpt25
-rw-r--r--ext/gmp/gmp.c32
-rw-r--r--ext/gmp/php_gmp.h1
-rw-r--r--ext/gmp/tests/gmp_random_seed.phpt229
-rw-r--r--ext/intl/collator/collator_attr.h2
-rw-r--r--ext/intl/tests/bug67052.phpt5
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c4
-rw-r--r--ext/opcache/Optimizer/zend_optimizer_internal.h2
-rw-r--r--ext/opcache/zend_persist.c6
-rw-r--r--ext/opcache/zend_persist_calc.c6
-rwxr-xr-xext/openssl/openssl.c63
-rw-r--r--ext/openssl/tests/027.phpt52
-rw-r--r--ext/openssl/tests/028.phpt28
-rw-r--r--ext/openssl/tests/private_ec.key5
-rw-r--r--ext/openssl/tests/public_ec.key4
-rw-r--r--ext/openssl/tests/stream_server_reneg_limit.phpt4
-rw-r--r--ext/pcntl/pcntl.c1
-rw-r--r--ext/pdo/pdo_dbh.c2
-rw-r--r--ext/reflection/php_reflection.c79
-rw-r--r--ext/spl/spl_directory.c40
-rw-r--r--ext/spl/spl_directory.h8
-rw-r--r--ext/spl/tests/bug65213.phpt13
-rw-r--r--ext/spl/tests/bug66405.phpt59
-rw-r--r--ext/standard/crypt.c7
-rw-r--r--ext/standard/crypt_blowfish.c43
-rw-r--r--ext/standard/dns.c19
-rw-r--r--ext/standard/dns_win32.c2
-rw-r--r--ext/standard/head.c8
-rw-r--r--ext/standard/pack.c28
-rw-r--r--ext/standard/tests/file/bug68335.phpt13
-rw-r--r--ext/standard/tests/strings/crypt_blowfish.phpt36
-rw-r--r--ext/standard/tests/strings/unpack_bug68225.phpt39
-rw-r--r--main/main.c4
-rw-r--r--main/output.c1
-rw-r--r--main/php_ini.c6
-rw-r--r--main/php_ini.h6
-rw-r--r--main/streams/plain_wrapper.c50
-rwxr-xr-xrun-tests.php3
-rw-r--r--sapi/cgi/cgi_main.c80
-rw-r--r--sapi/cli/php_cli_server.c4
-rw-r--r--sapi/cli/tests/bug64529.phpt10
-rw-r--r--sapi/fpm/fpm/fpm_sockets.c9
-rw-r--r--sapi/fpm/fpm/fpm_unix.c16
-rw-r--r--sapi/fpm/fpm/fpm_unix.h1
-rw-r--r--sapi/fpm/tests/015.phpt4
-rw-r--r--sapi/fpm/tests/019.phpt1
-rw-r--r--sapi/fpm/tests/020.phpt1
-rw-r--r--sapi/phpdbg/phpdbg_frame.c4
-rwxr-xr-xtravis/install.sh2
-rw-r--r--win32/build/config.w325
-rw-r--r--win32/build/config.w32.phpize.in4
-rw-r--r--win32/build/confutils.js16
80 files changed, 2457 insertions, 2302 deletions
diff --git a/.travis.yml b/.travis.yml
index 655507b83b..418a4f28b3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,4 @@
-language: php
-
-php:
- # We only specify one version so we only get one worker
- - 5.4
+language: c
branches:
except:
@@ -33,6 +29,7 @@ before_install:
- sudo apt-get install -y libenchant-dev libaspell-dev libpspell-dev librecode-dev
- sudo cp ./travis/de /var/lib/locales/supported.d/de
- sudo dpkg-reconfigure locales
+ - ./travis/install.sh
before_script:
# Compile PHP
@@ -46,5 +43,5 @@ before_script:
# Run PHPs run-tests.php
script:
- - ./sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --show-diff --set-timeout 120 -s
+ - ./sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --show-diff --set-timeout 120
- ./sapi/cli/php sapi/phpdbg/tests/run-tests.php -diff2stdout --phpdbg sapi/phpdbg/phpdbg
diff --git a/NEWS b/NEWS
index ee8fb84f18..a50e2d52e7 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,7 @@ PHP NEWS
. Added options parameter for unserialize allowing to specify acceptable
classes (https://wiki.php.net/rfc/secure_unserialize). (Stas)
. Fixed bug #68185 ("Inconsistent insteadof definition."- incorrectly triggered). (Julien)
+ . Fixed bug #65419 (Inside trait, self::class != __CLASS__). (Julien)
- DBA:
. Fixed bug #62490 (dba_delete returns true on missing item (inifile)). (Mike)
@@ -43,6 +44,10 @@ PHP NEWS
- LiteSpeed:
. Updated LiteSpeed SAPI code from V5.5 to V6.6. (George Wang)
+- pcntl:
+ . Fixed bug #60509 (pcntl_signal doesn't decrease ref-count of old handler
+ when setting SIG_DFL). (Julien)
+
- Reflection
. Fixed inheritance chain of Reflector interface (Tjerk)
@@ -56,6 +61,8 @@ PHP NEWS
- SPL:
. Implemented #67886 (SplPriorityQueue/SplHeap doesn't expose extractFlags
nor curruption state). (Julien)
+ . Fixed bug #66405 (RecursiveDirectoryIterator::CURRENT_AS_PATHNAME
+ breaks the RecursiveIterator). (Paul Garvin)
- Standard:
. Removed call_user_method() and call_user_method_array() functions. (Kalle)
diff --git a/UPGRADING b/UPGRADING
index 9d5d8e7228..c81b1d1142 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -87,7 +87,8 @@ PHP X.Y UPGRADE NOTES
========================================
6. New Functions
========================================
-
+- GMP
+ Added gmp_random_seed()
========================================
7. New Classes and Interfaces
diff --git a/Zend/tests/bug65419.phpt b/Zend/tests/bug65419.phpt
new file mode 100644
index 0000000000..677b2750f2
--- /dev/null
+++ b/Zend/tests/bug65419.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #65419 (Inside trait, self::class != __CLASS__)
+--FILE--
+<?php
+trait abc
+{
+ static function def()
+ {
+ echo self::class, "\n";
+ echo __CLASS__, "\n";
+ }
+}
+
+class ghi
+{
+ use abc;
+}
+
+ghi::def();
+?>
+--EXPECTF--
+ghi
+ghi \ No newline at end of file
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index e22b557451..369852ffbe 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -51,7 +51,7 @@ ZEND_API int zend_get_parameters(int ht, int param_count, ...) /* {{{ */
TSRMLS_FETCH();
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
@@ -87,7 +87,7 @@ ZEND_API int zend_get_parameters_ex(int param_count, ...) /* {{{ */
TSRMLS_FETCH();
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
@@ -111,7 +111,7 @@ ZEND_API int _zend_get_parameters_array_ex(int param_count, zval *argument_array
int arg_count;
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
@@ -133,7 +133,7 @@ ZEND_API int zend_copy_parameters_array(int param_count, zval *argument_array TS
int arg_count;
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
@@ -920,7 +920,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va,
return FAILURE;
}
- arg_count = EG(current_execute_data)->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (num_args > arg_count) {
zend_error(E_WARNING, "%s(): could not obtain parameters for parsing",
@@ -2192,7 +2192,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
if (ptr->arg_info) {
zend_internal_function_info *info = (zend_internal_function_info*)ptr->arg_info;
- internal_function->arg_info = (zend_arg_info*)ptr->arg_info+1;
+ internal_function->arg_info = (zend_internal_arg_info*)ptr->arg_info+1;
internal_function->num_args = ptr->num_args;
/* Currently you cannot denote that the function can accept less arguments than num_args */
if (info->required_num_args == -1) {
@@ -3504,7 +3504,7 @@ ZEND_API int zend_fcall_info_argp(zend_fcall_info *fci TSRMLS_DC, int argc, zval
fci->params = (zval *) erealloc(fci->params, fci->param_count * sizeof(zval));
for (i = 0; i < argc; ++i) {
- ZVAL_COPY_VALUE(&fci->params[i], &argv[i]);
+ ZVAL_COPY(&fci->params[i], &argv[i]);
}
}
@@ -3529,7 +3529,7 @@ ZEND_API int zend_fcall_info_argv(zend_fcall_info *fci TSRMLS_DC, int argc, va_l
for (i = 0; i < argc; ++i) {
arg = va_arg(*argv, zval *);
- ZVAL_COPY_VALUE(&fci->params[i], arg);
+ ZVAL_COPY(&fci->params[i], arg);
}
}
@@ -4127,7 +4127,7 @@ ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data) /* {{{ */
if (ex->func) {
if (ZEND_USER_CODE(ex->func->type)) {
if (ex->func->op_array.this_var != -1) {
- zval *this_var = EX_VAR_2(ex, ex->func->op_array.this_var);
+ zval *this_var = ZEND_CALL_VAR(ex, ex->func->op_array.this_var);
if (this_var != EX(return_value)) {
zval_ptr_dtor(this_var);
ZVAL_NULL(this_var);
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 46e284be7f..bee797b7da 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -35,7 +35,7 @@ BEGIN_EXTERN_C()
typedef struct _zend_function_entry {
const char *fname;
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
- const struct _zend_arg_info *arg_info;
+ const struct _zend_internal_arg_info *arg_info;
uint32_t num_args;
uint32_t flags;
} zend_function_entry;
@@ -98,16 +98,16 @@ typedef struct _zend_fcall_info_cache {
#define ZEND_FE_END { NULL, NULL, NULL, 0, 0 }
-#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0, 0 },
-#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, pass_by_ref, 0, 0 },
-#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, IS_OBJECT, pass_by_ref, allow_null, 0 },
-#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, sizeof(#name)-1, NULL, 0, IS_ARRAY, pass_by_ref, allow_null, 0 },
-#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, sizeof(#name)-1, NULL, 0, type_hint, pass_by_ref, allow_null, 0 },
-#define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0, 1 },
+#define ZEND_ARG_INFO(pass_by_ref, name) { #name, NULL, 0, pass_by_ref, 0, 0 },
+#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, NULL, 0, pass_by_ref, 0, 0 },
+#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, #classname, IS_OBJECT, pass_by_ref, allow_null, 0 },
+#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, NULL, IS_ARRAY, pass_by_ref, allow_null, 0 },
+#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, NULL, type_hint, pass_by_ref, allow_null, 0 },
+#define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) { #name, NULL, 0, pass_by_ref, 0, 1 },
#define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args) \
- static const zend_arg_info name[] = { \
- { NULL, 0, NULL, required_num_args, 0, return_reference, 0, 0 },
+ static const zend_internal_arg_info name[] = { \
+ { (const char*)(zend_uintptr_t)(required_num_args), NULL, 0, return_reference, 0, 0 },
#define ZEND_BEGIN_ARG_INFO(name, _unused) \
ZEND_BEGIN_ARG_INFO_EX(name, 0, ZEND_RETURN_VALUE, -1)
#define ZEND_END_ARG_INFO() };
@@ -346,8 +346,8 @@ ZEND_API char *zend_get_type_by_const(int type);
#define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT()
#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
-#define ARG_COUNT(dummy) EX(num_args)
-#define ZEND_NUM_ARGS() EX(num_args)
+#define ARG_COUNT(dummy) EX_NUM_ARGS()
+#define ZEND_NUM_ARGS() EX_NUM_ARGS()
#define ZEND_WRONG_PARAM_COUNT() { zend_wrong_param_count(TSRMLS_C); return; }
#define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret) { zend_wrong_param_count(TSRMLS_C); return ret; }
@@ -712,7 +712,7 @@ ZEND_API int _z_param_class(zval *arg, zend_class_entry **pce, int num, int chec
const int _flags = (flags); \
int _min_num_args = (min_num_args); \
int _max_num_args = (max_num_args); \
- int _num_args = EX(num_args); \
+ int _num_args = EX_NUM_ARGS(); \
int _i; \
zval *_real_arg, *_arg = NULL; \
zend_expected_type _expected_type = IS_UNDEF; \
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 1614690414..66141339e0 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -106,7 +106,15 @@
# endif
# ifndef MAP_POPULATE
# define MAP_POPULATE 0
+# endif
+# if defined(_SC_PAGESIZE) || (_SC_PAGE_SIZE)
+# define REAL_PAGE_SIZE _real_page_size
+static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
+# endif
#endif
+
+#ifndef REAL_PAGE_SIZE
+# define REAL_PAGE_SIZE ZEND_MM_PAGE_SIZE
#endif
#ifndef ZEND_MM_STAT
@@ -739,10 +747,10 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
/* chunk has to be aligned */
zend_mm_munmap(ptr, size);
- ptr = zend_mm_mmap(size + alignment - ZEND_MM_PAGE_SIZE);
+ ptr = zend_mm_mmap(size + alignment - REAL_PAGE_SIZE);
#ifdef _WIN32
offset = ZEND_MM_ALIGNED_OFFSET(ptr, alignment);
- zend_mm_munmap(ptr, size + alignment - ZEND_MM_PAGE_SIZE);
+ zend_mm_munmap(ptr, size + alignment - REAL_PAGE_SIZE);
ptr = zend_mm_mmap_fixed((void*)((char*)ptr + (alignment - offset)), size);
offset = ZEND_MM_ALIGNED_OFFSET(ptr, alignment);
if (offset != 0) {
@@ -756,8 +764,10 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
offset = alignment - offset;
zend_mm_munmap(ptr, offset);
ptr = (char*)ptr + offset;
- } else {
- zend_mm_munmap((char*)ptr + size, alignment - ZEND_MM_PAGE_SIZE);
+ alignment -= offset;
+ }
+ if (alignment > REAL_PAGE_SIZE) {
+ zend_mm_munmap((char*)ptr + size, alignment - REAL_PAGE_SIZE);
}
# ifdef MADV_HUGEPAGE
madvise(ptr, size, MADV_HUGEPAGE);
@@ -1394,7 +1404,7 @@ static void *zend_mm_realloc_heap(zend_mm_heap *heap, void *ptr, size_t size ZEN
#if ZEND_DEBUG
size = real_size;
#endif
- new_size = ZEND_MM_ALIGNED_SIZE_EX(size, ZEND_MM_PAGE_SIZE);
+ new_size = ZEND_MM_ALIGNED_SIZE_EX(size, REAL_PAGE_SIZE);
if (new_size == old_size) {
#if ZEND_DEBUG
zend_mm_change_huge_block_size(heap, ptr, new_size, real_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
@@ -1642,7 +1652,7 @@ static void zend_mm_change_huge_block_size(zend_mm_heap *heap, void *ptr, size_t
static void *zend_mm_alloc_huge(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
- size_t new_size = ZEND_MM_ALIGNED_SIZE_EX(size, ZEND_MM_PAGE_SIZE);
+ size_t new_size = ZEND_MM_ALIGNED_SIZE_EX(size, REAL_PAGE_SIZE);
void *ptr;
#if ZEND_MM_LIMIT
@@ -2419,6 +2429,13 @@ ZEND_API void start_memory_manager(TSRMLS_D)
#else
alloc_globals_ctor(&alloc_globals);
#endif
+#ifndef _WIN32
+# if defined(_SC_PAGESIZE)
+ REAL_PAGE_SIZE = sysconf(_SC_PAGESIZE);
+# elif defined(_SC_PAGE_SIZE)
+ REAL_PAGE_SIZE = sysconf(_SC_PAGE_SIZE);
+# endif
+#endif
}
ZEND_API zend_mm_heap *zend_mm_set_heap(zend_mm_heap *new_heap TSRMLS_DC)
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index ecb8f4e0d1..fcf2420ac6 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -402,8 +402,8 @@ ZEND_FUNCTION(func_num_args)
{
zend_execute_data *ex = EX(prev_execute_data);
- if (VM_FRAME_KIND(ex->frame_info) == VM_FRAME_NESTED_FUNCTION || VM_FRAME_KIND(ex->frame_info) == VM_FRAME_TOP_FUNCTION) {
- RETURN_LONG(ex->num_args);
+ if (!(ZEND_CALL_INFO(ex) & ZEND_CALL_CODE)) {
+ RETURN_LONG(ZEND_CALL_NUM_ARGS(ex));
} else {
zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context");
RETURN_LONG(-1);
@@ -430,12 +430,12 @@ ZEND_FUNCTION(func_get_arg)
}
ex = EX(prev_execute_data);
- if (VM_FRAME_KIND(ex->frame_info) != VM_FRAME_NESTED_FUNCTION && VM_FRAME_KIND(ex->frame_info) != VM_FRAME_TOP_FUNCTION) {
+ if (ZEND_CALL_INFO(ex) & ZEND_CALL_CODE) {
zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context");
RETURN_FALSE;
}
- arg_count = ex->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(ex);
if (requested_offset >= arg_count) {
zend_error(E_WARNING, "func_get_arg(): Argument " ZEND_LONG_FMT " not passed to function", requested_offset);
@@ -446,8 +446,8 @@ ZEND_FUNCTION(func_get_arg)
if (ex->func->op_array.fn_flags & ZEND_ACC_VARIADIC) {
first_extra_arg--;
}
- if (requested_offset >= first_extra_arg && (ex->num_args > first_extra_arg)) {
- arg = EX_VAR_NUM_2(ex, ex->func->op_array.last_var + ex->func->op_array.T) + (requested_offset - first_extra_arg);
+ if (requested_offset >= first_extra_arg && (ZEND_CALL_NUM_ARGS(ex) > first_extra_arg)) {
+ arg = ZEND_CALL_VAR_NUM(ex, ex->func->op_array.last_var + ex->func->op_array.T) + (requested_offset - first_extra_arg);
} else {
arg = ZEND_CALL_ARG(ex, requested_offset + 1);
}
@@ -464,12 +464,12 @@ ZEND_FUNCTION(func_get_args)
uint32_t i;
zend_execute_data *ex = EX(prev_execute_data);
- if (VM_FRAME_KIND(ex->frame_info) != VM_FRAME_NESTED_FUNCTION && VM_FRAME_KIND(ex->frame_info) != VM_FRAME_TOP_FUNCTION) {
+ if (ZEND_CALL_INFO(ex) & ZEND_CALL_CODE) {
zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context");
RETURN_FALSE;
}
- arg_count = ex->num_args;
+ arg_count = ZEND_CALL_NUM_ARGS(ex);
array_init_size(return_value, arg_count);
if (arg_count) {
@@ -483,7 +483,7 @@ ZEND_FUNCTION(func_get_args)
i = 0;
q = Z_ARRVAL_P(return_value)->arData;
p = ZEND_CALL_ARG(ex, 1);
- if (ex->num_args > first_extra_arg) {
+ if (ZEND_CALL_NUM_ARGS(ex) > first_extra_arg) {
while (i < first_extra_arg) {
q->h = i;
q->key = NULL;
@@ -496,7 +496,7 @@ ZEND_FUNCTION(func_get_args)
q++;
i++;
}
- p = EX_VAR_NUM_2(ex, ex->func->op_array.last_var + ex->func->op_array.T);
+ p = ZEND_CALL_VAR_NUM(ex, ex->func->op_array.last_var + ex->func->op_array.T);
}
while (i < arg_count) {
q->h = i;
@@ -2050,7 +2050,7 @@ ZEND_FUNCTION(get_defined_constants)
static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array TSRMLS_DC) /* {{{ */
{
- uint32_t num_args = call->num_args;
+ uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
array_init_size(arg_array, num_args);
if (num_args) {
@@ -2063,14 +2063,14 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array TS
if (call->func->op_array.fn_flags & ZEND_ACC_VARIADIC) {
first_extra_arg--;
}
- if (call->num_args > first_extra_arg) {
+ if (ZEND_CALL_NUM_ARGS(call) > first_extra_arg) {
while (i < first_extra_arg) {
if (Z_REFCOUNTED_P(p)) Z_ADDREF_P(p);
zend_hash_next_index_insert_new(Z_ARRVAL_P(arg_array), p);
p++;
i++;
}
- p = EX_VAR_NUM_2(call, call->func->op_array.last_var + call->func->op_array.T);
+ p = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T);
}
}
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index e4827f83b7..bf0ba0ace4 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -182,6 +182,7 @@ ZEND_API zend_function *zend_get_closure_invoke_method(zend_object *object TSRML
zend_function *invoke = (zend_function*)emalloc(sizeof(zend_function));
invoke->common = closure->func.common;
+ /* TODO: return ZEND_INTERNAL_FUNCTION, but arg_info representation is suitable for ZEND_USER_FUNCTION ??? */
invoke->type = ZEND_INTERNAL_FUNCTION;
invoke->internal_function.fn_flags = ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER | (closure->func.common.fn_flags & ZEND_ACC_RETURN_REFERENCE);
invoke->internal_function.handler = ZEND_MN(Closure___invoke);
@@ -370,7 +371,7 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp TSRMLS_
if (arg_info->name) {
name = zend_strpprintf(0, "%s$%s",
arg_info->pass_by_reference ? "&" : "",
- arg_info->name);
+ arg_info->name->val);
} else {
name = zend_strpprintf(0, "%s$param%d",
arg_info->pass_by_reference ? "&" : "",
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 5d409c7518..4ef6135c76 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -273,7 +273,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name TSRMLS_DC) /* {{
op_array->vars[i]->len == name->len &&
memcmp(op_array->vars[i]->val, name->val, name->len) == 0)) {
zend_string_release(name);
- return (int)(zend_intptr_t)EX_VAR_NUM_2(NULL, i);
+ return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
i++;
}
@@ -285,7 +285,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name TSRMLS_DC) /* {{
}
op_array->vars[i] = zend_new_interned_string(name TSRMLS_CC);
- return (int)(zend_intptr_t)EX_VAR_NUM_2(NULL, i);
+ return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
/* }}} */
@@ -342,6 +342,7 @@ static inline int zend_add_literal_string(zend_op_array *op_array, zend_string *
*str = Z_STR(zv);
return ret;
}
+/* }}} */
static int zend_add_func_name_literal(zend_op_array *op_array, zend_string *name TSRMLS_DC) /* {{{ */
{
@@ -3832,14 +3833,12 @@ void zend_compile_params(zend_ast *ast TSRMLS_DC) /* {{{ */
opline->op1.num = i + 1;
arg_info = &arg_infos[i];
- arg_info->name = estrndup(name->val, name->len);
- arg_info->name_len = (uint32_t)name->len;
+ arg_info->name = zend_string_copy(name);
arg_info->pass_by_reference = is_ref;
arg_info->is_variadic = is_variadic;
arg_info->type_hint = 0;
arg_info->allow_null = 1;
arg_info->class_name = NULL;
- arg_info->class_name_len = 0;
if (type_ast) {
zend_bool has_null_default = default_ast
@@ -3876,10 +3875,7 @@ void zend_compile_params(zend_ast *ast TSRMLS_DC) /* {{{ */
}
arg_info->type_hint = IS_OBJECT;
- arg_info->class_name = estrndup(class_name->val, class_name->len);
- arg_info->class_name_len = (uint32_t)class_name->len;
-
- zend_string_release(class_name);
+ arg_info->class_name = class_name;
if (default_ast && !has_null_default && !Z_CONSTANT(default_node.u.constant)) {
zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters "
@@ -5720,8 +5716,21 @@ void zend_compile_resolve_class_name(znode *result, zend_ast *ast TSRMLS_DC) /*
zend_error_noreturn(E_COMPILE_ERROR,
"Cannot access self::class when no class scope is active");
}
- result->op_type = IS_CONST;
- ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name);
+ if (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) {
+ zval class_str_zv;
+ zend_ast *class_str_ast, *class_const_ast;
+
+ ZVAL_STRING(&class_str_zv, "class");
+ class_str_ast = zend_ast_create_zval(&class_str_zv);
+ class_const_ast = zend_ast_create(ZEND_AST_CLASS_CONST, name_ast, class_str_ast);
+
+ zend_compile_expr(result, class_const_ast TSRMLS_CC);
+
+ zval_ptr_dtor(&class_str_zv);
+ } else {
+ result->op_type = IS_CONST;
+ ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name);
+ }
break;
case ZEND_FETCH_CLASS_STATIC:
case ZEND_FETCH_CLASS_PARENT:
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 4cf60c6181..63d67660c6 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -245,26 +245,33 @@ typedef struct _zend_property_info {
#define OBJ_PROP_TO_NUM(offset) \
((offset - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval))
+/* arg_info for internal functions */
+typedef struct _zend_internal_arg_info {
+ const char *name;
+ const char *class_name;
+ zend_uchar type_hint;
+ zend_uchar pass_by_reference;
+ zend_bool allow_null;
+ zend_bool is_variadic;
+} zend_internal_arg_info;
+
+/* arg_info for user functions */
typedef struct _zend_arg_info {
- const char *name; // TODO: convert into zend_string ???
- uint32_t name_len;
- const char *class_name; // TODO: convert into zend_string ???
- uint32_t class_name_len;
+ zend_string *name;
+ zend_string *class_name;
zend_uchar type_hint;
zend_uchar pass_by_reference;
zend_bool allow_null;
zend_bool is_variadic;
} zend_arg_info;
-/* the following structure repeats the layout of zend_arg_info,
+/* the following structure repeats the layout of zend_internal_arg_info,
* but its fields have different meaning. It's used as the first element of
* arg_info array to define properties of internal functions.
*/
typedef struct _zend_internal_function_info {
- const char *_name;
- uint32_t _name_len;
+ zend_uintptr_t required_num_args;
const char *_class_name;
- uint32_t required_num_args;
zend_uchar _type_hint;
zend_bool return_reference;
zend_bool _allow_null;
@@ -330,7 +337,7 @@ typedef struct _zend_internal_function {
zend_function *prototype;
uint32_t num_args;
uint32_t required_num_args;
- zend_arg_info *arg_info;
+ zend_internal_arg_info *arg_info;
/* END of common elements */
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
@@ -357,12 +364,12 @@ union _zend_function {
zend_internal_function internal_function;
};
-typedef enum _vm_frame_kind {
- VM_FRAME_NESTED_FUNCTION, /* stackless VM call to function */
- VM_FRAME_NESTED_CODE, /* stackless VM call to include/require/eval */
- VM_FRAME_TOP_FUNCTION, /* direct VM call to function from external C code */
- VM_FRAME_TOP_CODE /* direct VM call to "main" code from external C code */
-} vm_frame_kind;
+typedef enum _zend_call_kind {
+ ZEND_CALL_NESTED_FUNCTION, /* stackless VM call to function */
+ ZEND_CALL_NESTED_CODE, /* stackless VM call to include/require/eval */
+ ZEND_CALL_TOP_FUNCTION, /* direct VM call to function from external C code */
+ ZEND_CALL_TOP_CODE /* direct VM call to "main" code from external C code */
+} zend_call_kind;
struct _zend_execute_data {
const zend_op *opline; /* executed opline */
@@ -372,38 +379,56 @@ struct _zend_execute_data {
zval This;
zend_class_entry *called_scope;
zend_execute_data *prev_execute_data;
- uint32_t frame_info;
- uint32_t num_args;
zval *return_value;
- zend_class_entry *scope; /* function scope (self) */
zend_array *symbol_table;
};
-#define VM_FRAME_KIND_MASK 0x000000ff
-#define VM_FRAME_FLAGS_MASK 0xffffff00
+#define ZEND_CALL_FUNCTION (0 << 0)
+#define ZEND_CALL_CODE (1 << 0)
+#define ZEND_CALL_NESTED (0 << 1)
+#define ZEND_CALL_TOP (1 << 1)
+#define ZEND_CALL_CTOR (1 << 2)
+#define ZEND_CALL_CTOR_RESULT_UNUSED (1 << 3)
+
+#define ZEND_CALL_INFO(call) \
+ (Z_TYPE_INFO((call)->This) >> 24)
-#define ZEND_CALL_CTOR (1 << 8)
-#define ZEND_CALL_CTOR_RESULT_UNUSED (1 << 9)
+#define ZEND_CALL_KIND(call) \
+ (ZEND_CALL_INFO(call) & (ZEND_CALL_CODE | ZEND_CALL_TOP))
-#define VM_FRAME_INFO(kind, flags) ((kind) | (flags))
-#define VM_FRAME_KIND(info) ((info) & VM_FRAME_KIND_MASK)
-#define VM_FRAME_FLAGS(info) ((info) & VM_FRAME_FLAGS_MASK)
+#define ZEND_SET_CALL_INFO(call, info) do { \
+ Z_TYPE_INFO((call)->This) = IS_OBJECT_EX | ((info) << 24); \
+ } while (0)
+
+#define ZEND_ADD_CALL_FLAG(call, info) do { \
+ Z_TYPE_INFO((call)->This) |= ((info) << 24); \
+ } while (0)
+
+#define ZEND_CALL_NUM_ARGS(call) \
+ (call)->This.u2.num_args
#define ZEND_CALL_FRAME_SLOT \
((ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) - 1) / ZEND_MM_ALIGNED_SIZE(sizeof(zval)))
+#define ZEND_CALL_VAR(call, n) \
+ ((zval*)(((char*)(call)) + ((int)(n))))
+
+#define ZEND_CALL_VAR_NUM(call, n) \
+ (((zval*)(call)) + (ZEND_CALL_FRAME_SLOT + ((int)(n))))
+
#define ZEND_CALL_ARG(call, n) \
- (((zval*)(call)) + ((n) + (ZEND_CALL_FRAME_SLOT - 1)))
+ ZEND_CALL_VAR_NUM(call, ((int)(n)) - 1)
#define EX(element) ((execute_data)->element)
-#define EX_VAR_2(ex, n) ((zval*)(((char*)(ex)) + ((int)(n))))
-#define EX_VAR_NUM_2(ex, n) (((zval*)(ex)) + (ZEND_CALL_FRAME_SLOT + ((int)(n))))
+#define EX_CALL_INFO() ZEND_CALL_INFO(execute_data)
+#define EX_CALL_KIND() ZEND_CALL_KIND(execute_data)
+#define EX_NUM_ARGS() ZEND_CALL_NUM_ARGS(execute_data)
-#define EX_VAR(n) EX_VAR_2(execute_data, n)
-#define EX_VAR_NUM(n) EX_VAR_NUM_2(execute_data, n)
+#define EX_VAR(n) ZEND_CALL_VAR(execute_data, n)
+#define EX_VAR_NUM(n) ZEND_CALL_VAR_NUM(execute_data, n)
-#define EX_VAR_TO_NUM(n) (EX_VAR_2(NULL, n) - EX_VAR_NUM_2(NULL, 0))
+#define EX_VAR_TO_NUM(n) (ZEND_CALL_VAR(NULL, n) - ZEND_CALL_VAR_NUM(NULL, 0))
#define IS_CONST (1<<0)
#define IS_TMP_VAR (1<<1)
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 2fbd1d5011..a9fadd10da 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -525,12 +525,12 @@ static inline zval* make_real_object(zval *object_ptr TSRMLS_DC)
return object;
}
-ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, char **class_name, zend_class_entry **pce TSRMLS_DC)
+ZEND_API char * zend_verify_internal_arg_class_kind(const zend_internal_arg_info *cur_arg_info, char **class_name, zend_class_entry **pce TSRMLS_DC)
{
zend_string *key;
ALLOCA_FLAG(use_heap);
- STR_ALLOCA_INIT(key, cur_arg_info->class_name, cur_arg_info->class_name_len, use_heap);
+ STR_ALLOCA_INIT(key, cur_arg_info->class_name, strlen(cur_arg_info->class_name), use_heap);
*pce = zend_fetch_class(key, (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD) TSRMLS_CC);
STR_ALLOCA_FREE(key, use_heap);
@@ -542,6 +542,18 @@ ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, ch
}
}
+ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, char **class_name, zend_class_entry **pce TSRMLS_DC)
+{
+ *pce = zend_fetch_class(cur_arg_info->class_name, (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD) TSRMLS_CC);
+
+ *class_name = (*pce) ? (*pce)->name->val : cur_arg_info->class_name->val;
+ if (*pce && (*pce)->ce_flags & ZEND_ACC_INTERFACE) {
+ return "implement interface ";
+ } else {
+ return "be an instance of ";
+ }
+}
+
ZEND_API void zend_verify_arg_error(int error_type, const zend_function *zf, uint32_t arg_num, const char *need_msg, const char *need_kind, const char *given_msg, const char *given_kind, zval *arg TSRMLS_DC)
{
zend_execute_data *ptr = EG(current_execute_data)->prev_execute_data;
@@ -593,6 +605,55 @@ static int is_null_constant(zval *default_value TSRMLS_DC)
return 0;
}
+static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg TSRMLS_DC)
+{
+ zend_internal_arg_info *cur_arg_info;
+ char *need_msg;
+ zend_class_entry *ce;
+
+ if (UNEXPECTED(!zf->internal_function.arg_info)) {
+ return;
+ }
+
+ if (EXPECTED(arg_num <= zf->internal_function.num_args)) {
+ cur_arg_info = &zf->internal_function.arg_info[arg_num-1];
+ } else if (zf->internal_function.fn_flags & ZEND_ACC_VARIADIC) {
+ cur_arg_info = &zf->internal_function.arg_info[zf->internal_function.num_args-1];
+ } else {
+ return;
+ }
+
+ if (cur_arg_info->class_name) {
+ char *class_name;
+
+ ZVAL_DEREF(arg);
+ if (Z_TYPE_P(arg) == IS_OBJECT) {
+ need_msg = zend_verify_internal_arg_class_kind((zend_internal_arg_info*)cur_arg_info, &class_name, &ce TSRMLS_CC);
+ if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce TSRMLS_CC)) {
+ zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, need_msg, class_name, "instance of ", Z_OBJCE_P(arg)->name->val, arg TSRMLS_CC);
+ }
+ } else if (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null) {
+ need_msg = zend_verify_internal_arg_class_kind((zend_internal_arg_info*)cur_arg_info, &class_name, &ce TSRMLS_CC);
+ zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, need_msg, class_name, zend_zval_type_name(arg), "", arg TSRMLS_CC);
+ }
+ } else if (cur_arg_info->type_hint) {
+ if (cur_arg_info->type_hint == IS_ARRAY) {
+ ZVAL_DEREF(arg);
+ if (Z_TYPE_P(arg) != IS_ARRAY && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) {
+ zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", zend_zval_type_name(arg), "", arg TSRMLS_CC);
+ }
+ } else if (cur_arg_info->type_hint == IS_CALLABLE) {
+ if (!zend_is_callable(arg, IS_CALLABLE_CHECK_SILENT, NULL TSRMLS_CC) && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) {
+ zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be callable", "", zend_zval_type_name(arg), "", arg TSRMLS_CC);
+ }
+#if ZEND_DEBUG
+ } else {
+ zend_error(E_ERROR, "Unknown typehint");
+#endif
+ }
+ }
+}
+
static void zend_verify_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value TSRMLS_DC)
{
zend_arg_info *cur_arg_info;
@@ -1484,7 +1545,6 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
{
uint32_t first_extra_arg, num_args;
ZEND_ASSERT(EX(func) == (zend_function*)op_array);
- ZEND_ASSERT(EX(scope) == EG(scope));
EX(opline) = op_array->opcodes;
EX(call) = NULL;
@@ -1495,7 +1555,7 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
if (UNEXPECTED((op_array->fn_flags & ZEND_ACC_VARIADIC) != 0)) {
first_extra_arg--;
}
- num_args = EX(num_args);
+ num_args = EX_NUM_ARGS();
if (UNEXPECTED(num_args > first_extra_arg)) {
zval *end, *src, *dst;
@@ -1553,7 +1613,6 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
EX(opline) = op_array->opcodes;
EX(call) = NULL;
EX(return_value) = return_value;
- EX(scope) = EG(scope);
zend_attach_symbol_table(execute_data);
@@ -1578,7 +1637,6 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
EX(opline) = op_array->opcodes;
EX(call) = NULL;
EX(return_value) = return_value;
- EX(scope) = EG(scope);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_attach_symbol_table(execute_data);
@@ -1590,7 +1648,7 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
if (UNEXPECTED((op_array->fn_flags & ZEND_ACC_VARIADIC) != 0)) {
first_extra_arg--;
}
- num_args = EX(num_args);
+ num_args = EX_NUM_ARGS();
if (UNEXPECTED(num_args > first_extra_arg)) {
zval *end, *src, *dst;
@@ -1658,7 +1716,7 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
* restore it simply by replacing a pointer.
*/
zend_execute_data *execute_data;
- uint32_t num_args = call->num_args;
+ uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
size_t stack_size = (ZEND_CALL_FRAME_SLOT + MAX(op_array->last_var + op_array->T, num_args)) * sizeof(zval);
EG(vm_stack) = zend_vm_stack_new_page(
@@ -1670,13 +1728,13 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
EG(vm_stack_end) = EG(vm_stack)->end;
execute_data = zend_vm_stack_push_call_frame(
- VM_FRAME_TOP_FUNCTION,
+ ZEND_CALL_TOP_FUNCTION,
(zend_function*)op_array,
num_args,
call->called_scope,
Z_OBJ(call->This),
NULL TSRMLS_CC);
- EX(num_args) = num_args;
+ EX_NUM_ARGS() = num_args;
/* copy arguments */
if (num_args > 0) {
@@ -1690,7 +1748,6 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
}
EX(symbol_table) = NULL;
- EX(scope) = EG(scope);
i_init_func_execute_data(execute_data, op_array, return_value TSRMLS_CC);
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 8a621cf348..d4a46db043 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -48,6 +48,7 @@ ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char
ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC);
ZEND_API int zend_eval_stringl_ex(char *str, size_t str_len, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC);
+ZEND_API char * zend_verify_internal_arg_class_kind(const zend_internal_arg_info *cur_arg_info, char **class_name, zend_class_entry **pce TSRMLS_DC);
ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, char **class_name, zend_class_entry **pce TSRMLS_DC);
ZEND_API void zend_verify_arg_error(int error_type, const zend_function *zf, uint32_t arg_num, const char *need_msg, const char *need_kind, const char *given_msg, const char *given_kind, zval *arg TSRMLS_DC);
@@ -209,7 +210,7 @@ static zend_always_inline zval* zend_vm_stack_alloc(size_t size TSRMLS_DC)
return (zval*)top;
}
-static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t frame_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev TSRMLS_DC)
+static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev TSRMLS_DC)
{
uint32_t used_stack = ZEND_CALL_FRAME_SLOT + num_args;
zend_execute_data *call;
@@ -219,11 +220,11 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint3
}
call = (zend_execute_data*)zend_vm_stack_alloc(used_stack * sizeof(zval) TSRMLS_CC);
call->func = func;
- ZVAL_OBJ(&call->This, object);
+ Z_OBJ(call->This) = object;
+ ZEND_SET_CALL_INFO(call, call_info);
+ ZEND_CALL_NUM_ARGS(call) = 0;
call->called_scope = called_scope;
call->prev_execute_data = prev;
- call->frame_info = frame_info;
- call->num_args = 0;
return call;
}
@@ -231,9 +232,9 @@ static zend_always_inline void zend_vm_stack_free_extra_args(zend_execute_data *
{
uint32_t first_extra_arg = call->func->op_array.num_args - ((call->func->common.fn_flags & ZEND_ACC_VARIADIC) != 0);
- if (UNEXPECTED(call->num_args > first_extra_arg)) {
- zval *end = EX_VAR_NUM_2(call, call->func->op_array.last_var + call->func->op_array.T);
- zval *p = end + (call->num_args - first_extra_arg);
+ if (UNEXPECTED(ZEND_CALL_NUM_ARGS(call) > first_extra_arg)) {
+ zval *end = ZEND_CALL_VAR_NUM(call, call->func->op_array.last_var + call->func->op_array.T);
+ zval *p = end + (ZEND_CALL_NUM_ARGS(call) - first_extra_arg);
do {
p--;
zval_ptr_dtor_nogc(p);
@@ -243,7 +244,7 @@ static zend_always_inline void zend_vm_stack_free_extra_args(zend_execute_data *
static zend_always_inline void zend_vm_stack_free_args(zend_execute_data *call TSRMLS_DC)
{
- uint32_t num_args = call->num_args;
+ uint32_t num_args = ZEND_CALL_NUM_ARGS(call);
if (num_args > 0) {
zval *end = ZEND_CALL_ARG(call, 1);
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 480fb28f62..60ffb93ddc 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -736,7 +736,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
}
func = fci_cache->function_handler;
- call = zend_vm_stack_push_call_frame(VM_FRAME_TOP_FUNCTION,
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_FUNCTION,
func, fci->param_count, fci_cache->called_scope, fci_cache->object, NULL TSRMLS_CC);
calling_scope = fci_cache->calling_scope;
fci->object = fci_cache->object;
@@ -787,7 +787,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
!ARG_MAY_BE_SENT_BY_REF(func, i + 1)) {
if (i) {
/* hack to clean up the stack */
- call->num_args = i;
+ ZEND_CALL_NUM_ARGS(call) = i;
zend_vm_stack_free_args(call TSRMLS_CC);
}
zend_vm_stack_free_call_frame(call TSRMLS_CC);
@@ -827,7 +827,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
ZVAL_COPY(param, &fci->params[i]);
}
}
- call->num_args = fci->param_count;
+ ZEND_CALL_NUM_ARGS(call) = fci->param_count;
EG(scope) = calling_scope;
if (func->common.fn_flags & ZEND_ACC_STATIC) {
@@ -835,9 +835,8 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
}
if (!fci->object) {
Z_OBJ(call->This) = NULL;
- Z_TYPE_INFO(call->This) = IS_UNDEF;
} else {
- ZVAL_OBJ(&call->This, fci->object);
+ Z_OBJ(call->This) = fci->object;
GC_REFCOUNT(fci->object)++;
}
@@ -1538,7 +1537,7 @@ ZEND_API zend_array *zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
for (i = 0; i < ex->func->op_array.last_var; i++) {
zval zv;
- ZVAL_INDIRECT(&zv, EX_VAR_NUM_2(ex, i));
+ ZVAL_INDIRECT(&zv, ZEND_CALL_VAR_NUM(ex, i));
zend_hash_add_new(&symbol_table->ht,
ex->func->op_array.vars[i], &zv);
}
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index ef0b520eb0..2d1810ef78 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -58,7 +58,7 @@ static void zend_generator_cleanup_unfinished_execution(zend_generator *generato
zend_op *brk_opline = op_array->opcodes + brk_cont->brk;
if (brk_opline->opcode == ZEND_FREE) {
- zval *var = EX_VAR_2(execute_data, brk_opline->op1.var);
+ zval *var = EX_VAR(brk_opline->op1.var);
zval_ptr_dtor_nogc(var);
}
}
@@ -163,8 +163,9 @@ static void zend_generator_dtor_storage(zend_object *object TSRMLS_DC) /* {{{ */
/* If a finally block was found we jump directly to it and
* resume the generator. */
if (finally_op_num) {
- zval *fast_call = EX_VAR_2(ex, ex->func->op_array.opcodes[finally_op_end].op1.var);
+ zval *fast_call = ZEND_CALL_VAR(ex, ex->func->op_array.opcodes[finally_op_end].op1.var);
+ Z_OBJ_P(fast_call) = NULL;
fast_call->u2.lineno = (uint32_t)-1;
ex->opline = &ex->func->op_array.opcodes[finally_op_num];
generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
@@ -306,7 +307,7 @@ ZEND_API void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{
original_stack->top = EG(vm_stack_top);
/* Set executor globals */
EG(current_execute_data) = generator->execute_data;
- EG(scope) = generator->execute_data->scope;
+ EG(scope) = generator->execute_data->func->common.scope;
EG(vm_stack_top) = generator->stack->top;
EG(vm_stack_end) = generator->stack->end;
EG(vm_stack) = generator->stack;
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 43ef22074f..407acade0e 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -283,25 +283,40 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
if (fe_arg_info->class_name) {
zend_string *fe_class_name, *proto_class_name;
+ const char *class_name;
- if (!strcasecmp(fe_arg_info->class_name, "parent") && proto->common.scope) {
+ if (fe->type == ZEND_INTERNAL_FUNCTION) {
+ fe_class_name = NULL;
+ class_name = ((zend_internal_arg_info*)fe_arg_info)->class_name;
+ } else {
+ fe_class_name = fe_arg_info->class_name;
+ class_name = fe_arg_info->class_name->val;
+ }
+ if (!strcasecmp(class_name, "parent") && proto->common.scope) {
fe_class_name = zend_string_copy(proto->common.scope->name);
- } else if (!strcasecmp(fe_arg_info->class_name, "self") && fe->common.scope) {
+ } else if (!strcasecmp(class_name, "self") && fe->common.scope) {
fe_class_name = zend_string_copy(fe->common.scope->name);
+ } else if (fe_class_name) {
+ zend_string_addref(fe_class_name);
} else {
- fe_class_name = zend_string_init(
- fe_arg_info->class_name,
- fe_arg_info->class_name_len, 0);
+ fe_class_name = zend_string_init(class_name, strlen(class_name), 0);
}
- if (!strcasecmp(proto_arg_info->class_name, "parent") && proto->common.scope && proto->common.scope->parent) {
+ if (proto->type == ZEND_INTERNAL_FUNCTION) {
+ proto_class_name = NULL;
+ class_name = ((zend_internal_arg_info*)proto_arg_info)->class_name;
+ } else {
+ proto_class_name = proto_arg_info->class_name;
+ class_name = proto_arg_info->class_name->val;
+ }
+ if (!strcasecmp(class_name, "parent") && proto->common.scope && proto->common.scope->parent) {
proto_class_name = zend_string_copy(proto->common.scope->parent->name);
- } else if (!strcasecmp(proto_arg_info->class_name, "self") && proto->common.scope) {
+ } else if (!strcasecmp(class_name, "self") && proto->common.scope) {
proto_class_name = zend_string_copy(proto->common.scope->name);
+ } else if (proto_class_name) {
+ zend_string_addref(proto_class_name);
} else {
- proto_class_name = zend_string_init(
- proto_arg_info->class_name,
- proto_arg_info->class_name_len, 0);
+ proto_class_name = zend_string_init(class_name, strlen(class_name), 0);
}
if (strcasecmp(fe_class_name->val, proto_class_name->val)!=0) {
@@ -373,15 +388,21 @@ static zend_string *zend_get_function_declaration(zend_function *fptr TSRMLS_DC)
if (arg_info->class_name) {
const char *class_name;
size_t class_name_len;
- if (!strcasecmp(arg_info->class_name, "self") && fptr->common.scope) {
+
+ if (fptr->type == ZEND_INTERNAL_FUNCTION) {
+ class_name = ((zend_internal_arg_info*)arg_info)->class_name;
+ class_name_len = strlen(class_name);
+ } else {
+ class_name = arg_info->class_name->val;
+ class_name_len = arg_info->class_name->len;
+ }
+
+ if (!strcasecmp(class_name, "self") && fptr->common.scope) {
class_name = fptr->common.scope->name->val;
class_name_len = fptr->common.scope->name->len;
- } else if (!strcasecmp(arg_info->class_name, "parent") && fptr->common.scope->parent) {
+ } else if (!strcasecmp(class_name, "parent") && fptr->common.scope->parent) {
class_name = fptr->common.scope->parent->name->val;
class_name_len = fptr->common.scope->parent->name->len;
- } else {
- class_name = arg_info->class_name;
- class_name_len = arg_info->class_name_len;
}
smart_str_appendl(&str, class_name, class_name_len);
@@ -403,7 +424,11 @@ static zend_string *zend_get_function_declaration(zend_function *fptr TSRMLS_DC)
smart_str_appendc(&str, '$');
if (arg_info->name) {
- smart_str_appendl(&str, arg_info->name, arg_info->name_len);
+ if (fptr->type == ZEND_INTERNAL_FUNCTION) {
+ smart_str_appends(&str, ((zend_internal_arg_info*)arg_info)->name);
+ } else {
+ smart_str_appendl(&str, arg_info->name->val, arg_info->name->len);
+ }
} else {
smart_str_appends(&str, "param");
smart_str_append_unsigned(&str, i);
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 76f81e888f..226fe68a2f 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -29,6 +29,10 @@
#include "zend_ini_scanner.h"
#include "zend_extensions.h"
+#ifdef PHP_WIN32
+#include "win32/syslog.h"
+#endif
+
#define YYERROR_VERBOSE
#define YYSTYPE zval
@@ -177,10 +181,9 @@ static void ini_error(const char *msg)
if (CG(ini_parser_unbuffered_errors)) {
#ifdef PHP_WIN32
- MessageBox(NULL, error_buf, "PHP Error", MB_OK|MB_TOPMOST|0x00200000L);
-#else
- fprintf(stderr, "PHP: %s", error_buf);
+ syslog(LOG_ALERT, "PHP: %s (%s)", error_buf, GetCommandLine());
#endif
+ fprintf(stderr, "PHP: %s", error_buf);
} else {
zend_error(E_WARNING, "%s", error_buf);
}
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index 6dce8fb6ac..ab5fd6279d 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -84,6 +84,24 @@
} \
} while (0)
+#elif defined(__powerpc64__) && defined(__GNUC__)
+
+#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
+ long __tmpvar; \
+ __asm__("li 14, 0\n\t" \
+ "mtxer 14\n\t" \
+ "mulldo. %0, %2,%3\n\t" \
+ "xor %1, %1, %1\n\t" \
+ "bns+ 0f\n\t" \
+ "li %1, 1\n\t" \
+ "0:\n" \
+ : "=r"(__tmpvar),"=r"(usedval) \
+ : "r"(a), "r"(b) \
+ : "r14", "cc"); \
+ if (usedval) (dval) = (double) (a) * (double) (b); \
+ else (lval) = __tmpvar; \
+} while (0)
+
#elif SIZEOF_ZEND_LONG == 4
#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 1bbd35f40f..0ab110b52c 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -370,9 +370,9 @@ ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC)
}
if (op_array->arg_info) {
for (i=0; i<op_array->num_args; i++) {
- efree((char*)op_array->arg_info[i].name);
+ zend_string_release(op_array->arg_info[i].name);
if (op_array->arg_info[i].class_name) {
- efree((char*)op_array->arg_info[i].class_name);
+ zend_string_release(op_array->arg_info[i].class_name);
}
}
efree(op_array->arg_info);
@@ -719,20 +719,20 @@ ZEND_API int pass_two(zend_op_array *op_array TSRMLS_DC)
if (opline->op1_type == IS_CONST) {
opline->op1.zv = &op_array->literals[opline->op1.constant];
} else if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) {
- opline->op1.var = (uint32_t)(zend_intptr_t)EX_VAR_NUM_2(NULL, op_array->last_var + opline->op1.var);
+ opline->op1.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op1.var);
}
if (opline->op2_type == IS_CONST) {
opline->op2.zv = &op_array->literals[opline->op2.constant];
} else if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) {
- opline->op2.var = (uint32_t)(zend_intptr_t)EX_VAR_NUM_2(NULL, op_array->last_var + opline->op2.var);
+ opline->op2.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op2.var);
}
if (opline->result_type & (IS_VAR|IS_TMP_VAR)) {
- opline->result.var = (uint32_t)(zend_intptr_t)EX_VAR_NUM_2(NULL, op_array->last_var + opline->result.var);
+ opline->result.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->result.var);
}
switch (opline->opcode) {
case ZEND_DECLARE_INHERITED_CLASS:
case ZEND_DECLARE_INHERITED_CLASS_DELAYED:
- opline->extended_value = (uint32_t)(zend_intptr_t)EX_VAR_NUM_2(NULL, op_array->last_var + opline->extended_value);
+ opline->extended_value = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->extended_value);
break;
case ZEND_GOTO:
if (Z_TYPE_P(opline->op2.zv) != IS_LONG) {
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index b07a62668c..c444bd41fb 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -112,7 +112,7 @@ struct _zval_struct {
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
- zend_uchar reserved) /* various IS_VAR flags */
+ zend_uchar reserved) /* call info for EX(This) */
} v;
uint32_t type_info;
} u1;
@@ -121,6 +121,7 @@ struct _zval_struct {
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
+ uint32_t num_args; /* arguments number for EX(This) */
} u2;
};
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 760f5f99f7..42b2acf698 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -25,7 +25,7 @@
* php zend_vm_gen.php
*/
-ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -40,7 +40,7 @@ ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -55,7 +55,7 @@ ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -70,7 +70,7 @@ ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -176,7 +176,7 @@ ZEND_VM_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -192,7 +192,7 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -208,7 +208,7 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -224,7 +224,7 @@ ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
+ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
{
USE_OPLINE
zend_free_op free_op1, free_op2;
@@ -783,9 +783,9 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -942,13 +942,9 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
- }
+ ZVAL_DEREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
increment_function(var_ptr);
@@ -982,13 +978,9 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
- }
+ ZVAL_DEREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
decrement_function(var_ptr);
@@ -1736,9 +1728,9 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
{
- vm_frame_kind frame_kind = VM_FRAME_KIND(EX(frame_info));
+ zend_call_kind call_kind = EX_CALL_KIND();
- if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
+ if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
zend_object *object;
i_free_compiled_variables(execute_data TSRMLS_CC);
@@ -1766,7 +1758,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
}
OBJ_RELEASE(object);
}
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
if (UNEXPECTED(EG(exception) != NULL)) {
const zend_op *opline = EX(opline);
@@ -1780,7 +1772,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
- } else if (frame_kind == VM_FRAME_NESTED_CODE) {
+ } else if (call_kind == ZEND_CALL_NESTED_CODE) {
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array TSRMLS_CC);
efree_size(EX(func), sizeof(zend_op_array));
@@ -1798,7 +1790,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
} else {
- if (frame_kind == VM_FRAME_TOP_FUNCTION) {
+ if (call_kind == ZEND_CALL_TOP_FUNCTION) {
i_free_compiled_variables(execute_data TSRMLS_CC);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EX(symbol_table) TSRMLS_CC);
@@ -1808,7 +1800,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
if ((EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) && EX(func)->op_array.prototype) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
- } else /* if (frame_kind == VM_FRAME_TOP_CODE) */ {
+ } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
zend_array *symbol_table = EX(symbol_table);
zend_execute_data *old_execute_data;
@@ -2002,7 +1994,7 @@ ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMP|VAR|CV, ANY)
ZEND_VM_JMP(opline);
}
-ZEND_VM_HANDLER(70, ZEND_FREE, TMP|VAR, ANY)
+ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY)
{
USE_OPLINE
@@ -2068,7 +2060,9 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV)
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (OP2_TYPE != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -2233,7 +2227,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
FREE_OP2();
@@ -2356,7 +2350,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (OP2_TYPE == IS_UNUSED) {
@@ -2385,7 +2379,7 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
/*CHECK_EXCEPTION();*/
@@ -2395,12 +2389,10 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
- zval *function_name_ptr;
SAVE_OPLINE();
- function_name_ptr = function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
+ function_name = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
- ZVAL_DEREF(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
if (Z_STRVAL_P(function_name)[0] == '\\') {
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
@@ -2425,10 +2417,9 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
if (object) {
GC_REFCOUNT(object)++;
}
- if (OP2_TYPE == IS_VAR && OP2_FREE && Z_REFCOUNT_P(function_name) == 1 &&
- fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (OP2_TYPE == IS_VAR && (fbc->common.fn_flags & ZEND_ACC_CLOSURE)) {
/* Delay closure destruction until its invocation */
- fbc->common.prototype = (zend_function*)Z_OBJ_P(function_name_ptr);
+ fbc->common.prototype = (zend_function*)Z_OBJ_P(free_op2);
} else if (OP2_TYPE == IS_CV) {
FREE_OP2();
}
@@ -2505,7 +2496,7 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
zend_error_noreturn(E_ERROR, "Function name must be a string");
ZEND_VM_CONTINUE(); /* Never reached */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -2559,7 +2550,7 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMP|VAR|CV)
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
func, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
FREE_OP2();
@@ -2591,7 +2582,7 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
@@ -2615,7 +2606,7 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
FREE_OP2();
@@ -2674,8 +2665,8 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
uint32_t i;
zval *p = ZEND_CALL_ARG(call, 1);
- for (i = 0; i < call->num_args; ++i) {
- zend_verify_arg_type(fbc, i + 1, p, NULL TSRMLS_CC);
+ for (i = 0; i < ZEND_CALL_NUM_ARGS(call); ++i) {
+ zend_verify_internal_arg_type(fbc, i + 1, p TSRMLS_CC);
p++;
}
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -2717,7 +2708,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
ZEND_VM_C_GOTO(fcall_end);
}
} else if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- call->scope = EG(scope) = fbc->common.scope;
+ EG(scope) = fbc->common.scope;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
zend_generator_create_zval(call, &fbc->op_array, EX_VAR(opline->result.var) TSRMLS_CC);
@@ -2743,9 +2734,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_INFO(
- VM_FRAME_TOP_FUNCTION,
- VM_FRAME_FLAGS(call->frame_info));
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
}
@@ -2794,7 +2783,7 @@ ZEND_VM_C_LABEL(fcall_end_change_scope):
}
OBJ_RELEASE(object);
}
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
ZEND_VM_C_LABEL(fcall_end):
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -3000,7 +2989,7 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
SAVE_OPLINE();
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (OP1_TYPE == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -3022,7 +3011,7 @@ ZEND_VM_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, ANY)
}
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (OP1_TYPE == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -3040,7 +3029,7 @@ ZEND_VM_HANDLER(117, ZEND_SEND_VAR, VAR|CV, ANY)
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
FREE_OP1();
@@ -3085,7 +3074,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, varptr);
CHECK_EXCEPTION();
@@ -3106,7 +3095,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, ANY)
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if (OP1_TYPE == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
ZEND_VM_NEXT_OPCODE();
@@ -3139,7 +3128,7 @@ ZEND_VM_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, ANY)
}
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
FREE_OP1();
@@ -3161,7 +3150,7 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY)
SAVE_OPLINE();
args = GET_OP1_ZVAL_PTR(BP_VAR_R);
- arg_num = EX(call)->num_args + 1;
+ arg_num = ZEND_CALL_NUM_ARGS(EX(call)) + 1;
ZEND_VM_C_LABEL(send_again):
switch (Z_TYPE_P(args)) {
@@ -3212,7 +3201,7 @@ ZEND_VM_C_LABEL(send_again):
ZVAL_COPY(top, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
} ZEND_HASH_FOREACH_END();
@@ -3293,7 +3282,7 @@ ZEND_VM_C_LABEL(send_again):
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1 TSRMLS_CC);
top = ZEND_CALL_ARG(EX(call), arg_num);
ZVAL_COPY_VALUE(top, arg);
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
iter->funcs->move_forward(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -3425,7 +3414,7 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY)
} else {
ZVAL_COPY(param, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
param++;
} ZEND_HASH_FOREACH_END();
@@ -3507,7 +3496,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY)
ZVAL_COPY(param, arg);
}
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
FREE_OP1();
CHECK_EXCEPTION();
@@ -3520,7 +3509,7 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY)
uint32_t arg_num = opline->op1.num;
SAVE_OPLINE();
- if (UNEXPECTED(arg_num > EX(num_args))) {
+ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
zend_verify_missing_arg(execute_data, arg_num TSRMLS_CC);
CHECK_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
@@ -3541,7 +3530,7 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
SAVE_OPLINE();
param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
- if (arg_num > EX(num_args)) {
+ if (arg_num > EX_NUM_ARGS()) {
ZVAL_COPY_VALUE(param, opline->op2.zv);
if (Z_OPT_CONSTANT_P(param)) {
zval_update_constant(param, 0 TSRMLS_CC);
@@ -3565,7 +3554,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY)
{
USE_OPLINE
uint32_t arg_num = opline->op1.num;
- uint32_t arg_count = EX(num_args);
+ uint32_t arg_count = EX_NUM_ARGS();
zval *params;
SAVE_OPLINE();
@@ -3716,10 +3705,8 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY)
} else {
/* We are not handling overloaded classes right now */
EX(call) = zend_vm_stack_push_call_frame(
- VM_FRAME_INFO(
- VM_FRAME_NESTED_FUNCTION,
- RETURN_VALUE_USED(opline) ?
- ZEND_CALL_CTOR : (ZEND_CALL_CTOR | ZEND_CALL_CTOR_RESULT_UNUSED)),
+ ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
+ (RETURN_VALUE_USED(opline) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
ce,
@@ -3773,14 +3760,14 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY)
if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
- if (UNEXPECTED(ce != EX(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(ce != EG(scope))) {
+ zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EX(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
+ zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
}
}
@@ -3874,7 +3861,7 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
if (Z_CONSTANT_P(value)) {
EG(scope) = ce;
zval_update_constant(value, 1 TSRMLS_CC);
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
}
if (OP1_TYPE == IS_CONST) {
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), value);
@@ -4208,7 +4195,9 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)
return_value = EX_VAR(opline->result.var);
}
- call = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_CODE,
+ new_op_array->scope = EG(scope); /* ??? */
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
(zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
@@ -4222,7 +4211,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_TOP_CODE;
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
@@ -4329,8 +4318,8 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
}
if (OP1_TYPE != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -4413,7 +4402,9 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
}
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
- ZVAL_DEREF(container);
+ if (OP1_TYPE != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (OP1_TYPE == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((OP2_TYPE == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -5458,12 +5449,14 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
int i;
uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0;
+ int in_finally = 0;
for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
if (EX(func)->op_array.try_catch_array[i].try_op > op_num) {
/* further blocks will not be relevant... */
break;
}
+ in_finally = 0;
if (op_num < EX(func)->op_array.try_catch_array[i].catch_op) {
catch_op_num = EX(func)->op_array.try_catch_array[i].catch_op;
}
@@ -5474,6 +5467,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
if (op_num >= EX(func)->op_array.try_catch_array[i].finally_op &&
op_num < EX(func)->op_array.try_catch_array[i].finally_end) {
finally_op_end = EX(func)->op_array.try_catch_array[i].finally_end;
+ in_finally = 1;
}
}
@@ -5485,8 +5479,8 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
zend_vm_stack_free_args(EX(call) TSRMLS_CC);
if (Z_OBJ(call->This)) {
- if (call->frame_info & ZEND_CALL_CTOR) {
- if (!(call->frame_info & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+ if (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR) {
+ if (!(ZEND_CALL_INFO(call) & ZEND_CALL_CTOR_RESULT_UNUSED)) {
GC_REFCOUNT(Z_OBJ(call->This))--;
}
if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
@@ -5529,7 +5523,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) {
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
- if (Z_OBJ_P(fast_call)) {
+ if (in_finally && Z_OBJ_P(fast_call)) {
zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call) TSRMLS_CC);
}
Z_OBJ_P(fast_call) = EG(exception);
@@ -5537,20 +5531,9 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
fast_call->u2.lineno = (uint32_t)-1;
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[finally_op_num]);
ZEND_VM_CONTINUE();
- } else if (catch_op_num) {
- if (finally_op_end && catch_op_num > finally_op_end) {
- /* we are going out of current finally scope */
- zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
-
- if (Z_OBJ_P(fast_call)) {
- zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call) TSRMLS_CC);
- Z_OBJ_P(fast_call) = NULL;
- }
- }
- ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]);
- ZEND_VM_CONTINUE();
} else {
- if (finally_op_end) {
+ if (in_finally) {
+ /* we are going out of current finally scope */
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
if (Z_OBJ_P(fast_call)) {
@@ -5558,7 +5541,10 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
Z_OBJ_P(fast_call) = NULL;
}
}
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
+ if (catch_op_num) {
+ ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]);
+ ZEND_VM_CONTINUE();
+ } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_GENERATOR_RETURN);
} else {
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
@@ -5657,7 +5643,7 @@ ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
if (closure_is_static || closure_is_being_defined_inside_static_context) {
zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(called_scope), NULL TSRMLS_CC);
} else {
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC);
+ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC);
}
CHECK_EXCEPTION();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index dc3ee25c52..89c220aef1 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -369,7 +369,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value TSRMLS_DC
return;
}
- execute_data = zend_vm_stack_push_call_frame(VM_FRAME_TOP_CODE,
+ execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE,
(zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL, NULL TSRMLS_CC);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table(TSRMLS_C);
@@ -383,9 +383,9 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value TSRMLS_DC
static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
- vm_frame_kind frame_kind = VM_FRAME_KIND(EX(frame_info));
+ zend_call_kind call_kind = EX_CALL_KIND();
- if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
+ if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
zend_object *object;
i_free_compiled_variables(execute_data TSRMLS_CC);
@@ -413,7 +413,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
}
OBJ_RELEASE(object);
}
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
if (UNEXPECTED(EG(exception) != NULL)) {
const zend_op *opline = EX(opline);
@@ -427,7 +427,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
- } else if (frame_kind == VM_FRAME_NESTED_CODE) {
+ } else if (call_kind == ZEND_CALL_NESTED_CODE) {
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array TSRMLS_CC);
efree_size(EX(func), sizeof(zend_op_array));
@@ -445,7 +445,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
} else {
- if (frame_kind == VM_FRAME_TOP_FUNCTION) {
+ if (call_kind == ZEND_CALL_TOP_FUNCTION) {
i_free_compiled_variables(execute_data TSRMLS_CC);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EX(symbol_table) TSRMLS_CC);
@@ -455,7 +455,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
if ((EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) && EX(func)->op_array.prototype) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
- } else /* if (frame_kind == VM_FRAME_TOP_CODE) */ {
+ } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
zend_array *symbol_table = EX(symbol_table);
zend_execute_data *old_execute_data;
@@ -537,8 +537,8 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
uint32_t i;
zval *p = ZEND_CALL_ARG(call, 1);
- for (i = 0; i < call->num_args; ++i) {
- zend_verify_arg_type(fbc, i + 1, p, NULL TSRMLS_CC);
+ for (i = 0; i < ZEND_CALL_NUM_ARGS(call); ++i) {
+ zend_verify_internal_arg_type(fbc, i + 1, p TSRMLS_CC);
p++;
}
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -580,7 +580,7 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
goto fcall_end;
}
} else if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
- call->scope = EG(scope) = fbc->common.scope;
+ EG(scope) = fbc->common.scope;
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
zend_generator_create_zval(call, &fbc->op_array, EX_VAR(opline->result.var) TSRMLS_CC);
@@ -606,9 +606,7 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_INFO(
- VM_FRAME_TOP_FUNCTION,
- VM_FRAME_FLAGS(call->frame_info));
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
}
@@ -657,7 +655,7 @@ fcall_end_change_scope:
}
OBJ_RELEASE(object);
}
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
fcall_end:
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -692,7 +690,7 @@ static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
SAVE_OPLINE();
args = get_zval_ptr(opline->op1_type, &opline->op1, execute_data, &free_op1, BP_VAR_R);
- arg_num = EX(call)->num_args + 1;
+ arg_num = ZEND_CALL_NUM_ARGS(EX(call)) + 1;
send_again:
switch (Z_TYPE_P(args)) {
@@ -743,7 +741,7 @@ send_again:
ZVAL_COPY(top, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
} ZEND_HASH_FOREACH_END();
@@ -824,7 +822,7 @@ send_again:
zend_vm_stack_extend_call_frame(&EX(call), arg_num - 1, 1 TSRMLS_CC);
top = ZEND_CALL_ARG(EX(call), arg_num);
ZVAL_COPY_VALUE(top, arg);
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
iter->funcs->move_forward(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
@@ -956,7 +954,7 @@ static int ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
ZVAL_COPY(param, arg);
}
- EX(call)->num_args++;
+ ZEND_CALL_NUM_ARGS(EX(call))++;
arg_num++;
param++;
} ZEND_HASH_FOREACH_END();
@@ -972,7 +970,7 @@ static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
uint32_t arg_num = opline->op1.num;
SAVE_OPLINE();
- if (UNEXPECTED(arg_num > EX(num_args))) {
+ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) {
zend_verify_missing_arg(execute_data, arg_num TSRMLS_CC);
CHECK_EXCEPTION();
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
@@ -989,7 +987,7 @@ static int ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_AR
{
USE_OPLINE
uint32_t arg_num = opline->op1.num;
- uint32_t arg_count = EX(num_args);
+ uint32_t arg_count = EX_NUM_ARGS();
zval *params;
SAVE_OPLINE();
@@ -1203,12 +1201,14 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
int i;
uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0;
+ int in_finally = 0;
for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
if (EX(func)->op_array.try_catch_array[i].try_op > op_num) {
/* further blocks will not be relevant... */
break;
}
+ in_finally = 0;
if (op_num < EX(func)->op_array.try_catch_array[i].catch_op) {
catch_op_num = EX(func)->op_array.try_catch_array[i].catch_op;
}
@@ -1219,6 +1219,7 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
if (op_num >= EX(func)->op_array.try_catch_array[i].finally_op &&
op_num < EX(func)->op_array.try_catch_array[i].finally_end) {
finally_op_end = EX(func)->op_array.try_catch_array[i].finally_end;
+ in_finally = 1;
}
}
@@ -1230,8 +1231,8 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
zend_vm_stack_free_args(EX(call) TSRMLS_CC);
if (Z_OBJ(call->This)) {
- if (call->frame_info & ZEND_CALL_CTOR) {
- if (!(call->frame_info & ZEND_CALL_CTOR_RESULT_UNUSED)) {
+ if (ZEND_CALL_INFO(call) & ZEND_CALL_CTOR) {
+ if (!(ZEND_CALL_INFO(call) & ZEND_CALL_CTOR_RESULT_UNUSED)) {
GC_REFCOUNT(Z_OBJ(call->This))--;
}
if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
@@ -1274,7 +1275,7 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) {
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
- if (Z_OBJ_P(fast_call)) {
+ if (in_finally && Z_OBJ_P(fast_call)) {
zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call) TSRMLS_CC);
}
Z_OBJ_P(fast_call) = EG(exception);
@@ -1282,20 +1283,9 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
fast_call->u2.lineno = (uint32_t)-1;
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[finally_op_num]);
ZEND_VM_CONTINUE();
- } else if (catch_op_num) {
- if (finally_op_end && catch_op_num > finally_op_end) {
- /* we are going out of current finally scope */
- zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
-
- if (Z_OBJ_P(fast_call)) {
- zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call) TSRMLS_CC);
- Z_OBJ_P(fast_call) = NULL;
- }
- }
- ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]);
- ZEND_VM_CONTINUE();
} else {
- if (finally_op_end) {
+ if (in_finally) {
+ /* we are going out of current finally scope */
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var);
if (Z_OBJ_P(fast_call)) {
@@ -1303,7 +1293,10 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
Z_OBJ_P(fast_call) = NULL;
}
}
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
+ if (catch_op_num) {
+ ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]);
+ ZEND_VM_CONTINUE();
+ } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
return ZEND_GENERATOR_RETURN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -1475,22 +1468,20 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
/*CHECK_EXCEPTION();*/
ZEND_VM_NEXT_OPCODE();
} else {
zend_string *lcname;
-
+ zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
- zval *function_name_ptr;
SAVE_OPLINE();
- function_name_ptr = function_name = opline->op2.zv;
+ function_name = opline->op2.zv;
- ZVAL_DEREF(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
if (Z_STRVAL_P(function_name)[0] == '\\') {
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
@@ -1514,10 +1505,9 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
if (object) {
GC_REFCOUNT(object)++;
}
- if (IS_CONST == IS_VAR && 0 && Z_REFCOUNT_P(function_name) == 1 &&
- fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (IS_CONST == IS_VAR && (fbc->common.fn_flags & ZEND_ACC_CLOSURE)) {
/* Delay closure destruction until its invocation */
- fbc->common.prototype = (zend_function*)Z_OBJ_P(function_name_ptr);
+ fbc->common.prototype = (zend_function*)Z_OBJ_P(free_op2);
} else if (IS_CONST == IS_CV) {
}
@@ -1594,7 +1584,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
zend_error_noreturn(E_ERROR, "Function name must be a string");
ZEND_VM_CONTINUE(); /* Never reached */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -1626,7 +1616,7 @@ static int ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPC
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
@@ -1650,7 +1640,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
ZEND_VM_NEXT_OPCODE();
@@ -1664,7 +1654,7 @@ static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_
SAVE_OPLINE();
param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
- if (arg_num > EX(num_args)) {
+ if (arg_num > EX_NUM_ARGS()) {
ZVAL_COPY_VALUE(param, opline->op2.zv);
if (Z_OPT_CONSTANT_P(param)) {
zval_update_constant(param, 0 TSRMLS_CC);
@@ -1811,7 +1801,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_H
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
/*CHECK_EXCEPTION();*/
@@ -1821,12 +1811,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_H
zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
- zval *function_name_ptr;
SAVE_OPLINE();
- function_name_ptr = function_name = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
+ function_name = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
if (Z_STRVAL_P(function_name)[0] == '\\') {
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
@@ -1851,10 +1839,9 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_H
if (object) {
GC_REFCOUNT(object)++;
}
- if (IS_TMP_VAR == IS_VAR && 1 && Z_REFCOUNT_P(function_name) == 1 &&
- fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (IS_TMP_VAR == IS_VAR && (fbc->common.fn_flags & ZEND_ACC_CLOSURE)) {
/* Delay closure destruction until its invocation */
- fbc->common.prototype = (zend_function*)Z_OBJ_P(function_name_ptr);
+ fbc->common.prototype = (zend_function*)Z_OBJ_P(free_op2);
} else if (IS_TMP_VAR == IS_CV) {
zval_ptr_dtor_nogc(free_op2);
}
@@ -1931,7 +1918,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_H
zend_error_noreturn(E_ERROR, "Function name must be a string");
ZEND_VM_CONTINUE(); /* Never reached */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -1997,7 +1984,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
/*CHECK_EXCEPTION();*/
@@ -2007,12 +1994,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
- zval *function_name_ptr;
SAVE_OPLINE();
- function_name_ptr = function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
+ function_name = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
if (Z_STRVAL_P(function_name)[0] == '\\') {
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
@@ -2037,10 +2022,9 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
if (object) {
GC_REFCOUNT(object)++;
}
- if (IS_VAR == IS_VAR && (free_op2 != NULL) && Z_REFCOUNT_P(function_name) == 1 &&
- fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (IS_VAR == IS_VAR && (fbc->common.fn_flags & ZEND_ACC_CLOSURE)) {
/* Delay closure destruction until its invocation */
- fbc->common.prototype = (zend_function*)Z_OBJ_P(function_name_ptr);
+ fbc->common.prototype = (zend_function*)Z_OBJ_P(free_op2);
} else if (IS_VAR == IS_CV) {
zval_ptr_dtor_nogc(free_op2);
}
@@ -2117,7 +2101,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
zend_error_noreturn(E_ERROR, "Function name must be a string");
ZEND_VM_CONTINUE(); /* Never reached */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -2221,22 +2205,20 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);
/*CHECK_EXCEPTION();*/
ZEND_VM_NEXT_OPCODE();
} else {
zend_string *lcname;
-
+ zend_free_op free_op2;
zend_class_entry *called_scope;
zend_object *object;
- zval *function_name_ptr;
SAVE_OPLINE();
- function_name_ptr = function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
+ function_name = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- ZVAL_DEREF(function_name);
if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
if (Z_STRVAL_P(function_name)[0] == '\\') {
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
@@ -2260,10 +2242,9 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
if (object) {
GC_REFCOUNT(object)++;
}
- if (IS_CV == IS_VAR && 0 && Z_REFCOUNT_P(function_name) == 1 &&
- fbc->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (IS_CV == IS_VAR && (fbc->common.fn_flags & ZEND_ACC_CLOSURE)) {
/* Delay closure destruction until its invocation */
- fbc->common.prototype = (zend_function*)Z_OBJ_P(function_name_ptr);
+ fbc->common.prototype = (zend_function*)Z_OBJ_P(free_op2);
} else if (IS_CV == IS_CV) {
}
@@ -2340,7 +2321,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
zend_error_noreturn(E_ERROR, "Function name must be a string");
ZEND_VM_CONTINUE(); /* Never reached */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -2688,7 +2669,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
SAVE_OPLINE();
value = opline->op1.zv;
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -2710,7 +2691,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLE
}
value = opline->op1.zv;
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_CONST == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -2778,10 +2759,8 @@ static int ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
/* We are not handling overloaded classes right now */
EX(call) = zend_vm_stack_push_call_frame(
- VM_FRAME_INFO(
- VM_FRAME_NESTED_FUNCTION,
- RETURN_VALUE_USED(opline) ?
- ZEND_CALL_CTOR : (ZEND_CALL_CTOR | ZEND_CALL_CTOR_RESULT_UNUSED)),
+ ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
+ (RETURN_VALUE_USED(opline) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
ce,
@@ -2835,14 +2814,14 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
- if (UNEXPECTED(ce != EX(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(ce != EG(scope))) {
+ zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EX(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
+ zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
}
}
@@ -3051,7 +3030,9 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA
return_value = EX_VAR(opline->result.var);
}
- call = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_CODE,
+ new_op_array->scope = EG(scope); /* ??? */
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
(zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
@@ -3065,7 +3046,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_TOP_CODE;
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
@@ -4265,7 +4246,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_CONST == IS_UNUSED) {
@@ -4322,7 +4303,7 @@ static int ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCO
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
func, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -4422,7 +4403,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCO
if (Z_CONSTANT_P(value)) {
EG(scope) = ce;
zval_update_constant(value, 1 TSRMLS_CC);
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
}
if (IS_CONST == IS_CONST) {
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), value);
@@ -5031,66 +5012,6 @@ static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -5182,70 +5103,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCO
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- opline->op1.zv,
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -5627,7 +5484,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZE
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_TMP_VAR == IS_UNUSED) {
@@ -5684,7 +5541,7 @@ static int ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
func, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -6120,66 +5977,6 @@ static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -6271,70 +6068,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCO
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- opline->op1.zv,
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -6864,7 +6597,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_VAR == IS_UNUSED) {
@@ -6921,7 +6654,7 @@ static int ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
func, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -7800,7 +7533,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_UNUSED == IS_UNUSED) {
@@ -8094,7 +7827,7 @@ static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER
if (closure_is_static || closure_is_being_defined_inside_static_context) {
zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(called_scope), NULL TSRMLS_CC);
} else {
- zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC);
+ zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EG(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC);
}
CHECK_EXCEPTION();
@@ -8826,7 +8559,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_CV == IS_UNUSED) {
@@ -8883,7 +8616,7 @@ static int ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_
object = NULL;
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
func, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);
CHECK_EXCEPTION();
@@ -9366,6 +9099,130 @@ static int ZEND_FASTCALL ZEND_POW_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZEND_VM_NEXT_OPCODE();
}
+static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_add_function(EX_VAR(opline->result.var),
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_sub_function(EX_VAR(opline->result.var),
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_mul_function(EX_VAR(opline->result.var),
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_div_function(EX_VAR(opline->result.var),
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_equal_function(result,
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_not_equal_function(result,
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_function(result,
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_or_equal_function(result,
+ opline->op1.zv,
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -9579,16 +9436,6 @@ static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZEND_VM_JMP(opline);
}
-static int ZEND_FASTCALL ZEND_FREE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -9717,7 +9564,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
SAVE_OPLINE();
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -9739,7 +9586,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_
}
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, value);
if (IS_TMP_VAR == IS_CONST) {
if (UNEXPECTED(Z_OPT_COPYABLE_P(arg))) {
@@ -9799,14 +9646,14 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
- if (UNEXPECTED(ce != EX(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(ce != EG(scope))) {
+ zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EX(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
+ zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
}
}
@@ -10016,7 +9863,9 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND
return_value = EX_VAR(opline->result.var);
}
- call = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_CODE,
+ new_op_array->scope = EG(scope); /* ??? */
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
(zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
@@ -10030,7 +9879,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_TOP_CODE;
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
@@ -10450,66 +10299,6 @@ static int ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -10601,70 +10390,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -11248,7 +10973,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCO
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
@@ -11867,66 +11592,6 @@ static int ZEND_FASTCALL ZEND_POW_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -12018,70 +11683,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -12368,7 +11969,9 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (IS_TMP_VAR != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -12492,7 +12095,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -12929,66 +12532,6 @@ static int ZEND_FASTCALL ZEND_POW_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -13080,70 +12623,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -13578,7 +13057,9 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (IS_VAR != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -13702,7 +13183,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -14906,66 +14387,6 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
ZEND_VM_RETURN();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -15057,70 +14478,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -15405,7 +14762,9 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (IS_CV != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -15528,7 +14887,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
@@ -16098,13 +15457,9 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZEND_VM_NEXT_OPCODE();
}
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
- }
+ ZVAL_DEREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
increment_function(var_ptr);
@@ -16138,13 +15493,9 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZEND_VM_NEXT_OPCODE();
}
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
- }
+ ZVAL_DEREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
decrement_function(var_ptr);
@@ -16340,16 +15691,6 @@ static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZEND_VM_JMP(opline);
}
-static int ZEND_FASTCALL ZEND_FREE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -16478,7 +15819,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
zval_ptr_dtor_nogc(free_op1);
@@ -16523,7 +15864,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, varptr);
CHECK_EXCEPTION();
@@ -16544,7 +15885,7 @@ static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if (IS_VAR == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
ZEND_VM_NEXT_OPCODE();
@@ -16577,7 +15918,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
}
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
zval_ptr_dtor_nogc(free_op1);
@@ -16662,7 +16003,7 @@ static int ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
ZVAL_COPY(param, arg);
}
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
zval_ptr_dtor_nogc(free_op1);
CHECK_EXCEPTION();
@@ -16728,10 +16069,8 @@ static int ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
/* We are not handling overloaded classes right now */
EX(call) = zend_vm_stack_push_call_frame(
- VM_FRAME_INFO(
- VM_FRAME_NESTED_FUNCTION,
- RETURN_VALUE_USED(opline) ?
- ZEND_CALL_CTOR : (ZEND_CALL_CTOR | ZEND_CALL_CTOR_RESULT_UNUSED)),
+ ZEND_CALL_FUNCTION | ZEND_CALL_CTOR |
+ (RETURN_VALUE_USED(opline) ? 0 : ZEND_CALL_CTOR_RESULT_UNUSED),
constructor,
opline->extended_value,
ce,
@@ -16785,14 +16124,14 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
- if (UNEXPECTED(ce != EX(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(ce != EG(scope))) {
+ zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EX(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
+ zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
}
}
@@ -17003,7 +16342,9 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
return_value = EX_VAR(opline->result.var);
}
- call = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_CODE,
+ new_op_array->scope = EG(scope); /* ??? */
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
(zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
@@ -17017,7 +16358,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_TOP_CODE;
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
@@ -17676,66 +17017,6 @@ static int ZEND_FASTCALL ZEND_TYPE_CHECK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -17827,70 +17108,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- opline->op2.zv TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -18404,9 +17621,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -19195,7 +18412,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op1);
@@ -19317,7 +18534,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_CONST == IS_UNUSED) {
@@ -19421,7 +18638,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE
if (Z_CONSTANT_P(value)) {
EG(scope) = ce;
zval_update_constant(value, 1 TSRMLS_CC);
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
}
if (IS_VAR == IS_CONST) {
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), value);
@@ -19650,8 +18867,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
}
if (IS_VAR != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = opline->op2.zv;
if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -19734,7 +18951,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
}
offset = opline->op2.zv;
- ZVAL_DEREF(container);
+ if (IS_VAR != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -20156,66 +19375,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
return zend_binary_assign_op_helper_SPEC_VAR_CONST(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -20307,70 +19466,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -20888,9 +19983,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -21501,7 +20596,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -21624,7 +20719,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_TMP_VAR == IS_UNUSED) {
@@ -21785,8 +20880,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE
}
if (IS_VAR != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -21869,7 +20964,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE
}
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(container);
+ if (IS_VAR != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -22182,66 +21279,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
return zend_binary_assign_op_helper_SPEC_VAR_TMP(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -22333,70 +21370,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1, free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -22914,9 +21887,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -23741,7 +22714,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -23864,7 +22837,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_VAR == IS_UNUSED) {
@@ -24100,8 +23073,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
}
if (IS_VAR != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -24184,7 +23157,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(container);
+ if (IS_VAR != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -25339,7 +24314,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_UNUSED == IS_UNUSED) {
@@ -25771,66 +24746,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA
return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -25922,70 +24837,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op1;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- zval_ptr_dtor_nogc(free_op1);
-
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -26499,9 +25350,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -27173,7 +26024,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op1);
@@ -27295,7 +26146,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_
}
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);
if (IS_CV == IS_UNUSED) {
@@ -27455,8 +26306,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER
}
if (IS_VAR != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -27539,7 +26390,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- ZVAL_DEREF(container);
+ if (IS_VAR != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -27885,14 +26738,14 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
- if (UNEXPECTED(ce != EX(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(ce != EG(scope))) {
+ zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EX(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
+ zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
}
}
@@ -28382,9 +27235,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incd
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -28800,7 +27653,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
@@ -28886,7 +27739,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPC
if (Z_CONSTANT_P(value)) {
EG(scope) = ce;
zval_update_constant(value, 1 TSRMLS_CC);
- EG(scope) = EX(scope);
+ EG(scope) = EX(func)->op_array.scope;
}
if (IS_UNUSED == IS_CONST) {
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), value);
@@ -28952,8 +27805,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_H
}
if (IS_UNUSED != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = opline->op2.zv;
if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -29036,7 +27889,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_H
}
offset = opline->op2.zv;
- ZVAL_DEREF(container);
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -29787,9 +28642,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -30090,7 +28945,9 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDL
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (IS_TMP_VAR != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -30214,7 +29071,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -30269,8 +29126,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HAN
}
if (IS_UNUSED != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -30353,7 +29210,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HAN
}
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(container);
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -31106,9 +29965,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -31409,7 +30268,9 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (IS_VAR != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -31533,7 +30394,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -31588,8 +30449,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN
}
if (IS_UNUSED != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -31672,7 +30533,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(container);
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -32913,9 +31776,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -33213,7 +32076,9 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLE
}
if (Z_TYPE_P(var) != IS_STRING) {
- ZVAL_DEREF(var);
+ if (IS_CV != IS_TMP_VAR) {
+ ZVAL_DEREF(var);
+ }
if (Z_TYPE_P(var) != IS_STRING) {
use_copy = zend_make_printable_zval(var, &var_copy TSRMLS_CC);
@@ -33336,7 +32201,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
@@ -33390,8 +32255,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAND
}
if (IS_UNUSED != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -33474,7 +32339,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAND
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- ZVAL_DEREF(container);
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -33904,13 +32771,9 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZEND_VM_NEXT_OPCODE();
}
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
- }
+ ZVAL_DEREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
increment_function(var_ptr);
@@ -33943,13 +32806,9 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZEND_VM_NEXT_OPCODE();
}
- if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
- var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
- } else {
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
- zval_opt_copy_ctor(var_ptr);
- }
+ ZVAL_DEREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
decrement_function(var_ptr);
@@ -34270,7 +33129,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
@@ -34315,7 +33174,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
ZVAL_COPY_VALUE(arg, varptr);
CHECK_EXCEPTION();
@@ -34336,7 +33195,7 @@ static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
}
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if (IS_CV == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) {
ZVAL_NEW_REF(arg, &EG(uninitialized_zval));
ZEND_VM_NEXT_OPCODE();
@@ -34368,7 +33227,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_A
}
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
arg = ZEND_CALL_ARG(EX(call), opline->op2.num);
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(varptr)) {
ZVAL_COPY(arg, Z_REFVAL_P(varptr));
@@ -34452,7 +33311,7 @@ static int ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZVAL_COPY(param, arg);
}
- EX(call)->num_args = opline->op2.num;
+ ZEND_CALL_NUM_ARGS(EX(call)) = opline->op2.num;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -34507,14 +33366,14 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
- if (UNEXPECTED(ce != EX(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(ce != EG(scope))) {
+ zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EX(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EX(scope) ? EX(scope)->name->val : "");
+ if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
+ zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
}
}
}
@@ -34723,7 +33582,9 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
return_value = EX_VAR(opline->result.var);
}
- call = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_CODE,
+ new_op_array->scope = EG(scope); /* ??? */
+
+ call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
(zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
if (EX(symbol_table)) {
@@ -34737,7 +33598,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
- call->frame_info = VM_FRAME_TOP_CODE;
+ ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
zend_execute_ex(call TSRMLS_CC);
}
@@ -35871,9 +34732,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -36661,7 +35522,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCOD
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
@@ -36893,8 +35754,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
}
if (IS_CV != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = opline->op2.zv;
if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -36977,7 +35838,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
}
offset = opline->op2.zv;
- ZVAL_DEREF(container);
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -37453,66 +36316,6 @@ check_indirect:
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -37604,70 +36407,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -38184,9 +36923,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t i
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -38796,7 +37535,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -38955,8 +37694,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER
}
if (IS_CV != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -39039,7 +37778,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER
}
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(container);
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -39351,66 +38092,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLE
return zend_binary_assign_op_helper_SPEC_CV_TMP(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
-static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_add_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_sub_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_mul_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
-
- SAVE_OPLINE();
- fast_div_function(EX_VAR(opline->result.var),
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -39502,70 +38183,6 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
ZEND_VM_NEXT_OPCODE();
}
-static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_equal_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_not_equal_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
-static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
- zend_free_op free_op2;
- zval *result = EX_VAR(opline->result.var);
-
- SAVE_OPLINE();
- fast_is_smaller_or_equal_function(result,
- _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
- _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
-
- zval_ptr_dtor_nogc(free_op2);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -40082,9 +38699,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -40907,7 +39524,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2);
@@ -41141,8 +39758,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
}
if (IS_CV != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -41225,7 +39842,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- ZVAL_DEREF(container);
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -43392,9 +42011,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t in
&& EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(property)) : NULL) TSRMLS_CC)) != NULL)) {
ZVAL_DEREF(zptr);
- ZVAL_COPY(retval, zptr);
+ ZVAL_COPY_VALUE(retval, zptr);
+ zval_opt_copy_ctor(zptr);
- SEPARATE_ZVAL_NOREF(zptr);
incdec_op(zptr);
} else {
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
@@ -44064,7 +42683,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_H
GC_REFCOUNT(obj)++; /* For $this pointer */
}
- EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
+ EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);
@@ -44221,8 +42840,8 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_
}
if (IS_CV != IS_UNUSED) {
ZVAL_DEREF(container);
- SEPARATE_ZVAL_NOREF(container);
}
+ SEPARATE_ZVAL_NOREF(container);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
@@ -44305,7 +42924,9 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- ZVAL_DEREF(container);
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(container);
+ }
if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
if (Z_OBJ_HT_P(container)->unset_property) {
Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
@@ -44615,6 +43236,512 @@ static int ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
return zend_binary_assign_op_helper_SPEC_CV_CV(pow_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
+static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_add_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_sub_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_mul_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+
+ SAVE_OPLINE();
+ fast_div_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_equal_function(result,
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_not_equal_function(result,
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_function(result,
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_or_equal_function(result,
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_FREE_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_add_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_sub_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_mul_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_div_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_not_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_or_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ opline->op2.zv TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_add_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_sub_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_mul_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+
+ SAVE_OPLINE();
+ fast_div_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_not_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_or_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+
+ SAVE_OPLINE();
+ fast_add_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+
+ SAVE_OPLINE();
+ fast_sub_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+
+ SAVE_OPLINE();
+ fast_mul_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+
+ SAVE_OPLINE();
+ fast_div_function(EX_VAR(opline->result.var),
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_not_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1, free_op2;
+ zval *result = EX_VAR(opline->result.var);
+
+ SAVE_OPLINE();
+ fast_is_smaller_or_equal_function(result,
+ _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1),
+ _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2) TSRMLS_CC);
+ zval_ptr_dtor_nogc(free_op1);
+ zval_ptr_dtor_nogc(free_op2);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);
@@ -44651,103 +43778,103 @@ void zend_init_opcodes_handlers(void)
ZEND_NOP_SPEC_HANDLER,
ZEND_NOP_SPEC_HANDLER,
ZEND_ADD_SPEC_CONST_CONST_HANDLER,
- ZEND_ADD_SPEC_CONST_TMP_HANDLER,
- ZEND_ADD_SPEC_CONST_VAR_HANDLER,
+ ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_SPEC_CONST_CV_HANDLER,
- ZEND_ADD_SPEC_TMP_CONST_HANDLER,
- ZEND_ADD_SPEC_TMP_TMP_HANDLER,
- ZEND_ADD_SPEC_TMP_VAR_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_TMP_CV_HANDLER,
- ZEND_ADD_SPEC_VAR_CONST_HANDLER,
- ZEND_ADD_SPEC_VAR_TMP_HANDLER,
- ZEND_ADD_SPEC_VAR_VAR_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_ADD_SPEC_VAR_CV_HANDLER,
+ ZEND_ADD_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_SPEC_CV_CONST_HANDLER,
- ZEND_ADD_SPEC_CV_TMP_HANDLER,
- ZEND_ADD_SPEC_CV_VAR_HANDLER,
+ ZEND_ADD_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_ADD_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_ADD_SPEC_CV_CV_HANDLER,
ZEND_SUB_SPEC_CONST_CONST_HANDLER,
- ZEND_SUB_SPEC_CONST_TMP_HANDLER,
- ZEND_SUB_SPEC_CONST_VAR_HANDLER,
+ ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SUB_SPEC_CONST_CV_HANDLER,
- ZEND_SUB_SPEC_TMP_CONST_HANDLER,
- ZEND_SUB_SPEC_TMP_TMP_HANDLER,
- ZEND_SUB_SPEC_TMP_VAR_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_TMP_CV_HANDLER,
- ZEND_SUB_SPEC_VAR_CONST_HANDLER,
- ZEND_SUB_SPEC_VAR_TMP_HANDLER,
- ZEND_SUB_SPEC_VAR_VAR_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_SUB_SPEC_VAR_CV_HANDLER,
+ ZEND_SUB_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SUB_SPEC_CV_CONST_HANDLER,
- ZEND_SUB_SPEC_CV_TMP_HANDLER,
- ZEND_SUB_SPEC_CV_VAR_HANDLER,
+ ZEND_SUB_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_SUB_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_SUB_SPEC_CV_CV_HANDLER,
ZEND_MUL_SPEC_CONST_CONST_HANDLER,
- ZEND_MUL_SPEC_CONST_TMP_HANDLER,
- ZEND_MUL_SPEC_CONST_VAR_HANDLER,
+ ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_MUL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_SPEC_CONST_CV_HANDLER,
- ZEND_MUL_SPEC_TMP_CONST_HANDLER,
- ZEND_MUL_SPEC_TMP_TMP_HANDLER,
- ZEND_MUL_SPEC_TMP_VAR_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_TMP_CV_HANDLER,
- ZEND_MUL_SPEC_VAR_CONST_HANDLER,
- ZEND_MUL_SPEC_VAR_TMP_HANDLER,
- ZEND_MUL_SPEC_VAR_VAR_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_MUL_SPEC_VAR_CV_HANDLER,
+ ZEND_MUL_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_SPEC_CV_CONST_HANDLER,
- ZEND_MUL_SPEC_CV_TMP_HANDLER,
- ZEND_MUL_SPEC_CV_VAR_HANDLER,
+ ZEND_MUL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_MUL_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_MUL_SPEC_CV_CV_HANDLER,
ZEND_DIV_SPEC_CONST_CONST_HANDLER,
- ZEND_DIV_SPEC_CONST_TMP_HANDLER,
- ZEND_DIV_SPEC_CONST_VAR_HANDLER,
+ ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_DIV_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_DIV_SPEC_CONST_CV_HANDLER,
- ZEND_DIV_SPEC_TMP_CONST_HANDLER,
- ZEND_DIV_SPEC_TMP_TMP_HANDLER,
- ZEND_DIV_SPEC_TMP_VAR_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_DIV_SPEC_TMP_CV_HANDLER,
- ZEND_DIV_SPEC_VAR_CONST_HANDLER,
- ZEND_DIV_SPEC_VAR_TMP_HANDLER,
- ZEND_DIV_SPEC_VAR_VAR_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_DIV_SPEC_VAR_CV_HANDLER,
+ ZEND_DIV_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_DIV_SPEC_CV_CONST_HANDLER,
- ZEND_DIV_SPEC_CV_TMP_HANDLER,
- ZEND_DIV_SPEC_CV_VAR_HANDLER,
+ ZEND_DIV_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_DIV_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_DIV_SPEC_CV_CV_HANDLER,
ZEND_MOD_SPEC_CONST_CONST_HANDLER,
@@ -45051,103 +44178,103 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER,
ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER,
- ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER,
- ZEND_IS_EQUAL_SPEC_TMP_CONST_HANDLER,
- ZEND_IS_EQUAL_SPEC_TMP_TMP_HANDLER,
- ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_TMP_CV_HANDLER,
- ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER,
- ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER,
- ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER,
+ ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER,
- ZEND_IS_EQUAL_SPEC_CV_TMP_HANDLER,
- ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_TMP_CONST_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_TMP_TMP_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_TMP_CV_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CV_TMP_HANDLER,
- ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER,
ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER,
- ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMP_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMP_TMP_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_TMP_CV_HANDLER,
- ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER,
- ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER,
+ ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER,
- ZEND_IS_SMALLER_SPEC_CV_TMP_HANDLER,
- ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER,
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_TMP_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CV_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMP_HANDLER,
- ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER,
+ ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER,
ZEND_CAST_SPEC_CONST_HANDLER,
@@ -46380,16 +45507,16 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_FREE_SPEC_TMP_HANDLER,
- ZEND_FREE_SPEC_TMP_HANDLER,
- ZEND_FREE_SPEC_TMP_HANDLER,
- ZEND_FREE_SPEC_TMP_HANDLER,
- ZEND_FREE_SPEC_TMP_HANDLER,
- ZEND_FREE_SPEC_VAR_HANDLER,
- ZEND_FREE_SPEC_VAR_HANDLER,
- ZEND_FREE_SPEC_VAR_HANDLER,
- ZEND_FREE_SPEC_VAR_HANDLER,
- ZEND_FREE_SPEC_VAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
+ ZEND_FREE_SPEC_TMPVAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 03ed7ca65e..42da7aee85 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -34,7 +34,7 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value
return;
}
- execute_data = zend_vm_stack_push_call_frame(VM_FRAME_TOP_CODE,
+ execute_data = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_CODE,
(zend_function*)op_array, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, EG(current_execute_data) ? Z_OBJ(EG(current_execute_data)->This) : NULL, NULL TSRMLS_CC);
if (EG(current_execute_data)) {
execute_data->symbol_table = zend_rebuild_symbol_table(TSRMLS_C);
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index 5836adaefb..45d1dd1b23 100644
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -63,6 +63,16 @@ $op_types = array(
"CV"
);
+$op_types_ex = array(
+ "ANY",
+ "CONST",
+ "TMP",
+ "VAR",
+ "UNUSED",
+ "CV",
+ "TMPVAR",
+);
+
$prefix = array(
"ANY" => "",
"TMP" => "_TMP",
@@ -70,6 +80,7 @@ $prefix = array(
"CONST" => "_CONST",
"UNUSED" => "_UNUSED",
"CV" => "_CV",
+ "TMPVAR" => "_TMPVAR",
);
$typecode = array(
@@ -79,6 +90,7 @@ $typecode = array(
"CONST" => 0,
"UNUSED" => 3,
"CV" => 4,
+ "TMPVAR" => 0,
);
$op1_type = array(
@@ -88,6 +100,7 @@ $op1_type = array(
"CONST" => "IS_CONST",
"UNUSED" => "IS_UNUSED",
"CV" => "IS_CV",
+ "TMPVAR" => "???",
);
$op2_type = array(
@@ -97,6 +110,7 @@ $op2_type = array(
"CONST" => "IS_CONST",
"UNUSED" => "IS_UNUSED",
"CV" => "IS_CV",
+ "TMPVAR" => "???",
);
$op1_free = array(
@@ -106,6 +120,7 @@ $op1_free = array(
"CONST" => "0",
"UNUSED" => "0",
"CV" => "0",
+ "TMPVAR" => "???",
);
$op2_free = array(
@@ -115,6 +130,7 @@ $op2_free = array(
"CONST" => "0",
"UNUSED" => "0",
"CV" => "0",
+ "TMPVAR" => "???",
);
$op1_get_zval_ptr = array(
@@ -124,6 +140,7 @@ $op1_get_zval_ptr = array(
"CONST" => "opline->op1.zv",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1)",
);
$op2_get_zval_ptr = array(
@@ -133,6 +150,7 @@ $op2_get_zval_ptr = array(
"CONST" => "opline->op2.zv",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2)",
);
$op1_get_zval_ptr_ptr = array(
@@ -142,6 +160,7 @@ $op1_get_zval_ptr_ptr = array(
"CONST" => "NULL",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op2_get_zval_ptr_ptr = array(
@@ -151,6 +170,7 @@ $op2_get_zval_ptr_ptr = array(
"CONST" => "NULL",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op1_get_zval_ptr_deref = array(
@@ -160,6 +180,7 @@ $op1_get_zval_ptr_deref = array(
"CONST" => "opline->op1.zv",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op2_get_zval_ptr_deref = array(
@@ -169,6 +190,7 @@ $op2_get_zval_ptr_deref = array(
"CONST" => "opline->op2.zv",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op1_get_zval_ptr_ptr_undef = array(
@@ -178,6 +200,7 @@ $op1_get_zval_ptr_ptr_undef = array(
"CONST" => "NULL",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_undef_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op2_get_zval_ptr_ptr_undef = array(
@@ -187,6 +210,7 @@ $op2_get_zval_ptr_ptr_undef = array(
"CONST" => "NULL",
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_cv_undef_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op1_get_obj_zval_ptr = array(
@@ -196,6 +220,7 @@ $op1_get_obj_zval_ptr = array(
"CONST" => "opline->op1.zv",
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1)",
);
$op2_get_obj_zval_ptr = array(
@@ -205,6 +230,7 @@ $op2_get_obj_zval_ptr = array(
"CONST" => "opline->op2.zv",
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2)",
);
$op1_get_obj_zval_ptr_deref = array(
@@ -214,6 +240,7 @@ $op1_get_obj_zval_ptr_deref = array(
"CONST" => "opline->op1.zv",
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
"CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op2_get_obj_zval_ptr_deref = array(
@@ -223,6 +250,7 @@ $op2_get_obj_zval_ptr_deref = array(
"CONST" => "opline->op2.zv",
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
"CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op1_get_obj_zval_ptr_ptr = array(
@@ -232,6 +260,7 @@ $op1_get_obj_zval_ptr_ptr = array(
"CONST" => "NULL",
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op2_get_obj_zval_ptr_ptr = array(
@@ -241,6 +270,7 @@ $op2_get_obj_zval_ptr_ptr = array(
"CONST" => "NULL",
"UNUSED" => "_get_obj_zval_ptr_unused(execute_data)",
"CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
+ "TMPVAR" => "???",
);
$op1_free_op = array(
@@ -250,6 +280,7 @@ $op1_free_op = array(
"CONST" => "",
"UNUSED" => "",
"CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(free_op1)",
);
$op2_free_op = array(
@@ -259,6 +290,7 @@ $op2_free_op = array(
"CONST" => "",
"UNUSED" => "",
"CV" => "",
+ "TMPVAR" => "zval_ptr_dtor_nogc(free_op2)",
);
$op1_free_op_if_var = array(
@@ -268,6 +300,7 @@ $op1_free_op_if_var = array(
"CONST" => "",
"UNUSED" => "",
"CV" => "",
+ "TMPVAR" => "???",
);
$op2_free_op_if_var = array(
@@ -277,6 +310,7 @@ $op2_free_op_if_var = array(
"CONST" => "",
"UNUSED" => "",
"CV" => "",
+ "TMPVAR" => "???",
);
$op1_free_op_var_ptr = array(
@@ -286,6 +320,7 @@ $op1_free_op_var_ptr = array(
"CONST" => "",
"UNUSED" => "",
"CV" => "",
+ "TMPVAR" => "???",
);
$op2_free_op_var_ptr = array(
@@ -295,6 +330,7 @@ $op2_free_op_var_ptr = array(
"CONST" => "",
"UNUSED" => "",
"CV" => "",
+ "TMPVAR" => "???",
);
$list = array(); // list of opcode handlers and helpers in original order
@@ -650,16 +686,24 @@ function gen_labels($f, $spec, $kind, $prolog) {
foreach($op1t as $op1) {
if ($op1 != "ANY") {
if (!isset($dsc["op1"][$op1])) {
- // Try to use unspecialized handler
- $op1 = "ANY";
+ if (($op1 == "TMP" || $op1 == "VAR") && isset($dsc["op1"]["TMPVAR"])) {
+ $op1 = "TMPVAR";
+ } else {
+ // Try to use unspecialized handler
+ $op1 = "ANY";
+ }
}
$op2t = $op_types;
// For each op2.op_type except ANY
foreach($op2t as $op2) {
if ($op2 != "ANY") {
if (!isset($dsc["op2"][$op2])) {
- // Try to use unspecialized handler
- $op2 = "ANY";
+ if (($op2 == "TMP" || $op2 == "VAR") && isset($dsc["op2"]["TMPVAR"])) {
+ $op2 = "TMPVAR";
+ } else {
+ // Try to use unspecialized handler
+ $op2 = "ANY";
+ }
}
// Check if specialized handler is defined
if (isset($dsc["op1"][$op1]) &&
@@ -764,14 +808,14 @@ function gen_null_handler($f) {
// Generates all opcode handlers and helpers (specialized or unspecilaized)
function gen_executor_code($f, $spec, $kind, $prolog) {
- global $list, $opcodes, $helpers, $op_types;
+ global $list, $opcodes, $helpers, $op_types_ex;
if ($spec) {
// Produce specialized executor
- $op1t = $op_types;
+ $op1t = $op_types_ex;
// for each op1.op_type
foreach($op1t as $op1) {
- $op2t = $op_types;
+ $op2t = $op_types_ex;
// for each op2.op_type
foreach($op2t as $op2) {
// for each handlers in helpers in original order
diff --git a/ext/curl/multi.c b/ext/curl/multi.c
index d9e6df2c98..d9ace4119c 100644
--- a/ext/curl/multi.c
+++ b/ext/curl/multi.c
@@ -240,12 +240,15 @@ PHP_FUNCTION(curl_multi_getcontent)
ZEND_FETCH_RESOURCE(ch, php_curl *, z_ch, -1, le_curl_name, le_curl);
- if (ch->handlers->write->method == PHP_CURL_RETURN && ch->handlers->write->buf.s) {
+ if (ch->handlers->write->method == PHP_CURL_RETURN) {
+ if (!ch->handlers->write->buf.s) {
+ RETURN_EMPTY_STRING();
+ }
smart_str_0(&ch->handlers->write->buf);
RETURN_STR(zend_string_copy(ch->handlers->write->buf.s));
}
- RETURN_EMPTY_STRING();
+ RETURN_NULL();
}
/* }}} */
diff --git a/ext/curl/tests/bug67643.phpt b/ext/curl/tests/bug67643.phpt
new file mode 100644
index 0000000000..ad59f2c12c
--- /dev/null
+++ b/ext/curl/tests/bug67643.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #67643 (curl_multi_getcontent returns '' when RETURNTRANSFER isn't set)
+--SKIPIF--
+<?php
+if (!extension_loaded('curl')) print 'skip';
+?>
+--FILE--
+<?php
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, 'file://'. dirname(__FILE__) . DIRECTORY_SEPARATOR .'curl_testdata1.txt');
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
+
+ $mh = curl_multi_init();
+ curl_multi_add_handle($mh, $ch);
+
+ $running = 0;
+ do {
+ curl_multi_exec($mh, $running);
+ } while($running > 0);
+
+ $results = curl_multi_getcontent($ch);
+
+ curl_multi_remove_handle($mh, $ch);
+ curl_multi_close($mh);
+
+ var_dump($results);
+?>
+--EXPECT--
+CURL1
+NULL
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 6146dec927..8f2e8c8fc5 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -533,6 +533,9 @@ const zend_function_entry date_funcs_period[] = {
PHP_ME(DatePeriod, __construct, arginfo_date_period_construct, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC)
PHP_ME(DatePeriod, __wakeup, NULL, ZEND_ACC_PUBLIC)
PHP_ME(DatePeriod, __set_state, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+ PHP_ME(DatePeriod, getStartDate, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(DatePeriod, getEndDate, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(DatePeriod, getDateInterval, NULL, ZEND_ACC_PUBLIC)
PHP_FE_END
};
@@ -3641,6 +3644,7 @@ static int timezone_initialize(php_timezone_obj *tzobj, /*const*/ char *tz TSRML
return FAILURE;
} else {
set_timezone_from_timelib_time(tzobj, dummy_t);
+ free(dummy_t->tz_abbr);
efree(dummy_t);
return SUCCESS;
}
@@ -4414,6 +4418,81 @@ PHP_METHOD(DatePeriod, __construct)
}
/* }}} */
+/* {{{ proto DatePeriod::getStartDate()
+ Get start date.
+*/
+PHP_METHOD(DatePeriod, getStartDate)
+{
+ php_period_obj *dpobj;
+ php_date_obj *dateobj;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ dpobj = Z_PHPPERIOD_P(getThis());
+
+ php_date_instantiate(dpobj->start_ce, return_value TSRMLS_CC);
+ dateobj = Z_PHPDATE_P(return_value);
+ dateobj->time = timelib_time_ctor();
+ *dateobj->time = *dpobj->start;
+ if (dpobj->start->tz_abbr) {
+ dateobj->time->tz_abbr = strdup(dpobj->start->tz_abbr);
+ }
+ if (dpobj->start->tz_info) {
+ dateobj->time->tz_info = dpobj->start->tz_info;
+ }
+}
+/* }}} */
+
+/* {{{ proto DatePeriod::getEndDate()
+ Get end date.
+*/
+PHP_METHOD(DatePeriod, getEndDate)
+{
+ php_period_obj *dpobj;
+ php_date_obj *dateobj;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ dpobj = Z_PHPPERIOD_P(getThis());
+
+ php_date_instantiate(dpobj->start_ce, return_value TSRMLS_CC);
+ dateobj = Z_PHPDATE_P(return_value);
+ dateobj->time = timelib_time_ctor();
+ *dateobj->time = *dpobj->end;
+ if (dpobj->end->tz_abbr) {
+ dateobj->time->tz_abbr = strdup(dpobj->end->tz_abbr);
+ }
+ if (dpobj->end->tz_info) {
+ dateobj->time->tz_info = dpobj->end->tz_info;
+ }
+}
+/* }}} */
+
+/* {{{ proto DatePeriod::getDateInterval()
+ Get date interval.
+*/
+PHP_METHOD(DatePeriod, getDateInterval)
+{
+ php_period_obj *dpobj;
+ php_interval_obj *diobj;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ dpobj = Z_PHPPERIOD_P(getThis());
+
+ php_date_instantiate(date_ce_interval, return_value TSRMLS_CC);
+ diobj = Z_PHPINTERVAL_P(return_value);
+ diobj->diff = timelib_rel_time_clone(dpobj->interval);
+ diobj->initialized = 1;
+}
+/* }}} */
+
static int check_id_allowed(char *id, zend_long what) /* {{{ */
{
if (what & PHP_DATE_TIMEZONE_GROUP_AFRICA && strncasecmp(id, "Africa/", 7) == 0) return 1;
diff --git a/ext/date/php_date.h b/ext/date/php_date.h
index 3a938fe74f..667a552218 100644
--- a/ext/date/php_date.h
+++ b/ext/date/php_date.h
@@ -106,6 +106,9 @@ PHP_FUNCTION(date_interval_create_from_date_string);
PHP_METHOD(DatePeriod, __construct);
PHP_METHOD(DatePeriod, __wakeup);
PHP_METHOD(DatePeriod, __set_state);
+PHP_METHOD(DatePeriod, getStartDate);
+PHP_METHOD(DatePeriod, getEndDate);
+PHP_METHOD(DatePeriod, getDateInterval);
/* Options and Configuration */
PHP_FUNCTION(date_default_timezone_set);
diff --git a/ext/date/tests/DatePeriod_getter.phpt b/ext/date/tests/DatePeriod_getter.phpt
new file mode 100644
index 0000000000..22006d1ae8
--- /dev/null
+++ b/ext/date/tests/DatePeriod_getter.phpt
@@ -0,0 +1,25 @@
+--TEST--
+DatePeriod: Test getter
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$start = new DateTime('2000-01-01 00:00:00', new DateTimeZone('Europe/Berlin'));
+$end = new DateTime('2000-01-31 00:00:00', new DateTimeZone('UTC'));
+$interval = new DateInterval('P1D');
+$period = new DatePeriod($start, $interval, $end);
+
+var_dump($period->getStartDate()->format('Y-m-d H:i:s'));
+var_dump($period->getStartDate()->getTimeZone()->getName());
+
+var_dump($period->getEndDate()->format('Y-m-d H:i:s'));
+var_dump($period->getEndDate()->getTimeZone()->getName());
+
+var_dump($period->getDateInterval()->format('%R%y-%m-%d-%h-%i-%s'));
+?>
+--EXPECTF--
+string(19) "2000-01-01 00:00:00"
+string(13) "Europe/Berlin"
+string(19) "2000-01-31 00:00:00"
+string(3) "UTC"
+string(12) "+0-0-1-0-0-0"
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index 78d471c9d6..5d1d1e689e 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -104,6 +104,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_gmp_random, 0, 0, 0)
ZEND_ARG_INFO(0, limiter)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO_EX(arginfo_gmp_random_seed, 0, 0, 1)
+ ZEND_ARG_INFO(0, seed)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_gmp_random_bits, 0, 0, 1)
ZEND_ARG_INFO(0, bits)
ZEND_END_ARG_INFO()
@@ -170,6 +174,7 @@ const zend_function_entry gmp_functions[] = {
ZEND_FE(gmp_cmp, arginfo_gmp_binary)
ZEND_FE(gmp_sign, arginfo_gmp_unary)
ZEND_FE(gmp_random, arginfo_gmp_random)
+ ZEND_FE(gmp_random_seed, arginfo_gmp_random_seed)
ZEND_FE(gmp_random_bits, arginfo_gmp_random_bits)
ZEND_FE(gmp_random_range, arginfo_gmp_random_range)
ZEND_FE(gmp_and, arginfo_gmp_binary)
@@ -1768,6 +1773,33 @@ ZEND_FUNCTION(gmp_random)
}
/* }}} */
+/* {{{ proto GMP gmp_random_seed(mixed seed)
+ Seed the RNG */
+ZEND_FUNCTION(gmp_random_seed)
+{
+ zval *seed;
+ mpz_ptr gmpnum_seed;
+ gmp_temp_t temp_a;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &seed) == FAILURE) {
+ return;
+ }
+
+ gmp_init_random(TSRMLS_C);
+
+ if (Z_TYPE_P(seed) == IS_LONG && Z_LVAL_P(seed) >= 0) {
+ gmp_randseed_ui(GMPG(rand_state), Z_LVAL_P(seed));
+ }
+ else {
+ FETCH_GMP_ZVAL(gmpnum_seed, seed, temp_a);
+
+ gmp_randseed(GMPG(rand_state), gmpnum_seed);
+
+ FREE_GMP_TEMP(temp_a);
+ }
+}
+/* }}} */
+
/* {{{ proto GMP gmp_random_bits(int bits)
Gets a random number in the range 0 to (2 ** n) - 1 */
ZEND_FUNCTION(gmp_random_bits)
diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h
index 7e8e51b291..27d621bb39 100644
--- a/ext/gmp/php_gmp.h
+++ b/ext/gmp/php_gmp.h
@@ -66,6 +66,7 @@ ZEND_FUNCTION(gmp_or);
ZEND_FUNCTION(gmp_com);
ZEND_FUNCTION(gmp_xor);
ZEND_FUNCTION(gmp_random);
+ZEND_FUNCTION(gmp_random_seed);
ZEND_FUNCTION(gmp_random_bits);
ZEND_FUNCTION(gmp_random_range);
ZEND_FUNCTION(gmp_setbit);
diff --git a/ext/gmp/tests/gmp_random_seed.phpt b/ext/gmp/tests/gmp_random_seed.phpt
new file mode 100644
index 0000000000..3a832467bb
--- /dev/null
+++ b/ext/gmp/tests/gmp_random_seed.phpt
@@ -0,0 +1,229 @@
+--TEST--
+gmp_random_seed() basic tests
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+// zero int
+var_dump(gmp_random_seed(0));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// zero gmp
+var_dump(gmp_random_seed(gmp_init(0)));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// negative int
+var_dump(gmp_random_seed(-100));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// negative gmp
+var_dump(gmp_random_seed(gmp_init(-100)));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// positive int
+var_dump(gmp_random_seed(100));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// positive gmp
+var_dump(gmp_random_seed(100));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+$seed = gmp_init(1);
+$seed <<= 512;
+
+// large negative gmp
+var_dump(gmp_random_seed($seed * -1));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// large positive gmp
+var_dump(gmp_random_seed($seed));
+
+var_dump(gmp_strval(gmp_random()));
+var_dump(gmp_strval(gmp_random(1)));
+var_dump(gmp_strval(gmp_random(10)));
+
+var_dump(gmp_strval(gmp_random_bits(10)));
+var_dump(gmp_strval(gmp_random_bits(100)));
+var_dump(gmp_strval(gmp_random_bits(1000)));
+
+var_dump(gmp_strval(gmp_random_range(0, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 10000)));
+var_dump(gmp_strval(gmp_random_range(-10000, 0)));
+
+
+// standard non conversion error
+var_dump(gmp_random_seed('not a number'));
+
+
+echo "Done\n";
+?>
+--EXPECTF--
+NULL
+string(386) "16100871751340485642888774479422205950971474538471317276388238970713821926852258806210387669237144400278914671533438653274777493140545293541785377162348524402063489947660558889561219968642920852870483050552936324125257259316643328803697665037881088889859735075814746314563786538493931260996669892959501637800179548654075887300734264333417283208357503038004080669367070111848040502362219"
+string(18) "255344473360201232"
+string(192) "566276705882089203328999735915155615747289398229935944715725865523491463654289449864817867794422824157675456435165973986660058784111212531276312901205233176071526587181942240113004108328736022"
+string(3) "766"
+string(31) "1251852006013618829761115383588"
+string(301) "2904442664575028522451529381233481137998826790384445089758175726247096826023839957531211794198483328480161675791738894500687706952157332727908305084432443942315866545175274665372161864357698401817740956147940095302549920711069038378541222669595494627580205085300332122174778540693048337420608925104417"
+string(4) "5969"
+string(5) "-4126"
+string(4) "-926"
+NULL
+string(386) "16100871751340485642888774479422205950971474538471317276388238970713821926852258806210387669237144400278914671533438653274777493140545293541785377162348524402063489947660558889561219968642920852870483050552936324125257259316643328803697665037881088889859735075814746314563786538493931260996669892959501637800179548654075887300734264333417283208357503038004080669367070111848040502362219"
+string(18) "255344473360201232"
+string(192) "566276705882089203328999735915155615747289398229935944715725865523491463654289449864817867794422824157675456435165973986660058784111212531276312901205233176071526587181942240113004108328736022"
+string(3) "766"
+string(31) "1251852006013618829761115383588"
+string(301) "2904442664575028522451529381233481137998826790384445089758175726247096826023839957531211794198483328480161675791738894500687706952157332727908305084432443942315866545175274665372161864357698401817740956147940095302549920711069038378541222669595494627580205085300332122174778540693048337420608925104417"
+string(4) "5969"
+string(5) "-4126"
+string(4) "-926"
+NULL
+string(386) "13477111096113160882601567427091178332669645276785709413953468738199940626922635042144840457533224221336117027441609364710893482124071124759231943384805378201041406842697962243732316555316214869988749798708139879922380266366387589101775891621221881149417841139463207495993669582399783202126977651864760442797681787747348653884279195479310922110107643437514016795836672871442926389274400"
+string(20) "15370156633245019617"
+string(192) "294354325919119835375781661354719128667828860233586416953977190644006896604022494655398295674227944872858213051595447565156112646032890737200590095517623075051828676500990477704073251304424133"
+string(3) "683"
+string(31) "1105092118036828878542238774672"
+string(301) "2700084798786584694260166508009114488318099110808331607090845844712329387915039325877090587052399841255219556028410036280510827424748532204766771994624650610348058361519239518625728955462297681525123214377383395734875500143425080808436274385326255154393544373636015993206705180032889399161843788895374"
+string(4) "7268"
+string(5) "-3518"
+string(5) "-8432"
+NULL
+string(386) "13477111096113160882601567427091178332669645276785709413953468738199940626922635042144840457533224221336117027441609364710893482124071124759231943384805378201041406842697962243732316555316214869988749798708139879922380266366387589101775891621221881149417841139463207495993669582399783202126977651864760442797681787747348653884279195479310922110107643437514016795836672871442926389274400"
+string(20) "15370156633245019617"
+string(192) "294354325919119835375781661354719128667828860233586416953977190644006896604022494655398295674227944872858213051595447565156112646032890737200590095517623075051828676500990477704073251304424133"
+string(3) "683"
+string(31) "1105092118036828878542238774672"
+string(301) "2700084798786584694260166508009114488318099110808331607090845844712329387915039325877090587052399841255219556028410036280510827424748532204766771994624650610348058361519239518625728955462297681525123214377383395734875500143425080808436274385326255154393544373636015993206705180032889399161843788895374"
+string(4) "7268"
+string(5) "-3518"
+string(5) "-8432"
+NULL
+string(386) "13477111096113160882601567427091178332669645276785709413953468738199940626922635042144840457533224221336117027441609364710893482124071124759231943384805378201041406842697962243732316555316214869988749798708139879922380266366387589101775891621221881149417841139463207495993669582399783202126977651864760442797681787747348653884279195479310922110107643437514016795836672871442926389274400"
+string(20) "15370156633245019617"
+string(192) "294354325919119835375781661354719128667828860233586416953977190644006896604022494655398295674227944872858213051595447565156112646032890737200590095517623075051828676500990477704073251304424133"
+string(3) "683"
+string(31) "1105092118036828878542238774672"
+string(301) "2700084798786584694260166508009114488318099110808331607090845844712329387915039325877090587052399841255219556028410036280510827424748532204766771994624650610348058361519239518625728955462297681525123214377383395734875500143425080808436274385326255154393544373636015993206705180032889399161843788895374"
+string(4) "7268"
+string(5) "-3518"
+string(5) "-8432"
+NULL
+string(386) "13477111096113160882601567427091178332669645276785709413953468738199940626922635042144840457533224221336117027441609364710893482124071124759231943384805378201041406842697962243732316555316214869988749798708139879922380266366387589101775891621221881149417841139463207495993669582399783202126977651864760442797681787747348653884279195479310922110107643437514016795836672871442926389274400"
+string(20) "15370156633245019617"
+string(192) "294354325919119835375781661354719128667828860233586416953977190644006896604022494655398295674227944872858213051595447565156112646032890737200590095517623075051828676500990477704073251304424133"
+string(3) "683"
+string(31) "1105092118036828878542238774672"
+string(301) "2700084798786584694260166508009114488318099110808331607090845844712329387915039325877090587052399841255219556028410036280510827424748532204766771994624650610348058361519239518625728955462297681525123214377383395734875500143425080808436274385326255154393544373636015993206705180032889399161843788895374"
+string(4) "7268"
+string(5) "-3518"
+string(5) "-8432"
+NULL
+string(386) "17517289823903393220742578279919954815229524740463730368402128237511862318453381595675765692750750649609755422480004471234960388086555321894591036872550129477305413674775698107868844953599169316550102271816620108199930104365341610775602960735862041722613145476720452800951958891882288668416542937408952006310656170195090436314902430700708511047189929836145291647101130135292078875631354"
+string(19) "1662391866670215057"
+string(193) "1951928859951518261564127834731454911658112769477733872890285741065126442731035642243573666695893929882207432512593006044657806021743917753379619843420559355572830613932424235592411658293328273"
+string(3) "888"
+string(30) "136524289584478309125073026188"
+string(301) "4487372666528061674404740793683112894444118579769413902123304803304884162086348577960502430419080687314731489440882833272125181594897832730214825704339272207090970657364333461383490282984012738008555512699878911293400686609929745464733074891420787002129849587668122219953473716759349853748437799165176"
+string(4) "8559"
+string(4) "9426"
+string(5) "-2932"
+NULL
+string(386) "17517289823903393220742578279919954815229524740463730368402128237511862318453381595675765692750750649609755422480004471234960388086555321894591036872550129477305413674775698107868844953599169316550102271816620108199930104365341610775602960735862041722613145476720452800951958891882288668416542937408952006310656170195090436314902430700708511047189929836145291647101130135292078875631354"
+string(19) "1662391866670215057"
+string(193) "1951928859951518261564127834731454911658112769477733872890285741065126442731035642243573666695893929882207432512593006044657806021743917753379619843420559355572830613932424235592411658293328273"
+string(3) "888"
+string(30) "136524289584478309125073026188"
+string(301) "4487372666528061674404740793683112894444118579769413902123304803304884162086348577960502430419080687314731489440882833272125181594897832730214825704339272207090970657364333461383490282984012738008555512699878911293400686609929745464733074891420787002129849587668122219953473716759349853748437799165176"
+string(4) "8559"
+string(4) "9426"
+string(5) "-2932"
+
+Warning: gmp_random_seed(): Unable to convert variable to GMP - string is not an integer in %s on line %d
+bool(false)
+Done
diff --git a/ext/intl/collator/collator_attr.h b/ext/intl/collator/collator_attr.h
index b86365ff5e..aefdd15f9f 100644
--- a/ext/intl/collator/collator_attr.h
+++ b/ext/intl/collator/collator_attr.h
@@ -16,7 +16,7 @@
*/
#ifndef COLLATOR_ATTR_H
-#define CCOLLATOR_ATTR_H
+#define COLLATOR_ATTR_H
#include <php.h>
diff --git a/ext/intl/tests/bug67052.phpt b/ext/intl/tests/bug67052.phpt
index 8edd65de71..80c7e88017 100644
--- a/ext/intl/tests/bug67052.phpt
+++ b/ext/intl/tests/bug67052.phpt
@@ -6,6 +6,11 @@ Bug #67052 - NumberFormatter::parse() resets LC_NUMERIC setting
if (substr(PHP_OS, 0, 3) == 'WIN') {
die("skip Valid only on non Windows");
}
+$l = setlocale(LC_ALL, 'de_DE');
+if($l === false) {
+ die("skip de_DE locale not installed");
+}
+setlocale(LC_ALL, $l);
?>
--FILE--
<?php
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index 589028368f..32009791ed 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -65,7 +65,7 @@ int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name)
(op_array->vars[i]->h == hash_value &&
op_array->vars[i]->len == name->len &&
memcmp(op_array->vars[i]->val, name->val, name->len) == 0)) {
- return (int)(zend_intptr_t)EX_VAR_NUM_2(NULL, i);
+ return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
i++;
}
@@ -96,7 +96,7 @@ int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name)
}
}
- return (int)(zend_intptr_t)EX_VAR_NUM_2(NULL, i);
+ return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i);
}
int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv TSRMLS_DC)
diff --git a/ext/opcache/Optimizer/zend_optimizer_internal.h b/ext/opcache/Optimizer/zend_optimizer_internal.h
index ba91b147c9..ee44bf671c 100644
--- a/ext/opcache/Optimizer/zend_optimizer_internal.h
+++ b/ext/opcache/Optimizer/zend_optimizer_internal.h
@@ -25,7 +25,7 @@
#include "ZendAccelerator.h"
#define VAR_NUM(v) EX_VAR_TO_NUM(v)
-#define NUM_VAR(v) ((uint32_t)(zend_uintptr_t)EX_VAR_NUM_2(0, v))
+#define NUM_VAR(v) ((uint32_t)(zend_uintptr_t)ZEND_CALL_VAR_NUM(0, v))
#define INV_COND(op) ((op) == ZEND_JMPZ ? ZEND_JMPNZ : ZEND_JMPZ)
#define INV_EX_COND(op) ((op) == ZEND_JMPZ_EX ? ZEND_JMPNZ : ZEND_JMPZ)
diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c
index 3e91740a71..f6ade86acf 100644
--- a/ext/opcache/zend_persist.c
+++ b/ext/opcache/zend_persist.c
@@ -419,12 +419,10 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
zend_accel_store(op_array->arg_info, sizeof(zend_arg_info) * op_array->num_args);
for (i = 0; i < op_array->num_args; i++) {
if (op_array->arg_info[i].name) {
-//??? zend_accel_store_interned_string(op_array->arg_info[i].name, op_array->arg_info[i].name_len + 1);
- zend_accel_store(op_array->arg_info[i].name, op_array->arg_info[i].name_len + 1);
+ zend_accel_store_interned_string(op_array->arg_info[i].name);
}
if (op_array->arg_info[i].class_name) {
-//??? zend_accel_store_interned_string(op_array->arg_info[i].class_name, op_array->arg_info[i].class_name_len + 1);
- zend_accel_store(op_array->arg_info[i].class_name, op_array->arg_info[i].class_name_len + 1);
+ zend_accel_store_interned_string(op_array->arg_info[i].class_name);
}
}
}
diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c
index 0a7b835648..6a35c5ca9b 100644
--- a/ext/opcache/zend_persist_calc.c
+++ b/ext/opcache/zend_persist_calc.c
@@ -199,12 +199,10 @@ static void zend_persist_op_array_calc_ex(zend_op_array *op_array TSRMLS_DC)
ADD_DUP_SIZE(op_array->arg_info, sizeof(zend_arg_info) * op_array->num_args);
for (i = 0; i < op_array->num_args; i++) {
if (op_array->arg_info[i].name) {
-//??? ADD_INTERNED_STRING(op_array->arg_info[i].name, op_array->arg_info[i].name_len + 1);
- ADD_SIZE(op_array->arg_info[i].name_len + 1);
+ ADD_INTERNED_STRING(op_array->arg_info[i].name, 1);
}
if (op_array->arg_info[i].class_name) {
-//??? ADD_INTERNED_STRING(op_array->arg_info[i].class_name, op_array->arg_info[i].class_name_len + 1);
- ADD_SIZE(op_array->arg_info[i].class_name_len + 1);
+ ADD_INTERNED_STRING(op_array->arg_info[i].class_name, 1);
}
}
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index c4b155b478..60d36ff743 100755
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -3595,6 +3595,7 @@ PHP_FUNCTION(openssl_pkey_export_to_file)
char * filename = NULL;
size_t filename_len = 0;
zend_resource *key_resource = NULL;
+ int pem_write = 0;
EVP_PKEY * key;
BIO * bio_out = NULL;
const EVP_CIPHER * cipher;
@@ -3629,7 +3630,19 @@ PHP_FUNCTION(openssl_pkey_export_to_file)
} else {
cipher = NULL;
}
- if (PEM_write_bio_PrivateKey(bio_out, key, cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL)) {
+
+ switch (EVP_PKEY_type(key->type)) {
+#ifdef HAVE_EVP_PKEY_EC
+ case EVP_PKEY_EC:
+ pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
+ break;
+#endif
+ default:
+ pem_write = PEM_write_bio_PrivateKey(bio_out, key, cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
+ break;
+ }
+
+ if (pem_write) {
/* Success!
* If returning the output as a string, do so now */
RETVAL_TRUE;
@@ -3653,6 +3666,7 @@ PHP_FUNCTION(openssl_pkey_export)
struct php_x509_request req;
zval * zpkey, * args = NULL, *out;
char * passphrase = NULL; size_t passphrase_len = 0;
+ int pem_write = 0;
zend_resource *key_resource = NULL;
EVP_PKEY * key;
BIO * bio_out = NULL;
@@ -3684,7 +3698,19 @@ PHP_FUNCTION(openssl_pkey_export)
} else {
cipher = NULL;
}
- if (PEM_write_bio_PrivateKey(bio_out, key, cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL)) {
+
+ switch (EVP_PKEY_type(key->type)) {
+#ifdef HAVE_EVP_PKEY_EC
+ case EVP_PKEY_EC:
+ pem_write = PEM_write_bio_ECPrivateKey(bio_out, EVP_PKEY_get1_EC_KEY(key), cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
+ break;
+#endif
+ default:
+ pem_write = PEM_write_bio_PrivateKey(bio_out, key, cipher, (unsigned char *)passphrase, passphrase_len, NULL, NULL);
+ break;
+ }
+
+ if (pem_write) {
/* Success!
* If returning the output as a string, do so now */
@@ -3853,6 +3879,39 @@ PHP_FUNCTION(openssl_pkey_get_details)
#ifdef HAVE_EVP_PKEY_EC
case EVP_PKEY_EC:
ktype = OPENSSL_KEYTYPE_EC;
+ if (pkey->pkey.ec != NULL) {
+ zval ec;
+ const EC_GROUP *ec_group;
+ int nid;
+ char *crv_sn;
+ ASN1_OBJECT *obj;
+ // openssl recommends a buffer length of 80
+ char oir_buf[80];
+
+ ec_group = EC_KEY_get0_group(EVP_PKEY_get1_EC_KEY(pkey));
+
+ // Curve nid (numerical identifier) used for ASN1 mapping
+ nid = EC_GROUP_get_curve_name(ec_group);
+ if (nid == NID_undef) {
+ break;
+ }
+ array_init(&ec);
+
+ // Short object name
+ crv_sn = (char*) OBJ_nid2sn(nid);
+ if (crv_sn != NULL) {
+ add_assoc_string(&ec, "curve_name", crv_sn);
+ }
+
+ obj = OBJ_nid2obj(nid);
+ if (obj != NULL) {
+ int oir_len = OBJ_obj2txt(oir_buf, sizeof(oir_buf), obj, 1);
+ add_assoc_stringl(&ec, "curve_oid", (char*)oir_buf, oir_len);
+ ASN1_OBJECT_free(obj);
+ }
+
+ add_assoc_zval(return_value, "ec", &ec);
+ }
break;
#endif
default:
diff --git a/ext/openssl/tests/027.phpt b/ext/openssl/tests/027.phpt
new file mode 100644
index 0000000000..8311ab1bd9
--- /dev/null
+++ b/ext/openssl/tests/027.phpt
@@ -0,0 +1,52 @@
+--TEST--
+openssl_pkey_export() with EC key
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!defined('OPENSSL_KEYTYPE_EC')) die("skip no EC available");
+?>
+--FILE--
+<?php
+$key = openssl_pkey_get_private('file://' . dirname(__FILE__) . '/private_ec.key');
+var_dump($key);
+
+var_dump(openssl_pkey_export($key, $output));
+echo $output;
+
+// Load the private key from the exported pem string
+$details = openssl_pkey_get_details(openssl_pkey_get_private($output));
+var_dump(OPENSSL_KEYTYPE_EC === $details['type']);
+
+// Export key with passphrase
+openssl_pkey_export($key, $output, 'passphrase');
+
+$details = openssl_pkey_get_details(openssl_pkey_get_private($output, 'passphrase'));
+var_dump(OPENSSL_KEYTYPE_EC === $details['type']);
+
+// Read public key
+$pKey = openssl_pkey_get_public('file://' . dirname(__FILE__) . '/public_ec.key');
+var_dump($pKey);
+// The details are the same for a public or private key
+var_dump($details === openssl_pkey_get_details($pKey));
+
+
+// Export to file
+$tempname = tempnam(sys_get_temp_dir(), 'openssl_ec');
+var_dump(openssl_pkey_export_to_file($key, $tempname));
+$details = openssl_pkey_get_details(openssl_pkey_get_private('file://' . $tempname));
+var_dump(OPENSSL_KEYTYPE_EC === $details['type']);
+
+// Clean the temporary file
+@unlink($tempname);
+
+?>
+--EXPECTF--
+resource(%d) of type (OpenSSL key)
+bool(true)
+-----BEGIN EC PRIVATE KEY-----%a-----END EC PRIVATE KEY-----
+bool(true)
+bool(true)
+resource(%d) of type (OpenSSL key)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/openssl/tests/028.phpt b/ext/openssl/tests/028.phpt
new file mode 100644
index 0000000000..8e0cef46c0
--- /dev/null
+++ b/ext/openssl/tests/028.phpt
@@ -0,0 +1,28 @@
+--TEST--
+openssl_pkey_get_details() with EC key
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!defined('OPENSSL_KEYTYPE_EC')) die("skip no EC available");
+?>
+--FILE--
+<?php
+$key = openssl_pkey_get_private('file://' . dirname(__FILE__) . '/private_ec.key');
+
+print_r(openssl_pkey_get_details($key));
+?>
+--EXPECTF--
+Array
+(
+ [bits] => 256
+ [key] => -----BEGIN PUBLIC KEY-----%a
+-----END PUBLIC KEY-----
+
+ [ec] => Array
+ (
+ [curve_name] => prime256v1
+ [curve_oid] => 1.2.840.10045.3.1.7
+ )
+
+ [type] => 3
+)
diff --git a/ext/openssl/tests/private_ec.key b/ext/openssl/tests/private_ec.key
new file mode 100644
index 0000000000..51cdcb728b
--- /dev/null
+++ b/ext/openssl/tests/private_ec.key
@@ -0,0 +1,5 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEILPkqoeyM7XgwYkuSj3077lrsrfWJK5LqMolv+m2oOjZoAoGCCqGSM49
+AwEHoUQDQgAEPq4hbIWHvB51rdWr8ejrjWo4qVNWVugYFtPg/xLQw0mHkIPZ4DvK
+sqOTOnMoezkbSmVVMuwz9flvnqHGmQvmug==
+-----END EC PRIVATE KEY-----
diff --git a/ext/openssl/tests/public_ec.key b/ext/openssl/tests/public_ec.key
new file mode 100644
index 0000000000..a93b2c8ab4
--- /dev/null
+++ b/ext/openssl/tests/public_ec.key
@@ -0,0 +1,4 @@
+-----BEGIN PUBLIC KEY-----
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPq4hbIWHvB51rdWr8ejrjWo4qVNW
+VugYFtPg/xLQw0mHkIPZ4DvKsqOTOnMoezkbSmVVMuwz9flvnqHGmQvmug==
+-----END PUBLIC KEY-----
diff --git a/ext/openssl/tests/stream_server_reneg_limit.phpt b/ext/openssl/tests/stream_server_reneg_limit.phpt
index 3abaa48e41..d355505e54 100644
--- a/ext/openssl/tests/stream_server_reneg_limit.phpt
+++ b/ext/openssl/tests/stream_server_reneg_limit.phpt
@@ -6,6 +6,10 @@ if (!extension_loaded("openssl")) die("skip openssl not loaded");
if (!function_exists("proc_open")) die("skip no proc_open");
exec('openssl help', $out, $code);
if ($code > 0) die("skip couldn't locate openssl binary");
+if(substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip not suitable for Windows');
+}
+?>
--FILE--
<?php
diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c
index 11ad1018ec..301002132c 100644
--- a/ext/pcntl/pcntl.c
+++ b/ext/pcntl/pcntl.c
@@ -873,6 +873,7 @@ PHP_FUNCTION(pcntl_signal)
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error assigning signal");
RETURN_FALSE;
}
+ zend_hash_index_del(&PCNTL_G(php_signal_table), signo);
RETURN_TRUE;
}
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 8e35c1ee9a..571e08b4c0 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -1300,7 +1300,7 @@ int pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind TSRMLS_DC)
if (funcs->arg_info) {
zend_internal_function_info *info = (zend_internal_function_info*)funcs->arg_info;
- ifunc->arg_info = (zend_arg_info*)funcs->arg_info + 1;
+ ifunc->arg_info = (zend_internal_arg_info*)funcs->arg_info + 1;
ifunc->num_args = funcs->num_args;
if (info->required_num_args == -1) {
ifunc->required_num_args = funcs->num_args;
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 140e681dfb..87901c7933 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -688,7 +688,10 @@ static void _parameter_string(string *str, zend_function *fptr, struct _zend_arg
string_printf(str, "<required> ");
}
if (arg_info->class_name) {
- string_printf(str, "%s ", arg_info->class_name);
+ string_printf(str, "%s ",
+ (fptr->type == ZEND_INTERNAL_FUNCTION) ?
+ ((zend_internal_arg_info*)arg_info)->class_name :
+ arg_info->class_name->val);
if (arg_info->allow_null) {
string_printf(str, "or NULL ");
}
@@ -705,7 +708,10 @@ static void _parameter_string(string *str, zend_function *fptr, struct _zend_arg
string_write(str, "...", sizeof("...")-1);
}
if (arg_info->name) {
- string_printf(str, "$%s", arg_info->name);
+ string_printf(str, "$%s",
+ (fptr->type == ZEND_INTERNAL_FUNCTION) ?
+ ((zend_internal_arg_info*)arg_info)->name :
+ arg_info->name->val);
} else {
string_printf(str, "$param%d", offset);
}
@@ -1226,7 +1232,11 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje
zval name;
if (arg_info->name) {
- ZVAL_STRINGL(&name, arg_info->name, arg_info->name_len);
+ if (fptr->type == ZEND_INTERNAL_FUNCTION) {
+ ZVAL_STRING(&name, ((zend_internal_arg_info*)arg_info)->name);
+ } else {
+ ZVAL_STR(&name, zend_string_copy(arg_info->name));
+ }
} else {
ZVAL_NULL(&name);
}
@@ -2127,6 +2137,7 @@ ZEND_METHOD(reflection_parameter, __construct)
int position;
zend_class_entry *ce = NULL;
zend_bool is_closure = 0;
+ zend_bool is_invoke = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &reference, &parameter) == FAILURE) {
return;
@@ -2188,9 +2199,10 @@ ZEND_METHOD(reflection_parameter, __construct)
&& (lcname_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1)
&& memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1) == 0
&& (fptr = zend_get_closure_invoke_method(Z_OBJ_P(classref) TSRMLS_CC)) != NULL)
- {
+ {
/* nothing to do. don't set is_closure since is the invoke handler,
-- not the closure itself */
+ not the closure itself */
+ is_invoke = 1;
} else if ((fptr = zend_hash_str_find_ptr(&ce->function_table, lcname, lcname_len)) == NULL) {
efree(lcname);
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
@@ -2243,10 +2255,24 @@ ZEND_METHOD(reflection_parameter, __construct)
position= -1;
convert_to_string_ex(parameter);
- for (i = 0; i < fptr->common.num_args; i++) {
- if (arg_info[i].name && strcmp(arg_info[i].name, Z_STRVAL_P(parameter)) == 0) {
- position= i;
- break;
+ if (!is_invoke && fptr->type == ZEND_INTERNAL_FUNCTION) {
+ for (i = 0; i < fptr->common.num_args; i++) {
+ if (arg_info[i].name) {
+ if (strcmp(((zend_internal_arg_info*)arg_info)[i].name, Z_STRVAL_P(parameter)) == 0) {
+ position= i;
+ break;
+ }
+
+ }
+ }
+ } else {
+ for (i = 0; i < fptr->common.num_args; i++) {
+ if (arg_info[i].name) {
+ if (strcmp(arg_info[i].name->val, Z_STRVAL_P(parameter)) == 0) {
+ position= i;
+ break;
+ }
+ }
}
}
if (position == -1) {
@@ -2265,7 +2291,11 @@ ZEND_METHOD(reflection_parameter, __construct)
}
if (arg_info[position].name) {
- ZVAL_STRINGL(&name, arg_info[position].name, arg_info[position].name_len);
+ if (fptr->type == ZEND_INTERNAL_FUNCTION) {
+ ZVAL_STRING(&name, ((zend_internal_arg_info*)arg_info)[position].name);
+ } else {
+ ZVAL_STR(&name, zend_string_copy(arg_info[position].name));
+ }
} else {
ZVAL_NULL(&name);
}
@@ -2379,14 +2409,24 @@ ZEND_METHOD(reflection_parameter, getClass)
* TODO: Think about moving these checks to the compiler or some sort of
* lint-mode.
*/
- if (0 == zend_binary_strcasecmp(param->arg_info->class_name, param->arg_info->class_name_len, "self", sizeof("self")- 1)) {
+ const char *class_name;
+ size_t class_name_len;
+
+ if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+ class_name = ((zend_internal_arg_info*)param->arg_info)->class_name;
+ class_name_len = strlen(class_name);
+ } else {
+ class_name = param->arg_info->class_name->val;
+ class_name_len = param->arg_info->class_name->len;
+ }
+ if (0 == zend_binary_strcasecmp(class_name, class_name_len, "self", sizeof("self")- 1)) {
ce = param->fptr->common.scope;
if (!ce) {
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
"Parameter uses 'self' as type hint but function is not a class member!");
return;
}
- } else if (0 == zend_binary_strcasecmp(param->arg_info->class_name, param->arg_info->class_name_len, "parent", sizeof("parent")- 1)) {
+ } else if (0 == zend_binary_strcasecmp(class_name, class_name_len, "parent", sizeof("parent")- 1)) {
ce = param->fptr->common.scope;
if (!ce) {
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
@@ -2400,12 +2440,16 @@ ZEND_METHOD(reflection_parameter, getClass)
}
ce = ce->parent;
} else {
- zend_string *name = zend_string_init(param->arg_info->class_name, param->arg_info->class_name_len, 0);
- ce = zend_lookup_class(name TSRMLS_CC);
- zend_string_release(name);
+ if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+ zend_string *name = zend_string_init(class_name, class_name_len, 0);
+ ce = zend_lookup_class(name TSRMLS_CC);
+ zend_string_release(name);
+ } else {
+ ce = zend_lookup_class(param->arg_info->class_name TSRMLS_CC);
+ }
if (!ce) {
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
- "Class %s does not exist", param->arg_info->class_name);
+ "Class %s does not exist", class_name);
return;
}
}
@@ -3347,9 +3391,8 @@ static void add_class_vars(zend_class_entry *ce, int statics, zval *return_value
zend_property_info *prop_info;
zval *prop, prop_copy;
zend_string *key;
- zend_ulong num_index;
- ZEND_HASH_FOREACH_KEY_PTR(&ce->properties_info, num_index, key, prop_info) {
+ ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) {
if (((prop_info->flags & ZEND_ACC_SHADOW) &&
prop_info->ce != ce) ||
((prop_info->flags & ZEND_ACC_PROTECTED) &&
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 108eafddc4..375d52bad9 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -490,7 +490,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int ht, spl_file
} else {
intern->file_name = estrndup(source->file_name, source->file_name_len);
intern->file_name_len = source->file_name_len;
- intern->_path = spl_filesystem_object_get_path(source, (size_t *)&intern->_path_len TSRMLS_CC);
+ intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC);
intern->_path = estrndup(intern->_path, intern->_path_len);
}
break;
@@ -514,7 +514,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int ht, spl_file
} else {
intern->file_name = source->file_name;
intern->file_name_len = source->file_name_len;
- intern->_path = spl_filesystem_object_get_path(source, (size_t *)&intern->_path_len TSRMLS_CC);
+ intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC);
intern->_path = estrndup(intern->_path, intern->_path_len);
intern->u.file.open_mode = "r";
@@ -1506,27 +1506,23 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
- if (SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) {
- RETURN_STRINGL(intern->file_name, intern->file_name_len);
- } else {
- ZVAL_LONG(&zflags, intern->flags);
- ZVAL_STRINGL(&zpath, intern->file_name, intern->file_name_len);
- spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &zpath, &zflags TSRMLS_CC);
- zval_ptr_dtor(&zpath);
- zval_ptr_dtor(&zflags);
-
- subdir = Z_SPLFILESYSTEM_P(return_value);
- if (subdir) {
- if (intern->u.dir.sub_path && intern->u.dir.sub_path[0]) {
- subdir->u.dir.sub_path_len = (int)spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
- } else {
- subdir->u.dir.sub_path_len = (int)strlen(intern->u.dir.entry.d_name);
- subdir->u.dir.sub_path = estrndup(intern->u.dir.entry.d_name, subdir->u.dir.sub_path_len);
- }
- subdir->info_class = intern->info_class;
- subdir->file_class = intern->file_class;
- subdir->oth = intern->oth;
+ ZVAL_LONG(&zflags, intern->flags);
+ ZVAL_STRINGL(&zpath, intern->file_name, intern->file_name_len);
+ spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &zpath, &zflags TSRMLS_CC);
+ zval_ptr_dtor(&zpath);
+ zval_ptr_dtor(&zflags);
+
+ subdir = Z_SPLFILESYSTEM_P(return_value);
+ if (subdir) {
+ if (intern->u.dir.sub_path && intern->u.dir.sub_path[0]) {
+ subdir->u.dir.sub_path_len = (int)spprintf(&subdir->u.dir.sub_path, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
+ } else {
+ subdir->u.dir.sub_path_len = (int)strlen(intern->u.dir.entry.d_name);
+ subdir->u.dir.sub_path = estrndup(intern->u.dir.entry.d_name, subdir->u.dir.sub_path_len);
}
+ subdir->info_class = intern->info_class;
+ subdir->file_class = intern->file_class;
+ subdir->oth = intern->oth;
}
}
/* }}} */
diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h
index f1db1f69b9..b6c8b72933 100644
--- a/ext/spl/spl_directory.h
+++ b/ext/spl/spl_directory.h
@@ -63,10 +63,10 @@ struct _spl_filesystem_object {
void *oth;
spl_other_handler *oth_handler;
char *_path;
- int _path_len;
+ size_t _path_len;
char *orig_path;
char *file_name;
- int file_name_len;
+ size_t file_name_len;
SPL_FS_OBJ_TYPE type;
zend_long flags;
zend_class_entry *file_class;
@@ -76,7 +76,7 @@ struct _spl_filesystem_object {
php_stream *dirp;
php_stream_dirent entry;
char *sub_path;
- int sub_path_len;
+ size_t sub_path_len;
int index;
int is_recursive;
zend_function *func_rewind;
@@ -88,7 +88,7 @@ struct _spl_filesystem_object {
php_stream_context *context;
zval *zcontext;
char *open_mode;
- int open_mode_len;
+ size_t open_mode_len;
zval current_zval;
char *current_line;
size_t current_line_len;
diff --git a/ext/spl/tests/bug65213.phpt b/ext/spl/tests/bug65213.phpt
new file mode 100644
index 0000000000..5e34d9549c
--- /dev/null
+++ b/ext/spl/tests/bug65213.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #65213 (cannot cast SplFileInfo to boolean)
+--FILE--
+<?php
+
+$o = new SplFileInfo('.');
+var_dump((bool) $o);
+
+?>
+===DONE===
+--EXPECT--
+bool(true)
+===DONE===
diff --git a/ext/spl/tests/bug66405.phpt b/ext/spl/tests/bug66405.phpt
new file mode 100644
index 0000000000..b34e7b5074
--- /dev/null
+++ b/ext/spl/tests/bug66405.phpt
@@ -0,0 +1,59 @@
+--TEST--
+SPL: RecursiveDirectoryIterator with CURRENT_AS_PATHNAME flag
+--CREDITS--
+Paul Garvin pgarvin76@gmail.com
+--FILE--
+<?php
+$td = __DIR__ . '/bug66405';
+mkdir($td);
+touch($td . '/file1.txt');
+touch($td . '/file2.md');
+mkdir($td . '/testsubdir');
+touch($td . '/testsubdir/file3.csv');
+
+class Bug66405 extends RecursiveDirectoryIterator
+{
+ public function current()
+ {
+ $current = parent::current();
+ echo gettype($current) . " $current\n";
+ return $current;
+ }
+
+ public function getChildren()
+ {
+ $children = parent::getChildren();
+ if (is_object($children)) {
+ echo get_class($children) . " $children\n";
+ } else {
+ echo gettype($children) . " $children\n";
+ }
+ return $children;
+ }
+}
+
+$rdi = new Bug66405($td, FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS);
+$rii = new RecursiveIteratorIterator($rdi);
+
+ob_start();
+foreach ($rii as $file) {
+ //noop
+}
+$results = explode("\n", ob_get_clean());
+sort($results);
+echo implode("\n", $results);
+?>
+--CLEAN--
+<?php
+$td = __DIR__ . '/bug66405';
+unlink($td . '/testsubdir/file3.csv');
+unlink($td . '/file2.md');
+unlink($td . '/file1.txt');
+rmdir($td . '/testsubdir');
+rmdir($td);
+?>
+--EXPECTF--
+Bug66405 file3.csv
+string %sbug66405%efile1.txt
+string %sbug66405%efile2.md
+string %sbug66405%etestsubdir%efile3.csv
diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c
index 7fae04fcbf..efc4248732 100644
--- a/ext/standard/crypt.c
+++ b/ext/standard/crypt.c
@@ -196,7 +196,6 @@ PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const ch
} else if (
salt[0] == '$' &&
salt[1] == '2' &&
- salt[2] >= 'a' && salt[2] <= 'z' &&
salt[3] == '$' &&
salt[4] >= '0' && salt[4] <= '3' &&
salt[5] >= '0' && salt[5] <= '9' &&
@@ -219,7 +218,7 @@ PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const ch
_crypt_extended_init_r();
crypt_res = _crypt_extended_r(password, salt, &buffer);
- if (!crypt_res) {
+ if (!crypt_res || (salt[0] == '*' && salt[1] == '0')) {
return NULL;
} else {
result = zend_string_init(crypt_res, strlen(crypt_res), 0);
@@ -240,8 +239,8 @@ PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const ch
# error Data struct used by crypt_r() is unknown. Please report.
# endif
crypt_res = crypt_r(password, salt, &buffer);
- if (!crypt_res) {
- return FAILURE;
+ if (!crypt_res || (salt[0] == '*' && salt[1] == '0')) {
+ return NULL;
} else {
result = zend_string_init(crypt_res, strlen(crypt_res), 0);
return result;
diff --git a/ext/standard/crypt_blowfish.c b/ext/standard/crypt_blowfish.c
index e010352b55..43f35f661e 100644
--- a/ext/standard/crypt_blowfish.c
+++ b/ext/standard/crypt_blowfish.c
@@ -8,11 +8,11 @@
* and crypt(3) interfaces added, but optimizations specific to password
* cracking removed.
*
- * Written by Solar Designer <solar at openwall.com> in 1998-2011.
+ * Written by Solar Designer <solar at openwall.com> in 1998-2014.
* No copyright is claimed, and the software is hereby placed in the public
* domain. In case this attempt to disclaim copyright and place the software
* in the public domain is deemed null and void, then the software is
- * Copyright (c) 1998-2011 Solar Designer and it is hereby released to the
+ * Copyright (c) 1998-2014 Solar Designer and it is hereby released to the
* general public under the following terms:
*
* Redistribution and use in source and binary forms, with or without
@@ -28,12 +28,12 @@
* you place this code and any modifications you make under a license
* of your choice.
*
- * This implementation is mostly compatible with OpenBSD's bcrypt.c (prefix
- * "$2a$") by Niels Provos <provos at citi.umich.edu>, and uses some of his
- * ideas. The password hashing algorithm was designed by David Mazieres
- * <dm at lcs.mit.edu>. For more information on the level of compatibility,
- * please refer to the comments in BF_set_key() below and to the crypt(3)
- * man page included in the crypt_blowfish tarball.
+ * This implementation is fully compatible with OpenBSD's bcrypt.c for prefix
+ * "$2b$", originally by Niels Provos <provos at citi.umich.edu>, and it uses
+ * some of his ideas. The password hashing algorithm was designed by David
+ * Mazieres <dm at lcs.mit.edu>. For information on the level of
+ * compatibility for bcrypt hash prefixes other than "$2b$", please refer to
+ * the comments in BF_set_key() below and to the included crypt(3) man page.
*
* There's a paper on the algorithm that explains its design decisions:
*
@@ -583,6 +583,7 @@ static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
* Valid combinations of settings are:
*
* Prefix "$2a$": bug = 0, safety = 0x10000
+ * Prefix "$2b$": bug = 0, safety = 0
* Prefix "$2x$": bug = 1, safety = 0
* Prefix "$2y$": bug = 0, safety = 0
*/
@@ -646,6 +647,10 @@ static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
initial[0] ^= sign;
}
+static const unsigned char flags_by_subtype[26] =
+ {2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0};
+
static char *BF_crypt(const char *key, const char *setting,
char *output, int size,
BF_word min)
@@ -653,9 +658,6 @@ static char *BF_crypt(const char *key, const char *setting,
#if BF_ASM
extern void _BF_body_r(BF_ctx *ctx);
#endif
- static const unsigned char flags_by_subtype[26] =
- {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0};
struct {
BF_ctx ctx;
BF_key expanded_key;
@@ -821,9 +823,10 @@ char *php_crypt_blowfish_rn(const char *key, const char *setting,
{
const char *test_key = "8b \xd0\xc1\xd2\xcf\xcc\xd8";
const char *test_setting = "$2a$00$abcdefghijklmnopqrstuu";
- static const char * const test_hash[2] =
- {"VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55", /* $2x$ */
- "i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55"}; /* $2a$, $2y$ */
+ static const char * const test_hashes[2] =
+ {"i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55", /* 'a', 'b', 'y' */
+ "VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55"}; /* 'x' */
+ const char *test_hash = test_hashes[0];
char *retval;
const char *p;
int save_errno, ok;
@@ -845,17 +848,19 @@ char *php_crypt_blowfish_rn(const char *key, const char *setting,
* detected by the self-test.
*/
memcpy(buf.s, test_setting, sizeof(buf.s));
- if (retval)
+ if (retval) {
+ unsigned int flags = flags_by_subtype[
+ (unsigned int)(unsigned char)setting[2] - 'a'];
+ test_hash = test_hashes[flags & 1];
buf.s[2] = setting[2];
+ }
memset(buf.o, 0x55, sizeof(buf.o));
buf.o[sizeof(buf.o) - 1] = 0;
p = BF_crypt(test_key, buf.s, buf.o, sizeof(buf.o) - (1 + 1), 1);
ok = (p == buf.o &&
!memcmp(p, buf.s, 7 + 22) &&
- !memcmp(p + (7 + 22),
- test_hash[(unsigned int)(unsigned char)buf.s[2] & 1],
- 31 + 1 + 1 + 1));
+ !memcmp(p + (7 + 22), test_hash, 31 + 1 + 1 + 1));
{
const char *k = "\xff\xa3" "34" "\xff\xff\xff\xa3" "345";
@@ -885,7 +890,7 @@ char *_crypt_gensalt_blowfish_rn(const char *prefix, unsigned long count,
if (size < 16 || output_size < 7 + 22 + 1 ||
(count && (count < 4 || count > 31)) ||
prefix[0] != '$' || prefix[1] != '2' ||
- (prefix[2] != 'a' && prefix[2] != 'y')) {
+ (prefix[2] != 'a' && prefix[2] != 'b' && prefix[2] != 'y')) {
if (output_size > 0) output[0] = '\0';
__set_errno((output_size < 7 + 22 + 1) ? ERANGE : EINVAL);
return NULL;
diff --git a/ext/standard/dns.c b/ext/standard/dns.c
index 13a1ab75df..37cad8bfc9 100644
--- a/ext/standard/dns.c
+++ b/ext/standard/dns.c
@@ -896,7 +896,24 @@ PHP_FUNCTION(dns_get_record)
if (n < 0) {
php_dns_free_handle(handle);
- continue;
+ switch (h_errno) {
+ case NO_DATA:
+ case HOST_NOT_FOUND:
+ continue;
+
+ case NO_RECOVERY:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "An unexpected server failure occurred.");
+ break;
+
+ case TRY_AGAIN:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "A temporary server error occurred.");
+ break;
+
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "DNS Query failed");
+ }
+ zval_dtor(return_value);
+ RETURN_FALSE;
}
cp = answer.qb2 + HFIXEDSZ;
diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c
index 963d1f7a54..a0b917c5ca 100644
--- a/ext/standard/dns_win32.c
+++ b/ext/standard/dns_win32.c
@@ -456,7 +456,7 @@ PHP_FUNCTION(dns_get_record)
if (status == DNS_INFO_NO_RECORDS || status == DNS_ERROR_RCODE_NAME_ERROR) {
continue;
} else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Dns Query failed");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "DNS Query failed");
zval_dtor(return_value);
RETURN_FALSE;
}
diff --git a/ext/standard/head.c b/ext/standard/head.c
index 1417b52bc0..56f02a3989 100644
--- a/ext/standard/head.c
+++ b/ext/standard/head.c
@@ -40,11 +40,13 @@ PHP_FUNCTION(header)
{
zend_bool rep = 1;
sapi_header_line ctr = {0};
+ size_t len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|bl", &ctr.line,
- &ctr.line_len, &rep, &ctr.response_code) == FAILURE)
+ &len, &rep, &ctr.response_code) == FAILURE)
return;
+ ctr.line_len = (uint)len;
sapi_header_op(rep ? SAPI_HEADER_REPLACE:SAPI_HEADER_ADD, &ctr TSRMLS_CC);
}
/* }}} */
@@ -54,11 +56,13 @@ PHP_FUNCTION(header)
PHP_FUNCTION(header_remove)
{
sapi_header_line ctr = {0};
+ size_t len = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ctr.line,
- &ctr.line_len) == FAILURE)
+ &len) == FAILURE)
return;
+ ctr.line_len = (uint)len;
sapi_header_op(ZEND_NUM_ARGS() == 0 ? SAPI_HEADER_DELETE_ALL : SAPI_HEADER_DELETE, &ctr TSRMLS_CC);
}
/* }}} */
diff --git a/ext/standard/pack.c b/ext/standard/pack.c
index 4af72c34b8..f773eb26c5 100644
--- a/ext/standard/pack.c
+++ b/ext/standard/pack.c
@@ -560,7 +560,7 @@ PHP_FUNCTION(unpack)
{
char *format, *input;
zend_string *formatarg, *inputarg;
- size_t formatlen, inputpos, inputlen;
+ zend_long formatlen, inputpos, inputlen;
int i;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SS", &formatarg,
@@ -717,7 +717,7 @@ PHP_FUNCTION(unpack)
inputpos = 0;
}
- if ((size >=0 && (inputpos + size) <= inputlen) || (size < 0 && -size <= (inputlen - inputpos))) {
+ if ((inputpos + size) <= inputlen) {
switch ((int) type) {
case 'a': {
/* a will not strip any trailing whitespace or null padding */
@@ -1105,26 +1105,26 @@ PHP_MINIT_FUNCTION(pack)
machine_endian_longlong_map[1] = size - 7;
machine_endian_longlong_map[2] = size - 6;
machine_endian_longlong_map[3] = size - 5;
- machine_endian_longlong_map[0] = size - 4;
- machine_endian_longlong_map[1] = size - 3;
- machine_endian_longlong_map[2] = size - 2;
- machine_endian_longlong_map[3] = size - 1;
+ machine_endian_longlong_map[4] = size - 4;
+ machine_endian_longlong_map[5] = size - 3;
+ machine_endian_longlong_map[6] = size - 2;
+ machine_endian_longlong_map[7] = size - 1;
big_endian_longlong_map[0] = size - 8;
big_endian_longlong_map[1] = size - 7;
big_endian_longlong_map[2] = size - 6;
big_endian_longlong_map[3] = size - 5;
- big_endian_longlong_map[0] = size - 4;
- big_endian_longlong_map[1] = size - 3;
- big_endian_longlong_map[2] = size - 2;
- big_endian_longlong_map[3] = size - 1;
+ big_endian_longlong_map[4] = size - 4;
+ big_endian_longlong_map[5] = size - 3;
+ big_endian_longlong_map[6] = size - 2;
+ big_endian_longlong_map[7] = size - 1;
little_endian_longlong_map[0] = size - 1;
little_endian_longlong_map[1] = size - 2;
little_endian_longlong_map[2] = size - 3;
little_endian_longlong_map[3] = size - 4;
- little_endian_longlong_map[0] = size - 5;
- little_endian_longlong_map[1] = size - 6;
- little_endian_longlong_map[2] = size - 7;
- little_endian_longlong_map[3] = size - 8;
+ little_endian_longlong_map[4] = size - 5;
+ little_endian_longlong_map[5] = size - 6;
+ little_endian_longlong_map[6] = size - 7;
+ little_endian_longlong_map[7] = size - 8;
#endif
}
diff --git a/ext/standard/tests/file/bug68335.phpt b/ext/standard/tests/file/bug68335.phpt
new file mode 100644
index 0000000000..63eda4d923
--- /dev/null
+++ b/ext/standard/tests/file/bug68335.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #68335: rmdir doesnt work with file:// stream wrapper
+--FILE--
+<?php
+$dir = 'file://' . dirname(__FILE__) . '/testDir';
+mkdir($dir);
+var_dump(is_dir($dir));
+rmdir($dir);
+var_dump(is_dir($dir));
+?>
+--EXPECT--
+bool(true)
+bool(false)
diff --git a/ext/standard/tests/strings/crypt_blowfish.phpt b/ext/standard/tests/strings/crypt_blowfish.phpt
index 20a6a2750a..0bf0d1949e 100644
--- a/ext/standard/tests/strings/crypt_blowfish.phpt
+++ b/ext/standard/tests/strings/crypt_blowfish.phpt
@@ -18,8 +18,10 @@ $tests =array(
array('$2x$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e', "\xff\xff\xa3"),
array('$2y$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e', "\xff\xff\xa3"),
array('$2a$05$/OK.fbVrR/bpIqNJ5ianF.nqd1wy.pTMdcvrRWxyiGL2eMz.2a85.', "\xff\xff\xa3"),
+ array('$2b$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e', "\xff\xff\xa3"),
array('$2y$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3"),
array('$2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3"),
+ array('$2b$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3"),
array('$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi', "1\xa3345"),
array('$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi', "\xff\xa3345"),
array('$2x$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi', "\xff\xa334\xff\xff\xff\xa3345"),
@@ -36,14 +38,35 @@ $tests =array(
array('$2a$05$/OK.fbVrR/bpIqNJ5ianF.R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy', "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55"),
array('$2a$05$/OK.fbVrR/bpIqNJ5ianF.9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe', "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff"),
array('$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy', ''),
+);
+$tests2 = array(
+ array('$2a$03$CCCCCCCCCCCCCCCCCCCCC.', '*0'),
+ array('$2a$32$CCCCCCCCCCCCCCCCCCCCC.', '*0'),
+ array('$2c$05$CCCCCCCCCCCCCCCCCCCCC.', '*0'),
+ array('$2z$05$CCCCCCCCCCCCCCCCCCCCC.', '*0'),
+ array('$2`$05$CCCCCCCCCCCCCCCCCCCCC.', '*0'),
+ array('$2{$05$CCCCCCCCCCCCCCCCCCCCC.', '*0'),
+ array('*0', '*1'),
);
+
$i=0;
foreach($tests as $test) {
- if(crypt($test[1], $test[0]) == $test[0]) {
+ $result = crypt($test[1], $test[0]);
+ if($result === $test[0]) {
+ echo "$i. OK\n";
+ } else {
+ echo "$i. Not OK: $test[0] $result\n";
+ }
+ $i++;
+}
+
+foreach($tests2 as $test) {
+ $result = crypt('', $test[0]);
+ if($result === $test[1]) {
echo "$i. OK\n";
} else {
- echo "$i. Not OK: $test[0] ".crypt($test[1], $test[0])."\n";
+ echo "$i. Not OK: $test[0] $result\n";
}
$i++;
}
@@ -76,3 +99,12 @@ foreach($tests as $test) {
23. OK
24. OK
25. OK
+26. OK
+27. OK
+28. OK
+29. OK
+30. OK
+31. OK
+32. OK
+33. OK
+34. OK
diff --git a/ext/standard/tests/strings/unpack_bug68225.phpt b/ext/standard/tests/strings/unpack_bug68225.phpt
new file mode 100644
index 0000000000..7f8cdd4701
--- /dev/null
+++ b/ext/standard/tests/strings/unpack_bug68225.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Bug #68225 unpack and X format code
+--FILE--
+<?php
+
+$data = pack('VV', 1, 2);
+
+$result = unpack('Va/X' ,$data);
+var_dump($result);
+
+$result = unpack('Va/X4' ,$data);
+var_dump($result);
+
+$result = unpack('V1a/X4/V1b/V1c/X4/V1d', $data);
+var_dump($result);
+
+?>
+===DONE===
+--EXPECTF--
+array(1) {
+ ["a"]=>
+ int(1)
+}
+array(1) {
+ ["a"]=>
+ int(1)
+}
+array(4) {
+ ["a"]=>
+ int(1)
+ ["b"]=>
+ int(1)
+ ["c"]=>
+ int(2)
+ ["d"]=>
+ int(2)
+}
+===DONE===
+
diff --git a/main/main.c b/main/main.c
index 41e84a79f7..b58a643e84 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1121,8 +1121,8 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
if (!module_initialized || PG(log_errors)) {
char *log_buffer;
#ifdef PHP_WIN32
- if ((type == E_CORE_ERROR || type == E_CORE_WARNING) && PG(display_startup_errors)) {
- MessageBox(NULL, buffer, error_type_str, MB_OK|ZEND_SERVICE_MB_STYLE);
+ if (type == E_CORE_ERROR || type == E_CORE_WARNING) {
+ syslog(LOG_ALERT, "PHP %s: %s (%s)", error_type_str, buffer, GetCommandLine());
}
#endif
spprintf(&log_buffer, 0, "PHP %s: %s in %s on line %d", error_type_str, buffer, error_filename, error_lineno);
diff --git a/main/output.c b/main/output.c
index a068abc140..7811316358 100644
--- a/main/output.c
+++ b/main/output.c
@@ -961,6 +961,7 @@ static inline php_output_handler_status_t php_output_handler_op(php_output_handl
ZVAL_STRINGL(&ob_data, handler->buffer.data, handler->buffer.used);
ZVAL_LONG(&ob_mode, (zend_long) context->op);
zend_fcall_info_argn(&handler->func.user->fci TSRMLS_CC, 2, &ob_data, &ob_mode);
+ zval_ptr_dtor(&ob_data);
#define PHP_OUTPUT_USER_SUCCESS(retval) ((Z_TYPE(retval) != IS_UNDEF) && !(Z_TYPE(retval) == IS_FALSE))
if (SUCCESS == zend_fcall_info_call(&handler->func.user->fci, &handler->func.user->fcc, &retval, NULL TSRMLS_CC) && PHP_OUTPUT_USER_SUCCESS(retval)) {
diff --git a/main/php_ini.c b/main/php_ini.c
index a6c325b0fb..5303bf77ec 100644
--- a/main/php_ini.c
+++ b/main/php_ini.c
@@ -802,7 +802,7 @@ PHPAPI int php_ini_has_per_dir_config(void)
/* {{{ php_ini_activate_per_dir_config
*/
-PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC)
+PHPAPI void php_ini_activate_per_dir_config(char *path, size_t path_len TSRMLS_DC)
{
zval *tmp2;
char *ptr;
@@ -853,7 +853,7 @@ PHPAPI int php_ini_has_per_host_config(void)
/* {{{ php_ini_activate_per_host_config
*/
-PHPAPI void php_ini_activate_per_host_config(const char *host, uint host_len TSRMLS_DC)
+PHPAPI void php_ini_activate_per_host_config(const char *host, size_t host_len TSRMLS_DC)
{
zval *tmp;
@@ -876,7 +876,7 @@ PHPAPI zval *cfg_get_entry_ex(zend_string *name)
/* {{{ cfg_get_entry
*/
-PHPAPI zval *cfg_get_entry(const char *name, uint name_length)
+PHPAPI zval *cfg_get_entry(const char *name, size_t name_length)
{
return zend_hash_str_find(&configuration_hash, name, name_length);
}
diff --git a/main/php_ini.h b/main/php_ini.h
index 99f6a07a07..7022507f51 100644
--- a/main/php_ini.h
+++ b/main/php_ini.h
@@ -29,7 +29,7 @@ int php_init_config(TSRMLS_D);
int php_shutdown_config(void);
void php_ini_register_extensions(TSRMLS_D);
PHPAPI zval *cfg_get_entry_ex(zend_string *name);
-PHPAPI zval *cfg_get_entry(const char *name, uint name_length);
+PHPAPI zval *cfg_get_entry(const char *name, size_t name_length);
PHPAPI int cfg_get_long(const char *varname, zend_long *result);
PHPAPI int cfg_get_double(const char *varname, double *result);
PHPAPI int cfg_get_string(const char *varname, char **result);
@@ -37,8 +37,8 @@ PHPAPI int php_parse_user_ini_file(const char *dirname, char *ini_filename, Hash
PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int stage TSRMLS_DC);
PHPAPI int php_ini_has_per_dir_config(void);
PHPAPI int php_ini_has_per_host_config(void);
-PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC);
-PHPAPI void php_ini_activate_per_host_config(const char *host, uint host_len TSRMLS_DC);
+PHPAPI void php_ini_activate_per_dir_config(char *path, size_t path_len TSRMLS_DC);
+PHPAPI void php_ini_activate_per_host_config(const char *host, size_t host_len TSRMLS_DC);
PHPAPI HashTable* php_ini_get_configuration_hash(void);
END_EXTERN_C()
diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index 8590647818..8fad2aa4f1 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -1036,12 +1036,8 @@ static php_stream *php_plain_files_stream_opener(php_stream_wrapper *wrapper, co
static int php_plain_files_url_stater(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC)
{
- char *p;
-
- if ((p = strstr(url, "://")) != NULL) {
- if (p < strchr(url, '/')) {
- url = p + 3;
- }
+ if (strncasecmp(url, "file://", sizeof("file://") - 1) == 0) {
+ url += sizeof("file://") - 1;
}
if (php_check_open_basedir_ex(url, (flags & PHP_STREAM_URL_STAT_QUIET) ? 0 : 1 TSRMLS_CC)) {
@@ -1066,13 +1062,10 @@ static int php_plain_files_url_stater(php_stream_wrapper *wrapper, const char *u
static int php_plain_files_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC)
{
- char *p;
int ret;
- if ((p = strstr(url, "://")) != NULL) {
- if (p < strchr(url, '/')) {
- url = p + 3;
- }
+ if (strncasecmp(url, "file://", sizeof("file://") - 1) == 0) {
+ url += sizeof("file://") - 1;
}
if (php_check_open_basedir(url TSRMLS_CC)) {
@@ -1095,7 +1088,6 @@ static int php_plain_files_unlink(php_stream_wrapper *wrapper, const char *url,
static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC)
{
- char *p;
int ret;
if (!url_from || !url_to) {
@@ -1113,16 +1105,12 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_f
}
#endif
- if ((p = strstr(url_from, "://")) != NULL) {
- if (p < strchr(url_from, '/')) {
- url_from = p + 3;
- }
+ if (strncasecmp(url_from, "file://", sizeof("file://") - 1) == 0) {
+ url_from += sizeof("file://") - 1;
}
- if ((p = strstr(url_to, "://")) != NULL) {
- if (p < strchr(url_to, '/')) {
- url_to = p + 3;
- }
+ if (strncasecmp(url_to, "file://", sizeof("file://") - 1) == 0) {
+ url_to += sizeof("file://") - 1;
}
if (php_check_open_basedir(url_from TSRMLS_CC) || php_check_open_basedir(url_to TSRMLS_CC)) {
@@ -1187,10 +1175,8 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
int ret, recursive = options & PHP_STREAM_MKDIR_RECURSIVE;
char *p;
- if ((p = strstr(dir, "://")) != NULL) {
- if (p < strchr(dir, '/')) {
- dir = p + 3;
- }
+ if (strncasecmp(dir, "file://", sizeof("file://") - 1) == 0) {
+ dir += sizeof("file://") - 1;
}
if (!recursive) {
@@ -1272,15 +1258,16 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
static int php_plain_files_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC)
{
-#if PHP_WIN32
- int url_len = (int)strlen(url);
-#endif
+ if (strncasecmp(url, "file://", sizeof("file://") - 1) == 0) {
+ url += sizeof("file://") - 1;
+ }
+
if (php_check_open_basedir(url TSRMLS_CC)) {
return 0;
}
#if PHP_WIN32
- if (!php_win32_check_trailing_space(url, url_len)) {
+ if (!php_win32_check_trailing_space(url, (int)strlen(url))) {
php_error_docref1(NULL TSRMLS_CC, url, E_WARNING, "%s", strerror(ENOENT));
return 0;
}
@@ -1300,7 +1287,6 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, const char *url, i
static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url, int option, void *value, php_stream_context *context TSRMLS_DC)
{
struct utimbuf *newtime;
- char *p;
#if !defined(WINDOWS) && !defined(NETWARE)
uid_t uid;
gid_t gid;
@@ -1318,10 +1304,8 @@ static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url
}
#endif
- if ((p = strstr(url, "://")) != NULL) {
- if (p < strchr(url, '/')) {
- url = p + 3;
- }
+ if (strncasecmp(url, "file://", sizeof("file://") - 1) == 0) {
+ url += sizeof("file://") - 1;
}
if (php_check_open_basedir(url TSRMLS_CC)) {
diff --git a/run-tests.php b/run-tests.php
index e2d0f9987f..15b7fe2093 100755
--- a/run-tests.php
+++ b/run-tests.php
@@ -240,6 +240,7 @@ $ini_overwrites = array(
'ignore_repeated_errors=0',
'precision=14',
'memory_limit=128M',
+ 'log_errors_max_len=0',
'opcache.fast_shutdown=0',
'opcache.file_update_protection=0',
);
@@ -313,7 +314,7 @@ VALGRIND : " . ($leak_check ? $valgrind_header : 'Not used') . "
define('PHP_QA_EMAIL', 'qa-reports@lists.php.net');
define('QA_SUBMISSION_PAGE', 'http://qa.php.net/buildtest-process.php');
define('QA_REPORTS_PAGE', 'http://qa.php.net/reports');
-define('TRAVIS_CI' , (bool) getenv('TRAVIS_PHP_VERSION'));
+define('TRAVIS_CI' , (bool) getenv('TRAVIS'));
function save_or_mail_results()
{
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
index 5807d8a64d..94f35a6c83 100644
--- a/sapi/cgi/cgi_main.c
+++ b/sapi/cgi/cgi_main.c
@@ -274,7 +274,7 @@ static void print_extensions(TSRMLS_D)
#define STDOUT_FILENO 1
#endif
-static inline size_t sapi_cgi_single_write(const char *str, uint str_length TSRMLS_DC)
+static inline size_t sapi_cgi_single_write(const char *str, size_t str_length TSRMLS_DC)
{
#ifdef PHP_WRITE_STDOUT
int ret;
@@ -316,7 +316,8 @@ static size_t sapi_fcgi_ub_write(const char *str, size_t str_length TSRMLS_DC)
fcgi_request *request = (fcgi_request*) SG(server_context);
while (remaining > 0) {
- zend_long ret = fcgi_write(request, FCGI_STDOUT, ptr, remaining);
+ int to_write = remaining > INT_MAX ? INT_MAX : (int)remaining;
+ int ret = fcgi_write(request, FCGI_STDOUT, ptr, to_write);
if (ret <= 0) {
php_handle_aborted_connection();
@@ -520,7 +521,14 @@ static size_t sapi_cgi_read_post(char *buffer, size_t count_bytes TSRMLS_DC)
count_bytes = MIN(count_bytes, remaining_bytes);
while (read_bytes < count_bytes) {
+#ifdef PHP_WIN32
+ size_t diff = count_bytes - read_bytes;
+ unsigned int to_read = (diff > UINT_MAX) ? UINT_MAX : (unsigned int)diff;
+
+ tmp_read_bytes = read(STDIN_FILENO, buffer + read_bytes, to_read);
+#else
tmp_read_bytes = read(STDIN_FILENO, buffer + read_bytes, count_bytes - read_bytes);
+#endif
if (tmp_read_bytes <= 0) {
break;
}
@@ -540,7 +548,10 @@ static size_t sapi_fcgi_read_post(char *buffer, size_t count_bytes TSRMLS_DC)
count_bytes = remaining;
}
while (read_bytes < count_bytes) {
- tmp_read_bytes = fcgi_read(request, buffer + read_bytes, count_bytes - read_bytes);
+ size_t diff = count_bytes - read_bytes;
+ int to_read = (diff > INT_MAX) ? INT_MAX : (int)diff;
+
+ tmp_read_bytes = fcgi_read(request, buffer + read_bytes, to_read);
if (tmp_read_bytes <= 0) {
break;
}
@@ -561,7 +572,7 @@ static char *sapi_fcgi_getenv(char *name, size_t name_len TSRMLS_DC)
* of a request. So we have to do our own lookup to get env
* vars. This could probably be faster somehow. */
fcgi_request *request = (fcgi_request*) SG(server_context);
- char *ret = fcgi_getenv(request, name, name_len);
+ char *ret = fcgi_getenv(request, name, (int)name_len);
if (ret) return ret;
/* if cgi, or fastcgi and not found in fcgi env
@@ -569,10 +580,10 @@ static char *sapi_fcgi_getenv(char *name, size_t name_len TSRMLS_DC)
return getenv(name);
}
-static char *_sapi_cgi_putenv(char *name, int name_len, char *value)
+static char *_sapi_cgi_putenv(char *name, size_t name_len, char *value)
{
#if !HAVE_SETENV || !HAVE_UNSETENV
- int len;
+ size_t len;
char *buf;
#endif
@@ -689,10 +700,10 @@ static void sapi_cgi_register_variables(zval *track_vars_array TSRMLS_DC)
}
if (path_info) {
- unsigned int path_info_len = strlen(path_info);
+ size_t path_info_len = strlen(path_info);
if (script_name) {
- unsigned int script_name_len = strlen(script_name);
+ size_t script_name_len = strlen(script_name);
php_self_len = script_name_len + path_info_len;
php_self = do_alloca(php_self_len + 1, use_heap);
@@ -737,12 +748,12 @@ static void sapi_cgi_log_message(char *message TSRMLS_DC)
request = (fcgi_request*) SG(server_context);
if (request) {
- int len = strlen(message);
+ int len = (int)strlen(message);
char *buf = malloc(len+2);
memcpy(buf, message, len);
memcpy(buf + len, "\n", sizeof("\n"));
- fcgi_write(request, FCGI_STDERR, buf, len+1);
+ fcgi_write(request, FCGI_STDERR, buf, (int)(len+1));
free(buf);
} else {
fprintf(stderr, "%s\n", message);
@@ -755,11 +766,11 @@ static void sapi_cgi_log_message(char *message TSRMLS_DC)
/* {{{ php_cgi_ini_activate_user_config
*/
-static void php_cgi_ini_activate_user_config(char *path, int path_len, const char *doc_root, int doc_root_len, int start TSRMLS_DC)
+static void php_cgi_ini_activate_user_config(char *path, size_t path_len, const char *doc_root, size_t doc_root_len, int start TSRMLS_DC)
{
char *ptr;
user_config_cache_entry *new_entry, *entry;
- time_t request_time = sapi_get_request_time(TSRMLS_C);
+ time_t request_time = (time_t)sapi_get_request_time(TSRMLS_C);
/* Find cached config entry: If not found, create one */
if ((entry = zend_hash_str_find_ptr(&CGIG(user_config_cache), path, path_len)) == NULL) {
@@ -773,9 +784,9 @@ static void php_cgi_ini_activate_user_config(char *path, int path_len, const cha
/* Check whether cache entry has expired and rescan if it is */
if (request_time > entry->expires) {
char *real_path = NULL;
- int real_path_len;
+ size_t real_path_len;
char *s1, *s2;
- int s_len;
+ size_t s_len;
/* Clear the expired config */
zend_hash_clean(entry->user_config);
@@ -834,7 +845,7 @@ static void php_cgi_ini_activate_user_config(char *path, int path_len, const cha
static int sapi_cgi_activate(TSRMLS_D)
{
char *path, *doc_root, *server_name;
- uint path_len, doc_root_len, server_name_len;
+ size_t path_len, doc_root_len, server_name_len;
/* PATH_TRANSLATED should be defined at this stage but better safe than sorry :) */
if (!SG(request_info).path_translated) {
@@ -901,7 +912,7 @@ static int sapi_cgi_activate(TSRMLS_D)
doc_root = estrndup(doc_root, doc_root_len);
zend_str_tolower(doc_root, doc_root_len);
#endif
- php_cgi_ini_activate_user_config(path, path_len, doc_root, doc_root_len, doc_root_len - 1 TSRMLS_CC);
+ php_cgi_ini_activate_user_config(path, path_len, doc_root, doc_root_len, (doc_root_len > 0 && (doc_root_len - 1)) TSRMLS_CC);
#ifdef PHP_WIN32
efree(doc_root);
@@ -1200,7 +1211,7 @@ static void init_request_info(fcgi_request *request TSRMLS_DC)
char *orig_path_info = env_path_info;
char *orig_script_name = env_script_name;
char *orig_script_filename = env_script_filename;
- int script_path_translated_len;
+ size_t script_path_translated_len;
if (!env_document_root && PG(doc_root)) {
env_document_root = CGI_PUTENV("DOCUMENT_ROOT", PG(doc_root));
@@ -1241,7 +1252,7 @@ static void init_request_info(fcgi_request *request TSRMLS_DC)
(real_path = tsrm_realpath(script_path_translated, NULL TSRMLS_CC)) == NULL)
) {
char *pt = estrndup(script_path_translated, script_path_translated_len);
- int len = script_path_translated_len;
+ size_t len = script_path_translated_len;
char *ptr;
while ((ptr = strrchr(pt, '/')) || (ptr = strrchr(pt, '\\'))) {
@@ -1262,8 +1273,8 @@ static void init_request_info(fcgi_request *request TSRMLS_DC)
* we have to play the game of hide and seek to figure
* out what SCRIPT_NAME should be
*/
- int slen = len - strlen(pt);
- int pilen = env_path_info ? strlen(env_path_info) : 0;
+ size_t slen = len - strlen(pt);
+ size_t pilen = env_path_info ? strlen(env_path_info) : 0;
char *path_info = env_path_info ? env_path_info + pilen - slen : NULL;
if (orig_path_info != path_info) {
@@ -1299,8 +1310,8 @@ static void init_request_info(fcgi_request *request TSRMLS_DC)
* SCRIPT_FILENAME minus SCRIPT_NAME
*/
if (env_document_root) {
- int l = strlen(env_document_root);
- int path_translated_len = 0;
+ size_t l = strlen(env_document_root);
+ size_t path_translated_len = 0;
char *path_translated = NULL;
if (l && env_document_root[l - 1] == '/') {
@@ -1329,8 +1340,8 @@ static void init_request_info(fcgi_request *request TSRMLS_DC)
strstr(pt, env_script_name)
) {
/* PATH_TRANSLATED = PATH_TRANSLATED - SCRIPT_NAME + PATH_INFO */
- int ptlen = strlen(pt) - strlen(env_script_name);
- int path_translated_len = ptlen + (env_path_info ? strlen(env_path_info) : 0);
+ size_t ptlen = strlen(pt) - strlen(env_script_name);
+ size_t path_translated_len = ptlen + (env_path_info ? strlen(env_path_info) : 0);
char *path_translated = NULL;
path_translated = (char *) emalloc(path_translated_len + 1);
@@ -1670,16 +1681,18 @@ PHP_FUNCTION(apache_request_headers) /* {{{ */
static void add_response_header(sapi_header_struct *h, zval *return_value TSRMLS_DC) /* {{{ */
{
char *s, *p;
- int len;
+ size_t len = 0;
ALLOCA_FLAG(use_heap)
if (h->header_len > 0) {
p = strchr(h->header, ':');
- len = p - h->header;
- if (p && (len > 0)) {
- while (len > 0 && (h->header[len-1] == ' ' || h->header[len-1] == '\t')) {
+ if (NULL != p) {
+ len = p - h->header;
+ }
+ if (len > 0) {
+ do {
len--;
- }
+ } while (len != 0 && (h->header[len-1] == ' ' || h->header[len-1] == '\t'));
if (len) {
s = do_alloca(len + 1, use_heap);
memcpy(s, h->header, len);
@@ -1739,7 +1752,8 @@ int main(int argc, char *argv[])
{
int free_query_string = 0;
int exit_status = SUCCESS;
- int cgi = 0, c, i, len;
+ int cgi = 0, c, i;
+ size_t len;
zend_file_handle file_handle;
char *s;
@@ -1749,7 +1763,7 @@ int main(int argc, char *argv[])
int orig_optind = php_optind;
char *orig_optarg = php_optarg;
char *script_file = NULL;
- int ini_entries_len = 0;
+ size_t ini_entries_len = 0;
/* end of temporary locals */
#ifdef ZTS
@@ -1854,7 +1868,7 @@ int main(int argc, char *argv[])
break;
case 'd': {
/* define ini entries on command line */
- int len = strlen(php_optarg);
+ size_t len = strlen(php_optarg);
char *val;
if ((val = strchr(php_optarg, '='))) {
@@ -2295,7 +2309,7 @@ consult the installation file that came with this distribution, or visit \n\
* test.php v1=test "v2=hello world!"
*/
if (!SG(request_info).query_string && argc > php_optind) {
- int slen = strlen(PG(arg_separator).input);
+ size_t slen = strlen(PG(arg_separator).input);
len = 0;
for (i = php_optind; i < argc; i++) {
if (i < (argc - 1)) {
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index 367800635f..f024b09980 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -2233,7 +2233,7 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c
*p++ = '\0';
if (*p == ':') {
port = strtol(p + 1, &p, 10);
- if (port <= 0) {
+ if (port <= 0 || port > 65535) {
p = NULL;
}
} else if (*p != '\0') {
@@ -2249,7 +2249,7 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c
if (p) {
*p++ = '\0';
port = strtol(p, &p, 10);
- if (port <= 0) {
+ if (port <= 0 || port > 65535) {
p = NULL;
}
}
diff --git a/sapi/cli/tests/bug64529.phpt b/sapi/cli/tests/bug64529.phpt
index d3755724e8..8452953baf 100644
--- a/sapi/cli/tests/bug64529.phpt
+++ b/sapi/cli/tests/bug64529.phpt
@@ -21,7 +21,7 @@ if (extension_loaded("readline")) {
set php_executable [lindex \$argv 0]
-spawn \$php_executable -n -a
+spawn \$php_executable -n -d cli.prompt="" -a
expect "php >"
@@ -39,7 +39,7 @@ SCRIPT;
set php_executable [lindex \$argv 0]
-spawn \$php_executable -n -a
+spawn \$php_executable -n -d cli.prompt="" -a
expect "Interactive mode enabled"
@@ -60,8 +60,8 @@ system($expect_executable . " " . $script . " " . $php_executable);
@unlink($script);
?>
--EXPECTF--
-spawn %sphp -n -a
+spawn %sphp -n -d cli.prompt="" -a
Interactive %s
-%secho 'hello world';
-%sello worl%s
+%Secho 'hello world';
+%Shello world
diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c
index e4e494876f..38a7acf63d 100644
--- a/sapi/fpm/fpm/fpm_sockets.c
+++ b/sapi/fpm/fpm/fpm_sockets.c
@@ -201,12 +201,9 @@ static int fpm_sockets_new_listening_socket(struct fpm_worker_pool_s *wp, struct
umask(saved_umask);
- if (wp->socket_uid != -1 || wp->socket_gid != -1) {
- if (0 > chown(path, wp->socket_uid, wp->socket_gid)) {
- zlog(ZLOG_SYSERROR, "failed to chown() the socket '%s'", wp->config->listen_address);
- close(sock);
- return -1;
- }
+ if (0 > fpm_unix_set_socket_premissions(wp, path)) {
+ close(sock);
+ return -1;
}
}
diff --git a/sapi/fpm/fpm/fpm_unix.c b/sapi/fpm/fpm/fpm_unix.c
index 32448fc4d5..57707d8f8a 100644
--- a/sapi/fpm/fpm/fpm_unix.c
+++ b/sapi/fpm/fpm/fpm_unix.c
@@ -76,6 +76,18 @@ int fpm_unix_resolve_socket_premissions(struct fpm_worker_pool_s *wp) /* {{{ */
}
/* }}} */
+int fpm_unix_set_socket_premissions(struct fpm_worker_pool_s *wp, const char *path) /* {{{ */
+{
+ if (wp->socket_uid != -1 || wp->socket_gid != -1) {
+ if (0 > chown(path, wp->socket_uid, wp->socket_gid)) {
+ zlog(ZLOG_SYSERROR, "failed to chown() the socket '%s'", wp->config->listen_address);
+ return -1;
+ }
+ }
+ return 0;
+}
+/* }}} */
+
static int fpm_unix_conf_wp(struct fpm_worker_pool_s *wp) /* {{{ */
{
struct passwd *pwd;
@@ -187,7 +199,9 @@ int fpm_unix_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
return -1;
}
} else if (made_chroot) {
- chdir("/");
+ if (0 > chdir("/")) {
+ zlog(ZLOG_WARNING, "[pool %s] failed to chdir(/)", wp->config->name);
+ }
}
if (is_root) {
diff --git a/sapi/fpm/fpm/fpm_unix.h b/sapi/fpm/fpm/fpm_unix.h
index 3451db126b..b2995ff3e0 100644
--- a/sapi/fpm/fpm/fpm_unix.h
+++ b/sapi/fpm/fpm/fpm_unix.h
@@ -8,6 +8,7 @@
#include "fpm_worker_pool.h"
int fpm_unix_resolve_socket_premissions(struct fpm_worker_pool_s *wp);
+int fpm_unix_set_socket_premissions(struct fpm_worker_pool_s *wp, const char *path);
int fpm_unix_init_child(struct fpm_worker_pool_s *wp);
int fpm_unix_init_main();
diff --git a/sapi/fpm/tests/015.phpt b/sapi/fpm/tests/015.phpt
index fba333e256..c7af5f7572 100644
--- a/sapi/fpm/tests/015.phpt
+++ b/sapi/fpm/tests/015.phpt
@@ -2,6 +2,10 @@
FPM: Test various messages on start, from master and childs
--SKIPIF--
<?php include "skipif.inc"; ?>
+--XFAIL--
+randomly intermittently failing all the time in CI,
+ERROR: unable to read what child say: Bad file descriptor (9)
+catch_workers_output = yes seems not reliable
--FILE--
<?php
diff --git a/sapi/fpm/tests/019.phpt b/sapi/fpm/tests/019.phpt
index cdf8126244..3ae4b348d9 100644
--- a/sapi/fpm/tests/019.phpt
+++ b/sapi/fpm/tests/019.phpt
@@ -29,7 +29,6 @@ pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
-catch_workers_output = yes
EOT;
$fpm = run_fpm($cfg, $tail, '--prefix '.__DIR__);
diff --git a/sapi/fpm/tests/020.phpt b/sapi/fpm/tests/020.phpt
index d45eeccff8..dbd43d05fe 100644
--- a/sapi/fpm/tests/020.phpt
+++ b/sapi/fpm/tests/020.phpt
@@ -31,7 +31,6 @@ pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
-catch_workers_output = yes
EOT;
$fpm = run_fpm($cfg, $tail);
diff --git a/sapi/phpdbg/phpdbg_frame.c b/sapi/phpdbg/phpdbg_frame.c
index f42fc659f1..c9ba377d95 100644
--- a/sapi/phpdbg/phpdbg_frame.c
+++ b/sapi/phpdbg/phpdbg_frame.c
@@ -37,7 +37,7 @@ void phpdbg_restore_frame(TSRMLS_D) /* {{{ */
/* move things back */
EG(current_execute_data) = PHPDBG_FRAME(execute_data);
- EG(scope) = PHPDBG_EX(scope);
+ EG(scope) = PHPDBG_EX(func)->op_array.scope;
} /* }}} */
void phpdbg_switch_frame(int frame TSRMLS_DC) /* {{{ */
@@ -79,7 +79,7 @@ void phpdbg_switch_frame(int frame TSRMLS_DC) /* {{{ */
PHPDBG_FRAME(execute_data) = EG(current_execute_data);
EG(current_execute_data) = execute_data;
- EG(scope) = PHPDBG_EX(scope);
+ EG(scope) = PHPDBG_EX(func)->op_array.scope;
}
phpdbg_notice("frame", "id=\"%d\"", "Switched to frame #%d", frame);
diff --git a/travis/install.sh b/travis/install.sh
new file mode 100755
index 0000000000..5c6a3c1913
--- /dev/null
+++ b/travis/install.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+sudo apt-get install re2c libgmp-dev libicu-dev libmcrypt-dev libtidy-dev
diff --git a/win32/build/config.w32 b/win32/build/config.w32
index 47773dcffb..6b06cfead0 100644
--- a/win32/build/config.w32
+++ b/win32/build/config.w32
@@ -107,7 +107,7 @@ var php_usual_lib_suspects = PHP_PHP_BUILD+"\\lib";
ADD_FLAG("CFLAGS", '/I "' + php_usual_include_suspects + '" ');
ADD_FLAG("LDFLAGS", '/libpath:"' + php_usual_lib_suspects + '" ');
-ADD_FLAG("ARFLAGS", '/libpath:"' + php_usual_lib_suspects + '" ');
+ADD_FLAG("ARFLAGS", '/nologo /libpath:"' + php_usual_lib_suspects + '" ');
probe_basic_headers();
add_extra_dirs();
@@ -254,3 +254,6 @@ if (CLANG_TOOLSET) {
}
}
+ARG_WITH("codegen-arch", "Architecture for code generation: ia32, sse, sse2, avx, avx2", "no");
+toolset_setup_codegen_arch();
+
diff --git a/win32/build/config.w32.phpize.in b/win32/build/config.w32.phpize.in
index a340af0e60..d68a21fc6e 100644
--- a/win32/build/config.w32.phpize.in
+++ b/win32/build/config.w32.phpize.in
@@ -126,3 +126,7 @@ DEFINE('SNAPSHOT_TEMPLATE', PHP_SNAPSHOT_TEMPLATE);
AC_DEFINE("PHP_DIR", PHP_DIR);
DEFINE("PHP_DIR", PHP_DIR);
+
+ARG_WITH("codegen-arch", "Architecture for code generation", "no");
+toolset_setup_codegen_arch();
+
diff --git a/win32/build/confutils.js b/win32/build/confutils.js
index 7d02f99ad6..8a4cb9347b 100644
--- a/win32/build/confutils.js
+++ b/win32/build/confutils.js
@@ -1099,7 +1099,7 @@ function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
manifest = "-@$(_VC_MANIFEST_EMBED_DLL)";
} else if (makefiletarget.match(new RegExp("\\.lib$"))) {
ldflags = "$(ARFLAGS)";
- ld = "$(MAKE_LIB)";
+ ld = "@$(MAKE_LIB)";
} else {
ldflags = "$(LDFLAGS)";
manifest = "-@$(_VC_MANIFEST_EMBED_EXE)";
@@ -2544,6 +2544,20 @@ function toolset_setup_arch()
DEFINE("PHP_ARCHITECTURE", X64 ? 'x64' : 'x86');
}
+function toolset_setup_codegen_arch()
+{
+ if("no" == PHP_CODEGEN_ARCH) {
+ return;
+ }
+
+ if (VS_TOOLSET) {
+ var arc = PHP_CODEGEN_ARCH.toUpperCase();
+
+ if ("AVX2" == arc || "AVX" == arc || "SSE2" == arc || "SSE" == arc || "IA32" == arc) {
+ ADD_FLAG("CFLAGS", "/arch:" + arc);
+ }
+ }
+}
function toolset_setup_linker()
{