- 添加多层级跳转标志变量 _brk_flag 和 _cnt_flag - 在循环结束处插入跳转标志检查代码 - 将 switch 语句包装在 do-while(0) 中以支持多层级跳转 - 实现 break N 和 continue N 的计数器递减逻辑 - 添加测试用例覆盖多层嵌套循环和 switch 语句场景 - 支持最多 N 层的跳转指令解析和编译pull/1/head
parent
d51b8411e2
commit
e208fe11bb
5 changed files with 154 additions and 15 deletions
@ -1,20 +1,112 @@ |
||||
--TEST-- |
||||
Break and continue with numeric levels |
||||
--SKIPIF-- |
||||
<?php |
||||
echo "skip Break/continue with levels > 1 not supported in AOT"; |
||||
?> |
||||
--FILE-- |
||||
<?php |
||||
// break 2 |
||||
|
||||
// break 2 from nested for |
||||
for ($i = 0; $i < 3; $i++) { |
||||
for ($j = 0; $j < 3; $j++) { |
||||
if ($i == 1 && $j == 2) { |
||||
break 2; |
||||
} |
||||
} |
||||
} |
||||
echo "break-2-for: done\n"; |
||||
|
||||
// continue 2 from nested for |
||||
for ($i = 0; $i < 3; $i++) { |
||||
for ($j = 0; $j < 3; $j++) { |
||||
if ($i == 1 && $j == 1) { |
||||
continue 2; |
||||
} |
||||
} |
||||
} |
||||
echo "continue-2-for: done\n"; |
||||
|
||||
// break 2 from nested while |
||||
$i = 0; |
||||
while ($i < 3) { |
||||
$j = 0; |
||||
while ($j < 3) { |
||||
if ($i == 1 && $j == 2) { |
||||
break 2; |
||||
} |
||||
$j++; |
||||
} |
||||
$i++; |
||||
} |
||||
echo "break-2-while: done\n"; |
||||
|
||||
// continue 2 from nested while |
||||
$i = 0; |
||||
while ($i < 3) { |
||||
$j = 0; |
||||
while ($j < 3) { |
||||
$j++; |
||||
if ($i == 1 && $j == 2) { |
||||
continue 2; |
||||
} |
||||
} |
||||
$i++; |
||||
} |
||||
echo "continue-2-while: done\n"; |
||||
|
||||
// break 2 from nested do-while |
||||
$i = 0; |
||||
do { |
||||
$j = 0; |
||||
do { |
||||
if ($i == 1 && $j == 2) { |
||||
break 2; |
||||
} |
||||
$j++; |
||||
} while ($j < 3); |
||||
$i++; |
||||
} while ($i < 3); |
||||
echo "break-2-do-while: done\n"; |
||||
|
||||
// continue 3 from triple-nested for |
||||
for ($a = 0; $a < 2; $a++) { |
||||
for ($b = 0; $b < 2; $b++) { |
||||
for ($c = 0; $c < 2; $c++) { |
||||
if ($a == 0 && $b == 1 && $c == 0) { |
||||
continue 3; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
echo "continue-3-for: done\n"; |
||||
|
||||
// break 3 from triple-nested for |
||||
for ($a = 0; $a < 2; $a++) { |
||||
for ($b = 0; $b < 2; $b++) { |
||||
for ($c = 0; $c < 2; $c++) { |
||||
if ($a == 0 && $b == 1 && $c == 0) { |
||||
break 3; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
echo "break-3-for: done\n"; |
||||
|
||||
// break 2 from switch inside for |
||||
for ($i = 0; $i < 3; $i++) { |
||||
switch ($i) { |
||||
case 1: |
||||
break 2; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
echo "done\n"; |
||||
echo "break-2-switch: done\n"; |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
done |
||||
break-2-for: done |
||||
continue-2-for: done |
||||
break-2-while: done |
||||
continue-2-while: done |
||||
break-2-do-while: done |
||||
continue-3-for: done |
||||
break-3-for: done |
||||
break-2-switch: done |
||||
|
||||
Loading…
Reference in new issue