]> granicus.if.org Git - php/commitdiff
do not allow to implement the same interface twice
authorAntony Dovgal <tony2001@php.net>
Tue, 6 Jun 2006 10:02:28 +0000 (10:02 +0000)
committerAntony Dovgal <tony2001@php.net>
Tue, 6 Jun 2006 10:02:28 +0000 (10:02 +0000)
add tests

Zend/tests/objects_012.phpt [new file with mode: 0644]
Zend/tests/objects_013.phpt [new file with mode: 0644]
Zend/tests/objects_014.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/objects_012.phpt b/Zend/tests/objects_012.phpt
new file mode 100644 (file)
index 0000000..95cce3e
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+implementing a class
+--FILE--
+<?php
+
+class foo {
+}
+
+interface bar extends foo {
+}
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Fatal error: bar cannot implement foo - it is not an interface in %s on line %d
diff --git a/Zend/tests/objects_013.phpt b/Zend/tests/objects_013.phpt
new file mode 100644 (file)
index 0000000..cd65bb2
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+implementing the same interface twice
+--FILE--
+<?php
+
+interface foo {
+}
+
+class bar implements foo, foo {
+}      
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Fatal error: Cannot implement previously implemented interface foo in %s on line %d
diff --git a/Zend/tests/objects_014.phpt b/Zend/tests/objects_014.phpt
new file mode 100644 (file)
index 0000000..2dec0c0
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+extending the same interface twice
+--FILE--
+<?php
+
+interface foo {
+}
+
+interface bar extends foo, foo {
+}      
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Fatal error: Cannot implement previously implemented interface foo in %s on line %d
index ad9537322ce112076587617a9acd53352b562e39..ba0facad616690da0ed63cb8caa3d625d2cb6819 100644 (file)
@@ -2382,6 +2382,17 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zva
 
 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC)
 {
+       zend_uint i, if_num = ce->num_interfaces, cnt = 0;
+
+       for (i = 0; i < if_num; i++) {
+               if (ce->interfaces[i] != NULL && ce->interfaces[i]->name_length == iface->name_length && !memcmp(ce->interfaces[i]->name.v, iface->name.v, UG(unicode)?UBYTES(iface->name_length):iface->name_length)) {
+                       cnt++;
+                       if (cnt > 1) {
+                               zend_error(E_COMPILE_ERROR, "Cannot implement previously implemented interface %v", iface->name);
+                       }
+               }
+       }
+
        zend_hash_merge_ex(&ce->constants_table, &iface->constants_table, (copy_ctor_func_t) zval_add_ref, sizeof(zval *), (merge_checker_func_t) do_inherit_constant_check, iface);
        zend_hash_merge_ex(&ce->function_table, &iface->function_table, (copy_ctor_func_t) do_inherit_method, sizeof(zend_function), (merge_checker_func_t) do_inherit_method_check, ce);