cvs: ZendEngine2(PHP_5_3) / zend_API.c zend_closures.c zend_object_handlers.c zend_object_handlers.h zend_vm_def.h zend_vm_execute.h
"Etienne Kneuss" <[email protected]>
| Newsgroups | gmane.comp.php.cvs.zend |
|---|---|
| Message-ID | <cvscolder1218749822@cvsserver> |
colder Thu Aug 14 21:37:02 2008 UTC
Modified files: (Branch: PHP_5_3)
/ZendEngine2 zend_API.c zend_closures.c zend_object_handlers.c
zend_object_handlers.h zend_vm_def.h zend_vm_execute.h
Log:
MFH: Handlerify get_closure
--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
colder-20080814213702.txt
(text/plain, 11.3 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.c?r1=1.296.2.27.2.34.2.51&r2=1.296.2.27.2.34.2.52&diff_format=u
Index: ZendEngine2/zend_API.c
diff -u ZendEngine2/zend_API.c:1.296.2.27.2.34.2.51 ZendEngine2/zend_API.c:1.296.2.27.2.34.2.52
--- ZendEngine2/zend_API.c:1.296.2.27.2.34.2.51 Wed Aug 13 16:16:57 2008
+++ ZendEngine2/zend_API.c Thu Aug 14 21:36:56 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_API.c,v 1.296.2.27.2.34.2.51 2008/08/13 16:16:57 felipe Exp $ */
+/* $Id: zend_API.c,v 1.296.2.27.2.34.2.52 2008/08/14 21:36:56 colder Exp $ */
#include "zend.h"
#include "zend_execute.h"
@@ -2719,7 +2719,7 @@
return 0;
case IS_OBJECT:
- if (zend_get_closure(callable, &fcc->calling_scope, &fcc->function_handler, NULL, &fcc->object_pp TSRMLS_CC) == SUCCESS) {
+ if (Z_OBJ_HANDLER_P(callable, get_closure) && Z_OBJ_HANDLER_P(callable, get_closure)(callable, &fcc->calling_scope, &fcc->function_handler, NULL, &fcc->object_pp TSRMLS_CC) == SUCCESS) {
fcc->called_scope = fcc->calling_scope;
if (callable_name) {
zend_class_entry *ce = Z_OBJCE_P(callable); /* TBFixed: what if it's overloaded? */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_closures.c?r1=1.3.2.12&r2=1.3.2.13&diff_format=u
Index: ZendEngine2/zend_closures.c
diff -u ZendEngine2/zend_closures.c:1.3.2.12 ZendEngine2/zend_closures.c:1.3.2.13
--- ZendEngine2/zend_closures.c:1.3.2.12 Mon Aug 11 10:30:21 2008
+++ ZendEngine2/zend_closures.c Thu Aug 14 21:36:56 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_closures.c,v 1.3.2.12 2008/08/11 10:30:21 helly Exp $ */
+/* $Id: zend_closures.c,v 1.3.2.13 2008/08/14 21:36:56 colder Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -208,6 +208,38 @@
}
/* }}} */
+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 @@
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 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
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.c?r1=1.135.2.6.2.22.2.19&r2=1.135.2.6.2.22.2.20&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.19 ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.20
--- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.19 Tue Aug 12 17:20:24 2008
+++ ZendEngine2/zend_object_handlers.c Thu Aug 14 21:36:56 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_object_handlers.c,v 1.135.2.6.2.22.2.19 2008/08/12 17:20:24 felipe Exp $ */
+/* $Id: zend_object_handlers.c,v 1.135.2.6.2.22.2.20 2008/08/14 21:36:56 colder Exp $ */
#include "zend.h"
#include "zend_globals.h"
@@ -27,6 +27,7 @@
#include "zend_objects_API.h"
#include "zend_object_handlers.h"
#include "zend_interfaces.h"
+#include "zend_closures.h"
#define DEBUG_OBJECT_HANDLERS 0
@@ -1261,6 +1262,39 @@
}
/* }}} */
+int zend_std_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr, zval ***zobj_ptr_ptr TSRMLS_DC) /* {{{ */
+{
+ zend_class_entry *ce;
+ if (Z_TYPE_P(obj) != IS_OBJECT) {
+ return FAILURE;
+ }
+
+ ce = Z_OBJCE_P(obj);
+
+ if (zend_hash_find(&ce->function_table, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME), (void**)fptr_ptr) == FAILURE) {
+ return FAILURE;
+ }
+
+ *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;
+}
+/* }}} */
+
ZEND_API zend_object_handlers std_object_handlers = {
zend_objects_store_add_ref, /* add_ref */
zend_objects_store_del_ref, /* del_ref */
@@ -1286,7 +1320,8 @@
zend_std_compare_objects, /* compare_objects */
zend_std_cast_object_tostring, /* cast_object */
NULL, /* count_elements */
- NULL, /* get_debug_info */
+ NULL, /* get_debug_info */
+ zend_std_get_closure, /* get_closure */
};
/*
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.h?r1=1.47.2.2.2.5.2.4&r2=1.47.2.2.2.5.2.5&diff_format=u
Index: ZendEngine2/zend_object_handlers.h
diff -u ZendEngine2/zend_object_handlers.h:1.47.2.2.2.5.2.4 ZendEngine2/zend_object_handlers.h:1.47.2.2.2.5.2.5
--- ZendEngine2/zend_object_handlers.h:1.47.2.2.2.5.2.4 Tue Aug 12 17:20:24 2008
+++ ZendEngine2/zend_object_handlers.h Thu Aug 14 21:36:56 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_object_handlers.h,v 1.47.2.2.2.5.2.4 2008/08/12 17:20:24 felipe Exp $ */
+/* $Id: zend_object_handlers.h,v 1.47.2.2.2.5.2.5 2008/08/14 21:36:56 colder Exp $ */
#ifndef ZEND_OBJECT_HANDLERS_H
#define ZEND_OBJECT_HANDLERS_H
@@ -108,6 +108,8 @@
* Returns FAILURE if the object does not have any sense of overloaded dimensions */
typedef int (*zend_object_count_elements_t)(zval *object, long *count TSRMLS_DC);
+typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr, zval ***zobj_ptr_ptr TSRMLS_DC);
+
struct _zend_object_handlers {
/* general object functions */
zend_object_add_ref_t add_ref;
@@ -135,6 +137,7 @@
zend_object_cast_t cast_object;
zend_object_count_elements_t count_elements;
zend_object_get_debug_info_t get_debug_info;
+ zend_object_get_closure_t get_closure;
};
extern ZEND_API zend_object_handlers std_object_handlers;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.68&r2=1.59.2.29.2.48.2.69&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.68 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.69
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.68 Thu Aug 14 10:24:51 2008
+++ ZendEngine2/zend_vm_def.h Thu Aug 14 21:36:56 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.68 2008/08/14 10:24:51 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.69 2008/08/14 21:36:56 colder Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -2073,7 +2073,8 @@
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
if (Z_TYPE_P(function_name) == IS_OBJECT &&
- zend_get_closure(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
+ Z_OBJ_HANDLER_P(function_name, get_closure) &&
+ Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
if (EX(object)) {
Z_ADDREF_P(EX(object));
}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.68&r2=1.62.2.30.2.49.2.69&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.68 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.69
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.68 Thu Aug 14 10:24:52 2008
+++ ZendEngine2/zend_vm_execute.h Thu Aug 14 21:36:56 2008
@@ -754,7 +754,8 @@
function_name = &opline->op2.u.constant;
if (Z_TYPE_P(function_name) == IS_OBJECT &&
- zend_get_closure(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
+ Z_OBJ_HANDLER_P(function_name, get_closure) &&
+ Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
if (EX(object)) {
Z_ADDREF_P(EX(object));
}
@@ -951,7 +952,8 @@
function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
if (Z_TYPE_P(function_name) == IS_OBJECT &&
- zend_get_closure(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
+ Z_OBJ_HANDLER_P(function_name, get_closure) &&
+ Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
if (EX(object)) {
Z_ADDREF_P(EX(object));
}
@@ -1056,7 +1058,8 @@
function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
if (Z_TYPE_P(function_name) == IS_OBJECT &&
- zend_get_closure(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
+ Z_OBJ_HANDLER_P(function_name, get_closure) &&
+ Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
if (EX(object)) {
Z_ADDREF_P(EX(object));
}
@@ -1189,7 +1192,8 @@
function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
if (Z_TYPE_P(function_name) == IS_OBJECT &&
- zend_get_closure(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
+ Z_OBJ_HANDLER_P(function_name, get_closure) &&
+ Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object), NULL TSRMLS_CC) == SUCCESS) {
if (EX(object)) {
Z_ADDREF_P(EX(object));
}