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

Commit 80eb9c9

Browse files
author
Jan Xie
committed
use lru_cache instead of unbound dict as vm code cache
1 parent 22e96d2 commit 80eb9c9

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,14 +8,17 @@
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 encode_hex, ascii_chr
1716
from ethereum.utils import to_string
18-
import numpy
17+
18+
if sys.version_info.major == 2:
19+
from repoze.lru import lru_cache
20+
else:
21+
from functools import lru_cache
1922

2023
log_log = get_logger('eth.vm.log')
2124
log_vm_exit = get_logger('eth.vm.exit')
@@ -99,6 +102,7 @@ def __init__(self, **kwargs):
99102

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

188-
code_cache = {}
189-
190192

191193
def vm_execute(ext, msg, code):
192194
# precompute trace flag
@@ -197,11 +199,7 @@ def vm_execute(ext, msg, code):
197199
stk = compustate.stack
198200
mem = compustate.memory
199201

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

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

ethereum/vm.py

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

55
# ######################################
6+
import sys
67
import copy
78
from ethereum import utils
89
from ethereum import opcodes
910
from ethereum.slogging import get_logger
1011
from rlp.utils import encode_hex, ascii_chr
1112
from ethereum.utils import to_string
1213

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

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

158-
code_cache = {}
159-
160165

161166
def vm_execute(ext, msg, code):
162167
# precompute trace flag
@@ -167,12 +172,7 @@ def vm_execute(ext, msg, code):
167172
stk = compustate.stack
168173
mem = compustate.memory
169174

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

178178
op = None

0 commit comments

Comments
 (0)