mirror of
https://github.com/php/php-src.git
synced 2025-08-20 09:24:05 +02:00
Fixed bug #60139 (Anonymous functions create cycles not detected by the GC)
This commit is contained in:
parent
8b4890e18e
commit
e95bb57da9
3 changed files with 45 additions and 0 deletions
2
NEWS
2
NEWS
|
@ -3,6 +3,8 @@ PHP NEWS
|
||||||
?? ??? 2011, PHP 5.3.9
|
?? ??? 2011, PHP 5.3.9
|
||||||
|
|
||||||
- Core:
|
- Core:
|
||||||
|
. Fixed bug #60139 (Anonymous functions create cycles not detected by the
|
||||||
|
GC). (Dmitry)
|
||||||
. Fixed bug #60120 (proc_open's streams may hang with stdin/out/err when
|
. Fixed bug #60120 (proc_open's streams may hang with stdin/out/err when
|
||||||
the data exceeds or is equal to 2048 bytes). (Pierre, Pascal Borreli)
|
the data exceeds or is equal to 2048 bytes). (Pierre, Pascal Borreli)
|
||||||
. Fixed bug #60019 (Function time_nanosleep() is undefined on OS X). (Ilia)
|
. Fixed bug #60019 (Function time_nanosleep() is undefined on OS X). (Ilia)
|
||||||
|
|
30
Zend/tests/bug60139.phpt
Normal file
30
Zend/tests/bug60139.phpt
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #60139 (Anonymous functions create cycles not detected by the GC)
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class Foo {
|
||||||
|
public $x;
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$this->x = function() {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Bar {
|
||||||
|
public $x;
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$self = $this;
|
||||||
|
$this->x = function() use ($self) {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gc_collect_cycles();
|
||||||
|
new Foo;
|
||||||
|
var_dump(gc_collect_cycles());
|
||||||
|
new Bar;
|
||||||
|
var_dump(gc_collect_cycles());
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
int(0)
|
||||||
|
int(2)
|
|
@ -280,6 +280,18 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp TSRMLS_
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
static HashTable *zend_closure_get_properties(zval *obj TSRMLS_DC) /* {{{ */
|
||||||
|
{
|
||||||
|
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
|
||||||
|
|
||||||
|
if (GC_G(gc_active)) {
|
||||||
|
return (closure->func.type == ZEND_USER_FUNCTION) ? closure->func.op_array.static_variables : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return closure->std.properties;
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
/* {{{ proto Closure::__construct()
|
/* {{{ proto Closure::__construct()
|
||||||
Private constructor preventing instantiation */
|
Private constructor preventing instantiation */
|
||||||
ZEND_METHOD(Closure, __construct)
|
ZEND_METHOD(Closure, __construct)
|
||||||
|
@ -316,6 +328,7 @@ void zend_register_closure_ce(TSRMLS_D) /* {{{ */
|
||||||
closure_handlers.clone_obj = NULL;
|
closure_handlers.clone_obj = NULL;
|
||||||
closure_handlers.get_debug_info = zend_closure_get_debug_info;
|
closure_handlers.get_debug_info = zend_closure_get_debug_info;
|
||||||
closure_handlers.get_closure = zend_closure_get_closure;
|
closure_handlers.get_closure = zend_closure_get_closure;
|
||||||
|
closure_handlers.get_properties = zend_closure_get_properties;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue