Skip to content

Commit 5439ff9

Browse files
authored
cgen: make sure to call the overriden pub fn (mut a []string) free() { method, NOT the generic fn (a &array) free() { one. (#23911)
1 parent 2dc0911 commit 5439ff9

File tree

4 files changed

+43
-2
lines changed

4 files changed

+43
-2
lines changed

vlib/v/gen/c/fn.v

+8-2
Original file line numberDiff line numberDiff line change
@@ -1477,7 +1477,7 @@ fn (mut g Gen) resolve_receiver_name(node ast.CallExpr, unwrapped_rec_type ast.T
14771477
receiver_type_name = 'map'
14781478
}
14791479
if final_left_sym.kind == .array && !(left_sym.kind == .alias && left_sym.has_method(node.name))
1480-
&& node.name in ['clear', 'repeat', 'sort_with_compare', 'sorted_with_compare', 'free', 'push_many', 'trim', 'first', 'last', 'pop', 'clone', 'reverse', 'slice', 'pointers'] {
1480+
&& node.name in ['clear', 'repeat', 'sort_with_compare', 'sorted_with_compare', 'push_many', 'trim', 'first', 'last', 'pop', 'clone', 'reverse', 'slice', 'pointers'] {
14811481
if !(left_sym.info is ast.Alias && typ_sym.has_method(node.name)) {
14821482
// `array_Xyz_clone` => `array_clone`
14831483
receiver_type_name = 'array'
@@ -1658,7 +1658,13 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
16581658

16591659
receiver_type_name = g.resolve_receiver_name(node, unwrapped_rec_type, final_left_sym,
16601660
left_sym, typ_sym)
1661-
mut name := util.no_dots('${receiver_type_name}_${node.name}')
1661+
mut name := ''
1662+
if is_free_method {
1663+
free_method_name := g.get_free_method(unwrapped_rec_type)
1664+
name = free_method_name
1665+
} else {
1666+
name = util.no_dots('${receiver_type_name}_${node.name}')
1667+
}
16621668
if left_sym.kind == .chan && node.name in ['close', 'try_pop', 'try_push'] {
16631669
name = 'sync__Channel_${node.name}'
16641670
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Array_string my_array_of_strings = __new_array_with_default(0, 10, sizeof(string), 0);
2+
Array_string_free(&my_array_of_strings);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
start,42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
fn ii() int {
2+
return 42
3+
}
4+
5+
fn ss() string {
6+
return ii().str()
7+
}
8+
9+
@[manualfree]
10+
fn ffff() {
11+
mut my_array_of_strings := []string{cap: 10}
12+
my_array_of_strings << 'start'
13+
mystring := ss()
14+
if mystring.len > 0 {
15+
my_array_of_strings << mystring
16+
}
17+
sa := my_array_of_strings.join(',')
18+
println(sa)
19+
unsafe {
20+
sa.free()
21+
mystring.free()
22+
// The following SHOULD NOT generate the general `array_free(&my_array_of_strings);` .
23+
// Instead, it SHOULD generate the more specific `Array_string_free(&my_array_of_strings);` !
24+
// That more specific version, makes sure, that all the element strings are freed,
25+
// before the array itself is also freed.
26+
my_array_of_strings.free()
27+
}
28+
}
29+
30+
fn main() {
31+
ffff()
32+
}

0 commit comments

Comments
 (0)