Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
- index a2df1ef..5205360 100644
- --- a/Zend/zend_execute.c
- +++ b/Zend/zend_execute.c
- @@ -1369,6 +1369,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object,
- z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
- if (UNEXPECTED(EG(exception))) {
- OBJ_RELEASE(Z_OBJ(obj));
- + ZVAL_UNDEF(result);
- return;
- }
- @@ -1414,6 +1415,9 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object,
- zptr = z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
- if (UNEXPECTED(EG(exception))) {
- OBJ_RELEASE(Z_OBJ(obj));
- + if (result) {
- + ZVAL_UNDEF(result);
- + }
- return;
- }
- @@ -1459,6 +1463,9 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z
- z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
- if (UNEXPECTED(EG(exception))) {
- OBJ_RELEASE(Z_OBJ(obj));
- + if (result) {
- + ZVAL_UNDEF(result);
- + }
- return;
- }
- if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
- @@ -3024,6 +3031,11 @@ ZEND_API int ZEND_FASTCALL zend_do_fcall_overloaded(zend_execute_data *call, zva
- #define GET_OP2_UNDEF_CV(ptr, type) \
- _get_zval_cv_lookup_ ## type(ptr, opline->op2.var, execute_data)
- +#define ZEND_VM_UNDEF_RETVAL() \
- + if (opline->result_type & (IS_VAR | IS_TMP_VAR)) { \
- + ZVAL_UNDEF(EX_VAR(opline->result.var)); \
- + }
- +
- #include "zend_vm_execute.h"
- ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler)
- diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
- index 2d6df66..d3acc4e 100644
- --- a/Zend/zend_operators.c
- +++ b/Zend/zend_operators.c
- @@ -936,6 +936,9 @@ ZEND_API int ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2) /* {
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- converted = 1;
- } else {
- + if (result != op1) {
- + ZVAL_UNDEF(result);
- + }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
- }
- @@ -978,6 +981,9 @@ ZEND_API int ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2) /* {
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- converted = 1;
- } else {
- + if (result != op1) {
- + ZVAL_UNDEF(result);
- + }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
- }
- @@ -1025,6 +1031,9 @@ ZEND_API int ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *op2) /* {
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- converted = 1;
- } else {
- + if (result != op1) {
- + ZVAL_UNDEF(result);
- + }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
- }
- @@ -1113,6 +1122,9 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* {
- }
- converted = 1;
- } else {
- + if (result != op1) {
- + ZVAL_UNDEF(result);
- + }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE;
- }
- @@ -1178,6 +1190,9 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* {
- zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
- converted = 1;
- } else {
- + if (result != op1) {
- + ZVAL_UNDEF(result);
- + }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
- }
- @@ -1330,6 +1345,9 @@ try_again:
- default:
- ZEND_TRY_UNARY_OBJECT_OPERATION(ZEND_BW_NOT);
- + if (result != op1) {
- + ZVAL_UNDEF(result);
- + }
- zend_throw_error(NULL, "Unsupported operand types");
- return FAILURE;
- }
- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
- index 6f2592b..2ebef3d 100644
- --- a/Zend/zend_vm_def.h
- +++ b/Zend/zend_vm_def.h
- @@ -893,6 +893,9 @@ ZEND_VM_C_LABEL(assign_dim_op_convert_to_array):
- zend_check_string_offset(dim, BP_VAR_RW);
- zend_wrong_string_offset();
- }
- + if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- + ZVAL_UNDEF(EX_VAR(opline->result.var));
- + }
- } else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
- ZEND_VM_C_GOTO(assign_dim_op_convert_to_array);
- } else {
- @@ -1406,9 +1409,11 @@ ZEND_VM_C_LABEL(fetch_this):
- break;
- case BP_VAR_RW:
- case BP_VAR_W:
- + ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot re-assign $this");
- break;
- case BP_VAR_UNSET:
- + ZVAL_UNDEF(result);
- zend_throw_error(NULL, "Cannot unset $this");
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- @@ -2213,7 +2218,7 @@ ZEND_VM_C_LABEL(fast_assign_obj):
- Z_OBJ_HT_P(object)->write_property(object, property_name, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL);
- - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
- + if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- FREE_OP_DATA();
- @@ -2275,7 +2280,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
- zend_assign_to_object_dim(object_ptr, dim, value);
- - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) {
- + if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
- }
- @@ -2427,11 +2432,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
- execute_data = EX(prev_execute_data);
- if (UNEXPECTED(EG(exception) != NULL)) {
- - const zend_op *old_opline = EX(opline);
- zend_throw_exception_internal(NULL);
- - if (RETURN_VALUE_USED(old_opline)) {
- - zval_ptr_dtor(EX_VAR(old_opline->result.var));
- - }
- HANDLE_EXCEPTION_LEAVE();
- }
- @@ -2465,11 +2466,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
- zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
- if (UNEXPECTED(EG(exception) != NULL)) {
- - const zend_op *old_opline = EX(opline);
- zend_throw_exception_internal(NULL);
- - if (RETURN_VALUE_USED(old_opline)) {
- - zval_ptr_dtor(EX_VAR(old_opline->result.var));
- - }
- HANDLE_EXCEPTION_LEAVE();
- }
- @@ -3790,12 +3787,6 @@ ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED)
- retval_ptr = retval_ref;
- }
- zend_verify_return_type(EX(func), retval_ptr, CACHE_ADDR(opline->op2.num));
- -
- - if (UNEXPECTED(EG(exception) != NULL)) {
- - if (OP1_TYPE == IS_CONST) {
- - zval_ptr_dtor_nogc(retval_ptr);
- - }
- - }
- #endif
- }
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- @@ -4867,7 +4858,6 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
- USE_OPLINE
- zend_free_op free_op1;
- zval *obj;
- - zend_object *clone_obj;
- zend_class_entry *ce, *scope;
- zend_function *clone;
- zend_object_clone_obj_t clone_call;
- @@ -4932,12 +4922,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
- }
- }
- - clone_obj = clone_call(obj);
- - if (EXPECTED(EG(exception) == NULL)) {
- - ZVAL_OBJ(EX_VAR(opline->result.var), clone_obj);
- - } else {
- - OBJ_RELEASE(clone_obj);
- - }
- + ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj));
- FREE_OP1();
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- @@ -5674,10 +5659,14 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
- Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
- FREE_OP1();
- - if (is_empty) {
- - ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- + if (UNEXPECTED(EG(exception))) {
- + OBJ_RELEASE(&iter->std);
- + HANDLE_EXCEPTION();
- + } else if (is_empty) {
- + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- + ZEND_VM_CONTINUE();
- } else {
- - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- + ZEND_VM_NEXT_OPCODE();
- }
- }
- } else {
- @@ -5842,10 +5831,14 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
- } else {
- FREE_OP1();
- }
- - if (is_empty) {
- - ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
- + if (UNEXPECTED(EG(exception))) {
- + OBJ_RELEASE(&iter->std);
- + HANDLE_EXCEPTION();
- + } else if (is_empty) {
- + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op2));
- + ZEND_VM_CONTINUE();
- } else {
- - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- + ZEND_VM_NEXT_OPCODE();
- }
- }
- } else {
- @@ -7065,7 +7063,8 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
- ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
- {
- - uint32_t throw_op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes;
- + const zend_op *throw_op = EG(opline_before_exception);
- + uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
- int i, current_try_catch_offset = -1;
- {
- @@ -7094,6 +7093,27 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
- cleanup_unfinished_calls(execute_data, throw_op_num);
- + if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
- + switch (throw_op->opcode) {
- + case ZEND_ADD_ARRAY_ELEMENT:
- + case ZEND_ROPE_ADD:
- + break; /* exception while building structures, live range handling will free those */
- +
- + case ZEND_FETCH_CLASS:
- + case ZEND_DECLARE_CLASS:
- + case ZEND_DECLARE_INHERITED_CLASS:
- + case ZEND_DECLARE_ANON_CLASS:
- + case ZEND_DECLARE_ANON_INHERITED_CLASS:
- + break; /* return value is zend_class_entry pointer */
- +
- + case ZEND_JMP_SET:
- + break; /* takes care of handling itself */
- +
- + default:
- + zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
- + }
- + }
- +
- ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, current_try_catch_offset, op_num, throw_op_num);
- }
- @@ -7857,9 +7877,6 @@ ZEND_VM_C_LABEL(call_trampoline_end):
- if (UNEXPECTED(EG(exception) != NULL)) {
- zend_throw_exception_internal(NULL);
- - if (RETURN_VALUE_USED(opline)) {
- - zval_ptr_dtor(EX_VAR(opline->result.var));
- - }
- HANDLE_EXCEPTION_LEAVE();
- }
- diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
- index d5115c8..2fe96fa 100644
- --- a/Zend/zend_vm_gen.php
- +++ b/Zend/zend_vm_gen.php
- @@ -1612,7 +1612,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
- out($f,"#endif\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- - out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- + out($f,"#define HANDLE_EXCEPTION() ZEND_VM_UNDEF_RETVAL(); LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
- out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG)\n");
- out($f,"# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_INTERRUPT_CHECK(); ZEND_VM_CONTINUE()\n");
- @@ -1651,7 +1651,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
- out($f,"#define SAVE_OPLINE() EX(opline) = opline\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- - out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- + out($f,"#define HANDLE_EXCEPTION() ZEND_VM_UNDEF_RETVAL(); LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
- out($f,"#define ZEND_VM_CONTINUE() goto zend_vm_continue\n");
- out($f,"#define ZEND_VM_RETURN() return\n");
- @@ -1683,10 +1683,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- if (ZEND_VM_SPEC) {
- - out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_SPEC_HANDLER\n");
- + out($f,"#define HANDLE_EXCEPTION() ZEND_VM_UNDEF_RETVAL(); goto ZEND_HANDLE_EXCEPTION_SPEC_HANDLER\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_SPEC_HANDLER\n");
- } else {
- - out($f,"#define HANDLE_EXCEPTION() goto ZEND_HANDLE_EXCEPTION_HANDLER\n");
- + out($f,"#define HANDLE_EXCEPTION() ZEND_VM_UNDEF_RETVAL(); goto ZEND_HANDLE_EXCEPTION_HANDLER\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() goto ZEND_HANDLE_EXCEPTION_HANDLER\n");
- }
- out($f,"#define ZEND_VM_CONTINUE() goto *(void**)(OPLINE->handler)\n");
- @@ -2451,7 +2451,7 @@ function gen_vm($def, $skel) {
- out($f,"#define SAVE_OPLINE()\n");
- out($f,"#undef HANDLE_EXCEPTION\n");
- out($f,"#undef HANDLE_EXCEPTION_LEAVE\n");
- - out($f,"#define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- + out($f,"#define HANDLE_EXCEPTION() ZEND_VM_UNDEF_RETVAL(); LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
- out($f,"#define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()\n");
- out($f,"#undef ZEND_VM_CONTINUE\n");
- out($f,"#undef ZEND_VM_RETURN\n");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement