|
|
|
@ -58,13 +58,6 @@ func (sa *stackArena) stack() *Stack { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// release un-claims the area of the arena which was claimed by the stack.
|
|
|
|
|
func (s *Stack) release() { |
|
|
|
|
// When the stack is returned, need to notify the arena that the new 'top' is
|
|
|
|
|
// the returned stack's bottom.
|
|
|
|
|
s.inner.top = s.bottom |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// newStackForTesting is meant to be used solely for testing. It creates a stack
|
|
|
|
|
// backed by a newly allocated arena.
|
|
|
|
|
func newStackForTesting() *Stack { |
|
|
|
@ -83,89 +76,96 @@ type Stack struct { |
|
|
|
|
inner *stackArena |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// release un-claims the area of the arena which was claimed by the stack.
|
|
|
|
|
func (s *Stack) release() { |
|
|
|
|
// When the stack is returned, need to notify the arena that the new 'top' is
|
|
|
|
|
// the returned stack's bottom.
|
|
|
|
|
s.inner.top = s.bottom |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Data returns the underlying uint256.Int array.
|
|
|
|
|
func (st *Stack) Data() []uint256.Int { |
|
|
|
|
return st.inner.data[st.bottom : st.bottom+st.size] |
|
|
|
|
func (s *Stack) Data() []uint256.Int { |
|
|
|
|
return s.inner.data[s.bottom : s.bottom+s.size] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (st *Stack) push(d *uint256.Int) { |
|
|
|
|
func (s *Stack) push(d *uint256.Int) { |
|
|
|
|
// NOTE push limit (1024) is checked in baseCheck
|
|
|
|
|
st.inner.push(d) |
|
|
|
|
st.size++ |
|
|
|
|
s.inner.push(d) |
|
|
|
|
s.size++ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (st *Stack) pop() uint256.Int { |
|
|
|
|
ret := st.inner.data[st.bottom+st.size-1] |
|
|
|
|
st.inner.pop() |
|
|
|
|
st.size-- |
|
|
|
|
func (s *Stack) pop() uint256.Int { |
|
|
|
|
ret := s.inner.data[s.bottom+s.size-1] |
|
|
|
|
s.inner.pop() |
|
|
|
|
s.size-- |
|
|
|
|
return ret |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (st *Stack) len() int { |
|
|
|
|
return st.size |
|
|
|
|
func (s *Stack) len() int { |
|
|
|
|
return s.size |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (st *Stack) swap1() { |
|
|
|
|
st.inner.data[st.bottom+st.size-2], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-2] |
|
|
|
|
func (s *Stack) swap1() { |
|
|
|
|
s.inner.data[s.bottom+s.size-2], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-2] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap2() { |
|
|
|
|
st.inner.data[st.bottom+st.size-3], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-3] |
|
|
|
|
func (s *Stack) swap2() { |
|
|
|
|
s.inner.data[s.bottom+s.size-3], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-3] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap3() { |
|
|
|
|
st.inner.data[st.bottom+st.size-4], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-4] |
|
|
|
|
func (s *Stack) swap3() { |
|
|
|
|
s.inner.data[s.bottom+s.size-4], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-4] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap4() { |
|
|
|
|
st.inner.data[st.bottom+st.size-5], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-5] |
|
|
|
|
func (s *Stack) swap4() { |
|
|
|
|
s.inner.data[s.bottom+s.size-5], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-5] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap5() { |
|
|
|
|
st.inner.data[st.bottom+st.size-6], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-6] |
|
|
|
|
func (s *Stack) swap5() { |
|
|
|
|
s.inner.data[s.bottom+s.size-6], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-6] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap6() { |
|
|
|
|
st.inner.data[st.bottom+st.size-7], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-7] |
|
|
|
|
func (s *Stack) swap6() { |
|
|
|
|
s.inner.data[s.bottom+s.size-7], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-7] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap7() { |
|
|
|
|
st.inner.data[st.bottom+st.size-8], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-8] |
|
|
|
|
func (s *Stack) swap7() { |
|
|
|
|
s.inner.data[s.bottom+s.size-8], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-8] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap8() { |
|
|
|
|
st.inner.data[st.bottom+st.size-9], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-9] |
|
|
|
|
func (s *Stack) swap8() { |
|
|
|
|
s.inner.data[s.bottom+s.size-9], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-9] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap9() { |
|
|
|
|
st.inner.data[st.bottom+st.size-10], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-10] |
|
|
|
|
func (s *Stack) swap9() { |
|
|
|
|
s.inner.data[s.bottom+s.size-10], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-10] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap10() { |
|
|
|
|
st.inner.data[st.bottom+st.size-11], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-11] |
|
|
|
|
func (s *Stack) swap10() { |
|
|
|
|
s.inner.data[s.bottom+s.size-11], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-11] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap11() { |
|
|
|
|
st.inner.data[st.bottom+st.size-12], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-12] |
|
|
|
|
func (s *Stack) swap11() { |
|
|
|
|
s.inner.data[s.bottom+s.size-12], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-12] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap12() { |
|
|
|
|
st.inner.data[st.bottom+st.size-13], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-13] |
|
|
|
|
func (s *Stack) swap12() { |
|
|
|
|
s.inner.data[s.bottom+s.size-13], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-13] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap13() { |
|
|
|
|
st.inner.data[st.bottom+st.size-14], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-14] |
|
|
|
|
func (s *Stack) swap13() { |
|
|
|
|
s.inner.data[s.bottom+s.size-14], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-14] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap14() { |
|
|
|
|
st.inner.data[st.bottom+st.size-15], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-15] |
|
|
|
|
func (s *Stack) swap14() { |
|
|
|
|
s.inner.data[s.bottom+s.size-15], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-15] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap15() { |
|
|
|
|
st.inner.data[st.bottom+st.size-16], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-16] |
|
|
|
|
func (s *Stack) swap15() { |
|
|
|
|
s.inner.data[s.bottom+s.size-16], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-16] |
|
|
|
|
} |
|
|
|
|
func (st *Stack) swap16() { |
|
|
|
|
st.inner.data[st.bottom+st.size-17], st.inner.data[st.bottom+st.size-1] = st.inner.data[st.bottom+st.size-1], st.inner.data[st.bottom+st.size-17] |
|
|
|
|
func (s *Stack) swap16() { |
|
|
|
|
s.inner.data[s.bottom+s.size-17], s.inner.data[s.bottom+s.size-1] = s.inner.data[s.bottom+s.size-1], s.inner.data[s.bottom+s.size-17] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (st *Stack) dup(n int) { |
|
|
|
|
func (s *Stack) dup(n int) { |
|
|
|
|
// TODO: check size of inner
|
|
|
|
|
st.inner.data[st.bottom+st.size] = st.inner.data[st.bottom+st.size-n] |
|
|
|
|
st.size++ |
|
|
|
|
st.inner.top++ |
|
|
|
|
s.inner.data[s.bottom+s.size] = s.inner.data[s.bottom+s.size-n] |
|
|
|
|
s.size++ |
|
|
|
|
s.inner.top++ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (st *Stack) peek() *uint256.Int { |
|
|
|
|
return &st.inner.data[st.bottom+st.size-1] |
|
|
|
|
func (s *Stack) peek() *uint256.Int { |
|
|
|
|
return &s.inner.data[s.bottom+s.size-1] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Back returns the n'th item in stack
|
|
|
|
|
func (st *Stack) Back(n int) *uint256.Int { |
|
|
|
|
return &st.inner.data[st.bottom+st.size-n-1] |
|
|
|
|
func (s *Stack) Back(n int) *uint256.Int { |
|
|
|
|
return &s.inner.data[s.bottom+s.size-n-1] |
|
|
|
|
} |
|
|
|
|