diff --git a/core/vm/eips.go b/core/vm/eips.go index 8a09856029..a7785fb019 100644 --- a/core/vm/eips.go +++ b/core/vm/eips.go @@ -237,7 +237,8 @@ func enable3855(jt *JumpTable) { // opPush0 implements the PUSH0 opcode func opPush0(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { - scope.Stack.get().Clear() + elem := scope.Stack.get() + elem.Clear() return nil, nil } diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 2cc8defb84..7b71a06a1d 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -536,12 +536,14 @@ func opJumpdest(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { } func opPc(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { - scope.Stack.get().SetUint64(*pc) + elem := scope.Stack.get() + elem.SetUint64(*pc) return nil, nil } func opMsize(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { - scope.Stack.get().SetUint64(uint64(scope.Memory.Len())) + elem := scope.Stack.get() + elem.SetUint64(uint64(scope.Memory.Len())) return nil, nil } @@ -1131,10 +1133,8 @@ func makeLog(size int) executionFunc { // opPush1 is a specialized version of pushN func opPush1(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { - var ( - codeLen = uint64(len(scope.Contract.Code)) - elem = scope.Stack.get() - ) + codeLen := uint64(len(scope.Contract.Code)) + elem := scope.Stack.get() *pc += 1 if *pc < codeLen { elem.SetUint64(uint64(scope.Contract.Code[*pc])) @@ -1146,10 +1146,8 @@ func opPush1(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { // opPush2 is a specialized version of pushN func opPush2(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) { - var ( - codeLen = uint64(len(scope.Contract.Code)) - elem = scope.Stack.get() - ) + codeLen := uint64(len(scope.Contract.Code)) + elem := scope.Stack.get() if *pc+2 < codeLen { elem.SetBytes2(scope.Contract.Code[*pc+1 : *pc+3]) } else if *pc+1 < codeLen { diff --git a/core/vm/interp_gen.go b/core/vm/interp_gen.go index 08edb5a04e..94fe339df5 100644 --- a/core/vm/interp_gen.go +++ b/core/vm/interp_gen.go @@ -705,9 +705,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 2 - stack.inner.data[stack.inner.top].SetUint64(pc) + elem := &stack.inner.data[stack.inner.top] stack.inner.top++ stack.size++ + elem.SetUint64(pc) pc++ continue mainLoop @@ -719,9 +720,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 2 - stack.inner.data[stack.inner.top].SetUint64(uint64(scope.Memory.Len())) + elem := &stack.inner.data[stack.inner.top] stack.inner.top++ stack.size++ + elem.SetUint64(uint64(scope.Memory.Len())) pc++ continue mainLoop @@ -742,9 +744,10 @@ mainLoop: return nil, ErrOutOfGas } contract.Gas.RegularGas -= 2 - stack.inner.data[stack.inner.top].Clear() + elem := &stack.inner.data[stack.inner.top] stack.inner.top++ stack.size++ + elem.Clear() pc++ continue mainLoop diff --git a/core/vm/stack.go b/core/vm/stack.go index 564345ccd8..9b208ff07a 100644 --- a/core/vm/stack.go +++ b/core/vm/stack.go @@ -105,10 +105,9 @@ func (s *Stack) push(d *uint256.Int) { // get returns a pointer to a newly created element // on top of the stack func (s *Stack) get() *uint256.Int { - elem := &s.inner.data[s.inner.top] s.inner.top++ s.size++ - return elem + return &s.inner.data[s.inner.top-1] } func (s *Stack) pop() uint256.Int {