Skip to content

Commit 06e3485

Browse files
wasm: add basic for x in start .. end { support (#26248)
1 parent 8661933 commit 06e3485

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed

vlib/v/gen/wasm/gen.v

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
10421085
pub 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 != '' {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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

0 commit comments

Comments
 (0)