1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen: fix array of fixed array map/filter/any/all(it[0]) (fix #15422) (#15445)

This commit is contained in:
yuyi 2022-08-17 21:16:08 +08:00 committed by GitHub
parent 9887dd1fbf
commit e1ebd90190
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 4 deletions

View File

@ -341,7 +341,7 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
i := g.new_tmp_var()
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
g.indent++
g.writeln('$inp_elem_type it = (($inp_elem_type*) ${tmp}_orig.data)[$i];')
g.write_prepared_it(inp_info, inp_elem_type, tmp, i)
g.set_current_pos_as_last_stmt_pos()
mut is_embed_map_filter := false
mut expr := node.args[0].expr
@ -536,7 +536,7 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
i := g.new_tmp_var()
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
g.indent++
g.writeln('$elem_type_str it = (($elem_type_str*) ${tmp}_orig.data)[$i];')
g.write_prepared_it(info, elem_type_str, tmp, i)
g.set_current_pos_as_last_stmt_pos()
mut is_embed_map_filter := false
mut expr := node.args[0].expr
@ -893,7 +893,7 @@ fn (mut g Gen) gen_array_any(node ast.CallExpr) {
i := g.new_tmp_var()
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
g.indent++
g.writeln('$elem_type_str it = (($elem_type_str*) ${tmp}_orig.data)[$i];')
g.write_prepared_it(info, elem_type_str, tmp, i)
g.set_current_pos_as_last_stmt_pos()
mut is_embed_map_filter := false
mut expr := node.args[0].expr
@ -967,7 +967,7 @@ fn (mut g Gen) gen_array_all(node ast.CallExpr) {
i := g.new_tmp_var()
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
g.indent++
g.writeln('$elem_type_str it = (($elem_type_str*) ${tmp}_orig.data)[$i];')
g.write_prepared_it(info, elem_type_str, tmp, i)
g.empty_line = true
g.set_current_pos_as_last_stmt_pos()
mut is_embed_map_filter := false
@ -1055,3 +1055,12 @@ fn (mut g Gen) write_prepared_tmp_value(tmp string, node &ast.CallExpr, tmp_styp
g.writeln('int ${tmp}_len = ${tmp}_orig.len;')
return has_infix_left_var_name
}
fn (mut g Gen) write_prepared_it(inp_info ast.Array, inp_elem_type string, tmp string, i string) {
if g.table.sym(inp_info.elem_type).kind == .array_fixed {
g.writeln('$inp_elem_type it;')
g.writeln('memcpy(&it, (($inp_elem_type*) ${tmp}_orig.data)[$i], sizeof($inp_elem_type));')
} else {
g.writeln('$inp_elem_type it = (($inp_elem_type*) ${tmp}_orig.data)[$i];')
}
}

View File

@ -0,0 +1,17 @@
fn test_array_of_fixed_array_map_filter_any_all() {
mut db := [][2]string{}
db << ['aaa', '111']!
db << ['bbb', '222']!
db << ['ccc', '333']!
keys := db.map(it[0])
println(keys)
assert keys == ['aaa', 'bbb', 'ccc']
assert db.map(it[0] == 'aaa') == [true, false, false]
assert db.filter(it[0] == 'bbb') == [['bbb', '222']!]
assert db.any(it[0] == 'aaa') == true
assert db.all(it[0] == 'aaa') == false
}