diff --git a/.gitignore b/.gitignore index be17e244550..06dac174a96 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ *.tgz *.tar.gz *.tar.bz2 +*.tar.xz .FBCIndex .FBCLockFolder .deps diff --git a/EXTENSIONS b/EXTENSIONS index 61a1688b3c9..757a1a8fd6b 100644 --- a/EXTENSIONS +++ b/EXTENSIONS @@ -228,13 +228,6 @@ MAINTENANCE: Maintained STATUS: Working COMMENT: Use PostgreSQL 7.0.x or later. PostgreSQL 6.5.3 or less have fatal bug. ------------------------------------------------------------------------------- -EXTENSION: sqlite -PRIMARY MAINTAINER: Marcus Boerger , Wez Furlong , Ilia Alshanetsky -MAINTENANCE: Maintained -STATUS: Working -SINCE: 5.0 (Since 4.3.2 in PECL) -COMMENT: Integrates SQLite 2 embeddable SQL database engine. -------------------------------------------------------------------------------- EXTENSION: sqlite3 PRIMARY MAINTAINER: Scott MacVicar MAINTENANCE: Maintained @@ -385,6 +378,12 @@ MAINTENANCE: Maintained STATUS: Working SINCE: 4.0.4 ------------------------------------------------------------------------------- +EXTENSION: hash +PRIMARY MAINTAINER: Sara Golemon , Mike Wallner , Anatol Belski +MAINTENANCE: Maintained +STATUS: Working +SINCE: 5.1.2 +------------------------------------------------------------------------------- EXTENSION: iconv PRIMARY MAINTAINER: Moriyoshi Koizumi MAINTENANCE: Maintained @@ -422,22 +421,6 @@ PRIMARY MAINTAINER: Derick Rethans MAINTENANCE: Maintained STATUS: Working ------------------------------------------------------------------------------- -EXTENSION: mhash -PRIMARY MAINTAINER: Sascha Schumann , Scott MacVicar -MAINTENANCE: Unknown -STATUS: Working -------------------------------------------------------------------------------- -EXTENSION: mime_magic -PRIMARY MAINTAINER: Unknown -MAINTENANCE: Deprecated -STATUS: Experimental -COMMENT: Use the fileinfo extension instead -------------------------------------------------------------------------------- -EXTENSION: ming -PRIMARY MAINTAINER: Frank M. Kromann -MAINTENANCE: Unknown -STATUS: Experimental -------------------------------------------------------------------------------- EXTENSION: openssl PRIMARY MAINTAINER: Wez Furlong , Pierre-Alain Joye MAINTENANCE: Maintained diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index b6ac4231ee2..faa186a1bbf 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -605,13 +605,13 @@ TSRM_API int shmget(int key, int size, int flags) shm_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment); info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info); - if ((!shm_handle && !info_handle)) { + if (!shm_handle && !info_handle) { if (flags & IPC_CREAT) { shm_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, shm_segment); info_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), shm_info); created = TRUE; } - if ((!shm_handle || !info_handle)) { + if (!shm_handle || !info_handle) { return -1; } } else { diff --git a/Zend/zend.h b/Zend/zend.h index 2c1ebc8ca16..81c165210f2 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -52,14 +52,13 @@ # define HANDLE_UNBLOCK_INTERRUPTIONS() ZEND_SIGNAL_UNBLOCK_INTERRUPTIONS() #endif -#define INTERNAL_FUNCTION_PARAMETERS uint32_t param_count, zval *return_value TSRMLS_DC -#define INTERNAL_FUNCTION_PARAM_PASSTHRU param_count, return_value TSRMLS_CC +#define INTERNAL_FUNCTION_PARAMETERS zend_execute_data *execute_data, zval *return_value TSRMLS_DC +#define INTERNAL_FUNCTION_PARAM_PASSTHRU execute_data, return_value TSRMLS_CC #define USED_RET() \ - (!EG(current_execute_data) || \ - !EG(current_execute_data)->prev_execute_data || \ - !ZEND_USER_CODE(EG(current_execute_data)->prev_execute_data->func->common.type) || \ - !(EG(current_execute_data)->prev_execute_data->opline->result_type & EXT_TYPE_UNUSED)) + (!EX(prev_execute_data) || \ + !ZEND_USER_CODE(EX(prev_execute_data)->func->common.type) || \ + !(EX(prev_execute_data)->opline->result_type & EXT_TYPE_UNUSED)) #ifdef ZEND_ENABLE_STATIC_TSRMLS_CACHE #define ZEND_TSRMG TSRMG_STATIC diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 770eeba78b0..82864f2a462 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2850,8 +2850,8 @@ static int zend_is_callable_check_class(zend_string *name, zend_fcall_info_cache } else { fcc->called_scope = EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL; fcc->calling_scope = EG(scope); - if (!fcc->object && Z_OBJ(EG(This))) { - fcc->object = Z_OBJ(EG(This)); + if (!fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This)) { + fcc->object = Z_OBJ(EG(current_execute_data)->This); } ret = 1; } @@ -2863,8 +2863,8 @@ static int zend_is_callable_check_class(zend_string *name, zend_fcall_info_cache } else { fcc->called_scope = EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL; fcc->calling_scope = EG(scope)->parent; - if (!fcc->object && Z_OBJ(EG(This))) { - fcc->object = Z_OBJ(EG(This)); + if (!fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This)) { + fcc->object = Z_OBJ(EG(current_execute_data)->This); } *strict_class = 1; ret = 1; @@ -2875,8 +2875,8 @@ static int zend_is_callable_check_class(zend_string *name, zend_fcall_info_cache } else { fcc->called_scope = EG(current_execute_data)->called_scope; fcc->calling_scope = EG(current_execute_data)->called_scope; - if (!fcc->object && Z_OBJ(EG(This))) { - fcc->object = Z_OBJ(EG(This)); + if (!fcc->object && Z_OBJ(EG(current_execute_data)->This)) { + fcc->object = Z_OBJ(EG(current_execute_data)->This); } *strict_class = 1; ret = 1; @@ -2890,11 +2890,11 @@ static int zend_is_callable_check_class(zend_string *name, zend_fcall_info_cache } scope = ex ? ex->func->common.scope : NULL; fcc->calling_scope = ce; - if (scope && !fcc->object && Z_OBJ(EG(This)) && - instanceof_function(Z_OBJCE(EG(This)), scope TSRMLS_CC) && + if (scope && !fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This) && + instanceof_function(Z_OBJCE(EG(current_execute_data)->This), scope TSRMLS_CC) && instanceof_function(scope, fcc->calling_scope TSRMLS_CC)) { - fcc->object = Z_OBJ(EG(This)); - fcc->called_scope = Z_OBJCE(EG(This)); + fcc->object = Z_OBJ(EG(current_execute_data)->This); + fcc->called_scope = Z_OBJCE(EG(current_execute_data)->This); } else { fcc->called_scope = fcc->object ? zend_get_class_entry(fcc->object TSRMLS_CC) : fcc->calling_scope; } @@ -3095,10 +3095,10 @@ get_function_via_handler: if (fcc->function_handler) { retval = 1; call_via_handler = (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0; - if (call_via_handler && !fcc->object && Z_OBJ(EG(This)) && - Z_OBJ_HT(EG(This))->get_class_entry && - instanceof_function(Z_OBJCE(EG(This)), fcc->calling_scope TSRMLS_CC)) { - fcc->object = Z_OBJ(EG(This)); + if (call_via_handler && !fcc->object && EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This) && + Z_OBJ_HT(EG(current_execute_data)->This)->get_class_entry && + instanceof_function(Z_OBJCE(EG(current_execute_data)->This), fcc->calling_scope TSRMLS_CC)) { + fcc->object = Z_OBJ(EG(current_execute_data)->This); } } } @@ -3127,15 +3127,15 @@ get_function_via_handler: if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0) { retval = 0; } - if (Z_OBJ(EG(This)) && instanceof_function(Z_OBJCE(EG(This)), fcc->calling_scope TSRMLS_CC)) { - fcc->object = Z_OBJ(EG(This)); + if (EG(current_execute_data) && Z_OBJ(EG(current_execute_data)->This) && instanceof_function(Z_OBJCE(EG(current_execute_data)->This), fcc->calling_scope TSRMLS_CC)) { + fcc->object = Z_OBJ(EG(current_execute_data)->This); if (error) { - zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(This))->name->val); + zend_spprintf(error, 0, "non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(current_execute_data)->This)->name->val); if (severity == E_ERROR) { retval = 0; } } else if (retval) { - zend_error(severity, "Non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(This))->name->val); + zend_error(severity, "Non-static method %s::%s() %s be called statically, assuming $this from compatible context %s", fcc->calling_scope->name->val, fcc->function_handler->common.function_name->val, verb, Z_OBJCE(EG(current_execute_data)->This)->name->val); } } else { if (error) { @@ -4143,6 +4143,39 @@ ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_functi } /* }}} */ +ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data) /* {{{ */ +{ + if (EX(return_value)) { +/* + if (Z_TYPE_P(EX(return_value)) == IS_OBJECT) { + zend_object *object = Z_OBJ_P(EX(return_value)); + zend_execute_data *ex = EX(prev_execute_data); + + while (ex && Z_OBJ(ex->This) == object) { + 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); + if (this_var != EX(return_value)) { + zval_ptr_dtor(this_var); + ZVAL_NULL(this_var); + } + } + } + } + Z_OBJ(ex->This) = NULL; + ZVAL_NULL(&ex->This); + ex = ex->prev_execute_data; + } + } +*/ + zval_ptr_dtor(EX(return_value)); + Z_OBJ_P(EX(return_value)) = NULL; + ZVAL_NULL(EX(return_value)); + } +} +/* }}} */ + /* * Local variables: * tab-width: 4 diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 657d1d04de6..730e1b9e14d 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -343,12 +343,12 @@ ZEND_API zend_class_entry *zend_get_class_entry(const zend_object *object TSRMLS ZEND_API zend_string *zend_get_object_classname(const zend_object *object TSRMLS_DC); ZEND_API char *zend_get_type_by_const(int type); -#define getThis() (Z_OBJ(EG(This)) ? &EG(This) : NULL) +#define getThis() (Z_OBJ(EX(This)) ? &EX(This) : NULL) #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) (param_count) -#define ZEND_NUM_ARGS() (param_count) +#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; } @@ -531,6 +531,8 @@ ZEND_API int zend_set_local_var_str(const char *name, int len, zval *value, int ZEND_API zend_string *zend_find_alias_name(zend_class_entry *ce, zend_string *name); ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_function *f); +ZEND_API void zend_ctor_make_null(zend_execute_data *execute_data); + #define add_method(arg, key, method) add_assoc_function((arg), (key), (method)) ZEND_API ZEND_FUNCTION(display_disabled_function); @@ -639,26 +641,8 @@ END_EXTERN_C() } while (0) /* May be used in internal constructors to make them return NULL */ -#if 1 // support for directly called constructors only ??? -#define ZEND_CTOR_MAKE_NULL() do { \ - if (EG(current_execute_data)->return_value) { \ - zval_ptr_dtor(EG(current_execute_data)->return_value); \ - ZVAL_NULL(EG(current_execute_data)->return_value); \ - } \ - } while (0) -#else // attempt to support calls to parent::__construct() ??? - // see: ext/date/tests/bug67118.phpt -#define ZEND_CTOR_MAKE_NULL() do { \ - if (EG(current_execute_data)->return_value) { \ - zval_ptr_dtor(EG(current_execute_data)->return_value); \ - ZVAL_NULL(EG(current_execute_data)->return_value); \ - } else if (EG(current_execute_data)->prev_execute_data && \ - EG(current_execute_data)->prev_execute_data->object == \ - EG(current_execute_data)->object) { \ - EG(current_execute_data)->prev_execute_data->object = NULL; \ - } \ - } while (0) -#endif +#define ZEND_CTOR_MAKE_NULL() \ + zend_ctor_make_null(execute_data) #define RETURN_ZVAL_FAST(z) { RETVAL_ZVAL_FAST(z); return; } @@ -729,7 +713,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 = EG(current_execute_data)->num_args; \ + int _num_args = EX(num_args); \ int _i; \ zval *_real_arg, *_arg = NULL; \ zend_expected_type _expected_type = IS_UNDEF; \ @@ -756,7 +740,7 @@ ZEND_API int _z_param_class(zval *arg, zend_class_entry **pce, int num, int chec break; \ } \ _i = 0; \ - _real_arg = ZEND_CALL_ARG(EG(current_execute_data), 0); + _real_arg = ZEND_CALL_ARG(execute_data, 0); #define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args) \ ZEND_PARSE_PARAMETERS_START_EX(0, min_num_args, max_num_args) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 03a148a473a..728d90acdf4 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -400,7 +400,7 @@ ZEND_FUNCTION(gc_disable) Get the number of arguments that were passed to the function */ ZEND_FUNCTION(func_num_args) { - zend_execute_data *ex = EG(current_execute_data)->prev_execute_data; + zend_execute_data *ex = EX(prev_execute_data); if (ex->frame_kind == VM_FRAME_NESTED_FUNCTION || ex->frame_kind == VM_FRAME_TOP_FUNCTION) { RETURN_LONG(ex->num_args); @@ -429,7 +429,7 @@ ZEND_FUNCTION(func_get_arg) RETURN_FALSE; } - ex = EG(current_execute_data)->prev_execute_data; + ex = EX(prev_execute_data); if (ex->frame_kind != VM_FRAME_NESTED_FUNCTION && ex->frame_kind != VM_FRAME_TOP_FUNCTION) { zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context"); RETURN_FALSE; @@ -462,7 +462,7 @@ ZEND_FUNCTION(func_get_args) zval *p; uint32_t arg_count, first_extra_arg; uint32_t i; - zend_execute_data *ex = EG(current_execute_data)->prev_execute_data; + zend_execute_data *ex = EX(prev_execute_data); if (ex->frame_kind != VM_FRAME_NESTED_FUNCTION && ex->frame_kind != VM_FRAME_TOP_FUNCTION) { zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context"); @@ -823,8 +823,8 @@ ZEND_FUNCTION(get_called_class) return; } - if (EG(current_execute_data)->called_scope) { - RETURN_STR(zend_string_copy(EG(current_execute_data)->called_scope->name)); + if (EX(called_scope)) { + RETURN_STR(zend_string_copy(EX(called_scope)->name)); } else if (!EG(scope)) { zend_error(E_WARNING, "get_called_class() called from outside a class"); } @@ -2132,7 +2132,7 @@ ZEND_FUNCTION(debug_print_backtrace) } ZVAL_UNDEF(&arg_array); - ptr = EG(current_execute_data)->prev_execute_data; + ptr = EX(prev_execute_data); /* skip debug_backtrace() */ call = ptr; @@ -2172,7 +2172,7 @@ ZEND_FUNCTION(debug_print_backtrace) } /* $this may be passed into regular internal functions */ - object = call->object; + object = Z_OBJ(call->This); if (object && call && call->func->type == ZEND_INTERNAL_FUNCTION && @@ -2394,7 +2394,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int } /* $this may be passed into regular internal functions */ - object = call ? call->object : NULL; + object = call ? Z_OBJ(call->This) : NULL; if (object && call->func && call->func->type == ZEND_INTERNAL_FUNCTION && diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index cab31ce1c09..90d7a6bb866 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -47,7 +47,7 @@ static zend_object_handlers closure_handlers; ZEND_METHOD(Closure, __invoke) /* {{{ */ { - zend_function *func = EG(current_execute_data)->func; + zend_function *func = EX(func); zval *arguments; arguments = emalloc(sizeof(zval) * ZEND_NUM_ARGS()); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 03e3f228a50..293c0eee1dd 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5557,7 +5557,7 @@ void zend_compile_array(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); zend_op *opline; - uint32_t i, opnum_init; + uint32_t i, opnum_init = -1; zend_bool packed = 1; if (zend_try_ct_eval_array(&result->u.constant, ast TSRMLS_CC)) { @@ -5565,8 +5565,6 @@ void zend_compile_array(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ return; } - opnum_init = get_next_op_number(CG(active_op_array)); - for (i = 0; i < list->children; ++i) { zend_ast *elem_ast = list->child[i]; zend_ast *value_ast = elem_ast->child[0]; @@ -5589,6 +5587,7 @@ void zend_compile_array(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ } if (i == 0) { + opnum_init = get_next_op_number(CG(active_op_array)); opline = zend_emit_op_tmp(result, ZEND_INIT_ARRAY, &value_node, key_node_ptr TSRMLS_CC); opline->extended_value = list->children << ZEND_ARRAY_SIZE_SHIFT; } else { @@ -5610,6 +5609,7 @@ void zend_compile_array(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ /* Add a flag to INIT_ARRAY if we know this array cannot be packed */ if (!packed) { + ZEND_ASSERT(opnum_init != -1); opline = &CG(active_op_array)->opcodes[opnum_init]; opline->extended_value |= ZEND_ARRAY_NOT_PACKED; } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index cf1256ab3c7..2594495c969 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -100,8 +100,6 @@ void zend_compile_var(znode *node, zend_ast *ast, uint32_t type TSRMLS_DC); void zend_eval_const_expr(zend_ast **ast_ptr TSRMLS_DC); void zend_const_expr_to_zval(zval *result, zend_ast *ast TSRMLS_DC); -typedef struct _zend_execute_data zend_execute_data; - #define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data TSRMLS_DC #define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data TSRMLS_CC @@ -366,7 +364,7 @@ struct _zend_execute_data { zend_uchar flags; zend_uchar frame_kind; zend_class_entry *called_scope; - zend_object *object; + zval This; zend_execute_data *prev_execute_data; zval *return_value; zend_class_entry *scope; /* function scope (self) */ @@ -385,7 +383,7 @@ struct _zend_execute_data { #define ZEND_CALL_ARG(call, n) \ (((zval*)(call)) + ((n) + (ZEND_CALL_FRAME_SLOT - 1))) -#define EX(element) execute_data.element +#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)))) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 0c15e06b6c8..e019191a5e1 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -123,9 +123,6 @@ static const zend_internal_function zend_pass_function = { #define DECODE_CTOR(ce) \ ((zend_class_entry*)(((zend_uintptr_t)(ce)) & ~(CTOR_CALL_BIT|CTOR_USED_BIT))) -#undef EX -#define EX(element) execute_data->element - ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data, uint32_t var) { return EX_VAR(var); @@ -426,22 +423,22 @@ static inline zval *_get_zval_ptr_ptr(int op_type, const znode_op *node, const z } } -static zend_always_inline zval *_get_obj_zval_ptr_unused(TSRMLS_D) +static zend_always_inline zval *_get_obj_zval_ptr_unused(zend_execute_data *execute_data TSRMLS_DC) { - if (EXPECTED(Z_OBJ(EG(This)) != NULL)) { - return &EG(This); + if (EXPECTED(Z_OBJ(EX(This)) != NULL)) { + return &EX(This); } else { zend_error_noreturn(E_ERROR, "Using $this when not in object context"); return NULL; } } -static inline zval *_get_obj_zval_ptr(int op_type, znode_op *op, const zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC) +static inline zval *_get_obj_zval_ptr(int op_type, znode_op *op, zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC) { if (op_type == IS_UNUSED) { - if (EXPECTED(Z_OBJ(EG(This)) != NULL)) { + if (EXPECTED(Z_OBJ(EX(This)) != NULL)) { should_free->var = NULL; - return &EG(This); + return &EX(This); } else { zend_error_noreturn(E_ERROR, "Using $this when not in object context"); } @@ -449,12 +446,12 @@ static inline zval *_get_obj_zval_ptr(int op_type, znode_op *op, const zend_exec return get_zval_ptr(op_type, op, execute_data, should_free, type); } -static inline zval *_get_obj_zval_ptr_ptr(int op_type, const znode_op *node, const zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC) +static inline zval *_get_obj_zval_ptr_ptr(int op_type, const znode_op *node, zend_execute_data *execute_data, zend_free_op *should_free, int type TSRMLS_DC) { if (op_type == IS_UNUSED) { - if (EXPECTED(Z_OBJ(EG(This)) != NULL)) { + if (EXPECTED(Z_OBJ(EX(This)) != NULL)) { should_free->var = NULL; - return &EG(This); + return &EX(This); } else { zend_error_noreturn(E_ERROR, "Using $this when not in object context"); } @@ -1217,14 +1214,13 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z } else { retval = Z_OBJ_HT_P(container)->read_dimension(container, dim, type, result TSRMLS_CC); - if (result) { - if (retval) { - if (result != retval) { - ZVAL_COPY(result, retval); - } - } else { - ZVAL_NULL(result); + ZEND_ASSERT(result != NULL); + if (retval) { + if (result != retval) { + ZVAL_COPY(result, retval); } + } else { + ZVAL_NULL(result); } } } else { @@ -1368,7 +1364,7 @@ ZEND_API opcode_handler_t *zend_opcode_handlers; ZEND_API void execute_internal(zend_execute_data *execute_data, zval *return_value TSRMLS_DC) { - execute_data->func->internal_function.handler(execute_data->num_args, return_value TSRMLS_CC); + execute_data->func->internal_function.handler(execute_data, return_value TSRMLS_CC); } void zend_clean_and_cache_symbol_table(zend_array *symbol_table TSRMLS_DC) /* {{{ */ @@ -1428,7 +1424,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(object) == Z_OBJ(EG(This))); EX(opline) = op_array->opcodes; EX(call) = NULL; @@ -1480,9 +1475,9 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu } while (var != end); } - if (op_array->this_var != -1 && EX(object)) { - ZVAL_OBJ(EX_VAR(op_array->this_var), EX(object)); - GC_REFCOUNT(EX(object))++; + if (op_array->this_var != -1 && Z_OBJ(EX(This))) { + ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This))); + GC_REFCOUNT(Z_OBJ(EX(This)))++; } if (!op_array->run_time_cache && op_array->last_cache_slot) { @@ -1497,7 +1492,6 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */ { ZEND_ASSERT(EX(func) == (zend_function*)op_array); - ZEND_ASSERT(EX(object) == Z_OBJ(EG(This))); EX(opline) = op_array->opcodes; EX(call) = NULL; @@ -1521,7 +1515,6 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu static zend_always_inline void i_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */ { ZEND_ASSERT(EX(func) == (zend_function*)op_array); - ZEND_ASSERT(EX(object) == Z_OBJ(EG(This))); EX(opline) = op_array->opcodes; EX(call) = NULL; @@ -1578,9 +1571,9 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da } while (var != end); } - if (op_array->this_var != -1 && EX(object)) { - ZVAL_OBJ(EX_VAR(op_array->this_var), EX(object)); - GC_REFCOUNT(EX(object))++; + if (op_array->this_var != -1 && Z_OBJ(EX(This))) { + ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This))); + GC_REFCOUNT(Z_OBJ(EX(This)))++; } } @@ -1623,7 +1616,7 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data num_args, call->flags, call->called_scope, - call->object, + Z_OBJ(call->This), NULL TSRMLS_CC); EX(num_args) = num_args; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index ce01e51d3f5..3770f4cbe9c 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -218,7 +218,7 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(zend_ call->num_args = 0; call->flags = flags; call->called_scope = called_scope; - call->object = object; + ZVAL_OBJ(&call->This, object); call->prev_execute_data = prev; return call; } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index be8b5afe09b..a4bf8f62fdd 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -187,8 +187,6 @@ void init_executor(TSRMLS_D) /* {{{ */ EG(scope) = NULL; - ZVAL_OBJ(&EG(This), NULL); - EG(active) = 1; } /* }}} */ @@ -660,7 +658,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS zend_execute_data *call, dummy_execute_data; zend_fcall_info_cache fci_cache_local; zend_function *func; - zend_object *orig_object; zend_class_entry *orig_scope; zval tmp; @@ -682,7 +679,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS break; } - orig_object = Z_OBJ(EG(This)); orig_scope = EG(scope); /* Initialize execute_data */ @@ -832,10 +828,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS EG(scope) = calling_scope; if (!fci->object || (func->common.fn_flags & ZEND_ACC_STATIC)) { - Z_OBJ(EG(This)) = call->object = NULL; + Z_OBJ(call->This) = NULL; + Z_TYPE_INFO(call->This) = IS_UNDEF; } else { - Z_OBJ(EG(This)) = fci->object; - Z_ADDREF(EG(This)); + ZVAL_OBJ(&call->This, fci->object); + GC_REFCOUNT(fci->object)++; } if (func->type == ZEND_USER_FUNCTION) { @@ -858,7 +855,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS EG(current_execute_data) = call; if (EXPECTED(zend_execute_internal == NULL)) { /* saves one function call if zend_execute_internal is not used */ - func->internal_function.handler(fci->param_count, fci->retval TSRMLS_CC); + func->internal_function.handler(call, fci->retval TSRMLS_CC); } else { zend_execute_internal(call, fci->retval TSRMLS_CC); } @@ -888,7 +885,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS if (fci->object) { call->prev_execute_data = EG(current_execute_data); EG(current_execute_data) = call; - fci->object->handlers->call_method(func->common.function_name, fci->object, fci->param_count, fci->retval TSRMLS_CC); + fci->object->handlers->call_method(func->common.function_name, fci->object, call, fci->retval TSRMLS_CC); EG(current_execute_data) = call->prev_execute_data; } else { zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object"); @@ -908,11 +905,10 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS } } - if (Z_OBJ(EG(This))) { - zval_ptr_dtor(&EG(This)); + if (fci->object && !(func->common.fn_flags & ZEND_ACC_STATIC)) { + OBJ_RELEASE(fci->object); } - Z_OBJ(EG(This)) = orig_object; EG(scope) = orig_scope; if (EG(current_execute_data) == &dummy_execute_data) { EG(current_execute_data) = dummy_execute_data.prev_execute_data; diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 4c64cb75907..6ffd264a1d3 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -68,8 +68,8 @@ static void zend_generator_cleanup_unfinished_execution(zend_generator *generato /* If yield was used as a function argument there may be active * method calls those objects need to be freed */ while (execute_data->call) { - if (execute_data->call->object) { - OBJ_RELEASE(execute_data->call->object); + if (Z_OBJ(execute_data->call->This)) { + OBJ_RELEASE(Z_OBJ(execute_data->call->This)); } execute_data->call = execute_data->call->prev_execute_data; } @@ -98,8 +98,8 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished zend_clean_and_cache_symbol_table(execute_data->symbol_table TSRMLS_CC); } - if (execute_data->object) { - OBJ_RELEASE(execute_data->object); + if (Z_OBJ(execute_data->This)) { + OBJ_RELEASE(Z_OBJ(execute_data->This)); } /* A fatal error / die occurred during the generator execution. Trying to clean @@ -251,8 +251,8 @@ ZEND_API void zend_generator_create_zval(zend_execute_data *call, zend_op_array object_init_ex(return_value, zend_ce_generator); - if (Z_OBJ(EG(This))) { - Z_ADDREF(EG(This)); + if (Z_OBJ(call->This)) { + Z_ADDREF(call->This); } /* Save execution context in generator object. */ @@ -292,15 +292,11 @@ ZEND_API void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ { /* Backup executor globals */ zend_execute_data *original_execute_data = EG(current_execute_data); - zend_object *original_This; zend_class_entry *original_scope = EG(scope); zend_vm_stack original_stack = EG(argument_stack); - original_This = Z_OBJ(EG(This)); - /* Set executor globals */ EG(current_execute_data) = generator->execute_data; - Z_OBJ(EG(This)) = generator->execute_data->object; EG(scope) = generator->execute_data->scope; EG(argument_stack) = generator->stack; @@ -322,7 +318,6 @@ ZEND_API void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ /* Restore executor globals */ EG(current_execute_data) = original_execute_data; - Z_OBJ(EG(This)) = original_This; EG(scope) = original_scope; EG(argument_stack) = original_stack; diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 69e1cf9e682..d2be4ec5c21 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -174,8 +174,6 @@ struct _zend_executor_globals { zend_class_entry *scope; - zval This; - zend_long precision; int ticks_count; diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 5c27873aa13..97b89e926c4 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -221,6 +221,8 @@ void zend_hash_display_pListTail(const HashTable *ht); void zend_hash_display(const HashTable *ht); #endif +ZEND_API int _zend_handle_numeric_str_ex(const char *key, size_t length, zend_ulong *idx); + END_EXTERN_C() #define ZEND_INIT_SYMTABLE(ht) \ @@ -229,8 +231,6 @@ END_EXTERN_C() #define ZEND_INIT_SYMTABLE_EX(ht, n, persistent) \ zend_hash_init(ht, n, NULL, ZVAL_PTR_DTOR, persistent) -ZEND_API int _zend_handle_numeric_str_ex(const char *key, size_t length, zend_ulong *idx); - static zend_always_inline int _zend_handle_numeric_str(const char *key, size_t length, zend_ulong *idx) { register const char *tmp = key; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index f831d2fadd6..c2377e75124 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -921,7 +921,7 @@ static void zend_std_unset_dimension(zval *object, zval *offset TSRMLS_DC) /* {{ ZEND_API void zend_std_call_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ */ { - zend_internal_function *func = (zend_internal_function *)EG(current_execute_data)->func; + zend_internal_function *func = (zend_internal_function *)EX(func); zval method_name, method_args; zval method_result; zend_class_entry *ce = Z_OBJCE_P(getThis()); @@ -1139,7 +1139,7 @@ static union _zend_function *zend_std_get_method(zend_object **obj_ptr, zend_str ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ */ { - zend_internal_function *func = (zend_internal_function *)EG(current_execute_data)->func; + zend_internal_function *func = (zend_internal_function *)EX(func); zval method_name, method_args; zval method_result; zend_class_entry *ce = EG(scope); @@ -1231,9 +1231,9 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st zend_string_free(lc_function_name); } if (ce->__call && - Z_OBJ(EG(This)) && - Z_OBJ_HT(EG(This))->get_class_entry && - instanceof_function(Z_OBJCE(EG(This)), ce TSRMLS_CC)) { + Z_OBJ(EG(current_execute_data)->This) && + Z_OBJ_HT(EG(current_execute_data)->This)->get_class_entry && + instanceof_function(Z_OBJCE(EG(current_execute_data)->This), ce TSRMLS_CC)) { return zend_get_user_call_function(ce, function_name); } else if (ce->__callstatic) { return zend_get_user_callstatic_function(ce, function_name); diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index baa1a28bb44..362d79a68c2 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -71,7 +71,7 @@ ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member TSRMLS ZEND_API zend_object_handlers *zend_get_std_object_handlers(void); END_EXTERN_C() -static zend_always_inline void zend_object_release(zend_object *obj TSRMLS_CC) +static zend_always_inline void zend_object_release(zend_object *obj TSRMLS_DC) { if (--GC_REFCOUNT(obj) == 0) { zend_objects_store_del(obj TSRMLS_CC); diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 39a7e1f541b..8075edf939d 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -69,6 +69,24 @@ ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2 TSR ZEND_API zend_bool instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool interfaces_only TSRMLS_DC); ZEND_API zend_bool instanceof_function(const zend_class_entry *instance_ce, const zend_class_entry *ce TSRMLS_DC); + +/** + * Checks whether the string "str" with length "length" is numeric. The value + * of allow_errors determines whether it's required to be entirely numeric, or + * just its prefix. Leading whitespace is allowed. + * + * The function returns 0 if the string did not contain a valid number; IS_LONG + * if it contained a number that fits within the range of a long; or IS_DOUBLE + * if the number was out of long range or contained a decimal point/exponent. + * The number's value is returned into the respective pointer, *lval or *dval, + * if that pointer is not NULL. + * + * This variant also gives information if a string that represents an integer + * could not be represented as such due to overflow. It writes 1 to oflow_info + * if the integer is larger than ZEND_LONG_MAX and -1 if it's smaller than ZEND_LONG_MIN. + */ +ZEND_API zend_uchar _is_numeric_string_ex(const char *str, size_t length, zend_long *lval, double *dval, int allow_errors, int *oflow_info); + END_EXTERN_C() #if ZEND_DVAL_TO_LVAL_CAST_OK @@ -125,23 +143,6 @@ static zend_always_inline zend_long zend_dval_to_lval(double d) #define ZEND_IS_DIGIT(c) ((c) >= '0' && (c) <= '9') #define ZEND_IS_XDIGIT(c) (((c) >= 'A' && (c) <= 'F') || ((c) >= 'a' && (c) <= 'f')) -/** - * Checks whether the string "str" with length "length" is numeric. The value - * of allow_errors determines whether it's required to be entirely numeric, or - * just its prefix. Leading whitespace is allowed. - * - * The function returns 0 if the string did not contain a valid number; IS_LONG - * if it contained a number that fits within the range of a long; or IS_DOUBLE - * if the number was out of long range or contained a decimal point/exponent. - * The number's value is returned into the respective pointer, *lval or *dval, - * if that pointer is not NULL. - * - * This variant also gives information if a string that represents an integer - * could not be represented as such due to overflow. It writes 1 to oflow_info - * if the integer is larger than ZEND_LONG_MAX and -1 if it's smaller than ZEND_LONG_MIN. - */ -ZEND_API zend_uchar _is_numeric_string_ex(const char *str, size_t length, zend_long *lval, double *dval, int allow_errors, int *oflow_info); - static zend_always_inline zend_uchar is_numeric_string_ex(const char *str, size_t length, zend_long *lval, double *dval, int allow_errors, int *oflow_info) { if (*str > '9') { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index c6541061921..1ac7b298ebe 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -90,6 +90,7 @@ typedef uint32_t zend_uintptr_t; typedef struct _zend_object_handlers zend_object_handlers; typedef struct _zend_class_entry zend_class_entry; typedef union _zend_function zend_function; +typedef struct _zend_execute_data zend_execute_data; typedef struct _zval_struct zval; diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index b061d5a00d0..01a91cad80f 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -294,7 +294,7 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{{ */ { WIN32_FILE_ATTRIBUTE_DATA data; - __int64 t; + LARGE_INTEGER t; const size_t path_len = strlen(path); ALLOCA_FLAG(use_heap_large); @@ -393,10 +393,11 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{ } buf->st_nlink = 1; - t = data.nFileSizeHigh; - t = t << 32; - t |= data.nFileSizeLow; - buf->st_size = t; + t.HighPart = data.nFileSizeHigh; + t.LowPart = data.nFileSizeLow; + /* It's an overflow on 32 bit, however it won't fix as long + as zend_long is 32 bit. */ + buf->st_size = (zend_long)t.QuadPart; buf->st_atime = FileTimeToUnixTime(&data.ftLastAccessTime); buf->st_ctime = FileTimeToUnixTime(&data.ftCreationTime); buf->st_mtime = FileTimeToUnixTime(&data.ftLastWriteTime); diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h index 34caaff0402..ec2875f068e 100644 --- a/Zend/zend_virtual_cwd.h +++ b/Zend/zend_virtual_cwd.h @@ -70,7 +70,7 @@ typedef unsigned short mode_t; #define IS_UNC_PATH(path, len) \ (len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1])) #define IS_ABSOLUTE_PATH(path, len) \ - (len >= 2 && ((/* is local */isalpha(path[0]) && path[1] == ':') || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1]))) + (len >= 2 && (/* is local */isalpha(path[0]) && path[1] == ':' || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1]))) #elif defined(NETWARE) #ifdef HAVE_DIRENT_H diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 489e27202b7..b843f42c418 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1711,6 +1711,8 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) vm_frame_kind frame_kind = EX(frame_kind); if (frame_kind == VM_FRAME_NESTED_FUNCTION) { + zend_object *object; + 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); @@ -1720,26 +1722,22 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) { OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype); } + object = Z_OBJ(EX(This)); zend_vm_stack_free_call_frame(execute_data TSRMLS_CC); execute_data = EG(current_execute_data); - if (Z_OBJ(EG(This))) { + if (object) { if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) { if (!(EX(opline)->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) { - Z_DELREF(EG(This)); + GC_REFCOUNT(object)--; } - if (Z_REFCOUNT(EG(This)) == 1) { - zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC); + if (GC_REFCOUNT(object) == 1) { + zend_object_store_ctor_failed(object TSRMLS_CC); } } - if (!Z_DELREF(EG(This))) { - _zval_dtor_func_for_ptr(Z_COUNTED(EG(This)) ZEND_FILE_LINE_CC); - } else if (UNEXPECTED(!Z_GC_INFO(EG(This)))) { - gc_possible_root(Z_COUNTED(EG(This)) TSRMLS_CC); - } + OBJ_RELEASE(object); } - Z_OBJ(EG(This)) = EX(object); EG(scope) = EX(scope); if (UNEXPECTED(EG(exception) != NULL)) { @@ -2252,7 +2250,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -2260,8 +2258,8 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -2532,6 +2530,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) USE_OPLINE zend_execute_data *call = EX(call); zend_function *fbc = call->func; + zend_object *object = Z_OBJ(call->This); SAVE_OPLINE(); EX(call) = call->prev_execute_data; @@ -2551,7 +2550,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) } if (fbc->common.scope && !(fbc->common.fn_flags & ZEND_ACC_STATIC) && - !call->object) { + !object) { if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { /* FIXME: output identifiers properly */ @@ -2574,16 +2573,16 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) if (fbc->common.scope) { should_change_scope = 1; - Z_OBJ(EG(This)) = call->object; /* TODO: we don't set scope if we call an object method ??? */ /* See: ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt */ #if 1 - EG(scope) = (call->object) ? NULL : fbc->common.scope; + EG(scope) = object ? NULL : fbc->common.scope; #else EG(scope) = fbc->common.scope; #endif - } else { + } else { call->called_scope = EX(called_scope); + Z_OBJ(call->This) = Z_OBJ(EX(This)); } call->prev_execute_data = execute_data; @@ -2618,7 +2617,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) if (!zend_execute_internal) { /* saves one function call if zend_execute_internal is not used */ - fbc->internal_function.handler(call->num_args, ret TSRMLS_CC); + fbc->internal_function.handler(call, ret TSRMLS_CC); } else { zend_execute_internal(call, ret TSRMLS_CC); } @@ -2638,7 +2637,6 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) } else if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) { zval *return_value = NULL; - Z_OBJ(EG(This)) = call->object; EG(scope) = fbc->common.scope; call->symbol_table = NULL; if (RETURN_VALUE_USED(opline)) { @@ -2658,25 +2656,25 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) zend_vm_stack_free_call_frame(call TSRMLS_CC); } else { call->prev_execute_data = execute_data; - i_init_func_execute_data(call, &fbc->op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_FUNCTION : VM_FRAME_TOP_FUNCTION TSRMLS_CC); + i_init_func_execute_data(call, &fbc->op_array, return_value, VM_FRAME_NESTED_FUNCTION TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_FUNCTION; zend_execute_ex(call TSRMLS_CC); } } } else { /* ZEND_OVERLOADED_FUNCTION */ - Z_OBJ(EG(This)) = call->object; EG(scope) = fbc->common.scope; ZVAL_NULL(EX_VAR(opline->result.var)); /* Not sure what should be done here if it's a static method */ - if (EXPECTED(call->object != NULL)) { + if (EXPECTED(object != NULL)) { call->prev_execute_data = execute_data; EG(current_execute_data) = call; - call->object->handlers->call_method(fbc->common.function_name, call->object, call->num_args, EX_VAR(opline->result.var) TSRMLS_CC); + object->handlers->call_method(fbc->common.function_name, object, call, EX_VAR(opline->result.var) TSRMLS_CC); EG(current_execute_data) = call->prev_execute_data; } else { zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object"); @@ -2701,18 +2699,17 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY) } ZEND_VM_C_LABEL(fcall_end_change_scope): - if (Z_OBJ(EG(This))) { + if (object) { if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) { if (!(opline->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) { - Z_DELREF(EG(This)); + GC_REFCOUNT(object)--; } - if (Z_REFCOUNT(EG(This)) == 1) { - zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC); + if (GC_REFCOUNT(object) == 1) { + zend_object_store_ctor_failed(object TSRMLS_CC); } } - OBJ_RELEASE(Z_OBJ(EG(This))); + OBJ_RELEASE(object); } - Z_OBJ(EG(This)) = EX(object); EG(scope) = EX(scope); ZEND_VM_C_LABEL(fcall_end): @@ -3256,12 +3253,12 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY) if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; } else { uint32_t arg_num = 1; @@ -3319,12 +3316,12 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY) if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; break; } @@ -3398,12 +3395,12 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; FREE_OP1(); CHECK_EXCEPTION(); @@ -4121,7 +4118,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY) } call = zend_vm_stack_push_call_frame( - (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC); + (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -4130,10 +4127,11 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY) } call->prev_execute_data = execute_data; - i_init_code_execute_data(call, new_op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_CODE : VM_FRAME_TOP_CODE TSRMLS_CC); + i_init_code_execute_data(call, new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_CODE; zend_execute_ex(call TSRMLS_CC); } @@ -5394,16 +5392,16 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) * arguments pushed to the stack that have to be dtor'ed. */ zend_vm_stack_free_args(EX(call) TSRMLS_CC); - if (call->object) { + if (Z_OBJ(call->This)) { if (call->flags & ZEND_CALL_CTOR) { if (!(call->flags & ZEND_CALL_CTOR_RESULT_UNUSED)) { - GC_REFCOUNT(call->object)--; + GC_REFCOUNT(Z_OBJ(call->This))--; } - if (GC_REFCOUNT(call->object) == 1) { - zend_object_store_ctor_failed(call->object TSRMLS_CC); + if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) { + zend_object_store_ctor_failed(Z_OBJ(call->This) TSRMLS_CC); } } - OBJ_RELEASE(call->object); + OBJ_RELEASE(Z_OBJ(call->This)); } EX(call) = call->prev_execute_data; zend_vm_stack_free_call_frame(call TSRMLS_CC); @@ -5560,7 +5558,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(EG(This)) ? &EG(This) : NULL TSRMLS_CC); + zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(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 f1fde5034b6..82676436b17 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -370,7 +370,7 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value TSRMLS_DC } execute_data = zend_vm_stack_push_call_frame( - (zend_function*)op_array, 0, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, Z_OBJ(EG(This)), NULL TSRMLS_CC); + (zend_function*)op_array, 0, 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); } else { @@ -386,6 +386,8 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) vm_frame_kind frame_kind = EX(frame_kind); if (frame_kind == VM_FRAME_NESTED_FUNCTION) { + zend_object *object; + 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); @@ -395,26 +397,22 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) != 0) && EX(func)->op_array.prototype) { OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype); } + object = Z_OBJ(EX(This)); zend_vm_stack_free_call_frame(execute_data TSRMLS_CC); execute_data = EG(current_execute_data); - if (Z_OBJ(EG(This))) { + if (object) { if (UNEXPECTED(EG(exception) != NULL) && (EX(opline)->op1.num & ZEND_CALL_CTOR)) { if (!(EX(opline)->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) { - Z_DELREF(EG(This)); + GC_REFCOUNT(object)--; } - if (Z_REFCOUNT(EG(This)) == 1) { - zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC); + if (GC_REFCOUNT(object) == 1) { + zend_object_store_ctor_failed(object TSRMLS_CC); } } - if (!Z_DELREF(EG(This))) { - _zval_dtor_func_for_ptr(Z_COUNTED(EG(This)) ZEND_FILE_LINE_CC); - } else if (UNEXPECTED(!Z_GC_INFO(EG(This)))) { - gc_possible_root(Z_COUNTED(EG(This)) TSRMLS_CC); - } + OBJ_RELEASE(object); } - Z_OBJ(EG(This)) = EX(object); EG(scope) = EX(scope); if (UNEXPECTED(EG(exception) != NULL)) { @@ -493,6 +491,7 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) USE_OPLINE zend_execute_data *call = EX(call); zend_function *fbc = call->func; + zend_object *object = Z_OBJ(call->This); SAVE_OPLINE(); EX(call) = call->prev_execute_data; @@ -512,7 +511,7 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } if (fbc->common.scope && !(fbc->common.fn_flags & ZEND_ACC_STATIC) && - !call->object) { + !object) { if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { /* FIXME: output identifiers properly */ @@ -535,16 +534,16 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (fbc->common.scope) { should_change_scope = 1; - Z_OBJ(EG(This)) = call->object; /* TODO: we don't set scope if we call an object method ??? */ /* See: ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt */ #if 1 - EG(scope) = (call->object) ? NULL : fbc->common.scope; + EG(scope) = object ? NULL : fbc->common.scope; #else EG(scope) = fbc->common.scope; #endif } else { call->called_scope = EX(called_scope); + Z_OBJ(call->This) = Z_OBJ(EX(This)); } call->prev_execute_data = execute_data; @@ -579,7 +578,7 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (!zend_execute_internal) { /* saves one function call if zend_execute_internal is not used */ - fbc->internal_function.handler(call->num_args, ret TSRMLS_CC); + fbc->internal_function.handler(call, ret TSRMLS_CC); } else { zend_execute_internal(call, ret TSRMLS_CC); } @@ -599,7 +598,6 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } else if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) { zval *return_value = NULL; - Z_OBJ(EG(This)) = call->object; EG(scope) = fbc->common.scope; call->symbol_table = NULL; if (RETURN_VALUE_USED(opline)) { @@ -619,25 +617,25 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zend_vm_stack_free_call_frame(call TSRMLS_CC); } else { call->prev_execute_data = execute_data; - i_init_func_execute_data(call, &fbc->op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_FUNCTION : VM_FRAME_TOP_FUNCTION TSRMLS_CC); + i_init_func_execute_data(call, &fbc->op_array, return_value, VM_FRAME_NESTED_FUNCTION TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_FUNCTION; zend_execute_ex(call TSRMLS_CC); } } } else { /* ZEND_OVERLOADED_FUNCTION */ - Z_OBJ(EG(This)) = call->object; EG(scope) = fbc->common.scope; ZVAL_NULL(EX_VAR(opline->result.var)); /* Not sure what should be done here if it's a static method */ - if (EXPECTED(call->object != NULL)) { + if (EXPECTED(object != NULL)) { call->prev_execute_data = execute_data; EG(current_execute_data) = call; - call->object->handlers->call_method(fbc->common.function_name, call->object, call->num_args, EX_VAR(opline->result.var) TSRMLS_CC); + object->handlers->call_method(fbc->common.function_name, object, call, EX_VAR(opline->result.var) TSRMLS_CC); EG(current_execute_data) = call->prev_execute_data; } else { zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object"); @@ -662,18 +660,17 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } fcall_end_change_scope: - if (Z_OBJ(EG(This))) { + if (object) { if (UNEXPECTED(EG(exception) != NULL) && (opline->op1.num & ZEND_CALL_CTOR)) { if (!(opline->op1.num & ZEND_CALL_CTOR_RESULT_UNUSED)) { - Z_DELREF(EG(This)); + GC_REFCOUNT(object)--; } - if (Z_REFCOUNT(EG(This)) == 1) { - zend_object_store_ctor_failed(Z_OBJ(EG(This)) TSRMLS_CC); + if (GC_REFCOUNT(object) == 1) { + zend_object_store_ctor_failed(object TSRMLS_CC); } } - OBJ_RELEASE(Z_OBJ(EG(This))); + OBJ_RELEASE(object); } - Z_OBJ(EG(This)) = EX(object); EG(scope) = EX(scope); fcall_end: @@ -880,12 +877,12 @@ static int ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; } else { uint32_t arg_num = 1; @@ -943,12 +940,12 @@ static int ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; break; } @@ -1297,16 +1294,16 @@ static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER * arguments pushed to the stack that have to be dtor'ed. */ zend_vm_stack_free_args(EX(call) TSRMLS_CC); - if (call->object) { + if (Z_OBJ(call->This)) { if (call->flags & ZEND_CALL_CTOR) { if (!(call->flags & ZEND_CALL_CTOR_RESULT_UNUSED)) { - GC_REFCOUNT(call->object)--; + GC_REFCOUNT(Z_OBJ(call->This))--; } - if (GC_REFCOUNT(call->object) == 1) { - zend_object_store_ctor_failed(call->object TSRMLS_CC); + if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) { + zend_object_store_ctor_failed(Z_OBJ(call->This) TSRMLS_CC); } } - OBJ_RELEASE(call->object); + OBJ_RELEASE(Z_OBJ(call->This)); } EX(call) = call->prev_execute_data; zend_vm_stack_free_call_frame(call TSRMLS_CC); @@ -2992,7 +2989,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA } call = zend_vm_stack_push_call_frame( - (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC); + (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -3001,10 +2998,11 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA } call->prev_execute_data = execute_data; - i_init_code_execute_data(call, new_op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_CODE : VM_FRAME_TOP_CODE TSRMLS_CC); + i_init_code_execute_data(call, new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_CODE; zend_execute_ex(call TSRMLS_CC); } @@ -4121,7 +4119,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER( if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -4129,8 +4127,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER( object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -5427,7 +5425,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZE if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -5435,8 +5433,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZE object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -6603,7 +6601,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -6611,8 +6609,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -7530,7 +7528,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -7538,8 +7536,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -7866,7 +7864,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(EG(This)) ? &EG(This) : NULL TSRMLS_CC); + zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc), EX(scope), Z_OBJ(EX(This)) ? &EX(This) : NULL TSRMLS_CC); } CHECK_EXCEPTION(); @@ -8514,7 +8512,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -8522,8 +8520,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -9730,7 +9728,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND } call = zend_vm_stack_push_call_frame( - (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC); + (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -9739,10 +9737,11 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND } call->prev_execute_data = execute_data; - i_init_code_execute_data(call, new_op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_CODE : VM_FRAME_TOP_CODE TSRMLS_CC); + i_init_code_execute_data(call, new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_CODE; zend_execute_ex(call TSRMLS_CC); } @@ -16001,12 +16000,12 @@ static int ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; zval_ptr_dtor_nogc(free_op1.var); CHECK_EXCEPTION(); @@ -16318,7 +16317,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND } call = zend_vm_stack_push_call_frame( - (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC); + (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -16327,10 +16326,11 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND } call->prev_execute_data = execute_data; - i_init_code_execute_data(call, new_op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_CODE : VM_FRAME_TOP_CODE TSRMLS_CC); + i_init_code_execute_data(call, new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_CODE; zend_execute_ex(call TSRMLS_CC); } @@ -18528,7 +18528,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -18536,8 +18536,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -20744,7 +20744,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -20752,8 +20752,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -22926,7 +22926,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -22934,8 +22934,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -24393,7 +24393,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -24401,8 +24401,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -26294,7 +26294,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_ if (UNEXPECTED(ce->constructor == NULL)) { zend_error_noreturn(E_ERROR, "Cannot call constructor"); } - if (EX(object) && zend_get_class_entry(EX(object) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { + if (Z_OBJ(EX(This)) && zend_get_class_entry(Z_OBJ(EX(This)) TSRMLS_CC) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) { zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val); } fbc = ce->constructor; @@ -26302,8 +26302,8 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_ object = NULL; if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) { - if (EX(object)) { - object = EX(object); + if (Z_OBJ(EX(This))) { + object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; if (object->handlers->get_class_entry && !instanceof_function(zend_get_class_entry(object TSRMLS_CC), ce TSRMLS_CC)) { @@ -26895,7 +26895,7 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARG zend_object_clone_obj_t clone_call; SAVE_OPLINE(); - obj = _get_obj_zval_ptr_unused(TSRMLS_C); + obj = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_CONST || UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) { @@ -26969,7 +26969,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int { USE_OPLINE zend_free_op free_op_data1; - zval *object = _get_obj_zval_ptr_unused(TSRMLS_C); + zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); zval *property = opline->op2.zv; zval *value; int have_get_ptr = 0; @@ -27066,7 +27066,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(int zval *value, *container; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { @@ -27325,7 +27325,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incde int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = opline->op2.zv; retval = EX_VAR(opline->result.var); @@ -27416,7 +27416,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incd int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = opline->op2.zv; retval = EX_VAR(opline->result.var); @@ -27502,7 +27502,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = opline->op2.zv; if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -27535,7 +27535,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE SAVE_OPLINE(); property = opline->op2.zv; - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); } @@ -27559,7 +27559,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCOD SAVE_OPLINE(); property = opline->op2.zv; - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); @@ -27583,7 +27583,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCOD zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = opline->op2.zv; if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -27617,7 +27617,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND SAVE_OPLINE(); property = opline->op2.zv; - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context"); @@ -27645,7 +27645,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OP zval *container, *property; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = opline->op2.zv; if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { @@ -27669,7 +27669,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_ zval *property_name; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property_name = opline->op2.zv; if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { @@ -27744,7 +27744,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_O zend_error_noreturn(E_ERROR, "Method name must be a string"); } - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (UNEXPECTED(EG(exception) != NULL)) { @@ -27928,7 +27928,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_H zend_ulong hval; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -28017,7 +28017,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_H zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -28047,7 +28047,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER(Z zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = opline->op2.zv; if (Z_TYPE_P(container) == IS_ARRAY) { @@ -28159,7 +28159,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER( zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = opline->op2.zv; if (Z_TYPE_P(container) == IS_OBJECT) { @@ -28321,7 +28321,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (* { USE_OPLINE zend_free_op free_op2, free_op_data1; - zval *object = _get_obj_zval_ptr_unused(TSRMLS_C); + zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); zval *property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); zval *value; int have_get_ptr = 0; @@ -28419,7 +28419,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMP(int (* zval *value, *container; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { @@ -28678,7 +28678,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_ int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); retval = EX_VAR(opline->result.var); @@ -28770,7 +28770,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); retval = EX_VAR(opline->result.var); @@ -28857,7 +28857,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_H zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -28891,7 +28891,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); } @@ -28915,7 +28915,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_ SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); @@ -28939,7 +28939,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_ zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -28974,7 +28974,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMP_HANDLER(ZEND_O SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context"); @@ -29002,7 +29002,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCO zval *container, *property; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { @@ -29026,7 +29026,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HA zval *property_name; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property_name = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { @@ -29107,7 +29107,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPC zend_error_noreturn(E_ERROR, "Method name must be a string"); } - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (UNEXPECTED(EG(exception) != NULL)) { @@ -29196,7 +29196,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HAN zend_ulong hval; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -29285,7 +29285,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HAN zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -29315,7 +29315,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEN zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (Z_TYPE_P(container) == IS_ARRAY) { @@ -29428,7 +29428,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER(ZE zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (Z_TYPE_P(container) == IS_OBJECT) { @@ -29591,7 +29591,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (* { USE_OPLINE zend_free_op free_op2, free_op_data1; - zval *object = _get_obj_zval_ptr_unused(TSRMLS_C); + zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); zval *property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); zval *value; int have_get_ptr = 0; @@ -29689,7 +29689,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_VAR(int (* zval *value, *container; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { @@ -29948,7 +29948,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_ int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); retval = EX_VAR(opline->result.var); @@ -30040,7 +30040,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); retval = EX_VAR(opline->result.var); @@ -30127,7 +30127,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -30161,7 +30161,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); } @@ -30185,7 +30185,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); @@ -30209,7 +30209,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -30244,7 +30244,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_O SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context"); @@ -30272,7 +30272,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCO zval *container, *property; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { @@ -30296,7 +30296,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HA zval *property_name; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { @@ -30377,7 +30377,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC zend_error_noreturn(E_ERROR, "Method name must be a string"); } - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (UNEXPECTED(EG(exception) != NULL)) { @@ -30466,7 +30466,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN zend_ulong hval; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -30555,7 +30555,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -30585,7 +30585,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEN zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (Z_TYPE_P(container) == IS_ARRAY) { @@ -30698,7 +30698,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER(ZE zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); if (Z_TYPE_P(container) == IS_OBJECT) { @@ -30861,7 +30861,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int { USE_OPLINE zend_free_op free_op_data1; - zval *object = _get_obj_zval_ptr_unused(TSRMLS_C); + zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); zval *property = NULL; zval *value; int have_get_ptr = 0; @@ -30958,7 +30958,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_UNUSED(int zval *value, *container; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { @@ -31377,7 +31377,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*b { USE_OPLINE zend_free_op free_op_data1; - zval *object = _get_obj_zval_ptr_unused(TSRMLS_C); + zval *object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); zval *property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); zval *value; int have_get_ptr = 0; @@ -31474,7 +31474,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(int (*b zval *value, *container; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); } else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { @@ -31733,7 +31733,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); retval = EX_VAR(opline->result.var); @@ -31824,7 +31824,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_ int have_get_ptr = 0; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); retval = EX_VAR(opline->result.var); @@ -31910,7 +31910,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HA zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -31943,7 +31943,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HA SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); } @@ -31967,7 +31967,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); @@ -31991,7 +31991,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_H zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) || @@ -32025,7 +32025,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OP SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context"); @@ -32053,7 +32053,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER(ZEND_OPCOD zval *container, *property; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { @@ -32077,7 +32077,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAN zval *property_name; SAVE_OPLINE(); - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { @@ -32157,7 +32157,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCO zend_error_noreturn(E_ERROR, "Method name must be a string"); } - object = _get_obj_zval_ptr_unused(TSRMLS_C); + object = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (UNEXPECTED(EG(exception) != NULL)) { @@ -32245,7 +32245,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAND zend_ulong hval; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -32334,7 +32334,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAND zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); } @@ -32364,7 +32364,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); if (Z_TYPE_P(container) == IS_ARRAY) { @@ -32476,7 +32476,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEN zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); if (Z_TYPE_P(container) == IS_OBJECT) { @@ -33287,12 +33287,12 @@ static int ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) { OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype); } - if (EX(call)->object) { - OBJ_RELEASE(EX(call)->object); + if (Z_OBJ(EX(call)->This)) { + OBJ_RELEASE(Z_OBJ(EX(call)->This)); } EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; - EX(call)->object = NULL; + Z_OBJ(EX(call)->This) = NULL; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -33599,7 +33599,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL } call = zend_vm_stack_push_call_frame( - (zend_function*)new_op_array, 0, 0, EX(called_scope), EX(object), NULL TSRMLS_CC); + (zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC); if (EX(symbol_table)) { call->symbol_table = EX(symbol_table); @@ -33608,10 +33608,11 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL } call->prev_execute_data = execute_data; - i_init_code_execute_data(call, new_op_array, return_value, EXPECTED(zend_execute_ex == execute_ex) ? VM_FRAME_NESTED_CODE : VM_FRAME_TOP_CODE TSRMLS_CC); + i_init_code_execute_data(call, new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC); if (EXPECTED(zend_execute_ex == execute_ex)) { ZEND_VM_ENTER(); } else { + call->frame_kind = VM_FRAME_TOP_CODE; zend_execute_ex(call TSRMLS_CC); } diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl index 58cbe097872..4db87e5a858 100644 --- a/Zend/zend_vm_execute.skl +++ b/Zend/zend_vm_execute.skl @@ -35,7 +35,7 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value } execute_data = zend_vm_stack_push_call_frame( - (zend_function*)op_array, 0, 0, EG(current_execute_data) ? EG(current_execute_data)->called_scope : NULL, Z_OBJ(EG(This)), NULL TSRMLS_CC); + (zend_function*)op_array, 0, 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); } else { diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index b18b45b25c7..69c25085aaa 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -212,7 +212,7 @@ $op1_get_obj_zval_ptr_deref = array( "TMP" => "_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)", "VAR" => "_get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)", "CONST" => "opline->op1.zv", - "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)", + "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)", "CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op1.var TSRMLS_CC)", ); @@ -221,7 +221,7 @@ $op2_get_obj_zval_ptr_deref = array( "TMP" => "_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)", "VAR" => "_get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)", "CONST" => "opline->op2.zv", - "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)", + "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)", "CV" => "_get_zval_ptr_cv_deref_\\1(execute_data, opline->op2.var TSRMLS_CC)", ); @@ -230,7 +230,7 @@ $op1_get_obj_zval_ptr_ptr = array( "TMP" => "NULL", "VAR" => "_get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)", "CONST" => "NULL", - "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)", + "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)", "CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)", ); @@ -239,7 +239,7 @@ $op2_get_obj_zval_ptr_ptr = array( "TMP" => "NULL", "VAR" => "_get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)", "CONST" => "NULL", - "UNUSED" => "_get_obj_zval_ptr_unused(TSRMLS_C)", + "UNUSED" => "_get_obj_zval_ptr_unused(execute_data TSRMLS_CC)", "CV" => "_get_zval_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)", ); diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 2e34cfd03bb..5f0b8ff6979 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -464,7 +464,7 @@ HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, char *name, } /* the core of COM */ -int php_com_do_invoke_byref(php_com_dotnet_object *obj, char *name, int namelen, +int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, WORD flags, VARIANT *v, int nargs, zval *args TSRMLS_DC) { DISPID dispid, altdispid; @@ -472,20 +472,19 @@ int php_com_do_invoke_byref(php_com_dotnet_object *obj, char *name, int namelen, HRESULT hr; VARIANT *vargs = NULL, *byref_vals = NULL; int i, byref_count = 0, j; - zend_internal_function *f = (zend_internal_function*)EG(current_execute_data)->func; /* assumption: that the active function (f) is the function we generated for the engine */ if (!f || f->arg_info == NULL) { f = NULL; } - hr = php_com_get_id_of_name(obj, name, namelen, &dispid TSRMLS_CC); + hr = php_com_get_id_of_name(obj, f->function_name->val, f->function_name->len, &dispid TSRMLS_CC); if (FAILED(hr)) { char *winerr = NULL; char *msg = NULL; winerr = php_win32_error_to_msg(hr); - spprintf(&msg, 0, "Unable to lookup `%s': %s", name, winerr); + spprintf(&msg, 0, "Unable to lookup `%s': %s", f->function_name->val, winerr); LocalFree(winerr); php_com_throw_exception(hr, msg TSRMLS_CC); efree(msg); diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 2774593e1c1..74a3920e34f 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -250,7 +250,7 @@ static PHP_FUNCTION(com_method_handler) zval *object = getThis(); Z_OBJ_HANDLER_P(object, call_method)( - ((zend_internal_function*)EG(current_execute_data)->func)->function_name, + ((zend_internal_function*)EX(func))->function_name, Z_OBJ_P(object), INTERNAL_FUNCTION_PARAM_PASSTHRU); } @@ -378,7 +378,7 @@ static int com_call_method(zend_string *method, zend_object *object, INTERNAL_FU VariantInit(&v); - if (SUCCESS == php_com_do_invoke_byref(obj, method->val, method->len, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, nargs, args TSRMLS_CC)) { + if (SUCCESS == php_com_do_invoke_byref(obj, (zend_internal_function*)EX(func), DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, nargs, args TSRMLS_CC)) { php_com_zval_from_variant(return_value, &v, obj->code_page TSRMLS_CC); ret = SUCCESS; VariantClear(&v); diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index c7e3a5ad780..e79e6f586da 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -109,7 +109,7 @@ int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, WORD flags, VARIANT *v, int nargs, zval *args, int silent, int allow_noarg TSRMLS_DC); int php_com_do_invoke(php_com_dotnet_object *obj, char *name, int namelen, WORD flags, VARIANT *v, int nargs, zval *args, int allow_noarg TSRMLS_DC); -int php_com_do_invoke_byref(php_com_dotnet_object *obj, char *name, int namelen, +int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, WORD flags, VARIANT *v, int nargs, zval *args TSRMLS_DC); /* com_wrapper.c */ diff --git a/ext/ext_skel_win32.php b/ext/ext_skel_win32.php index c04f0376577..770c6f48bbe 100644 --- a/ext/ext_skel_win32.php +++ b/ext/ext_skel_win32.php @@ -35,20 +35,6 @@ foreach($argv as $arg) { } } -$fp = fopen("$skel/skeleton.dsp", "rb"); -if ($fp) { - $dsp_file = fread($fp, filesize("$skel/skeleton.dsp")); - fclose($fp); - - $dsp_file = str_replace("extname", $extname, $dsp_file); - $dsp_file = str_replace("EXTNAME", strtoupper($extname), $dsp_file); - $fp = fopen("$extname/$extname.dsp", "wb"); - if ($fp) { - fwrite($fp, $dsp_file); - fclose($fp); - } -} - $fp = fopen("$extname/$extname.php", "rb"); if ($fp) { $php_file = fread($fp, filesize("$extname/$extname.php")); @@ -62,4 +48,5 @@ if ($fp) { } } -?> \ No newline at end of file +?> + diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 2abd5a03ef5..aca52ebf203 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -425,7 +425,7 @@ static zval *pdo_stmt_instantiate(pdo_dbh_t *dbh, zval *object, zend_class_entry return object; } /* }}} */ -static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry *dbstmt_ce, zval *ctor_args TSRMLS_DC) /* {{{ */ +static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt, zval *object, zend_class_entry *dbstmt_ce, zval *ctor_args TSRMLS_DC) /* {{{ */ { zval query_string; zval z_key; @@ -556,7 +556,7 @@ static PHP_METHOD(PDO, prepare) ZVAL_UNDEF(&stmt->lazy_object_ref); if (dbh->methods->preparer(dbh, statement, statement_len, stmt, options TSRMLS_CC)) { - pdo_stmt_construct(stmt, return_value, dbstmt_ce, &ctor_args TSRMLS_CC); + pdo_stmt_construct(execute_data, stmt, return_value, dbstmt_ce, &ctor_args TSRMLS_CC); return; } @@ -1109,7 +1109,7 @@ static PHP_METHOD(PDO, query) stmt->executed = 1; } if (ret) { - pdo_stmt_construct(stmt, return_value, dbh->def_stmt_ce, &dbh->def_stmt_ctor_args TSRMLS_CC); + pdo_stmt_construct(execute_data, stmt, return_value, dbh->def_stmt_ce, &dbh->def_stmt_ctor_args TSRMLS_CC); return; } } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 2c29229e8e3..fc279e2d12f 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -83,7 +83,7 @@ ZEND_DECLARE_MODULE_GLOBALS(reflection) /* Method macros */ #define METHOD_NOTSTATIC(ce) \ - if (!Z_OBJ(EG(This)) || !instanceof_function(Z_OBJCE(EG(This)), ce TSRMLS_CC)) { \ + if (!Z_OBJ(EX(This)) || !instanceof_function(Z_OBJCE(EX(This)), ce TSRMLS_CC)) { \ php_error_docref(NULL TSRMLS_CC, E_ERROR, "%s() cannot be called statically", get_active_function_name(TSRMLS_C)); \ return; \ } \ diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 802b028d7ed..3a091faddd1 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -78,7 +78,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const int _old_soap_version = SOAP_GLOBAL(soap_version);\ SOAP_GLOBAL(use_soap_error_handler) = 1;\ SOAP_GLOBAL(error_code) = "Server";\ - Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EG(This)); + Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EX(This)); #define SOAP_SERVER_END_CODE() \ SOAP_GLOBAL(use_soap_error_handler) = _old_handler;\ @@ -97,7 +97,7 @@ static void soap_error_handler(int error_num, const char *error_filename, const int _bailout = 0;\ SOAP_GLOBAL(use_soap_error_handler) = 1;\ SOAP_GLOBAL(error_code) = "Client";\ - Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EG(This));\ + Z_OBJ(SOAP_GLOBAL(error_object)) = Z_OBJ(EX(This));\ zend_try { #define SOAP_CLIENT_END_CODE() \ @@ -946,7 +946,7 @@ PHP_METHOD(SoapFault, __toString) fci.function_table = &Z_OBJCE_P(getThis())->function_table; ZVAL_STRINGL(&fci.function_name, "gettraceasstring", sizeof("gettraceasstring")-1); fci.symbol_table = NULL; - fci.object = Z_OBJ(EG(This)); + fci.object = Z_OBJ(EX(This)); fci.retval = &trace; fci.param_count = 0; fci.params = NULL; @@ -2620,7 +2620,8 @@ static int do_request(zval *this_ptr, xmlDoc *request, char *location, char *act return ret; } -static void do_soap_call(zval* this_ptr, +static void do_soap_call(zend_execute_data *execute_data, + zval* this_ptr, char* function, size_t function_len, int arg_count, @@ -2935,7 +2936,7 @@ PHP_METHOD(SoapClient, __call) if (output_headers) { array_init(output_headers); } - do_soap_call(this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers TSRMLS_CC); + do_soap_call(execute_data, this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers TSRMLS_CC); if (arg_count > 0) { efree(real_args); } diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index d38da10e654..44078733d66 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -346,7 +346,7 @@ PHP_FUNCTION(spl_autoload) * The "scope" is determined by an opcode, if it is ZEND_FETCH_CLASS we know function was called indirectly by * the Zend engine. */ - zend_execute_data *ex = EG(current_execute_data); + zend_execute_data *ex = EX(prev_execute_data); while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) { ex = ex->prev_execute_data; diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 1d9c00db0ae..73588ff1bd8 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -821,12 +821,12 @@ SPL_METHOD(DirectoryIterator, seek) if (intern->u.dir.index > pos) { /* we first rewind */ - zend_call_method_with_0_params(&EG(This), Z_OBJCE(EG(This)), &intern->u.dir.func_rewind, "rewind", NULL); + zend_call_method_with_0_params(&EX(This), Z_OBJCE(EX(This)), &intern->u.dir.func_rewind, "rewind", NULL); } while (intern->u.dir.index < pos) { int valid = 0; - zend_call_method_with_0_params(&EG(This), Z_OBJCE(EG(This)), &intern->u.dir.func_valid, "valid", &retval); + zend_call_method_with_0_params(&EX(This), Z_OBJCE(EX(This)), &intern->u.dir.func_valid, "valid", &retval); if (!Z_ISUNDEF(retval)) { valid = zend_is_true(&retval TSRMLS_CC); zval_ptr_dtor(&retval); @@ -834,7 +834,7 @@ SPL_METHOD(DirectoryIterator, seek) if (!valid) { break; } - zend_call_method_with_0_params(&EG(This), Z_OBJCE(EG(This)), &intern->u.dir.func_next, "next", NULL); + zend_call_method_with_0_params(&EX(This), Z_OBJCE(EX(This)), &intern->u.dir.func_next, "next", NULL); } } /* }}} */ @@ -2170,7 +2170,8 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) { return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL TSRMLS_CC); } else { - zend_call_method_with_0_params(this_ptr, Z_OBJCE_P(getThis()), &intern->u.file.func_getCurr, "getCurrentLine", &retval); + zend_execute_data *execute_data = EG(current_execute_data); + zend_call_method_with_0_params(this_ptr, Z_OBJCE(EX(This)), &intern->u.file.func_getCurr, "getCurrentLine", &retval); } if (!Z_ISUNDEF(retval)) { if (intern->u.file.current_line || !Z_ISUNDEF(intern->u.file.current_zval)) { diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 44c31276070..147ea0a7670 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -4786,15 +4786,15 @@ PHP_FUNCTION(forward_static_call) return; } - if (!EG(current_execute_data)->prev_execute_data->func->common.scope) { + if (!EX(prev_execute_data)->func->common.scope) { zend_error(E_ERROR, "Cannot call forward_static_call() when no class scope is active"); } fci.retval = &retval; - if (EG(current_execute_data)->called_scope && - instanceof_function(EG(current_execute_data)->called_scope, fci_cache.calling_scope TSRMLS_CC)) { - fci_cache.called_scope = EG(current_execute_data)->called_scope; + if (EX(called_scope) && + instanceof_function(EX(called_scope), fci_cache.calling_scope TSRMLS_CC)) { + fci_cache.called_scope = EX(called_scope); } if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && Z_TYPE(retval) != IS_UNDEF) { @@ -4818,9 +4818,9 @@ PHP_FUNCTION(forward_static_call_array) zend_fcall_info_args(&fci, params TSRMLS_CC); fci.retval = &retval; - if (EG(current_execute_data)->called_scope && - instanceof_function(EG(current_execute_data)->called_scope, fci_cache.calling_scope TSRMLS_CC)) { - fci_cache.called_scope = EG(current_execute_data)->called_scope; + if (EX(called_scope) && + instanceof_function(EX(called_scope), fci_cache.calling_scope TSRMLS_CC)) { + fci_cache.called_scope = EX(called_scope); } if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && Z_TYPE(retval) != IS_UNDEF) { diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c index 4574667c946..8f211d02364 100644 --- a/ext/standard/formatted_print.c +++ b/ext/standard/formatted_print.c @@ -378,7 +378,7 @@ php_formatted_print(int param_count, int use_array, int format_offset TSRMLS_DC) int always_sign; int format_len; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argc) == FAILURE) { + if (zend_parse_parameters(param_count TSRMLS_CC, "+", &args, &argc) == FAILURE) { return NULL; } diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index e056565ea41..da14d63d8c3 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -39,29 +39,6 @@ struct listening_socket_s { static struct fpm_array_s sockets_list; -static int fpm_sockets_resolve_af_inet(char *node, char *service, struct sockaddr_in *addr) /* {{{ */ -{ - struct addrinfo *res; - struct addrinfo hints; - int ret; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET; - ret = getaddrinfo(node, service, &hints, &res); - - if (ret != 0) { - zlog(ZLOG_ERROR, "can't resolve hostname '%s%s%s': getaddrinfo said: %s%s%s\n", - node, service ? ":" : "", service ? service : "", - gai_strerror(ret), ret == EAI_SYSTEM ? ", system error: " : "", ret == EAI_SYSTEM ? strerror(errno) : ""); - return -1; - } - - *addr = *(struct sockaddr_in *) res->ai_addr; - freeaddrinfo(res); - return 0; -} -/* }}} */ - enum { FPM_GET_USE_SOCKET = 1, FPM_STORE_SOCKET = 2, FPM_STORE_USE_SOCKET = 3 }; static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */ @@ -98,14 +75,23 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */ } /* }}} */ +static void *fpm_get_in_addr(struct sockaddr *sa) /* {{{ */ +{ + if (sa->sa_family == AF_INET) { + return &(((struct sockaddr_in*)sa)->sin_addr); + } + + return &(((struct sockaddr_in6*)sa)->sin6_addr); +} +/* }}} */ + static int fpm_sockets_hash_op(int sock, struct sockaddr *sa, char *key, int type, int op) /* {{{ */ { if (key == NULL) { switch (type) { case FPM_AF_INET : { - struct sockaddr_in *sa_in = (struct sockaddr_in *) sa; - key = alloca(sizeof("xxx.xxx.xxx.xxx:ppppp")); - sprintf(key, "%u.%u.%u.%u:%u", IPQUAD(&sa_in->sin_addr), (unsigned int) ntohs(sa_in->sin_port)); + key = alloca(INET6_ADDRSTRLEN); + inet_ntop(sa->sa_family, fpm_get_in_addr(sa), key, sizeof key); break; } @@ -254,11 +240,14 @@ enum fpm_address_domain fpm_sockets_domain_from_address(char *address) /* {{{ */ static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* {{{ */ { - struct sockaddr_in sa_in; + struct addrinfo hints, *servinfo, *p; char *dup_address = strdup(wp->config->listen_address); - char *port_str = strchr(dup_address, ':'); + char *port_str = strrchr(dup_address, ':'); char *addr = NULL; + int addr_len; int port = 0; + int sock; + int status; if (port_str) { /* this is host:port pair */ *port_str++ = '\0'; @@ -274,23 +263,35 @@ static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* return -1; } - memset(&sa_in, 0, sizeof(sa_in)); - - if (addr) { - sa_in.sin_addr.s_addr = inet_addr(addr); - if (sa_in.sin_addr.s_addr == INADDR_NONE) { /* do resolve */ - if (0 > fpm_sockets_resolve_af_inet(addr, NULL, &sa_in)) { - return -1; - } - zlog(ZLOG_NOTICE, "address '%s' resolved as %u.%u.%u.%u", addr, IPQUAD(&sa_in.sin_addr)); + // strip brackets from address for getaddrinfo + if (addr != NULL) { + addr_len = strlen(addr); + if (addr[0] == '[' && addr[addr_len - 1] == ']') { + addr[addr_len - 1] = '\0'; + addr++; } - } else { - sa_in.sin_addr.s_addr = htonl(INADDR_ANY); } - sa_in.sin_family = AF_INET; - sa_in.sin_port = htons(port); + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if ((status = getaddrinfo(addr, port_str, &hints, &servinfo)) != 0) { + zlog(ZLOG_ERROR, "getaddrinfo: %s\n", gai_strerror(status)); + return -1; + } + free(dup_address); - return fpm_sockets_get_listening_socket(wp, (struct sockaddr *) &sa_in, sizeof(struct sockaddr_in)); + + for (p = servinfo; p != NULL; p = p->ai_next) { + if ((sock = fpm_sockets_get_listening_socket(wp, p->ai_addr, p->ai_addrlen)) != -1) { + break; + } + } + + freeaddrinfo(servinfo); + + return sock; } /* }}} */ diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index 121c016a7b8..446c78e410a 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -45,10 +45,4 @@ static inline int fd_set_blocked(int fd, int blocked) /* {{{ */ } /* }}} */ -#define IPQUAD(sin_addr) \ - (unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[0], \ - (unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[1], \ - (unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[2], \ - (unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[3] - #endif diff --git a/sapi/fpm/php-fpm.conf.in b/sapi/fpm/php-fpm.conf.in index a355df2a574..106689f0a72 100644 --- a/sapi/fpm/php-fpm.conf.in +++ b/sapi/fpm/php-fpm.conf.in @@ -152,6 +152,8 @@ group = @php_fpm_group@ ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on ; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; ; 'port' - to listen on a TCP socket to all addresses on a ; specific port; ; '/path/to/unix/socket' - to listen on a unix socket. diff --git a/sapi/fpm/tests/003.phpt b/sapi/fpm/tests/003.phpt new file mode 100644 index 00000000000..389cb2401ef --- /dev/null +++ b/sapi/fpm/tests/003.phpt @@ -0,0 +1,53 @@ +--TEST-- +FPM: Test IPv6 support +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +string(%d) "[%d-%s-%d %d:%d:%d] NOTICE: fpm is running, pid %d +" +string(%d) "[%d-%s-%d %d:%d:%d] NOTICE: ready to handle connections +" +Done +--CLEAN-- + diff --git a/win32/build/DSP.README b/win32/build/DSP.README deleted file mode 100644 index c6736578cf4..00000000000 --- a/win32/build/DSP.README +++ /dev/null @@ -1,37 +0,0 @@ -MSVC++ project file generation -============================== - -These files are only intended for use in debugging and profiling, -but can be used to create working binaries. However, they are very -unlikely to match the official PHP distributed binaries. - -With this in mind, the script will only generate basic .dsp files -for the modules that are currently configured. - -The switch for project file generation is a buildconf switch and -not a configure switch: - -> buildconf --add-project-files -> configure ... - -The resulting workspace files should appear at /win32/phpdll[ts].dsw -and (if any shared modules are configured) at /win32/php_modules.dsw, -after configure is run. - -If the .dsw files haven't generated in a sane way, the most likely reason -will be that the template files have become corrupted. They need DOS -line endings (CR/LF) in order to function. The affected files are: - -/win32/build/block.template.dsw -/win32/build/template.dsp -/win32/build/template.dsw - -Simply save them with DOS line endings, and bug it to me if basic -project file generation still fails (as in, you ran the command and -configure again after saving, and you have a working copy of MSVS -installed, but clicking on the workspace(s) doesn't give you anything). - -- Steph -sfox@php.net - -July 2008 diff --git a/win32/build/buildconf.js b/win32/build/buildconf.js index 2fa134a3b43..a3a4f1e9aa7 100644 --- a/win32/build/buildconf.js +++ b/win32/build/buildconf.js @@ -23,7 +23,6 @@ WScript.StdOut.WriteLine("Rebuilding configure.js"); var FSO = WScript.CreateObject("Scripting.FileSystemObject"); var C = FSO.CreateTextFile("configure.js", true); var B = FSO.CreateTextFile("configure.bat", true); -var DSP = false; var modules = ""; var MODULES = WScript.CreateObject("Scripting.Dictionary"); @@ -197,11 +196,6 @@ function buildconf_process_args() WScript.StdOut.WriteLine("Adding " + argval + " to the module search path"); module_dirs[module_dirs.length] = argval; } - - if (argname == '--add-project-files') { - WScript.StdOut.WriteLine("Adding dsp templates into the mix"); - DSP = true; - } } } @@ -212,16 +206,6 @@ C.WriteLine("/* This file automatically generated from win32/build/confutils.js C.WriteLine("MODE_PHPIZE=false;"); C.Write(file_get_contents("win32/build/confutils.js")); -// If project files were requested, pull in the code to generate them -if (DSP == true) { - C.WriteLine('PHP_DSP="yes"'); - C.WriteBlankLines(1); - C.Write(file_get_contents("win32/build/projectgen.js")); -} else { - C.WriteLine('PHP_DSP="no"'); - C.WriteBlankLines(1); -} - // Pull in code from sapi and extensions modules = file_get_contents("win32/build/config.w32"); diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 613fc55f339..fd3c6cfa08a 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -433,13 +433,6 @@ if (PHP_SNAPSHOT_TEMPLATE == "no") { DEFINE('SNAPSHOT_TEMPLATE', PHP_SNAPSHOT_TEMPLATE); -if (PHP_DSP != "no") { - if (FSO.FolderExists("tmp")) { - FSO.DeleteFolder("tmp"); - } - FSO.CreateFolder("tmp"); -} - ARG_ENABLE("security-flags", "Disable the compiler security flags", "yes"); if (PHP_SECURITY_FLAGS == "yes") { ADD_FLAG("LDFLAGS", "/NXCOMPAT /DYNAMICBASE "); diff --git a/win32/build/config.w32.phpize.in b/win32/build/config.w32.phpize.in index af24193d360..878e48d02b0 100644 --- a/win32/build/config.w32.phpize.in +++ b/win32/build/config.w32.phpize.in @@ -352,12 +352,5 @@ if (PHP_SNAPSHOT_TEMPLATE == "no") { DEFINE('SNAPSHOT_TEMPLATE', PHP_SNAPSHOT_TEMPLATE); -if (PHP_DSP != "no") { - if (FSO.FolderExists("tmp")) { - FSO.DeleteFolder("tmp"); - } - FSO.CreateFolder("tmp"); -} - AC_DEFINE("PHP_DIR", PHP_DIR); DEFINE("PHP_DIR", PHP_DIR); diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 4b6abe16155..ae668fee260 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -28,7 +28,6 @@ var SYSTEM_DRIVE = WshShell.Environment("Process").Item("SystemDrive"); var PROGRAM_FILES = WshShell.Environment("Process").Item("ProgramFiles"); var PROGRAM_FILESx86 = WshShell.Environment("Process").Item("ProgramFiles(x86)"); var VCINSTALLDIR = WshShell.Environment("Process").Item("VCINSTALLDIR"); -var DSP_FLAGS = new Array(); var PHP_SRC_DIR=FSO.GetParentFolderName(WScript.ScriptFullName); /* Store the enabled extensions (summary + QA check) */ @@ -1130,10 +1129,6 @@ function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir) ADD_FLAG("SAPI_TARGETS", makefiletarget); } - if (PHP_DSP != "no") { - generate_dsp_file(sapiname, configure_module_dirname, file_list, false); - } - MFO.WriteBlankLines(1); sapi_enabled[sapi_enabled.length] = [sapiname]; } @@ -1366,10 +1361,6 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir) } ADD_FLAG("CFLAGS_" + EXT, cflags); - if (PHP_DSP != "no") { - generate_dsp_file(extname, configure_module_dirname, file_list, shared); - } - extensions_enabled[extensions_enabled.length] = [extname, shared ? 'shared' : 'static']; } @@ -1665,15 +1656,6 @@ function generate_files() } } - if (PHP_DSP != "no") { - generate_dsp_file("TSRM", "TSRM", null, false); - generate_dsp_file("Zend", "Zend", null, false); - generate_dsp_file("win32", "win32", null, false); - generate_dsp_file("main", "main", null, false); - generate_dsp_file("streams", "main\\streams", null, false); - copy_dsp_files(); - } - STDOUT.WriteLine("Generating files..."); generate_makefile(); if (!MODE_PHPIZE) { @@ -2043,12 +2025,6 @@ function ADD_FLAG(name, flags, target) configure_subst.Remove(name); } configure_subst.Add(name, flags); - - if (PHP_DSP != "no") { - if (flags && (name.substr(name.length-3) != "PHP") && (name.substr(0, 7) == "CFLAGS_")) { - DSP_FLAGS[DSP_FLAGS.length] = new Array(name, flags); - } - } } function get_define(name) diff --git a/win32/build/phpize.js.in b/win32/build/phpize.js.in index a843cb91a4e..b0ba0bbb827 100644 --- a/win32/build/phpize.js.in +++ b/win32/build/phpize.js.in @@ -24,7 +24,6 @@ var STDOUT = WScript.StdOut; var FSO = WScript.CreateObject("Scripting.FileSystemObject"); var C = FSO.CreateTextFile("configure.js", true); var B = FSO.CreateTextFile("configure.bat", true); -var DSP = false; re = /\\script/i; var PHP_DIR=FSO.GetParentFolderName(WScript.ScriptFullName).replace(re,""); @@ -222,16 +221,6 @@ if (FSO.FileExists(PHP_DIR + "/script/ext_pickle.js")) { C.Write(file_get_contents(PHP_DIR + "/script/confutils.js")); C.Write(file_get_contents(PHP_DIR + "/script/config.phpize.js")); -// If project files were requested, pull in the code to generate them -if (DSP == true) { - C.WriteLine('PHP_DSP="yes"'); - C.WriteBlankLines(1); - C.Write(file_get_contents(PHP_DIR + "win32/build/projectgen.js")); -} else { - C.WriteLine('PHP_DSP="no"'); - C.WriteBlankLines(1); -} - // Pull in code for the base detection modules = file_get_contents(PHP_DIR + "/script/config.w32.phpize.in"); diff --git a/win32/build/projectgen.js b/win32/build/projectgen.js deleted file mode 100644 index 0ed8cc404b9..00000000000 --- a/win32/build/projectgen.js +++ /dev/null @@ -1,624 +0,0 @@ -/* check for duplicate entries */ -function check_duplicates(local, core) -{ - if (!local) { - return core; - } - - arr = local.split(" "); - - for(i = 0; i < arr.length; i++) { - if (core.match(arr[i])) { - continue; - } - core += " " + arr[i]; - } - - return core; -} - -/* read .dsp source blocks */ -function read_src_files(ext, tmpl, path) -{ - sources = file_get_contents("tmp\\src\\" + ext + ".sources.tmp"); - sources = (path ? sources.replace(/\.\//g, path) : sources); - tmpl = tmpl.replace("SOURCEFILES", sources); - FSO.DeleteFile("tmp\\src\\" + ext + ".sources.tmp"); - - headers = file_get_contents("tmp\\src\\" + ext + ".headers.tmp"); - headers = (path ? headers.replace(/\.\//g, path) : headers); - tmpl = tmpl.replace("HEADERFILES", headers); - FSO.DeleteFile("tmp\\src\\" + ext + ".headers.tmp"); - - return tmpl; -} - -/* write a .dsp source block */ -function write_src_file(fname, path, intpath, arr) -{ - FSO.FolderExists("tmp\\src") ? "" : FSO.CreateFolder("tmp\\src"); - var src = FSO.CreateTextFile("tmp\\src\\" + fname, true); - var out = get_define("BUILD_DIR"); - var libpath = ""; - - for (i = 0; i < arr.length; i++) { - if (arr[i].length > 1) { - if (arr[i].match('alloca.c') || - arr[i].match(/internal_functions_(nw|win32)\.c/) || - arr[i].match(/flock\.(c|h)/) || - arr[i].match(/zend_(ini|language)_scanner_defs\.h/)) { - continue; - } - - libpath = arr[i].substr(2, arr[i].lastIndexOf("\\") - 2); - if (libpath) { - libpath = "\\" + libpath; - } - - src.WriteLine("# Begin Source File"); - src.WriteLine("SOURCE=" + arr[i]); - src.WriteLine('# PROP Intermediate_Dir "' + intpath + out + '\\' + path + libpath + '"'); - src.WriteLine("# End Source File"); - src.WriteBlankLines(1); - } - } - - src.Close(); - return; -} - -/* generate list of text files */ -function generate_text_filelist(ext, ext_dir) -{ - var txtdir = FSO.GetFolder(ext_dir); - - block = '# Begin Group "Text Files"\r\n\# PROP Default_Filter ""\r\n\r\n'; - txt = new Enumerator(txtdir.Files); - - for (; !txt.atEnd(); txt.moveNext()) { - fname = FSO.GetFileName(txt.item()); - munged = fname.replace(ext, ""); /* TSRM...! */ - - if (munged.match(/[A-Z]{4}/)){ - block += "# Begin Source File\r\n"; - block += "SOURCE=./" + fname + "\r\n"; - block += "# End Source File\r\n\r\n"; - } - } - - block += "# End Group\r\n"; - return block; -} - -/* generate list of resource files */ -function generate_resource_filelist(ext, ext_dir) -{ - var resdir = FSO.GetFolder(ext_dir); - res = new Enumerator(resdir.Files); - block = ""; - - for (; !res.atEnd(); res.moveNext()) { - fname = FSO.GetFileName(res.item()); - - if (fname.match(/\.(ico|rc)/)) { - block += "# Begin Source File\r\n"; - block += "SOURCE=./" + fname + "\r\n"; - block += "# End Source File\r\n\r\n"; - } - } - - return block; -} - -/* generate parser and scanner files for Zend */ -function generate_parsers_or_scanners(arr, type) -{ - var filter = (type.match("Parsers") ? "y" : "l"); - - ret = '# Begin Group "' + type + '"\r\n# PROP Default_Filter "' + filter + '"\r\n\r\n'; - - for (i = 0; i < arr.length; i++) { - - fl = "zend_" + arr[i] + "_" + type.toLowerCase().substr(0, type.length - 1); - ret += "# Begin Source File\r\n"; - ret += "SOURCE=.\\" + fl + "." + filter + "\r\n\r\n"; - ret += '# Begin Custom Build\r\n\r\n'; - - if (type.match("Parsers")) { - pre = (arr[i].match(/ini/) ? "ini_ " : "zend "); - ret += fl + ".c " + fl + ".h: " + fl + ".y\r\n"; - ret += "\tbison --output=" + fl + ".c -v -d -p " + pre + fl + ".y\r\n\r\n"; - } else { - ret += fl + ".c: " + fl + ".l\r\n"; - ret += "\tre2c --case-inverted -cbdFt " + fl + "_defs.h -o" + fl + ".c " + fl + ".l\r\n\r\n"; - } - - ret += "# End Custom Build\r\n"; - ret += "# End Source File\r\n"; - } - - ret += "# End Group\r\n\r\n"; - return ret; -} - -/* generate .defs file for php7[ts].dll */ -function generate_php_defs() -{ - var defs = get_define("PHP_DLL_DEF_SOURCES").split(" "); - var bdir = get_define("BUILD_DIR") + "\\"; - var file = get_define("PHPLIB").replace("lib", "def"); - var path = "..\\" + bdir + file; - var deps = "USERDEP__PHP7TS="; - var cmds = "BuildCmds= \\\r\n"; - var cmd = '$(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r\n\t$(BuildCmds)\r\n'; - - for (i = 0; i < defs.length; i++) { - deps += '"..\\' + defs[i] + '" '; - cmds += "\ttype ..\\" + defs[i] + (i == 0 ? " > " : " >> ") + path + " \\\r\n"; - } - - ret = '# Begin Group "Defs Files"\r\n\r\n'; - ret += "# Begin Source File\r\nSOURCE=" + path + "\r\n\r\n"; - ret += deps.substr(0, deps.length-1) + "\r\n# Begin Custom Build - "; - ret += "Generating $(InputPath)\r\nInputPath=" + path + "\r\n\r\n"; - ret += cmds + '\r\n\"' + path + '" : ' + cmd + "\r\n"; - ret += "# End Custom Build\r\n# End Source File\r\n\r\n"; - ret += "# End Group\r\n"; - return ret; -} - -/* generate win32\wsyslog.h for php7[ts].dll */ -function generate_wsyslog() -{ - var path = ".\\build\\wsyslog.mc\r\n\r\n"; - var intdir = "..\\" + get_define("BUILD_DIR"); - - ret = "# Begin Source File\r\nSOURCE=" + path; - ret += "# Begin Custom Build\r\nInputDir=.\\build\r\n"; - ret += "IntDir=" + intdir + "\r\nInputPath=" + path; - ret += '"wsyslog.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r\n'; - ret += "\tmc -h $(InputDir)/.. -r $(InputDir) -x $(IntDir) $(InputPath)\r\n\r\n"; - ret += "# End Custom Build\r\n# End Source File\r\n"; - return ret; -} - -/* generate ext\date\lib\timelib_config.h for php7[ts].dll */ -function generate_timelib_conf(headers) -{ - var file = "timelib_config.h"; - var path = "..\\ext\\date\\lib\\timelib_config.h"; - var pos = headers.search(file); - var entry = headers.slice(pos, pos + 64); - - replace = entry.replace(file, file + ".win32"); - replace += "\r\n\r\n# Begin Custom Build\r\nInputDir=..\\ext\\date\\lib\r\n"; - replace += "InputPath=" + path + ".win32\r\n\r\n"; - replace += '"' + path + '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r\n'; - replace += "\tcopy $(InputPath) $(InputDir)\\" + file + "\r\n\r\n"; - replace += "# End Custom Build"; - - headers = headers.replace(entry, replace); - return headers; -} - -/* generate php7[ts].dsp */ -function generate_core_dsp(core_headers, core_sources, headers, sources, cflags, ldflags, libs) -{ - var ts = (PHP_ZTS != "no" ? "ts" : ""); - var extname = "php7" + ts; - var tmpl = generate_dsp_file(extname, ".", false, false); - - cflags += get_define("CFLAGS_PHP").replace("/D _USRDLL", ""); - cflags = cflags.replace(/\/(I|D)(\S)/g, "/$1 $2"); - ldflags += get_define("LDFLAGS_PHP"); - libs += get_define("LIBS_PHP"); - - tmpl = tmpl.replace(/LOCALCPP/, cflags.replace(/\"ext/g, '"../ext') + " /c"); - tmpl = tmpl.replace(/LOCALLIBS/, libs); - tmpl = tmpl.replace(/LOCALLDFLAGS/, ldflags); - tmpl = tmpl.replace(extname + ".dll", get_define("PHPDLL")); - - wsyslog = (core_headers.match("wsyslog.h") ? "" : generate_wsyslog(core_headers)); - core_sources = '# Begin Group "CORE"\r\n' + core_sources + "# End Group\r\n"; - tmpl = tmpl.replace(/CORESOURCES/, core_sources); - core_headers = '# Begin Group "CORE "\r\n' + core_headers + "# End Group\r\n"; - tmpl = tmpl.replace(/COREHEADERS/, core_headers + wsyslog); - - headers = generate_timelib_conf(headers); - tmpl = tmpl.replace(/SOURCEFILES/, sources); - tmpl = tmpl.replace(/HEADERFILES/, headers); - - defs = generate_php_defs(); - tmpl = tmpl.replace(/DEFS/, defs); - - dsp = FSO.CreateTextFile("win32\\php7" + ts + ".dsp", true); - STDOUT.WriteLine("\tGenerating win32\\php7" + ts + ".dsp"); - dsp.Write(tmpl); - dsp.Close(); - - return; -} - -/* generate .dsw files */ -function generate_dsw_files(sblocks, mblocks) -{ - var stmpl = file_get_contents("win32\\build\\template.dsw"); - var mtmpl = file_get_contents("win32\\build\\template.dsw"); - var ts = (PHP_ZTS != "no" ? "ts" : ""); - - /* push all the sapi blocks to the same tag */ - stmpl = stmpl.replace("INSERT", sblocks); - stmpl = (PHP_ZTS != "no" ? stmpl : stmpl.replace(/dllts/g, "dll")); - sdsw = FSO.CreateTextFile("win32\\php7" + ts + ".dsw", true); - STDOUT.WriteLine("\tGenerating win32\\php7" + ts + ".dsw"); - sdsw.Write(stmpl); - sdsw.Close(); - - /* same for shared modules - except that nothing else goes in here */ - garbage = mtmpl.slice(200, mtmpl.search("INSERT")); - mtmpl = mtmpl.replace(garbage, "\r\n"); - mtmpl = mtmpl.replace("INSERT", mblocks); - mtmpl = (PHP_ZTS != "no" ? mtmpl : mtmpl.replace(/dllts/g, "dll")); - mdsw = FSO.CreateTextFile("win32\\php_modules.dsw", true); - STDOUT.WriteLine("\tGenerating win32\\php_modules.dsw"); - mdsw.Write(mtmpl); - mdsw.Close(); - - return; -} - -/* finalize .dsp files and copy to final destination */ -function copy_dsp_files() -{ - var tmp = FSO.GetFolder("tmp"); - var CORE_HEADERS = ""; - var CORE_SOURCES = ""; - var EXT_HEADERS = ""; - var EXT_SOURCES = ""; - var EXT_CFLAGS = ""; - var EXT_LDFLAGS = ""; - var EXT_LIBS = ""; - var sblocks = ""; /* for sapis */ - var mblocks = ""; /* for modules */ - - f = new Enumerator(tmp.Files); - - for (; !f.atEnd(); f.moveNext()) { - /* retrieve the path */ - contents = file_get_contents(f.item()); - address = contents.slice(0, contents.indexOf("#")); - contents = contents.slice(contents.indexOf("#")+1); - shared = contents.slice(0, contents.indexOf("#")); - contents = contents.slice(contents.indexOf("#")); - - /* pick up module name and path */ - path = address.slice(0, address.lastIndexOf("\\")+1); - ext = address.slice(address.lastIndexOf("\\")+1, address.length-4); - EXT = ext.toUpperCase(); - - if (path.match(/(sapi|ext)/)) { - rel = "..\\..\\"; - } else { - rel = "..\\"; - } - - /* pick up local flags and libs */ - cflags = get_define("CFLAGS_" + EXT); - cflags += (ext.match(/(TSRM|Zend)/) ? "/D TSRM_EXPORTS " : ""); - cflags += (ext.match(/Zend/) ? "/D LIBZEND_EXPORTS " : ""); - libs = get_define("LIBS_" + EXT); - ldflags = get_define("LDFLAGS_" + EXT); - ldflags = ldflags.replace(/(\.\.\\)/g, rel + "$1"); - contents = contents.replace(/LOCALCPP/, cflags + " /c"); - contents = contents.replace(/LOCALLIBS/, libs); - contents = contents.replace(/LOCALLDFLAGS/, ldflags); - - if (ext.match("Zend")) { - arr = new Array("ini", "language"); - parsers = generate_parsers_or_scanners(arr, "Parsers"); - scanners = generate_parsers_or_scanners(arr, "Scanners"); - contents = contents.replace(/DEFS/, parsers + scanners); - } - - /* none of these are core... */ - contents = contents.replace(/\r\n(CORESOURCES|COREHEADERS|EXTSOURCES|EXTHEADERS|DEFS)\r\n/g, ""); - - if (address.match("sapi")) { - /* most sapis are .dlls, just not cgi, cli, embed */ - - if (ext == "cli") { - - /* change of address: php.dsp */ - newext = "cli"; - address = "win32\\php.dsp"; - srcpath = "..\\" + path; - contents = contents.replace(/cli\.exe/g, "php.exe"); - - } else if (ext == "cgi") { - - /* change of address: php-cgi.dsp */ - newext = "cgi"; - address = "win32\\php-cgi.dsp"; - srcpath = "..\\" + path; - contents = contents.replace(/cgi\.exe/g, "php-cgi.exe"); - - } else { - - /* there's always one... most sapis just get a 'php7' prefix */ - newext = (ext.match(/apache2handler/) ? "php7apache2" : "php7" + ext); - address = address.replace(ext + ".dsp", newext + ".dsp"); - srcpath = ".\\"; - oldext = new RegExp(('[^=\\\\]'+ext), "g"); - contents = contents.replace(oldext, newext); - contents = contents.replace(ext + ".dll", newext + ".dll"); - contents = contents.replace("CFG=" + ext, "CFG=" + newext); - } - - contents = read_src_files(ext, contents, (srcpath ? srcpath : false)); - dsp = FSO.CreateTextFile(address, true); - STDOUT.WriteLine("\tGenerating " + address); - dsp.Write(contents); - dsp.Close(); - - /* add all configured sapis to the list in php7ts.dsw */ - sblocks += file_get_contents("win32\\build\\block.template.dsw"); - sblocks = sblocks.replace("ADDRESS", address); - sblocks = sblocks.replace("EXTNAME", newext); - - } else if (address.match("ext") && shared == "true") { - - /* independent modules with their own .dsp */ - contents = read_src_files(ext, contents, false); - dsp = FSO.CreateTextFile(address, true); - STDOUT.WriteLine("\tGenerating " + address); - dsp.Write(contents); - dsp.Close(); - - mblocks += file_get_contents("win32\\build\\block.template.dsw"); - mblocks = mblocks.replace("ADDRESS", address); - mblocks = mblocks.replace("EXTNAME", ext); - - } else if (ext.match(/(TSRM|Zend)/)) { - - contents = read_src_files(ext, contents, false); - dsp = FSO.CreateTextFile(address, true); - STDOUT.WriteLine("\tGenerating " + address); - dsp.Write(contents); - dsp.Close(); - - } else { - - /* bound for php7[ts].dsp */ - cflags = get_define("CFLAGS_" + EXT); - cflags = cflags ? cflags.replace(/-(I|D)/g, " /$1") : ""; - cflags = cflags? cflags.replace(/\/(I|D)\s+/g, "/$1") : ""; - cflags = cflags ? cflags.replace(/\/I(?!\")(\S+)/g, '/I"$1"') : ""; - - EXT_CFLAGS = check_duplicates(cflags, EXT_CFLAGS); - EXT_LDFLAGS = check_duplicates(ldflags, EXT_LDFLAGS); - EXT_LIBS = check_duplicates(libs, EXT_LIBS); - - beginh = '# Begin Group "' + ext + ' "\r\n'; - begins = '# Begin Group "' + ext + '"\r\n'; - - hdr = file_get_contents("tmp\\src\\" + ext + ".headers.tmp"); - hdr = hdr.replace(/\.\//g, "..\\" + path); - hdr = hdr.replace(/\.\.\\\.\.\\/g, "..\\"); - - src = file_get_contents("tmp\\src\\" + ext + ".sources.tmp"); - src = src.replace(/\.\//g, "..\\" + path); - src = src.replace(/\.\.\\\.\.\\/g, "..\\"); - - if (ext.match(/(main|standard|streams|win32)/)) { - CORE_HEADERS += beginh + hdr + "# End Group\r\n"; - CORE_SOURCES += begins + src + "# End Group\r\n"; - } else { - EXT_HEADERS += beginh + hdr + "# End Group\r\n"; - EXT_SOURCES += begins + src + "# End Group\r\n"; - } - - FSO.DeleteFile("tmp\\src\\" + ext + ".headers.tmp"); - FSO.DeleteFile("tmp\\src\\" + ext + ".sources.tmp"); - } - - FSO.DeleteFile(f.item()); - } - - generate_core_dsp(CORE_HEADERS, CORE_SOURCES, EXT_HEADERS, EXT_SOURCES, EXT_CFLAGS, EXT_LDFLAGS, EXT_LIBS); - generate_dsw_files(sblocks, mblocks); - - /* goodnight vienna */ - FSO.DeleteFolder("tmp\\src"); - FSO.DeleteFolder("tmp"); -} - -/* generate source and header entries for .dsp files */ -function generate_dsp_filelist(ext, ext_dir, files, intpath) -{ - var EXT = ext.toUpperCase(); - var tabs = new RegExp("[\t\r\n\'\"]", "gm"); - var ws = new RegExp("\\s+", "g"); - var dir = FSO.GetFolder(ext_dir); - var configfile = FSO.BuildPath(ext_dir, "config.w32"); - var headers = ""; - var path = ""; - - if (!files) { - /* module either lacks a config.w32 or is core - * either way, we know nothing about its sources - */ - files = ""; - f = new Enumerator(dir.Files); - - for (; !f.atEnd(); f.moveNext()) { - name = FSO.GetFileName(f.item()); - - if (name.substr(name.length-2) == ".c") { - files += " ./" + name; - } - } - } else { - files = files.replace(tabs, ""); - files = "./" + files.replace(/ /g, " ./"); - } - - DSP_SOURCES = files.split(" "); - - /* pick up headers (all modules) */ - f = new Enumerator(dir.Files); - - for (; !f.atEnd(); f.moveNext()) { - name = FSO.GetFileName(f.item()); - - if (name.substr(name.length-2) == ".h") { - headers += " ./" + name; - } - } - - DSP_HEADERS = headers.split(" "); - - /* check for bundled library paths and sourcefiles */ - if (FSO.FileExists(configfile)) { - config = file_get_contents(configfile); - - if (config.match("ADD_SOURCES")) { - sources = new RegExp("ADD_SOURCES\\([^,]*\\s*,\\s*['\"]([^'\"]+)['\"].*\\)", "gm"); - arr = config.match(sources); - line = arr[0].replace(tabs, ""); - line = line.replace(/ADD_SOURCES\((.+)\)/, "$1"); - newarr = line.split(','); - orig_path = newarr[0].replace(/\//g, "\\"); - orig_path = orig_path.replace(/configure_module_dirname(\s?\+\s?)?/, ext_dir); - path = orig_path.replace(ext_dir + '\\', ""); - - if (path.length > 0 && path != ext_dir) { - subdir = FSO.GetFolder(orig_path); - lib = new Enumerator(subdir.Files); - libheaders = ""; - - for (; !lib.atEnd(); lib.moveNext()) { - name = FSO.GetFileName(lib.item()); - - if (name.substr(name.length-2) == ".h") { - libheaders += " ./" + path + "\\" + name; - } - } - - DSP_HEADERS = DSP_HEADERS.concat(libheaders.split(" ")); - - } else { - path = ""; - } - - sources = newarr[1].replace(/\\/g, ""); /* continuation lines */ - sources = sources.replace(ws, " "); - sources = sources.replace(/\s/g, (path ? " ./" + path + "\\" : " ./")); - sources = check_duplicates(DSP_SOURCES.join(" "), sources); - DSP_SOURCES = sources.split(" "); - } - } - - /* store the array contents in temp files for now */ - write_src_file(ext + ".headers.tmp", ext_dir, intpath, DSP_HEADERS); - write_src_file(ext + ".sources.tmp", ext_dir, intpath, DSP_SOURCES); - - return; -} - -/* entry point. Called from EXTENSION(), SAPI() and generate_files() (confutils.js) */ -function generate_dsp_file(ext, ext_dir, files, shared) -{ - var dsp = FSO.CreateTextFile("tmp\\" + ext + ".dsp", true); - var tmpl = file_get_contents("win32\\build\\template.dsp"); - var ts = (PHP_ZTS != "no" ? "ts" : ""); - var debug = (PHP_DEBUG != "no" ? " /debug" : ""); - var ld = (debug ? "/LDd" : "/LD"); - var status = (PHP_DEBUG == "no" ? 'Release' : 'Debug'); - var statusts = status + (ts ? "_" + ts.toUpperCase() : ""); - var baseflags = ""; - - /* store the final path and value of shared in the tmp file */ - if (!ext.match("php7")) { - tmpl = ext_dir + "\\" + ext + ".dsp#" + shared + tmpl; - } - - tmpl = tmpl.replace(/extname/g, ext); - tmpl = tmpl.replace(/Status_TS/g, statusts); - - if (debug) { - tmpl = tmpl.replace(/Use_Debug_Libraries 0/g, "Use_Debug_Libraries 1"); - tmpl = tmpl.replace(/NDEBUG/g, "_DEBUG"); - } - - if (ext == "cli" || ext == "cgi") { - tmpl = tmpl.replace(/Dynamic-Link Library/g, "Console Application"); - tmpl = tmpl.replace(/0x0102/, "0x0103"); - path = "..\\"; - type = ".exe"; - } else if (ext == "embed" || ext == "TSRM" || ext == "Zend") { - tmpl = tmpl.replace(/Dynamic-Link/g, "Static"); - tmpl = tmpl.replace(/0x0102/, "0x0104"); - tmpl = tmpl.replace(/LINK32/g, "LIB32"); - tmpl = tmpl.replace("link.exe", "link.exe -lib"); - tmpl = tmpl.replace(/BASELIBS/g, "/nologo"); - tmpl = tmpl.replace(/\s(LOCALLIBS|BASELDFLAGS|LOCALLDFLAGS|OUTPATH)/g, ""); - path = "..\\"; - if (ext == "embed") { - path += "..\\"; - } - type = ".lib"; - } else if (ext.match("php7")) { - path = "..\\"; - type = ".dll"; - } else { - path = "..\\..\\"; - type = ".dll"; - } - - outpath = path + get_define("BUILD_DIR"); - tmpl = tmpl.replace(/OUTPUTDIR/g, outpath); - - /* populate the baseline CFLAGS and libs */ - cflags = get_define("CFLAGS").replace(/\s+/g, " "); - cflags = cflags.replace('/I "..\\bindlib_w32" ', ""); - bcflags = (cflags.replace(/\/([A-Z])\s/g, "/$1")).split(" "); - - for (i= 0; i < bcflags.length; i++) { - baseflags += (bcflags[i].match(/(PHP|ZEND|ZTS|BASE|FD|WINDOWS)/) ? "" : bcflags[i]); - } - - baseflags = baseflags.replace(/\//g, " /"); - baseflags = baseflags.substr(1).replace(/(\/D)/g, "$1 ") + " /c"; - tmpl = tmpl.replace(/BASECPP/, (type == ".dll" ? baseflags : baseflags.replace(ld + " ", ""))); - - tmpl = tmpl.replace(/BASELIBS/, "/nologo " + get_define("LIBS").replace(/\sresolv.lib/, "")); - - /* now populate the bases in the 'local' lines */ - incs = get_define("BASE_INCLUDES").replace(/\/I (\S+)/g, '/I "' + path + '$1"'); - incs = incs.replace('"' + path + '."', '".."'); - lcflags = cflags.replace(/\$\(BASE_INCLUDES\)/, incs + (type == ".exe" ? '/I "..\\sapi" ' : "") + '/I "' + path + '..\\bindlib_w32"'); - tmpl = tmpl.replace(/BASECPP/, (type == ".dll" ? lcflags : lcflags.replace(ld + " ", ""))); - tmpl = tmpl.replace(/BASELIBS/, "/nologo " + get_define("LIBS") + " " + (ext.match("php7") ? "" : get_define("PHPLIB"))); - ldflags = get_define("LDFLAGS").replace(/\s?(\/nologo|\/libpath:\S+)\s?/g, ""); - tmpl = tmpl.replace(/BASELDFLAGS/, ldflags + (type == ".dll" ? " " + get_define("DLL_LDFLAGS") : "") + (debug ? ' /nodefaultlib:"msvcrt"' : "")); - out = '/out:"' + outpath + "\\" + ext + type + '"' + ' /libpath:"' + outpath + '"' + ' /libpath:"..\\' + path + 'bindlib_w32\\' + status + '"'; - tmpl = tmpl.replace(/OUTPATH/, out); - - txt = generate_text_filelist(ext, ext_dir); - res = generate_resource_filelist(ext, ext_dir); - - tmpl = tmpl.replace(/TEXTFILES/, txt); - tmpl = tmpl.replace(/RESOURCEFILES/, res); - - if (ext.match("php7")) { - return tmpl; - } - - /* generate source and header blocks for .dsp */ - generate_dsp_filelist(ext, ext_dir, files, path); - - dsp.Write(tmpl); - dsp.Close(); - - return; -}