summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index dfda708646..595a27c4c5 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1676,6 +1676,7 @@ static zend_bool zend_do_perform_implementation_check(zend_function *fe)
op = fe->op_array.opcodes;
proto_op = fe->common.prototype->op_array.opcodes;
+ /* Make sure that the implementation has all of the arguments of the interface */
while (proto_op->opcode != ZEND_RAISE_ABSTRACT_ERROR) {
if (proto_op->opcode != op->opcode) {
return 0;
@@ -1690,7 +1691,21 @@ static zend_bool zend_do_perform_implementation_check(zend_function *fe)
proto_op++;
op++;
}
- return 1;
+
+ /* Make sure that the implementation doesn't receive more arguments than the interface */
+ while (1) {
+ switch (op->opcode) {
+ case ZEND_FETCH_CLASS:
+ case ZEND_FETCH_W:
+ op++;
+ break;
+ case ZEND_RECV:
+ case ZEND_RECV_INIT:
+ return 0;
+ default:
+ return 1;
+ }
+ }
}