Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions vlib/v/gen/c/cgen.v
Original file line number Diff line number Diff line change
Expand Up @@ -1388,11 +1388,11 @@ pub fn (mut g Gen) write_typeof_functions() {
}
already_generated_ifaces[sym.cname] = true
impl_types := inter_info.implementor_types(true)
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 {
Expand All @@ -1405,9 +1405,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 { '' }
Expand Down Expand Up @@ -11664,7 +11664,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"), ',
Expand Down
3 changes: 2 additions & 1 deletion vlib/v/gen/c/fn.v
Original file line number Diff line number Diff line change
Expand Up @@ -4194,7 +4194,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
}
}
Expand Down
1 change: 1 addition & 0 deletions vlib/v/gen/c/testdata/interface_type_name.c.must_have
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
builtin__charptr_vstring_literal(v_typeof_interface_main__Thing(
8 changes: 8 additions & 0 deletions vlib/v/gen/c/testdata/interface_type_name.vv
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
interface Thing {}

struct Item {}

fn main() {
t := Thing(Item{})
println(t.type_name())
}
3 changes: 3 additions & 0 deletions vlib/v/gen/c/testdata/no_builtin_interface_typeof.c.must_have
Original file line number Diff line number Diff line change
@@ -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";
9 changes: 9 additions & 0 deletions vlib/v/gen/c/testdata/no_builtin_interface_typeof.vv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// vtest vflags: -no-builtin
interface Thing {}

struct Item {}

fn main() {
h := Thing(Item{})
_ = h
}
Loading