From 2df23a6698e5a04e73ca2016386b1e82b2674ae3 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 18 Mar 2023 09:47:40 -0300 Subject: [PATCH] json: fix ptr field access (#17690) --- vlib/json/json_encode_with_mut_test.v | 42 +++++++++++++++++++++++++++ vlib/v/gen/c/json.v | 14 +++++---- 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 vlib/json/json_encode_with_mut_test.v diff --git a/vlib/json/json_encode_with_mut_test.v b/vlib/json/json_encode_with_mut_test.v new file mode 100644 index 0000000000..34aee88f59 --- /dev/null +++ b/vlib/json/json_encode_with_mut_test.v @@ -0,0 +1,42 @@ +module main + +import json + +pub enum PlatformType { + unknown + osx + ubuntu + alpine +} + +pub enum CPUType { + unknown + intel + arm + intel32 + arm32 +} + +[heap] +pub struct Node { +pub: + name string = 'mymachine' +pub mut: + platform PlatformType + cputype CPUType + done map[string]string + environment map[string]string +} + +pub fn (mut node Node) save() ! { + data := json.encode(node) + dump(data) +} + +fn test_encode_with_mut_struct() { + mut n := Node{ + platform: .osx + cputype: .unknown + } + n.save() or { panic(err) } +} diff --git a/vlib/v/gen/c/json.v b/vlib/v/gen/c/json.v index 5c5a098246..b481601ec4 100644 --- a/vlib/v/gen/c/json.v +++ b/vlib/v/gen/c/json.v @@ -520,21 +520,25 @@ fn (mut g Gen) gen_struct_enc_dec(utyp ast.Type, type_info ast.TypeInfo, styp st } } if field_sym.kind == .enum_ { - enc.writeln('\tcJSON_AddItemToObject(o, "${name}", json__encode_u64(${prefix_enc}.${c_name(field.name)}));\n') + enc.writeln('\tcJSON_AddItemToObject(o, "${name}", json__encode_u64(${prefix_enc}${op}${c_name(field.name)}));\n') } else { if field_sym.name == 'time.Time' { // time struct requires special treatment // it has to be encoded as a unix timestamp number - enc.writeln('\tcJSON_AddItemToObject(o, "${name}", json__encode_u64(${prefix_enc}.${c_name(field.name)}._v_unix));') + enc.writeln('\tcJSON_AddItemToObject(o, "${name}", json__encode_u64(${prefix_enc}${op}${c_name(field.name)}._v_unix));') } else { if !field.typ.is_real_pointer() { enc.writeln('\tcJSON_AddItemToObject(o, "${name}", ${enc_name}(${prefix_enc}${op}${c_name(field.name)})); /*A*/') } else { arg_prefix := if field.typ.is_ptr() { '' } else { '*' } sptr_value := '${prefix_enc}${op}${c_name(field.name)}' - enc.writeln('\tif (${sptr_value} != 0) {') - enc.writeln('\t\tcJSON_AddItemToObject(o, "${name}", ${enc_name}(${arg_prefix}${sptr_value}));') - enc.writeln('\t}\n') + if !field.typ.has_flag(.option) { + enc.writeln('\tif (${sptr_value} != 0) {') + enc.writeln('\t\tcJSON_AddItemToObject(o, "${name}", ${enc_name}(${arg_prefix}${sptr_value}));') + enc.writeln('\t}\n') + } else { + enc.writeln('\t\tcJSON_AddItemToObject(o, "${name}", ${enc_name}(${arg_prefix}${sptr_value}));') + } } } }