cgen: fix [1, 2, 3]!.map(it * 2) (#22722)

This commit is contained in:
yuyi 2024-11-01 15:39:17 +08:00 committed by GitHub
parent a9e814ff68
commit 2c887e2017
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 46 additions and 9 deletions

View File

@ -4,24 +4,42 @@ fn test_fixed_array_map() {
b1 := a.map(it * 2)
println(b1)
assert b1 == [2, 4, 6]!
b10 := [1, 2, 3]!.map(it * 2)
assert b10 == [2, 4, 6]!
assert [1, 2, 3]!.map(it * 2) == [2, 4, 6]!
b11 := a.map(|x| x * 2)
println(b11)
assert b11 == [2, 4, 6]!
b110 := [1, 2, 3]!.map(|x| x * 2)
assert b110 == [2, 4, 6]!
assert [1, 2, 3]!.map(|x| x * 2) == [2, 4, 6]!
b2 := a.map('${it}')
println(b2)
assert b2 == ['1', '2', '3']!
b20 := [1, 2, 3]!.map('${it}')
assert b20 == ['1', '2', '3']!
assert [1, 2, 3]!.map('${it}') == ['1', '2', '3']!
b22 := a.map(|x| '${x}')
println(b22)
assert b22 == ['1', '2', '3']!
b220 := [1, 2, 3]!.map(|x| '${x}')
assert b220 == ['1', '2', '3']!
assert [1, 2, 3]!.map(|x| '${x}') == ['1', '2', '3']!
b3 := a.map(it + 2)
println(b3)
assert b3 == [3, 4, 5]!
b30 := [1, 2, 3]!.map(it + 2)
assert b30 == [3, 4, 5]!
assert [1, 2, 3]!.map(it + 2) == [3, 4, 5]!
b33 := a.map(|x| x + 2)
println(b33)
assert b33 == [3, 4, 5]!
b330 := [1, 2, 3]!.map(|x| x + 2)
assert b330 == [3, 4, 5]!
assert [1, 2, 3]!.map(|x| x + 2) == [3, 4, 5]!
}

View File

@ -1585,6 +1585,17 @@ fn (mut g Gen) write_prepared_tmp_value(tmp string, node &ast.CallExpr, tmp_styp
left_styp := g.styp(left_type)
g.writeln('${left_styp} ${tmp}_orig;')
g.write('memcpy(&${tmp}_orig, &')
if node.left is ast.ArrayInit {
if g.is_cc_msvc {
stmts := g.go_before_last_stmt().trim_space()
tmp_var := g.new_tmp_var()
g.write2('${left_styp} ${tmp_var} = ${g.expr_string(node.left)};', stmts)
g.write(tmp_var)
} else {
g.write('(${left_styp})')
g.expr(node.left)
}
} else {
if !node.left_type.has_flag(.shared_f) && node.left_type.is_ptr() {
g.write('*')
}
@ -1592,6 +1603,7 @@ fn (mut g Gen) write_prepared_tmp_value(tmp string, node &ast.CallExpr, tmp_styp
if node.left_type.has_flag(.shared_f) {
g.write('->val')
}
}
g.writeln(', sizeof(${left_styp}));')
g.writeln('int ${tmp}_len = ${left_info.size};')
}

View File

@ -19,8 +19,15 @@ fn (mut g Gen) new_ctemp_var_then_gen(expr ast.Expr, expr_type ast.Type) ast.CTe
fn (mut g Gen) gen_ctemp_var(tvar ast.CTempVar) {
styp := g.styp(tvar.typ)
if g.table.final_sym(tvar.typ).kind == .array_fixed {
g.writeln('${styp} ${tvar.name};')
g.write('memcpy(&${tvar.name}, &')
g.expr(tvar.orig)
g.writeln(' , sizeof(${styp}));')
} else {
g.write('${styp} ${tvar.name} = ')
g.expr(tvar.orig)
g.writeln(';')
}
g.set_current_pos_as_last_stmt_pos()
}