Drop FREE_OP_VAR_PTR() distinction

FREE_OP_VAR_PTR() is like FREE_OP(), but only frees VAR, rather
than VARs and TMPs. I don't think this distinction makes sense
anymore, as opcodes using FREE_OP_VAR_PTR() generally only accept
VAR or CV. For the cases where other op types are accepted and
only freeing VAR is desired we already have FREE_OP_IF_VAR().

This drops FREE_OP_VAR_PTR(), leaving only FREE_OP() and
FREE_OP_IF_VAR().
This commit is contained in:
Nikita Popov 2021-10-19 12:24:03 +02:00 committed by Nikita Popov
parent fdbc745ea1
commit da0d246e19
4 changed files with 60 additions and 152 deletions

View File

@ -168,9 +168,6 @@ ZEND_API const zend_internal_function zend_pass_function = {
zval_ptr_dtor_nogc(EX_VAR(var)); \
}
#define FREE_OP_VAR_PTR(type, var) \
FREE_OP(type, var)
#define CV_DEF_OF(i) (EX(func)->op_array.vars[i])
#define ZEND_VM_STACK_PAGE_SLOTS (16 * 1024) /* should be a power of 2 */

View File

@ -1093,7 +1093,7 @@ ZEND_VM_C_LABEL(assign_op_object):
FREE_OP_DATA();
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -1229,7 +1229,7 @@ ZEND_VM_C_LABEL(assign_dim_op_ret_null):
}
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -1260,7 +1260,7 @@ ZEND_VM_HANDLER(26, ZEND_ASSIGN_OP, VAR|CV, CONST|TMPVAR|CV, OP)
}
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1328,7 +1328,7 @@ ZEND_VM_C_LABEL(pre_incdec_object):
} while (0);
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1400,7 +1400,7 @@ ZEND_VM_C_LABEL(post_incdec_object):
} while (0);
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1490,7 +1490,7 @@ ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1542,7 +1542,7 @@ ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
}
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1592,7 +1592,7 @@ ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY)
increment_function(var_ptr);
} while (0);
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -1640,7 +1640,7 @@ ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY)
decrement_function(var_ptr);
} while (0);
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -2485,7 +2485,7 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj):
FREE_OP_DATA();
ZEND_VM_C_LABEL(exit_assign_obj):
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
/* assign_obj has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -2634,7 +2634,7 @@ ZEND_VM_C_LABEL(assign_dim_error):
if (OP2_TYPE != IS_UNUSED) {
FREE_OP2();
}
FREE_OP1_VAR_PTR();
FREE_OP1();
/* assign_dim has two opcodes! */
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -2653,7 +2653,7 @@ ZEND_VM_HANDLER(22, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), value);
}
FREE_OP1_VAR_PTR();
FREE_OP1();
/* zend_assign_to_variable() always takes care of op2, never free it! */
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@ -2688,8 +2688,8 @@ ZEND_VM_HANDLER(30, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
FREE_OP2_VAR_PTR();
FREE_OP1_VAR_PTR();
FREE_OP2();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -2723,9 +2723,9 @@ ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CA
zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
FREE_OP1_VAR_PTR();
FREE_OP1();
FREE_OP2();
FREE_OP_DATA_VAR_PTR();
FREE_OP_DATA();
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -2760,7 +2760,7 @@ ZEND_VM_HANDLER(33, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC)
ZVAL_COPY(EX_VAR(opline->result.var), prop);
}
FREE_OP_DATA_VAR_PTR();
FREE_OP_DATA();
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -4374,7 +4374,7 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
if (return_value) {
ZVAL_NEW_REF(return_value, retval_ptr);
} else {
FREE_OP1_VAR_PTR();
FREE_OP1();
}
break;
}
@ -4389,7 +4389,7 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC,
ZVAL_REF(return_value, Z_REF_P(retval_ptr));
}
FREE_OP1_VAR_PTR();
FREE_OP1();
} while (0);
ZEND_OBSERVER_FCALL_END(execute_data, return_value);
@ -4854,7 +4854,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, CONST|UNUSED|NUM)
}
ZVAL_REF(arg, Z_REF_P(varptr));
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE();
}
@ -4891,7 +4891,7 @@ ZEND_VM_C_LABEL(send_var_by_ref):
}
ZVAL_REF(arg, Z_REF_P(varptr));
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE();
}
@ -4984,7 +4984,7 @@ ZEND_VM_HOT_HANDLER(185, ZEND_SEND_FUNC_ARG, VAR, CONST|UNUSED|NUM)
}
ZVAL_REF(arg, Z_REF_P(varptr));
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE();
}
@ -5910,7 +5910,7 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE
} else {
ZVAL_MAKE_REF_EX(expr_ptr, 2);
}
FREE_OP1_VAR_PTR();
FREE_OP1();
} else {
expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
if (OP1_TYPE == IS_TMP_VAR) {
@ -6496,7 +6496,7 @@ ZEND_VM_C_LABEL(num_index_dim):
} while (0);
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -6541,7 +6541,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_S
} while (0);
FREE_OP2();
FREE_OP1_VAR_PTR();
FREE_OP1();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
@ -6650,9 +6650,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
if (OP1_TYPE == IS_VAR) {
FREE_OP1_VAR_PTR();
}
FREE_OP1_IF_VAR();
ZEND_VM_NEXT_OPCODE();
} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@ -6679,21 +6677,16 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
properties = Z_OBJPROP_P(array_ptr);
if (zend_hash_num_elements(properties) == 0) {
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
FREE_OP1_VAR_PTR();
FREE_OP1_IF_VAR();
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
FREE_OP1_VAR_PTR();
FREE_OP1_IF_VAR();
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (OP1_TYPE == IS_VAR) {
FREE_OP1_VAR_PTR();
} else {
FREE_OP1();
}
FREE_OP1();
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
@ -6706,11 +6699,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
ZVAL_UNDEF(EX_VAR(opline->result.var));
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
if (OP1_TYPE == IS_VAR) {
FREE_OP1_VAR_PTR();
} else {
FREE_OP1();
}
FREE_OP1();
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
}
@ -8033,7 +8022,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMPVAR|CV|UNUSED
ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
} while (0);
FREE_OP1_VAR_PTR();
FREE_OP1();
}
} else {
zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);

