fix(ir): break/continue IR üretimi — döngü bağlamı yığını (B3)
Sorun: break ve continue için hiçbir opcode üretilmiyordu (TODO).
Düzeltme: her döngüye girerken LoopContext yığına push'lanır, çıkınca
pop'lanır. break/continue JMP -1 yazar, instruction indeksi bağlamda
toplanır. Döngü üretimi bitince tüm pending jump'lar doğru hedefe patch'lenir:
- break → her döngü türünde OUT (döngü sonu)
- continue while/do-while → LOOP_START / COND_LABEL
- continue for → C_LABEL (güncelleme başı, koşula DEĞİL)
(aksi halde i++ atlanır → sonsuz döngü)
İç içe döngülerde yığının en üstü en içteki bağlamdır; inner break/continue
dıştaki döngüyü etkilemez.
Testler (16/16 yeşil):
- for_break_continue: continue'nun i++'ı atlamadığını kanıtlar
- while_break_continue: while break/continue
- nested_break: inner break dış döngüyü etkilemiyor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
8509d09ca8
commit
450f16008f
Binary file not shown.
|
|
@ -10,15 +10,15 @@
|
|||
3695 10921 1781873519336910172 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o 3c8869307381c930
|
||||
9 9708 1781873515651752771 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o 5cc8b697133bcf64
|
||||
9 7206 1781873515651861333 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o c3d262615ede4c95
|
||||
9 12161 1781873515651633537 CMakeFiles/saqut.dir/src/main.cpp.o 3cfef7a665d5bf87
|
||||
2668 2910 1781873910588652263 saqut f2e198803c4dbffb
|
||||
0 22 1781873935785536816 build.ninja 1876a59d627a585
|
||||
0 22 1781873935784601625 /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake 1876a59d627a585
|
||||
9 4452 1781874491015670524 CMakeFiles/saqut.dir/src/main.cpp.o 3cfef7a665d5bf87
|
||||
4452 4694 1781874495457230305 saqut f2e198803c4dbffb
|
||||
0 22 1781874572087843675 build.ninja 1876a59d627a585
|
||||
0 22 1781874572087777897 /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake 1876a59d627a585
|
||||
8261 13474 1781873523902721486 CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o ec4e483b8ddb4007
|
||||
5962 11851 1781873521603816495 CMakeFiles/saqut.dir/src/semantic/structural_validator.cpp.o 248faa3675024351
|
||||
7206 12730 1781873522847765087 CMakeFiles/saqut.dir/src/semantic/type_checker.cpp.o b29c133293d988b0
|
||||
9874 11363 1781873525515654821 CMakeFiles/saqut.dir/src/vm/interpreter.cpp.o b7dd80e002d68a1d
|
||||
9 1858 1781873515651218159 CMakeFiles/saqut.dir/src/ir/ir_function.cpp.o 10f5e8dfd1461d69
|
||||
9 1821 1781873515651428931 CMakeFiles/saqut.dir/src/ir/ir_program.cpp.o 9518231d970828da
|
||||
9 2668 1781873907929763121 CMakeFiles/saqut.dir/src/ir/ir_generator.cpp.o 10a1ed4e1f52e530
|
||||
1 8 1781873907921763454 /home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/cmake.verify_globs 1813c41e0f312d7e
|
||||
9 2803 1781874491014415953 CMakeFiles/saqut.dir/src/ir/ir_generator.cpp.o 10a1ed4e1f52e530
|
||||
0 8 1781874491005416329 /home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/cmake.verify_globs 1813c41e0f312d7e
|
||||
|
|
|
|||
|
|
@ -11,6 +11,9 @@ set(OLD_GLOB
|
|||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/basic.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_once.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_truthy.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/for_break_continue.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/nested_break.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/while_break_continue.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/folding.sqt"
|
||||
"/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/run_opt.sqt"
|
||||
|
|
|
|||
|
|
@ -20,6 +20,12 @@ add_test(golden_loops_do_while_once "/usr/bin/cmake" "-DBINARY=/home/saqut/Masa
|
|||
set_tests_properties(golden_loops_do_while_once PROPERTIES _BACKTRACE_TRIPLES "/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;51;add_test;/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;0;")
|
||||
add_test(golden_loops_do_while_truthy "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_truthy.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_truthy.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake")
|
||||
set_tests_properties(golden_loops_do_while_truthy PROPERTIES _BACKTRACE_TRIPLES "/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;51;add_test;/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;0;")
|
||||
add_test(golden_loops_for_break_continue "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/for_break_continue.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/for_break_continue.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake")
|
||||
set_tests_properties(golden_loops_for_break_continue PROPERTIES _BACKTRACE_TRIPLES "/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;51;add_test;/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;0;")
|
||||
add_test(golden_loops_nested_break "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/nested_break.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/nested_break.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake")
|
||||
set_tests_properties(golden_loops_nested_break PROPERTIES _BACKTRACE_TRIPLES "/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;51;add_test;/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;0;")
|
||||
add_test(golden_loops_while_break_continue "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/while_break_continue.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/while_break_continue.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake")
|
||||
set_tests_properties(golden_loops_while_break_continue PROPERTIES _BACKTRACE_TRIPLES "/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;51;add_test;/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;0;")
|
||||
add_test(golden_opt_dce_ir_opt "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.ir_opt.expected" "-DCOMMAND=ir" "-DOPTIMIZED=1" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake")
|
||||
set_tests_properties(golden_opt_dce_ir_opt PROPERTIES _BACKTRACE_TRIPLES "/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;64;add_test;/home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt;0;")
|
||||
add_test(golden_opt_folding_ir_opt "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/folding.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/folding.ir_opt.expected" "-DCOMMAND=ir" "-DOPTIMIZED=1" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake")
|
||||
|
|
|
|||
|
|
@ -1,16 +1,19 @@
|
|||
unit_tests 11 0.414572
|
||||
golden_arithmetic_basic 11 0.000844698
|
||||
golden_fibonacci_fib 11 0.000895261
|
||||
golden_string_hello 11 0.000806701
|
||||
golden_arithmetic_precedence 10 0.000871188
|
||||
golden_loops_basic 10 0.000887091
|
||||
golden_loops_do_while_once 10 0.000917601
|
||||
unit_tests 12 0.383222
|
||||
golden_arithmetic_basic 12 0.00103142
|
||||
golden_fibonacci_fib 12 0.000916418
|
||||
golden_string_hello 12 0.000742352
|
||||
golden_arithmetic_precedence 11 0.000902075
|
||||
golden_loops_basic 11 0.000863198
|
||||
golden_loops_do_while_once 11 0.000996616
|
||||
golden_opt_dce 2 0.00441751
|
||||
golden_opt_folding 2 0.00456844
|
||||
golden_opt_dce_ir_opt 8 0.00118146
|
||||
golden_opt_folding_ir_opt 8 0.00108412
|
||||
golden_opt_run_opt 6 0.00154088
|
||||
golden_opt_run_opt_run_opt 6 0.00158656
|
||||
golden_logic_short_circuit 2 0.00443116
|
||||
golden_loops_do_while_truthy 1 0.00964192
|
||||
golden_opt_dce_ir_opt 9 0.00109281
|
||||
golden_opt_folding_ir_opt 9 0.00105492
|
||||
golden_opt_run_opt 7 0.00244026
|
||||
golden_opt_run_opt_run_opt 7 0.0014659
|
||||
golden_logic_short_circuit 3 0.00318302
|
||||
golden_loops_do_while_truthy 2 0.00508981
|
||||
golden_loops_for_break_continue 1 0.0102576
|
||||
golden_loops_nested_break 1 0.00991625
|
||||
golden_loops_while_break_continue 1 0.00901491
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
Start testing: Jun 19 15:58 +03
|
||||
Start testing: Jun 19 16:09 +03
|
||||
----------------------------------------------------------
|
||||
1/13 Testing: unit_tests
|
||||
1/13 Test: unit_tests
|
||||
1/16 Testing: unit_tests
|
||||
1/16 Test: unit_tests
|
||||
Command: "/usr/bin/bash" "/home/saqut/Masaüstü/saqutcompiler/tests/run.sh"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"unit_tests" start time: Jun 19 15:58 +03
|
||||
"unit_tests" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
=== test_type ===
|
||||
|
|
@ -21,191 +21,236 @@ test.sqt:12:1: uyarı [W001]: y kullanılmıyor
|
|||
test_diagnostic: TUM TESTLER GECTI
|
||||
=== TUM TESTLER GECTI ===
|
||||
<end of output>
|
||||
Test time = 4.56 sec
|
||||
Test time = 4.60 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"unit_tests" end time: Jun 19 15:59 +03
|
||||
"unit_tests" end time: Jun 19 16:09 +03
|
||||
"unit_tests" time elapsed: 00:00:04
|
||||
----------------------------------------------------------
|
||||
|
||||
2/13 Testing: golden_arithmetic_basic
|
||||
2/13 Test: golden_arithmetic_basic
|
||||
2/16 Testing: golden_arithmetic_basic
|
||||
2/16 Test: golden_arithmetic_basic
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/arithmetic/basic.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/arithmetic/basic.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_arithmetic_basic" start time: Jun 19 15:59 +03
|
||||
"golden_arithmetic_basic" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_arithmetic_basic" end time: Jun 19 15:59 +03
|
||||
"golden_arithmetic_basic" end time: Jun 19 16:09 +03
|
||||
"golden_arithmetic_basic" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
3/13 Testing: golden_arithmetic_precedence
|
||||
3/13 Test: golden_arithmetic_precedence
|
||||
3/16 Testing: golden_arithmetic_precedence
|
||||
3/16 Test: golden_arithmetic_precedence
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/arithmetic/precedence.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/arithmetic/precedence.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_arithmetic_precedence" start time: Jun 19 15:59 +03
|
||||
"golden_arithmetic_precedence" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_arithmetic_precedence" end time: Jun 19 15:59 +03
|
||||
"golden_arithmetic_precedence" end time: Jun 19 16:09 +03
|
||||
"golden_arithmetic_precedence" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
4/13 Testing: golden_fibonacci_fib
|
||||
4/13 Test: golden_fibonacci_fib
|
||||
4/16 Testing: golden_fibonacci_fib
|
||||
4/16 Test: golden_fibonacci_fib
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/fibonacci/fib.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/fibonacci/fib.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_fibonacci_fib" start time: Jun 19 15:59 +03
|
||||
"golden_fibonacci_fib" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_fibonacci_fib" end time: Jun 19 15:59 +03
|
||||
"golden_fibonacci_fib" end time: Jun 19 16:09 +03
|
||||
"golden_fibonacci_fib" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
5/13 Testing: golden_logic_short_circuit
|
||||
5/13 Test: golden_logic_short_circuit
|
||||
5/16 Testing: golden_logic_short_circuit
|
||||
5/16 Test: golden_logic_short_circuit
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/logic/short_circuit.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/logic/short_circuit.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_logic_short_circuit" start time: Jun 19 15:59 +03
|
||||
"golden_logic_short_circuit" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_logic_short_circuit" end time: Jun 19 15:59 +03
|
||||
"golden_logic_short_circuit" end time: Jun 19 16:09 +03
|
||||
"golden_logic_short_circuit" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
6/13 Testing: golden_loops_basic
|
||||
6/13 Test: golden_loops_basic
|
||||
6/16 Testing: golden_loops_basic
|
||||
6/16 Test: golden_loops_basic
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/basic.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/basic.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_loops_basic" start time: Jun 19 15:59 +03
|
||||
"golden_loops_basic" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_loops_basic" end time: Jun 19 15:59 +03
|
||||
"golden_loops_basic" end time: Jun 19 16:09 +03
|
||||
"golden_loops_basic" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
7/13 Testing: golden_loops_do_while_once
|
||||
7/13 Test: golden_loops_do_while_once
|
||||
7/16 Testing: golden_loops_do_while_once
|
||||
7/16 Test: golden_loops_do_while_once
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_once.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_once.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_loops_do_while_once" start time: Jun 19 15:59 +03
|
||||
"golden_loops_do_while_once" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_loops_do_while_once" end time: Jun 19 15:59 +03
|
||||
"golden_loops_do_while_once" end time: Jun 19 16:09 +03
|
||||
"golden_loops_do_while_once" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
8/13 Testing: golden_loops_do_while_truthy
|
||||
8/13 Test: golden_loops_do_while_truthy
|
||||
8/16 Testing: golden_loops_do_while_truthy
|
||||
8/16 Test: golden_loops_do_while_truthy
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_truthy.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/do_while_truthy.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_loops_do_while_truthy" start time: Jun 19 15:59 +03
|
||||
"golden_loops_do_while_truthy" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_loops_do_while_truthy" end time: Jun 19 15:59 +03
|
||||
"golden_loops_do_while_truthy" end time: Jun 19 16:09 +03
|
||||
"golden_loops_do_while_truthy" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
9/13 Testing: golden_opt_dce_ir_opt
|
||||
9/13 Test: golden_opt_dce_ir_opt
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.ir_opt.expected" "-DCOMMAND=ir" "-DOPTIMIZED=1" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
9/16 Testing: golden_loops_for_break_continue
|
||||
9/16 Test: golden_loops_for_break_continue
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/for_break_continue.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/for_break_continue.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_opt_dce_ir_opt" start time: Jun 19 15:59 +03
|
||||
"golden_loops_for_break_continue" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_opt_dce_ir_opt" end time: Jun 19 15:59 +03
|
||||
"golden_loops_for_break_continue" end time: Jun 19 16:09 +03
|
||||
"golden_loops_for_break_continue" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
10/16 Testing: golden_loops_nested_break
|
||||
10/16 Test: golden_loops_nested_break
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/nested_break.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/nested_break.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_loops_nested_break" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_loops_nested_break" end time: Jun 19 16:09 +03
|
||||
"golden_loops_nested_break" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
11/16 Testing: golden_loops_while_break_continue
|
||||
11/16 Test: golden_loops_while_break_continue
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/while_break_continue.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/loops/while_break_continue.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_loops_while_break_continue" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_loops_while_break_continue" end time: Jun 19 16:09 +03
|
||||
"golden_loops_while_break_continue" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
12/16 Testing: golden_opt_dce_ir_opt
|
||||
12/16 Test: golden_opt_dce_ir_opt
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/dce.ir_opt.expected" "-DCOMMAND=ir" "-DOPTIMIZED=1" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_opt_dce_ir_opt" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_opt_dce_ir_opt" end time: Jun 19 16:09 +03
|
||||
"golden_opt_dce_ir_opt" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
10/13 Testing: golden_opt_folding_ir_opt
|
||||
10/13 Test: golden_opt_folding_ir_opt
|
||||
13/16 Testing: golden_opt_folding_ir_opt
|
||||
13/16 Test: golden_opt_folding_ir_opt
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/folding.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/folding.ir_opt.expected" "-DCOMMAND=ir" "-DOPTIMIZED=1" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_opt_folding_ir_opt" start time: Jun 19 15:59 +03
|
||||
"golden_opt_folding_ir_opt" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_opt_folding_ir_opt" end time: Jun 19 15:59 +03
|
||||
"golden_opt_folding_ir_opt" end time: Jun 19 16:09 +03
|
||||
"golden_opt_folding_ir_opt" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
11/13 Testing: golden_opt_run_opt
|
||||
11/13 Test: golden_opt_run_opt
|
||||
14/16 Testing: golden_opt_run_opt
|
||||
14/16 Test: golden_opt_run_opt
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/run_opt.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/run_opt.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_opt_run_opt" start time: Jun 19 15:59 +03
|
||||
"golden_opt_run_opt" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
Test time = 0.02 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_opt_run_opt" end time: Jun 19 15:59 +03
|
||||
"golden_opt_run_opt" end time: Jun 19 16:09 +03
|
||||
"golden_opt_run_opt" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
12/13 Testing: golden_opt_run_opt_run_opt
|
||||
12/13 Test: golden_opt_run_opt_run_opt
|
||||
15/16 Testing: golden_opt_run_opt_run_opt
|
||||
15/16 Test: golden_opt_run_opt_run_opt
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/run_opt.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/opt/run_opt.run_opt.expected" "-DOPTIMIZED=1" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_opt_run_opt_run_opt" start time: Jun 19 15:59 +03
|
||||
"golden_opt_run_opt_run_opt" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_opt_run_opt_run_opt" end time: Jun 19 15:59 +03
|
||||
"golden_opt_run_opt_run_opt" end time: Jun 19 16:09 +03
|
||||
"golden_opt_run_opt_run_opt" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
13/13 Testing: golden_string_hello
|
||||
13/13 Test: golden_string_hello
|
||||
16/16 Testing: golden_string_hello
|
||||
16/16 Test: golden_string_hello
|
||||
Command: "/usr/bin/cmake" "-DBINARY=/home/saqut/Masaüstü/saqutcompiler/build/saqut" "-DSOURCE=/home/saqut/Masaüstü/saqutcompiler/tests/golden/string/hello.sqt" "-DEXPECTED=/home/saqut/Masaüstü/saqutcompiler/tests/golden/string/hello.expected" "-P" "/home/saqut/Masaüstü/saqutcompiler/cmake/run_golden.cmake"
|
||||
Directory: /home/saqut/Masaüstü/saqutcompiler/build
|
||||
"golden_string_hello" start time: Jun 19 15:59 +03
|
||||
"golden_string_hello" start time: Jun 19 16:09 +03
|
||||
Output:
|
||||
----------------------------------------------------------
|
||||
<end of output>
|
||||
Test time = 0.01 sec
|
||||
----------------------------------------------------------
|
||||
Test Passed.
|
||||
"golden_string_hello" end time: Jun 19 15:59 +03
|
||||
"golden_string_hello" end time: Jun 19 16:09 +03
|
||||
"golden_string_hello" time elapsed: 00:00:00
|
||||
----------------------------------------------------------
|
||||
|
||||
End testing: Jun 19 15:59 +03
|
||||
End testing: Jun 19 16:09 +03
|
||||
|
|
|
|||
|
|
@ -153,77 +153,101 @@ void IRGenerator::generateStatement(ASTNode* node) {
|
|||
case ASTKind::WhileStatement: {
|
||||
auto* ws = (WhileStatementNode*)node;
|
||||
|
||||
// Döngü başının konumu — geri-jump buraya gelecek
|
||||
int loopStart = currentInstrIndex();
|
||||
loopContextStack_.push_back({});
|
||||
|
||||
int condSlot = generateExpression(ws->condition);
|
||||
int exitJump = emitJumpIfFalse(condSlot); // ileri, backpatch bekliyor
|
||||
int condSlot = generateExpression(ws->condition);
|
||||
int exitJump = emitJumpIfFalse(condSlot);
|
||||
|
||||
if (ws->body) generateStatement(ws->body);
|
||||
|
||||
// Geri-jump: hedef zaten biliniyor (loopStart)
|
||||
emitJumpUnconditional(loopStart);
|
||||
// continue → LOOP_START (hedef baştan beri biliniyor)
|
||||
for (int idx : loopContextStack_.back().continueJumps)
|
||||
currentFunction_->instructions[idx].jumpTarget = loopStart;
|
||||
|
||||
// Döngü çıkış noktası → exitJump'ı doldur
|
||||
patchJump(exitJump);
|
||||
emitJumpUnconditional(loopStart);
|
||||
patchJump(exitJump); // OUT burası
|
||||
|
||||
// break → OUT
|
||||
int outTarget = currentInstrIndex();
|
||||
for (int idx : loopContextStack_.back().breakJumps)
|
||||
currentFunction_->instructions[idx].jumpTarget = outTarget;
|
||||
|
||||
loopContextStack_.pop_back();
|
||||
break;
|
||||
}
|
||||
|
||||
// ── for (init; koşul; güncelleme) { gövde } ─────────────────────────
|
||||
//
|
||||
// Üretilen IR yapısı:
|
||||
// IR yapısı (continue C_LABEL'a, break OUT'a atlar):
|
||||
// [init]
|
||||
// LOOP_START:
|
||||
// [koşul] → condSlot
|
||||
// JIF_FALSE condSlot → LOOP_END (ileri-jump, backpatch)
|
||||
// [koşul] → JIF_FALSE OUT
|
||||
// [gövde]
|
||||
// C_LABEL:
|
||||
// [güncelleme]
|
||||
// JMP → LOOP_START (geri-jump, hedef biliniyor)
|
||||
// LOOP_END:
|
||||
// JMP LOOP_START
|
||||
// OUT:
|
||||
// ─────────────────────────────────────────────────────────────────────
|
||||
case ASTKind::ForStatement: {
|
||||
auto* fs = (ForStatementNode*)node;
|
||||
|
||||
// Init: genellikle "int i = 0" gibi bir VariableDecl
|
||||
if (fs->init) generateStatement(fs->init);
|
||||
|
||||
// Döngü başı konumu — geri-jump'ın hedefi
|
||||
int loopStart = currentInstrIndex();
|
||||
loopContextStack_.push_back({});
|
||||
|
||||
// Koşul
|
||||
int condSlot = fs->condition ? generateExpression(fs->condition) : -1;
|
||||
int exitJump = (condSlot != -1) ? emitJumpIfFalse(condSlot) : -1;
|
||||
|
||||
// Gövde
|
||||
if (fs->body) generateStatement(fs->body);
|
||||
|
||||
// Güncelleme (ör: i = i + 1) — ifade deyimi, sonuç önemsiz
|
||||
// C_LABEL: güncelleme başlangıcı — continue buraya atlar
|
||||
int cLabel = currentInstrIndex();
|
||||
for (int idx : loopContextStack_.back().continueJumps)
|
||||
currentFunction_->instructions[idx].jumpTarget = cLabel;
|
||||
|
||||
if (fs->update) generateExpression(fs->update);
|
||||
|
||||
// Geri-jump: hedef loopStart, zaten biliniyor
|
||||
emitJumpUnconditional(loopStart);
|
||||
|
||||
// Döngü çıkışı → exitJump'ı doldur
|
||||
if (exitJump != -1) patchJump(exitJump);
|
||||
if (exitJump != -1) patchJump(exitJump); // OUT burası
|
||||
|
||||
// break → OUT
|
||||
int outTarget = currentInstrIndex();
|
||||
for (int idx : loopContextStack_.back().breakJumps)
|
||||
currentFunction_->instructions[idx].jumpTarget = outTarget;
|
||||
|
||||
loopContextStack_.pop_back();
|
||||
break;
|
||||
}
|
||||
|
||||
// ── do { gövde } while (koşul) ───────────────────────────────────────
|
||||
case ASTKind::DoWhileStatement: {
|
||||
auto* dw = (DoWhileStatementNode*)node;
|
||||
|
||||
int loopStart = currentInstrIndex();
|
||||
loopContextStack_.push_back({});
|
||||
|
||||
if (dw->body) generateStatement(dw->body);
|
||||
|
||||
// COND_LABEL: koşul değerlendirmesi — continue buraya atlar
|
||||
int condLabel = currentInstrIndex();
|
||||
for (int idx : loopContextStack_.back().continueJumps)
|
||||
currentFunction_->instructions[idx].jumpTarget = condLabel;
|
||||
|
||||
int condSlot = generateExpression(dw->condition);
|
||||
// truthy (sıfır-dışı herhangi bir değer) ise başa dön — JIF_TRUE.
|
||||
// Eski "== 1" geçici çözümü kaldırıldı: koşul 2 gibi 1-olmayan
|
||||
// truthy bir değer üretince yanlışlıkla çıkıyordu (B4).
|
||||
// Geri-jump: hedef loopStart zaten biliniyor, backpatch gerekmez.
|
||||
Instruction jit(Opcode::JIF_TRUE);
|
||||
jit.cond = condSlot;
|
||||
jit.jumpTarget = loopStart;
|
||||
currentFunction_->instructions.push_back(std::move(jit));
|
||||
|
||||
// break → OUT (JIF_TRUE'dan sonraki konum)
|
||||
int outTarget = currentInstrIndex();
|
||||
for (int idx : loopContextStack_.back().breakJumps)
|
||||
currentFunction_->instructions[idx].jumpTarget = outTarget;
|
||||
|
||||
loopContextStack_.pop_back();
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -237,10 +261,18 @@ void IRGenerator::generateStatement(ASTNode* node) {
|
|||
break;
|
||||
}
|
||||
|
||||
case ASTKind::BreakStatement:
|
||||
case ASTKind::ContinueStatement:
|
||||
// TODO(vm-genişletme): break/continue için JMP + label mekanizması gerekir
|
||||
case ASTKind::BreakStatement: {
|
||||
int jumpIdx = emitJumpUnconditional(-1);
|
||||
if (!loopContextStack_.empty())
|
||||
loopContextStack_.back().breakJumps.push_back(jumpIdx);
|
||||
break;
|
||||
}
|
||||
case ASTKind::ContinueStatement: {
|
||||
int jumpIdx = emitJumpUnconditional(-1);
|
||||
if (!loopContextStack_.empty())
|
||||
loopContextStack_.back().continueJumps.push_back(jumpIdx);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -75,6 +75,15 @@ private:
|
|||
// Şu an kaç talimat üretildi? (jump hedefi belirlemek için)
|
||||
int currentInstrIndex() const;
|
||||
|
||||
// ── Döngü bağlamı yığını — break/continue hedefleri ─────────────────
|
||||
// Her döngüye girerken bir giriş push'lanır, çıkınca pop'lanır.
|
||||
// İç içe döngülerde en üstteki giriş en içteki döngüye aittir.
|
||||
struct LoopContext {
|
||||
std::vector<int> breakJumps; // patch bekleyen break JMP indeksleri
|
||||
std::vector<int> continueJumps; // patch bekleyen continue JMP indeksleri
|
||||
};
|
||||
std::vector<LoopContext> loopContextStack_;
|
||||
|
||||
// ── Per-function üretim durumu ────────────────────────────────────────
|
||||
IRFunction* currentFunction_ = nullptr; // şu an üretilen fonksiyon
|
||||
int nextSlot_ = 0; // sıradaki boş slot numarası
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
1
|
||||
3
|
||||
5
|
||||
1
|
||||
2
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
// for döngüsünde break ve continue golden testi.
|
||||
//
|
||||
// continue kanıtı: 2 ve 4 atlanır ama güncelleme (i++) hala çalışır.
|
||||
// Eğer continue güncellemeyi atlasaydı i==2'de sonsuz döngüye girerdi.
|
||||
// 5'in çıktıda görünmesi güncellemenin çalıştığını kanıtlar.
|
||||
//
|
||||
// break kanıtı: i==3'te erken çık — 3, 4, 5 görünmemeli.
|
||||
|
||||
int main() {
|
||||
int i = 0;
|
||||
|
||||
for (i = 1; i <= 5; i = i + 1) {
|
||||
if (i == 2) { continue; }
|
||||
if (i == 4) { continue; }
|
||||
print(i);
|
||||
}
|
||||
|
||||
for (i = 1; i <= 5; i = i + 1) {
|
||||
if (i == 3) { break; }
|
||||
print(i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
1
|
||||
1
|
||||
2
|
||||
1
|
||||
3
|
||||
1
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
// İç içe döngü: içteki break sadece içteki döngüyü etkiler.
|
||||
// Döngü bağlamı yığınının doğru çalıştığını kanıtlar.
|
||||
//
|
||||
// Beklenen: her dış iterasyonda j=1 yazdırılır, j=2'de inner break.
|
||||
// Dış döngü i=1,2,3 boyunca devam eder — inner break dışarıya sızmaz.
|
||||
|
||||
int main() {
|
||||
int i = 1;
|
||||
while (i <= 3) {
|
||||
int j = 1;
|
||||
while (j <= 3) {
|
||||
if (j == 2) { break; }
|
||||
print(i);
|
||||
print(j);
|
||||
j = j + 1;
|
||||
}
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
1
|
||||
2
|
||||
4
|
||||
5
|
||||
1
|
||||
2
|
||||
3
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
// while döngüsünde break ve continue golden testi.
|
||||
|
||||
int main() {
|
||||
int i = 0;
|
||||
|
||||
// continue: 3'ü atla
|
||||
while (i < 5) {
|
||||
i = i + 1;
|
||||
if (i == 3) { continue; }
|
||||
print(i);
|
||||
}
|
||||
|
||||
// break: 4'te çık
|
||||
i = 0;
|
||||
while (i < 10) {
|
||||
i = i + 1;
|
||||
if (i == 4) { break; }
|
||||
print(i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue