summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-05-28 17:10:58 +0300
committerDmitry Stogov <dmitry@zend.com>2018-05-28 17:10:58 +0300
commitea26ab3393775437930e7900426632fef7124ed3 (patch)
tree216fc4cce5d0af93f63396f9eb55f9a402945bd8
parent5eb1f92f31cafc48384f9096012f421b37f6d425 (diff)
downloadphp-git-ea26ab3393775437930e7900426632fef7124ed3.tar.gz
Avoid reference-counting
-rw-r--r--Zend/zend_vm_def.h6
-rw-r--r--Zend/zend_vm_execute.h96
2 files changed, 68 insertions, 34 deletions
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) {