View File

@ -1076,7 +1076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HA
ZVAL_COPY(EX_VAR(opline->result.var), prop);
}
if ((opline+1)->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));};
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -4425,7 +4425,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE
if (return_value) {
ZVAL_NEW_REF(return_value, retval_ptr);
} else {
if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));};
FREE_OP(opline->op1_type, opline->op1.var);
}
break;
}
@ -4440,7 +4440,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE
ZVAL_REF(return_value, Z_REF_P(retval_ptr));
}
if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));};
FREE_OP(opline->op1_type, opline->op1.var);
} while (0);
zend_observer_fcall_end(execute_data, return_value);
@ -5068,9 +5068,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
if (IS_CONST == IS_VAR) {
}
ZEND_VM_NEXT_OPCODE();
} else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@ -5107,11 +5104,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
} else {
bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CONST == IS_VAR) {
} else {
}
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
@ -5124,11 +5116,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
ZVAL_UNDEF(EX_VAR(opline->result.var));
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
if (IS_CONST == IS_VAR) {
} else {
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
}
@ -18938,7 +18926,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER
if (return_value) {
ZVAL_NEW_REF(return_value, retval_ptr);
} else {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
break;
}
@ -18953,6 +18941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER
ZVAL_REF(return_value, Z_REF_P(retval_ptr));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} while (0);
@ -19221,9 +19210,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
if (IS_TMP_VAR == IS_VAR) {
}
ZEND_VM_NEXT_OPCODE();
} else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@ -19259,12 +19245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_VAR) {
} else {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
@ -19277,11 +19258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
ZVAL_UNDEF(EX_VAR(opline->result.var));
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
if (IS_TMP_VAR == IS_VAR) {
} else {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
}
@ -19645,7 +19622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON
} else {
ZVAL_MAKE_REF_EX(expr_ptr, 2);
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
@ -19805,6 +19782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z
ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
} while (0);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
} else {
zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@ -20084,7 +20062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP
} else {
ZVAL_MAKE_REF_EX(expr_ptr, 2);
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
@ -20244,6 +20222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMPVAR_HANDLER(
ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
} while (0);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
} else {
zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@ -20544,7 +20523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNU
} else {
ZVAL_MAKE_REF_EX(expr_ptr, 2);
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
@ -20704,6 +20683,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(
ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
} while (0);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
} else {
zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@ -20943,7 +20923,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_
} else {
ZVAL_MAKE_REF_EX(expr_ptr, 2);
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
if (IS_TMP_VAR == IS_TMP_VAR) {
@ -21103,6 +21083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND
ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
} while (0);
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
} else {
zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@ -21840,9 +21821,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
if (IS_VAR == IS_VAR) {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
ZEND_VM_NEXT_OPCODE();
} else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@ -21878,12 +21857,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
} else {
bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_VAR == IS_VAR) {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} else {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
@ -21896,11 +21870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
ZVAL_UNDEF(EX_VAR(opline->result.var));
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
if (IS_VAR == IS_VAR) {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
} else {
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
}
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
}
@ -23898,7 +23868,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -26416,7 +26386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -30414,7 +30384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -32283,7 +32253,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON
}
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -34145,7 +34115,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP
}
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -36624,7 +36594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_
}
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -38320,9 +38290,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
}
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
if (IS_CV == IS_VAR) {
}
ZEND_VM_NEXT_OPCODE();
} else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@ -38359,11 +38326,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
} else {
bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
if (IS_CV == IS_VAR) {
} else {
}
if (UNEXPECTED(EG(exception))) {
HANDLE_EXCEPTION();
} else if (is_empty) {
@ -38376,11 +38338,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
ZVAL_UNDEF(EX_VAR(opline->result.var));
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
if (IS_CV == IS_VAR) {
} else {
}
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
}
}
@ -41285,7 +41243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O
}
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -44885,7 +44843,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_
}
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}
@ -50000,7 +49958,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D
}
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
ZEND_VM_NEXT_OPCODE_EX(1, 2);
}

