diff options
Diffstat (limited to 'Examples/test-suite/php/director_finalizer_runme.php')
-rw-r--r-- | Examples/test-suite/php/director_finalizer_runme.php | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/Examples/test-suite/php/director_finalizer_runme.php b/Examples/test-suite/php/director_finalizer_runme.php index 96bb5c179..689f445d2 100644 --- a/Examples/test-suite/php/director_finalizer_runme.php +++ b/Examples/test-suite/php/director_finalizer_runme.php @@ -1,19 +1,23 @@ <?php require "tests.php"; -require "director_finalizer.php"; -// No new functions -check::functions(array('foo_orstatus','deletefoo','getstatus','launder','resetstatus')); -// No new classes +// New functions +check::functions(array('deleteFoo','getStatus','launder','resetStatus')); +// New classes check::classes(array('director_finalizer','Foo')); -// now new vars +// No new vars check::globals(array()); class MyFoo extends Foo { function __destruct() { - $this->orStatus(2); - if (method_exists(get_parent_class(), "__destruct")) { + # It's not safe to call methods on the C++ object from the PHP destructor + # if the object has been disowned, since the C++ object will already have + # been destroyed by the time the PHP destructor runs. + if ($this->thisown) { + $this->orStatus(2); + } + if (method_exists(parent::class, "__destruct")) { parent::__destruct(); } } @@ -41,21 +45,24 @@ resetStatus(); $a = new MyFoo(); $a->thisown = 0; +check::equal(getStatus(), 0, "shadow release does not fire destructor of disowned object"); + deleteFoo($a); unset($a); -check::equal(getStatus(), 3, "getStatus() failed #4"); +# getStatus() would ideally return 3 here. +check::equal(getStatus(), 1, "getStatus() failed #4"); resetStatus(); $a = new MyFoo(); $a->thisown = 0; -deleteFoo(launder($a)); +$g = launder($a); unset($a); - -check::equal(getStatus(), 3, "getStatus() failed #5"); +deleteFoo($g); +# getStatus() would ideally return 3 here. +check::equal(getStatus(), 1, "getStatus() failed #5"); resetStatus(); check::done(); -?> |