Skip to content

Commit

Permalink
cgen: improve fixed array literal in operation and index calls (vlang…
Browse files Browse the repository at this point in the history
  • Loading branch information
yuyi98 authored Oct 20, 2024
1 parent ddbef2d commit 555bad7
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 6 deletions.
15 changes: 13 additions & 2 deletions vlib/v/gen/c/array.v
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,7 @@ fn (mut g Gen) gen_array_contains_methods() {
fn_builder.writeln('\tfor (int i = 0; i < ${size}; ++i) {')
if elem_kind == .string {
fn_builder.writeln('\t\tif (fast_string_eq(a[i], v)) {')
} else if elem_kind == .array && elem_is_not_ptr {
} else if elem_kind in [.array, .array_fixed] && elem_is_not_ptr {
ptr_typ := g.equality_fn(left_info.elem_type)
fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq(a[i], v)) {')
} else if elem_kind == .function {
Expand Down Expand Up @@ -1110,7 +1110,7 @@ fn (mut g Gen) gen_array_index_methods() {
fn_builder.writeln('\tfor (int i = 0; i < a.len; ++i, ++pelem) {')
if elem_sym.kind == .string {
fn_builder.writeln('\t\tif (fast_string_eq(*pelem, v)) {')
} else if elem_sym.kind == .array && !info.elem_type.is_ptr() {
} else if elem_sym.kind in [.array, .array_fixed] && !info.elem_type.is_ptr() {
ptr_typ := g.equality_fn(info.elem_type)
fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq(*pelem, v)) {')
} else if elem_sym.kind == .function && !info.elem_type.is_ptr() {
Expand Down Expand Up @@ -1168,6 +1168,17 @@ fn (mut g Gen) gen_array_index(node ast.CallExpr) {
}
if g.table.sym(elem_typ).kind in [.interface, .sum_type] {
g.expr_with_cast(node.args[0].expr, node.args[0].typ, elem_typ)
} else if node.args[0].expr is ast.ArrayInit {
if g.is_cc_msvc {
stmts := g.go_before_last_stmt().trim_space()
tmp_var := g.new_tmp_var()
g.write('${g.typ(node.args[0].typ)} ${tmp_var} = ${g.expr_string(node.args[0].expr)};')
g.write(stmts)
g.write(tmp_var)
} else {
g.write('(${g.typ(node.args[0].typ)})')
g.expr(node.args[0].expr)
}
} else {
g.expr(node.args[0].expr)
}
Expand Down
26 changes: 22 additions & 4 deletions vlib/v/tests/builtin_arrays/fixed_array_literal_infix_test.v
Original file line number Diff line number Diff line change
@@ -1,8 +1,26 @@
fn test_main() {
fn test_array_of_fixed_array_in_op() {
mut a := [][2]int{}
a << [0, 0]!
println([0, 0]! in a)
ret := [0, 0]! in a
a << [1, 2]!
println([1, 2]! in a)
ret := [1, 2]! in a
println(ret)
assert ret
}

fn test_fixed_array_of_fixed_array_in_op() {
mut a := [2][2]int{}
a[0] = [1, 2]!
println([1, 2]! in a)
ret := [1, 2]! in a
println(ret)
assert ret
}

fn test_array_of_fixed_array_index() {
mut a := [][2]int{}
a << [1, 2]!
println(a.index([1, 2]!))
ret := a.index([1, 2]!)
println(ret)
assert ret == 0
}

0 comments on commit 555bad7

Please sign in to comment.