1// +build race 2 3package decoder 4 5import ( 6 "sync" 7 "unsafe" 8 9 "github.com/goccy/go-json/internal/runtime" 10) 11 12var decMu sync.RWMutex 13 14func CompileToGetDecoder(typ *runtime.Type) (Decoder, error) { 15 typeptr := uintptr(unsafe.Pointer(typ)) 16 if typeptr > typeAddr.MaxTypeAddr { 17 return compileToGetDecoderSlowPath(typeptr, typ) 18 } 19 20 index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift 21 decMu.RLock() 22 if dec := cachedDecoder[index]; dec != nil { 23 decMu.RUnlock() 24 return dec, nil 25 } 26 decMu.RUnlock() 27 28 dec, err := compileHead(typ, map[uintptr]Decoder{}) 29 if err != nil { 30 return nil, err 31 } 32 decMu.Lock() 33 cachedDecoder[index] = dec 34 decMu.Unlock() 35 return dec, nil 36} 37