parent
5d429140a4
commit
f6ebbc99cd
|
@ -5654,17 +5654,23 @@ fn (mut g Gen) interface_table() string {
|
||||||
field_styp := g.typ(field.typ)
|
field_styp := g.typ(field.typ)
|
||||||
if _ := st_sym.find_field(field.name) {
|
if _ := st_sym.find_field(field.name) {
|
||||||
cast_struct.writeln('\t\t.$cname = ($field_styp*)((char*)x + __offsetof_ptr(x, $cctype, $cname)),')
|
cast_struct.writeln('\t\t.$cname = ($field_styp*)((char*)x + __offsetof_ptr(x, $cctype, $cname)),')
|
||||||
|
} else if st_sym.kind == .array
|
||||||
|
&& field.name in ['element_size', 'data', 'offset', 'len', 'cap', 'flags'] {
|
||||||
|
// Manaully checking, we already knows array contains above fields
|
||||||
|
cast_struct.writeln('\t\t.$cname = ($field_styp*)((char*)x + __offsetof_ptr(x, $cctype, $cname)),')
|
||||||
} else {
|
} else {
|
||||||
// the field is embedded in another struct
|
// the field is embedded in another struct
|
||||||
cast_struct.write_string('\t\t.$cname = ($field_styp*)((char*)x')
|
cast_struct.write_string('\t\t.$cname = ($field_styp*)((char*)x')
|
||||||
if st == ast.voidptr_type {
|
if st == ast.voidptr_type {
|
||||||
cast_struct.write_string('/*.... ast.voidptr_type */')
|
cast_struct.write_string('/*.... ast.voidptr_type */')
|
||||||
} else {
|
} else {
|
||||||
for embed_type in st_sym.struct_info().embeds {
|
if st_sym.kind == .struct_ {
|
||||||
embed_sym := g.table.sym(embed_type)
|
for embed_type in st_sym.struct_info().embeds {
|
||||||
if _ := embed_sym.find_field(field.name) {
|
embed_sym := g.table.sym(embed_type)
|
||||||
cast_struct.write_string(' + __offsetof_ptr(x, $cctype, $embed_sym.embed_name()) + __offsetof_ptr(x, $embed_sym.cname, $cname)')
|
if _ := embed_sym.find_field(field.name) {
|
||||||
break
|
cast_struct.write_string(' + __offsetof_ptr(x, $cctype, $embed_sym.embed_name()) + __offsetof_ptr(x, $embed_sym.cname, $cname)')
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
4
|
||||||
|
1
|
|
@ -0,0 +1,8 @@
|
||||||
|
interface Source {
|
||||||
|
len int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println(Source('test').len)
|
||||||
|
println(Source([`a`]).len)
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
interface Source {
|
||||||
|
element_size int
|
||||||
|
data voidptr
|
||||||
|
offset int
|
||||||
|
len int
|
||||||
|
cap int
|
||||||
|
flags ArrayFlags
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_array_as_interface() {
|
||||||
|
arr := []rune{len: 1}
|
||||||
|
src := Source(arr)
|
||||||
|
assert arr.element_size == src.element_size
|
||||||
|
assert arr.data == src.data
|
||||||
|
assert arr.offset == src.offset
|
||||||
|
assert arr.len == src.len
|
||||||
|
assert arr.cap == src.cap
|
||||||
|
assert arr.flags == src.flags
|
||||||
|
}
|
Loading…
Reference in New Issue