cvs: ZendEngine2 / 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 <cvscolder1218749166@cvsserver>
colder		Thu Aug 14 21:26:06 2008 UTC

  Modified files:              
    /ZendEngine2	zend_API.c zend_closures.c zend_object_handlers.c 
                	zend_object_handlers.h zend_vm_def.h zend_vm_execute.h 
  Log:
  Handlerify get_closure

-- 
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
colder-20080814212606.txt (text/plain, 11.5 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.c?r1=1.487&r2=1.488&diff_format=u
Index: ZendEngine2/zend_API.c
diff -u ZendEngine2/zend_API.c:1.487 ZendEngine2/zend_API.c:1.488
--- ZendEngine2/zend_API.c:1.487	Wed Aug 13 16:19:28 2008
+++ ZendEngine2/zend_API.c	Thu Aug 14 21:26:05 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_API.c,v 1.487 2008/08/13 16:19:28 felipe Exp $ */
+/* $Id: zend_API.c,v 1.488 2008/08/14 21:26:05 colder Exp $ */
 
 #include "zend.h"
 #include "zend_execute.h"
@@ -3238,7 +3238,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.12&r2=1.13&diff_format=u
Index: ZendEngine2/zend_closures.c
diff -u ZendEngine2/zend_closures.c:1.12 ZendEngine2/zend_closures.c:1.13
--- ZendEngine2/zend_closures.c:1.12	Mon Aug 11 08:49:14 2008
+++ ZendEngine2/zend_closures.c	Thu Aug 14 21:26:05 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_closures.c,v 1.12 2008/08/11 08:49:14 dmitry Exp $ */
+/* $Id: zend_closures.c,v 1.13 2008/08/14 21:26:05 colder Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -212,6 +212,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;
@@ -233,6 +265,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;
 }
 /* }}} */
 
@@ -310,74 +343,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) /* {{{ */
-{
-	zstr key;
-	zend_uchar utype = UG(unicode)?IS_UNICODE:IS_STRING;
-
-	if (utype == IS_UNICODE) {
-		key.u = USTR_MAKE(ZEND_INVOKE_FUNC_NAME);
-	} else {
-		key.s = ZEND_INVOKE_FUNC_NAME;
-	}
-
-	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;
-			}
-			if (utype == IS_UNICODE) {
-				efree(key.u);
-			}
-			return SUCCESS;
-		} else if (zend_u_hash_find(&ce->function_table, utype, key, 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;
-				}
-			}
-			if (utype == IS_UNICODE) {
-				efree(key.u);
-			}
-			return SUCCESS;
-		}
-	}
-	if (utype == IS_UNICODE) {
-		efree(key.u);
-	}
-	return FAILURE;
-}
-/* }}} */
 
 /*
  * Local variables:
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.c?r1=1.204&r2=1.205&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.204 ZendEngine2/zend_object_handlers.c:1.205
--- ZendEngine2/zend_object_handlers.c:1.204	Tue Aug 12 17:15:59 2008
+++ ZendEngine2/zend_object_handlers.c	Thu Aug 14 21:26:05 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_object_handlers.c,v 1.204 2008/08/12 17:15:59 felipe Exp $ */
+/* $Id: zend_object_handlers.c,v 1.205 2008/08/14 21:26:05 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
 
@@ -1309,6 +1310,56 @@
 }
 /* }}} */
 
+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) /* {{{ */
+{
+	zstr key;
+	zend_uchar utype = UG(unicode)?IS_UNICODE:IS_STRING;
+	zend_class_entry *ce;
+
+	if (Z_TYPE_P(obj) != IS_OBJECT) {
+		return FAILURE;
+	}
+
+	ce = Z_OBJCE_P(obj);
+
+	if (utype == IS_UNICODE) {
+		key.u = USTR_MAKE(ZEND_INVOKE_FUNC_NAME);
+	} else {
+		key.s = ZEND_INVOKE_FUNC_NAME;
+	}
+
+	if (zend_u_hash_find(&ce->function_table, utype, key, sizeof(ZEND_INVOKE_FUNC_NAME), (void**)fptr_ptr) == FAILURE) {
+		if (utype == IS_UNICODE) {
+			efree(key.u);
+		}
+		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;
+		}
+	}
+
+	if (utype == IS_UNICODE) {
+		efree(key.u);
+	}
+
+	return SUCCESS;
+}
+/* }}} */
+
 ZEND_API zend_object_handlers std_object_handlers = {
 	zend_objects_store_add_ref,				/* add_ref */
 	zend_objects_store_del_ref,				/* del_ref */
@@ -1334,7 +1385,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.65&r2=1.66&diff_format=u
Index: ZendEngine2/zend_object_handlers.h
diff -u ZendEngine2/zend_object_handlers.h:1.65 ZendEngine2/zend_object_handlers.h:1.66
--- ZendEngine2/zend_object_handlers.h:1.65	Tue Aug 12 17:15:59 2008
+++ ZendEngine2/zend_object_handlers.h	Thu Aug 14 21:26:05 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_object_handlers.h,v 1.65 2008/08/12 17:15:59 felipe Exp $ */
+/* $Id: zend_object_handlers.h,v 1.66 2008/08/14 21:26:05 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.244&r2=1.245&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.244 ZendEngine2/zend_vm_def.h:1.245
--- ZendEngine2/zend_vm_def.h:1.244	Thu Aug 14 10:06:39 2008
+++ ZendEngine2/zend_vm_def.h	Thu Aug 14 21:26:05 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.244 2008/08/14 10:06:39 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.245 2008/08/14 21:26:05 colder Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -2131,7 +2131,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.248&r2=1.249&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.248 ZendEngine2/zend_vm_execute.h:1.249
--- ZendEngine2/zend_vm_execute.h:1.248	Thu Aug 14 10:06:39 2008
+++ ZendEngine2/zend_vm_execute.h	Thu Aug 14 21:26:05 2008
@@ -763,7 +763,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));
 			}
@@ -962,7 +963,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));
 			}
@@ -1049,7 +1051,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));
 			}
@@ -1165,7 +1168,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));
 			}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.