Skip to content

Commit d7059b1

Browse files
committed
Less looping more caching
1 parent ef12624 commit d7059b1

File tree

1 file changed

+23
-18
lines changed

1 file changed

+23
-18
lines changed

pyevmasm/evmasm.py

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -621,12 +621,12 @@ class InstructionTable():
621621
Instruction(0x3, 'SUB', 0, 2, 1, 3, 'Subtraction operation.', None, 0)
622622
623623
"""
624-
__slots__ = ('_previous_fork', '_ilist', '_cache')
624+
__slots__ = ('_previous_fork', '_ilist', '_cache', '_name_to_opcode')
625625
def __init__(self, *args, **kwargs):
626626
self._previous_fork = kwargs.get('previous_fork', None)
627-
self._ilist = {}
628-
self._ilist.update(args[0])
627+
self._ilist = dict(args[0])
629628
self._cache = {}
629+
self._name_to_opcode = None
630630

631631
def _search_by_opcode(self, k):
632632
try:
@@ -637,21 +637,26 @@ def _search_by_opcode(self, k):
637637
raise KeyError(k)
638638

639639
def _search_by_name(self, k):
640-
for opcode, (name, operand_size, pushes, pops, gas, description) in self._ilist.items():
641-
if name == 'PUSH':
642-
long_name = 'PUSH%d' % operand_size
643-
elif name == 'DUP':
644-
long_name = 'DUP%d' % pops
645-
elif name == 'SWAP':
646-
long_name = 'SWAP%d' % (pops - 1)
647-
elif name == 'LOG':
648-
long_name ='LOG%d' % (pops - 2)
649-
else:
650-
long_name = name
651-
if long_name == k:
652-
return (opcode, name, operand_size, pushes, pops, gas, description)
653-
if self._previous_fork is not None:
654-
return self._previous_fork._search_by_name(k)
640+
if self._name_to_opcode is None:
641+
self._name_to_opcode = {}
642+
for opcode, (name, operand_size, pushes, pops, gas, description) in self._ilist.items():
643+
if name == 'PUSH':
644+
long_name = 'PUSH%d' % operand_size
645+
elif name == 'DUP':
646+
long_name = 'DUP%d' % pops
647+
elif name == 'SWAP':
648+
long_name = 'SWAP%d' % (pops - 1)
649+
elif name == 'LOG':
650+
long_name ='LOG%d' % (pops - 2)
651+
else:
652+
long_name = name
653+
self._name_to_opcode[long_name] = opcode
654+
655+
try:
656+
return self._search_by_opcode(self._name_to_opcode[k])
657+
except KeyError:
658+
if self._previous_fork is not None:
659+
return self._previous_fork._search_by_name(k)
655660
raise KeyError(k)
656661

657662
def _search(self, k):

0 commit comments

Comments
 (0)