core/vm: implement ensureStack

This commit is contained in:
MariusVanDerWijden 2025-05-06 18:00:31 +02:00
parent f83701fbb4
commit 7afd3c5323

View file

@ -29,26 +29,19 @@ type stackArena struct {
} }
func (sa *stackArena) push(value uint256.Int) { func (sa *stackArena) push(value uint256.Int) {
if len(sa.data) <= sa.top { sa.ensureStack()
// we need to grow the arena
sa.data = slices.Grow(sa.data, 512)
sa.data = sa.data[:cap(sa.data)]
}
sa.data[sa.top] = value sa.data[sa.top] = value
sa.top++ sa.top++
} }
// weird optimization, adds an element onto the stack // weird optimization, grows the stack if needed
// and returns a pointer to it. Might contain some old data // returns an element on top that can be used.
// so we need to make sure to properly overwrite it. func (sa *stackArena) ensureStack() {
func (sa *stackArena) peekElement() uint256.Int {
if len(sa.data) <= sa.top { if len(sa.data) <= sa.top {
// we need to grow the arena // we need to grow the arena
sa.data = slices.Grow(sa.data, 512) sa.data = slices.Grow(sa.data, 512)
sa.data = sa.data[:cap(sa.data)] sa.data = sa.data[:cap(sa.data)]
} }
elem := sa.data[sa.top]
return elem
} }
func (sa *stackArena) pop() { func (sa *stackArena) pop() {
@ -108,16 +101,16 @@ func (s *Stack) push(d uint256.Int) {
} }
func (s *Stack) pushBytes(d []byte) { func (s *Stack) pushBytes(d []byte) {
elem := s.inner.peekElement() s.inner.ensureStack()
elem.SetBytes(d) s.inner.data[s.bottom+s.size].SetBytes(d)
s.inner.push(elem) s.inner.top++
s.size++ s.size++
} }
func (s *Stack) pushU64(d uint64) { func (s *Stack) pushU64(d uint64) {
elem := s.inner.peekElement() s.inner.ensureStack()
elem.SetUint64(d) s.inner.data[s.bottom+s.size].SetUint64(d)
s.inner.push(elem) s.inner.top++
s.size++ s.size++
} }
@ -182,9 +175,9 @@ func (s *Stack) swap16() {
} }
func (s *Stack) dup(n int) { func (s *Stack) dup(n int) {
elem := s.inner.peekElement() s.inner.ensureStack()
elem.Set(&s.inner.data[s.bottom+s.size-n]) s.inner.data[s.bottom+s.size].Set(&s.inner.data[s.bottom+s.size-n])
s.inner.push(elem) s.inner.top++
s.size++ s.size++
} }