diff --git a/nbt/nbt.go b/nbt/nbt.go index 8dec487..6f2c643 100644 --- a/nbt/nbt.go +++ b/nbt/nbt.go @@ -27,7 +27,6 @@ type Decoder struct { io.ByteReader io.Reader } - nameless bool } func NewDecoder(r io.Reader) *Decoder { diff --git a/nbt/read.go b/nbt/read.go index f0b4810..7210d2e 100644 --- a/nbt/read.go +++ b/nbt/read.go @@ -157,6 +157,7 @@ func (d *Decoder) unmarshal(val reflect.Value, tagType byte, tagName string) err return err } } + case TagCompound: if vk := val.Kind(); vk != reflect.Struct { return errors.New("cannot parse TagCompound as " + vk.String()) @@ -252,7 +253,7 @@ func (d *Decoder) readTag() (tagType byte, tagName string, err error) { return } - if tagType != TagEnd && !d.nameless { //Read Tag + if tagType != TagEnd { //Read Tag tagName, err = d.readString() } return diff --git a/nbt/typeinfo.go b/nbt/typeinfo.go index ba41666..0d49f56 100644 --- a/nbt/typeinfo.go +++ b/nbt/typeinfo.go @@ -2,6 +2,7 @@ package nbt import ( "reflect" + "sync" ) type typeInfo struct { @@ -9,7 +10,13 @@ type typeInfo struct { nameToIndex map[string]int } +var tinfoMap sync.Map + func getTypeInfo(typ reflect.Type) *typeInfo { + if ti, ok := tinfoMap.Load(typ); ok { + return ti.(*typeInfo) + } + tinfo := new(typeInfo) tinfo.nameToIndex = make(map[string]int) if typ.Kind() == reflect.Struct { @@ -27,7 +34,9 @@ func getTypeInfo(typ reflect.Type) *typeInfo { } } } - return tinfo + + ti, _ := tinfoMap.LoadOrStore(typ, tinfo) + return ti.(*typeInfo) } func (t *typeInfo) findIndexByName(name string) int {