compiler_race.go 998 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. if typeptr > typeAddr.MaxTypeAddr || typeptr < typeAddr.BaseTypeAddr {
  10. codeSet, err := compileToGetCodeSetSlowPath(typeptr)
  11. if err != nil {
  12. return nil, err
  13. }
  14. return getFilteredCodeSetIfNeeded(ctx, codeSet)
  15. }
  16. index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
  17. setsMu.RLock()
  18. if codeSet := cachedOpcodeSets[index]; codeSet != nil {
  19. filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
  20. if err != nil {
  21. setsMu.RUnlock()
  22. return nil, err
  23. }
  24. setsMu.RUnlock()
  25. return filtered, nil
  26. }
  27. setsMu.RUnlock()
  28. codeSet, err := newCompiler().compile(typeptr)
  29. if err != nil {
  30. return nil, err
  31. }
  32. filtered, err := getFilteredCodeSetIfNeeded(ctx, codeSet)
  33. if err != nil {
  34. return nil, err
  35. }
  36. setsMu.Lock()
  37. cachedOpcodeSets[index] = codeSet
  38. setsMu.Unlock()
  39. return filtered, nil
  40. }