diff options
Diffstat (limited to 'Zend/zend_execute.c')
| -rw-r--r-- | Zend/zend_execute.c | 79 |
1 files changed, 33 insertions, 46 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b9f710cce3..7977c873b3 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -214,9 +214,8 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, zend_uint var, int if (EG(active_symbol_table)) { ret = zend_hash_find(EG(active_symbol_table), cv); if (ret) { - ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT); - ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret)); - return Z_INDIRECT_P(ptr); + ZVAL_INDIRECT(ptr, ret); + return ret; } } @@ -232,14 +231,12 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, zend_uint var, int /* break missing intentionally */ case BP_VAR_W: if (EG(active_symbol_table)) { - zval zv; - ZVAL_COPY_VALUE(ptr, &EG(uninitialized_zval)); - ZVAL_INDIRECT(&zv, ptr); - zend_hash_update(EG(active_symbol_table), cv, &zv); + ret = zend_hash_update(EG(active_symbol_table), cv, ret); + ZVAL_INDIRECT(ptr, ret); } else { ZVAL_NULL(ptr); + ret = ptr; } - ret = ptr; break; } return ret; @@ -253,9 +250,8 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, zend_uint if (EG(active_symbol_table)) { ret = zend_hash_find(EG(active_symbol_table), cv); if (ret) { - ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT); - ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret)); - return Z_INDIRECT_P(ptr); + ZVAL_INDIRECT(ptr, ret); + return ret; } } @@ -271,9 +267,8 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, zend_ if (EG(active_symbol_table)) { ret = zend_hash_find(EG(active_symbol_table), cv); if (ret) { - ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT); - ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret)); - return Z_INDIRECT_P(ptr); + ZVAL_INDIRECT(ptr, ret); + return ret; } } @@ -289,9 +284,8 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_IS(zval *ptr, zend_uin if (EG(active_symbol_table)) { ret = zend_hash_find(EG(active_symbol_table), cv); if (ret) { - ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT); - ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret)); - return Z_INDIRECT_P(ptr); + ZVAL_INDIRECT(ptr, ret); + return ret; } } @@ -306,17 +300,13 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, zend_uin if (EG(active_symbol_table)) { ret = zend_hash_find(EG(active_symbol_table), cv); if (ret) { - ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT); - ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret)); - return Z_INDIRECT_P(ptr); - } else { - zval zv; - ZVAL_COPY_VALUE(ptr, &EG(uninitialized_zval)); - ZVAL_INDIRECT(&zv, ptr); - zend_hash_update(EG(active_symbol_table), cv, &zv); - zend_error(E_NOTICE, "Undefined variable: %s", cv->val); - return ptr; + ZVAL_INDIRECT(ptr, ret); + return ret; } + ret = zend_hash_update(EG(active_symbol_table), cv, &EG(uninitialized_zval)); + ZVAL_INDIRECT(ptr, ret); + zend_error(E_NOTICE, "Undefined variable: %s", cv->val); + return ret; } else { ZVAL_NULL(ptr); zend_error(E_NOTICE, "Undefined variable: %s", cv->val); @@ -332,16 +322,12 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_W(zval *ptr, zend_uint if (EG(active_symbol_table)) { ret = zend_hash_find(EG(active_symbol_table), cv); if (ret) { - ZEND_ASSERT(Z_TYPE_P(ret) == IS_INDIRECT); - ZVAL_INDIRECT(ptr, Z_INDIRECT_P(ret)); - return Z_INDIRECT_P(ptr); - } else { - zval zv; - ZVAL_COPY_VALUE(ptr, &EG(uninitialized_zval)); - ZVAL_INDIRECT(&zv, ptr); - zend_hash_update(EG(active_symbol_table), cv, &zv); - return ptr; + ZVAL_INDIRECT(ptr, ret); + return ret; } + ret = zend_hash_update(EG(active_symbol_table), cv, &EG(uninitialized_zval)); + ZVAL_INDIRECT(ptr, ret); + return ret; } else { ZVAL_NULL(ptr); return ptr; @@ -1539,20 +1525,20 @@ static inline zend_brk_cont_element* zend_brk_cont(int nest_levels, int array_of zend_hash_apply(EG(active_symbol_table), (apply_func_t) zend_check_symbol TSRMLS_CC); \ } -static int zend_check_symbol(zval *zv TSRMLS_DC) +static int zend_check_symbol(zval **pz TSRMLS_DC) { - if (Z_TYPE_P(zv) > 17) { - fprintf(stderr, "Warning! %x has invalid type!\n", *zv); + if (Z_TYPE_PP(pz) > 9) { + fprintf(stderr, "Warning! %x has invalid type!\n", *pz); /* See http://support.microsoft.com/kb/190351 */ #ifdef PHP_WIN32 fflush(stderr); #endif - } else if (Z_TYPE_P(zv) == IS_ARRAY) { - zend_hash_apply(Z_ARRVAL_P(zv), (apply_func_t) zend_check_symbol TSRMLS_CC); - } else if (Z_TYPE_P(zv) == IS_OBJECT) { + } else if (Z_TYPE_PP(pz) == IS_ARRAY) { + zend_hash_apply(Z_ARRVAL_PP(pz), (apply_func_t) zend_check_symbol TSRMLS_CC); + } else if (Z_TYPE_PP(pz) == IS_OBJECT) { /* OBJ-TBI - doesn't support new object model! */ - zend_hash_apply(Z_OBJPROP_P(zv), (apply_func_t) zend_check_symbol TSRMLS_CC); + zend_hash_apply(Z_OBJPROP_PP(pz), (apply_func_t) zend_check_symbol TSRMLS_CC); } return 0; @@ -1742,10 +1728,11 @@ static zend_always_inline zend_execute_data *i_create_execute_data_from_op_array if (!EG(active_symbol_table)) { ZVAL_COPY(EX_VAR_NUM(op_array->this_var), &EG(This)); } else { - zval zv; ZVAL_COPY(EX_VAR_NUM(op_array->this_var), &EG(This)); - ZVAL_INDIRECT(&zv, EX_VAR_NUM(op_array->this_var)); - zend_hash_str_add(EG(active_symbol_table), "this", sizeof("this")-1, &zv); + zval *zv = zend_hash_str_add(EG(active_symbol_table), "this", sizeof("this")-1, EX_VAR(op_array->this_var)); + if (zv) { + ZVAL_INDIRECT(EX_VAR_NUM(op_array->this_var), zv); + } } } |
