mirror of https://github.com/hyperledger/besu
EVM: Move from an EnumSet for halt reason to a simple Optional. (#1089)
Internally we used to use an enum set to track halt reasons and we would track multiple halt reasons. However, what the halt reason is does not matter to reference tests and tracing, only that a halt occurred. Repalace the EnumSet with an Optional and trace only one revert reason. This saves us time in enumset management and also allows us to return quicker once any halt is detected. Signed-off-by: Danno Ferrin <danno.ferrin@gmail.com>pull/1105/head
parent
256e5c914d
commit
11a3329ef7
@ -1,54 +0,0 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.vm.ehalt; |
||||
|
||||
import org.hyperledger.besu.ethereum.vm.EVM; |
||||
import org.hyperledger.besu.ethereum.vm.ExceptionalHaltReason; |
||||
import org.hyperledger.besu.ethereum.vm.MessageFrame; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.EnumSet; |
||||
import java.util.List; |
||||
|
||||
public class ExceptionalHaltManager { |
||||
|
||||
private static final List<ExceptionalHaltPredicate> GLOBAL = |
||||
Arrays.asList( |
||||
new InvalidOperationExceptionalHaltPredicate(), |
||||
new StackOverflowExceptionalHaltPredicate(), |
||||
new StackUnderflowExceptionalHaltPredicate(), |
||||
new InsufficientGasExceptionalHaltPredicate()); |
||||
|
||||
public static EnumSet<ExceptionalHaltReason> evaluateAll( |
||||
final MessageFrame frame, final EVM evm) { |
||||
final EnumSet<ExceptionalHaltReason> answer = EnumSet.noneOf(ExceptionalHaltReason.class); |
||||
for (final ExceptionalHaltPredicate predicate : GLOBAL) { |
||||
predicate.exceptionalHaltCondition(frame, answer, evm).ifPresent(answer::add); |
||||
} |
||||
|
||||
// TODO: Determine whether or not to short-circuit here.
|
||||
// Several operations (e.g. JUMP and JUMPI) have stack dependent checks.
|
||||
|
||||
if (!answer.contains(ExceptionalHaltReason.INSUFFICIENT_STACK_ITEMS)) { |
||||
// Evaluate any operation specific halt conditions too.
|
||||
frame |
||||
.getCurrentOperation() |
||||
.exceptionalHaltCondition(frame, answer, evm) |
||||
.ifPresent(answer::add); |
||||
} |
||||
|
||||
return answer; |
||||
} |
||||
} |
Loading…
Reference in new issue