@@ -85,6 +85,7 @@ def __init__(self, **kwargs):
85
85
self .stack = []
86
86
self .pc = 0
87
87
self .gas = 0
88
+ self .last_returned = bytearray ()
88
89
for kw in kwargs :
89
90
setattr (self , kw , kwargs [kw ])
90
91
@@ -381,16 +382,27 @@ def vm_execute(ext, msg, code):
381
382
elif op == 'CODESIZE' :
382
383
stk .append (len (processed_code ))
383
384
elif op == 'CODECOPY' :
384
- start , s1 , size = stk .pop (), stk .pop (), stk .pop ()
385
- if not mem_extend (mem , compustate , op , start , size ):
385
+ mstart , dstart , size = stk .pop (), stk .pop (), stk .pop ()
386
+ if not mem_extend (mem , compustate , op , mstart , size ):
386
387
return vm_exception ('OOG EXTENDING MEMORY' )
387
388
if not data_copy (compustate , size ):
388
389
return vm_exception ('OOG COPY DATA' )
389
390
for i in range (size ):
390
- if s1 + i < len (processed_code ):
391
- mem [start + i ] = processed_code [s1 + i ][4 ]
391
+ if dstart + i < len (processed_code ):
392
+ mem [mstart + i ] = processed_code [dstart + i ][4 ]
392
393
else :
393
- mem [start + i ] = 0
394
+ mem [mstart + i ] = 0
395
+ elif op == 'RETURNDATACOPY' :
396
+ mstart , dstart , size = stk .pop (), stk .pop (), stk .pop ()
397
+ if not mem_extend (mem , compustate , op , mstart , size ):
398
+ return vm_exception ('OOG EXTENDING MEMORY' )
399
+ if not data_copy (compustate , size ):
400
+ return vm_exception ('OOG COPY DATA' )
401
+ if dstart + size > len (compustate .last_returned ):
402
+ return vm_exception ('RETURNDATACOPY out of range' )
403
+ mem [mstart : mstart + size ] = compustate .last_returned
404
+ elif op == 'RETURNDATASIZE' :
405
+ stk .append (len (compustate .last_returned ))
394
406
elif op == 'GASPRICE' :
395
407
stk .append (ext .tx_gasprice )
396
408
elif op == 'EXTCODESIZE' :
@@ -614,6 +626,7 @@ def vm_execute(ext, msg, code):
614
626
for i in range (min (len (data ), memoutsz )):
615
627
mem [memoutstart + i ] = data [i ]
616
628
compustate .gas += gas
629
+ compustate .last_returned = bytearray (data )
617
630
elif op == 'RETURN' :
618
631
s0 , s1 = stk .pop (), stk .pop ()
619
632
if not mem_extend (mem , compustate , op , s0 , s1 ):
0 commit comments