From 05a6e557cfa0cd5936877da638066fe97bf55220 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 2 Mar 2025 04:52:26 -0300 Subject: [PATCH] json: fix json.decode autofree codegen (fix #23834) (#23839) --- vlib/v/gen/c/fn.v | 3 ++- .../testdata/autofree_json_decode.c.must_have | 2 ++ vlib/v/gen/c/testdata/autofree_json_decode.vv | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/testdata/autofree_json_decode.c.must_have create mode 100644 vlib/v/gen/c/testdata/autofree_json_decode.vv diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index f7461b3198..00c87e7acf 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2477,9 +2477,10 @@ fn (mut g Gen) call_args(node ast.CallExpr) { } } else { if use_tmp_var_autofree { + n := if node.name == 'json.decode' { i + 2 } else { i + 1 } // TODO: copypasta, move to an inline fn fn_name := node.name.replace('.', '_') - name := '_arg_expr_${fn_name}_${i + 1}_${node.pos.pos}' + name := '_arg_expr_${fn_name}_${n}_${node.pos.pos}' g.write('/*af arg2*/' + name) } else { g.expr(arg.expr) diff --git a/vlib/v/gen/c/testdata/autofree_json_decode.c.must_have b/vlib/v/gen/c/testdata/autofree_json_decode.c.must_have new file mode 100644 index 0000000000..af204932a3 --- /dev/null +++ b/vlib/v/gen/c/testdata/autofree_json_decode.c.must_have @@ -0,0 +1,2 @@ +string _arg_expr_json_decode_2_271 = string_str(msg); +cJSON* _t2 = json__json_parse(/*af arg2*/_arg_expr_json_decode_2_271); \ No newline at end of file diff --git a/vlib/v/gen/c/testdata/autofree_json_decode.vv b/vlib/v/gen/c/testdata/autofree_json_decode.vv new file mode 100644 index 0000000000..da0e97bc1a --- /dev/null +++ b/vlib/v/gen/c/testdata/autofree_json_decode.vv @@ -0,0 +1,19 @@ +// vtest vflags: -autofree +module main + +import json + +fn main() { + input := '{"methode":"test"}' + decode_message(input) or {} + assert true +} + +type BaseMessage = struct { + methode string @[json: methode] +} + +pub fn decode_message(msg string) !string { + decoded_json := json.decode(BaseMessage, msg.str())! + return decoded_json.str() +}