mirror of
https://github.com/golang/go
synced 2024-11-22 00:14:42 -07:00
gc: eliminate duplicates in method table
Fixes #906. R=ken2 CC=golang-dev https://golang.org/cl/2279042
This commit is contained in:
parent
7e92e1cbfa
commit
2d5e732c54
@ -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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
|||||||
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) {
|
|||||||
}
|
}
|
||||||
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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user