Add support for multiple interfaces
This commit is contained in:
@@ -5,28 +5,34 @@ interface Printable
|
||||
func print()
|
||||
}
|
||||
|
||||
struct Human : Printable
|
||||
interface Stringable
|
||||
{
|
||||
func str(): cstring
|
||||
}
|
||||
|
||||
struct Human : Printable, Stringable
|
||||
{
|
||||
name: cstring
|
||||
|
||||
func str(): cstring
|
||||
{
|
||||
return this^.name
|
||||
}
|
||||
|
||||
func print()
|
||||
{
|
||||
puts(this^.name)
|
||||
puts(this^.str())
|
||||
}
|
||||
}
|
||||
|
||||
func main(args: []cstring): i64
|
||||
{
|
||||
let human = alloc Human {
|
||||
let human: Stringable = alloc Human {
|
||||
name = "oliver"
|
||||
}
|
||||
|
||||
human.print()
|
||||
print_printable(human)
|
||||
puts(human.str())
|
||||
// human.print()
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func print_printable(printable: Printable)
|
||||
{
|
||||
printable.print()
|
||||
}
|
||||
@@ -459,9 +459,23 @@ public partial class QBEGenerator
|
||||
{
|
||||
var implementation = EmitUnwrap(EmitExpression(interfaceInitializer.Implementation));
|
||||
|
||||
var vtableOffset = 0;
|
||||
foreach (var interfaceImplementation in interfaceInitializer.StructType.InterfaceImplementations)
|
||||
{
|
||||
if (interfaceImplementation == interfaceInitializer.InterfaceType)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
vtableOffset += interfaceImplementation.Functions.Count * 8;
|
||||
}
|
||||
|
||||
var result = TmpName();
|
||||
_writer.Indented($"{result} =l alloc8 16");
|
||||
_writer.Indented($"storel {StructVtableName(interfaceInitializer.StructType.Name)}, {result}");
|
||||
|
||||
var interfaceVtablePointer = TmpName();
|
||||
_writer.Indented($"{interfaceVtablePointer} =l add {StructVtableName(interfaceInitializer.StructType.Name)}, {vtableOffset}");
|
||||
_writer.Indented($"storel {interfaceVtablePointer}, {result}");
|
||||
|
||||
var objectPointer = TmpName();
|
||||
_writer.Indented($"{objectPointer} =l add {result}, 8");
|
||||
|
||||
Reference in New Issue
Block a user