]> granicus.if.org Git - php/commitdiff
Closure::fromCallable(): Use fake closures
authorNikita Popov <nikic@php.net>
Tue, 5 Jul 2016 13:13:36 +0000 (15:13 +0200)
committerNikita Popov <nikic@php.net>
Tue, 5 Jul 2016 13:13:51 +0000 (15:13 +0200)
Zend/tests/closures/closure_from_callable_rebinding.phpt [new file with mode: 0644]
Zend/zend_closures.c

diff --git a/Zend/tests/closures/closure_from_callable_rebinding.phpt b/Zend/tests/closures/closure_from_callable_rebinding.phpt
new file mode 100644 (file)
index 0000000..6fb5c6f
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Testing Closure::fromCallable() functionality: Rebinding
+--FILE--
+<?php
+
+class A {
+    public function method() {
+        var_dump($this);
+    }
+}
+
+class B {
+}
+
+$fn = Closure::fromCallable([new A, 'method']);
+$fn->call(new B);
+
+?>
+--EXPECTF--
+Warning: Cannot bind method A::method() to object of class B in %s on line %d
index 5c5e8a6cb519d3d4d100fc4121ecd4080f2639ee..6185c212a887c00233ceafbc8c6e6faa6011d826 100644 (file)
@@ -295,9 +295,9 @@ static int zend_create_closure_from_callable(zval *return_value, zval *callable,
 
        if (fcc.object) {
                ZVAL_OBJ(&instance, fcc.object);
-               zend_create_closure(return_value, mptr, mptr->common.scope, fcc.object->ce, &instance);
+               zend_create_fake_closure(return_value, mptr, mptr->common.scope, fcc.object->ce, &instance);
        } else {
-               zend_create_closure(return_value, mptr, mptr->common.scope, NULL, NULL);
+               zend_create_fake_closure(return_value, mptr, mptr->common.scope, NULL, NULL);
        }
 
        return SUCCESS;