From 7eced03d66e1f9a79c6e6374c04195118545c27e Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Fri, 21 Sep 2018 17:00:32 +0200 Subject: [PATCH] Fix method resolution with pointers --- _test/method11.go | 15 +++++++++++++++ interp/gta.go | 7 +++++++ interp/interp_test.go | 22 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 _test/method11.go diff --git a/_test/method11.go b/_test/method11.go new file mode 100644 index 00000000..d9233aeb --- /dev/null +++ b/_test/method11.go @@ -0,0 +1,15 @@ +package main + +func main() { + o := &Coord{3, 4} + println(o.dist()) +} + +func (c *Coord) dist() int { return c.x*c.x + c.y*c.y } + +type Coord struct { + x, y int +} + +// Output: +// 25 diff --git a/interp/gta.go b/interp/gta.go index 907c8453..21087cf9 100644 --- a/interp/gta.go +++ b/interp/gta.go @@ -48,13 +48,20 @@ func (interp *Interpreter) Gta(root *Node) { typeName = receiver.child[1].ident } if typeName == "" { + // The receiver is a pointer, retrieve typeName from indirection typeName = receiver.child[1].child[0].ident elemtype := scope.getType(typeName) + if elemtype == nil { + // Add type if necessary, so method can be registered + scope.sym[typeName] = &Symbol{kind: Typ, typ: &Type{}} + elemtype = scope.sym[typeName].typ + } receiverType = &Type{cat: PtrT, val: elemtype} elemtype.method = append(elemtype.method, n) } else { receiverType = scope.getType(typeName) if receiverType == nil { + // Add type if necessary, so method can be registered scope.sym[typeName] = &Symbol{kind: Typ, typ: &Type{}} receiverType = scope.sym[typeName].typ } diff --git a/interp/interp_test.go b/interp/interp_test.go index 2170797e..918ef214 100644 --- a/interp/interp_test.go +++ b/interp/interp_test.go @@ -1499,6 +1499,28 @@ type Coord struct { // 25 } +func Example_method11() { + src := ` +package main + +func main() { + o := &Coord{3, 4} + println(o.dist()) +} + +func (c *Coord) dist() int { return c.x*c.x + c.y*c.y } + +type Coord struct { + x, y int +} +` + i := NewInterpreter(Opt{Entry: "main"}) + i.Eval(src) + + // Output: + // 25 +} + func Example_method2() { src := ` package main