use super::*;
impl VMBridge {
pub(crate) fn handle_and(
_bridge: &mut VMBridge,
context: &mut execution::ExecutionContext,
_state: &mut state::StateManager,
_storage: &mut storage::StorageManager,
gas: &mut execution::GasTracker,
) -> Result<(), VMBridgeError> {
gas.consume_gas("AND", None)
.map_err(|e| VMBridgeError::BridgeError {
message: e.to_string(),
})?;
let b = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let a = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let result = Self::and_stack_items(a, b)?;
context
.push_stack(result)
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
Ok(())
}
pub(crate) fn handle_or(
_bridge: &mut VMBridge,
context: &mut execution::ExecutionContext,
_state: &mut state::StateManager,
_storage: &mut storage::StorageManager,
gas: &mut execution::GasTracker,
) -> Result<(), VMBridgeError> {
gas.consume_gas("OR", None)
.map_err(|e| VMBridgeError::BridgeError {
message: e.to_string(),
})?;
let b = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let a = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let result = Self::or_stack_items(a, b)?;
context
.push_stack(result)
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
Ok(())
}
pub(crate) fn handle_xor(
_bridge: &mut VMBridge,
context: &mut execution::ExecutionContext,
_state: &mut state::StateManager,
_storage: &mut storage::StorageManager,
gas: &mut execution::GasTracker,
) -> Result<(), VMBridgeError> {
gas.consume_gas("XOR", None)
.map_err(|e| VMBridgeError::BridgeError {
message: e.to_string(),
})?;
let b = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let a = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let result = Self::xor_stack_items(a, b)?;
context
.push_stack(result)
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
Ok(())
}
pub(crate) fn handle_shl(
_bridge: &mut VMBridge,
context: &mut execution::ExecutionContext,
_state: &mut state::StateManager,
_storage: &mut storage::StorageManager,
gas: &mut execution::GasTracker,
) -> Result<(), VMBridgeError> {
gas.consume_gas("SHL", None)
.map_err(|e| VMBridgeError::BridgeError {
message: e.to_string(),
})?;
let shift = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let value = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let result = Self::shift_left_value(value, shift)?;
context
.push_stack(result)
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
Ok(())
}
pub(crate) fn handle_shr(
_bridge: &mut VMBridge,
context: &mut execution::ExecutionContext,
_state: &mut state::StateManager,
_storage: &mut storage::StorageManager,
gas: &mut execution::GasTracker,
) -> Result<(), VMBridgeError> {
gas.consume_gas("SHR", None)
.map_err(|e| VMBridgeError::BridgeError {
message: e.to_string(),
})?;
let shift = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let value = context
.pop_stack()
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
let result = Self::shift_right_value(value, shift)?;
context
.push_stack(result)
.map_err(|e| VMBridgeError::StackOperationFailed {
message: e.to_string(),
})?;
Ok(())
}
}