vendor tsgo
This commit is contained in:
48
tools/tsgo/internal/project/programcounter.go
Normal file
48
tools/tsgo/internal/project/programcounter.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package project
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/microsoft/typescript-go/internal/compiler"
|
||||
)
|
||||
|
||||
type programCounter struct {
|
||||
mu sync.Mutex
|
||||
refs map[*compiler.Program]int32
|
||||
}
|
||||
|
||||
// Ref increments the reference count for a program. If the program is not
|
||||
// yet tracked, it is added with a reference count of 1.
|
||||
func (c *programCounter) Ref(program *compiler.Program) {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
if c.refs == nil {
|
||||
c.refs = make(map[*compiler.Program]int32)
|
||||
}
|
||||
c.refs[program]++
|
||||
}
|
||||
|
||||
func (c *programCounter) Deref(program *compiler.Program) bool {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
count, ok := c.refs[program]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
count--
|
||||
if count < 0 {
|
||||
panic("program reference count went below zero")
|
||||
}
|
||||
if count == 0 {
|
||||
delete(c.refs, program)
|
||||
return true
|
||||
}
|
||||
c.refs[program] = count
|
||||
return false
|
||||
}
|
||||
|
||||
func (c *programCounter) Len() int {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
return len(c.refs)
|
||||
}
|
||||
Reference in New Issue
Block a user