From 0cad725886dc620632f3aa413c1e944411465cd0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 1 Apr 2015 15:54:03 +0300 Subject: [PATCH] Convert fatal errors into EngineExceptions --- Zend/tests/exception_016.phpt | 16 + Zend/zend_execute.c | 25 +- Zend/zend_vm_def.h | 88 ++++ Zend/zend_vm_execute.h | 890 ++++++++++++++++++++++++++++++++++ 4 files changed, 1000 insertions(+), 19 deletions(-) create mode 100644 Zend/tests/exception_016.phpt diff --git a/Zend/tests/exception_016.phpt b/Zend/tests/exception_016.phpt new file mode 100644 index 0000000000..ffa0a45b84 --- /dev/null +++ b/Zend/tests/exception_016.phpt @@ -0,0 +1,16 @@ +--TEST-- +Exceptions on improper usage of $this +--FILE-- +foo(); +} catch (EngineException $e) { + echo "\nException: " . $e->getMessage() . " in " , $e->getFile() . " on line " . $e->getLine() . "\n"; +} + +$this->foo(); +?> +--EXPECTF-- +Exception: Using $this when not in object context in %sexception_016.php on line %d + +Fatal error: Using $this when not in object context in %sexception_016.php on line %d diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 6c0d707c74..06c25c7bc1 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -502,24 +502,15 @@ static inline zval *_get_zval_ptr_ptr(int op_type, znode_op node, const zend_exe } static zend_always_inline zval *_get_obj_zval_ptr_unused(zend_execute_data *execute_data) -{ - if (EXPECTED(Z_OBJ(EX(This)) != NULL)) { - return &EX(This); - } else { - zend_error_noreturn(E_ERROR, "Using $this when not in object context"); - return NULL; - } +{ + return &EX(This); } static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_execute_data *execute_data, zend_free_op *should_free, int type) { if (op_type == IS_UNUSED) { - if (EXPECTED(Z_OBJ(EX(This)) != NULL)) { - *should_free = NULL; - return &EX(This); - } else { - zend_error_noreturn(E_ERROR, "Using $this when not in object context"); - } + *should_free = NULL; + return &EX(This); } return get_zval_ptr(op_type, op, execute_data, should_free, type); } @@ -527,12 +518,8 @@ static inline zval *_get_obj_zval_ptr(int op_type, znode_op op, zend_execute_dat static inline zval *_get_obj_zval_ptr_ptr(int op_type, znode_op node, zend_execute_data *execute_data, zend_free_op *should_free, int type) { if (op_type == IS_UNUSED) { - if (EXPECTED(Z_OBJ(EX(This)) != NULL)) { - *should_free = NULL; - return &EX(This); - } else { - zend_error_noreturn(E_ERROR, "Using $this when not in object context"); - } + *should_free = NULL; + return &EX(This); } return get_zval_ptr_ptr(op_type, node, execute_data, should_free, type); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 350833655f..6a0f3d2b24 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -632,6 +632,12 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR| SAVE_OPLINE(); object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); property = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -719,6 +725,12 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMPVAR| SAVE_OPLINE(); container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + FREE_UNFETCHED_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -1053,6 +1065,11 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C property = GET_OP2_ZVAL_PTR(BP_VAR_R); retval = EX_VAR(opline->result.var); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); FREE_OP2(); @@ -1151,6 +1168,11 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR| property = GET_OP2_ZVAL_PTR(BP_VAR_R); retval = EX_VAR(opline->result.var); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); FREE_OP2(); @@ -1774,6 +1796,11 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|CV) container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R); offset = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -1839,6 +1866,11 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_OP2(); @@ -1867,6 +1899,11 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_OP2(); @@ -1895,6 +1932,11 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS); offset = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -1963,6 +2005,11 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|CV, CONST|TMPV property = GET_OP2_ZVAL_PTR(BP_VAR_R); container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); FREE_OP2(); @@ -1998,6 +2045,11 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|CV, CONST|TMPVAR|CV) container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET); property = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_OP2(); @@ -2061,6 +2113,11 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); property_name = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_OP2(); @@ -2782,6 +2839,12 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) object = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } + if (OP1_TYPE != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -4739,6 +4802,11 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY) SAVE_OPLINE(); obj = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + HANDLE_EXCEPTION(); + } + do { if (OP1_TYPE == IS_CONST || (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { @@ -5343,6 +5411,11 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMPVAR|CV) SAVE_OPLINE(); container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); FREE_UNFETCHED_OP2(); @@ -5427,6 +5500,11 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) SAVE_OPLINE(); container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); FREE_UNFETCHED_OP2(); @@ -6186,6 +6264,11 @@ ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMPVAR|UNUSED|CV, CONST|T container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS); offset = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } ZEND_VM_C_LABEL(isset_dim_obj_again): if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -6303,6 +6386,11 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|CV, CONST| container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS); offset = GET_OP2_ZVAL_PTR(BP_VAR_R); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_OP2(); + HANDLE_EXCEPTION(); + } if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 77c2002cb4..b98c14735b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3131,6 +3131,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_ SAVE_OPLINE(); obj = EX_CONSTANT(opline->op1); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + HANDLE_EXCEPTION(); + } + do { if (IS_CONST == IS_CONST || (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { @@ -4746,6 +4751,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H container = EX_CONSTANT(opline->op1); offset = EX_CONSTANT(opline->op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -4811,6 +4821,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_ container = EX_CONSTANT(opline->op1); offset = EX_CONSTANT(opline->op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -4878,6 +4893,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ property = EX_CONSTANT(opline->op2); container = NULL; + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -5642,6 +5662,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON container = EX_CONSTANT(opline->op1); offset = EX_CONSTANT(opline->op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -5758,6 +5783,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO container = EX_CONSTANT(opline->op1); offset = EX_CONSTANT(opline->op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -8184,6 +8214,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -8249,6 +8284,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HAN container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -8316,6 +8356,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = NULL; + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -8813,6 +8858,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -8929,6 +8979,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -9726,6 +9781,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -9792,6 +9852,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -9860,6 +9925,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = NULL; + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); zval_ptr_dtor_nogc(free_op2); @@ -10307,6 +10377,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -10424,6 +10499,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO container = EX_CONSTANT(opline->op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -11289,6 +11369,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); offset = EX_CONSTANT(opline->op2); + if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -11356,6 +11441,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO property = EX_CONSTANT(opline->op2); container = NULL; + if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -12478,6 +12568,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -12545,6 +12640,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = NULL; + if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -12945,6 +13045,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -13013,6 +13118,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = NULL; + if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); zval_ptr_dtor_nogc(free_op2); @@ -14727,6 +14837,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property = EX_CONSTANT(opline->op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -14814,6 +14930,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -15146,6 +15268,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = EX_CONSTANT(opline->op2); retval = EX_VAR(opline->result.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -15243,6 +15370,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = EX_CONSTANT(opline->op2); retval = EX_VAR(opline->result.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -15446,6 +15578,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = EX_CONSTANT(opline->op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -15510,6 +15647,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN property = EX_CONSTANT(opline->op2); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -15538,6 +15680,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA property = EX_CONSTANT(opline->op2); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -15568,6 +15715,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO property = EX_CONSTANT(opline->op2); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -15603,6 +15755,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property = EX_CONSTANT(opline->op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -15630,6 +15787,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HAND object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property_name = EX_CONSTANT(opline->op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); @@ -16145,6 +16307,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDL SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -16229,6 +16396,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -16882,6 +17054,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -17860,6 +18038,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -17947,6 +18131,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -18279,6 +18469,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); retval = EX_VAR(opline->result.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -18376,6 +18571,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); retval = EX_VAR(opline->result.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -18579,6 +18779,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -18643,6 +18848,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -18671,6 +18881,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -18701,6 +18916,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -18736,6 +18956,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -18763,6 +18988,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); @@ -19240,6 +19470,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER( SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -19324,6 +19559,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -19511,6 +19751,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -19598,6 +19844,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -19932,6 +20184,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); retval = EX_VAR(opline->result.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); zval_ptr_dtor_nogc(free_op2); @@ -20030,6 +20287,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); retval = EX_VAR(opline->result.var); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); zval_ptr_dtor_nogc(free_op2); @@ -20234,6 +20496,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -20299,6 +20566,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -20327,6 +20599,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -20357,6 +20634,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); zval_ptr_dtor_nogc(free_op2); @@ -20392,6 +20674,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -20419,6 +20706,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_HAN object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); zval_ptr_dtor_nogc(free_op2); @@ -20801,6 +21093,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HAND SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -20885,6 +21182,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -20934,6 +21236,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND SAVE_OPLINE(); obj = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + HANDLE_EXCEPTION(); + } + do { if (IS_UNUSED == IS_CONST || (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { @@ -21039,6 +21346,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); property = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -21126,6 +21439,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -21420,6 +21739,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = EX_CONSTANT(opline->op2); retval = EX_VAR(opline->result.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -21517,6 +21841,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = EX_CONSTANT(opline->op2); retval = EX_VAR(opline->result.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -21603,6 +21932,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ container = _get_obj_zval_ptr_unused(execute_data); offset = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -21667,6 +22001,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ property = EX_CONSTANT(opline->op2); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -21695,6 +22034,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST property = EX_CONSTANT(opline->op2); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -21723,6 +22067,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST container = _get_obj_zval_ptr_unused(execute_data); offset = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -21790,6 +22139,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED property = EX_CONSTANT(opline->op2); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -21825,6 +22179,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO container = _get_obj_zval_ptr_unused(execute_data); property = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -21852,6 +22211,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_H object = _get_obj_zval_ptr_unused(execute_data); property_name = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); @@ -21924,6 +22288,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C object = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } + if (IS_UNUSED != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -22125,6 +22495,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HA SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -22209,6 +22584,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -22253,6 +22633,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNU container = _get_obj_zval_ptr_unused(execute_data); offset = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -22369,6 +22754,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN container = _get_obj_zval_ptr_unused(execute_data); offset = EX_CONSTANT(opline->op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -22819,6 +23209,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -23329,6 +23725,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -23416,6 +23818,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -23710,6 +24118,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); retval = EX_VAR(opline->result.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -23807,6 +24220,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); retval = EX_VAR(opline->result.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -23893,6 +24311,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -23957,6 +24380,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -23985,6 +24413,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -24013,6 +24446,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -24080,6 +24518,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -24115,6 +24558,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV container = _get_obj_zval_ptr_unused(execute_data); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -24142,6 +24590,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HAND object = _get_obj_zval_ptr_unused(execute_data); property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); @@ -24214,6 +24667,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C object = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } + if (IS_UNUSED != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -24314,6 +24773,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDL SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -24398,6 +24862,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -24442,6 +24911,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNU container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -24558,6 +25032,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -24735,6 +25214,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_obj_zval_ptr_unused(execute_data); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -24822,6 +25307,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -25117,6 +25608,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); retval = EX_VAR(opline->result.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); zval_ptr_dtor_nogc(free_op2); @@ -25215,6 +25711,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); retval = EX_VAR(opline->result.var); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); zval_ptr_dtor_nogc(free_op2); @@ -25302,6 +25803,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -25367,6 +25873,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -25395,6 +25906,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -25423,6 +25939,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -25491,6 +26012,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); zval_ptr_dtor_nogc(free_op2); @@ -25526,6 +26052,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM container = _get_obj_zval_ptr_unused(execute_data); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -25553,6 +26084,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ object = _get_obj_zval_ptr_unused(execute_data); property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); zval_ptr_dtor_nogc(free_op2); @@ -25625,6 +26161,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T object = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } + if (IS_UNUSED != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -25726,6 +26268,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMPVAR_H SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -25810,6 +26357,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(execute_data); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -25855,6 +26407,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNU container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -25972,6 +26529,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN container = _get_obj_zval_ptr_unused(execute_data); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -26807,6 +27369,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC SAVE_OPLINE(); obj = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + HANDLE_EXCEPTION(); + } + do { if (IS_CV == IS_CONST || (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { @@ -28149,6 +28716,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); property = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -28236,6 +28809,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -28568,6 +29147,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = EX_CONSTANT(opline->op2); retval = EX_VAR(opline->result.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -28665,6 +29249,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = EX_CONSTANT(opline->op2); retval = EX_VAR(opline->result.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -29079,6 +29668,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); offset = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -29143,6 +29737,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND property = EX_CONSTANT(opline->op2); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -29171,6 +29770,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN property = EX_CONSTANT(opline->op2); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -29199,6 +29803,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -29266,6 +29875,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON property = EX_CONSTANT(opline->op2); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -29301,6 +29915,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); property = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -29364,6 +29983,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDL object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); property_name = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); @@ -29590,6 +30214,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST object = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } + if (IS_CV != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -29923,6 +30553,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLE SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -30007,6 +30642,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -30153,6 +30793,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_ container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -30269,6 +30914,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = EX_CONSTANT(opline->op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -31433,6 +32083,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -33158,6 +33814,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -33245,6 +33907,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -33577,6 +34245,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); retval = EX_VAR(opline->result.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -33674,6 +34347,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); retval = EX_VAR(opline->result.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); @@ -33907,6 +34585,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -33971,6 +34654,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -33999,6 +34687,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -34027,6 +34720,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -34094,6 +34792,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); @@ -34129,6 +34832,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); @@ -34156,6 +34864,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER( object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); @@ -34444,6 +35157,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA object = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } + if (IS_CV != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -34698,6 +35417,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(Z SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -34782,6 +35506,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); @@ -34826,6 +35555,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_ container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -34942,6 +35676,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -35670,6 +36409,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP SAVE_OPLINE(); object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -35757,6 +36502,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); @@ -36091,6 +36842,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); retval = EX_VAR(opline->result.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); zval_ptr_dtor_nogc(free_op2); @@ -36189,6 +36945,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); retval = EX_VAR(opline->result.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets"); zval_ptr_dtor_nogc(free_op2); @@ -36423,6 +37184,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -36488,6 +37254,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -36516,6 +37287,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -36544,6 +37320,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -36612,6 +37393,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context"); zval_ptr_dtor_nogc(free_op2); @@ -36647,6 +37433,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object"); zval_ptr_dtor_nogc(free_op2); @@ -36674,6 +37465,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_HAND object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array"); zval_ptr_dtor_nogc(free_op2); @@ -36868,6 +37664,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA object = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } + if (IS_CV != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -37123,6 +37925,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDL SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -37207,6 +38014,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + HANDLE_EXCEPTION(); + } if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -37252,6 +38064,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_ container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -37369,6 +38186,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -37712,6 +38534,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND SAVE_OPLINE(); obj = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + HANDLE_EXCEPTION(); + } + do { if ((IS_TMP_VAR|IS_VAR) == IS_CONST || ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) { @@ -38726,6 +39553,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = EX_CONSTANT(opline->op2); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -38886,6 +39718,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -39204,6 +40042,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = EX_CONSTANT(opline->op2); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -39320,6 +40163,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = EX_CONSTANT(opline->op2); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -40749,6 +41597,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -40873,6 +41726,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -41009,6 +41868,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -41125,6 +41989,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + + HANDLE_EXCEPTION(); + } if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -41740,6 +42609,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -41865,6 +42739,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { ZVAL_DEREF(object); if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { @@ -42002,6 +42882,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } isset_dim_obj_again: if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { HashTable *ht = Z_ARRVAL_P(container); @@ -42119,6 +43004,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) { + zend_error(E_EXCEPTION | E_ERROR, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) { container = Z_REFVAL_P(container); -- 2.40.0