From a05ef999ff10c2a54ab9fb408a425214ecc11d67 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 28 Jan 2025 18:54:33 -0300 Subject: [PATCH] builtin: add &u8.free() (fix #23592) (#23598) --- vlib/builtin/array.v | 6 ++++++ vlib/v/gen/c/autofree.v | 4 ++-- vlib/v/tests/u8_free_test.v | 11 +++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/u8_free_test.v diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index 44eddaf79a..804c091171 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -1058,6 +1058,12 @@ 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) } +} + @[if !no_bounds_checking ?; inline] fn panic_on_negative_len(len int) { if len < 0 { diff --git a/vlib/v/gen/c/autofree.v b/vlib/v/gen/c/autofree.v index a7cd83891f..ac90d38f01 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}') } } diff --git a/vlib/v/tests/u8_free_test.v b/vlib/v/tests/u8_free_test.v new file mode 100644 index 0000000000..d48b4c5702 --- /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() + } +}