summaryrefslogtreecommitdiff
path: root/ext/spl/tests/bug31185.phpt
diff options
context:
space:
mode:
Diffstat (limited to 'ext/spl/tests/bug31185.phpt')
-rw-r--r--ext/spl/tests/bug31185.phpt61
1 files changed, 61 insertions, 0 deletions
diff --git a/ext/spl/tests/bug31185.phpt b/ext/spl/tests/bug31185.phpt
new file mode 100644
index 0000000..aa410eb
--- /dev/null
+++ b/ext/spl/tests/bug31185.phpt
@@ -0,0 +1,61 @@
+--TEST--
+Bug #31185 (Crash when exceptions thrown from ArrayAccess::offsetUnset())
+--FILE--
+<?php
+
+class FooBar implements ArrayAccess {
+ private $array = array();
+
+ public function offsetExists($index) {
+ return isset($this->array[$index]);
+ }
+
+ public function offsetGet($index) {
+ return $this->array[$index];
+ }
+
+ public function offsetSet($index, $value) {
+ echo __METHOD__ . "($index, $value)\n";
+ $this->array[$index] = $value;
+ }
+
+ public function offsetUnset($index) {
+ throw new Exception('FAIL');
+ unset($this->array[$index]);
+ }
+
+}
+
+$i = 0; $j = 0;
+$foo = new FooBar();
+$foo[$j++] = $i++;
+$foo[$j++] = $i++;
+$foo[$j++] = $i++;
+try
+{
+ unset($foo[1]);
+}
+catch (Exception $e)
+{
+ echo "CAUGHT: " . $e->getMessage() . "\n";
+}
+
+print_R($foo);
+?>
+===DONE===
+--EXPECT--
+FooBar::offsetSet(0, 0)
+FooBar::offsetSet(1, 1)
+FooBar::offsetSet(2, 2)
+CAUGHT: FAIL
+FooBar Object
+(
+ [array:FooBar:private] => Array
+ (
+ [0] => 0
+ [1] => 1
+ [2] => 2
+ )
+
+)
+===DONE===