EX(call) = call->prev_execute_data;
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
- zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", fbc->common.scope->name->val, fbc->common.function_name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call abstract method %s::%s()", fbc->common.scope->name->val, fbc->common.function_name->val);
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
for (i = 0; i < num_args; ++i) {
zend_verify_internal_arg_type(fbc, i + 1, p);
- p++;
- }
- if (UNEXPECTED(EG(exception) != NULL)) {
- EG(current_execute_data) = call->prev_execute_data;
- zend_vm_stack_free_args(call);
- zend_vm_stack_free_call_frame(call);
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- }
- if (UNEXPECTED(should_change_scope)) {
- goto fcall_end_change_scope;
- } else {
- goto fcall_end;
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ EG(current_execute_data) = call->prev_execute_data;
+ zend_vm_stack_free_args(call);
+ zend_vm_stack_free_call_frame(call);
+ if (RETURN_VALUE_USED(opline)) {
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ }
+ if (UNEXPECTED(should_change_scope)) {
+ goto fcall_end_change_scope;
+ } else {
+ goto fcall_end;
+ }
}
+ p++;
}
}
object->handlers->call_method(fbc->common.function_name, object, call, EX_VAR(opline->result.var));
EG(current_execute_data) = call->prev_execute_data;
} else {
- zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call overloaded function for non-object");
+ HANDLE_EXCEPTION();
}
zend_vm_stack_free_args(call);
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, name, arg) {
if (name) {
- zend_error(E_RECOVERABLE_ERROR, "Cannot unpack array with string keys");
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Cannot unpack array with string keys");
FREE_OP(free_op1);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ HANDLE_EXCEPTION();
}
top = ZEND_CALL_ARG(EX(call), arg_num);
}
if (Z_TYPE(key) == IS_STRING) {
- zend_error(E_RECOVERABLE_ERROR,
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR,
"Cannot unpack Traversable with string keys");
zend_string_release(Z_STR(key));
goto unpack_iter_dtor;
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Class name must be a valid object or a string");
}
CHECK_EXCEPTION();
function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
SAVE_OPLINE();
- zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
} else {
fbc = Z_FUNC_P(func);
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
lcname = zend_string_tolower(Z_STR_P(function_name));
}
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
zend_string_release(lcname);
method = zend_hash_index_find(Z_ARRVAL_P(function_name), 1);
if (!obj || !method) {
- zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ zend_error(E_EXCEPTION | E_ERROR, "Array callback has to contain indices 0 and 1");
+
+ HANDLE_EXCEPTION();
}
ZVAL_DEREF(obj);
if (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT) {
- zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
+ zend_error(E_EXCEPTION | E_ERROR, "First array member is not a valid class name or object");
+
+ HANDLE_EXCEPTION();
}
ZVAL_DEREF(method);
if (Z_TYPE_P(method) != IS_STRING) {
- zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
+ zend_error(E_EXCEPTION | E_ERROR, "Second array member is not a valid method");
+
+ HANDLE_EXCEPTION();
}
if (Z_TYPE_P(obj) == IS_STRING) {
fbc = zend_std_get_static_method(called_scope, Z_STR_P(method), NULL);
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", called_scope->name->val, Z_STRVAL_P(method));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", called_scope->name->val, Z_STRVAL_P(method));
+
+ HANDLE_EXCEPTION();
}
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
"Non-static method %s::%s() should not be called statically",
fbc->common.scope->name->val, fbc->common.function_name->val);
} else {
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically",
fbc->common.scope->name->val, fbc->common.function_name->val);
+
+ HANDLE_EXCEPTION();
}
}
} else {
fbc = Z_OBJ_HT_P(obj)->get_method(&object, Z_STR_P(method), NULL);
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", object->ce->name->val, Z_STRVAL_P(method));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", object->ce->name->val, Z_STRVAL_P(method));
+
+ HANDLE_EXCEPTION();
}
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
- ZEND_VM_CONTINUE(); /* Never reached */
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call));
func_name++;
if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(func_name))) == NULL)) {
SAVE_OPLINE();
- zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
} else {
fbc = Z_FUNC_P(func);
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(fname))) == NULL)) {
SAVE_OPLINE();
- zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(fname));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(fname));
+ HANDLE_EXCEPTION();
} else {
fbc = Z_FUNC_P(func);
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Class name must be a valid object or a string");
}
CHECK_EXCEPTION();
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Class name must be a valid object or a string");
}
CHECK_EXCEPTION();
lcname = zend_string_tolower(Z_STR_P(function_name));
}
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
zend_string_release(lcname);
method = zend_hash_index_find(Z_ARRVAL_P(function_name), 1);
if (!obj || !method) {
- zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ zend_error(E_EXCEPTION | E_ERROR, "Array callback has to contain indices 0 and 1");
+
+ HANDLE_EXCEPTION();
}
ZVAL_DEREF(obj);
if (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT) {
- zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
+ zend_error(E_EXCEPTION | E_ERROR, "First array member is not a valid class name or object");
+
+ HANDLE_EXCEPTION();
}
ZVAL_DEREF(method);
if (Z_TYPE_P(method) != IS_STRING) {
- zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
+ zend_error(E_EXCEPTION | E_ERROR, "Second array member is not a valid method");
+
+ HANDLE_EXCEPTION();
}
if (Z_TYPE_P(obj) == IS_STRING) {
fbc = zend_std_get_static_method(called_scope, Z_STR_P(method), NULL);
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", called_scope->name->val, Z_STRVAL_P(method));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", called_scope->name->val, Z_STRVAL_P(method));
+
+ HANDLE_EXCEPTION();
}
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
"Non-static method %s::%s() should not be called statically",
fbc->common.scope->name->val, fbc->common.function_name->val);
} else {
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically",
fbc->common.scope->name->val, fbc->common.function_name->val);
+
+ HANDLE_EXCEPTION();
}
}
} else {
fbc = Z_OBJ_HT_P(obj)->get_method(&object, Z_STR_P(method), NULL);
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", object->ce->name->val, Z_STRVAL_P(method));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", object->ce->name->val, Z_STRVAL_P(method));
+
+ HANDLE_EXCEPTION();
}
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
- ZEND_VM_CONTINUE(); /* Never reached */
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call));
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Class name must be a valid object or a string");
}
zval_ptr_dtor_nogc(free_op2);
lcname = zend_string_tolower(Z_STR_P(function_name));
}
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
zend_string_release(lcname);
zval_ptr_dtor_nogc(free_op2);
method = zend_hash_index_find(Z_ARRVAL_P(function_name), 1);
if (!obj || !method) {
- zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ zend_error(E_EXCEPTION | E_ERROR, "Array callback has to contain indices 0 and 1");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
ZVAL_DEREF(obj);
if (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT) {
- zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
+ zend_error(E_EXCEPTION | E_ERROR, "First array member is not a valid class name or object");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
ZVAL_DEREF(method);
if (Z_TYPE_P(method) != IS_STRING) {
- zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
+ zend_error(E_EXCEPTION | E_ERROR, "Second array member is not a valid method");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
if (Z_TYPE_P(obj) == IS_STRING) {
fbc = zend_std_get_static_method(called_scope, Z_STR_P(method), NULL);
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", called_scope->name->val, Z_STRVAL_P(method));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", called_scope->name->val, Z_STRVAL_P(method));
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
"Non-static method %s::%s() should not be called statically",
fbc->common.scope->name->val, fbc->common.function_name->val);
} else {
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically",
fbc->common.scope->name->val, fbc->common.function_name->val);
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
}
} else {
fbc = Z_OBJ_HT_P(obj)->get_method(&object, Z_STR_P(method), NULL);
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", object->ce->name->val, Z_STRVAL_P(method));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", object->ce->name->val, Z_STRVAL_P(method));
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
if ((fbc->common.fn_flags & ZEND_ACC_STATIC) != 0) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
- ZEND_VM_CONTINUE(); /* Never reached */
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call));
retval_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(retval_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot return string offsets by reference");
+
+ HANDLE_EXCEPTION();
}
if (IS_CONST == IS_VAR) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Can only throw objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Can only throw objects");
+
+ HANDLE_EXCEPTION();
}
} while (0);
SAVE_OPLINE();
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
- zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
+
+ HANDLE_EXCEPTION();
}
value = EX_CONSTANT(opline->op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
}
if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
if (ce->ce_flags & ZEND_ACC_INTERFACE) {
- zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate interface %s", ce->name->val);
} else if (ce->ce_flags & ZEND_ACC_TRAIT) {
- zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate trait %s", ce->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
}
+ HANDLE_EXCEPTION();
}
object_init_ex(&object_zval, ce);
constructor = Z_OBJ_HT(object_zval)->get_constructor(Z_OBJ(object_zval));
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "__clone method called on non-object");
+ zend_error(E_EXCEPTION | E_ERROR, "__clone method called on non-object");
+
+ HANDLE_EXCEPTION();
}
} while (0);
clone_call = Z_OBJ_HT_P(obj)->clone_obj;
if (UNEXPECTED(clone_call == NULL)) {
if (ce) {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object");
}
+
+ HANDLE_EXCEPTION();
}
if (ce && clone) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
if (UNEXPECTED(ce != EG(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+
+ HANDLE_EXCEPTION();
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+
+ HANDLE_EXCEPTION();
}
}
}
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_CONST == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+
+ HANDLE_EXCEPTION();
}
container = EX_CONSTANT(opline->op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
property = EX_CONSTANT(opline->op2);
container = NULL;
- if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
"Non-static method %s::%s() should not be called statically",
func->common.scope->name->val, func->common.function_name->val);
} else {
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically",
func->common.scope->name->val, func->common.function_name->val);
+
+ HANDLE_EXCEPTION();
}
}
} else {
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
} else {
- zend_error_noreturn(E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
}
} else {
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), c);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
} else {
- zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
}
}
constant_fetch_end:
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if (IS_CONST != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if (IS_CONST != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+
+ HANDLE_EXCEPTION();
}
container = EX_CONSTANT(opline->op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
if (IS_UNUSED == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if (IS_CONST != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
SAVE_OPLINE();
- if (UNEXPECTED((zfunc = zend_hash_find(EG(function_table), Z_STR_P(EX_CONSTANT(opline->op1)))) == NULL) ||
- UNEXPECTED(Z_FUNC_P(zfunc)->type != ZEND_USER_FUNCTION)) {
- zend_error_noreturn(E_ERROR, "Base lambda function for closure not found");
- }
+ zfunc = zend_hash_find(EG(function_table), Z_STR_P(EX_CONSTANT(opline->op1)));
+ ZEND_ASSERT(zfunc != NULL && Z_FUNC_P(zfunc)->type == ZEND_USER_FUNCTION);
closure_is_static = Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC;
closure_is_being_defined_inside_static_context = EX(func)->common.fn_flags & ZEND_ACC_STATIC;
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_CV == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+
+ HANDLE_EXCEPTION();
}
container = EX_CONSTANT(opline->op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
container = NULL;
- if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
"Non-static method %s::%s() should not be called statically",
func->common.scope->name->val, func->common.function_name->val);
} else {
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically",
func->common.scope->name->val, func->common.function_name->val);
+
+ HANDLE_EXCEPTION();
}
}
} else {
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
container = EX_CONSTANT(opline->op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
container = NULL;
- if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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);
+
+ HANDLE_EXCEPTION();
+ }
if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
"Non-static method %s::%s() should not be called statically",
func->common.scope->name->val, func->common.function_name->val);
} else {
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically",
func->common.scope->name->val, func->common.function_name->val);
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
}
} else {
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
retval_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(retval_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot return string offsets by reference");
+
+ HANDLE_EXCEPTION();
}
if (IS_TMP_VAR == IS_VAR) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Can only throw objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Can only throw objects");
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
} while (0);
SAVE_OPLINE();
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
- zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_CONST == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
property = EX_CONSTANT(opline->op2);
container = NULL;
- if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_CV == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
container = NULL;
- if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
container = NULL;
- if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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);
+
+ HANDLE_EXCEPTION();
+ }
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
zval_ptr_dtor_nogc(free_op2);
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
retval_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(retval_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot return string offsets by reference");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Can only throw objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Can only throw objects");
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
} while (0);
varptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(varptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Only variables can be passed by reference");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
}
if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
if (ce->ce_flags & ZEND_ACC_INTERFACE) {
- zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate interface %s", ce->name->val);
} else if (ce->ce_flags & ZEND_ACC_TRAIT) {
- zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate trait %s", ce->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
}
+ HANDLE_EXCEPTION();
}
object_init_ex(&object_zval, ce);
constructor = Z_OBJ_HT(object_zval)->get_constructor(Z_OBJ(object_zval));
zval *zptr;
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
dim = EX_CONSTANT(opline->op2);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
} else {
if (IS_CONST == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
property = EX_CONSTANT(opline->op2);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
- if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
+ }
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
property = EX_CONSTANT(opline->op2);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
property_name = EX_CONSTANT(opline->op2);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_VAR, property_name, IS_CONST, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
try_assign_dim:
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
} else {
- zend_error_noreturn(E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
}
} else {
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), c);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
} else {
- zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
}
}
constant_fetch_end:
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
offset = EX_CONSTANT(opline->op2);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
-
} else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if (IS_CONST == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
-
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_VAR != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
-
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
offset = EX_CONSTANT(opline->op2);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ if (free_op2) {zval_ptr_dtor_nogc(free_op2);};
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR &&
(value_ptr == &EG(uninitialized_zval) ||
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ if (free_op2) {zval_ptr_dtor_nogc(free_op2);};
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
- zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot assign by reference to overloaded object");
+ if (free_op2) {zval_ptr_dtor_nogc(free_op2);};
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
(IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
dim = NULL;
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
try_assign_dim:
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_UNUSED == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
if (IS_UNUSED == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zval *zptr;
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
} else {
if (IS_CV == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
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_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
+ }
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_VAR, property_name, IS_CV, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
try_assign_dim:
value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR &&
(value_ptr == &EG(uninitialized_zval) ||
variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
- zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot assign by reference to overloaded object");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
(IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
-
} else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if (IS_CV == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
-
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_VAR != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
-
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zval *zptr;
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+ FREE_OP(free_op_data1);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
do {
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
zval_ptr_dtor_nogc(free_op2);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
zval_ptr_dtor_nogc(free_op2);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) {
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
} else {
if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
zval_ptr_dtor_nogc(free_op2);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
zval_ptr_dtor_nogc(free_op2);
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_CONST || IS_VAR == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
+ }
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
zval_ptr_dtor_nogc(free_op2);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
zval_ptr_dtor_nogc(free_op2);
property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(free_op2);
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_VAR, property_name, (IS_TMP_VAR|IS_VAR), (opline+1)->op1_type, (opline+1)->op1, execute_data, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
zval_ptr_dtor_nogc(free_op2);
object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
try_assign_dim:
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Function name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Function name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
}
fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
}
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", ce->name->val, Z_STRVAL_P(function_name));
+ zval_ptr_dtor_nogc(free_op2);
+ HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot call constructor");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call constructor");
+ HANDLE_EXCEPTION();
}
if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
- zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot call private %s::__construct()", ce->name->val);
+ HANDLE_EXCEPTION();
}
fbc = ce->constructor;
}
object ? ", assuming $this from incompatible context" : "");
} else {
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
- zend_error_noreturn(
- E_ERROR,
+ zend_error(
+ E_EXCEPTION | E_ERROR,
"Non-static method %s::%s() cannot be called statically%s",
fbc->common.scope->name->val, fbc->common.function_name->val,
object ? ", assuming $this from incompatible context" : "");
+ HANDLE_EXCEPTION();
}
}
}
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
- zval_ptr_dtor_nogc(free_op2);
} else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
- zval_ptr_dtor_nogc(free_op2);
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_VAR != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
- zval_ptr_dtor_nogc(free_op2);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+ zval_ptr_dtor_nogc(free_op2);
if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+ if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "__clone method called on non-object");
+ zend_error(E_EXCEPTION | E_ERROR, "__clone method called on non-object");
+
+ HANDLE_EXCEPTION();
}
} while (0);
clone_call = Z_OBJ_HT_P(obj)->clone_obj;
if (UNEXPECTED(clone_call == NULL)) {
if (ce) {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object");
}
+
+ HANDLE_EXCEPTION();
}
if (ce && clone) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
if (UNEXPECTED(ce != EG(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+
+ HANDLE_EXCEPTION();
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+
+ HANDLE_EXCEPTION();
}
}
}
zval *zptr;
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
dim = EX_CONSTANT(opline->op2);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
property = EX_CONSTANT(opline->op2);
container = _get_obj_zval_ptr_unused(execute_data);
- if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
property = EX_CONSTANT(opline->op2);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
property_name = EX_CONSTANT(opline->op2);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_UNUSED, property_name, IS_CONST, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
function_name = EX_CONSTANT(opline->op2);
- if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if (IS_CONST != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+
+
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_obj_zval_ptr_unused(execute_data);
- do {
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
-
HANDLE_EXCEPTION();
}
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+
+
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
} else {
- zend_error_noreturn(E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
}
} else {
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), c);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
}
/* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
} else {
- zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ HANDLE_EXCEPTION();
}
}
constant_fetch_end:
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = EX_CONSTANT(opline->op2);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
-
} else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if (IS_CONST == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
-
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_UNUSED != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
-
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = EX_CONSTANT(opline->op2);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
dim = NULL;
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zval *zptr;
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
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_CONST || IS_UNUSED == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_UNUSED, property_name, IS_CV, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
- if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if (IS_CV != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+
+
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_obj_zval_ptr_unused(execute_data);
- do {
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
-
HANDLE_EXCEPTION();
}
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+
+
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
-
} else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if (IS_CV == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
-
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_UNUSED != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
-
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = NULL;
if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zval *zptr;
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
do {
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
zval_ptr_dtor_nogc(free_op2);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
container = _get_obj_zval_ptr_unused(execute_data);
- if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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);
+
+ HANDLE_EXCEPTION();
+ }
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
zval_ptr_dtor_nogc(free_op2);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
zval_ptr_dtor_nogc(free_op2);
property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_UNUSED, property_name, (IS_TMP_VAR|IS_VAR), (opline+1)->op1_type, (opline+1)->op1, execute_data, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
zval_ptr_dtor_nogc(free_op2);
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_obj_zval_ptr_unused(execute_data);
- do {
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if (IS_UNUSED != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
zval_ptr_dtor_nogc(free_op2);
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
- zval_ptr_dtor_nogc(free_op2);
} else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
- zval_ptr_dtor_nogc(free_op2);
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_UNUSED != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
- zval_ptr_dtor_nogc(free_op2);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+ zval_ptr_dtor_nogc(free_op2);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(execute_data);
if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+ HANDLE_EXCEPTION();
}
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
retval_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(retval_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot return string offsets by reference");
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR) {
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Can only throw objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Can only throw objects");
+
+ HANDLE_EXCEPTION();
}
} while (0);
varptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(varptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Only variables can be passed by reference");
+
+ HANDLE_EXCEPTION();
}
arg = ZEND_CALL_VAR(EX(call), opline->result.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "__clone method called on non-object");
+ zend_error(E_EXCEPTION | E_ERROR, "__clone method called on non-object");
+
+ HANDLE_EXCEPTION();
}
} while (0);
clone_call = Z_OBJ_HT_P(obj)->clone_obj;
if (UNEXPECTED(clone_call == NULL)) {
if (ce) {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object");
}
+
+ HANDLE_EXCEPTION();
}
if (ce && clone) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
if (UNEXPECTED(ce != EG(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+
+ HANDLE_EXCEPTION();
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+
+ HANDLE_EXCEPTION();
}
}
}
zval *zptr;
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
dim = EX_CONSTANT(opline->op2);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_CONST == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST);
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
property = EX_CONSTANT(opline->op2);
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
- if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
property = EX_CONSTANT(opline->op2);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
property_name = EX_CONSTANT(opline->op2);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_CV, property_name, IS_CONST, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
try_assign_dim:
function_name = EX_CONSTANT(opline->op2);
- if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if (IS_CONST != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+
+
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
- do {
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
-
HANDLE_EXCEPTION();
}
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+
+
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if (IS_CV != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = EX_CONSTANT(opline->op2);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
-
} else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if (IS_CONST == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
-
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_CV != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
-
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = EX_CONSTANT(opline->op2);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ if (free_op2) {zval_ptr_dtor_nogc(free_op2);};
+
+ HANDLE_EXCEPTION();
}
if (IS_VAR == IS_VAR &&
(value_ptr == &EG(uninitialized_zval) ||
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ if (free_op2) {zval_ptr_dtor_nogc(free_op2);};
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
- zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot assign by reference to overloaded object");
+ if (free_op2) {zval_ptr_dtor_nogc(free_op2);};
+
+ HANDLE_EXCEPTION();
}
if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
(IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if (IS_CV != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
dim = NULL;
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_UNUSED == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, NULL, IS_UNUSED);
object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
try_assign_dim:
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if (IS_CV != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zval *zptr;
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+
+
+ HANDLE_EXCEPTION();
}
do {
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if (IS_CV == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV);
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
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_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+
+
+ HANDLE_EXCEPTION();
+ }
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_CV, property_name, IS_CV, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+
+
+ HANDLE_EXCEPTION();
}
try_assign_dim:
value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR &&
(value_ptr == &EG(uninitialized_zval) ||
variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR &&
UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) &&
UNEXPECTED(!Z_ISREF_P(variable_ptr))) {
- zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot assign by reference to overloaded object");
+
+
+ HANDLE_EXCEPTION();
}
if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) ||
(IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) {
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
- if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if (IS_CV != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+
+
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
- do {
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
-
- HANDLE_EXCEPTION();
- }
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
-
-
- if (EG(exception) != NULL) {
HANDLE_EXCEPTION();
}
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+
+
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
-
} else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if (IS_CV == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
-
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_CV != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
-
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
- zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
+
+
+ HANDLE_EXCEPTION();
}
/* Destroy the previously yielded value */
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot yield string offsets by reference");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot yield string offsets by reference");
+
+
+ HANDLE_EXCEPTION();
}
/* If a function call result is yielded and the function did
zval *zptr;
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
do {
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
var_ptr = Z_INDIRECT(rv);
if (UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+ FREE_OP(free_op_data1);
+
+ HANDLE_EXCEPTION();
}
if (UNEXPECTED(var_ptr == &EG(error_zval))) {
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
retval = EX_VAR(opline->result.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
do {
retval = EX_VAR(opline->result.var);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
do {
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
zval_ptr_dtor_nogc(free_op2);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
zval_ptr_dtor_nogc(free_op2);
if (zend_is_by_ref_func_arg_fetch(opline, EX(call))) {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use temporary expression in write context");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) {
} else {
if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use [] for reading");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
zend_fetch_dimension_address_read_R(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR));
zval_ptr_dtor_nogc(free_op2);
container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW);
zval_ptr_dtor_nogc(free_op2);
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_CONST || IS_CV == IS_TMP_VAR) {
- zend_error_noreturn(E_ERROR, "Cannot use temporary expression in write context");
- }
+ 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);
+
+ HANDLE_EXCEPTION();
+ }
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W);
zval_ptr_dtor_nogc(free_op2);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an object");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET);
zval_ptr_dtor_nogc(free_op2);
property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_CV, property_name, (IS_TMP_VAR|IS_VAR), (opline+1)->op1_type, (opline+1)->op1, execute_data, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL));
zval_ptr_dtor_nogc(free_op2);
object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use string offset as an array");
+ FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
try_assign_dim:
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
- do {
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if (IS_CV != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
zval_ptr_dtor_nogc(free_op2);
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zval_ptr_dtor_nogc(free_op2);
+
+ HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
+
+ HANDLE_EXCEPTION();
}
ZVAL_MAKE_REF(expr_ptr);
Z_ADDREF_P(expr_ptr);
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
- zval_ptr_dtor_nogc(free_op2);
} else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot use object as array");
+ } else {
//??? if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset);
- zval_ptr_dtor_nogc(free_op2);
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset);
+ }
} else if (IS_CV != IS_UNUSED && Z_ISREF_P(container)) {
container = Z_REFVAL_P(container);
goto unset_dim_again;
} else if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_STRING)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- } else {
- zval_ptr_dtor_nogc(free_op2);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
}
+ zval_ptr_dtor_nogc(free_op2);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot unset string offsets");
+ zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+
+ HANDLE_EXCEPTION();
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "__clone method called on non-object");
+ zend_error(E_EXCEPTION | E_ERROR, "__clone method called on non-object");
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
} while (0);
clone_call = Z_OBJ_HT_P(obj)->clone_obj;
if (UNEXPECTED(clone_call == NULL)) {
if (ce) {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
+ zend_error(E_EXCEPTION | E_ERROR, "Trying to clone an uncloneable object");
}
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
if (ce && clone) {
/* Ensure that if we're calling a private function, we're allowed to do so.
*/
if (UNEXPECTED(ce != EG(scope))) {
- zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
} else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
- zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zend_error(E_EXCEPTION | E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name->val, EG(scope) ? EG(scope)->name->val : "");
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
}
}
function_name = EX_CONSTANT(opline->op2);
- if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if (IS_CONST != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
-
HANDLE_EXCEPTION();
}
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
zval_ptr_dtor_nogc(free_op1);
-
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CONST == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
if (IS_CONST == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
- zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ zend_error(E_EXCEPTION | E_ERROR, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ zend_string_release(Z_STR(tmp));
+ }
+ HANDLE_EXCEPTION();
}
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
}
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
- if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if (IS_CV != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
-
HANDLE_EXCEPTION();
}
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
zval_ptr_dtor_nogc(free_op1);
-
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), ((IS_CV == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
if (IS_CV == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&
+ UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
do {
if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(function_name)) {
function_name = Z_REFVAL_P(function_name);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
- zend_error_noreturn(E_ERROR, "Method name must be a string");
+ zend_error(E_EXCEPTION | E_ERROR, "Method name must be a string");
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+ HANDLE_EXCEPTION();
} while (0);
}
object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
- do {
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
- uint32_t nesting = 1;
-
- if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(object)) {
- object = Z_REFVAL_P(object);
- if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
- break;
- }
- }
-
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) {
+ ZVAL_DEREF(object);
+ if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
if (UNEXPECTED(EG(exception) != NULL)) {
- zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
-
- zend_error(E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
+ zend_error(E_EXCEPTION | E_RECOVERABLE_ERROR, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
zval_ptr_dtor_nogc(free_op2);
zval_ptr_dtor_nogc(free_op1);
-
- if (EG(exception) != NULL) {
- HANDLE_EXCEPTION();
- }
-
- /* No exception raised: Skip over arguments until fcall opcode with correct
- * nesting level. Return NULL (except when return value unused) */
- do {
- opline++;
- if (opline->opcode == ZEND_INIT_FCALL ||
- opline->opcode == ZEND_INIT_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME ||
- opline->opcode == ZEND_INIT_DYNAMIC_CALL ||
- opline->opcode == ZEND_INIT_METHOD_CALL ||
- opline->opcode == ZEND_INIT_STATIC_METHOD_CALL ||
- opline->opcode == ZEND_INIT_USER_CALL ||
- opline->opcode == ZEND_NEW
- ) {
- nesting++;
- } else if (opline->opcode == ZEND_DO_FCALL ||
- opline->opcode == ZEND_DO_ICALL ||
- opline->opcode == ZEND_DO_UCALL ||
- opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- nesting--;
- }
- } while (nesting);
-
- if (RETURN_VALUE_USED(opline)) {
- ZVAL_NULL(EX_VAR(opline->result.var));
- }
-
- /* We've skipped EXT_FCALL_BEGIND, so also skip the ending opcode */
- if ((opline + 1)->opcode == ZEND_EXT_FCALL_END) {
- opline++;
- }
- ZEND_VM_JMP(++opline);
+ HANDLE_EXCEPTION();
}
- } while (0);
+ }
obj = Z_OBJ_P(object);
called_scope = obj->ce;
zend_object *orig_obj = obj;
if (UNEXPECTED(obj->handlers->get_method == NULL)) {
- zend_error_noreturn(E_ERROR, "Object does not support method calls");
+ zend_error(E_EXCEPTION | E_ERROR, "Object does not support method calls");
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
/* First, locate the function. */
fbc = obj->handlers->get_method(&obj, Z_STR_P(function_name), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? (EX_CONSTANT(opline->op2) + 1) : NULL));
if (UNEXPECTED(fbc == NULL)) {
- zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zend_error(E_EXCEPTION | E_ERROR, "Call to undefined method %s::%s()", obj->ce->name->val, Z_STRVAL_P(function_name));
+ zval_ptr_dtor_nogc(free_op2);
+ zval_ptr_dtor_nogc(free_op1);
+ HANDLE_EXCEPTION();
}
if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
EXPECTED(fbc->type <= ZEND_USER_FUNCTION) &&