@@ -214,7 +214,6 @@ public EVMAbstractState smallStepSemantics(ValueExpression expression, ProgramPo
214214 case "GaslimitOperator" : // GASLIMIT
215215 case "ChainidOperator" : // CHAINID
216216 case "SelfbalanceOperator" : // SELFBALANCE
217- case "ReturndatasizeOperator" : // RETURNDATASIZE
218217 case "GaspriceOperator" : // GASPRICE
219218 case "CodesizeOperator" : // CODESIZE
220219 case "OriginOperator" : // ORIGIN
@@ -230,6 +229,23 @@ public EVMAbstractState smallStepSemantics(ValueExpression expression, ProgramPo
230229 return new EVMAbstractState (result , memory , storage );
231230 }
232231
232+ case "ReturndatasizeOperator" : { // RETURNDATASIZE
233+ for (AbstractStack stack : stacks ) {
234+ // stack corresponding to the case when
235+ // last call failed
236+ AbstractStack resultStackFailing = stack .clone ();
237+ resultStackFailing .push (StackElement .ZERO );
238+ result .add (resultStackFailing );
239+
240+ // stack corresponding to the case when
241+ // last call was successful
242+ AbstractStack resultStackSuccess = stack .clone ();
243+ resultStackSuccess .push (stack .getOutSize ());
244+ result .add (resultStackSuccess );
245+ }
246+
247+ return new EVMAbstractState (result , memory , storage );
248+ }
233249 case "PcOperator" : { // PC
234250 for (AbstractStack stack : stacks ) {
235251 AbstractStack resultStack = stack .clone ();
@@ -1755,7 +1771,11 @@ else if (indexOfByte.compareTo(new StackElement(Number.MAX_INT)) < 0) {
17551771 if (stack .hasBottomUntil (7 ))
17561772 continue ;
17571773 AbstractStack resultStack = stack .clone ();
1758- resultStack .popX (7 );
1774+ resultStack .popX (6 );
1775+
1776+ // Setting outsize
1777+ StackElement outSize = resultStack .pop ();
1778+ resultStack .setOutSize (outSize );
17591779
17601780 resultStack .push (StackElement .NOT_JUMPDEST_TOP );
17611781 result .add (resultStack );
@@ -1771,7 +1791,11 @@ else if (indexOfByte.compareTo(new StackElement(Number.MAX_INT)) < 0) {
17711791 if (stack .hasBottomUntil (7 ))
17721792 continue ;
17731793 AbstractStack resultStack = stack .clone ();
1774- resultStack .popX (7 );
1794+ resultStack .popX (6 );
1795+
1796+ // Setting outsize
1797+ StackElement outSize = resultStack .pop ();
1798+ resultStack .setOutSize (outSize );
17751799
17761800 resultStack .push (StackElement .NOT_JUMPDEST_TOP );
17771801 result .add (resultStack );
@@ -1803,7 +1827,11 @@ else if (indexOfByte.compareTo(new StackElement(Number.MAX_INT)) < 0) {
18031827 if (stack .hasBottomUntil (6 ))
18041828 continue ;
18051829 AbstractStack resultStack = stack .clone ();
1806- resultStack .popX (6 );
1830+ resultStack .popX (5 );
1831+
1832+ // Setting outsize
1833+ StackElement outSize = resultStack .pop ();
1834+ resultStack .setOutSize (outSize );
18071835
18081836 resultStack .push (StackElement .NOT_JUMPDEST_TOP );
18091837 result .add (resultStack );
@@ -1819,7 +1847,11 @@ else if (indexOfByte.compareTo(new StackElement(Number.MAX_INT)) < 0) {
18191847 if (stack .hasBottomUntil (6 ))
18201848 continue ;
18211849 AbstractStack resultStack = stack .clone ();
1822- resultStack .popX (6 );
1850+ resultStack .popX (5 );
1851+
1852+ // Setting outsize
1853+ StackElement outSize = resultStack .pop ();
1854+ resultStack .setOutSize (outSize );
18231855
18241856 resultStack .push (StackElement .NOT_JUMPDEST_TOP );
18251857 result .add (resultStack );
0 commit comments