Skip to content

Commit 25eabf8

Browse files
authored
cgen: fix argument dereference for str method when receiver is ptr (#17648)
1 parent f5b6780 commit 25eabf8

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

vlib/v/gen/c/auto_str_methods.v

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,12 @@ fn (mut g Gen) gen_str_for_map(info ast.Map, styp string, str_fn_name string) {
713713
}
714714
val_styp := g.typ(val_typ)
715715
mut elem_str_fn_name := val_styp.replace('*', '') + '_str'
716-
if val_sym.has_method_with_generic_parent('str') {
716+
717+
mut receiver_is_ptr := false
718+
fn_str := val_sym.find_method_with_generic_parent('str') or { ast.Fn{} }
719+
720+
if fn_str.name == 'str' {
721+
receiver_is_ptr = fn_str.receiver_type.is_ptr()
717722
match mut val_sym.info {
718723
ast.Struct, ast.Interface, ast.SumType {
719724
if val_sym.info.generic_types.len > 0 {
@@ -755,7 +760,7 @@ fn (mut g Gen) gen_str_for_map(info ast.Map, styp string, str_fn_name string) {
755760
} else if val_sym.kind == .string {
756761
tmp_str := str_intp_sq('*(${val_styp}*)DenseArray_value(&m.key_values, i)')
757762
g.auto_str_funcs.writeln('\t\tstrings__Builder_write_string(&sb, ${tmp_str});')
758-
} else if should_use_indent_func(val_sym.kind) && !val_sym.has_method_with_generic_parent('str') {
763+
} else if should_use_indent_func(val_sym.kind) && fn_str.name != 'str' {
759764
ptr_str := '*'.repeat(val_typ.nr_muls())
760765
g.auto_str_funcs.writeln('\t\tstrings__Builder_write_string(&sb, indent_${elem_str_fn_name}(*${ptr_str}(${val_styp}*)DenseArray_value(&m.key_values, i), indent_count));')
761766
} else if val_sym.kind in [.f32, .f64] {
@@ -769,7 +774,7 @@ fn (mut g Gen) gen_str_for_map(info ast.Map, styp string, str_fn_name string) {
769774
tmp_str := str_intp_rune('${elem_str_fn_name}(*(${val_styp}*)DenseArray_value(&m.key_values, i))')
770775
g.auto_str_funcs.writeln('\t\tstrings__Builder_write_string(&sb, ${tmp_str});')
771776
} else {
772-
ptr_str := '*'.repeat(val_typ.nr_muls())
777+
ptr_str := '*'.repeat(if receiver_is_ptr { val_typ.nr_muls() - 1 } else { val_typ.nr_muls() })
773778
g.auto_str_funcs.writeln('\t\tstrings__Builder_write_string(&sb, ${elem_str_fn_name}(*${ptr_str}(${val_styp}*)DenseArray_value(&m.key_values, i)));')
774779
}
775780
g.auto_str_funcs.writeln('\t\tif (i != m.key_values.len-1) {')

vlib/v/tests/ptr_str_method_test.v

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module main
2+
3+
struct Name {
4+
age int = 222
5+
}
6+
7+
fn (n &Name) str() string {
8+
return n.age.str()
9+
}
10+
11+
fn test_str_method_with_ptr() {
12+
name := &Name{}
13+
mut mp := map[string]&Name{}
14+
mp['aaa'] = name
15+
16+
assert mp.str() == "{'aaa': 222}"
17+
assert name.str() == '222'
18+
}

0 commit comments

Comments
 (0)