Skip to content

Commit cff7a5c

Browse files
committed
Feature: add a method to retrieve the output builtin from the VM
Problem: the output builtin often needs to be manipulated directly in the Starknet bootloader and OS hints. Solution: add a `get_output_builtin() method on the `VirtualMachine` struct to retrieve a reference to the output builtin easily.
1 parent 42e0416 commit cff7a5c

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vm/src/vm/errors/vm_errors.rs

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ pub enum VirtualMachineError {
8181
InconsistentAutoDeduction(Box<(&'static str, MaybeRelocatable, Option<MaybeRelocatable>)>),
8282
#[error("Invalid hint encoding at pc: {0}")]
8383
InvalidHintEncoding(Box<MaybeRelocatable>),
84+
#[error("Expected output builtin to be present")]
85+
NoOutputBuiltin,
8486
#[error("Expected range_check builtin to be present")]
8587
NoRangeCheckBuiltin,
8688
#[error("Expected ecdsa builtin to be present")]

vm/src/vm/vm_core.rs

+36-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use core::num::NonZeroUsize;
3232
use num_traits::{ToPrimitive, Zero};
3333

3434
use super::errors::runner_errors::RunnerError;
35-
use super::runners::builtin_runner::OUTPUT_BUILTIN_NAME;
35+
use super::runners::builtin_runner::{OutputBuiltinRunner, OUTPUT_BUILTIN_NAME};
3636

3737
const MAX_TRACEBACK_ENTRIES: u32 = 20;
3838

@@ -942,6 +942,17 @@ impl VirtualMachine {
942942

943943
Err(VirtualMachineError::NoSignatureBuiltin)
944944
}
945+
946+
pub fn get_output_builtin(&mut self) -> Result<&mut OutputBuiltinRunner, VirtualMachineError> {
947+
for builtin in self.get_builtin_runners_as_mut() {
948+
if let BuiltinRunner::Output(output_builtin) = builtin {
949+
return Ok(output_builtin);
950+
};
951+
}
952+
953+
Err(VirtualMachineError::NoOutputBuiltin)
954+
}
955+
945956
pub fn disable_trace(&mut self) {
946957
self.trace = None
947958
}
@@ -3842,6 +3853,30 @@ mod tests {
38423853
assert_eq!(builtins[1].name(), BITWISE_BUILTIN_NAME);
38433854
}
38443855

3856+
#[test]
3857+
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
3858+
fn test_get_output_builtin() {
3859+
let mut vm = vm!();
3860+
3861+
assert_matches!(
3862+
vm.get_output_builtin(),
3863+
Err(VirtualMachineError::NoOutputBuiltin)
3864+
);
3865+
3866+
let output_builtin = OutputBuiltinRunner::new(true);
3867+
vm.builtin_runners.push(output_builtin.clone().into());
3868+
3869+
let vm_output_builtin = vm
3870+
.get_output_builtin()
3871+
.expect("Output builtin should be returned");
3872+
3873+
assert_eq!(vm_output_builtin.base(), output_builtin.base());
3874+
assert_eq!(vm_output_builtin.pages, output_builtin.pages);
3875+
assert_eq!(vm_output_builtin.attributes, output_builtin.attributes);
3876+
assert_eq!(vm_output_builtin.stop_ptr, output_builtin.stop_ptr);
3877+
assert_eq!(vm_output_builtin.included, output_builtin.included);
3878+
}
3879+
38453880
#[test]
38463881
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
38473882
fn disable_trace() {

0 commit comments

Comments
 (0)