cvs: ZendEngine2 / zend_closures.c zend_closures.h /tests closure_022.phpt

From: Date: Mon, 11 Aug 2008 08:49:14 +0000
Subject: cvs: ZendEngine2 / zend_closures.c zend_closures.h /tests closure_022.phpt
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-7017@lists.php.net to get a copy of this message
dmitry Mon Aug 11 08:49:14 2008 UTC Modified files: /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.11&r2=1.12&diff_format=u Index: ZendEngine2/zend_closures.c diff -u ZendEngine2/zend_closures.c:1.11 ZendEngine2/zend_closures.c:1.12 --- ZendEngine2/zend_closures.c:1.11 Thu Aug 7 13:36:13 2008 +++ ZendEngine2/zend_closures.c Mon Aug 11 08:49:14 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_closures.c,v 1.11 2008/08/07 13:36:13 dmitry Exp $ */ +/* $Id: zend_closures.c,v 1.12 2008/08/11 08:49:14 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,7 @@ zval *this_ptr; } zend_closure; -static zend_class_entry *zend_ce_closure; +ZEND_API zend_class_entry *zend_ce_closure; static zend_object_handlers closure_handlers; ZEND_METHOD(Closure, __invoke) /* {{{ */ @@ -50,7 +49,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 +73,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, int *type, zstr *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, int type, const zstr 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 +98,26 @@ } /* }}} */ +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; + if (UG(unicode)) { + invoke->internal_function.function_name.u = USTR_MAKE(ZEND_INVOKE_FUNC_NAME); + } else { + invoke->internal_function.function_name.s = estrndup(ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1); + } + return invoke; +} +/* }}} */ + static zend_function *zend_closure_get_method(zval **object_ptr, zstr method_name, int method_len TSRMLS_DC) /* {{{ */ { unsigned int lc_name_len; @@ -110,22 +129,8 @@ if ((lc_name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (ZEND_U_EQUAL(type, lc_name, lc_name_len, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1)) ) { - 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; - if (UG(unicode)) { - invoke->internal_function.function_name.u = USTR_MAKE(ZEND_INVOKE_FUNC_NAME); - } else { - invoke->internal_function.function_name.s = estrndup(ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1); - } efree(lc_name.v); - return invoke; + return zend_get_closure_invoke_method(*object_ptr TSRMLS_CC); } efree(lc_name.v); return NULL; http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_closures.h?r1=1.1&r2=1.2&diff_format=u Index: ZendEngine2/zend_closures.h diff -u ZendEngine2/zend_closures.h:1.1 ZendEngine2/zend_closures.h:1.2 --- ZendEngine2/zend_closures.h:1.1 Tue Jul 8 07:05:03 2008 +++ ZendEngine2/zend_closures.h Mon Aug 11 08:49:14 2008 @@ -17,17 +17,22 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_closures.h,v 1.1 2008/07/08 07:05:03 dmitry Exp $ */ +/* $Id: zend_closures.h,v 1.2 2008/08/11 08:49:14 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&r2=1.2&diff_format=u Index: ZendEngine2/tests/closure_022.phpt diff -u ZendEngine2/tests/closure_022.phpt:1.1 ZendEngine2/tests/closure_022.phpt:1.2 --- ZendEngine2/tests/closure_022.phpt:1.1 Tue Jul 22 07:29:14 2008 +++ ZendEngine2/tests/closure_022.phpt Mon Aug 11 08:49:14 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

« previous php.zend-engine.cvs (#7017) next »