Skip to content

Commit

Permalink
cgen: fix aliases of array insert(...)/prepend(...) (fix #22323) (#22324
Browse files Browse the repository at this point in the history
)
  • Loading branch information
yuyi98 committed Sep 27, 2024
1 parent 765b88f commit c7bdc0a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 7 deletions.
18 changes: 18 additions & 0 deletions vlib/builtin/array_test.v
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,24 @@ fn test_prepend_many() {
assert a == [5, 6, 1, 2, 3, 4]
}

type Strings = []string

fn test_aliases_of_array_insert() {
mut strs := Strings(['hi'])
strs.insert(0, '22')
assert strs == ['22', 'hi']
strs.insert(1, ['11'])
assert strs == ['22', '11', 'hi']
}

fn test_aliases_of_array_prepend() {
mut strs := Strings(['hi'])
strs.prepend('22')
assert strs == ['22', 'hi']
strs.prepend(['44', '33'])
assert strs == ['44', '33', '22', 'hi']
}

fn test_strings() {
a := ['a', 'b', 'c']
assert a.str() == "['a', 'b', 'c']"
Expand Down
13 changes: 7 additions & 6 deletions vlib/v/gen/c/array.v
Original file line number Diff line number Diff line change
Expand Up @@ -874,12 +874,12 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {

// `nums.insert(0, 2)` `nums.insert(0, [2,3,4])`
fn (mut g Gen) gen_array_insert(node ast.CallExpr) {
left_sym := g.table.sym(node.left_type)
left_sym := g.table.final_sym(node.left_type)
left_info := left_sym.info as ast.Array
elem_type_str := g.typ(left_info.elem_type)
arg2_sym := g.table.sym(node.args[1].typ)
arg2_sym := g.table.final_sym(node.args[1].typ)
is_arg2_array := arg2_sym.kind == .array
&& node.args[1].typ.clear_flag(.variadic) == node.left_type
&& node.args[1].typ.clear_flag(.variadic) in [node.left_type, g.table.unaliased_type(node.left_type)]
noscan := g.check_noscan(left_info.elem_type)
addr := if node.left_type.is_ptr() { '' } else { '&' }
if is_arg2_array {
Expand Down Expand Up @@ -911,11 +911,12 @@ fn (mut g Gen) gen_array_insert(node ast.CallExpr) {

// `nums.prepend(2)` `nums.prepend([2,3,4])`
fn (mut g Gen) gen_array_prepend(node ast.CallExpr) {
left_sym := g.table.sym(node.left_type)
left_sym := g.table.final_sym(node.left_type)
left_info := left_sym.info as ast.Array
elem_type_str := g.typ(left_info.elem_type)
arg_sym := g.table.sym(node.args[0].typ)
is_arg_array := arg_sym.kind == .array && node.args[0].typ == node.left_type
arg_sym := g.table.final_sym(node.args[0].typ)
is_arg_array := arg_sym.kind == .array
&& node.args[0].typ in [node.left_type, g.table.unaliased_type(node.left_type)]
noscan := g.check_noscan(left_info.elem_type)
addr := if node.left_type.is_ptr() { '' } else { '&' }
if is_arg_array {
Expand Down
2 changes: 1 addition & 1 deletion vlib/v/gen/c/fn.v
Original file line number Diff line number Diff line change
Expand Up @@ -1568,7 +1568,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
left_sym := g.table.sym(left_type)
final_left_sym := g.table.final_sym(left_type)
if left_sym.kind == .array || (final_left_sym.kind == .array
&& node.name in ['filter', 'map', 'sort', 'sorted', 'contains', 'any', 'all']) {
&& node.name in ['filter', 'map', 'sort', 'sorted', 'contains', 'any', 'all', 'insert', 'prepend']) {
if g.gen_array_method_call(node, left_type) {
return
}
Expand Down

0 comments on commit c7bdc0a

Please sign in to comment.