mirror of
https://github.com/golang/go.git
synced 2025-05-06 16:13:04 +00:00
(reflect.Value).Send (reflect.Value).TrySend (reflect.Value).Recv (reflect.Value).TryRecv (reflect.Type).ChanOf (reflect.Type).In (reflect.Type).Out reflect.Indirect reflect.MakeChan Also: - specialize genInvoke when the receiver is a reflect.Type under the assumption that there's only one possible concrete type. This makes all reflect.Type operations context-sensitive since the calls are no longer dynamic. - Rename all variables to match the actual parameter names used in the reflect API. - Add pointer.Config.Reflection flag (exposed in oracle as --reflect, default false) to enable reflection. It currently adds about 20% running time. I'll make it true after the presolver is implemented. - Simplified worklist datatype and solver main loop slightly (~10% speed improvement). - Use addLabel() utility to add a label to a PTS. (Working on my 3 yr old 2x2GHz+4GB Mac vs 8x4GHz+24GB workstation, one really notices the cost of pointer analysis. Note to self: time to implement presolver.) R=crawshaw CC=golang-dev https://golang.org/cl/13242062
57 lines
1.9 KiB
Go
57 lines
1.9 KiB
Go
// +build ignore
|
|
|
|
package main
|
|
|
|
import "reflect"
|
|
import "unsafe"
|
|
|
|
var a, b int
|
|
var unknown bool
|
|
|
|
func reflectIndirect() {
|
|
ptr := &a
|
|
// Pointer:
|
|
print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int)) // @pointsto main.a
|
|
// Non-pointer:
|
|
print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0]) // @pointsto main.a
|
|
}
|
|
|
|
func reflectNewAt() {
|
|
var x [8]byte
|
|
print(reflect.NewAt(reflect.TypeOf(3), unsafe.Pointer(&x)).Interface()) // @types *int
|
|
}
|
|
|
|
// TODO(adonovan): report the location of the caller, not NewAt.
|
|
// #warning "unsound: main.reflectNewAt contains a reflect.NewAt.. call"
|
|
// @warning "unsound: reflect.NewAt.. call"
|
|
|
|
func reflectTypeOf() {
|
|
t := reflect.TypeOf(3)
|
|
if unknown {
|
|
t = reflect.TypeOf("foo")
|
|
}
|
|
// TODO(adonovan): make types.Eval let us refer to unexported types.
|
|
print(t) // #@types *reflect.rtype
|
|
print(reflect.Zero(t).Interface()) // @types int | string
|
|
newint := reflect.New(t).Interface() // @line rtonew
|
|
print(newint) // @types *int | *string
|
|
print(newint.(*int)) // @pointsto <alloc in reflect.New>
|
|
print(newint.(*string)) // @pointsto <alloc in reflect.New>
|
|
}
|
|
|
|
func reflectTypeElem() {
|
|
print(reflect.Zero(reflect.TypeOf(&a).Elem()).Interface()) // @types int
|
|
print(reflect.Zero(reflect.TypeOf([]string{}).Elem()).Interface()) // @types string
|
|
print(reflect.Zero(reflect.TypeOf(make(chan bool)).Elem()).Interface()) // @types bool
|
|
print(reflect.Zero(reflect.TypeOf(make(map[string]float64)).Elem()).Interface()) // @types float64
|
|
print(reflect.Zero(reflect.TypeOf([3]complex64{}).Elem()).Interface()) // @types complex64
|
|
print(reflect.Zero(reflect.TypeOf(3).Elem()).Interface()) // @types
|
|
}
|
|
|
|
func main() {
|
|
reflectIndirect()
|
|
reflectNewAt()
|
|
reflectTypeOf()
|
|
reflectTypeElem()
|
|
}
|