github.com/jujuyuki/gospal@v1.0.1-0.20210215170718-af79fae13b20/loop/stack.go (about) 1 package loop 2 3 import ( 4 "errors" 5 "sync" 6 ) 7 8 var ErrEmptyStack = errors.New("error: empty stack") 9 10 // Stack is a stack of ssa.BasicBlock 11 type Stack struct { 12 sync.Mutex 13 s []*Info 14 } 15 16 // NewStack creates a new LoopStack. 17 func NewStack() *Stack { 18 return &Stack{s: []*Info{}} 19 } 20 21 // Push adds a new Info to the top of stack. 22 func (s *Stack) Push(i *Info) { 23 s.Lock() 24 defer s.Unlock() 25 s.s = append(s.s, i) 26 } 27 28 // Pop removes a Loop from top of stack. 29 func (s *Stack) Pop() (*Info, error) { 30 s.Lock() 31 defer s.Unlock() 32 33 size := len(s.s) 34 if size == 0 { 35 return nil, ErrEmptyStack 36 } 37 l := s.s[size-1] 38 s.s = s.s[:size-1] 39 return l, nil 40 } 41 42 // IsEmpty returns true if stack is empty. 43 func (s *Stack) IsEmpty() bool { 44 return len(s.s) == 0 45 }