summaryrefslogtreecommitdiff
path: root/ext/reflection/php_reflection.c
diff options
context:
space:
mode:
authorFelipe Pena <felipensp@gmail.com>2012-06-22 12:05:55 -0300
committerFelipe Pena <felipensp@gmail.com>2012-06-22 12:05:55 -0300
commit4af92aca872d7463b671c037f9d3b782e22a7c9c (patch)
tree513b8e2ca82f07c0763e78387a956fe875e45509 /ext/reflection/php_reflection.c
parentaf516750ff32f69c1df10155fa8ec0c9cc5b70ff (diff)
parentb8e946b02eac53f46cbfc8eefb5c91fb5b075c9d (diff)
downloadphp-git-4af92aca872d7463b671c037f9d3b782e22a7c9c.tar.gz
Merge branch 'PHP-5.3' into PHP-5.4
* PHP-5.3: - Fixed bug #62384 (Attempting to invoke a Closure more than once causes segfaul)
Diffstat (limited to 'ext/reflection/php_reflection.c')
-rw-r--r--ext/reflection/php_reflection.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 9346587eb7..ab5b15cbd4 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -2923,6 +2923,16 @@ ZEND_METHOD(reflection_method, invokeArgs)
fcc.calling_scope = obj_ce;
fcc.called_scope = intern->ce;
fcc.object_ptr = object;
+
+ /*
+ * Closure::__invoke() actually expects a copy of zend_function, so that it
+ * frees it after the invoking.
+ */
+ if (obj_ce == zend_ce_closure && object &&
+ strlen(mptr->common.function_name) == sizeof(ZEND_INVOKE_FUNC_NAME)-1 &&
+ memcmp(mptr->common.function_name, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1) == 0) {
+ fcc.function_handler = _copy_function(mptr TSRMLS_CC);
+ }
result = zend_call_function(&fci, &fcc TSRMLS_CC);