summaryrefslogtreecommitdiff
path: root/Zend/tests/bug38220.phpt
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-07-26 15:29:27 +0000
committerDmitry Stogov <dmitry@php.net>2006-07-26 15:29:27 +0000
commit30f4d3f9593d3add25510901de3c5811e9a0a2a5 (patch)
tree09526e19e9d5fdba00e1187745ee7d9fae7af641 /Zend/tests/bug38220.phpt
parente1dfc4259f636deae6115a344b3d916c63f0f102 (diff)
downloadphp-git-30f4d3f9593d3add25510901de3c5811e9a0a2a5.tar.gz
Fixed bug #38220 (Crash on some object operations)
Diffstat (limited to 'Zend/tests/bug38220.phpt')
-rwxr-xr-xZend/tests/bug38220.phpt92
1 files changed, 92 insertions, 0 deletions
diff --git a/Zend/tests/bug38220.phpt b/Zend/tests/bug38220.phpt
new file mode 100755
index 0000000000..d64e409778
--- /dev/null
+++ b/Zend/tests/bug38220.phpt
@@ -0,0 +1,92 @@
+--TEST--
+Bug #38220 Crash on some object operations
+--FILE--
+<?php
+class drv {
+ public $obj;
+
+ function func1() {
+ echo "func1(): {$this->obj->i}\n";
+ }
+
+ function close() {
+ echo "close(): {$this->obj->i}\n";
+ }
+}
+
+class A {
+ public $i;
+
+ function __construct($i) {
+ $this->i = $i;
+
+ }
+
+ function __call($method, $args) {
+ $drv = myserv::drv();
+
+ $drv->obj = $this;
+
+ echo "before call $method\n";
+ print_r($this);
+ call_user_func_array(array($drv, $method), $args);
+ echo "after call $method\n";
+
+ // Uncomment this line to work without crash
+// $drv->obj = null;
+ }
+
+ function __destruct() {
+ echo "A::__destruct()\n";
+ $this->close();
+ }
+}
+
+class myserv {
+ private static $drv = null;
+
+ static function drv() {
+ if (is_null(self::$drv))
+ self::$drv = new drv;
+ return self::$drv;
+ }
+}
+
+$obj1 = new A(1);
+$obj1->func1();
+
+$obj2 = new A(2);
+unset($obj1);
+$obj2->func1();
+?>
+--EXPECT--
+before call func1
+A Object
+(
+ [i] => 1
+)
+func1(): 1
+after call func1
+A::__destruct()
+before call close
+A Object
+(
+ [i] => 1
+)
+close(): 1
+after call close
+before call func1
+A Object
+(
+ [i] => 2
+)
+func1(): 1
+after call func1
+A::__destruct()
+before call close
+A Object
+(
+ [i] => 2
+)
+close(): 2
+after call close