summaryrefslogtreecommitdiff
path: root/Zend/zend_closures.c
diff options
context:
space:
mode:
authorEtienne Kneuss <colder@php.net>2008-08-14 21:36:56 +0000
committerEtienne Kneuss <colder@php.net>2008-08-14 21:36:56 +0000
commitf90255c66b8d276d86e61a5d467371fa5ea6c926 (patch)
treec0b8d700186da8c526e18d0f18bc78b91ef9d4fa /Zend/zend_closures.c
parent99d3c317880ca451215ed9f2765e42fd0c771f40 (diff)
downloadphp-git-f90255c66b8d276d86e61a5d467371fa5ea6c926.tar.gz
MFH: Handlerify get_closure
Diffstat (limited to 'Zend/zend_closures.c')
-rw-r--r--Zend/zend_closures.c84
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