]> granicus.if.org Git - php/commitdiff
- MFH - Set scope when copying a closure with a new this pointer.
authorMarcus Boerger <helly@php.net>
Sun, 4 Jan 2009 14:23:29 +0000 (14:23 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 4 Jan 2009 14:23:29 +0000 (14:23 +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 03a0e8516f56cdf833a0ceb05408f4d3ff99d3e7..a069fd3a52010036bd34f7d29ac488fb171a363e 100644 (file)
@@ -130,6 +130,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;
 }