cvs: ZendEngine2 / zend_interfaces.c
| From: | Marcus Boerger | Date: | Tue, 28 Oct 2003 18:46:37 +0000 |
| Subject: | cvs: ZendEngine2 / zend_interfaces.c | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-1944@lists.php.net to get a copy of this message | ||
helly Tue Oct 28 13:46:37 2003 EDT
Modified files:
/ZendEngine2 zend_interfaces.c
Log:
Give some freedon to c iterators but not in userspace.
Index: ZendEngine2/zend_interfaces.c
diff -u ZendEngine2/zend_interfaces.c:1.1 ZendEngine2/zend_interfaces.c:1.2
--- ZendEngine2/zend_interfaces.c:1.1 Wed Oct 22 16:04:48 2003
+++ ZendEngine2/zend_interfaces.c Tue Oct 28 13:46:37 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_interfaces.c,v 1.1 2003/10/22 20:04:48 helly Exp $ */
+/* $Id: zend_interfaces.c,v 1.2 2003/10/28 18:46:37 helly Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -302,8 +302,14 @@
/* {{{ zend_implement_aggregate */
static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entry *class_type
TSRMLS_DC)
{
- if (class_type->get_iterator && class_type->get_iterator !=
zend_user_get_new_iterator) {
- return FAILURE;
+ if (class_type->get_iterator) {
+ if (class_type->type == ZEND_INTERNAL_CLASS) {
+ /* inheritance ensures the class has necessary userland methods */
+ return SUCCESS;
+ } else if (class_type->get_iterator != zend_user_get_new_iterator) {
+ /* c-level get_iterator cannot be changed */
+ return FAILURE;
+ }
}
class_type->iterator_funcs.zf_new_iterator = NULL;
class_type->get_iterator = zend_user_get_new_iterator;
@@ -315,7 +321,13 @@
static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry *class_type
TSRMLS_DC)
{
if (class_type->get_iterator && class_type->get_iterator != zend_user_get_iterator)
{
- return FAILURE;
+ if (class_type->type == ZEND_INTERNAL_CLASS) {
+ /* inheritance ensures the class has the necessary userland methods */
+ return SUCCESS;
+ } else if (class_type->get_iterator != zend_user_get_new_iterator) {
+ /* c-level get_iterator cannot be changed */
+ return FAILURE;
+ }
}
class_type->get_iterator = zend_user_get_iterator;
class_type->iterator_funcs.zf_has_more = NULL;