cvs: spl / php_spl.c spl_engine.c spl_engine.h spl_foreach.c
| From: | Marcus Boerger | 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 {