diff --git a/compiler/compiler.go b/compiler/compiler.go index f14193a8..b97f92ce 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -2272,8 +2272,9 @@ func (c *Compiler) getInvokeCall(frame *Frame, instr *ssa.CallCommon) (llvm.Valu llvmFnType = llvmFnType.Subtypes()[1] } + typecode := c.builder.CreateExtractValue(itf, 0, "invoke.typecode") values := []llvm.Value{ - itf, + typecode, llvm.ConstInt(c.ctx.Int16Type(), uint64(c.ir.MethodNum(instr.Method)), false), } fn := c.createRuntimeCall("interfaceMethod", values, "invoke.func") diff --git a/src/runtime/interface.go b/src/runtime/interface.go index 606d6956..b29b0766 100644 --- a/src/runtime/interface.go +++ b/src/runtime/interface.go @@ -48,12 +48,12 @@ var ( // Get the function pointer for the method on the interface. // This is a compiler intrinsic. //go:nobounds -func interfaceMethod(itf _interface, method uint16) *uint8 { +func interfaceMethod(typecode uint16, method uint16) *uint8 { // This function doesn't do bounds checking as the supplied method must be // in the list of signatures. The compiler will only emit // runtime.interfaceMethod calls when the method actually exists on this // interface (proven by the typechecker). - i := methodSetRanges[itf.typecode-firstTypeWithMethods].index + i := methodSetRanges[typecode-firstTypeWithMethods].index for { if methodSetSignatures[i] == method { return methodSetFunctions[i]