summaryrefslogtreecommitdiff
path: root/ext/spl/spl_engine.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-05-29 21:08:08 +0000
committerMarcus Boerger <helly@php.net>2003-05-29 21:08:08 +0000
commit283f52f415ce644c1a1ae626d34a3f76983fd3df (patch)
tree9140f5edf27eb9dd68363f37e55c88a79e9a760f /ext/spl/spl_engine.c
parent499f902a30fd8353aae4e8e9b105ec9d251401fa (diff)
downloadphp-git-283f52f415ce644c1a1ae626d34a3f76983fd3df.tar.gz
Optimize interface checks
Diffstat (limited to 'ext/spl/spl_engine.c')
-rwxr-xr-xext/spl/spl_engine.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/ext/spl/spl_engine.c b/ext/spl/spl_engine.c
index 02be8d000d..1f4bb78f47 100755
--- a/ext/spl/spl_engine.c
+++ b/ext/spl/spl_engine.c
@@ -144,34 +144,27 @@ int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC)
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;
- }
+ return instanceof_function(instance_ce, ce TSRMLS_CC);
}
return 0;
}
/* }}} */
/* {{{ spl_implements */
-int spl_implements(zval **obj, zend_class_entry *ce TSRMLS_DC)
+spl_is_a spl_implements(zend_class_entry *ce)
{
- /* 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;
- }
+ register spl_is_a is_a = 0;
+ register int i = ce->num_interfaces;
+ register zend_class_entry **pce = ce->interfaces;
+
+ while (i--) {
+ if (*pce == spl_ce_iterator) is_a |= SPL_IS_A_ITERATOR;
+ else if (*pce == spl_ce_forward) is_a |= SPL_IS_A_FORWARD;
+ else if (*pce == spl_ce_assoc) is_a |= SPL_IS_A_ASSOC;
+ else if (*pce == spl_ce_sequence) is_a |= SPL_IS_A_SEQUENCE;
+ pce++;
}
- return spl_is_instance_of(obj, ce TSRMLS_CC);
+ return is_a;
}
/* }}} */