summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-09-25 18:48:27 +0200
committerAnatol Belski <ab@php.net>2014-09-25 18:48:27 +0200
commitd11734b4b00f57de80d931ad1c522e00082443af (patch)
treec4fdd11760b3db34994144b4cd5b4c169eaf71d4 /Zend
parenta2dd6069420c77b4f070ef10916be0d5c9afe84f (diff)
downloadphp-git-d11734b4b00f57de80d931ad1c522e00082443af.tar.gz
reworked the patch, less new stuff but worky
TLS is already used in TSRM, the way exporting the tsrm cache through a thread local variable is not portable. Additionally, the current patch suffers from bugs which are hard to find, but prevent it to be worky with apache. What is done here is mainly uses the idea from the RFC patch, but - __thread variable is removed - offset math and declarations are removed - extra macros and definitions are removed What is done merely is - use an inline function to access the tsrm cache. The function uses the portable tsrm_tls_get macro which is cheap - all the TSRM_* macros are set to placebo. Thus this opens the way remove them later Except that, the logic is old. TSRMLS_FETCH will have to be done once per thread, then tsrm_get_ls_cache() can be used. Things seeming to be worky are cli, cli server and apache. I also tried to enable bz2 shared and it has worked out of the box. The change is yet minimal diffing to the current master bus is a worky start, IMHO. Though will have to recheck the other previously done SAPIs - embed and cgi. The offsets can be added to the tsrm_resource_type struct, then it'll not be needed to declare them in the userspace. Even the "done" member type can be changed to int16 or smaller, then adding the offset as int16 will not change the struct size. As well on the todo might be removing the hashed storage, thread_id != thread_id and linked list logic in favour of the explicit TLS operations.
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend.c16
-rw-r--r--Zend/zend.h5
-rw-r--r--Zend/zend_API.c2
-rw-r--r--Zend/zend_API.h6
-rw-r--r--Zend/zend_alloc.c4
-rw-r--r--Zend/zend_compile.c6
-rw-r--r--Zend/zend_execute_API.c23
-rw-r--r--Zend/zend_gc.c4
-rw-r--r--Zend/zend_gc.h2
-rw-r--r--Zend/zend_globals.h4
-rw-r--r--Zend/zend_globals_macros.h10
-rw-r--r--Zend/zend_ini_parser.y2
-rw-r--r--Zend/zend_ini_scanner.c2
-rw-r--r--Zend/zend_ini_scanner.l2
-rw-r--r--Zend/zend_language_parser.y4
-rw-r--r--Zend/zend_language_scanner.c2
-rw-r--r--Zend/zend_language_scanner.l2
-rw-r--r--Zend/zend_modules.h7
-rw-r--r--Zend/zend_operators.c28
-rw-r--r--Zend/zend_stack.c5
-rw-r--r--Zend/zend_virtual_cwd.c4
-rw-r--r--Zend/zend_virtual_cwd.h2
-rw-r--r--Zend/zend_vm_def.h81
-rw-r--r--Zend/zend_vm_execute.h170
24 files changed, 116 insertions, 277 deletions
diff --git a/Zend/zend.c b/Zend/zend.c
index 8b9459ff3d..4b1b89087f 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -113,8 +113,8 @@ ZEND_INI_END()
#ifdef ZTS
-TSRMG_D(zend_compiler_globals, compiler_globals_id);
-TSRMG_D(zend_executor_globals, executor_globals_id);
+ZEND_API int compiler_globals_id;
+ZEND_API int executor_globals_id;
static HashTable *global_function_table = NULL;
static HashTable *global_class_table = NULL;
static HashTable *global_constants_table = NULL;
@@ -578,8 +578,8 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions TS
#ifdef ZTS
zend_compiler_globals *compiler_globals;
zend_executor_globals *executor_globals;
- TSRMG_DH(zend_ini_scanner_globals, ini_scanner_globals_id);
- TSRMG_DH(zend_php_scanner_globals, language_scanner_globals_id);
+ extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
+ extern ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
extern zend_ini_scanner_globals ini_scanner_globals;
extern zend_php_scanner_globals language_scanner_globals;
@@ -652,10 +652,10 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions TS
zend_init_rsrc_list_dtors();
#ifdef ZTS
- TSRMG_ALLOCATE(compiler_globals_id, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
- TSRMG_ALLOCATE(executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
- TSRMG_ALLOCATE(language_scanner_globals_id, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
- TSRMG_ALLOCATE(ini_scanner_globals_id, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
+ ts_allocate_id(&compiler_globals_id, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
+ ts_allocate_id(&executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
+ ts_allocate_id(&language_scanner_globals_id, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
+ ts_allocate_id(&ini_scanner_globals_id, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
diff --git a/Zend/zend.h b/Zend/zend.h
index 7fa66cde55..517d419665 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -71,11 +71,6 @@ void zend_error_noreturn(int type, const char *format, ...) ZEND_NORETURN;
# define zend_error_noreturn zend_error
#endif
-#ifdef ZTS
-TSRMG_DH(zend_compiler_globals, compiler_globals_id);
-TSRMG_DH(zend_executor_globals, executor_globals_id);
-#endif
-
/* overloaded elements data types */
#define OE_IS_ARRAY (1<<0)
#define OE_IS_OBJECT (1<<1)
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index bfb2f0e5a1..41adbeba8f 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1876,7 +1876,7 @@ ZEND_API int zend_startup_module_ex(zend_module_entry *module TSRMLS_DC) /* {{{
/* Initialize module globals */
if (module->globals_size) {
#ifdef ZTS
- TSRMG_ALLOCATE_EX((*module->globals_id_ptr), (*module->globals_offset), module->globals_size, module->globals_ctor, module->globals_dtor);
+ ts_allocate_id(module->globals_id_ptr, module->globals_size, (ts_allocate_ctor) module->globals_ctor, (ts_allocate_dtor) module->globals_dtor);
#else
if (module->globals_ctor) {
module->globals_ctor(module->globals_ptr TSRMLS_CC);
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 1e41ecdd18..657d1d04de 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -145,11 +145,11 @@ typedef struct _zend_fcall_info_cache {
#ifdef ZTS
#define ZEND_DECLARE_MODULE_GLOBALS(module_name) \
- TSRMG_DE(zend_##module_name##_globals, module_name##_globals_id);
+ ts_rsrc_id module_name##_globals_id;
#define ZEND_EXTERN_MODULE_GLOBALS(module_name) \
- TSRMG_DH(zend_##module_name##_globals, module_name##_globals_id);
+ extern ts_rsrc_id module_name##_globals_id;
#define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \
- TSRMG_ALLOCATE(module_name##_globals_id, sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, (ts_allocate_dtor) globals_dtor);
+ ts_allocate_id(&module_name##_globals_id, sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, (ts_allocate_dtor) globals_dtor);
#else
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 57b3b5d281..ac403617a6 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -2008,7 +2008,7 @@ typedef struct _zend_alloc_globals {
} zend_alloc_globals;
#ifdef ZTS
-TSRMG_D(zend_alloc_globals, alloc_globals_id);
+static int alloc_globals_id;
# define AG(v) TSRMG(alloc_globals_id, zend_alloc_globals *, v)
#else
# define AG(v) (alloc_globals.v)
@@ -2340,7 +2340,7 @@ static void alloc_globals_dtor(zend_alloc_globals *alloc_globals TSRMLS_DC)
ZEND_API void start_memory_manager(TSRMLS_D)
{
#ifdef ZTS
- TSRMG_ALLOCATE(alloc_globals_id, sizeof(zend_alloc_globals), (ts_allocate_ctor) alloc_globals_ctor, (ts_allocate_dtor) alloc_globals_dtor);
+ ts_allocate_id(&alloc_globals_id, sizeof(zend_alloc_globals), (ts_allocate_ctor) alloc_globals_ctor, (ts_allocate_dtor) alloc_globals_dtor);
#else
alloc_globals_ctor(&alloc_globals);
#endif
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index ce0cb36766..8dda5e5d38 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3085,7 +3085,11 @@ static void zend_free_foreach_and_switch_variables(TSRMLS_D) /* {{{ */
opnum_start = get_next_op_number(CG(active_op_array));
- zend_stack_apply(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_loop_var);
+#ifdef ZTS
+ zend_stack_apply_with_argument(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element, void *)) generate_free_loop_var, NULL);
+#else
+ zend_stack_apply(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_loop_var);
+#endif
opnum_end = get_next_op_number(CG(active_op_array));
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 9c849598b1..fdefa9eb05 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1178,17 +1178,19 @@ static LRESULT CALLBACK zend_timeout_WndProc(HWND hWnd, UINT message, WPARAM wPa
KillTimer(timeout_window, wParam);
} else {
#ifdef ZTS
- void *tsrm_ls_cache;
+ void ***tsrm_ls;
#endif
SetTimer(timeout_window, wParam, lParam*1000, NULL);
#ifdef ZTS
- tsrm_ls_cache = get_tsrm_ls_cache();
- if (!tsrm_ls_cache) {
+ tsrm_ls = ts_resource_ex(0, &wParam);
+ if (!tsrm_ls) {
/* shouldn't normally happen */
break;
}
#endif
- EG(timed_out) = 0;
+ /* XXX this won't work with TLS enabled, EG is on a different thread.
+ But nothing happened anyway, no timeout here. */
+ /* EG(timed_out) = 0; */
}
break;
case WM_UNREGISTER_ZEND_TIMEOUT:
@@ -1197,16 +1199,19 @@ static LRESULT CALLBACK zend_timeout_WndProc(HWND hWnd, UINT message, WPARAM wPa
break;
case WM_TIMER: {
#ifdef ZTS
- void *tsrm_ls_cache;
+ void ***tsrm_ls;
- tsrm_ls_cache = get_tsrm_ls_cache();
- if (!tsrm_ls_cache) {
+ tsrm_ls = ts_resource_ex(0, &wParam);
+ if (!tsrm_ls) {
/* Thread died before receiving its timeout? */
break;
}
#endif
KillTimer(timeout_window, wParam);
- EG(timed_out) = 1;
+
+ /* XXX this won't work with TLS enabled, EG is on a different thread.
+ Maybe an ide were to throw the timeout window right from here. */
+ /*EG(timed_out) = 1; */
}
break;
default:
@@ -1280,6 +1285,8 @@ void zend_shutdown_timeout_thread(void) /* {{{ */
void zend_set_timeout(zend_long seconds, int reset_signals) /* {{{ */
{
+ TSRMLS_FETCH();
+
EG(timeout_seconds) = seconds;
#ifdef ZEND_WIN32
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index a848e8eb58..b331f979fd 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -26,7 +26,7 @@
#define GC_ROOT_BUFFER_MAX_ENTRIES 10001
#ifdef ZTS
-TSRMG_D(zend_gc_globals, gc_globals_id);
+ZEND_API int gc_globals_id;
#else
ZEND_API zend_gc_globals gc_globals;
#endif
@@ -82,7 +82,7 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals TSRMLS_DC)
ZEND_API void gc_globals_ctor(TSRMLS_D)
{
#ifdef ZTS
- TSRMG_ALLOCATE(gc_globals_id, sizeof(zend_gc_globals), (ts_allocate_ctor) gc_globals_ctor_ex, (ts_allocate_dtor) root_buffer_dtor);
+ ts_allocate_id(&gc_globals_id, sizeof(zend_gc_globals), (ts_allocate_ctor) gc_globals_ctor_ex, (ts_allocate_dtor) root_buffer_dtor);
#else
gc_globals_ctor_ex(&gc_globals);
#endif
diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h
index 05cde67874..2eb8ea6ea3 100644
--- a/Zend/zend_gc.h
+++ b/Zend/zend_gc.h
@@ -110,7 +110,7 @@ typedef struct _zend_gc_globals {
#ifdef ZTS
BEGIN_EXTERN_C()
-TSRMG_DH(zend_gc_globals, gc_globals_id);
+ZEND_API extern int gc_globals_id;
END_EXTERN_C()
#define GC_G(v) TSRMG(gc_globals_id, zend_gc_globals *, v)
#else
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index 66376837f2..69e1cf9e68 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -44,8 +44,8 @@
#ifdef ZTS
BEGIN_EXTERN_C()
-TSRMG_DH(zend_compiler_globals, compiler_globals_id);
-TSRMG_DH(zend_executor_globals, executor_globals_id);
+ZEND_API extern int compiler_globals_id;
+ZEND_API extern int executor_globals_id;
END_EXTERN_C()
#endif
diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h
index 67b5b66317..e6e7136fb3 100644
--- a/Zend/zend_globals_macros.h
+++ b/Zend/zend_globals_macros.h
@@ -36,12 +36,8 @@ BEGIN_EXTERN_C()
# define CG(v) (compiler_globals.v)
extern ZEND_API struct _zend_compiler_globals compiler_globals;
#endif
+int zendparse(void);
-#ifdef PASS_TSRMLS
-int zendparse(void *compiler_globals);
-#else
-int zend_parse(void);
-#endif
/* Executor */
#ifdef ZTS
@@ -54,7 +50,7 @@ extern ZEND_API zend_executor_globals executor_globals;
/* Language Scanner */
#ifdef ZTS
# define LANG_SCNG(v) TSRMG(language_scanner_globals_id, zend_php_scanner_globals *, v)
-TSRMG_DH(zend_php_scanner_globals, language_scanner_globals_id);
+extern ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
# define LANG_SCNG(v) (language_scanner_globals.v)
extern ZEND_API zend_php_scanner_globals language_scanner_globals;
@@ -64,7 +60,7 @@ extern ZEND_API zend_php_scanner_globals language_scanner_globals;
/* INI Scanner */
#ifdef ZTS
# define INI_SCNG(v) TSRMG(ini_scanner_globals_id, zend_ini_scanner_globals *, v)
-TSRMG_DH(zend_ini_scanner_globals, ini_scanner_globals_id);
+extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
# define INI_SCNG(v) (ini_scanner_globals.v)
extern ZEND_API zend_ini_scanner_globals ini_scanner_globals;
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 4a8c03cd02..e343fcd92a 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -32,7 +32,7 @@
#define YYERROR_VERBOSE
#define YYSTYPE zval
-#ifdef PASS_TSRMLS
+#ifdef ZTS
#define YYPARSE_PARAM tsrm_ls
#define YYLEX_PARAM tsrm_ls
int ini_parse(void *arg);
diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c
index 7b2a0e25ff..2abf1140fc 100644
--- a/Zend/zend_ini_scanner.c
+++ b/Zend/zend_ini_scanner.c
@@ -103,7 +103,7 @@
/* Globals Macros */
#define SCNG INI_SCNG
#ifdef ZTS
-TSRMG_D(zend_ini_scanner_globals, ini_scanner_globals_id);
+ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index 2c4801e00a..3bfb1557b1 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -101,7 +101,7 @@
/* Globals Macros */
#define SCNG INI_SCNG
#ifdef ZTS
-TSRMG_D(zend_ini_scanner_globals, ini_scanner_globals_id);
+ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 407d78be29..1849840553 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -49,10 +49,6 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%expect 2
%code requires {
-#ifdef PASS_TSRMLS
-# define YYPARSE_PARAM tsrm_ls
-# define YYLEX_PARAM tsrm_ls
-#endif
}
%destructor { zend_ast_destroy($$); } <ast>
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
index 51c585dd66..5bd2798cde 100644
--- a/Zend/zend_language_scanner.c
+++ b/Zend/zend_language_scanner.c
@@ -90,7 +90,7 @@
/* Globals Macros */
#define SCNG LANG_SCNG
#ifdef ZTS
-TSRMG_D(zend_php_scanner_globals, language_scanner_globals_id);
+ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 4875c37d1b..bcc341e8a1 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -88,7 +88,7 @@
/* Globals Macros */
#define SCNG LANG_SCNG
#ifdef ZTS
-TSRMG_D(zend_php_scanner_globals, language_scanner_globals_id);
+ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index cc3a0aedb5..0cd9ca4d16 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -50,14 +50,10 @@
#define STANDARD_MODULE_PROPERTIES_EX 0, 0, NULL, 0, ZEND_MODULE_BUILD_ID
-#ifdef ZTS
-#define NO_MODULE_GLOBALS 0, NULL, NULL, NULL, NULL
-#else
#define NO_MODULE_GLOBALS 0, NULL, NULL, NULL
-#endif
#ifdef ZTS
-# define ZEND_MODULE_GLOBALS(module_name) sizeof(zend_##module_name##_globals), &module_name##_globals_id, &module_name##_globals_id_offset
+# define ZEND_MODULE_GLOBALS(module_name) sizeof(zend_##module_name##_globals), &module_name##_globals_id
#else
# define ZEND_MODULE_GLOBALS(module_name) sizeof(zend_##module_name##_globals), &module_name##_globals
#endif
@@ -92,7 +88,6 @@ struct _zend_module_entry {
size_t globals_size;
#ifdef ZTS
ts_rsrc_id* globals_id_ptr;
- ts_rsrc_offset* globals_offset;
#else
void* globals_ptr;
#endif
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index f3e0680f9e..b0a0e7519e 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2159,7 +2159,19 @@ try_again:
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, get)
+ && Z_OBJ_HANDLER_P(op1, set)) {
+ /* proxy object */
+ zval rv;
+ zval *val;
+ TSRMLS_FETCH();
+
+ val = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);
+ Z_ADDREF_P(val);
+ fast_increment_function(val);
+ Z_OBJ_HANDLER_P(op1, set)(op1, val TSRMLS_CC);
+ zval_ptr_dtor(val);
+ } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
TSRMLS_FETCH();
@@ -2222,7 +2234,19 @@ try_again:
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, get)
+ && Z_OBJ_HANDLER_P(op1, set)) {
+ /* proxy object */
+ zval rv;
+ zval *val;
+ TSRMLS_FETCH();
+
+ val = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);
+ Z_ADDREF_P(val);
+ fast_decrement_function(val);
+ Z_OBJ_HANDLER_P(op1, set)(op1, val TSRMLS_CC);
+ zval_ptr_dtor(val);
+ } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
TSRMLS_FETCH();
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index a006a0581b..03b23427cb 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -124,6 +124,7 @@ ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function
}
}
+
ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg)
{
int i;
@@ -131,14 +132,14 @@ ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*
switch (type) {
case ZEND_STACK_APPLY_TOPDOWN:
for (i=stack->top-1; i>=0; i--) {
- if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
+ if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
break;
}
}
break;
case ZEND_STACK_APPLY_BOTTOMUP:
for (i=0; i<stack->top; i++) {
- if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
+ if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
break;
}
}
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 5fc6fb6165..b061d5a00d 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -76,7 +76,7 @@ MUTEX_T cwd_mutex;
#endif
#ifdef ZTS
-TSRMG_D(virtual_cwd_globals, cwd_globals_id);
+ts_rsrc_id cwd_globals_id;
#else
virtual_cwd_globals cwd_globals;
#endif
@@ -475,7 +475,7 @@ CWD_API void virtual_cwd_startup(void) /* {{{ */
main_cwd_state.cwd = strdup(cwd);
#ifdef ZTS
- TSRMG_ALLOCATE(cwd_globals_id, sizeof(virtual_cwd_globals), (ts_allocate_ctor) cwd_globals_ctor, (ts_allocate_dtor) cwd_globals_dtor);
+ ts_allocate_id(&cwd_globals_id, sizeof(virtual_cwd_globals), (ts_allocate_ctor) cwd_globals_ctor, (ts_allocate_dtor) cwd_globals_dtor);
#else
cwd_globals_ctor(&cwd_globals TSRMLS_CC);
#endif
diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h
index 5878a5506b..f40a2deb7e 100644
--- a/Zend/zend_virtual_cwd.h
+++ b/Zend/zend_virtual_cwd.h
@@ -236,7 +236,7 @@ typedef struct _virtual_cwd_globals {
} virtual_cwd_globals;
#ifdef ZTS
-TSRMG_DH(virtual_cwd_globals, cwd_globals_id);
+extern ts_rsrc_id cwd_globals_id;
# define CWDG(v) TSRMG(cwd_globals_id, virtual_cwd_globals *, v)
#else
extern virtual_cwd_globals cwd_globals;
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 00f647e487..0162902c48 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -883,7 +883,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -891,19 +890,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -939,7 +926,6 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -947,19 +933,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -974,7 +948,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
@@ -991,34 +965,19 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
@@ -1029,7 +988,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
@@ -1046,34 +1005,19 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
@@ -1647,7 +1591,6 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 8ab3f3b2e3..df53c72ed9 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -15335,7 +15335,6 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -15343,19 +15342,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -15391,7 +15378,6 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -15399,19 +15385,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -15426,7 +15400,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -15443,34 +15417,19 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
@@ -15481,7 +15440,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -15498,34 +15457,19 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
@@ -18307,7 +18251,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -20523,7 +20466,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -22642,7 +22584,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -24278,7 +24219,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -26015,7 +25955,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -32664,7 +32603,6 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -32672,19 +32610,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -32719,7 +32645,6 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -32727,19 +32652,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -32753,7 +32666,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
{
USE_OPLINE
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
@@ -32770,34 +32683,19 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -32807,7 +32705,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
{
USE_OPLINE
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
@@ -32824,34 +32722,19 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -35370,7 +35253,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -37428,7 +37310,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLE
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -39428,7 +39309,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -40944,7 +40824,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAN
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -42545,7 +42424,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {