From 842e1a9aa70648a013d5a48073683f08332e461d Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Mon, 10 Nov 2008 14:53:40 -0800 Subject: [PATCH] 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 --- src/lib/reflect/value.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib/reflect/value.go b/src/lib/reflect/value.go index c7089b1580..fe41e3f926 100644 --- a/src/lib/reflect/value.go +++ b/src/lib/reflect/value.go @@ -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)); } -- 2.50.0