aboutsummaryrefslogtreecommitdiff
path: root/Examples/test-suite/php/director_finalizer_runme.php
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/php/director_finalizer_runme.php')
-rw-r--r--Examples/test-suite/php/director_finalizer_runme.php31
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();
-?>