From f3c57716f76a1f625b8b528a7a550c8f86d309a1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 8 Apr 2014 00:38:54 +0400 Subject: [PATCH] Optimized ZEND_FETCH_R and family --- Zend/zend_execute.c | 35 +- Zend/zend_vm_def.h | 70 ++-- Zend/zend_vm_execute.h | 792 +++++++++++++---------------------------- 3 files changed, 283 insertions(+), 614 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 31c2514913..0772414616 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -959,27 +959,22 @@ static void zend_extension_fcall_end_handler(const zend_extension *extension, ze static inline HashTable *zend_get_target_symbol_table(int fetch_type TSRMLS_DC) { - switch (fetch_type) { - case ZEND_FETCH_LOCAL: - if (!EG(active_symbol_table)) { - zend_rebuild_symbol_table(TSRMLS_C); - } - return &EG(active_symbol_table)->ht; - break; - case ZEND_FETCH_GLOBAL: - case ZEND_FETCH_GLOBAL_LOCK: - return &EG(symbol_table).ht; - break; - case ZEND_FETCH_STATIC: - if (!EG(active_op_array)->static_variables) { - ALLOC_HASHTABLE(EG(active_op_array)->static_variables); - zend_hash_init(EG(active_op_array)->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0); - } - return EG(active_op_array)->static_variables; - break; - EMPTY_SWITCH_DEFAULT_CASE() + HashTable *ht; + + if (EXPECTED(fetch_type == ZEND_FETCH_GLOBAL_LOCK) || + EXPECTED(fetch_type == ZEND_FETCH_GLOBAL)) { + ht = &EG(symbol_table).ht; + } else if (EXPECTED(fetch_type == ZEND_FETCH_STATIC)) { + ZEND_ASSERT(EG(active_op_array)->static_variables != NULL); + ht = EG(active_op_array)->static_variables; + } else { + ZEND_ASSERT(fetch_type == ZEND_FETCH_LOCAL); + if (!EG(active_symbol_table)) { + zend_rebuild_symbol_table(TSRMLS_C); + } + ht = &EG(active_symbol_table)->ht; } - return NULL; + return ht; } static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht, const zval *dim, int dim_type, int type TSRMLS_DC) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f028d2cb66..8ea46f4af9 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -996,6 +996,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| SAVE_OPLINE(); varname = GET_OP1_ZVAL_PTR(BP_VAR_R); + ZVAL_UNDEF(&tmp_varname); if (OP1_TYPE != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -1011,7 +1012,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (OP1_TYPE != IS_CONST && varname == &tmp_varname) { + if (OP1_TYPE != IS_CONST) { zval_dtor(&tmp_varname); } FREE_OP1(); @@ -1027,7 +1028,8 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| FREE_OP1(); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -1069,56 +1071,25 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (OP1_TYPE != IS_TMP_VAR) { - FREE_OP1(); - } - break; - case ZEND_FETCH_LOCAL: - FREE_OP1(); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (OP1_TYPE == IS_VAR && !OP1_FREE) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + FREE_OP1(); } } - - if (OP1_TYPE != IS_CONST && varname == &tmp_varname) { + if (OP1_TYPE != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; - } + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); + } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -1143,8 +1114,11 @@ ZEND_VM_HANDLER(92, ZEND_FETCH_FUNC_ARG, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) { USE_OPLINE - ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, - zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_W); + } else { + ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_R); + } } ZEND_VM_HANDLER(95, ZEND_FETCH_UNSET, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index cd91880803..87882bacc6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3523,6 +3523,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type SAVE_OPLINE(); varname = opline->op1.zv; + ZVAL_UNDEF(&tmp_varname); if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -3538,7 +3539,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_CONST != IS_CONST && varname == &tmp_varname) { + if (IS_CONST != IS_CONST) { zval_dtor(&tmp_varname); } @@ -3554,7 +3555,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -3596,56 +3598,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_CONST != IS_TMP_VAR) { - - } - break; - case ZEND_FETCH_LOCAL: + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_CONST == IS_VAR && !0) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; } } - - if (IS_CONST != IS_CONST && varname == &tmp_varname) { + if (IS_CONST != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -3670,7 +3641,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCO { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_CONST_CONST(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5298,6 +5273,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, SAVE_OPLINE(); varname = opline->op1.zv; + ZVAL_UNDEF(&tmp_varname); if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -5313,7 +5289,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_CONST != IS_CONST && varname == &tmp_varname) { + if (IS_CONST != IS_CONST) { zval_dtor(&tmp_varname); } @@ -5329,7 +5305,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -5371,56 +5348,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_CONST != IS_TMP_VAR) { - - } - break; - case ZEND_FETCH_LOCAL: + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_CONST == IS_VAR && !0) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; } } - - if (IS_CONST != IS_CONST && varname == &tmp_varname) { + if (IS_CONST != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -5445,7 +5391,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_CONST_VAR(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -5995,6 +5945,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ SAVE_OPLINE(); varname = opline->op1.zv; + ZVAL_UNDEF(&tmp_varname); if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -6010,7 +5961,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_CONST != IS_CONST && varname == &tmp_varname) { + if (IS_CONST != IS_CONST) { zval_dtor(&tmp_varname); } @@ -6026,7 +5977,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -6068,56 +6020,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_CONST != IS_TMP_VAR) { + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { - } - break; - case ZEND_FETCH_LOCAL: - - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_CONST == IS_VAR && !0) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; } } - - if (IS_CONST != IS_CONST && varname == &tmp_varname) { + if (IS_CONST != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -6142,7 +6063,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPC { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -8629,6 +8554,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, SAVE_OPLINE(); varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_TMP_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -8644,7 +8570,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_TMP_VAR != IS_CONST) { zval_dtor(&tmp_varname); } zval_dtor(free_op1.var); @@ -8660,7 +8586,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, zval_dtor(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -8702,56 +8629,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_TMP_VAR != IS_TMP_VAR) { - zval_dtor(free_op1.var); - } - break; - case ZEND_FETCH_LOCAL: - zval_dtor(free_op1.var); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_TMP_VAR == IS_VAR && !1) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + zval_dtor(free_op1.var); } } - - if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_TMP_VAR != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -8776,7 +8672,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_TMP_CONST(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10268,6 +10168,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE SAVE_OPLINE(); varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_TMP_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -10283,7 +10184,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_TMP_VAR != IS_CONST) { zval_dtor(&tmp_varname); } zval_dtor(free_op1.var); @@ -10299,7 +10200,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE zval_dtor(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -10341,56 +10243,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_TMP_VAR != IS_TMP_VAR) { - zval_dtor(free_op1.var); - } - break; - case ZEND_FETCH_LOCAL: - zval_dtor(free_op1.var); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_TMP_VAR == IS_VAR && !1) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + zval_dtor(free_op1.var); } } - - if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_TMP_VAR != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10415,7 +10286,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_H { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_TMP_VAR(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -10965,6 +10840,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, SAVE_OPLINE(); varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_TMP_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -10980,7 +10856,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_TMP_VAR != IS_CONST) { zval_dtor(&tmp_varname); } zval_dtor(free_op1.var); @@ -10996,7 +10872,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, zval_dtor(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -11038,56 +10915,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_TMP_VAR != IS_TMP_VAR) { - zval_dtor(free_op1.var); - } - break; - case ZEND_FETCH_LOCAL: - zval_dtor(free_op1.var); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_TMP_VAR == IS_VAR && !1) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + zval_dtor(free_op1.var); } } - - if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_TMP_VAR != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -11112,7 +10958,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCOD { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -14280,6 +14130,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -14295,7 +14146,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_VAR != IS_CONST) { zval_dtor(&tmp_varname); } zval_ptr_dtor_nogc(free_op1.var); @@ -14311,7 +14162,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, zval_ptr_dtor_nogc(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -14353,56 +14205,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_VAR != IS_TMP_VAR) { - zval_ptr_dtor_nogc(free_op1.var); - } - break; - case ZEND_FETCH_LOCAL: - zval_ptr_dtor_nogc(free_op1.var); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + zval_ptr_dtor_nogc(free_op1.var); } } - - if (IS_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_VAR != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14427,7 +14248,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_VAR_CONST(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -18529,6 +18354,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -18544,7 +18370,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_VAR != IS_CONST) { zval_dtor(&tmp_varname); } zval_ptr_dtor_nogc(free_op1.var); @@ -18560,7 +18386,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE zval_ptr_dtor_nogc(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -18602,56 +18429,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_VAR != IS_TMP_VAR) { - zval_ptr_dtor_nogc(free_op1.var); - } - break; - case ZEND_FETCH_LOCAL: - zval_ptr_dtor_nogc(free_op1.var); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + zval_ptr_dtor_nogc(free_op1.var); } } - - if (IS_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_VAR != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18676,7 +18472,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_H { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_VAR_VAR(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20362,6 +20162,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -20377,7 +20178,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_VAR != IS_CONST) { zval_dtor(&tmp_varname); } zval_ptr_dtor_nogc(free_op1.var); @@ -20393,7 +20194,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, zval_ptr_dtor_nogc(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -20435,56 +20237,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_VAR != IS_TMP_VAR) { - zval_ptr_dtor_nogc(free_op1.var); - } - break; - case ZEND_FETCH_LOCAL: - zval_ptr_dtor_nogc(free_op1.var); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { + zval_ptr_dtor_nogc(free_op1.var); } } - - if (IS_VAR != IS_CONST && varname == &tmp_varname) { + if (IS_VAR != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20509,7 +20280,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCOD { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -30592,6 +30367,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z SAVE_OPLINE(); varname = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -30607,7 +30383,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_CV != IS_CONST && varname == &tmp_varname) { + if (IS_CV != IS_CONST) { zval_dtor(&tmp_varname); } @@ -30623,7 +30399,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -30665,56 +30442,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_CV != IS_TMP_VAR) { + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { - } - break; - case ZEND_FETCH_LOCAL: - - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_CV == IS_VAR && !0) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; } } - - if (IS_CV != IS_CONST && varname == &tmp_varname) { + if (IS_CV != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -30739,7 +30485,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_ { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_CV_CONST(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34506,6 +34256,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN SAVE_OPLINE(); varname = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -34521,7 +34272,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_CV != IS_CONST && varname == &tmp_varname) { + if (IS_CV != IS_CONST) { zval_dtor(&tmp_varname); } @@ -34537,7 +34288,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -34579,56 +34331,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_CV != IS_TMP_VAR) { - - } - break; - case ZEND_FETCH_LOCAL: + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_CV == IS_VAR && !0) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; } } - - if (IS_CV != IS_CONST && varname == &tmp_varname) { + if (IS_CV != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -34653,7 +34374,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HA { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_CV_VAR(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36217,6 +35942,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, SAVE_OPLINE(); varname = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); + ZVAL_UNDEF(&tmp_varname); if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) { ZVAL_DUP_DEREF(&tmp_varname, varname); convert_to_string(&tmp_varname); @@ -36232,7 +35958,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, } else { ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC); if (UNEXPECTED(ce == NULL)) { - if (IS_CV != IS_CONST && varname == &tmp_varname) { + if (IS_CV != IS_CONST) { zval_dtor(&tmp_varname); } @@ -36248,7 +35974,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + retval = zend_hash_find(target_symbol_table, Z_STR_P(varname)); + if (retval == NULL) { switch (type) { case BP_VAR_R: case BP_VAR_UNSET: @@ -36290,56 +36017,25 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, } } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (IS_CV != IS_TMP_VAR) { + if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_STATIC) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } else if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) { - } - break; - case ZEND_FETCH_LOCAL: - - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (IS_CV == IS_VAR && !0) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; } } - - if (IS_CV != IS_CONST && varname == &tmp_varname) { + if (IS_CV != IS_CONST) { zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); - } - - if (EXPECTED(retval != NULL)) { - switch (type) { - case BP_VAR_R: - case BP_VAR_IS: - ZVAL_COPY(EX_VAR(opline->result.var), retval); - break; - case BP_VAR_UNSET: { - //??? zend_free_op free_res; - //??? - //??? PZVAL_UNLOCK(*retval, &free_res); - //??? if (retval != &EG(uninitialized_zval_ptr)) { - //??? SEPARATE_ZVAL_IF_NOT_REF(retval); - //??? } - //??? PZVAL_LOCK(*retval); - //??? FREE_OP_VAR_PTR(free_res); - } - /* break missing intentionally */ - default: - ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); - break; + ZEND_ASSERT(retval != NULL); + if (type == BP_VAR_R || type == BP_VAR_IS) { + ZVAL_COPY(EX_VAR(opline->result.var), retval); + } else { + if (/*type == BP_VAR_W &&*/ (opline->extended_value & ZEND_FETCH_MAKE_REF)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); } + ZVAL_INDIRECT(EX_VAR(opline->result.var), retval); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36364,7 +36060,11 @@ static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE { USE_OPLINE - return zend_fetch_var_address_helper_SPEC_CV_UNUSED(zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC) ? BP_VAR_W : BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + if (zend_is_by_ref_func_arg_fetch(opline, EX(call) TSRMLS_CC)) { + return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } else { + return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } } static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -- 2.40.0