go.tools/go/ssa/interp: add no-op intrinsic sync.runtime_registerPoolCleanup

Also, compute correct index of struct field sync.Pool.New, which just changed.

LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/87780043
This commit is contained in:
Alan Donovan 2014-04-14 17:53:58 -04:00
parent b5d07c813b
commit 647d17e45f
1 changed files with 107 additions and 96 deletions

View File

@ -16,6 +16,7 @@ import (
"unsafe" "unsafe"
"code.google.com/p/go.tools/go/ssa" "code.google.com/p/go.tools/go/ssa"
"code.google.com/p/go.tools/go/types"
) )
type externalFn func(fr *frame, args []value) value type externalFn func(fr *frame, args []value) value
@ -30,101 +31,102 @@ var externals map[string]externalFn
func init() { func init() {
// That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd]. // That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd].
externals = map[string]externalFn{ externals = map[string]externalFn{
"(*sync.Pool).Get": ext۰sync۰Pool۰Get, "(*sync.Pool).Get": ext۰sync۰Pool۰Get,
"(*sync.Pool).Put": ext۰sync۰Pool۰Put, "(*sync.Pool).Put": ext۰sync۰Pool۰Put,
"(reflect.Value).Bool": ext۰reflect۰Value۰Bool, "(reflect.Value).Bool": ext۰reflect۰Value۰Bool,
"(reflect.Value).CanAddr": ext۰reflect۰Value۰CanAddr, "(reflect.Value).CanAddr": ext۰reflect۰Value۰CanAddr,
"(reflect.Value).CanInterface": ext۰reflect۰Value۰CanInterface, "(reflect.Value).CanInterface": ext۰reflect۰Value۰CanInterface,
"(reflect.Value).Elem": ext۰reflect۰Value۰Elem, "(reflect.Value).Elem": ext۰reflect۰Value۰Elem,
"(reflect.Value).Field": ext۰reflect۰Value۰Field, "(reflect.Value).Field": ext۰reflect۰Value۰Field,
"(reflect.Value).Float": ext۰reflect۰Value۰Float, "(reflect.Value).Float": ext۰reflect۰Value۰Float,
"(reflect.Value).Index": ext۰reflect۰Value۰Index, "(reflect.Value).Index": ext۰reflect۰Value۰Index,
"(reflect.Value).Int": ext۰reflect۰Value۰Int, "(reflect.Value).Int": ext۰reflect۰Value۰Int,
"(reflect.Value).Interface": ext۰reflect۰Value۰Interface, "(reflect.Value).Interface": ext۰reflect۰Value۰Interface,
"(reflect.Value).IsNil": ext۰reflect۰Value۰IsNil, "(reflect.Value).IsNil": ext۰reflect۰Value۰IsNil,
"(reflect.Value).IsValid": ext۰reflect۰Value۰IsValid, "(reflect.Value).IsValid": ext۰reflect۰Value۰IsValid,
"(reflect.Value).Kind": ext۰reflect۰Value۰Kind, "(reflect.Value).Kind": ext۰reflect۰Value۰Kind,
"(reflect.Value).Len": ext۰reflect۰Value۰Len, "(reflect.Value).Len": ext۰reflect۰Value۰Len,
"(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex, "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex,
"(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys, "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys,
"(reflect.Value).NumField": ext۰reflect۰Value۰NumField, "(reflect.Value).NumField": ext۰reflect۰Value۰NumField,
"(reflect.Value).NumMethod": ext۰reflect۰Value۰NumMethod, "(reflect.Value).NumMethod": ext۰reflect۰Value۰NumMethod,
"(reflect.Value).Pointer": ext۰reflect۰Value۰Pointer, "(reflect.Value).Pointer": ext۰reflect۰Value۰Pointer,
"(reflect.Value).Set": ext۰reflect۰Value۰Set, "(reflect.Value).Set": ext۰reflect۰Value۰Set,
"(reflect.Value).String": ext۰reflect۰Value۰String, "(reflect.Value).String": ext۰reflect۰Value۰String,
"(reflect.Value).Type": ext۰reflect۰Value۰Type, "(reflect.Value).Type": ext۰reflect۰Value۰Type,
"(reflect.Value).Uint": ext۰reflect۰Value۰Uint, "(reflect.Value).Uint": ext۰reflect۰Value۰Uint,
"(reflect.error).Error": ext۰reflect۰error۰Error, "(reflect.error).Error": ext۰reflect۰error۰Error,
"(reflect.rtype).Bits": ext۰reflect۰rtype۰Bits, "(reflect.rtype).Bits": ext۰reflect۰rtype۰Bits,
"(reflect.rtype).Elem": ext۰reflect۰rtype۰Elem, "(reflect.rtype).Elem": ext۰reflect۰rtype۰Elem,
"(reflect.rtype).Field": ext۰reflect۰rtype۰Field, "(reflect.rtype).Field": ext۰reflect۰rtype۰Field,
"(reflect.rtype).Kind": ext۰reflect۰rtype۰Kind, "(reflect.rtype).Kind": ext۰reflect۰rtype۰Kind,
"(reflect.rtype).NumField": ext۰reflect۰rtype۰NumField, "(reflect.rtype).NumField": ext۰reflect۰rtype۰NumField,
"(reflect.rtype).NumMethod": ext۰reflect۰rtype۰NumMethod, "(reflect.rtype).NumMethod": ext۰reflect۰rtype۰NumMethod,
"(reflect.rtype).NumOut": ext۰reflect۰rtype۰NumOut, "(reflect.rtype).NumOut": ext۰reflect۰rtype۰NumOut,
"(reflect.rtype).Out": ext۰reflect۰rtype۰Out, "(reflect.rtype).Out": ext۰reflect۰rtype۰Out,
"(reflect.rtype).Size": ext۰reflect۰rtype۰Size, "(reflect.rtype).Size": ext۰reflect۰rtype۰Size,
"(reflect.rtype).String": ext۰reflect۰rtype۰String, "(reflect.rtype).String": ext۰reflect۰rtype۰String,
"bytes.Equal": ext۰bytes۰Equal, "bytes.Equal": ext۰bytes۰Equal,
"bytes.IndexByte": ext۰bytes۰IndexByte, "bytes.IndexByte": ext۰bytes۰IndexByte,
"hash/crc32.haveSSE42": ext۰crc32۰haveSSE42, "hash/crc32.haveSSE42": ext۰crc32۰haveSSE42,
"math.Abs": ext۰math۰Abs, "math.Abs": ext۰math۰Abs,
"math.Exp": ext۰math۰Exp, "math.Exp": ext۰math۰Exp,
"math.Float32bits": ext۰math۰Float32bits, "math.Float32bits": ext۰math۰Float32bits,
"math.Float32frombits": ext۰math۰Float32frombits, "math.Float32frombits": ext۰math۰Float32frombits,
"math.Float64bits": ext۰math۰Float64bits, "math.Float64bits": ext۰math۰Float64bits,
"math.Float64frombits": ext۰math۰Float64frombits, "math.Float64frombits": ext۰math۰Float64frombits,
"math.Ldexp": ext۰math۰Ldexp, "math.Ldexp": ext۰math۰Ldexp,
"math.Log": ext۰math۰Log, "math.Log": ext۰math۰Log,
"math.Min": ext۰math۰Min, "math.Min": ext۰math۰Min,
"reflect.New": ext۰reflect۰New, "reflect.New": ext۰reflect۰New,
"reflect.TypeOf": ext۰reflect۰TypeOf, "reflect.TypeOf": ext۰reflect۰TypeOf,
"reflect.ValueOf": ext۰reflect۰ValueOf, "reflect.ValueOf": ext۰reflect۰ValueOf,
"reflect.init": ext۰reflect۰Init, "reflect.init": ext۰reflect۰Init,
"reflect.valueInterface": ext۰reflect۰valueInterface, "reflect.valueInterface": ext۰reflect۰valueInterface,
"runtime.Breakpoint": ext۰runtime۰Breakpoint, "runtime.Breakpoint": ext۰runtime۰Breakpoint,
"runtime.Caller": ext۰runtime۰Caller, "runtime.Caller": ext۰runtime۰Caller,
"runtime.Callers": ext۰runtime۰Callers, "runtime.Callers": ext۰runtime۰Callers,
"runtime.FuncForPC": ext۰runtime۰FuncForPC, "runtime.FuncForPC": ext۰runtime۰FuncForPC,
"runtime.GC": ext۰runtime۰GC, "runtime.GC": ext۰runtime۰GC,
"runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS, "runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS,
"runtime.Goexit": ext۰runtime۰Goexit, "runtime.Goexit": ext۰runtime۰Goexit,
"runtime.Gosched": ext۰runtime۰Gosched, "runtime.Gosched": ext۰runtime۰Gosched,
"runtime.NumCPU": ext۰runtime۰NumCPU, "runtime.NumCPU": ext۰runtime۰NumCPU,
"runtime.ReadMemStats": ext۰runtime۰ReadMemStats, "runtime.ReadMemStats": ext۰runtime۰ReadMemStats,
"runtime.SetFinalizer": ext۰runtime۰SetFinalizer, "runtime.SetFinalizer": ext۰runtime۰SetFinalizer,
"runtime.funcentry_go": ext۰runtime۰funcentry_go, "runtime.funcentry_go": ext۰runtime۰funcentry_go,
"runtime.funcline_go": ext۰runtime۰funcline_go, "runtime.funcline_go": ext۰runtime۰funcline_go,
"runtime.funcname_go": ext۰runtime۰funcname_go, "runtime.funcname_go": ext۰runtime۰funcname_go,
"runtime.getgoroot": ext۰runtime۰getgoroot, "runtime.getgoroot": ext۰runtime۰getgoroot,
"strings.IndexByte": ext۰strings۰IndexByte, "strings.IndexByte": ext۰strings۰IndexByte,
"sync.runtime_Semacquire": ext۰sync۰runtime_Semacquire, "sync.runtime_Semacquire": ext۰sync۰runtime_Semacquire,
"sync.runtime_Semrelease": ext۰sync۰runtime_Semrelease, "sync.runtime_Semrelease": ext۰sync۰runtime_Semrelease,
"sync.runtime_Syncsemcheck": ext۰sync۰runtime_Syncsemcheck, "sync.runtime_Syncsemcheck": ext۰sync۰runtime_Syncsemcheck,
"sync/atomic.AddInt32": ext۰atomic۰AddInt32, "sync.runtime_registerPoolCleanup": ext۰sync۰runtime_registerPoolCleanup,
"sync/atomic.AddUint32": ext۰atomic۰AddUint32, "sync/atomic.AddInt32": ext۰atomic۰AddInt32,
"sync/atomic.AddUint64": ext۰atomic۰AddUint64, "sync/atomic.AddUint32": ext۰atomic۰AddUint32,
"sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32, "sync/atomic.AddUint64": ext۰atomic۰AddUint64,
"sync/atomic.LoadInt32": ext۰atomic۰LoadInt32, "sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32,
"sync/atomic.LoadUint32": ext۰atomic۰LoadUint32, "sync/atomic.LoadInt32": ext۰atomic۰LoadInt32,
"sync/atomic.StoreInt32": ext۰atomic۰StoreInt32, "sync/atomic.LoadUint32": ext۰atomic۰LoadUint32,
"sync/atomic.StoreUint32": ext۰atomic۰StoreUint32, "sync/atomic.StoreInt32": ext۰atomic۰StoreInt32,
"syscall.Close": ext۰syscall۰Close, "sync/atomic.StoreUint32": ext۰atomic۰StoreUint32,
"syscall.Exit": ext۰syscall۰Exit, "syscall.Close": ext۰syscall۰Close,
"syscall.Fstat": ext۰syscall۰Fstat, "syscall.Exit": ext۰syscall۰Exit,
"syscall.Getpid": ext۰syscall۰Getpid, "syscall.Fstat": ext۰syscall۰Fstat,
"syscall.Getwd": ext۰syscall۰Getwd, "syscall.Getpid": ext۰syscall۰Getpid,
"syscall.Kill": ext۰syscall۰Kill, "syscall.Getwd": ext۰syscall۰Getwd,
"syscall.Lstat": ext۰syscall۰Lstat, "syscall.Kill": ext۰syscall۰Kill,
"syscall.Open": ext۰syscall۰Open, "syscall.Lstat": ext۰syscall۰Lstat,
"syscall.ParseDirent": ext۰syscall۰ParseDirent, "syscall.Open": ext۰syscall۰Open,
"syscall.RawSyscall": ext۰syscall۰RawSyscall, "syscall.ParseDirent": ext۰syscall۰ParseDirent,
"syscall.Read": ext۰syscall۰Read, "syscall.RawSyscall": ext۰syscall۰RawSyscall,
"syscall.ReadDirent": ext۰syscall۰ReadDirent, "syscall.Read": ext۰syscall۰Read,
"syscall.Stat": ext۰syscall۰Stat, "syscall.ReadDirent": ext۰syscall۰ReadDirent,
"syscall.Write": ext۰syscall۰Write, "syscall.Stat": ext۰syscall۰Stat,
"time.Sleep": ext۰time۰Sleep, "syscall.Write": ext۰syscall۰Write,
"time.now": ext۰time۰now, "time.Sleep": ext۰time۰Sleep,
"time.now": ext۰time۰now,
} }
} }
@ -137,7 +139,12 @@ func wrapError(err error) value {
} }
func ext۰sync۰Pool۰Get(fr *frame, args []value) value { func ext۰sync۰Pool۰Get(fr *frame, args []value) value {
if New := (*args[0].(*value)).(structure)[4]; New != nil { // It would be nice if this were less verbose.
sync := fr.i.prog.ImportedPackage("sync")
Pool := sync.Type("Pool").Type()
_, newIndex, _ := types.LookupFieldOrMethod(Pool, sync.Object, "New")
if New := (*args[0].(*value)).(structure)[newIndex[0]]; New != nil {
return call(fr.i, fr, 0, New, nil) return call(fr.i, fr, 0, New, nil)
} }
return nil return nil
@ -294,6 +301,10 @@ func ext۰sync۰runtime_Syncsemcheck(fr *frame, args []value) value {
return nil return nil
} }
func ext۰sync۰runtime_registerPoolCleanup(fr *frame, args []value) value {
return nil
}
func ext۰sync۰runtime_Semacquire(fr *frame, args []value) value { func ext۰sync۰runtime_Semacquire(fr *frame, args []value) value {
// TODO(adonovan): fix: implement. // TODO(adonovan): fix: implement.
return nil return nil