@@ -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