From 0f58a02c1416429dcfb3ca26289e720380f8cc42 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 23 Feb 2025 22:54:25 -0300 Subject: [PATCH] cgen: fix gowrapper codegen for receiver ptrptr (fix #23798) (#23800) --- vlib/v/gen/c/spawn_and_go.v | 10 ++--- .../concurrency/mut_receiver_gowrapper_test.v | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 vlib/v/tests/concurrency/mut_receiver_gowrapper_test.v diff --git a/vlib/v/gen/c/spawn_and_go.v b/vlib/v/gen/c/spawn_and_go.v index 50b5573305310c..916c0b95fef6e3 100644 --- a/vlib/v/gen/c/spawn_and_go.v +++ b/vlib/v/gen/c/spawn_and_go.v @@ -106,9 +106,9 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) { } if expr.is_method { g.write('${arg_tmp_var}${dot}arg0 = ') - if expr.left is ast.Ident && expr.left.obj.typ.is_ptr() + if mut expr.left is ast.Ident && expr.left.obj.typ.is_ptr() && !node.call_expr.receiver_type.is_ptr() { - g.write('*') + g.write('*'.repeat(expr.left.obj.typ.nr_muls())) } g.expr(expr.left) g.writeln(';') @@ -271,10 +271,10 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) { receiver_type_name := util.no_dots(rec_cc_type) g.gowrappers.write_string2('${c_name(receiver_type_name)}_name_table[', 'arg->arg0') - idot := if expr.left_type.is_ptr() { '->' } else { '.' } + dot_or_ptr := g.dot_or_ptr(unwrapped_rec_type) mname := c_name(expr.name) - g.gowrappers.write_string2('${idot}_typ]._method_${mname}(', 'arg->arg0') - g.gowrappers.write_string('${idot}_object') + g.gowrappers.write_string2('${dot_or_ptr}_typ]._method_${mname}(', 'arg->arg0') + g.gowrappers.write_string('${dot_or_ptr}_object') } else if typ_sym.kind == .struct && expr.is_field { g.gowrappers.write_string('arg->arg0') idot := if expr.left_type.is_ptr() { '->' } else { '.' } diff --git a/vlib/v/tests/concurrency/mut_receiver_gowrapper_test.v b/vlib/v/tests/concurrency/mut_receiver_gowrapper_test.v new file mode 100644 index 00000000000000..c4dbf96d058913 --- /dev/null +++ b/vlib/v/tests/concurrency/mut_receiver_gowrapper_test.v @@ -0,0 +1,37 @@ +module main + +@[heap] +interface IGameObject { +mut: + name string + parent ?&IGameObject + children []&IGameObject + advance() +} + +@[heap] +struct GameObject implements IGameObject { +mut: + name string + parent ?&IGameObject + children []&IGameObject +} + +struct Ship implements IGameObject { + GameObject + speed f32 +} + +fn (mut gameobject GameObject) advance() { + for mut child in gameobject.children { + go child.advance() + } +} + +fn test_main() { + mut ship := &Ship{ + name: 'ship' + } + ship.advance() + assert true +}