File tree Expand file tree Collapse file tree 3 files changed +135
-0
lines changed
Expand file tree Collapse file tree 3 files changed +135
-0
lines changed Original file line number Diff line number Diff line change @@ -1039,6 +1039,49 @@ pub fn (mut g Gen) expr(node ast.Expr, expected ast.Type) {
10391039 }
10401040}
10411041
1042+ pub fn (mut g Gen) for_in_stmt (node ast.ForInStmt) {
1043+ loop_var_type := unpack_literal_int (node.val_type)
1044+ block := g.func.c_block ([], [])
1045+ {
1046+ mut loop_var := Var{}
1047+ loop_var = g.new_local (node.val_var, loop_var_type)
1048+
1049+ g.expr (node.cond, loop_var_type)
1050+ g.set (loop_var)
1051+
1052+ loop := g.func.c_loop ([], [])
1053+ {
1054+ g.loop_breakpoint_stack << LoopBreakpoint{
1055+ c_continue: loop
1056+ c_break: block
1057+ name: node.label
1058+ }
1059+
1060+ g.get (loop_var)
1061+ g.expr (node.high, loop_var_type)
1062+ wtyp := g.as_numtype (g.get_wasm_type (loop_var_type))
1063+ g.func.lt (wtyp, loop_var_type.is_signed ())
1064+ g.func.eqz (.i32_ t)
1065+ g.func.c_br_if (block)
1066+
1067+ g.expr_stmts (node.stmts, ast.void_type)
1068+
1069+ g.set_prepare (loop_var)
1070+ {
1071+ g.get (loop_var)
1072+ g.literalint (1 , loop_var_type)
1073+ g.func.add (wtyp)
1074+ }
1075+ g.set (loop_var)
1076+
1077+ g.func.c_br (loop)
1078+ g.loop_breakpoint_stack.pop ()
1079+ }
1080+ g.func.c_end (loop)
1081+ }
1082+ g.func.c_end (block)
1083+ }
1084+
10421085pub fn (g &Gen) file_pos (pos token.Pos) string {
10431086 return '${g.file_path} :${pos.line_nr + 1} :${pos.col + 1} '
10441087}
@@ -1123,6 +1166,9 @@ pub fn (mut g Gen) expr_stmt(node ast.Stmt, expected ast.Type) {
11231166 }
11241167 g.func.c_end (block)
11251168 }
1169+ ast.ForInStmt {
1170+ g.for_in_stmt (node)
1171+ }
11261172 ast.BranchStmt {
11271173 mut bp := g.loop_breakpoint_stack.last ()
11281174 if node.label != '' {
Original file line number Diff line number Diff line change 1+ fn simple_range() int {
2+ mut sum := 0
3+ for i in 0 .. 5 {
4+ sum += i
5+ }
6+ return sum
7+ }
8+
9+ fn negative_range() int {
10+ mut sum := 0
11+ for i in -99 .. -2 {
12+ sum += i
13+ }
14+ return sum
15+ }
16+
17+ fn inverted_range() int {
18+ mut sum := 0
19+ // Should be skipped
20+ for i in 5 .. 0 {
21+ sum += i
22+ }
23+ return sum
24+ }
25+
26+ fn range_with_string() int {
27+ strc := 'This is a test!'
28+ mut sum := 0
29+ for i in 0 .. strc.len {
30+ sum += i
31+ }
32+ return sum
33+ }
34+
35+ fn range_with_expr() int {
36+ start := 2
37+ end := 7
38+ mut sum := 0
39+ for i in start .. end {
40+ sum += i
41+ }
42+ return sum
43+ }
44+
45+ fn range_dual() int {
46+ a := 128
47+ mut sum := 0
48+ for i in 0 .. a {
49+ sum += i
50+ for j in -20 .. a {
51+ sum += j
52+ }
53+ }
54+ return sum
55+ }
56+
57+ fn main() {
58+ println('--- inverted_range()')
59+ println(inverted_range())
60+
61+ println('--- negative_range()')
62+ println(negative_range())
63+
64+ println('--- simple_range()')
65+ println(simple_range())
66+
67+ println('--- range_with_string()')
68+ println(range_with_string())
69+
70+ println('--- range_with_expr()')
71+ println(range_with_expr())
72+
73+ println('--- range_dual()')
74+ println(range_dual())
75+
76+ // Currently, the backend doesn't support maps, list etc. iteration is not possible
77+ }
Original file line number Diff line number Diff line change 1+ --- inverted_range()
2+ 0
3+ --- negative_range()
4+ -4947
5+ --- simple_range()
6+ 10
7+ --- range_with_string()
8+ 105
9+ --- range_with_expr()
10+ 20
11+ --- range_dual()
12+ 1021632
You can’t perform that action at this time.
0 commit comments