cvs: spl / php_spl.c spl_engine.c spl_engine.h spl_foreach.c

From: Date: Fri, 02 May 2003 15:39:12 +0000
Subject: cvs: spl / php_spl.c spl_engine.c spl_engine.h spl_foreach.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-20659@lists.php.net to get a copy of this message
helly Fri May 2 11:39:12 2003 EDT Modified files: /spl php_spl.c spl_engine.c spl_engine.h spl_foreach.c Log: Interfaces only implement interfaces Index: spl/php_spl.c diff -u spl/php_spl.c:1.1.1.1 spl/php_spl.c:1.2 --- spl/php_spl.c:1.1.1.1 Thu May 1 19:28:28 2003 +++ spl/php_spl.c Fri May 2 11:39:12 2003 @@ -134,29 +134,29 @@ REGISTER_SPL_INTERFACE(spl, sequence); REGISTER_SPL_INTF_FUNC(spl, sequence, rewind); - REGISTER_SPL_PARENT_CE(spl, sequence, forward); + REGISTER_SPL_IMPLEMENT(spl, sequence, forward); REGISTER_SPL_INTERFACE(spl, assoc); REGISTER_SPL_INTF_FUNC(spl, assoc, key); REGISTER_SPL_INTERFACE(spl, forward_assoc); - REGISTER_SPL_PARENT_CE(spl, forward_assoc, forward); REGISTER_SPL_IMPLEMENT(spl, forward_assoc, assoc); + REGISTER_SPL_IMPLEMENT(spl, forward_assoc, forward); REGISTER_SPL_INTERFACE(spl, sequence_assoc); - REGISTER_SPL_PARENT_CE(spl, sequence_assoc, sequence); REGISTER_SPL_IMPLEMENT(spl, sequence_assoc, forward_assoc); + REGISTER_SPL_IMPLEMENT(spl, sequence_assoc, sequence); REGISTER_SPL_INTERFACE(spl, array_read); REGISTER_SPL_INTF_FUNC(spl, array_read, get); REGISTER_SPL_INTF_FUNC(spl, array_read, exists); REGISTER_SPL_INTERFACE(spl, array_access); - REGISTER_SPL_PARENT_CE(spl, array_access, array_read); + REGISTER_SPL_IMPLEMENT(spl, array_access, array_read); REGISTER_SPL_INTF_FUNC(spl, array_access, set); REGISTER_SPL_INTERFACE(spl, array_access_ex); - REGISTER_SPL_PARENT_CE(spl, array_access_ex, array_access); + REGISTER_SPL_IMPLEMENT(spl, array_access_ex, array_access); REGISTER_SPL_INTF_FUNC(spl, array_access_ex, new_writer); REGISTER_SPL_INTERFACE(spl, array_writer); Index: spl/spl_engine.c diff -u spl/spl_engine.c:1.1.1.1 spl/spl_engine.c:1.2 --- spl/spl_engine.c:1.1.1.1 Thu May 1 19:28:28 2003 +++ spl/spl_engine.c Fri May 2 11:39:12 2003 @@ -193,23 +193,53 @@ } /* }}} */ +/* {{{ */ +inline zend_class_entry *spl_get_class_entry(zval *obj TSRMLS_DC) +{ + if (obj && Z_TYPE_P(obj) == IS_OBJECT && Z_OBJ_HT_P(obj)->get_class_entry) { + return Z_OBJ_HT_P(obj)->get_class_entry(obj TSRMLS_CC); + } else { + return NULL; + } +} +/* }}} */ + /* {{{ spl_is_instance_of */ int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC) { /* Ensure everything needed is available before checking for the type. - * HAS_CLASS_ENTRY is neededto ensure Z_OBJCE_PP will not throw an error. */ - if (!obj || !*obj || Z_TYPE_PP(obj) != IS_OBJECT || !HAS_CLASS_ENTRY(**obj)) { - return 0; - } else { - zend_class_entry *instance_ce = Z_OBJCE_PP(obj); - + zend_class_entry *instance_ce; + + if (obj && (instance_ce = spl_get_class_entry(*obj TSRMLS_CC)) != NULL) { if (instanceof_function(instance_ce, ce TSRMLS_CC)) { return 1; - } else { - return 0; } } + return 0; +} +/* }}} */ + +/* {{{ spl_implements */ +int spl_implements(zval **obj, zend_class_entry *ce TSRMLS_DC) +{ + /* Ensure everything needed is available before checking for the type. + */ + zend_class_entry *instance_ce; + + if (obj && (instance_ce = spl_get_class_entry(*obj TSRMLS_CC)) != NULL) { + int i; + + while (instance_ce) { + for (i = 0; i < instance_ce->num_interfaces; i++) { + if (instance_ce->interfaces[i] == ce) { + return 1; + } + } + instance_ce = instance_ce->parent; + } + } + return spl_is_instance_of(obj, ce TSRMLS_CC); } /* }}} */ Index: spl/spl_engine.h diff -u spl/spl_engine.h:1.1.1.1 spl/spl_engine.h:1.2 --- spl/spl_engine.h:1.1.1.1 Thu May 1 19:28:28 2003 +++ spl/spl_engine.h Fri May 2 11:39:12 2003 @@ -49,7 +49,7 @@ zval * spl_get_zval_ptr(znode *node, temp_variable *Ts, zval **should_free TSRMLS_DC); int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC); - +int spl_implements(zval **obj, zend_class_entry *ce TSRMLS_DC); #endif /* SPL_ENGINE_H */ Index: spl/spl_foreach.c diff -u spl/spl_foreach.c:1.2 spl/spl_foreach.c:1.3 --- spl/spl_foreach.c:1.2 Fri May 2 07:10:55 2003 +++ spl/spl_foreach.c Fri May 2 11:39:12 2003 @@ -38,7 +38,7 @@ if (EX(opline)->extended_value) { obj = spl_get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); - if (spl_is_instance_of(obj, spl_ce_iterator TSRMLS_CC)) { + if (spl_implements(obj, spl_ce_iterator TSRMLS_CC)) { spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); MAKE_STD_ZVAL(retval); spl_begin_method_call_this(obj, "new_iterator", retval TSRMLS_CC); @@ -49,7 +49,7 @@ PZVAL_LOCK(retval); NEXT_OPCODE(); - } else if (spl_is_instance_of(obj, spl_ce_forward TSRMLS_CC)) { + } else if (spl_implements(obj, spl_ce_forward TSRMLS_CC)) { spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); EX_T(EX(opline)->result.u.var).var.ptr = *obj; @@ -72,7 +72,7 @@ zval **obj = spl_get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); zval more, tmp, *value, *key, *result; - if (spl_is_instance_of(obj, spl_ce_forward TSRMLS_CC)) { + if (spl_implements(obj, spl_ce_forward TSRMLS_CC)) { zend_uint index = EX(opline)->op2.u.EA.type++; spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC); @@ -80,7 +80,7 @@ if (index) { spl_begin_method_call_this(obj, "next", &more TSRMLS_CC); - } else if (spl_is_instance_of(obj, spl_ce_sequence TSRMLS_CC)) { + } else if (spl_implements(obj, spl_ce_sequence TSRMLS_CC)) { spl_begin_method_call_this(obj, "rewind", &more TSRMLS_CC); } @@ -94,7 +94,7 @@ zend_hash_index_update(result->value.ht, 0, &value, sizeof(zval *), NULL); - if (spl_is_instance_of(obj, spl_ce_assoc TSRMLS_CC)) { + if (spl_implements(obj, spl_ce_assoc TSRMLS_CC)) { ALLOC_ZVAL(key); spl_begin_method_call_this(obj, "key", key TSRMLS_CC); } else {

« previous php.cvs (#20659) next »