From c5ec95508127678ebbd11df8bdcf30d83766a141 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 24 Mar 2021 01:21:53 +0100 Subject: [PATCH] compiler: fix lack of method name in interface matching This is required for correctly differentiating between interface types. --- compiler/interface.go | 2 +- compiler/testdata/interface.ll | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/compiler/interface.go b/compiler/interface.go index b4bf4cd0..ed75b357 100644 --- a/compiler/interface.go +++ b/compiler/interface.go @@ -186,7 +186,7 @@ func getTypeCodeName(t types.Type) string { case *types.Interface: methods := make([]string, t.NumMethods()) for i := 0; i < t.NumMethods(); i++ { - methods[i] = getTypeCodeName(t.Method(i).Type()) + methods[i] = t.Method(i).Name() + ":" + getTypeCodeName(t.Method(i).Type()) } return "interface:" + "{" + strings.Join(methods, ",") + "}" case *types.Map: diff --git a/compiler/testdata/interface.ll b/compiler/testdata/interface.ll index b958aa5f..b3c2f86a 100644 --- a/compiler/testdata/interface.ll +++ b/compiler/testdata/interface.ll @@ -11,9 +11,10 @@ target triple = "i686--linux" @"reflect/types.type:basic:int" = linkonce_odr constant %runtime.typecodeID zeroinitializer @"reflect/types.type:pointer:basic:int" = linkonce_odr constant %runtime.typecodeID { %runtime.typecodeID* @"reflect/types.type:basic:int", i32 0, %runtime.interfaceMethodInfo* null } @"reflect/types.type:pointer:named:error" = linkonce_odr constant %runtime.typecodeID { %runtime.typecodeID* @"reflect/types.type:named:error", i32 0, %runtime.interfaceMethodInfo* null } -@"reflect/types.type:named:error" = linkonce_odr constant %runtime.typecodeID { %runtime.typecodeID* @"reflect/types.type:interface:{func:{}{basic:string}}", i32 0, %runtime.interfaceMethodInfo* null } -@"reflect/types.type:interface:{func:{}{basic:string}}" = external constant %runtime.typecodeID -@"reflect/types.type:pointer:interface:{func:{}{basic:string}}" = linkonce_odr constant %runtime.typecodeID { %runtime.typecodeID* @"reflect/types.type:interface:{func:{}{basic:string}}", i32 0, %runtime.interfaceMethodInfo* null } +@"reflect/types.type:named:error" = linkonce_odr constant %runtime.typecodeID { %runtime.typecodeID* @"reflect/types.type:interface:{Error:func:{}{basic:string}}", i32 0, %runtime.interfaceMethodInfo* null } +@"reflect/types.type:interface:{Error:func:{}{basic:string}}" = external constant %runtime.typecodeID +@"reflect/types.type:pointer:interface:{String:func:{}{basic:string}}" = linkonce_odr constant %runtime.typecodeID { %runtime.typecodeID* @"reflect/types.type:interface:{String:func:{}{basic:string}}", i32 0, %runtime.interfaceMethodInfo* null } +@"reflect/types.type:interface:{String:func:{}{basic:string}}" = external constant %runtime.typecodeID @"reflect/types.type:basic:int$id" = external constant i8 @"func Error() string" = external constant i8 @"error$interface" = linkonce_odr constant [1 x i8*] [i8* @"func Error() string"] @@ -44,7 +45,7 @@ entry: define hidden %runtime._interface @main.anonymousInterfaceType(i8* %context, i8* %parentHandle) unnamed_addr { entry: - ret %runtime._interface { i32 ptrtoint (%runtime.typecodeID* @"reflect/types.type:pointer:interface:{func:{}{basic:string}}" to i32), i8* null } + ret %runtime._interface { i32 ptrtoint (%runtime.typecodeID* @"reflect/types.type:pointer:interface:{String:func:{}{basic:string}}" to i32), i8* null } } define hidden i1 @main.isInt(i32 %itf.typecode, i8* %itf.value, i8* %context, i8* %parentHandle) unnamed_addr {