From 23a22b1c334962e28a5ebc0a0f337ca51980988c Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 27 Jan 2025 08:08:24 -0300 Subject: [PATCH 1/4] fix --- vlib/v/gen/c/auto_free_methods.v | 23 +++++++++++++++++++---- vlib/v/tests/u8_free_test.v | 11 +++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 vlib/v/tests/u8_free_test.v diff --git a/vlib/v/gen/c/auto_free_methods.v b/vlib/v/gen/c/auto_free_methods.v index 7437e9fde0b044..8806941164e929 100644 --- a/vlib/v/gen/c/auto_free_methods.v +++ b/vlib/v/gen/c/auto_free_methods.v @@ -74,10 +74,14 @@ fn (mut g Gen) gen_free_method(typ ast.Type) string { g.gen_free_for_interface(sym, sym.info, styp, fn_name) } else { - println(g.table.type_str(typ)) - // print_backtrace() - println("could not generate free method '${fn_name}' for type '${styp}'") - // verror("could not generate free method '${fn_name}' for type '${styp}'") + if sym.kind == .u8 { + g.gen_free_for_plain_type(typ, styp, fn_name) + } else { + println(g.table.type_str(typ)) + // print_backtrace() + println("could not generate free method '${fn_name}' for type '${styp}'") + // verror("could not generate free method '${fn_name}' for type '${styp}'") + } } } return fn_name @@ -218,6 +222,17 @@ fn (mut g Gen) gen_free_for_map(typ ast.Type, styp string, fn_name string) { fn_builder.writeln('}') } +fn (mut g Gen) gen_free_for_plain_type(typ ast.Type, styp string, fn_name string) { + g.definitions.writeln('${g.static_non_parallel}void ${fn_name}(${styp}* it); // auto') + mut fn_builder := strings.new_builder(128) + defer { + g.auto_fn_definitions << fn_builder.str() + } + fn_builder.writeln('${g.static_non_parallel}inline void ${fn_name}(${styp}* it) {') + fn_builder.writeln('\t_v_free(it);') + fn_builder.writeln('}') +} + @[inline] fn styp_to_free_fn_name(styp string) string { return styp.replace_each(['*', '', '.', '__', ' ', '__']) + '_free' diff --git a/vlib/v/tests/u8_free_test.v b/vlib/v/tests/u8_free_test.v new file mode 100644 index 00000000000000..d48b4c5702820d --- /dev/null +++ b/vlib/v/tests/u8_free_test.v @@ -0,0 +1,11 @@ +fn test_main() { + unsafe { + mut data := malloc(4) + data[0] = c'f' + data[1] = c'o' + data[2] = c'o' + data[3] = c'\0' + assert data.vstring() == 'foo' + data.free() + } +} From 40808e98da79557d42b10e2158fa1b72f968e9a7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 27 Jan 2025 19:42:13 -0300 Subject: [PATCH 2/4] fix --- vlib/builtin/array.v | 5 +++++ vlib/v/gen/c/auto_free_methods.v | 23 ++++------------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index 44eddaf79a5257..5fe0d2472c1713 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -1058,6 +1058,11 @@ pub fn (data &u8) vbytes(len int) []u8 { return unsafe { voidptr(data).vbytes(len) } } +@[unsafe] +pub fn (data &u8) free() { + unsafe { free(data) } +} + @[if !no_bounds_checking ?; inline] fn panic_on_negative_len(len int) { if len < 0 { diff --git a/vlib/v/gen/c/auto_free_methods.v b/vlib/v/gen/c/auto_free_methods.v index 8806941164e929..7437e9fde0b044 100644 --- a/vlib/v/gen/c/auto_free_methods.v +++ b/vlib/v/gen/c/auto_free_methods.v @@ -74,14 +74,10 @@ fn (mut g Gen) gen_free_method(typ ast.Type) string { g.gen_free_for_interface(sym, sym.info, styp, fn_name) } else { - if sym.kind == .u8 { - g.gen_free_for_plain_type(typ, styp, fn_name) - } else { - println(g.table.type_str(typ)) - // print_backtrace() - println("could not generate free method '${fn_name}' for type '${styp}'") - // verror("could not generate free method '${fn_name}' for type '${styp}'") - } + println(g.table.type_str(typ)) + // print_backtrace() + println("could not generate free method '${fn_name}' for type '${styp}'") + // verror("could not generate free method '${fn_name}' for type '${styp}'") } } return fn_name @@ -222,17 +218,6 @@ fn (mut g Gen) gen_free_for_map(typ ast.Type, styp string, fn_name string) { fn_builder.writeln('}') } -fn (mut g Gen) gen_free_for_plain_type(typ ast.Type, styp string, fn_name string) { - g.definitions.writeln('${g.static_non_parallel}void ${fn_name}(${styp}* it); // auto') - mut fn_builder := strings.new_builder(128) - defer { - g.auto_fn_definitions << fn_builder.str() - } - fn_builder.writeln('${g.static_non_parallel}inline void ${fn_name}(${styp}* it) {') - fn_builder.writeln('\t_v_free(it);') - fn_builder.writeln('}') -} - @[inline] fn styp_to_free_fn_name(styp string) string { return styp.replace_each(['*', '', '.', '__', ' ', '__']) + '_free' From c22eb880701334280b36693fa09f486b868fccaf Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 27 Jan 2025 19:55:21 -0300 Subject: [PATCH 3/4] fix --- vlib/builtin/array.v | 1 + 1 file changed, 1 insertion(+) diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index 5fe0d2472c1713..804c0911713aee 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -1058,6 +1058,7 @@ pub fn (data &u8) vbytes(len int) []u8 { return unsafe { voidptr(data).vbytes(len) } } +// free frees the memory allocated @[unsafe] pub fn (data &u8) free() { unsafe { free(data) } From 9327be85a867e85c2e59e7ebea7a1883a6456c50 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 28 Jan 2025 08:38:29 -0300 Subject: [PATCH 4/4] fix --- vlib/v/gen/c/autofree.v | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vlib/v/gen/c/autofree.v b/vlib/v/gen/c/autofree.v index a7cd83891fffb3..ac90d38f017572 100644 --- a/vlib/v/gen/c/autofree.v +++ b/vlib/v/gen/c/autofree.v @@ -205,7 +205,7 @@ fn (mut g Gen) autofree_var_call(free_fn_name string, v ast.Var) { return } mut af := strings.new_builder(128) - if v.typ.is_ptr() { + if v.typ.is_ptr() && v.typ.idx() != ast.u8_type_idx { af.write_string('\t') if v.typ.share() == .shared_t { af.write_string(free_fn_name.replace_each(['__shared__', ''])) @@ -241,7 +241,7 @@ fn (mut g Gen) autofree_var_call(free_fn_name string, v ast.Var) { af.writeln('\tif (${c_name(v.name)}.state != 2) {') af.writeln('\t\t${free_fn_name}((${base_type}*)${c_name(v.name)}.data); // autofreed option var ${g.cur_mod.name} ${g.is_builtin_mod}') af.writeln('\t}') - } else { + } else if v.typ.idx() != ast.u8_type_idx { af.writeln('\t${free_fn_name}(&${c_name(v.name)}); // autofreed var ${g.cur_mod.name} ${g.is_builtin_mod}') } }