summaryrefslogtreecommitdiff
path: root/Zend/zend_closures.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-06-16 13:29:17 +0300
committerDmitry Stogov <dmitry@zend.com>2015-06-16 13:29:17 +0300
commit3180b8e100285e5bd9088e9981608dfd14f6ff27 (patch)
treea6f6318962ed0ee36b5b6b03a7cdad636fb7268c /Zend/zend_closures.c
parented84bff44569d3b7e2f79255208e69bbe755d6a9 (diff)
downloadphp-git-3180b8e100285e5bd9088e9981608dfd14f6ff27.tar.gz
Fixed bug #69802 (Reflection on Closure::__invoke borks type hint class name) (onr more problem)
Diffstat (limited to 'Zend/zend_closures.c')
-rw-r--r--Zend/zend_closures.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 2d38fb2f4c..b28810a236 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -214,7 +214,11 @@ ZEND_API zend_function *zend_get_closure_invoke_method(zend_object *object) /* {
* ZEND_ACC_USER_ARG_INFO flag to prevent invalid usage by Reflection */
invoke->type = ZEND_INTERNAL_FUNCTION;
invoke->internal_function.fn_flags =
- ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER | ZEND_ACC_USER_ARG_INFO | (closure->func.common.fn_flags & keep_flags);
+ ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER | (closure->func.common.fn_flags & keep_flags);
+ if (closure->func.type != ZEND_INTERNAL_FUNCTION || (closure->func.common.fn_flags & ZEND_ACC_USER_ARG_INFO)) {
+ invoke->internal_function.fn_flags |=
+ ZEND_ACC_USER_ARG_INFO;
+ }
invoke->internal_function.handler = ZEND_MN(Closure___invoke);
invoke->internal_function.module = 0;
invoke->internal_function.scope = zend_ce_closure;
@@ -488,7 +492,7 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
closure = (zend_closure *)Z_OBJ_P(res);
- closure->func = *func;
+ memcpy(&closure->func, func, func->type == ZEND_USER_FUNCTION ? sizeof(zend_op_array) : sizeof(zend_internal_function));
closure->func.common.prototype = (zend_function*)closure;
closure->func.common.fn_flags |= ZEND_ACC_CLOSURE;