--- /dev/null
+--TEST--
+Check that arguments are freed when a call to an abstract method throws
+--FILE--
+<?php
+
+abstract class Test {
+ abstract static function method();
+}
+
+try {
+ Test::method(new stdClass);
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Cannot call abstract method Test::method()
ZSTR_VAL(fbc->common.function_name));
}
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_abstract_method(const zend_function *fbc)
+{
+ zend_throw_error(NULL, "Cannot call abstract method %s::%s()",
+ ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+}
+
static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value OPLINE_DC EXECUTE_DATA_DC)
{
zend_uchar c;
HANDLE_EXCEPTION();
}
-ZEND_VM_COLD_HELPER(zend_abstract_method_helper, ANY, ANY, zend_function *func)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
-}
-
ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
{
USE_OPLINE
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_VM_DISPATCH_TO_HELPER(zend_abstract_method_helper, func, fbc);
+ zend_abstract_method(fbc);
+ZEND_VM_C_LABEL(fcall_except):
+ UNDEF_RESULT();
+ zend_vm_stack_free_args(call);
+ ZEND_VM_C_GOTO(fcall_end);
} else {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ ZEND_VM_C_GOTO(fcall_except);
}
}
}
HANDLE_EXCEPTION();
}
-static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_abstract_method_helper_SPEC(zend_function *func ZEND_OPCODE_HANDLER_ARGS_DC)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
-}
-
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
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_VM_TAIL_CALL(zend_abstract_method_helper_SPEC(fbc ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ zend_abstract_method(fbc);
+fcall_except:
+ UNDEF_RESULT();
+ zend_vm_stack_free_args(call);
+ goto fcall_end;
} else {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ goto fcall_except;
}
}
}
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_VM_TAIL_CALL(zend_abstract_method_helper_SPEC(fbc ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+ zend_abstract_method(fbc);
+fcall_except:
+ UNDEF_RESULT();
+ zend_vm_stack_free_args(call);
+ goto fcall_end;
} else {
zend_deprecated_function(fbc);
if (UNEXPECTED(EG(exception) != NULL)) {
- UNDEF_RESULT();
- HANDLE_EXCEPTION();
+ goto fcall_except;
}
}
}