Skip to content

Commit e32aa73

Browse files
authored
cgen: fix chan autostr (fix #26337) (#26338)
1 parent b0ea31e commit e32aa73

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

vlib/sync/channels.c.v

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,6 @@ fn new_channel_st_noscan(n u32, st u32) &Channel {
118118
}
119119
}
120120

121-
pub fn (ch &Channel) auto_str(typename string) string {
122-
return 'chan ${typename}{cap: ${ch.cap}, closed: ${ch.closed}}'
123-
}
124-
125121
pub fn (mut ch Channel) close() {
126122
open_val := u16(0)
127123
if !C.atomic_compare_exchange_strong_u16(&ch.closed, &open_val, 1) {

vlib/v/gen/c/auto_str_methods.v

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,27 @@ fn (mut g Gen) gen_str_for_chan(info ast.Chan, styp string, str_fn_name string)
565565
}
566566
elem_type_name := util.strip_main_name(g.table.get_type_name(g.unwrap_generic(info.elem_type)))
567567
g.definitions.writeln('${g.static_non_parallel}string ${str_fn_name}(${styp} x);')
568-
g.auto_str_funcs.writeln('${g.static_non_parallel}string ${str_fn_name}(${styp} x) { return sync__Channel_auto_str(x, _S("${elem_type_name}")); }')
568+
g.auto_str_funcs.writeln('${g.static_non_parallel}string ${str_fn_name}(${styp} x) { return indent_${str_fn_name}(x, 0);}')
569+
g.definitions.writeln('${g.static_non_parallel}string indent_${str_fn_name}(${styp} x, ${ast.int_type_name} indent_count);')
570+
g.auto_str_funcs.writeln('${g.static_non_parallel}string indent_${str_fn_name}(${styp} x, ${ast.int_type_name} indent_count) {')
571+
g.auto_str_funcs.writeln('\tstring indents = builtin__string_repeat(_S(" "), indent_count);')
572+
g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(64);')
573+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S("chan "));')
574+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S("${elem_type_name}"));')
575+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S("{\\n"));')
576+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, indents);')
577+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S(" cap: "));')
578+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, builtin__int_str(x->cap));')
579+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S(", closed: "));')
580+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, x->closed != 0 ? _S("true") : _S("false"));')
581+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S("\\n"));')
582+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, indents);')
583+
g.auto_str_funcs.writeln('\tstrings__Builder_write_string(&sb, _S("}"));')
584+
g.auto_str_funcs.writeln('\tstring res = strings__Builder_str(&sb);')
585+
g.auto_str_funcs.writeln('\tstrings__Builder_free(&sb);')
586+
g.auto_str_funcs.writeln('\tbuiltin__string_free(&indents);')
587+
g.auto_str_funcs.writeln('\treturn res;')
588+
g.auto_str_funcs.writeln('}')
569589
}
570590

571591
fn (mut g Gen) gen_str_for_thread(info ast.Thread, styp string, str_fn_name string) {
@@ -1265,7 +1285,7 @@ fn data_str(x StrIntpType) string {
12651285
}
12661286

12671287
fn should_use_indent_func(kind ast.Kind) bool {
1268-
return kind in [.struct, .alias, .array, .array_fixed, .map, .sum_type, .interface]
1288+
return kind in [.struct, .alias, .array, .array_fixed, .map, .sum_type, .interface, .chan]
12691289
}
12701290

12711291
fn (mut g Gen) get_enum_type_idx_from_fn_name(fn_name string) (string, int) {

vlib/v/tests/concurrency/channels_test.v

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ fn test_printing_of_channels() {
2121
res := (spawn fn1(ch)).wait()
2222
println(res)
2323
println(ch)
24-
assert res.str().contains('another: chan f64{cap: 100, closed: 0}')
25-
assert ch.str() == 'chan St1{cap: 10, closed: 0}'
26-
assert fch.str() == 'chan f64{cap: 100, closed: 0}'
24+
assert res.str().contains('another: chan f64{\n cap: 100, closed: false\n }')
25+
assert ch.str() == 'chan St1{\n cap: 10, closed: false\n}'
26+
assert fch.str() == 'chan f64{\n cap: 100, closed: false\n}'
2727
fch.close()
28-
assert fch.str() == 'chan f64{cap: 100, closed: 1}'
28+
assert fch.str() == 'chan f64{\n cap: 100, closed: true\n}'
2929
}
3030

3131
struct Aa {}

0 commit comments

Comments
 (0)