From 1b9b98fe54704fee048eb353a6e25a3db64c3770 Mon Sep 17 00:00:00 2001 From: wenxuanjun <41050170+wenxuanjun@users.noreply.github.com> Date: Wed, 27 May 2026 02:46:36 +0800 Subject: [PATCH] cgen: keep interface typeof independent of builtin string (#26812) --- vlib/v/gen/c/cgen.v | 12 ++++++------ vlib/v/gen/c/fn.v | 3 ++- .../v/gen/c/testdata/interface_type_name.c.must_have | 1 + vlib/v/gen/c/testdata/interface_type_name.vv | 8 ++++++++ .../testdata/no_builtin_interface_typeof.c.must_have | 3 +++ vlib/v/gen/c/testdata/no_builtin_interface_typeof.vv | 9 +++++++++ 6 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 vlib/v/gen/c/testdata/interface_type_name.c.must_have create mode 100644 vlib/v/gen/c/testdata/interface_type_name.vv create mode 100644 vlib/v/gen/c/testdata/no_builtin_interface_typeof.c.must_have create mode 100644 vlib/v/gen/c/testdata/no_builtin_interface_typeof.vv diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 8585e7bb6..d57b3bd75 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -1464,11 +1464,11 @@ pub fn (mut g Gen) write_typeof_functions() { } already_generated_ifaces[sym.cname] = true impl_types := g.runtime_interface_variants(inter_info) - g.definitions.writeln('${g.static_non_parallel}string v_typeof_interface_${sym.cname}(u32 sidx);') + g.definitions.writeln('${g.static_non_parallel}char * v_typeof_interface_${sym.cname}(u32 sidx);') if g.pref.parallel_cc { - g.extern_out.writeln('extern string v_typeof_interface_${sym.cname}(u32 sidx);') + g.extern_out.writeln('extern char * v_typeof_interface_${sym.cname}(u32 sidx);') } - g.writeln('${g.static_non_parallel}string v_typeof_interface_${sym.cname}(u32 sidx) {') + g.writeln('${g.static_non_parallel}char * v_typeof_interface_${sym.cname}(u32 sidx) {') for t in impl_types { sub_sym := g.table.sym(ast.mktyp(t)) if sub_sym.kind == .interface { @@ -1481,9 +1481,9 @@ pub fn (mut g Gen) write_typeof_functions() { && sub_sym.idx !in g.table.used_features.used_syms { continue } - g.writeln('\tif (sidx == _${sym.cname}_${sub_sym.cname}_index) return _S("${util.strip_main_name(sub_sym.name)}");') + g.writeln('\tif (sidx == _${sym.cname}_${sub_sym.cname}_index) return "${util.strip_main_name(sub_sym.name)}";') } - g.writeln2('\treturn _S("unknown ${util.strip_main_name(sym.name)}");', '}') + g.writeln2('\treturn "unknown ${util.strip_main_name(sym.name)}";', '}') // Avoid duplicate symbol '_v_typeof_interface_idx_IError' when using -usecache if g.pref.build_mode != .build_module { interface_idx_static_prefix := if g.pref.is_o { 'static ' } else { '' } @@ -13357,7 +13357,7 @@ return ${cast_shared_struct_str}; conversion_functions.writeln('\tif (x._typ == _${interface_name}_${variant_sym.cname}_index) return I_${variant_sym.cname}_to_Interface_${vsym.cname}(x._${variant_sym.cname});') } } - pmessage := 'builtin__string__plus(builtin__string__plus(_S("`as_cast`: cannot convert "), v_typeof_interface_${interface_name}(x._typ)), _S(" to ${util.strip_main_name(vsym.name)}"))' + pmessage := 'builtin__string__plus(builtin__string__plus(_S("`as_cast`: cannot convert "), builtin__tos3(v_typeof_interface_${interface_name}(x._typ))), _S(" to ${util.strip_main_name(vsym.name)}"))' if g.pref.is_debug { // TODO: actually return a valid position here conversion_functions.write_string2('\tbuiltin__panic_debug(1, builtin__tos3("builtin.v"), builtin__tos3("builtin"), builtin__tos3("__as_cast"), ', diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 0478c65c2..63861c767 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -4650,7 +4650,8 @@ fn (mut g Gen) method_call(node ast.CallExpr) { ')', node) return } else if left_sym.kind == .interface { - g.conversion_function_call('v_typeof_interface_${typ_sym.cname}', '', node) + g.conversion_function_call('builtin__charptr_vstring_literal(v_typeof_interface_${typ_sym.cname}', + ')', node) return } } diff --git a/vlib/v/gen/c/testdata/interface_type_name.c.must_have b/vlib/v/gen/c/testdata/interface_type_name.c.must_have new file mode 100644 index 000000000..f1077d2b9 --- /dev/null +++ b/vlib/v/gen/c/testdata/interface_type_name.c.must_have @@ -0,0 +1 @@ +builtin__charptr_vstring_literal(v_typeof_interface_main__Thing( diff --git a/vlib/v/gen/c/testdata/interface_type_name.vv b/vlib/v/gen/c/testdata/interface_type_name.vv new file mode 100644 index 000000000..92c61c222 --- /dev/null +++ b/vlib/v/gen/c/testdata/interface_type_name.vv @@ -0,0 +1,8 @@ +interface Thing {} + +struct Item {} + +fn main() { + t := Thing(Item{}) + println(t.type_name()) +} diff --git a/vlib/v/gen/c/testdata/no_builtin_interface_typeof.c.must_have b/vlib/v/gen/c/testdata/no_builtin_interface_typeof.c.must_have new file mode 100644 index 000000000..17b5d52f5 --- /dev/null +++ b/vlib/v/gen/c/testdata/no_builtin_interface_typeof.c.must_have @@ -0,0 +1,3 @@ +static char * v_typeof_interface_main__Thing(u32 sidx) { +if (sidx == _main__Thing_main__Item_index) return "Item"; +return "unknown Thing"; diff --git a/vlib/v/gen/c/testdata/no_builtin_interface_typeof.vv b/vlib/v/gen/c/testdata/no_builtin_interface_typeof.vv new file mode 100644 index 000000000..6bf285aca --- /dev/null +++ b/vlib/v/gen/c/testdata/no_builtin_interface_typeof.vv @@ -0,0 +1,9 @@ +// vtest vflags: -no-builtin +interface Thing {} + +struct Item {} + +fn main() { + h := Thing(Item{}) + _ = h +} -- 2.39.5