@@ -42,26 +42,30 @@ def process(vm: Vm, gas_limit: int) -> tuple[set[bytes], int]:
4242 case (Op .MUL , _, Element ('signature' ), _) | (Op .MUL , _, _, Element ('signature' )) | (Op .SHR , _, _, Element ('mulsig' )):
4343 vm .stack .peek ().label = 'mulsig'
4444
45- # Vyper _selector_section_dense()
46- case (Op .MOD , _, Element ('mulsig' ) | Element ('signature' ), Element () as s1 ):
47- ma = int .from_bytes (s1 .data , 'big' )
48- if ma < 128 :
49- for m in range (1 , ma ):
50- cloned_vm = copy .copy (vm )
51- cloned_vm .stack .peek ().data = m .to_bytes (32 , 'big' )
52- s , g = process (cloned_vm , (gas_limit - gas_used ) // ma )
53- selectors .update (s )
54- gas_used += g
55- if gas_used > gas_limit :
56- break
57- vm .stack .peek ().data = (0 ).to_bytes (32 , 'big' )
58-
45+ # Vyper _selector_section_dense()/_selector_section_sparse()
46+ # (sig MOD n_buckets) or (sig AND (n_buckets-1))
5947 case (
60- (Op .SHR , _, _, Element ('calldata' ))
61- | (Op .AND , _, Element ('signature' ), _)
62- | (Op .AND , _, _, Element ('signature' ))
63- | (Op .DIV , _, Element ('calldata' ), _)
48+ (Op .MOD as op , _, Element ('mulsig' ) | Element ('signature' ), Element () as s1 )
49+ | (Op .AND as op , _, Element ('signature' ), Element () as s1 )
50+ | (Op .AND as op , _, Element () as s1 , Element ('signature' ))
6451 ):
52+ if op == Op .AND and s1 .data == b'\x00 ' * 28 + b'\xff \xff \xff \xff ' :
53+ vm .stack .peek ().label = 'signature'
54+ else :
55+ ma = int .from_bytes (s1 .data , 'big' )
56+ if ma < 256 :
57+ to = ma if op == Op .MOD else ma + 1
58+ for m in range (1 , to ):
59+ cloned_vm = copy .copy (vm )
60+ cloned_vm .stack .peek ().data = m .to_bytes (32 , 'big' )
61+ s , g = process (cloned_vm , (gas_limit - gas_used ) // ma )
62+ selectors .update (s )
63+ gas_used += g
64+ if gas_used > gas_limit :
65+ break
66+ vm .stack .peek ().data = (0 ).to_bytes (32 , 'big' )
67+
68+ case (Op .SHR , _, _, Element ('calldata' )) | (Op .DIV , _, Element ('calldata' ), _):
6569 v = vm .stack .peek ()
6670 if v .data [- 4 :] == vm .calldata .data [:4 ]:
6771 vm .stack .peek ().label = 'signature'
0 commit comments