Arquivos
hhvm/hphp/test/vm/exception_bug_2080454.php
T
jdelong 4797536f9d Fix a bug when throwing from nested FPI regions
Since we now use the original throw location to figure out
which EHEnt applies when propagating from a fault funclet, we need to
check whether we've already unwound the ActRec before doing it again.
Doing it again could cause issues with nested FPI regions (hitting an
assert in sandboxes).
2013-02-11 03:44:06 -08:00

67 linhas
1.3 KiB
PHP

<?php
class Dtor {
public function __destruct() {
echo "dtor\n";
}
}
$ar = array(1,3,2);
//////////////////////////////////////////////////////////////////////
// Exception test cases with fault funclets and nested FPI regions of
// various complexity.
function func() {
}
function blar() {
throw new Exception("Hi");
}
function foo() {
global $ar;
foreach ($ar as $y) {
func(blar($y));
echo "wat\n";
}
try {} catch (Exception $x) { echo "Bad\n"; }
}
function case1() { foo(); }
function foo2() {
global $ar;
foreach ($ar as $y) {
func(12, new Dtor(), mt_rand(), blar($y) ? 1024 : -1);
}
try {} catch (Exception $x) { echo "Bad\n"; }
}
function case2() { foo2(); }
function foo3() {
global $ar;
foreach ($ar as $y) {
func(12, new Dtor(), mt_rand(), func(blar($y)));
}
try {} catch (Exception $x) { echo "Bad\n"; }
}
function case3() { foo3(); }
function foo4() {
global $ar;
foreach ($ar as $y) {
func(12, new Dtor(), mt_rand(), func(mt_rand(), blar($y)));
}
try {} catch (Exception $x) { echo "Bad\n"; }
}
function case4() { foo3(); }
try { case1(); } catch (Exception $x) { echo "Good1\n"; }
try { case2(); } catch (Exception $x) { echo "Good2\n"; }
try { case3(); } catch (Exception $x) { echo "Good3\n"; }
try { case4(); } catch (Exception $x) { echo "Good4\n"; }
echo "Done\n";