cvs: ZendEngine2(PHP_5_3) / zend_closures.c zend_closures.h /tests closure_022.phpt

"Dmitry Stogov" <[email protected]>
Newsgroups gmane.comp.php.cvs.zend
Message-ID <cvsdmitry1218444540@cvsserver>
dmitry		Mon Aug 11 08:49:00 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /ZendEngine2	zend_closures.c zend_closures.h 
    /ZendEngine2/tests	closure_022.phpt 
  Log:
  - Made closures implementation reflection friendly (Christian)
  - Changed E_ERROR(s) into E_RECOVERABLE_ERROR(s) (Marcus)
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_closures.c?r1=1.3.2.10&r2=1.3.2.11&diff_format=u
Index: ZendEngine2/zend_closures.c
diff -u ZendEngine2/zend_closures.c:1.3.2.10 ZendEngine2/zend_closures.c:1.3.2.11
--- ZendEngine2/zend_closures.c:1.3.2.10	Thu Aug  7 13:35:51 2008
+++ ZendEngine2/zend_closures.c	Mon Aug 11 08:49:00 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_closures.c,v 1.3.2.10 2008/08/07 13:35:51 dmitry Exp $ */
+/* $Id: zend_closures.c,v 1.3.2.11 2008/08/11 08:49:00 dmitry Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -26,11 +26,10 @@
 #include "zend_objects_API.h"
 #include "zend_globals.h"
 
-#define ZEND_INVOKE_FUNC_NAME "__invoke"
 #define ZEND_CLOSURE_PRINT_NAME "Closure object"
 
 #define ZEND_CLOSURE_PROPERTY_ERROR() \
-	zend_error(E_ERROR, "Closure object cannot have properties")
+	zend_error(E_RECOVERABLE_ERROR, "Closure object cannot have properties")
 
 typedef struct _zend_closure {
 	zend_object    std;
@@ -38,7 +37,8 @@
 	zval          *this_ptr;
 } zend_closure;
 
-static zend_class_entry *zend_ce_closure;
+/* non-static since it needs to be referenced */
+ZEND_API zend_class_entry *zend_ce_closure;
 static zend_object_handlers closure_handlers;
 
 ZEND_METHOD(Closure, __invoke) /* {{{ */
@@ -50,7 +50,7 @@
 	arguments = emalloc(sizeof(zval**) * ZEND_NUM_ARGS());
 	if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
 		efree(arguments);
-		zend_error(E_ERROR, "Cannot get arguments for calling closure");
+		zend_error(E_RECOVERABLE_ERROR, "Cannot get arguments for calling closure");
 		RETVAL_FALSE;
 	} else if (call_user_function_ex(CG(function_table), NULL, this_ptr, &closure_result_ptr, ZEND_NUM_ARGS(), arguments, 1, NULL TSRMLS_CC) == FAILURE) {
 		RETVAL_FALSE;
@@ -74,21 +74,21 @@
 
 static zend_function *zend_closure_get_constructor(zval *object TSRMLS_DC) /* {{{ */
 {
-	zend_error(E_ERROR, "Instantiation of 'Closure' is not allowed");
+	zend_error(E_RECOVERABLE_ERROR, "Instantiation of 'Closure' is not allowed");
 	return NULL;
 }
 /* }}} */
 
 static int zend_closure_serialize(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC) /* {{{ */
 {
-	zend_error(E_ERROR, "Serialization of 'Closure' is not allowed");
+	zend_error(E_RECOVERABLE_ERROR, "Serialization of 'Closure' is not allowed");
 	return FAILURE;
 }
 /* }}} */
 
 static int zend_closure_unserialize(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC) /* {{{ */
 {
-	zend_error(E_ERROR, "Unserialization of 'Closure' is not allowed");
+	zend_error(E_RECOVERABLE_ERROR, "Unserialization of 'Closure' is not allowed");
 	return FAILURE;
 }
 /* }}} */
@@ -99,6 +99,23 @@
 }
 /* }}} */
 
