From 0cc63107ffefd4f788a0abeb645ec86d75cbace7 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sat, 19 Mar 2022 01:01:08 +0200 Subject: [PATCH] cgen: fix duplicate auto generation of free methods, add test --- vlib/v/gen/c/auto_free_methods.v | 15 ++++---- .../valgrind/struct_of_array_of_same_struct.v | 38 +++++++++++++++++++ 2 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 vlib/v/tests/valgrind/struct_of_array_of_same_struct.v diff --git a/vlib/v/gen/c/auto_free_methods.v b/vlib/v/gen/c/auto_free_methods.v index a30c6175ac..695e230143 100644 --- a/vlib/v/gen/c/auto_free_methods.v +++ b/vlib/v/gen/c/auto_free_methods.v @@ -7,15 +7,14 @@ import strings fn (mut g Gen) get_free_method(typ ast.Type) string { g.autofree_methods[typ] = true - styp := g.typ(typ).replace('*', '') mut sym := g.table.sym(g.unwrap_generic(typ)) - mut fn_name := styp_to_free_fn_name(styp) if mut sym.info is ast.Alias { if sym.info.is_import { sym = g.table.sym(sym.info.parent_type) } } - + styp := g.typ(typ).replace('*', '') + fn_name := styp_to_free_fn_name(styp) if sym.has_method_with_generic_parent('free') { return fn_name } @@ -30,21 +29,23 @@ fn (mut g Gen) gen_free_methods() { fn (mut g Gen) gen_free_method(typ ast.Type) string { styp := g.typ(typ).replace('*', '') - mut sym := g.table.sym(g.unwrap_generic(typ)) mut fn_name := styp_to_free_fn_name(styp) - if typ in g.generated_free_methods { + deref_typ := typ.set_nr_muls(0) + if deref_typ in g.generated_free_methods { return fn_name } - g.generated_free_methods[typ] = true + g.generated_free_methods[deref_typ] = true + + mut sym := g.table.sym(g.unwrap_generic(typ)) if mut sym.info is ast.Alias { if sym.info.is_import { sym = g.table.sym(sym.info.parent_type) } } - if sym.has_method_with_generic_parent('free') { return fn_name } + match mut sym.info { ast.Struct { g.gen_free_for_struct(sym.info, styp, fn_name) diff --git a/vlib/v/tests/valgrind/struct_of_array_of_same_struct.v b/vlib/v/tests/valgrind/struct_of_array_of_same_struct.v new file mode 100644 index 0000000000..7112117eb0 --- /dev/null +++ b/vlib/v/tests/valgrind/struct_of_array_of_same_struct.v @@ -0,0 +1,38 @@ +struct Abc { +mut: + name string + children []Abc +} + +[manualfree] +fn main() { + mut a := &Abc{} + a.name = 'aaa' + a.children = [ + Abc{ + name: 'xyz' + children: [ + Abc{ + name: 'xx' + }, + Abc{ + name: 'yy' + }, + ] + }, + Abc{ + name: 'def' + children: [ + Abc{ + name: 'dd' + }, + Abc{ + name: 'ee' + }, + ] + }, + ] + dump(a) + unsafe { a.free() } + unsafe { free(a) } +}