diff options
author | Etienne Kneuss <colder@php.net> | 2008-08-14 21:36:56 +0000 |
---|---|---|
committer | Etienne Kneuss <colder@php.net> | 2008-08-14 21:36:56 +0000 |
commit | f90255c66b8d276d86e61a5d467371fa5ea6c926 (patch) | |
tree | c0b8d700186da8c526e18d0f18bc78b91ef9d4fa /Zend/zend_closures.c | |
parent | 99d3c317880ca451215ed9f2765e42fd0c771f40 (diff) | |
download | php-git-f90255c66b8d276d86e61a5d467371fa5ea6c926.tar.gz |
MFH: Handlerify get_closure
Diffstat (limited to 'Zend/zend_closures.c')
-rw-r--r-- | Zend/zend_closures.c | 84 |
1 files changed, 33 insertions, 51 deletions
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 48fae603f8..f0fba8e174 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -208,6 +208,38 @@ static zend_object_value zend_closure_new(zend_class_entry *class_type TSRMLS_DC } /* }}} */ +int zend_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr, zval ***zobj_ptr_ptr TSRMLS_DC) /* {{{ */ +{ + zend_closure *closure; + + if (Z_TYPE_P(obj) != IS_OBJECT) { + return FAILURE; + } + + closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC); + *fptr_ptr = &closure->func; + + if (closure->this_ptr) { + if (zobj_ptr) { + *zobj_ptr = closure->this_ptr; + } + if (zobj_ptr_ptr) { + *zobj_ptr_ptr = &closure->this_ptr; + } + *ce_ptr = Z_OBJCE_P(closure->this_ptr); + } else { + if (zobj_ptr) { + *zobj_ptr = NULL; + } + if (zobj_ptr_ptr) { + *zobj_ptr_ptr = NULL; + } + *ce_ptr = closure->func.common.scope; + } + return SUCCESS; +} +/* }}} */ + void zend_register_closure_ce(TSRMLS_D) /* {{{ */ { zend_class_entry ce; @@ -229,6 +261,7 @@ void zend_register_closure_ce(TSRMLS_D) /* {{{ */ closure_handlers.unset_property = zend_closure_unset_property; closure_handlers.compare_objects = zend_closure_compare_objects; closure_handlers.clone_obj = NULL; + closure_handlers.get_closure = zend_closure_get_closure; } /* }}} */ @@ -306,57 +339,6 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent } /* }}} */ -ZEND_API int zend_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr, zval ***zobj_ptr_ptr TSRMLS_DC) /* {{{ */ -{ - if (Z_TYPE_P(obj) == IS_OBJECT) { - zend_class_entry *ce = Z_OBJCE_P(obj); - - if (ce == zend_ce_closure) { - zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC); - - *fptr_ptr = &closure->func; - if (closure->this_ptr) { - if (zobj_ptr) { - *zobj_ptr = closure->this_ptr; - } - if (zobj_ptr_ptr) { - *zobj_ptr_ptr = &closure->this_ptr; - } - *ce_ptr = Z_OBJCE_P(closure->this_ptr); - } else { - if (zobj_ptr) { - *zobj_ptr = NULL; - } - if (zobj_ptr_ptr) { - *zobj_ptr_ptr = NULL; - } - *ce_ptr = closure->func.common.scope; - } - return SUCCESS; - } else if (zend_hash_find(&ce->function_table, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME), (void**)fptr_ptr) == SUCCESS) { - *ce_ptr = ce; - if ((*fptr_ptr)->common.fn_flags & ZEND_ACC_STATIC) { - if (zobj_ptr) { - *zobj_ptr = NULL; - } - if (zobj_ptr_ptr) { - *zobj_ptr_ptr = NULL; - } - } else { - if (zobj_ptr) { - *zobj_ptr = obj; - } - if (zobj_ptr_ptr) { - *zobj_ptr_ptr = NULL; - } - } - return SUCCESS; - } - } - return FAILURE; -} -/* }}} */ - /* * Local variables: * tab-width: 4 |