- 添加多层级跳转标志变量 _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-- |
--TEST-- |
||||||
Break and continue with numeric levels |
Break and continue with numeric levels |
||||||
--SKIPIF-- |
|
||||||
<?php |
|
||||||
echo "skip Break/continue with levels > 1 not supported in AOT"; |
|
||||||
?> |
|
||||||
--FILE-- |
--FILE-- |
||||||
<?php |
<?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 ($i = 0; $i < 3; $i++) { |
||||||
for ($j = 0; $j < 3; $j++) { |
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) { |
if ($i == 1 && $j == 2) { |
||||||
break 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-- |
--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