| 290 | } |
| 291 | |
| 292 | func (prog *Program) makeThunkKey(key selectionKey) *Function { |
| 293 | prog.methodsMu.Lock() |
| 294 | defer prog.methodsMu.Unlock() |
| 295 | |
| 296 | // Canonicalize key.recv to avoid constructing duplicate thunks. |
| 297 | canonRecv, ok := prog.canon.At(key.recv).(Type) |
| 298 | if !ok { |
| 299 | canonRecv = key.recv |
| 300 | prog.canon.Set(key.recv, canonRecv) |
| 301 | } |
| 302 | key.recv = canonRecv |
| 303 | |
| 304 | fn, ok := prog.thunks[key] |
| 305 | if !ok { |
| 306 | fn = prog.makeWrapperKey(key) |
| 307 | if fn.Signature.Recv() != nil { |
| 308 | panic(fn) // unexpected receiver |
| 309 | } |
| 310 | prog.thunks[key] = fn |
| 311 | } |
| 312 | return fn |
| 313 | } |
| 314 | |
| 315 | func changeRecv(s *Signature, recv *Var) *Signature { |
| 316 | return NewSignatureType(recv, nil, nil, s.Params(), s.Results(), s.Variadic()) |