Skip to content

Commit

Permalink
Change Array Copying (hyperledger#5998)
Browse files Browse the repository at this point in the history
* Change Array Copying

Change array copying by re-using arrays when safe.

Signed-off-by: Danno Ferrin <[email protected]>

* spotless

Signed-off-by: Danno Ferrin <[email protected]>

* different bigint API

Signed-off-by: Danno Ferrin <[email protected]>

* straddle case

Signed-off-by: Danno Ferrin <[email protected]>

* less stack traces

Signed-off-by: Danno Ferrin <[email protected]>

* spotless

Signed-off-by: Danno Ferrin <[email protected]>

---------

Signed-off-by: Danno Ferrin <[email protected]>
  • Loading branch information
shemnon authored Oct 9, 2023
1 parent 4b822d6 commit 573cb1b
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,8 @@ public void run() {
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));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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/");
Expand Down
4 changes: 3 additions & 1 deletion evm/src/main/java/org/hyperledger/besu/evm/frame/Memory.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -100,7 +102,7 @@ long calculateNewActiveWords(final long location, final long numBytes) {
}

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) {
Expand Down
28 changes: 19 additions & 9 deletions evm/src/main/java/org/hyperledger/besu/evm/internal/Words.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,12 @@ static int clampedToInt(final long l) {
* @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;
}
}

Expand All @@ -132,10 +134,15 @@ static long clampedAdd(final long a, final long b) {
* @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;
}
}

Expand All @@ -148,9 +155,12 @@ static long clampedMultiply(final long a, final long b) {
* 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;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ private static BigInteger extractParameter(
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ private static BigInteger extractParameter(
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public long gasRequirement(final Bytes input) {
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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.hyperledger.besu.nativelib.arithmetic.LibArithmetic;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Optional;
import javax.annotation.Nonnull;

Expand Down Expand Up @@ -200,11 +199,16 @@ public static long modulusLength(final Bytes input) {
* @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);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public PrecompileContractResult computePrecompile(
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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,8 @@ public void run() {
}
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()) {
Expand Down

0 comments on commit 573cb1b

Please sign in to comment.