c
Size: a a a
c
AT
c
c
AT
ВМ
ВМ
AT
AT
c
obj = [/*поля интерфейса А*/a, b, c, /*поля интерфейса B*/, c, d, e]
obj[Ashift + 2] = 1
obj[Bshift + 1] = 2
AT
obj = [/*поля интерфейса А*/a, b, c, /*поля интерфейса B*/, c, d, e]
obj[Ashift + 2] = 1
obj[Bshift + 1] = 2
AZ
AZ
AZ
c
function x(A g) {return g.a}
x(rand() ? new Foo() : new Bar)
function x(ptr) {return ptr + a_shift_in_A}
x(rand() ? fooPtr + A_shift_in_Foo : barPtr + A_shift_in_Bar)AT
function x(A g) {return g.a}
x(rand() ? new Foo() : new Bar)
function x(ptr) {return ptr + a_shift_in_A}
x(rand() ? fooPtr + A_shift_in_Foo : barPtr + A_shift_in_Bar)Foo layout:
X_vtable
A_vtable
B_vtable
field_foo : i32
Bar layout:
A_vtable
C_vtable
Y_vtable
fielf_foo : i32
field_foo в каждом из объектов? И это ещё не самы сложный layout.c
field_foo он к какому интерфейсу относится?AT
field_foo он к какому интерфейсу относится?c
c
a из интерфейса A то он подставляет это число A_shift_in_Bar
obj.a // objPtr + a_shift_in_A