From: Dmitry Stogov Date: Mon, 28 May 2018 14:10:58 +0000 (+0300) Subject: Avoid reference-counting X-Git-Tag: php-7.3.0alpha2~10^2~37 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ea26ab3393775437930e7900426632fef7124ed3;p=php Avoid reference-counting --- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e29162fa10..8554034151 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5153,11 +5153,13 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (OP1_TYPE == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); + FREE_OP1_VAR_PTR(); } - FREE_OP1_VAR_PTR(); } else { expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE == IS_TMP_VAR) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 17f3e386d7..3db1a969f2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5575,11 +5575,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CONST == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = RT_CONSTANT(opline, opline->op1); if (IS_CONST == IS_TMP_VAR) { @@ -7643,11 +7645,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_T UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CONST == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = RT_CONSTANT(opline, opline->op1); if (IS_CONST == IS_TMP_VAR) { @@ -8921,11 +8925,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_U UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CONST == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = RT_CONSTANT(opline, opline->op1); if (IS_CONST == IS_TMP_VAR) { @@ -10701,11 +10707,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CONST == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = RT_CONSTANT(opline, opline->op1); if (IS_CONST == IS_TMP_VAR) { @@ -18777,11 +18785,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_TMP_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -19191,11 +19201,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_TMP_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -19681,11 +19693,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNU UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_TMP_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -20151,11 +20165,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_TMP_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -24033,11 +24049,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CON UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } else { expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_TMP_VAR) { @@ -26178,11 +26196,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } else { expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_TMP_VAR) { @@ -27764,11 +27784,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNU UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } else { expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_TMP_VAR) { @@ -29988,11 +30010,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_VAR == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; } else { expr_ptr = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_TMP_VAR) { @@ -41056,11 +41080,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONS UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CV == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_TMP_VAR) { @@ -44724,11 +44750,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPV UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CV == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_TMP_VAR) { @@ -46758,11 +46786,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUS UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CV == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_TMP_VAR) { @@ -50331,11 +50361,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_H UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (Z_ISREF_P(expr_ptr)) { - Z_ADDREF_P(expr_ptr); + if (IS_CV == IS_CV) { + Z_ADDREF_P(expr_ptr); + } } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); - } + } } else { expr_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_TMP_VAR) {