From 10582a97ca3d147b29e1ca1c4069ce785a3ebde7 Mon Sep 17 00:00:00 2001
From: Jeffrey Wilcke <jeffrey@ethereum.org>
Date: Tue, 23 May 2017 10:52:11 +0200
Subject: [PATCH] core/vm: expose intpool to stack dup method

Improve the duplication method of the stack to reuse big ints by passing
in an existing integer pool.
---
 core/vm/instructions.go | 2 +-
 core/vm/stack.go        | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/core/vm/instructions.go b/core/vm/instructions.go
index c0ac911ac..42f1781d8 100644
--- a/core/vm/instructions.go
+++ b/core/vm/instructions.go
@@ -731,7 +731,7 @@ func makePush(size uint64, pushByteSize int) executionFunc {
 // make push instruction function
 func makeDup(size int64) executionFunc {
 	return func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
-		stack.dup(int(size))
+		stack.dup(evm.interpreter.intPool, int(size))
 		return nil, nil
 	}
 }
diff --git a/core/vm/stack.go b/core/vm/stack.go
index 2d1b7bb82..f4777c5b3 100644
--- a/core/vm/stack.go
+++ b/core/vm/stack.go
@@ -60,8 +60,8 @@ func (st *Stack) swap(n int) {
 	st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n]
 }
 
-func (st *Stack) dup(n int) {
-	st.push(new(big.Int).Set(st.data[st.len()-n]))
+func (st *Stack) dup(pool *intPool, n int) {
+	st.push(pool.get().Set(st.data[st.len()-n]))
 }
 
 func (st *Stack) peek() *big.Int {
-- 
GitLab