mirror of
https://github.com/golang/go
synced 2024-11-20 10:54:49 -07:00
Add a cache to avoid unnecessary parsing of type strings when constructing values
R=rsc DELTA=12 (9 added, 0 deleted, 3 changed) OCL=18916 CL=18921
This commit is contained in:
parent
10137e7f1d
commit
842e1a9aa7
@ -695,6 +695,7 @@ func FuncCreator(typ Type, addr Addr) Value {
|
||||
}
|
||||
|
||||
var creator *map[int] Creator
|
||||
var typecache *map[string] *Type
|
||||
|
||||
func init() {
|
||||
creator = new(map[int] Creator);
|
||||
@ -722,6 +723,8 @@ func init() {
|
||||
creator[StructKind] = &StructCreator;
|
||||
creator[InterfaceKind] = &InterfaceCreator;
|
||||
creator[FuncKind] = &FuncCreator;
|
||||
|
||||
typecache = new(map[string] *Type);
|
||||
}
|
||||
|
||||
func NewValueAddr(typ Type, addr Addr) Value {
|
||||
@ -752,10 +755,16 @@ export func NewInitValue(typ Type) Value {
|
||||
|
||||
export func NewValue(e Empty) Value {
|
||||
value, typestring := sys.reflect(e);
|
||||
typ := ParseTypeString("", typestring);
|
||||
p, ok := typecache[typestring];
|
||||
if !ok {
|
||||
typ := ParseTypeString("", typestring);
|
||||
p = new(Type);
|
||||
*p = typ;
|
||||
typecache[typestring] = p;
|
||||
}
|
||||
// Content of interface is a value; need a permanent copy to take its address
|
||||
// so we can modify the contents. Values contain pointers to 'values'.
|
||||
ap := new(uint64);
|
||||
*ap = value;
|
||||
return NewValueAddr(typ, PtrUint64ToAddr(ap));
|
||||
return NewValueAddr(*p, PtrUint64ToAddr(ap));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user