Skip to content

Commit b02f425

Browse files
committed
Merge branch 'PHP-7.4'
2 parents d1f9ab1 + 4bb7282 commit b02f425

File tree

4 files changed

+45
-29
lines changed

4 files changed

+45
-29
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Check that arguments are freed when a call to an abstract method throws
3+
--FILE--
4+
<?php
5+
6+
abstract class Test {
7+
abstract static function method();
8+
}
9+
10+
try {
11+
Test::method(new stdClass);
12+
} catch (Error $e) {
13+
echo $e->getMessage(), "\n";
14+
}
15+
16+
?>
17+
--EXPECT--
18+
Cannot call abstract method Test::method()

Zend/zend_execute.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,6 +1553,12 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_deprecated_function(c
15531553
ZSTR_VAL(fbc->common.function_name));
15541554
}
15551555

1556+
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_abstract_method(const zend_function *fbc)
1557+
{
1558+
zend_throw_error(NULL, "Cannot call abstract method %s::%s()",
1559+
ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
1560+
}
1561+
15561562
static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value OPLINE_DC EXECUTE_DATA_DC)
15571563
{
15581564
zend_uchar c;

Zend/zend_vm_def.h

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,16 +1025,6 @@ ZEND_VM_COLD_HELPER(zend_this_not_in_object_context_helper, ANY, ANY)
10251025
HANDLE_EXCEPTION();
10261026
}
10271027

1028-
ZEND_VM_COLD_HELPER(zend_abstract_method_helper, ANY, ANY, zend_function *func)
1029-
{
1030-
USE_OPLINE
1031-
1032-
SAVE_OPLINE();
1033-
zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
1034-
UNDEF_RESULT();
1035-
HANDLE_EXCEPTION();
1036-
}
1037-
10381028
ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
10391029
{
10401030
USE_OPLINE
@@ -4163,12 +4153,15 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
41634153
EX(call) = call->prev_execute_data;
41644154
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
41654155
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
4166-
ZEND_VM_DISPATCH_TO_HELPER(zend_abstract_method_helper, func, fbc);
4156+
zend_abstract_method(fbc);
4157+
ZEND_VM_C_LABEL(fcall_except):
4158+
UNDEF_RESULT();
4159+
zend_vm_stack_free_args(call);
4160+
ZEND_VM_C_GOTO(fcall_end);
41674161
} else {
41684162
zend_deprecated_function(fbc);
41694163
if (UNEXPECTED(EG(exception) != NULL)) {
4170-
UNDEF_RESULT();
4171-
HANDLE_EXCEPTION();
4164+
ZEND_VM_C_GOTO(fcall_except);
41724165
}
41734166
}
41744167
}
@@ -4237,6 +4230,7 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
42374230
}
42384231
}
42394232

4233+
ZEND_VM_C_LABEL(fcall_end):
42404234
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
42414235
OBJ_RELEASE(Z_OBJ(call->This));
42424236
}

Zend/zend_vm_execute.h

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -781,16 +781,6 @@ static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_th
781781
HANDLE_EXCEPTION();
782782
}
783783

784-
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)
785-
{
786-
USE_OPLINE
787-
788-
SAVE_OPLINE();
789-
zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
790-
UNDEF_RESULT();
791-
HANDLE_EXCEPTION();
792-
}
793-
794784
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
795785
{
796786
USE_OPLINE
@@ -1575,12 +1565,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
15751565
EX(call) = call->prev_execute_data;
15761566
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
15771567
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
1578-
ZEND_VM_TAIL_CALL(zend_abstract_method_helper_SPEC(fbc ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
1568+
zend_abstract_method(fbc);
1569+
fcall_except:
1570+
UNDEF_RESULT();
1571+
zend_vm_stack_free_args(call);
1572+
goto fcall_end;
15791573
} else {
15801574
zend_deprecated_function(fbc);
15811575
if (UNEXPECTED(EG(exception) != NULL)) {
1582-
UNDEF_RESULT();
1583-
HANDLE_EXCEPTION();
1576+
goto fcall_except;
15841577
}
15851578
}
15861579
}
@@ -1649,6 +1642,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
16491642
}
16501643
}
16511644

1645+
fcall_end:
16521646
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
16531647
OBJ_RELEASE(Z_OBJ(call->This));
16541648
}
@@ -1674,12 +1668,15 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
16741668
EX(call) = call->prev_execute_data;
16751669
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
16761670
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
1677-
ZEND_VM_TAIL_CALL(zend_abstract_method_helper_SPEC(fbc ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
1671+
zend_abstract_method(fbc);
1672+
fcall_except:
1673+
UNDEF_RESULT();
1674+
zend_vm_stack_free_args(call);
1675+
goto fcall_end;
16781676
} else {
16791677
zend_deprecated_function(fbc);
16801678
if (UNEXPECTED(EG(exception) != NULL)) {
1681-
UNDEF_RESULT();
1682-
HANDLE_EXCEPTION();
1679+
goto fcall_except;
16831680
}
16841681
}
16851682
}
@@ -1748,6 +1745,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
17481745
}
17491746
}
17501747

1748+
fcall_end:
17511749
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
17521750
OBJ_RELEASE(Z_OBJ(call->This));
17531751
}

0 commit comments

Comments
 (0)