From 6b3e394dce253e6f9e8c242fb25e8d93266c3851 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 8 Jun 2018 13:41:13 +0200 Subject: [PATCH] compiler: Fix ChangeInterface Keep the concrete type as interface type. Don't use the previous interface type as type number. --- tgo.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tgo.go b/tgo.go index 80118386..9209981a 100644 --- a/tgo.go +++ b/tgo.go @@ -1108,12 +1108,13 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) { // the subroutine is blocking. return c.parseCall(frame, expr.Common(), frame.taskHandle) case *ssa.ChangeInterface: - value, err := c.parseExpr(frame, expr.X) - if err != nil { - return llvm.Value{}, err - } - itfTypeNum := c.getInterfaceType(expr.X.Type()) - return c.builder.CreateInsertValue(value, itfTypeNum, 0, ""), nil + // Do not change between interface types: always use the underlying + // (concrete) type in the type number of the interface. Every method + // call on an interface will do a lookup which method to call. + // This is different from how the official Go compiler works, because of + // heap allocation and because it's easier to implement, see: + // https://research.swtch.com/interfaces + return c.parseExpr(frame, expr.X) case *ssa.ChangeType: return c.parseConvert(frame, expr.Type(), expr.X) case *ssa.Const: