@@ -63,18 +63,12 @@ private void checkMemorySize(OpCode op, BigInteger newMemSize) {
6363
6464
6565 private long calcMemEnergy (EnergyCost energyCosts , long oldMemSize , BigInteger newMemSize ,
66- long copySize ) {
66+ long copySize , OpCode op ) {
6767 //todo: simpfy this calc, just use energy relative to energy time
6868
6969 long energyCost = 0 ;
7070
71- // Avoid overflows
72- if (newMemSize .compareTo (MAX_MEM_SIZE ) > 0 ) {
73- // throw VMMemoryOverflowException();
74- throw Program .Exception .energyOverflow (newMemSize , MAX_MEM_SIZE );
75- // todo: add memory overflow
76- // throw Program.Exception.memoryOverflow();
77- }
71+ checkMemorySize (op , newMemSize );
7872
7973 // memory drop consume calc
8074 long memoryUsage = (newMemSize .longValue () + 31 ) / 32 * 32 ;
@@ -160,26 +154,26 @@ public void step(Program program) {
160154 case MSTORE :
161155 energyCost = calcMemEnergy (energyCosts , oldMemSize ,
162156 memNeeded (stack .peek (), new DataWord (32 )),
163- 0 );
157+ 0 , op );
164158 break ;
165159 case MSTORE8 :
166160 energyCost = calcMemEnergy (energyCosts , oldMemSize ,
167161 memNeeded (stack .peek (), new DataWord (1 )),
168- 0 );
162+ 0 , op );
169163 break ;
170164 case MLOAD :
171165 energyCost = calcMemEnergy (energyCosts , oldMemSize ,
172166 memNeeded (stack .peek (), new DataWord (32 )),
173- 0 );
167+ 0 , op );
174168 break ;
175169 case RETURN :
176170 case REVERT :
177171 energyCost = energyCosts .getSTOP () + calcMemEnergy (energyCosts , oldMemSize ,
178- memNeeded (stack .peek (), stack .get (stack .size () - 2 )), 0 );
172+ memNeeded (stack .peek (), stack .get (stack .size () - 2 )), 0 , op );
179173 break ;
180174 case SHA3 :
181175 energyCost = energyCosts .getSHA3 () + calcMemEnergy (energyCosts , oldMemSize ,
182- memNeeded (stack .peek (), stack .get (stack .size () - 2 )), 0 );
176+ memNeeded (stack .peek (), stack .get (stack .size () - 2 )), 0 , op );
183177 DataWord size = stack .get (stack .size () - 2 );
184178 long chunkUsed = (size .longValueSafe () + 31 ) / 32 ;
185179 energyCost += chunkUsed * energyCosts .getSHA3_WORD ();
@@ -188,20 +182,20 @@ public void step(Program program) {
188182 case RETURNDATACOPY :
189183 energyCost = calcMemEnergy (energyCosts , oldMemSize ,
190184 memNeeded (stack .peek (), stack .get (stack .size () - 3 )),
191- stack .get (stack .size () - 3 ).longValueSafe ());
185+ stack .get (stack .size () - 3 ).longValueSafe (), op );
192186 break ;
193187 case CODECOPY :
194188 energyCost = calcMemEnergy (energyCosts , oldMemSize ,
195189 memNeeded (stack .peek (), stack .get (stack .size () - 3 )),
196- stack .get (stack .size () - 3 ).longValueSafe ());
190+ stack .get (stack .size () - 3 ).longValueSafe (), op );
197191 break ;
198192 case EXTCODESIZE :
199193 energyCost = energyCosts .getEXT_CODE_SIZE ();
200194 break ;
201195 case EXTCODECOPY :
202196 energyCost = energyCosts .getEXT_CODE_COPY () + calcMemEnergy (energyCosts , oldMemSize ,
203197 memNeeded (stack .get (stack .size () - 2 ), stack .get (stack .size () - 4 )),
204- stack .get (stack .size () - 4 ).longValueSafe ());
198+ stack .get (stack .size () - 4 ).longValueSafe (), op );
205199 break ;
206200 case CALL :
207201 case CALLCODE :
@@ -232,7 +226,7 @@ public void step(Program program) {
232226 stack .get (stack .size () - opOff - 1 )); // in offset+size
233227 BigInteger out = memNeeded (stack .get (stack .size () - opOff - 2 ),
234228 stack .get (stack .size () - opOff - 3 )); // out offset+size
235- energyCost += calcMemEnergy (energyCosts , oldMemSize , in .max (out ), 0 );
229+ energyCost += calcMemEnergy (energyCosts , oldMemSize , in .max (out ), 0 , op );
236230 checkMemorySize (op , in .max (out ));
237231
238232 if (energyCost > program .getEnergyLimitLeft ().longValueSafe ()) {
@@ -249,7 +243,7 @@ public void step(Program program) {
249243 break ;
250244 case CREATE :
251245 energyCost = energyCosts .getCREATE () + calcMemEnergy (energyCosts , oldMemSize ,
252- memNeeded (stack .get (stack .size () - 2 ), stack .get (stack .size () - 3 )), 0 );
246+ memNeeded (stack .get (stack .size () - 2 ), stack .get (stack .size () - 3 )), 0 , op );
253247 break ;
254248 case LOG0 :
255249 case LOG1 :
@@ -271,7 +265,7 @@ public void step(Program program) {
271265 energyCosts .getLOG_DATA_ENERGY () * stack .get (stack .size () - 2 ).longValue () +
272266 calcMemEnergy (energyCosts , oldMemSize ,
273267 memNeeded (stack .peek (), stack .get (stack .size () - 2 )),
274- 0 );
268+ 0 , op );
275269
276270 checkMemorySize (op , memNeeded (stack .peek (), stack .get (stack .size () - 2 )));
277271 break ;
0 commit comments