+ZEND_API zend_function *zend_get_closure_invoke_method(zval *obj TSRMLS_DC) /* {{{ */
+{
+	zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);	
+	zend_function *invoke = (zend_function*)emalloc(sizeof(zend_function));
+
+	invoke->common = closure->func.common;
+	invoke->type = ZEND_INTERNAL_FUNCTION;
+	invoke->internal_function.fn_flags = ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER;
+	invoke->internal_function.handler = ZEND_MN(Closure___invoke);
+	invoke->internal_function.module = 0;
+	invoke->internal_function.scope = zend_ce_closure;
+	invoke->internal_function.function_name = estrndup(ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1);
+	return invoke;
+	
+}
+/* }}} */
+
 static zend_function *zend_closure_get_method(zval **object_ptr, char *method_name, int method_len TSRMLS_DC) /* {{{ */
 {
 	char *lc_name;
@@ -109,18 +126,8 @@
 	if ((method_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) &&
 		memcmp(lc_name, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1) == 0
 	) {
-		zend_closure *closure = (zend_closure *)zend_object_store_get_object(*object_ptr TSRMLS_CC);
-		zend_function *invoke = (zend_function*)emalloc(sizeof(zend_function));
-
-		invoke->common = closure->func.common;
-		invoke->type = ZEND_INTERNAL_FUNCTION;
-		invoke->internal_function.fn_flags = ZEND_ACC_CALL_VIA_HANDLER;
-		invoke->internal_function.handler = ZEND_MN(Closure___invoke);
-		invoke->internal_function.module = 0;
-		invoke->internal_function.scope = zend_ce_closure;
-		invoke->internal_function.function_name = estrndup(ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1);
 		free_alloca(lc_name, use_heap);
-		return invoke;
+		return zend_get_closure_invoke_method(*object_ptr TSRMLS_CC);
 	}
 	free_alloca(lc_name, use_heap);
 	return NULL;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_closures.h?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: ZendEngine2/zend_closures.h
diff -u ZendEngine2/zend_closures.h:1.1.2.2 ZendEngine2/zend_closures.h:1.1.2.3
--- ZendEngine2/zend_closures.h:1.1.2.2	Mon Jul 14 09:48:59 2008
+++ ZendEngine2/zend_closures.h	Mon Aug 11 08:49:00 2008
@@ -17,17 +17,22 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_closures.h,v 1.1.2.2 2008/07/14 09:48:59 dmitry Exp $ */
+/* $Id: zend_closures.h,v 1.1.2.3 2008/08/11 08:49:00 dmitry Exp $ */
 
 #ifndef ZEND_CLOSURES_H
 #define ZEND_CLOSURES_H
 
 BEGIN_EXTERN_C()
 
+#define ZEND_INVOKE_FUNC_NAME "__invoke"
+
 void zend_register_closure_ce(TSRMLS_D);
 
+extern ZEND_API zend_class_entry *zend_ce_closure;
+
 ZEND_API void zend_create_closure(zval *res, zend_function *op_array, zend_class_entry *scope, zval *this_ptr TSRMLS_DC);
 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);
+ZEND_API zend_function *zend_get_closure_invoke_method(zval *obj TSRMLS_DC);
 
 END_EXTERN_C()
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/closure_022.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: ZendEngine2/tests/closure_022.phpt
diff -u ZendEngine2/tests/closure_022.phpt:1.1.2.2 ZendEngine2/tests/closure_022.phpt:1.1.2.3
--- ZendEngine2/tests/closure_022.phpt:1.1.2.2	Tue Jul 22 07:29:31 2008
+++ ZendEngine2/tests/closure_022.phpt	Mon Aug 11 08:49:00 2008
@@ -8,5 +8,5 @@
 $foo->a = 1;
 ?>
 --EXPECTF--
-Fatal error: Closure object cannot have properties in %sclosure_022.php on line 5
+Catchable fatal error: Closure object cannot have properties in %sclosure_022.php on line 5
 



-- 
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
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.