Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 1d6991c

Browse files
authored
Merge pull request #428 from ethereum/fix-vm-memory-leak
fix memory leak in vm
2 parents 35bfb19 + 0d87780 commit 1d6991c

File tree

2 files changed

+15
-17
lines changed

2 files changed

+15
-17
lines changed

ethereum/fastvm.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@
88
import sys
99

1010
from ethereum import utils
11-
from ethereum.abi import is_numeric
1211
import copy
1312
from ethereum import opcodes
1413
import time
1514
from ethereum.slogging import get_logger
1615
from rlp.utils import ascii_chr
1716
from ethereum.utils import encode_hex
1817
from ethereum.utils import to_string
19-
import numpy
18+
19+
if sys.version_info.major == 2:
20+
from repoze.lru import lru_cache
21+
else:
22+
from functools import lru_cache
2023

2124
log_log = get_logger('eth.vm.log')
2225
log_vm_exit = get_logger('eth.vm.exit')
@@ -100,6 +103,7 @@ def __init__(self, **kwargs):
100103

101104
# Preprocesses code, and determines which locations are in the middle
102105
# of pushdata and thus invalid
106+
@lru_cache(128)
103107
def preprocess_code(code):
104108
assert isinstance(code, bytes)
105109
code = memoryview(code).tolist()
@@ -186,8 +190,6 @@ def peaceful_exit(cause, gas, data, **kargs):
186190
log_vm_exit.trace('EXIT', cause=cause, **kargs)
187191
return 1, gas, data
188192

189-
code_cache = {}
190-
191193

192194
def vm_execute(ext, msg, code):
193195
# precompute trace flag
@@ -198,11 +200,7 @@ def vm_execute(ext, msg, code):
198200
stk = compustate.stack
199201
mem = compustate.memory
200202

201-
if code in code_cache:
202-
processed_code = code_cache[code]
203-
else:
204-
processed_code = preprocess_code(code)
205-
code_cache[code] = processed_code
203+
processed_code = preprocess_code(code)
206204

207205
s = time.time()
208206
op = None

ethereum/vm.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
verify_stack_after_op = False
44

55
# ######################################
6+
import sys
67
import copy
78
from ethereum import utils
89
from ethereum import opcodes
@@ -11,6 +12,11 @@
1112
from ethereum.utils import encode_hex
1213
from ethereum.utils import to_string
1314

15+
if sys.version_info.major == 2:
16+
from repoze.lru import lru_cache
17+
else:
18+
from functools import lru_cache
19+
1420
log_log = get_logger('eth.vm.log')
1521
log_vm_exit = get_logger('eth.vm.exit')
1622
log_vm_op = get_logger('eth.vm.op')
@@ -82,6 +88,7 @@ def __init__(self, **kwargs):
8288

8389
# Preprocesses code, and determines which locations are in the middle
8490
# of pushdata and thus invalid
91+
@lru_cache(128)
8592
def preprocess_code(code):
8693
assert isinstance(code, bytes)
8794
code = memoryview(code).tolist()
@@ -156,8 +163,6 @@ def peaceful_exit(cause, gas, data, **kargs):
156163
log_vm_exit.trace('EXIT', cause=cause, **kargs)
157164
return 1, gas, data
158165

159-
code_cache = {}
160-
161166

162167
def vm_execute(ext, msg, code):
163168
# precompute trace flag
@@ -168,12 +173,7 @@ def vm_execute(ext, msg, code):
168173
stk = compustate.stack
169174
mem = compustate.memory
170175

171-
if code in code_cache:
172-
processed_code = code_cache[code]
173-
else:
174-
processed_code = preprocess_code(code)
175-
code_cache[code] = processed_code
176-
176+
processed_code = preprocess_code(code)
177177
codelen = len(processed_code)
178178

179179
op = None

0 commit comments

Comments
 (0)