From e421cb2bc222a8c59ead10647a6251acd2bef48f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 1 Dec 2024 06:21:26 -0300 Subject: [PATCH] cgen: fix autostr for interface with circular type (fix #23022) (#23026) --- vlib/v/gen/c/auto_str_methods.v | 25 +++++++++++-------- .../printing/dump_interface_circular_test.v | 10 ++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 vlib/v/tests/printing/dump_interface_circular_test.v diff --git a/vlib/v/gen/c/auto_str_methods.v b/vlib/v/gen/c/auto_str_methods.v index 03028a90af..ff2acf655f 100644 --- a/vlib/v/gen/c/auto_str_methods.v +++ b/vlib/v/gen/c/auto_str_methods.v @@ -420,17 +420,22 @@ fn (mut g Gen) gen_str_for_interface(info ast.Interface, styp string, typ_str st fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', ' return ${res};') } else { - mut val := '${func_name}(${deref}(${sub_sym.cname}*)x._${sub_sym.cname}' - if should_use_indent_func(sub_sym.kind) && !sym_has_str_method { - val += ', indent_count' + if !(sub_sym.kind == .array && g.table.sym(g.table.value_type(typ)).cname == styp) { + mut val := '${func_name}(${deref}(${sub_sym.cname}*)x._${sub_sym.cname}' + if should_use_indent_func(sub_sym.kind) && !sym_has_str_method { + val += ', indent_count' + } + val += ')' + res := 'str_intp(2, _MOV((StrIntpData[]){ + {_SLIT("${clean_interface_v_type_name}("), ${si_s_code}, {.d_s = ${val}}}, + {_SLIT(")"), 0, {.d_c = 0 }} + }))' + fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', + ' return ${res};\n') + } else { + fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', + ' return _SLIT("");\n') } - val += ')' - res := 'str_intp(2, _MOV((StrIntpData[]){ - {_SLIT("${clean_interface_v_type_name}("), ${si_s_code}, {.d_s = ${val}}}, - {_SLIT(")"), 0, {.d_c = 0 }} - }))' - fn_builder.write_string2('\tif (x._typ == _${styp}_${sub_sym.cname}_index)', - ' return ${res};\n') } } fn_builder.writeln('\treturn _SLIT("unknown interface value");') diff --git a/vlib/v/tests/printing/dump_interface_circular_test.v b/vlib/v/tests/printing/dump_interface_circular_test.v new file mode 100644 index 0000000000..a36b6c18ae --- /dev/null +++ b/vlib/v/tests/printing/dump_interface_circular_test.v @@ -0,0 +1,10 @@ +interface Any {} + +fn test_main() { + mut a := []Any{} + a.insert(0, Any(5)) + a.insert(1, Any(5.0)) + a.insert(2, Any(a[0])) + a.insert(3, Any(a)) // Terminated by signal 11 (SIGSEGV) + assert dump('${a}') == '[Any(5), Any(5.0), Any(5), ]' +}