compiler_race.go 1013 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. //go:build race
  2. // +build race
  3. package encoder
  4. import (
  5. "sync"
  6. )
  7. var setsMu sync.RWMutex
  8. func CompileToGetCodeSet(ctx *RuntimeContext, typeptr uintptr) (*OpcodeSet, error) {
  9. initEncoder()
  10. if typeptr > typeAddr.MaxTypeAddr || typeptr < typeAddr.BaseTypeAddr {
  11. codeSet, err := compileToGetCodeSetSlowPath(typeptr)
  12. if err != nil {
  13. return nil, err
  14. }
  15. return getFilteredCodeSetIfNeeded(ctx, codeSet)
  16. }
  17. index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
  18. setsMu.RLock()
  19. if codeSet := cachedOpcodeSets[index]; codeSet != nil {
  20. filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
  21. if err != nil {
  22. setsMu.RUnlock()
  23. return nil, err
  24. }
  25. setsMu.RUnlock()
  26. return filtered, nil
  27. }
  28. setsMu.RUnlock()
  29. codeSet, err := newCompiler().compile(typeptr)
  30. if err != nil {
  31. return nil, err
  32. }
  33. filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
  34. if err != nil {
  35. return nil, err
  36. }
  37. setsMu.Lock()
  38. cachedOpcodeSets[index] = codeSet
  39. setsMu.Unlock()
  40. return filtered, nil
  41. }