mirror of
https://github.com/golang/go
synced 2024-11-19 00:54:42 -07:00
d7a9805478
Various reflect operations permit assignability conversions, i.e. their internals behave unlike y=x.(T) which unpacks only those interface values in x that are identical to T. We split typeAssertConstraint y=x.(T) into two constraints: 1) typeFilter, for when T is an interface type and no representation change occurs. 2) unpack, for when T is a concrete type and the payload of the tagged object is extracted. This constraint has an 'exact' parameter indicating whether to use the predicate IsIdentical (for type assertions) or IsAssignable (for reflect operators). + Tests. R=crawshaw CC=golang-dev https://golang.org/cl/14547043
44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
// Copyright 2013 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package pointer
|
|
|
|
import "fmt"
|
|
|
|
func (c *addrConstraint) String() string {
|
|
return fmt.Sprintf("addr n%d <- {&n%d}", c.dst, c.src)
|
|
}
|
|
|
|
func (c *copyConstraint) String() string {
|
|
return fmt.Sprintf("copy n%d <- n%d", c.dst, c.src)
|
|
}
|
|
|
|
func (c *loadConstraint) String() string {
|
|
return fmt.Sprintf("load n%d <- n%d[%d]", c.dst, c.src, c.offset)
|
|
}
|
|
|
|
func (c *storeConstraint) String() string {
|
|
return fmt.Sprintf("store n%d[%d] <- n%d", c.dst, c.offset, c.src)
|
|
}
|
|
|
|
func (c *offsetAddrConstraint) String() string {
|
|
return fmt.Sprintf("offsetAddr n%d <- n%d.#%d", c.dst, c.src, c.offset)
|
|
}
|
|
|
|
func (c *typeFilterConstraint) String() string {
|
|
return fmt.Sprintf("typeFilter n%d <- n%d.(%s)", c.dst, c.src, c.typ)
|
|
}
|
|
|
|
func (c *untagConstraint) String() string {
|
|
return fmt.Sprintf("untag n%d <- n%d.(%s)", c.dst, c.src, c.typ)
|
|
}
|
|
|
|
func (c *invokeConstraint) String() string {
|
|
return fmt.Sprintf("invoke n%d.%s(n%d ...)", c.iface, c.method.Name(), c.params+1)
|
|
}
|
|
|
|
func (n nodeid) String() string {
|
|
return fmt.Sprintf("n%d", n)
|
|
}
|