View File

@ -472,28 +472,6 @@ $op2_free_op_if_var = array(
"TMPVARCV" => "???",
);
$op1_free_op_var_ptr = array(
"ANY" => "if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));}",
"TMP" => "",
"VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
$op2_free_op_var_ptr = array(
"ANY" => "if (opline->op2_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));}",
"TMP" => "",
"VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
$op_data_type = array(
"ANY" => "(opline+1)->op1_type",
"TMP" => "IS_TMP_VAR",
@ -549,17 +527,6 @@ $op_data_free_op = array(
"TMPVARCV" => "???",
);
$op_data_free_op_var_ptr = array(
"ANY" => "if ((opline+1)->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));}",
"TMP" => "",
"VAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
"TMPVAR" => "???",
"TMPVARCV" => "???",
);
$list = array(); // list of opcode handlers and helpers in original order
$opcodes = array(); // opcode handlers by code
$helpers = array(); // opcode helpers by name
@ -719,10 +686,10 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
$op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr,
$op1_get_obj_zval_ptr_ptr_undef, $op2_get_obj_zval_ptr_ptr_undef,
$op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var,
$op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix,
$prefix,
$op_data_type, $op_data_get_zval_ptr,
$op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr,
$op_data_free_op, $op_data_free_op_var_ptr;
$op_data_free_op;
// Specializing
$specialized_replacements = array(
@ -752,8 +719,6 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
"/FREE_OP2\(\)/" => $op2_free_op[$op2],
"/FREE_OP1_IF_VAR\(\)/" => $op1_free_op_if_var[$op1],
"/FREE_OP2_IF_VAR\(\)/" => $op2_free_op_if_var[$op2],
"/FREE_OP1_VAR_PTR\(\)/" => $op1_free_op_var_ptr[$op1],
"/FREE_OP2_VAR_PTR\(\)/" => $op2_free_op_var_ptr[$op2],
"/\!ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"0":"1",
"/ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"1":"0",
"/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m" => "\\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""),
@ -767,7 +732,6 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
"/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/FREE_OP_DATA\(\)/" => $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/FREE_OP_DATA_VAR_PTR\(\)/" => $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"],
"/RETURN_VALUE_USED\(opline\)/" => isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)",
"/arg_num <= MAX_ARG_FLAG_NUM/" => isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM",
"/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/" => isset($extra_spec['SMART_BRANCH']) ?