mirror of
https://github.com/vacp2p/linea-besu.git
synced 2026-01-09 15:37:54 -05:00
Change Array Copying (#5998)
* Change Array Copying Change array copying by re-using arrays when safe. Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> * spotless Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> * different bigint API Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> * straddle case Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> * less stack traces Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> * spotless Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> --------- Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com>
This commit is contained in:
@@ -424,7 +424,8 @@ public class EvmToolCommand implements Runnable {
|
||||
out.println(messageFrame.getExceptionalHaltReason().get());
|
||||
}
|
||||
if (messageFrame.getRevertReason().isPresent()) {
|
||||
out.println(new String(messageFrame.getRevertReason().get().toArray(), UTF_8));
|
||||
out.println(
|
||||
new String(messageFrame.getRevertReason().get().toArrayUnsafe(), UTF_8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ public class BlockchainReferenceTestTools {
|
||||
params.ignore("blockWithAllTransactionTypes");
|
||||
|
||||
// EIP-4788 is still in flux and the current fill is not against the final address
|
||||
params.ignore("[Cancun]");
|
||||
params.ignore("\\[Cancun\\]");
|
||||
|
||||
// EOF tests are written against an older version of the spec
|
||||
params.ignore("/stEOF/");
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
*/
|
||||
package org.hyperledger.besu.evm.frame;
|
||||
|
||||
import org.hyperledger.besu.evm.internal.Words;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.tuweni.bytes.Bytes;
|
||||
@@ -100,7 +102,7 @@ public class Memory {
|
||||
}
|
||||
|
||||
try {
|
||||
final long byteSize = Math.addExact(Math.addExact(location, numBytes), 31);
|
||||
final long byteSize = Words.clampedAdd(Words.clampedAdd(location, numBytes), 31);
|
||||
long wordSize = byteSize / 32;
|
||||
return Math.max(wordSize, activeWords);
|
||||
} catch (ArithmeticException ae) {
|
||||
|
||||
@@ -117,10 +117,12 @@ public interface Words {
|
||||
* @return value of a plus b if no over/underflows or Long.MAX_VALUE/Long.MIN_VALUE otherwise
|
||||
*/
|
||||
static long clampedAdd(final long a, final long b) {
|
||||
try {
|
||||
return Math.addExact(a, b);
|
||||
} catch (final ArithmeticException ae) {
|
||||
long r = a + b;
|
||||
if (((a ^ r) & (b ^ r)) < 0) {
|
||||
// out of bounds, clamp it!
|
||||
return a > 0 ? Long.MAX_VALUE : Long.MIN_VALUE;
|
||||
} else {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,10 +134,15 @@ public interface Words {
|
||||
* @return value of a times b if no over/underflows or Long.MAX_VALUE/Long.MIN_VALUE otherwise
|
||||
*/
|
||||
static long clampedMultiply(final long a, final long b) {
|
||||
try {
|
||||
return Math.multiplyExact(a, b);
|
||||
} catch (final ArithmeticException ae) {
|
||||
long r = a * b;
|
||||
long ax = Math.abs(a);
|
||||
long ay = Math.abs(b);
|
||||
if (((ax | ay) >>> 31 != 0)
|
||||
&& (((b != 0) && (r / b != a)) || (a == Long.MIN_VALUE && b == -1))) {
|
||||
// out of bounds, clamp it!
|
||||
return ((a ^ b) < 0) ? Long.MIN_VALUE : Long.MAX_VALUE;
|
||||
} else {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,9 +155,12 @@ public interface Words {
|
||||
* otherwise
|
||||
*/
|
||||
static int clampedMultiply(final int a, final int b) {
|
||||
try {
|
||||
return Math.multiplyExact(a, b);
|
||||
} catch (final ArithmeticException ae) {
|
||||
long r = (long) a * (long) b;
|
||||
int ri = (int) r;
|
||||
if (ri == r) {
|
||||
return ri;
|
||||
} else {
|
||||
// out of bounds, clamp it!
|
||||
return ((a ^ b) < 0) ? Integer.MIN_VALUE : Integer.MAX_VALUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public class AltBN128MulPrecompiledContract extends AbstractAltBnPrecompiledCont
|
||||
if (offset > input.size() || length == 0) {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
final byte[] raw = Arrays.copyOfRange(input.toArray(), offset, offset + length);
|
||||
final byte[] raw = Arrays.copyOfRange(input.toArrayUnsafe(), offset, offset + length);
|
||||
return new BigInteger(1, raw);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ public class AltBN128PairingPrecompiledContract extends AbstractAltBnPrecompiled
|
||||
if (offset > input.size() || length == 0) {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
final byte[] raw = Arrays.copyOfRange(input.toArray(), offset, offset + length);
|
||||
final byte[] raw = Arrays.copyOfRange(input.toArrayUnsafe(), offset, offset + length);
|
||||
return new BigInteger(1, raw);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ public class BLAKE2BFPrecompileContract extends AbstractPrecompiledContract {
|
||||
return 0L;
|
||||
}
|
||||
|
||||
final byte[] roundsBytes = copyOfRange(input.toArray(), 0, 4);
|
||||
final byte[] roundsBytes = copyOfRange(input.toArrayUnsafe(), 0, 4);
|
||||
final BigInteger rounds = new BigInteger(1, roundsBytes);
|
||||
return rounds.longValueExact();
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import org.hyperledger.besu.evm.gascalculator.GasCalculator;
|
||||
import org.hyperledger.besu.nativelib.arithmetic.LibArithmetic;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
@@ -200,11 +199,16 @@ public class BigIntegerModularExponentiationPrecompiledContract
|
||||
* @return the big integer
|
||||
*/
|
||||
public static BigInteger extractParameter(final Bytes input, final int offset, final int length) {
|
||||
if (offset > input.size() || length == 0) {
|
||||
if (offset >= input.size() || length == 0) {
|
||||
return BigInteger.ZERO;
|
||||
} else if (offset + length < input.size()) {
|
||||
return new BigInteger(1, input.slice(offset, length).toArray());
|
||||
} else {
|
||||
byte[] raw = new byte[length];
|
||||
Bytes partial = input.slice(offset);
|
||||
System.arraycopy(partial.toArray(), 0, raw, 0, partial.size());
|
||||
return new BigInteger(1, raw);
|
||||
}
|
||||
final byte[] raw = Arrays.copyOfRange(input.toArray(), offset, offset + length);
|
||||
return new BigInteger(1, raw);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -115,7 +115,7 @@ public class KZGPointEvalPrecompiledContract implements PrecompiledContract {
|
||||
return PrecompileContractResult.halt(
|
||||
null, Optional.of(ExceptionalHaltReason.PRECOMPILE_ERROR));
|
||||
} else {
|
||||
byte[] hash = Hash.sha256(commitment).toArray();
|
||||
byte[] hash = Hash.sha256(commitment).toArrayUnsafe();
|
||||
hash[0] = 0x01;
|
||||
if (!versionedHash.equals(Bytes32.wrap(hash))) {
|
||||
return PrecompileContractResult.halt(
|
||||
|
||||
@@ -211,7 +211,8 @@ public class EvmToyCommand implements Runnable {
|
||||
}
|
||||
if (messageFrame.getRevertReason().isPresent()) {
|
||||
out.println(
|
||||
new String(messageFrame.getRevertReason().get().toArray(), StandardCharsets.UTF_8));
|
||||
new String(
|
||||
messageFrame.getRevertReason().get().toArrayUnsafe(), StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
if (messageFrameStack.isEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user