cgen: fix interface _name_table generation; closes issue #73
parent
0e7192c9b7
commit
3b94a2b77a
|
@ -5598,9 +5598,6 @@ fn (mut g Gen) interface_table() string {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
inter_info := ityp.info as table.Interface
|
inter_info := ityp.info as table.Interface
|
||||||
if inter_info.types.len == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// interface_name is for example Speaker
|
// interface_name is for example Speaker
|
||||||
interface_name := c_name(ityp.name)
|
interface_name := c_name(ityp.name)
|
||||||
// generate a struct that references interface methods
|
// generate a struct that references interface methods
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
struct Point {
|
||||||
|
x i8
|
||||||
|
y i8
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawer) {
|
||||||
|
println(d.draw())
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Drawer {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_to_string_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
to_string(p)
|
||||||
|
assert true
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
struct Point {
|
||||||
|
x i8
|
||||||
|
y i8
|
||||||
|
z i8
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawer) string {
|
||||||
|
x := d.draw()
|
||||||
|
println(x)
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Drawer {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_to_string_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := to_string(p)
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
struct Point {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
z int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawer) string {
|
||||||
|
return d.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Drawer {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_calling_to_string() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := to_string(p)
|
||||||
|
println(res)
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
struct Point {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawer) string {
|
||||||
|
return d.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Drawer {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_p_draw_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := p.draw()
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
struct Point {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Drawer {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawer) string {
|
||||||
|
return d.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_p_draw_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := p.draw()
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
struct Point {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawable) string {
|
||||||
|
return d.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Drawable {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_p_draw_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := p.draw()
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
interface Drawable {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: this helper function forced the compiler to generate an
|
||||||
|
// interface dispatch table. Now, it should not be needed anymore,
|
||||||
|
// but it is better to test it too, to prevent future interface regressions.
|
||||||
|
fn (x Point) tointerface() Drawable {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawable) string {
|
||||||
|
return d.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_p_draw_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := p.draw()
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// The series of i?_test.v files, do test different edge cases for
|
||||||
|
// interface table generation. The differences may seem very minor
|
||||||
|
// (placement of the interface declaration, whether or not there are
|
||||||
|
// helper methods, etc), but PLEASE do NOT be tempted to merge them in
|
||||||
|
// a single _test.v file. Debugging interface code generation issues
|
||||||
|
// is *much easier* when the _test.v files are very short and focused.
|
||||||
|
interface Drawable {
|
||||||
|
draw() string
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (p Point) draw() string {
|
||||||
|
return 'Point($p.x,$p.y)'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_string(d Drawable) string {
|
||||||
|
return d.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_p_draw_can_be_called() {
|
||||||
|
p := Point{
|
||||||
|
x: 2
|
||||||
|
y: 3
|
||||||
|
}
|
||||||
|
res := p.draw()
|
||||||
|
assert res == 'Point(2,3)'
|
||||||
|
}
|
Loading…
Reference in New Issue