Commit 2d5e732c authored by Russ Cox's avatar Russ Cox

gc: eliminate duplicates in method table

Fixes #906.

R=ken2
CC=golang-dev
https://golang.org/cl/2279042
parent 7e92e1cb
...@@ -2935,6 +2935,11 @@ expandmeth(Sym *s, Type *t) ...@@ -2935,6 +2935,11 @@ expandmeth(Sym *s, Type *t)
if(t == T || t->xmethod != nil) if(t == T || t->xmethod != nil)
return; return;
// mark top-level method symbols
// so that expand1 doesn't consider them.
for(f=t->method; f != nil; f=f->down)
f->sym->flags |= SymUniq;
// generate all reachable methods // generate all reachable methods
slist = nil; slist = nil;
expand1(t, nelem(dotlist)-1, 0); expand1(t, nelem(dotlist)-1, 0);
...@@ -2954,6 +2959,9 @@ expandmeth(Sym *s, Type *t) ...@@ -2954,6 +2959,9 @@ expandmeth(Sym *s, Type *t)
} }
} }
for(f=t->method; f != nil; f=f->down)
f->sym->flags &= ~SymUniq;
t->xmethod = t->method; t->xmethod = t->method;
for(sl=slist; sl!=nil; sl=sl->link) { for(sl=slist; sl!=nil; sl=sl->link) {
if(sl->good) { if(sl->good) {
...@@ -2965,7 +2973,6 @@ expandmeth(Sym *s, Type *t) ...@@ -2965,7 +2973,6 @@ expandmeth(Sym *s, Type *t)
f->embedded = 2; f->embedded = 2;
f->down = t->xmethod; f->down = t->xmethod;
t->xmethod = f; t->xmethod = f;
} }
} }
} }
......
...@@ -1287,3 +1287,23 @@ func TestDotDotDot(t *testing.T) { ...@@ -1287,3 +1287,23 @@ func TestDotDotDot(t *testing.T) {
} }
t.Error(s) t.Error(s)
} }
type inner struct{}
type outer struct {
inner
}
func (*inner) m() {}
func (*outer) m() {}
func TestNestedMethods(t *testing.T) {
typ := Typeof((*outer)(nil))
if typ.NumMethod() != 1 || typ.Method(0).Func.Get() != NewValue((*outer).m).(*FuncValue).Get() {
t.Errorf("Wrong method table for outer: (m=%p)", (*outer).m)
for i := 0; i < typ.NumMethod(); i++ {
m := typ.Method(i)
t.Errorf("\t%d: %s %#x\n", i, m.Name, m.Func.Get())
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment