]> granicus.if.org Git - php/commitdiff
- Set scope when copying a closure with a new this pointer.
authorMarcus Boerger <helly@php.net>
Sun, 4 Jan 2009 14:22:51 +0000 (14:22 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 4 Jan 2009 14:22:51 +0000 (14:22 +0000)
Zend/tests/closure_036.phpt [new file with mode: 0755]
Zend/zend_closures.c

diff --git a/Zend/tests/closure_036.phpt b/Zend/tests/closure_036.phpt
new file mode 100755 (executable)
index 0000000..301f860
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Closure 036: Rebinding closure $this on property access, using scope
+--FILE--
+<?php
+
+$instance = 0;
+
+class Test {
+       private $value = 42;
+       function __construct() {
+               global $instance;
+               $this->instance = ++$instance;
+       }
+}
+
+$o = new Test;
+$o->func = function () {
+       var_dump($this->value);
+};
+$func = $o->func;
+$func();
+
+var_dump($instance);
+?>
+===DONE===
+--EXPECTF--
+int(42)
+int(1)
+===DONE===
\ No newline at end of file
index e137bbd46158404df99c01579e0452db0fbad702..aa4ff213794e2493ce99bdd96af36dbff4665aa6 100644 (file)
@@ -134,6 +134,9 @@ ZEND_API zval* zend_closure_copy(zval *closure_obj, zval *this_ptr TSRMLS_DC) /*
        closure->this_ptr = this_ptr;
        if (this_ptr) {
                Z_ADDREF_P(this_ptr);
+               closure->func.common.scope = Z_OBJCE_P(this_ptr);
+       } else {
+               closure->func.common.scope = NULL;
        }
        return closure_obj;
 }