cvs: ZendEngine2 / zend_compile.c zend_language_parser.y php-src/tests/classes interface_doubled.phpt
| From: | Marcus Boerger | Date: | Wed, 11 Feb 2004 22:13:39 +0000 |
| Subject: | cvs: ZendEngine2 / zend_compile.c zend_language_parser.y php-src/tests/classes interface_doubled.phpt | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-2359@lists.php.net to get a copy of this message | ||
helly Wed Feb 11 17:13:39 2004 EDT
Modified files:
/php-src/tests/classes interface_doubled.phpt
/ZendEngine2 zend_compile.c zend_language_parser.y
Log:
Fix: <interface> [extends <interface> [, <ineterface>]* ]
http://cvs.php.net/diff.php/php-src/tests/classes/interface_doubled.phpt?r1=1.6&r2=1.7&ty=u
Index: php-src/tests/classes/interface_doubled.phpt
diff -u php-src/tests/classes/interface_doubled.phpt:1.6
php-src/tests/classes/interface_doubled.phpt:1.7
--- php-src/tests/classes/interface_doubled.phpt:1.6 Wed Jan 21 17:36:49 2004
+++ php-src/tests/classes/interface_doubled.phpt Wed Feb 11 17:13:22 2004
@@ -1,5 +1,5 @@
--TEST--
-ZE2 An interface may both inherit and implement base interfaces
+ZE2 An interface extends base interfaces
--SKIPIF--
<?php if (version_compare(zend_version(), '2.0.0-dev', '<'))
die('skip ZendEngine 2 needed'); ?>
--FILE--
@@ -25,7 +25,7 @@
abstract function f_d();
}
-interface if_f extends if_e, if_a, if_b, if_c, if_d, if_e {
+interface if_f extends /*if_e,*/ if_a, if_b, if_c, if_d /*, if_e*/ {
}
class base {
@@ -154,6 +154,7 @@
echo $t->test('if_e');
?>
+===DONE===
--EXPECTF--
class_a
is_a(class_a, if_a) yes
@@ -196,4 +197,5 @@
is_a(class_g, if_b) yes
is_a(class_g, if_c) yes
is_a(class_g, if_d) yes
-is_a(class_g, if_e) yes
\ No newline at end of file
+is_a(class_g, if_e) no
+===DONE===
http://cvs.php.net/diff.php/ZendEngine2/zend_compile.c?r1=1.540&r2=1.541&ty=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.540 ZendEngine2/zend_compile.c:1.541
--- ZendEngine2/zend_compile.c:1.540 Wed Feb 11 05:51:05 2004
+++ ZendEngine2/zend_compile.c Wed Feb 11 17:13:39 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.540 2004/02/11 10:51:05 zeev Exp $ */
+/* $Id: zend_compile.c,v 1.541 2004/02/11 22:13:39 helly Exp $ */
#include "zend_language_parser.h"
#include "zend.h"
@@ -2452,7 +2452,7 @@
new_class_entry->line_start = zend_get_compiled_lineno(TSRMLS_C);
new_class_entry->ce_flags |= class_token->u.constant.value.lval;
- if (parent_class_name->op_type != IS_UNUSED) {
+ if (parent_class_name && parent_class_name->op_type != IS_UNUSED) {
doing_inheritance = 1;
}
@@ -2542,10 +2542,6 @@
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
- if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) {
- zend_error(E_COMPILE_ERROR, "Interfaces cannot implement other classes/interfaces");
- }
-
opline->opcode = ZEND_ADD_INTERFACE;
opline->op1 = CG(implementing_class);
opline->op2 = *interface_znode;
http://cvs.php.net/diff.php/ZendEngine2/zend_language_parser.y?r1=1.137&r2=1.138&ty=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.137 ZendEngine2/zend_language_parser.y:1.138
--- ZendEngine2/zend_language_parser.y:1.137 Wed Feb 4 11:30:15 2004
+++ ZendEngine2/zend_language_parser.y Wed Feb 11 17:13:39 2004
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_parser.y,v 1.137 2004/02/04 16:30:15 zeev Exp $ */
+/* $Id: zend_language_parser.y,v 1.138 2004/02/11 22:13:39 helly Exp $ */
/*
* LALR shift/reduce conflicts and how they are resolved:
@@ -274,6 +274,12 @@
'{'
class_statement_list
'}' { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); }
+ | interface_entry T_STRING
+ { zend_do_begin_class_declaration(&$1, &$2, NULL TSRMLS_CC); }
+ interface_extends_list
+ '{'
+ class_statement_list
+ '}' { zend_do_end_class_declaration(&$1, &$2 TSRMLS_CC); }
;
@@ -281,7 +287,6 @@
T_CLASS { $$.u.constant.value.lval = 0; }
| T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_ABSTRACT_CLASS; }
| T_FINAL T_CLASS { $$.u.constant.value.lval = ZEND_ACC_FINAL_CLASS; }
- | T_INTERFACE { $$.u.constant.value.lval = ZEND_ACC_INTERFACE; }
;
extends_from:
@@ -289,6 +294,15 @@
| T_EXTENDS fully_qualified_class_name { $$ = $2; }
;
+interface_entry:
+ T_INTERFACE { $$.u.constant.value.lval = ZEND_ACC_INTERFACE; }
+;
+
+interface_extends_list:
+ /* empty */
+ | T_EXTENDS interface_list
+;
+
implements_list:
/* empty */
| T_IMPLEMENTS interface_list