diff --git a/examples/easy_api.rs b/examples/easy_api.rs index 1d455232f7..9c11f2ad85 100644 --- a/examples/easy_api.rs +++ b/examples/easy_api.rs @@ -1,5 +1,5 @@ use cairo_native::{ - context::NativeContext, executor::JitNativeExecutor, utils::cairo_to_sierra, values::JitValue, + context::NativeContext, executor::JitNativeExecutor, utils::cairo_to_sierra, Value, }; use starknet_types_core::felt::Felt; use std::path::Path; @@ -18,7 +18,7 @@ fn main() { let native_program = native_context.compile(&sierra_program, false).unwrap(); // The parameters of the entry point. - let params = &[JitValue::Felt252(Felt::from_bytes_be_slice(b"user"))]; + let params = &[Value::Felt252(Felt::from_bytes_be_slice(b"user"))]; // Find the entry point id by its name. let entry_point = "hello::hello::greet"; diff --git a/examples/invoke.rs b/examples/invoke.rs index 7134d121fc..2468dc4e42 100644 --- a/examples/invoke.rs +++ b/examples/invoke.rs @@ -1,5 +1,5 @@ use cairo_native::{ - context::NativeContext, executor::JitNativeExecutor, utils::find_entry_point, values::JitValue, + context::NativeContext, executor::JitNativeExecutor, utils::find_entry_point, Value, }; use std::path::Path; use tracing_subscriber::{EnvFilter, FmtSubscriber}; @@ -30,7 +30,7 @@ fn main() { let native_executor = JitNativeExecutor::from_native_module(native_program, Default::default()); - let output = native_executor.invoke_dynamic(fn_id, &[JitValue::Felt252(1.into())], None); + let output = native_executor.invoke_dynamic(fn_id, &[Value::Felt252(1.into())], None); println!(); println!("Cairo program was compiled and executed successfully."); diff --git a/src/arch.rs b/src/arch.rs index dfef662e13..4e5eb35819 100644 --- a/src/arch.rs +++ b/src/arch.rs @@ -2,7 +2,7 @@ use crate::{ error, starknet::{ArrayAbi, U256}, types::TypeBuilder, - values::JitValue, + values::Value, }; use bumpalo::Bump; use cairo_lang_sierra::{ @@ -28,7 +28,7 @@ pub trait AbiArgument { /// A wrapper that implements `AbiArgument` for `JitValue`s. It contains all the required stuff to /// serialize all possible `JitValue`s. pub struct JitValueWithInfoWrapper<'a> { - pub value: &'a JitValue, + pub value: &'a Value, pub type_id: &'a ConcreteTypeId, pub info: &'a CoreTypeConcrete, @@ -39,7 +39,7 @@ pub struct JitValueWithInfoWrapper<'a> { impl<'a> JitValueWithInfoWrapper<'a> { fn map<'b>( &'b self, - value: &'b JitValue, + value: &'b Value, type_id: &'b ConcreteTypeId, ) -> Result, error::Error> where @@ -71,7 +71,7 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { heap_ptr.to_bytes(buffer)?; } (value, CoreTypeConcrete::Nullable(info)) => { - if matches!(value, JitValue::Null) { + if matches!(value, Value::Null) { null::<()>().to_bytes(buffer)?; } else { let ptr = value.to_jit(self.arena, self.registry, self.type_id)?; @@ -90,7 +90,7 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { self.map(value, &info.ty)?.to_bytes(buffer)? } - (JitValue::Array(_), CoreTypeConcrete::Array(_)) => { + (Value::Array(_), CoreTypeConcrete::Array(_)) => { // TODO: Assert that `info.ty` matches all the values' types. let abi_ptr = self.value.to_jit(self.arena, self.registry, self.type_id)?; @@ -101,19 +101,19 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { abi.until.to_bytes(buffer)?; abi.capacity.to_bytes(buffer)?; } - (JitValue::BoundedInt { .. }, CoreTypeConcrete::BoundedInt(_)) => todo!(), - (JitValue::Bytes31(value), CoreTypeConcrete::Bytes31(_)) => value.to_bytes(buffer)?, - (JitValue::EcPoint(x, y), CoreTypeConcrete::EcPoint(_)) => { + (Value::BoundedInt { .. }, CoreTypeConcrete::BoundedInt(_)) => todo!(), + (Value::Bytes31(value), CoreTypeConcrete::Bytes31(_)) => value.to_bytes(buffer)?, + (Value::EcPoint(x, y), CoreTypeConcrete::EcPoint(_)) => { x.to_bytes(buffer)?; y.to_bytes(buffer)?; } - (JitValue::EcState(x, y, x0, y0), CoreTypeConcrete::EcState(_)) => { + (Value::EcState(x, y, x0, y0), CoreTypeConcrete::EcState(_)) => { x.to_bytes(buffer)?; y.to_bytes(buffer)?; x0.to_bytes(buffer)?; y0.to_bytes(buffer)?; } - (JitValue::Enum { tag, value, .. }, CoreTypeConcrete::Enum(info)) => { + (Value::Enum { tag, value, .. }, CoreTypeConcrete::Enum(info)) => { if self.info.is_memory_allocated(self.registry)? { let abi_ptr = self.value.to_jit(self.arena, self.registry, self.type_id)?; @@ -129,7 +129,7 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { } } ( - JitValue::Felt252(value), + Value::Felt252(value), CoreTypeConcrete::Felt252(_) | CoreTypeConcrete::StarkNet( StarkNetTypeConcrete::ClassHash(_) @@ -138,7 +138,7 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { | StarkNetTypeConcrete::StorageBaseAddress(_), ), ) => value.to_bytes(buffer)?, - (JitValue::Felt252Dict { .. }, CoreTypeConcrete::Felt252Dict(_)) => { + (Value::Felt252Dict { .. }, CoreTypeConcrete::Felt252Dict(_)) => { #[cfg(not(feature = "with-runtime"))] unimplemented!("enable the `with-runtime` feature to use felt252 dicts"); @@ -150,13 +150,13 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { .to_bytes(buffer)? } ( - JitValue::Secp256K1Point { x, y }, + Value::Secp256K1Point { x, y }, CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::Secp256Point( Secp256PointTypeConcrete::K1(_), )), ) | ( - JitValue::Secp256R1Point { x, y }, + Value::Secp256R1Point { x, y }, CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::Secp256Point( Secp256PointTypeConcrete::R1(_), )), @@ -167,23 +167,23 @@ impl<'a> AbiArgument for JitValueWithInfoWrapper<'a> { x.to_bytes(buffer)?; y.to_bytes(buffer)?; } - (JitValue::Sint128(value), CoreTypeConcrete::Sint128(_)) => value.to_bytes(buffer)?, - (JitValue::Sint16(value), CoreTypeConcrete::Sint16(_)) => value.to_bytes(buffer)?, - (JitValue::Sint32(value), CoreTypeConcrete::Sint32(_)) => value.to_bytes(buffer)?, - (JitValue::Sint64(value), CoreTypeConcrete::Sint64(_)) => value.to_bytes(buffer)?, - (JitValue::Sint8(value), CoreTypeConcrete::Sint8(_)) => value.to_bytes(buffer)?, - (JitValue::Struct { fields, .. }, CoreTypeConcrete::Struct(info)) => { + (Value::Sint128(value), CoreTypeConcrete::Sint128(_)) => value.to_bytes(buffer)?, + (Value::Sint16(value), CoreTypeConcrete::Sint16(_)) => value.to_bytes(buffer)?, + (Value::Sint32(value), CoreTypeConcrete::Sint32(_)) => value.to_bytes(buffer)?, + (Value::Sint64(value), CoreTypeConcrete::Sint64(_)) => value.to_bytes(buffer)?, + (Value::Sint8(value), CoreTypeConcrete::Sint8(_)) => value.to_bytes(buffer)?, + (Value::Struct { fields, .. }, CoreTypeConcrete::Struct(info)) => { fields .iter() .zip(&info.members) .map(|(value, type_id)| self.map(value, type_id)) .try_for_each(|wrapper| wrapper?.to_bytes(buffer))?; } - (JitValue::Uint128(value), CoreTypeConcrete::Uint128(_)) => value.to_bytes(buffer)?, - (JitValue::Uint16(value), CoreTypeConcrete::Uint16(_)) => value.to_bytes(buffer)?, - (JitValue::Uint32(value), CoreTypeConcrete::Uint32(_)) => value.to_bytes(buffer)?, - (JitValue::Uint64(value), CoreTypeConcrete::Uint64(_)) => value.to_bytes(buffer)?, - (JitValue::Uint8(value), CoreTypeConcrete::Uint8(_)) => value.to_bytes(buffer)?, + (Value::Uint128(value), CoreTypeConcrete::Uint128(_)) => value.to_bytes(buffer)?, + (Value::Uint16(value), CoreTypeConcrete::Uint16(_)) => value.to_bytes(buffer)?, + (Value::Uint32(value), CoreTypeConcrete::Uint32(_)) => value.to_bytes(buffer)?, + (Value::Uint64(value), CoreTypeConcrete::Uint64(_)) => value.to_bytes(buffer)?, + (Value::Uint8(value), CoreTypeConcrete::Uint8(_)) => value.to_bytes(buffer)?, _ => todo!( "abi argument unimplemented for ({:?}, {:?})", self.value, diff --git a/src/bin/cairo-native-run.rs b/src/bin/cairo-native-run.rs index fb3861e228..39a2777790 100644 --- a/src/bin/cairo-native-run.rs +++ b/src/bin/cairo-native-run.rs @@ -1,5 +1,3 @@ -mod utils; - use anyhow::Context; use cairo_lang_compiler::{ compile_prepared_db, db::RootDatabase, project::setup_project, CompilerConfig, @@ -7,7 +5,7 @@ use cairo_lang_compiler::{ use cairo_lang_runner::short_string::as_cairo_short_string; use cairo_native::{ context::NativeContext, - executor::{AotNativeExecutor, JitNativeExecutor, NativeExecutor}, + executor::{AotNativeExecutor, JitNativeExecutor}, metadata::gas::{GasMetadata, MetadataComputationConfig}, starknet_stub::StubSyscallHandler, }; @@ -16,6 +14,8 @@ use std::path::PathBuf; use tracing_subscriber::{EnvFilter, FmtSubscriber}; use utils::{find_function, result_to_runresult}; +mod utils; + #[derive(Clone, Debug, ValueEnum)] enum RunMode { Aot, @@ -74,12 +74,30 @@ fn main() -> anyhow::Result<()> { // Compile the sierra program into a MLIR module. let native_module = native_context.compile(&sierra_program, false).unwrap(); - let native_executor: NativeExecutor = match args.run_mode { + let native_executor: Box _> = match args.run_mode { RunMode::Aot => { - AotNativeExecutor::from_native_module(native_module, args.opt_level.into()).into() + let executor = + AotNativeExecutor::from_native_module(native_module, args.opt_level.into()); + Box::new(move |function_id, args, gas, syscall_handler| { + executor.invoke_dynamic_with_syscall_handler( + function_id, + args, + gas, + syscall_handler, + ) + }) } RunMode::Jit => { - JitNativeExecutor::from_native_module(native_module, args.opt_level.into()).into() + let executor = + JitNativeExecutor::from_native_module(native_module, args.opt_level.into()); + Box::new(move |function_id, args, gas, syscall_handler| { + executor.invoke_dynamic_with_syscall_handler( + function_id, + args, + gas, + syscall_handler, + ) + }) } }; @@ -94,8 +112,7 @@ fn main() -> anyhow::Result<()> { let mut syscall_handler = StubSyscallHandler::default(); - let result = native_executor - .invoke_dynamic_with_syscall_handler(&func.id, &[], Some(initial_gas), &mut syscall_handler) + let result = native_executor(&func.id, &[], Some(initial_gas), &mut syscall_handler) .with_context(|| "Failed to run the function.")?; let run_result = result_to_runresult(&result)?; diff --git a/src/bin/cairo-native-stress/main.rs b/src/bin/cairo-native-stress/main.rs index 7826cafcde..015d54961e 100644 --- a/src/bin/cairo-native-stress/main.rs +++ b/src/bin/cairo-native-stress/main.rs @@ -13,33 +13,38 @@ //! //! For documentation on the specific cache used, see `NaiveAotCache`. -use cairo_lang_sierra::ids::FunctionId; -use cairo_lang_sierra::program::{GenericArg, Program}; -use cairo_lang_sierra::program_registry::ProgramRegistry; +use cairo_lang_sierra::{ + ids::FunctionId, + program::{GenericArg, Program}, + program_registry::ProgramRegistry, +}; use cairo_lang_starknet::compile::compile_path; -use cairo_native::metadata::gas::GasMetadata; -use cairo_native::utils::SHARED_LIBRARY_EXT; use cairo_native::{ - context::NativeContext, executor::AotNativeExecutor, starknet::DummySyscallHandler, - utils::find_entry_point_by_idx, + context::NativeContext, + executor::AotNativeExecutor, + metadata::gas::GasMetadata, + module_to_object, object_to_shared_lib, + starknet::DummySyscallHandler, + utils::{find_entry_point_by_idx, SHARED_LIBRARY_EXT}, + OptLevel, }; -use cairo_native::{module_to_object, object_to_shared_lib, OptLevel}; use clap::Parser; use libloading::Library; use num_bigint::BigInt; use stats_alloc::{Region, StatsAlloc, INSTRUMENTED_SYSTEM}; -use std::alloc::System; -use std::fmt::{Debug, Display}; -use std::fs::{create_dir_all, read_dir, OpenOptions}; -use std::hash::Hash; -use std::io; -use std::path::{Path, PathBuf}; -use std::sync::Arc; -use std::{collections::HashMap, fs, time::Instant}; +use std::{ + alloc::System, + collections::HashMap, + fmt::{Debug, Display}, + fs::{self, create_dir_all, read_dir, OpenOptions}, + hash::Hash, + io, + path::{Path, PathBuf}, + sync::Arc, + time::Instant, +}; use tracing::{debug, info, info_span, warn}; -use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::{EnvFilter, Layer}; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer}; #[global_allocator] static GLOBAL_ALLOC: &StatsAlloc = &INSTRUMENTED_SYSTEM; diff --git a/src/bin/cairo-native-test.rs b/src/bin/cairo-native-test.rs index ab394aa65e..b69a48b5c0 100644 --- a/src/bin/cairo-native-test.rs +++ b/src/bin/cairo-native-test.rs @@ -1,5 +1,3 @@ -mod utils; - use anyhow::bail; use cairo_lang_compiler::{ db::RootDatabase, @@ -17,6 +15,8 @@ use utils::{ RunArgs, RunMode, }; +mod utils; + /// Compiles a Cairo project and runs all the functions marked as `#[test]`. /// Exits with 1 if the compilation or run fails, otherwise 0. #[derive(Parser, Debug)] diff --git a/src/bin/scarb-native-dump.rs b/src/bin/scarb-native-dump.rs index c0b566a144..83a5e74e9f 100644 --- a/src/bin/scarb-native-dump.rs +++ b/src/bin/scarb-native-dump.rs @@ -1,15 +1,13 @@ -mod utils; - -use std::{env, fs}; - use anyhow::Context; use cairo_lang_sierra::program::VersionedProgram; use cairo_native::context::NativeContext; use melior::ir::operation::OperationPrintingFlags; use scarb_metadata::{MetadataCommand, ScarbCommand}; +use std::{env, fs}; -/// Compiles all packages from a Scarb project on the current directory. +mod utils; +/// Compiles all packages from a Scarb project on the current directory. fn main() -> anyhow::Result<()> { let metadata = MetadataCommand::new().inherit_stderr().exec()?; diff --git a/src/bin/scarb-native-test.rs b/src/bin/scarb-native-test.rs index 6b017262d9..0155256dbc 100644 --- a/src/bin/scarb-native-test.rs +++ b/src/bin/scarb-native-test.rs @@ -1,17 +1,16 @@ -mod utils; - -use std::collections::HashSet; -use std::path::Path; -use std::{env, fs}; - use anyhow::Context; use cairo_lang_sierra::program::VersionedProgram; use cairo_lang_test_plugin::{TestCompilation, TestCompilationMetadata}; use clap::{Parser, ValueEnum}; use scarb_metadata::{Metadata, MetadataCommand, ScarbCommand}; use scarb_ui::args::PackagesFilter; -use utils::test::{display_tests_summary, filter_test_cases, find_testable_targets, run_tests}; -use utils::{RunArgs, RunMode}; +use std::{collections::HashSet, env, fs, path::Path}; +use utils::{ + test::{display_tests_summary, filter_test_cases, find_testable_targets, run_tests}, + RunArgs, RunMode, +}; + +mod utils; /// Compiles all packages from a Scarb project matching `packages_filter` and /// runs all functions marked with `#[test]`. Exits with 1 if the compilation diff --git a/src/bin/utils/mod.rs b/src/bin/utils/mod.rs index 8fd4b3c8aa..0bbf598252 100644 --- a/src/bin/utils/mod.rs +++ b/src/bin/utils/mod.rs @@ -1,17 +1,17 @@ #![cfg(feature = "build-cli")] #![allow(dead_code)] -pub mod test; - use anyhow::bail; use cairo_lang_runner::{casm_run::format_next_item, RunResultValue}; use cairo_lang_sierra::program::{Function, Program}; -use cairo_native::{execution_result::ExecutionResult, values::JitValue}; +use cairo_native::{execution_result::ExecutionResult, Value}; use clap::ValueEnum; use itertools::Itertools; use starknet_types_core::felt::Felt; use std::vec::IntoIter; +pub mod test; + pub(super) struct RunArgs { pub run_mode: RunMode, pub opt_level: u8, @@ -61,7 +61,7 @@ pub fn result_to_runresult(result: &ExecutionResult) -> anyhow::Result = Vec::new(); match &result.return_value { - outer_value @ JitValue::Enum { + outer_value @ Value::Enum { tag, value, debug_name, @@ -74,7 +74,7 @@ pub fn result_to_runresult(result: &ExecutionResult) -> anyhow::Result { + Value::Struct { fields, .. } => { for field in fields { let felt = jitvalue_to_felt(field); felts.extend(felt); @@ -108,15 +108,15 @@ pub fn result_to_runresult(result: &ExecutionResult) -> anyhow::Result Vec { +fn jitvalue_to_felt(value: &Value) -> Vec { let mut felts = Vec::new(); match value { - JitValue::Felt252(felt) => vec![*felt], - JitValue::BoundedInt { value, .. } => vec![*value], - JitValue::Array(fields) | JitValue::Struct { fields, .. } => { + Value::Felt252(felt) => vec![*felt], + Value::BoundedInt { value, .. } => vec![*value], + Value::Array(fields) | Value::Struct { fields, .. } => { fields.iter().flat_map(jitvalue_to_felt).collect() } - JitValue::Enum { + Value::Enum { value, tag, debug_name, @@ -133,7 +133,7 @@ fn jitvalue_to_felt(value: &JitValue) -> Vec { todo!() } } - JitValue::Felt252Dict { value, .. } => { + Value::Felt252Dict { value, .. } => { for (key, value) in value { felts.push(*key); let felt = jitvalue_to_felt(value); @@ -142,30 +142,30 @@ fn jitvalue_to_felt(value: &JitValue) -> Vec { felts } - JitValue::Uint8(x) => vec![(*x).into()], - JitValue::Uint16(x) => vec![(*x).into()], - JitValue::Uint32(x) => vec![(*x).into()], - JitValue::Uint64(x) => vec![(*x).into()], - JitValue::Uint128(x) => vec![(*x).into()], - JitValue::Sint8(x) => vec![(*x).into()], - JitValue::Sint16(x) => vec![(*x).into()], - JitValue::Sint32(x) => vec![(*x).into()], - JitValue::Sint64(x) => vec![(*x).into()], - JitValue::Sint128(x) => vec![(*x).into()], - JitValue::Bytes31(bytes) => vec![Felt::from_bytes_le_slice(bytes)], - JitValue::EcPoint(x, y) => { + Value::Uint8(x) => vec![(*x).into()], + Value::Uint16(x) => vec![(*x).into()], + Value::Uint32(x) => vec![(*x).into()], + Value::Uint64(x) => vec![(*x).into()], + Value::Uint128(x) => vec![(*x).into()], + Value::Sint8(x) => vec![(*x).into()], + Value::Sint16(x) => vec![(*x).into()], + Value::Sint32(x) => vec![(*x).into()], + Value::Sint64(x) => vec![(*x).into()], + Value::Sint128(x) => vec![(*x).into()], + Value::Bytes31(bytes) => vec![Felt::from_bytes_le_slice(bytes)], + Value::EcPoint(x, y) => { vec![*x, *y] } - JitValue::EcState(a, b, c, d) => { + Value::EcState(a, b, c, d) => { vec![*a, *b, *c, *d] } - JitValue::Secp256K1Point { x, y } => { + Value::Secp256K1Point { x, y } => { vec![x.0.into(), x.1.into(), y.0.into(), y.1.into()] } - JitValue::Secp256R1Point { x, y } => { + Value::Secp256R1Point { x, y } => { vec![x.0.into(), x.1.into(), y.0.into(), y.1.into()] } - JitValue::Null => vec![0.into()], + Value::Null => vec![0.into()], } } @@ -211,12 +211,12 @@ mod tests { assert_eq!( result_to_runresult(&ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 34, - value: JitValue::Array(vec![ - JitValue::Felt252(42.into()), - JitValue::Uint8(100), - JitValue::Uint128(1000), + value: Value::Array(vec![ + Value::Felt252(42.into()), + Value::Uint8(100), + Value::Uint128(1000), ]) .into(), debug_name: Some("debug_name".into()), @@ -239,9 +239,9 @@ mod tests { assert_eq!( result_to_runresult(&ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 0, - value: JitValue::Uint64(24).into(), + value: Value::Uint64(24).into(), debug_name: Some("core::panics::PanicResult::Test".into()), }, builtin_stats: Default::default(), @@ -257,9 +257,9 @@ mod tests { // Tests the conversion with unsuported return value. let _ = result_to_runresult(&ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 10, - value: JitValue::Uint64(24).into(), + value: Value::Uint64(24).into(), debug_name: Some("core::panics::PanicResult::Test".into()), }, builtin_stats: Default::default(), @@ -273,9 +273,9 @@ mod tests { // Tests the conversion with no debug name. let _ = result_to_runresult(&ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 10, - value: JitValue::Uint64(24).into(), + value: Value::Uint64(24).into(), debug_name: None, }, builtin_stats: Default::default(), @@ -289,13 +289,13 @@ mod tests { assert_eq!( result_to_runresult(&ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 10, - value: JitValue::Struct { + value: Value::Struct { fields: vec![ - JitValue::Felt252(42.into()), - JitValue::Uint8(100), - JitValue::Uint128(1000), + Value::Felt252(42.into()), + Value::Uint8(100), + Value::Uint128(1000), ], debug_name: Some("debug_name".into()), } @@ -315,7 +315,7 @@ mod tests { assert_eq!( result_to_runresult(&ExecutionResult { remaining_gas: None, - return_value: JitValue::Uint8(10), + return_value: Value::Uint8(10), builtin_stats: Default::default(), }) .unwrap(), @@ -328,7 +328,7 @@ mod tests { let felt_value: Felt = 42.into(); assert_eq!( - jitvalue_to_felt(&JitValue::Felt252(felt_value)), + jitvalue_to_felt(&Value::Felt252(felt_value)), vec![felt_value] ); } @@ -336,10 +336,10 @@ mod tests { #[test] fn test_jitvalue_to_felt_array() { assert_eq!( - jitvalue_to_felt(&JitValue::Array(vec![ - JitValue::Felt252(42.into()), - JitValue::Uint8(100), - JitValue::Uint128(1000), + jitvalue_to_felt(&Value::Array(vec![ + Value::Felt252(42.into()), + Value::Uint8(100), + Value::Uint128(1000), ])), vec![Felt::from(42), Felt::from(100), Felt::from(1000)] ); @@ -348,11 +348,11 @@ mod tests { #[test] fn test_jitvalue_to_felt_struct() { assert_eq!( - jitvalue_to_felt(&JitValue::Struct { + jitvalue_to_felt(&Value::Struct { fields: vec![ - JitValue::Felt252(42.into()), - JitValue::Uint8(100), - JitValue::Uint128(1000) + Value::Felt252(42.into()), + Value::Uint8(100), + Value::Uint128(1000) ], debug_name: Some("debug_name".into()) }), @@ -364,12 +364,12 @@ mod tests { fn test_jitvalue_to_felt_enum() { // With debug name assert_eq!( - jitvalue_to_felt(&JitValue::Enum { + jitvalue_to_felt(&Value::Enum { tag: 34, - value: JitValue::Array(vec![ - JitValue::Felt252(42.into()), - JitValue::Uint8(100), - JitValue::Uint128(1000), + value: Value::Array(vec![ + Value::Felt252(42.into()), + Value::Uint8(100), + Value::Uint128(1000), ]) .into(), debug_name: Some("debug_name".into()) @@ -384,9 +384,9 @@ mod tests { // With core::bool debug name and tag 1 assert_eq!( - jitvalue_to_felt(&JitValue::Enum { + jitvalue_to_felt(&Value::Enum { tag: 1, - value: JitValue::Uint128(1000).into(), + value: Value::Uint128(1000).into(), debug_name: Some("core::bool".into()) }), vec![Felt::ONE] @@ -394,9 +394,9 @@ mod tests { // With core::bool debug name and tag not 1 assert_eq!( - jitvalue_to_felt(&JitValue::Enum { + jitvalue_to_felt(&Value::Enum { tag: 10, - value: JitValue::Uint128(1000).into(), + value: Value::Uint128(1000).into(), debug_name: Some("core::bool".into()) }), vec![Felt::ZERO] @@ -405,21 +405,18 @@ mod tests { #[test] fn test_jitvalue_to_felt_u8() { - assert_eq!(jitvalue_to_felt(&JitValue::Uint8(10)), vec![Felt::from(10)]); + assert_eq!(jitvalue_to_felt(&Value::Uint8(10)), vec![Felt::from(10)]); } #[test] fn test_jitvalue_to_felt_u16() { - assert_eq!( - jitvalue_to_felt(&JitValue::Uint16(100)), - vec![Felt::from(100)] - ); + assert_eq!(jitvalue_to_felt(&Value::Uint16(100)), vec![Felt::from(100)]); } #[test] fn test_jitvalue_to_felt_u32() { assert_eq!( - jitvalue_to_felt(&JitValue::Uint32(1000)), + jitvalue_to_felt(&Value::Uint32(1000)), vec![Felt::from(1000)] ); } @@ -427,7 +424,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_u64() { assert_eq!( - jitvalue_to_felt(&JitValue::Uint64(10000)), + jitvalue_to_felt(&Value::Uint64(10000)), vec![Felt::from(10000)] ); } @@ -435,23 +432,20 @@ mod tests { #[test] fn test_jitvalue_to_felt_u128() { assert_eq!( - jitvalue_to_felt(&JitValue::Uint128(100000)), + jitvalue_to_felt(&Value::Uint128(100000)), vec![Felt::from(100000)] ); } #[test] fn test_jitvalue_to_felt_sint8() { - assert_eq!( - jitvalue_to_felt(&JitValue::Sint8(-10)), - vec![Felt::from(-10)] - ); + assert_eq!(jitvalue_to_felt(&Value::Sint8(-10)), vec![Felt::from(-10)]); } #[test] fn test_jitvalue_to_felt_sint16() { assert_eq!( - jitvalue_to_felt(&JitValue::Sint16(-100)), + jitvalue_to_felt(&Value::Sint16(-100)), vec![Felt::from(-100)] ); } @@ -459,7 +453,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_sint32() { assert_eq!( - jitvalue_to_felt(&JitValue::Sint32(-1000)), + jitvalue_to_felt(&Value::Sint32(-1000)), vec![Felt::from(-1000)] ); } @@ -467,7 +461,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_sint64() { assert_eq!( - jitvalue_to_felt(&JitValue::Sint64(-10000)), + jitvalue_to_felt(&Value::Sint64(-10000)), vec![Felt::from(-10000)] ); } @@ -475,22 +469,22 @@ mod tests { #[test] fn test_jitvalue_to_felt_sint128() { assert_eq!( - jitvalue_to_felt(&JitValue::Sint128(-100000)), + jitvalue_to_felt(&Value::Sint128(-100000)), vec![Felt::from(-100000)] ); } #[test] fn test_jitvalue_to_felt_null() { - assert_eq!(jitvalue_to_felt(&JitValue::Null), vec![Felt::ZERO]); + assert_eq!(jitvalue_to_felt(&Value::Null), vec![Felt::ZERO]); } #[test] fn test_jitvalue_to_felt_felt252_dict() { - let result = jitvalue_to_felt(&JitValue::Felt252Dict { + let result = jitvalue_to_felt(&Value::Felt252Dict { value: HashMap::from([ - (Felt::ONE, JitValue::Felt252(Felt::from(101))), - (Felt::TWO, JitValue::Felt252(Felt::from(102))), + (Felt::ONE, Value::Felt252(Felt::from(101))), + (Felt::TWO, Value::Felt252(Felt::from(102))), ]), debug_name: None, }); @@ -505,20 +499,20 @@ mod tests { #[test] fn test_jitvalue_to_felt_felt252_dict_with_array() { - let result = jitvalue_to_felt(&JitValue::Felt252Dict { + let result = jitvalue_to_felt(&Value::Felt252Dict { value: HashMap::from([ ( Felt::ONE, - JitValue::Array(Vec::from([ - JitValue::Felt252(Felt::from(101)), - JitValue::Felt252(Felt::from(102)), + Value::Array(Vec::from([ + Value::Felt252(Felt::from(101)), + Value::Felt252(Felt::from(102)), ])), ), ( Felt::TWO, - JitValue::Array(Vec::from([ - JitValue::Felt252(Felt::from(201)), - JitValue::Felt252(Felt::from(202)), + Value::Array(Vec::from([ + Value::Felt252(Felt::from(201)), + Value::Felt252(Felt::from(202)), ])), ), ]), @@ -535,7 +529,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_ec_point() { assert_eq!( - jitvalue_to_felt(&JitValue::EcPoint(Felt::ONE, Felt::TWO,)), + jitvalue_to_felt(&Value::EcPoint(Felt::ONE, Felt::TWO,)), vec![Felt::ONE, Felt::TWO,] ); } @@ -543,7 +537,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_ec_state() { assert_eq!( - jitvalue_to_felt(&JitValue::EcState( + jitvalue_to_felt(&Value::EcState( Felt::ONE, Felt::TWO, Felt::THREE, @@ -556,7 +550,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_secp256_k1_point() { assert_eq!( - jitvalue_to_felt(&JitValue::Secp256K1Point { + jitvalue_to_felt(&Value::Secp256K1Point { x: (1, 2), y: (3, 4) }), @@ -567,7 +561,7 @@ mod tests { #[test] fn test_jitvalue_to_felt_secp256_r1_point() { assert_eq!( - jitvalue_to_felt(&JitValue::Secp256R1Point { + jitvalue_to_felt(&Value::Secp256R1Point { x: (1, 2), y: (3, 4) }), diff --git a/src/bin/utils/test.rs b/src/bin/utils/test.rs index 9fd0315010..6df09c0915 100644 --- a/src/bin/utils/test.rs +++ b/src/bin/utils/test.rs @@ -1,20 +1,18 @@ use super::{find_function, format_for_panic, result_to_runresult, RunArgs, RunMode}; use anyhow::Context; use cairo_lang_runner::RunResultValue; -use cairo_lang_sierra::program::Program; -use cairo_lang_sierra::{extensions::gas::CostTokenType, ids::FunctionId}; +use cairo_lang_sierra::{extensions::gas::CostTokenType, ids::FunctionId, program::Program}; use cairo_lang_test_plugin::{ test_config::{PanicExpectation, TestExpectation}, TestConfig, }; use cairo_lang_test_plugin::{TestCompilation, TestCompilationMetadata}; -use cairo_lang_utils::casts::IntoOrPanic; -use cairo_lang_utils::ordered_hash_map::OrderedHashMap; -use cairo_native::starknet_stub::StubSyscallHandler; +use cairo_lang_utils::{casts::IntoOrPanic, ordered_hash_map::OrderedHashMap}; use cairo_native::{ context::NativeContext, - executor::{AotNativeExecutor, JitNativeExecutor, NativeExecutor}, + executor::{AotNativeExecutor, JitNativeExecutor}, metadata::gas::{GasMetadata, MetadataComputationConfig}, + starknet_stub::StubSyscallHandler, }; use colored::Colorize; use itertools::Itertools; @@ -140,12 +138,30 @@ pub fn run_tests( // Compile the sierra program into a MLIR module. let native_module = native_context.compile(&sierra_program, false).unwrap(); - let native_executor: NativeExecutor = match args.run_mode { + let native_executor: Box _> = match args.run_mode { RunMode::Aot => { - AotNativeExecutor::from_native_module(native_module, args.opt_level.into()).into() + let executor = + AotNativeExecutor::from_native_module(native_module, args.opt_level.into()); + Box::new(move |function_id, args, gas, syscall_handler| { + executor.invoke_dynamic_with_syscall_handler( + function_id, + args, + gas, + syscall_handler, + ) + }) } RunMode::Jit => { - JitNativeExecutor::from_native_module(native_module, args.opt_level.into()).into() + let executor = + JitNativeExecutor::from_native_module(native_module, args.opt_level.into()); + Box::new(move |function_id, args, gas, syscall_handler| { + executor.invoke_dynamic_with_syscall_handler( + function_id, + args, + gas, + syscall_handler, + ) + }) } }; @@ -179,14 +195,13 @@ pub fn run_tests( let initial_gas = test.available_gas.map(|x| x.try_into().unwrap()); - let result = native_executor - .invoke_dynamic_with_syscall_handler( - &func.id, - &[], - initial_gas, - &mut StubSyscallHandler::default(), - ) - .with_context(|| format!("Failed to run the function `{}`.", name.as_str()))?; + let result = native_executor( + &func.id, + &[], + initial_gas, + &mut StubSyscallHandler::default(), + ) + .with_context(|| format!("Failed to run the function `{}`.", name.as_str()))?; let run_result = result_to_runresult(&result)?; Ok(( diff --git a/src/cache/aot.rs b/src/cache/aot.rs index 3963af8ada..392c724843 100644 --- a/src/cache/aot.rs +++ b/src/cache/aot.rs @@ -87,7 +87,7 @@ where #[cfg(test)] mod tests { use super::*; - use crate::{utils::test::load_cairo, values::JitValue}; + use crate::{utils::test::load_cairo, values::Value}; use starknet_types_core::felt::Felt; #[test] @@ -108,6 +108,6 @@ mod tests { .expect("should run"); // After compiling and inserting the program, we should be able to run it. - assert_eq!(res.return_value, JitValue::Felt252(Felt::from(42))); + assert_eq!(res.return_value, Value::Felt252(Felt::from(42))); } } diff --git a/src/compiler.rs b/src/compiler.rs index 78720d1015..f8af226025 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -45,7 +45,6 @@ //! [BFS algorithm]: https://en.wikipedia.org/wiki/Breadth-first_search use crate::{ - block_ext::BlockExt, debug::libfunc_to_name, error::Error, ffi::{ @@ -60,7 +59,7 @@ use crate::{ MetadataStorage, }, types::TypeBuilder, - utils::generate_function_name, + utils::{generate_function_name, BlockExt}, }; use bumpalo::Bump; use cairo_lang_sierra::{ diff --git a/src/context.rs b/src/context.rs index 50b9b550d6..11bc8a53a2 100644 --- a/src/context.rs +++ b/src/context.rs @@ -1,5 +1,3 @@ -use std::sync::OnceLock; - use crate::{ error::Error, ffi::{ @@ -34,6 +32,7 @@ use melior::{ utility::{register_all_dialects, register_all_llvm_translations, register_all_passes}, Context, }; +use std::sync::OnceLock; /// Context of IRs, dialects and passes for Cairo programs compilation. #[derive(Debug, Eq, PartialEq)] diff --git a/src/docs.rs b/src/docs.rs index f5b80c887f..f1ad0545e1 100644 --- a/src/docs.rs +++ b/src/docs.rs @@ -1,5 +1,7 @@ //! # Cairo Native Compiler and Execution Engine +#![cfg(doc)] + #[allow(clippy::needless_doctest_main)] #[cfg_attr(doc, aquamarine::aquamarine)] #[doc = include_str!("../docs/overview.md")] diff --git a/src/execution_result.rs b/src/execution_result.rs index eeab9427da..37bc218a98 100644 --- a/src/execution_result.rs +++ b/src/execution_result.rs @@ -2,7 +2,7 @@ /// /// This module contains the structures used to interpret the program execution results, either /// normal programs or starknet contracts. -use crate::{error::Error, utils::decode_error_message, values::JitValue}; +use crate::{error::Error, utils::decode_error_message, values::Value}; use starknet_types_core::felt::Felt; #[derive( @@ -34,7 +34,7 @@ pub struct BuiltinStats { #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub struct ExecutionResult { pub remaining_gas: Option, - pub return_value: JitValue, + pub return_value: Value, pub builtin_stats: BuiltinStats, } @@ -65,17 +65,17 @@ impl ContractExecutionResult { let failure_flag; let return_values = match &result.return_value { - JitValue::Enum { tag, value, .. } => { + Value::Enum { tag, value, .. } => { failure_flag = *tag != 0; if !failure_flag { - if let JitValue::Struct { fields, .. } = &**value { - if let JitValue::Struct { fields, .. } = &fields[0] { - if let JitValue::Array(data) = &fields[0] { + if let Value::Struct { fields, .. } = &**value { + if let Value::Struct { fields, .. } = &fields[0] { + if let Value::Array(data) = &fields[0] { let felt_vec: Vec<_> = data .iter() .map(|x| { - if let JitValue::Felt252(f) = x { + if let Value::Felt252(f) = x { *f } else { panic!("should always be a felt") @@ -101,18 +101,18 @@ impl ContractExecutionResult { value )))? } - } else if let JitValue::Struct { fields, .. } = &**value { + } else if let Value::Struct { fields, .. } = &**value { if fields.len() < 2 { Err(Error::UnexpectedValue(format!( "wrong type, expect: struct.fields.len() >= 2, value: {:?}", fields )))? } - if let JitValue::Array(data) = &fields[1] { + if let Value::Array(data) = &fields[1] { let felt_vec: Vec<_> = data .iter() .map(|x| { - if let JitValue::Felt252(f) = x { + if let Value::Felt252(f) = x { *f } else { panic!("should always be a felt") diff --git a/src/executor.rs b/src/executor.rs index a9eae8ce4c..03b4b4670b 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -3,15 +3,15 @@ //! This module provides methods to execute the programs, either via JIT or compiled ahead //! of time. It also provides a cache to avoid recompiling previously compiled programs. -pub use self::{aot::AotNativeExecutor, jit::JitNativeExecutor}; +pub use self::{aot::AotNativeExecutor, contract::AotContractExecutor, jit::JitNativeExecutor}; use crate::{ arch::{AbiArgument, JitValueWithInfoWrapper}, error::Error, - execution_result::{BuiltinStats, ContractExecutionResult, ExecutionResult}, + execution_result::{BuiltinStats, ExecutionResult}, starknet::{handler::StarknetSyscallHandlerCallbacks, StarknetSyscallHandler}, types::TypeBuilder, utils::RangeExt, - values::JitValue, + values::Value, }; use bumpalo::Bump; use cairo_lang_sierra::{ @@ -21,23 +21,21 @@ use cairo_lang_sierra::{ starknet::StarkNetTypeConcrete, ConcreteType, }, - ids::{ConcreteTypeId, FunctionId}, + ids::ConcreteTypeId, program::FunctionSignature, program_registry::ProgramRegistry, }; use libc::c_void; use num_bigint::BigInt; use num_traits::One; -use starknet_types_core::felt::Felt; use std::{ alloc::Layout, arch::global_asm, ptr::{addr_of_mut, NonNull}, - sync::Arc, }; mod aot; -pub mod contract; +mod contract; mod jit; #[cfg(target_arch = "aarch64")] @@ -59,86 +57,6 @@ extern "C" { ); } -/// The cairo native executor, either AOT or JIT based. -#[derive(Debug, Clone)] -pub enum NativeExecutor<'m> { - Aot(Arc), - Jit(Arc>), -} - -impl<'a> NativeExecutor<'a> { - /// Invoke the given function by its function id, with the given arguments and gas. - pub fn invoke_dynamic( - &self, - function_id: &FunctionId, - args: &[JitValue], - gas: Option, - ) -> Result { - match self { - NativeExecutor::Aot(executor) => executor.invoke_dynamic(function_id, args, gas), - NativeExecutor::Jit(executor) => executor.invoke_dynamic(function_id, args, gas), - } - } - - /// Invoke the given function by its function id, with the given arguments and gas. - /// This should be used for programs which require a syscall handler, whose - /// implementation should be passed on. - pub fn invoke_dynamic_with_syscall_handler( - &self, - function_id: &FunctionId, - args: &[JitValue], - gas: Option, - syscall_handler: impl StarknetSyscallHandler, - ) -> Result { - match self { - NativeExecutor::Aot(executor) => executor.invoke_dynamic_with_syscall_handler( - function_id, - args, - gas, - syscall_handler, - ), - NativeExecutor::Jit(executor) => executor.invoke_dynamic_with_syscall_handler( - function_id, - args, - gas, - syscall_handler, - ), - } - } - - /// Invoke the given function by its function id, with the given arguments and gas. - /// This should be used for starknet contracts which require a syscall handler, whose - /// implementation should be passed on. - pub fn invoke_contract_dynamic( - &self, - function_id: &FunctionId, - args: &[Felt], - gas: Option, - syscall_handler: impl StarknetSyscallHandler, - ) -> Result { - match self { - NativeExecutor::Aot(executor) => { - executor.invoke_contract_dynamic(function_id, args, gas, syscall_handler) - } - NativeExecutor::Jit(executor) => { - executor.invoke_contract_dynamic(function_id, args, gas, syscall_handler) - } - } - } -} - -impl<'m> From for NativeExecutor<'m> { - fn from(value: AotNativeExecutor) -> Self { - Self::Aot(Arc::new(value)) - } -} - -impl<'m> From> for NativeExecutor<'m> { - fn from(value: JitNativeExecutor<'m>) -> Self { - Self::Jit(Arc::new(value)) - } -} - /// Internal method. /// /// Invokes the given function by constructing the function call depending on the arguments given. @@ -152,7 +70,7 @@ fn invoke_dynamic( registry: &ProgramRegistry, function_ptr: *const c_void, function_signature: &FunctionSignature, - args: &[JitValue], + args: &[Value], gas: u128, mut syscall_handler: Option, ) -> Result { @@ -375,7 +293,7 @@ fn invoke_dynamic( } }) .transpose()? - .unwrap_or_else(|| JitValue::Struct { + .unwrap_or_else(|| Value::Struct { fields: vec![], debug_name: None, }); @@ -394,8 +312,8 @@ fn parse_result( mut return_ptr: Option>, #[cfg(target_arch = "x86_64")] mut ret_registers: [u64; 2], #[cfg(target_arch = "aarch64")] mut ret_registers: [u64; 4], -) -> Result { - let type_info = registry.get_type(type_id)?; +) -> Result { + let type_info = registry.get_type(type_id).unwrap(); let debug_name = type_info.info().long_id.to_string(); // Align the pointer to the actual return value. @@ -414,17 +332,15 @@ fn parse_result( } match type_info { - CoreTypeConcrete::Array(_) => { - Ok(JitValue::from_jit(return_ptr.unwrap(), type_id, registry)?) - } + CoreTypeConcrete::Array(_) => Ok(Value::from_jit(return_ptr.unwrap(), type_id, registry)?), CoreTypeConcrete::Box(info) => unsafe { let ptr = return_ptr.unwrap_or(NonNull::new_unchecked(ret_registers[0] as *mut ())); - let value = JitValue::from_jit(ptr, &info.ty, registry)?; + let value = Value::from_jit(ptr, &info.ty, registry)?; libc::free(ptr.cast().as_ptr()); Ok(value) }, CoreTypeConcrete::EcPoint(_) | CoreTypeConcrete::EcState(_) => { - Ok(JitValue::from_jit(return_ptr.unwrap(), type_id, registry)?) + Ok(Value::from_jit(return_ptr.unwrap(), type_id, registry)?) } CoreTypeConcrete::Felt252(_) | CoreTypeConcrete::StarkNet( @@ -433,7 +349,7 @@ fn parse_result( | StarkNetTypeConcrete::StorageAddress(_) | StarkNetTypeConcrete::StorageBaseAddress(_), ) => match return_ptr { - Some(return_ptr) => Ok(JitValue::from_jit(return_ptr, type_id, registry)?), + Some(return_ptr) => Ok(Value::from_jit(return_ptr, type_id, registry)?), None => { #[cfg(target_arch = "x86_64")] // Since x86_64's return values hold at most two different 64bit registers, @@ -442,7 +358,7 @@ fn parse_result( return Err(Error::ParseAttributeError); #[cfg(target_arch = "aarch64")] - Ok(JitValue::Felt252( + Ok(Value::Felt252( starknet_types_core::felt::Felt::from_bytes_le(unsafe { std::mem::transmute::<&[u64; 4], &[u8; 32]>(&ret_registers) }), @@ -450,7 +366,7 @@ fn parse_result( } }, CoreTypeConcrete::Bytes31(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::from_jit(return_ptr, type_id, registry)?), + Some(return_ptr) => Ok(Value::from_jit(return_ptr, type_id, registry)?), None => { #[cfg(target_arch = "x86_64")] // Since x86_64's return values hold at most two different 64bit registers, @@ -459,13 +375,13 @@ fn parse_result( return Err(Error::ParseAttributeError); #[cfg(target_arch = "aarch64")] - Ok(JitValue::Bytes31(unsafe { + Ok(Value::Bytes31(unsafe { *std::mem::transmute::<&[u64; 4], &[u8; 31]>(&ret_registers) })) } }, CoreTypeConcrete::BoundedInt(info) => match return_ptr { - Some(return_ptr) => Ok(JitValue::from_jit(return_ptr, type_id, registry)?), + Some(return_ptr) => Ok(Value::from_jit(return_ptr, type_id, registry)?), None => { let mut data = if info.range.offset_bit_width() <= 64 { BigInt::from(ret_registers[0]) @@ -476,53 +392,53 @@ fn parse_result( data &= (BigInt::one() << info.range.offset_bit_width()) - BigInt::one(); data += &info.range.lower; - Ok(JitValue::BoundedInt { + Ok(Value::BoundedInt { value: data.into(), range: info.range.clone(), }) } }, CoreTypeConcrete::Uint8(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint8(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Uint8(ret_registers[0] as u8)), + Some(return_ptr) => Ok(Value::Uint8(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Uint8(ret_registers[0] as u8)), }, CoreTypeConcrete::Uint16(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint16(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Uint16(ret_registers[0] as u16)), + Some(return_ptr) => Ok(Value::Uint16(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Uint16(ret_registers[0] as u16)), }, CoreTypeConcrete::Uint32(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint32(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Uint32(ret_registers[0] as u32)), + Some(return_ptr) => Ok(Value::Uint32(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Uint32(ret_registers[0] as u32)), }, CoreTypeConcrete::Uint64(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint64(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Uint64(ret_registers[0])), + Some(return_ptr) => Ok(Value::Uint64(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Uint64(ret_registers[0])), }, CoreTypeConcrete::Uint128(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint128(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Uint128( + Some(return_ptr) => Ok(Value::Uint128(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Uint128( ((ret_registers[1] as u128) << 64) | ret_registers[0] as u128, )), }, CoreTypeConcrete::Sint8(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Sint8(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Sint8(ret_registers[0] as i8)), + Some(return_ptr) => Ok(Value::Sint8(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Sint8(ret_registers[0] as i8)), }, CoreTypeConcrete::Sint16(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Sint16(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Sint16(ret_registers[0] as i16)), + Some(return_ptr) => Ok(Value::Sint16(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Sint16(ret_registers[0] as i16)), }, CoreTypeConcrete::Sint32(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Sint32(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Sint32(ret_registers[0] as i32)), + Some(return_ptr) => Ok(Value::Sint32(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Sint32(ret_registers[0] as i32)), }, CoreTypeConcrete::Sint64(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint64(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Sint64(ret_registers[0] as i64)), + Some(return_ptr) => Ok(Value::Uint64(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Sint64(ret_registers[0] as i64)), }, CoreTypeConcrete::Sint128(_) => match return_ptr { - Some(return_ptr) => Ok(JitValue::Uint128(unsafe { *return_ptr.cast().as_ref() })), - None => Ok(JitValue::Sint128( + Some(return_ptr) => Ok(Value::Uint128(unsafe { *return_ptr.cast().as_ref() })), + None => Ok(Value::Sint128( ((ret_registers[1] as i128) << 64) | ret_registers[0] as i128, )), }, @@ -534,10 +450,10 @@ fn parse_result( *x.cast::<*mut ()>().as_ref() }); if ptr.is_null() { - Ok(JitValue::Null) + Ok(Value::Null) } else { let ptr = NonNull::new_unchecked(ptr); - let value = JitValue::from_jit(ptr, &info.ty, registry)?; + let value = Value::from_jit(ptr, &info.ty, registry)?; libc::free(ptr.as_ptr().cast()); Ok(value) } @@ -587,7 +503,7 @@ fn parse_result( } }; let value = match ptr { - Ok(ptr) => Box::new(JitValue::from_jit(ptr, &info.variants[tag], registry)?), + Ok(ptr) => Box::new(Value::from_jit(ptr, &info.variants[tag], registry)?), Err(offset) => { ret_registers.copy_within(offset.., 0); Box::new(parse_result( @@ -599,7 +515,7 @@ fn parse_result( } }; - Ok(JitValue::Enum { + Ok(Value::Enum { tag, value, debug_name: Some(debug_name), @@ -607,19 +523,19 @@ fn parse_result( } CoreTypeConcrete::Struct(info) => { if info.members.is_empty() { - Ok(JitValue::Struct { + Ok(Value::Struct { fields: Vec::new(), debug_name: Some(debug_name), }) } else { - Ok(JitValue::from_jit(return_ptr.unwrap(), type_id, registry)?) + Ok(Value::from_jit(return_ptr.unwrap(), type_id, registry)?) } } CoreTypeConcrete::Felt252Dict(_) | CoreTypeConcrete::SquashedFelt252Dict(_) => unsafe { let ptr = return_ptr.unwrap_or(NonNull::new_unchecked( addr_of_mut!(ret_registers[0]) as *mut () )); - Ok(JitValue::from_jit(ptr, type_id, registry)?) + Ok(Value::from_jit(ptr, type_id, registry)?) }, CoreTypeConcrete::Snapshot(info) => { @@ -653,13 +569,13 @@ fn parse_result( #[cfg(test)] mod tests { use super::*; - use crate::context::NativeContext; - use crate::starknet_stub::StubSyscallHandler; - use crate::utils::test::load_cairo; - use crate::utils::test::load_starknet; - use crate::OptLevel; + use crate::{ + context::NativeContext, starknet_stub::StubSyscallHandler, utils::test::load_cairo, + utils::test::load_starknet, OptLevel, + }; use cairo_lang_sierra::program::Program; use rstest::*; + use starknet_types_core::felt::Felt; #[fixture] fn program() -> Program { @@ -709,16 +625,14 @@ mod tests { .expect("failed to compile context"); let executor = AotNativeExecutor::from_native_module(module, OptLevel::default()); - let native_executor: NativeExecutor = executor.into(); - // The first function in the program is `run_test`. let entrypoint_function_id = &program.funcs.first().expect("should have a function").id; - let result = native_executor + let result = executor .invoke_dynamic(entrypoint_function_id, &[], Some(u128::MAX)) .unwrap(); - assert_eq!(result.return_value, JitValue::Felt252(Felt::from(42))); + assert_eq!(result.return_value, Value::Felt252(Felt::from(42))); } #[rstest] @@ -729,16 +643,14 @@ mod tests { .expect("failed to compile context"); let executor = JitNativeExecutor::from_native_module(module, OptLevel::default()); - let native_executor: NativeExecutor = executor.into(); - // The first function in the program is `run_test`. let entrypoint_function_id = &program.funcs.first().expect("should have a function").id; - let result = native_executor + let result = executor .invoke_dynamic(entrypoint_function_id, &[], Some(u128::MAX)) .unwrap(); - assert_eq!(result.return_value, JitValue::Felt252(Felt::from(42))); + assert_eq!(result.return_value, Value::Felt252(Felt::from(42))); } #[rstest] @@ -749,8 +661,6 @@ mod tests { .expect("failed to compile context"); let executor = AotNativeExecutor::from_native_module(module, OptLevel::default()); - let native_executor: NativeExecutor = executor.into(); - // The last function in the program is the `get` wrapper function. let entrypoint_function_id = &starknet_program .funcs @@ -758,7 +668,7 @@ mod tests { .expect("should have a function") .id; - let result = native_executor + let result = executor .invoke_contract_dynamic( entrypoint_function_id, &[], @@ -778,8 +688,6 @@ mod tests { .expect("failed to compile context"); let executor = JitNativeExecutor::from_native_module(module, OptLevel::default()); - let native_executor: NativeExecutor = executor.into(); - // The last function in the program is the `get` wrapper function. let entrypoint_function_id = &starknet_program .funcs @@ -787,7 +695,7 @@ mod tests { .expect("should have a function") .id; - let result = native_executor + let result = executor .invoke_contract_dynamic( entrypoint_function_id, &[], diff --git a/src/executor/aot.rs b/src/executor/aot.rs index 7f7ce1c616..cac2122e2d 100644 --- a/src/executor/aot.rs +++ b/src/executor/aot.rs @@ -5,7 +5,7 @@ use crate::{ module::NativeModule, starknet::{DummySyscallHandler, StarknetSyscallHandler}, utils::generate_function_name, - values::JitValue, + values::Value, OptLevel, }; use cairo_lang_sierra::{ @@ -70,7 +70,7 @@ impl AotNativeExecutor { pub fn invoke_dynamic( &self, function_id: &FunctionId, - args: &[JitValue], + args: &[Value], gas: Option, ) -> Result { let available_gas = self @@ -91,7 +91,7 @@ impl AotNativeExecutor { pub fn invoke_dynamic_with_syscall_handler( &self, function_id: &FunctionId, - args: &[JitValue], + args: &[Value], gas: Option, syscall_handler: impl StarknetSyscallHandler, ) -> Result { @@ -126,9 +126,9 @@ impl AotNativeExecutor { &self.registry, self.find_function_ptr(function_id), self.extract_signature(function_id), - &[JitValue::Struct { - fields: vec![JitValue::Array( - args.iter().cloned().map(JitValue::Felt252).collect(), + &[Value::Struct { + fields: vec![Value::Array( + args.iter().cloned().map(Value::Felt252).collect(), )], // TODO: Populate `debug_name`. debug_name: None, @@ -226,7 +226,7 @@ mod tests { .invoke_dynamic(entrypoint_function_id, &[], Some(u128::MAX)) .unwrap(); - assert_eq!(result.return_value, JitValue::Felt252(Felt::from(42))); + assert_eq!(result.return_value, Value::Felt252(Felt::from(42))); } #[rstest] @@ -256,10 +256,10 @@ mod tests { ) .unwrap(); - let expected_value = JitValue::Enum { + let expected_value = Value::Enum { tag: 0, - value: JitValue::Struct { - fields: vec![JitValue::Felt252(expected_value)], + value: Value::Struct { + fields: vec![Value::Felt252(expected_value)], debug_name: Some("Tuple".into()), } .into(), diff --git a/src/executor/contract.rs b/src/executor/contract.rs index 354d4a1c23..5d8e3db514 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -31,15 +31,18 @@ //! When loading, passing the "program.so" path will make it load the program and the "program.json" alongside it. //! -use std::{ - alloc::Layout, - collections::BTreeMap, - ffi::c_void, - path::{Path, PathBuf}, - ptr::NonNull, - sync::Arc, +use crate::{ + arch::AbiArgument, + context::NativeContext, + error::Result, + execution_result::{BuiltinStats, ContractExecutionResult}, + executor::invoke_trampoline, + module::NativeModule, + starknet::{handler::StarknetSyscallHandlerCallbacks, StarknetSyscallHandler}, + types::TypeBuilder, + utils::{decode_error_message, generate_function_name, get_integer_layout}, + OptLevel, }; - use bumpalo::Bump; use cairo_lang_sierra::{ extensions::{ @@ -53,25 +56,20 @@ use educe::Educe; use libloading::Library; use serde::{Deserialize, Serialize}; use starknet_types_core::felt::Felt; -use tempfile::NamedTempFile; - -use crate::{ - arch::AbiArgument, - context::NativeContext, - error::Result, - execution_result::{BuiltinStats, ContractExecutionResult}, - executor::invoke_trampoline, - module::NativeModule, - starknet::{handler::StarknetSyscallHandlerCallbacks, StarknetSyscallHandler}, - types::TypeBuilder, - utils::{decode_error_message, generate_function_name, get_integer_layout}, - OptLevel, +use std::{ + alloc::Layout, + collections::BTreeMap, + ffi::c_void, + path::{Path, PathBuf}, + ptr::NonNull, + sync::Arc, }; +use tempfile::NamedTempFile; -/// Please look at the module [`crate::executor::ce`] level docs. +/// Please look at the [module level docs](self). #[derive(Educe, Clone)] #[educe(Debug)] -pub struct ContractExecutor { +pub struct AotContractExecutor { #[educe(Debug(ignore))] library: Arc, path: PathBuf, @@ -80,12 +78,12 @@ pub struct ContractExecutor { } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub struct EntryPointInfo { - pub builtins: Vec, +struct EntryPointInfo { + builtins: Vec, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum BuiltinType { +enum BuiltinType { Bitwise, EcOp, RangeCheck, @@ -99,7 +97,7 @@ pub enum BuiltinType { System, } -impl ContractExecutor { +impl AotContractExecutor { /// Create the executor from a sierra program with the given optimization level. /// You can save the library on the desired location later using `save`. /// If not saved, the path is treated as @@ -432,7 +430,7 @@ impl ContractExecutor { } } -impl Drop for ContractExecutor { +impl Drop for AotContractExecutor { fn drop(&mut self) { if self.is_temp_path { std::fs::remove_file(&self.path).ok(); @@ -499,7 +497,7 @@ mod tests { #[case(OptLevel::None)] #[case(OptLevel::Default)] fn test_contract_executor(starknet_program: Program, #[case] optlevel: OptLevel) { - let executor = ContractExecutor::new(&starknet_program, optlevel).unwrap(); + let executor = AotContractExecutor::new(&starknet_program, optlevel).unwrap(); // The last function in the program is the `get` wrapper function. let entrypoint_function_id = &starknet_program @@ -524,7 +522,7 @@ mod tests { #[case(OptLevel::None)] #[case(OptLevel::Default)] fn test_contract_executor_empty(starknet_program_empty: Program, #[case] optlevel: OptLevel) { - let executor = ContractExecutor::new(&starknet_program_empty, optlevel).unwrap(); + let executor = AotContractExecutor::new(&starknet_program_empty, optlevel).unwrap(); // The last function in the program is the `get` wrapper function. let entrypoint_function_id = &starknet_program_empty diff --git a/src/executor/jit.rs b/src/executor/jit.rs index 73f9cfbad7..55bfafcbe5 100644 --- a/src/executor/jit.rs +++ b/src/executor/jit.rs @@ -5,7 +5,7 @@ use crate::{ module::NativeModule, starknet::{DummySyscallHandler, StarknetSyscallHandler}, utils::{create_engine, generate_function_name}, - values::JitValue, + values::Value, OptLevel, }; use cairo_lang_sierra::{ @@ -68,7 +68,7 @@ impl<'m> JitNativeExecutor<'m> { pub fn invoke_dynamic( &self, function_id: &FunctionId, - args: &[JitValue], + args: &[Value], gas: Option, ) -> Result { let available_gas = self @@ -90,7 +90,7 @@ impl<'m> JitNativeExecutor<'m> { pub fn invoke_dynamic_with_syscall_handler( &self, function_id: &FunctionId, - args: &[JitValue], + args: &[Value], gas: Option, syscall_handler: impl StarknetSyscallHandler, ) -> Result { @@ -125,9 +125,9 @@ impl<'m> JitNativeExecutor<'m> { &self.registry, self.find_function_ptr(function_id), self.extract_signature(function_id).unwrap(), - &[JitValue::Struct { - fields: vec![JitValue::Array( - args.iter().cloned().map(JitValue::Felt252).collect(), + &[Value::Struct { + fields: vec![Value::Array( + args.iter().cloned().map(Value::Felt252).collect(), )], // TODO: Populate `debug_name`. debug_name: None, diff --git a/src/lib.rs b/src/lib.rs index 872954ac6a..e41db615e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,10 +11,10 @@ pub use self::{ compiler::compile, ffi::{module_to_object, object_to_shared_lib, OptLevel}, + values::Value, }; mod arch; -pub(crate) mod block_ext; pub mod cache; mod compiler; pub mod context; @@ -24,11 +24,11 @@ pub mod error; pub mod execution_result; pub mod executor; mod ffi; -pub mod libfuncs; +mod libfuncs; pub mod metadata; pub mod module; pub mod starknet; pub mod starknet_stub; -pub mod types; +mod types; pub mod utils; -pub mod values; +mod values; diff --git a/src/libfuncs.rs b/src/libfuncs.rs index 7fe0a8d696..dcec662c22 100644 --- a/src/libfuncs.rs +++ b/src/libfuncs.rs @@ -2,8 +2,7 @@ //! //! Contains libfunc generation stuff (aka. the actual instructions). -use crate::block_ext::BlockExt; -use crate::{error::Error as CoreLibfuncBuilderError, metadata::MetadataStorage}; +use crate::{error::Error as CoreLibfuncBuilderError, metadata::MetadataStorage, utils::BlockExt}; use bumpalo::Bump; use cairo_lang_sierra::{ extensions::core::{CoreConcreteLibfunc, CoreLibfunc, CoreType}, @@ -12,55 +11,55 @@ use cairo_lang_sierra::{ }; use melior::{ dialect::{arith, cf}, - ir::{Block, BlockRef, Location, Module, Operation, Region, Value, ValueLike}, + ir::{Block, BlockRef, Location, Module, Operation, Region, Value}, Context, }; use num_bigint::BigInt; -use std::{borrow::Cow, cell::Cell, error::Error, ops::Deref}; - -pub mod ap_tracking; -pub mod array; -pub mod bitwise; -pub mod r#bool; -pub mod bounded_int; -pub mod r#box; -pub mod branch_align; -pub mod bytes31; -pub mod cast; -pub mod circuit; -pub mod r#const; -pub mod coupon; -pub mod debug; -pub mod drop; -pub mod dup; -pub mod ec; -pub mod r#enum; -pub mod felt252; -pub mod felt252_dict; -pub mod felt252_dict_entry; -pub mod function_call; -pub mod gas; -pub mod mem; -pub mod nullable; -pub mod pedersen; -pub mod poseidon; -pub mod sint128; -pub mod sint16; -pub mod sint32; -pub mod sint64; -pub mod sint8; -pub mod snapshot_take; -pub mod starknet; -pub mod r#struct; -pub mod uint128; -pub mod uint16; -pub mod uint256; -pub mod uint32; -pub mod uint512; -pub mod uint64; -pub mod uint8; -pub mod unconditional_jump; -pub mod unwrap_non_zero; +use std::{cell::Cell, error::Error, ops::Deref}; + +mod ap_tracking; +mod array; +mod bitwise; +mod r#bool; +mod bounded_int; +mod r#box; +mod branch_align; +mod bytes31; +mod cast; +mod circuit; +mod r#const; +mod coupon; +mod debug; +mod drop; +mod dup; +mod ec; +mod r#enum; +mod felt252; +mod felt252_dict; +mod felt252_dict_entry; +mod function_call; +mod gas; +mod mem; +mod nullable; +mod pedersen; +mod poseidon; +mod sint128; +mod sint16; +mod sint32; +mod sint64; +mod sint8; +mod snapshot_take; +mod starknet; +mod r#struct; +mod uint128; +mod uint16; +mod uint256; +mod uint32; +mod uint512; +mod uint64; +mod uint8; +mod unconditional_jump; +mod unwrap_non_zero; /// Generation of MLIR operations from their Sierra counterparts. /// @@ -246,30 +245,31 @@ impl LibfuncBuilder for CoreConcreteLibfunc { /// next statements. /// /// Each branch index should be present in exactly one call a branching method (either -/// [`br`](#method.br), [`cond_br`](#method.cond_br) or [`switch`](#method.switch)). +/// [`br`](#method.br) or [`cond_br`](#method.cond_br)). /// /// This helper is necessary because the statement following the current one may not have the same /// arguments as the results returned by the current statement. Because of that, a direct jump /// cannot be made and some processing is required. -pub struct LibfuncHelper<'ctx, 'this> +pub(crate) struct LibfuncHelper<'ctx, 'this> where 'this: 'ctx, { - pub(crate) module: &'this Module<'ctx>, - pub(crate) init_block: &'this BlockRef<'ctx, 'this>, + pub module: &'this Module<'ctx>, + pub init_block: &'this BlockRef<'ctx, 'this>, - pub(crate) region: &'this Region<'ctx>, - pub(crate) blocks_arena: &'this Bump, - pub(crate) last_block: Cell<&'this BlockRef<'ctx, 'this>>, + pub region: &'this Region<'ctx>, + pub blocks_arena: &'this Bump, + pub last_block: Cell<&'this BlockRef<'ctx, 'this>>, - pub(crate) branches: Vec<(&'this Block<'ctx>, Vec>)>, - pub(crate) results: Vec>>>>, + pub branches: Vec<(&'this Block<'ctx>, Vec>)>, + pub results: Vec>>>>, } impl<'ctx, 'this> LibfuncHelper<'ctx, 'this> where 'this: 'ctx, { + #[doc(hidden)] pub(crate) fn results(self) -> impl Iterator>> { self.results.into_iter().enumerate().map(|(branch_idx, x)| { x.into_iter() @@ -308,7 +308,7 @@ where /// /// This method will also store the returned values so that they can be moved into the state and /// used later on when required. - pub fn br( + fn br( &self, branch: usize, results: &[Value<'ctx, 'this>], @@ -341,7 +341,7 @@ where /// This method will also store the returned values so that they can be moved into the state and /// used later on when required. // TODO: Allow one block to be libfunc-internal. - pub fn cond_br( + fn cond_br( &self, context: &'ctx Context, condition: Value<'ctx, 'this>, @@ -397,86 +397,6 @@ where location, ) } - - /// Creates a conditional multi-branching operation, potentially jumping out of the libfunc and - /// into the next statement. - /// - /// While generating a `switch` that doesn't jump out of the libfunc is possible, it should be - /// avoided whenever possible. In those cases just use [melior::dialect::cf::switch]. - /// - /// This method will also store the returned values so that they can be moved into the state and - /// used later on when required. - pub fn switch( - &self, - context: &'ctx Context, - flag: Value<'ctx, 'this>, - default: (BranchTarget<'ctx, '_>, &[Value<'ctx, 'this>]), - branches: &[(i64, BranchTarget<'ctx, '_>, &[Value<'ctx, 'this>])], - location: Location<'ctx>, - ) -> Result, CoreLibfuncBuilderError> { - let default_destination = match default.0 { - BranchTarget::Jump(x) => (x, Cow::Borrowed(default.1)), - BranchTarget::Return(i) => { - let (successor, operands) = &self.branches[i]; - - for (dst, src) in self.results[i].iter().zip(default.1) { - dst.replace(Some(*src)); - } - - let destination_operands = operands - .iter() - .copied() - .map(|op| match op { - BranchArg::External(x) => x, - BranchArg::Returned(i) => default.1[i], - }) - .collect(); - - (*successor, Cow::Owned(destination_operands)) - } - }; - - let mut case_values = Vec::with_capacity(branches.len()); - let mut case_destinations = Vec::with_capacity(branches.len()); - for (flag, successor, operands) in branches { - case_values.push(*flag); - - case_destinations.push(match *successor { - BranchTarget::Jump(x) => (x, Cow::Borrowed(*operands)), - BranchTarget::Return(i) => { - let (successor, operands) = &self.branches[i]; - - for (dst, src) in self.results[i].iter().zip(default.1) { - dst.replace(Some(*src)); - } - - let destination_operands = operands - .iter() - .copied() - .map(|op| match op { - BranchArg::External(x) => x, - BranchArg::Returned(i) => default.1[i], - }) - .collect(); - - (*successor, Cow::Owned(destination_operands)) - } - }); - } - - Ok(cf::switch( - context, - &case_values, - flag, - flag.r#type(), - (default_destination.0, &default_destination.1), - &case_destinations - .iter() - .map(|(x, y)| (*x, y.as_ref())) - .collect::>(), - location, - )?) - } } impl<'ctx, 'this> Deref for LibfuncHelper<'ctx, 'this> { @@ -493,19 +413,7 @@ pub(crate) enum BranchArg<'ctx, 'this> { Returned(usize), } -/// A libfunc branching target. -/// -/// May point to either a block within the same libfunc using [BranchTarget::Jump] or to one of the -/// statement's branches using [BranchTarget::Return] with the branch index. -#[derive(Clone, Copy, Debug)] -pub enum BranchTarget<'ctx, 'a> { - /// A block within the current libfunc. - Jump(&'a Block<'ctx>), - /// A statement's branch target by its index. - Return(usize), -} - -pub fn increment_builtin_counter<'ctx: 'a, 'a>( +fn increment_builtin_counter<'ctx: 'a, 'a>( context: &'ctx Context, block: &'ctx Block<'ctx>, location: Location<'ctx>, @@ -514,7 +422,7 @@ pub fn increment_builtin_counter<'ctx: 'a, 'a>( increment_builtin_counter_by(context, block, location, value, 1) } -pub fn increment_builtin_counter_by<'ctx: 'a, 'a>( +fn increment_builtin_counter_by<'ctx: 'a, 'a>( context: &'ctx Context, block: &'ctx Block<'ctx>, location: Location<'ctx>, @@ -527,228 +435,3 @@ pub fn increment_builtin_counter_by<'ctx: 'a, 'a>( location, )) } - -#[cfg(test)] -mod tests { - use super::*; - use crate::context::NativeContext; - use melior::ir::r#type::IntegerType; - use melior::ir::Type; - - #[test] - fn switch_branch_arg_external_test() { - // Create a new context for MLIR operations - let native_context = NativeContext::new(); - let context = native_context.context(); - - // Create an unknown location in the context - let location = Location::unknown(context); - // Create a new MLIR module with the unknown location - let module = Module::new(location); - - // Create a new MLIR block and obtain its reference - let region = Region::new(); - let last_block = region.append_block(Block::new(&[])); - - // Initialize the LibfuncHelper struct with various parameters - let mut lib_func_helper = LibfuncHelper { - module: &module, - init_block: &last_block, - region: ®ion, - blocks_arena: &Bump::new(), - last_block: Cell::new(&last_block), - branches: Vec::new(), - results: Vec::new(), - }; - - // Create an integer type with 32 bits - let i32_type: Type = IntegerType::new(context, 32).into(); - // Create a default block with the integer type and the unknown location - let default_block = lib_func_helper.append_block(Block::new(&[(i32_type, location)])); - - // Create a new MLIR block - let block = lib_func_helper.append_block(Block::new(&[])); - - // Append a constant arithmetic operation to the block and obtain its result operand - let operand = block - .const_int_from_type(context, location, 1, i32_type) - .unwrap(); - - // Loop to add branches and results to the LibfuncHelper struct - for _ in 0..20 { - // Push a default block and external operand to the branches vector - lib_func_helper - .branches - .push((default_block, vec![BranchArg::External(operand)])); - - // Push a new vector of result cells to the results vector - lib_func_helper.results.push([Cell::new(None)].into()); - } - - // Call the `switch` method of the LibfuncHelper struct and obtain the result - let cf_switch = block.append_operation( - lib_func_helper - .switch( - context, - operand, - (BranchTarget::Return(10), &[]), - &[ - (0, BranchTarget::Return(10), &[]), - (1, BranchTarget::Return(10), &[]), - ], - location, - ) - .unwrap(), - ); - - // Assert that the switch operation is valid - assert!(cf_switch.verify()); - } - - #[test] - fn switch_branch_arg_returned_test() { - // Create a new context for MLIR operations - let native_context = NativeContext::new(); - let context = native_context.context(); - - // Create an unknown location in the context - let location = Location::unknown(context); - // Create a new MLIR module with the unknown location - let module = Module::new(location); - - // Create a new MLIR block and obtain its reference - let region = Region::new(); - let last_block = region.append_block(Block::new(&[])); - - // Initialize the LibfuncHelper struct with various parameters - let mut lib_func_helper = LibfuncHelper { - module: &module, - init_block: &last_block, - region: ®ion, - blocks_arena: &Bump::new(), - last_block: Cell::new(&last_block), - branches: Vec::new(), - results: Vec::new(), - }; - - // Create an integer type with 32 bits - let i32_type: Type = IntegerType::new(context, 32).into(); - // Create a default block with the integer type and the unknown location - let default_block = lib_func_helper.append_block(Block::new(&[(i32_type, location)])); - - // Create a new MLIR block - let block = lib_func_helper.append_block(Block::new(&[])); - - // Append a constant arithmetic operation to the block and obtain its result operand - let operand = block - .const_int_from_type(context, location, 1, i32_type) - .unwrap(); - - // Loop to add branches and results to the LibfuncHelper struct - for _ in 0..20 { - // Push a default block and a returned operand index to the branches vector - lib_func_helper - .branches - .push((default_block, vec![BranchArg::Returned(3)])); - - // Push a new vector of result cells to the results vector - lib_func_helper.results.push([Cell::new(None)].into()); - } - - // Call the `switch` method of the LibfuncHelper struct and obtain the result - let cf_switch = block.append_operation( - lib_func_helper - .switch( - context, - operand, - ( - BranchTarget::Return(10), - &[operand, operand, operand, operand], - ), - &[ - (0, BranchTarget::Return(10), &[]), - (1, BranchTarget::Return(10), &[]), - ], - location, - ) - .unwrap(), - ); - - // Assert that the switch operation is valid - assert!(cf_switch.verify()); - - // Assert that the result in the LibfuncHelper at index 10 contains the expected operand - assert_eq!(lib_func_helper.results[10][0], Cell::new(Some(operand))); - - // Assert that the length of the results vector at index 10 is 1 - assert_eq!(lib_func_helper.results[10].len(), 1); - } - - #[test] - fn switch_branch_target_jump_test() { - // Create a new context for MLIR operations - let native_context = NativeContext::new(); - let context = native_context.context(); - - // Create an unknown location in the context - let location = Location::unknown(context); - // Create a new MLIR module with the unknown location - let module = Module::new(location); - - // Create a new MLIR block and obtain its reference - let region = Region::new(); - let last_block = region.append_block(Block::new(&[])); - - // Initialize the LibfuncHelper struct with various parameters - let mut lib_func_helper = LibfuncHelper { - module: &module, - init_block: &last_block, - region: ®ion, - blocks_arena: &Bump::new(), - last_block: Cell::new(&last_block), - branches: Vec::new(), - results: Vec::new(), - }; - - // Create an integer type with 32 bits - let i32_type: Type = IntegerType::new(context, 32).into(); - // Create a default block with the integer type and the unknown location - let default_block = lib_func_helper.append_block(Block::new(&[(i32_type, location)])); - - // Create a new MLIR block - let block = lib_func_helper.append_block(Block::new(&[])); - - // Append a constant arithmetic operation to the block and obtain its result operand - let operand = block - .const_int_from_type(context, location, 1, i32_type) - .unwrap(); - - // Loop to add branches and results to the LibfuncHelper struct - for _ in 0..20 { - // Push a default block and an empty vector of operands to the branches vector - lib_func_helper.branches.push((default_block, Vec::new())); - - // Push a new vector of result cells to the results vector - lib_func_helper.results.push([Cell::new(None)].into()); - } - - // Call the `switch` method of the LibfuncHelper struct and obtain the result - let cf_switch = block.append_operation( - lib_func_helper - .switch( - context, - operand, - (BranchTarget::Jump(default_block), &[operand]), - &[ - (0, BranchTarget::Jump(default_block), &[operand]), - (1, BranchTarget::Jump(default_block), &[operand]), - ], - location, - ) - .unwrap(), - ); - - // Assert that the switch operation is valid - assert!(cf_switch.verify()); - } -} diff --git a/src/libfuncs/array.rs b/src/libfuncs/array.rs index 421dced41b..a5a7eda839 100644 --- a/src/libfuncs/array.rs +++ b/src/libfuncs/array.rs @@ -7,11 +7,10 @@ use std::ops::Deref; use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::{realloc_bindings::ReallocBindingsMeta, MetadataStorage}, types::TypeBuilder, - utils::ProgramRegistryExt, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -1399,8 +1398,11 @@ pub fn build_tuple_from_span<'ctx, 'this>( #[cfg(test)] mod test { use crate::{ - utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program}, - values::JitValue, + utils::{ + felt252_str, + test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program}, + }, + values::Value, }; use pretty_assertions_sorted::assert_eq; use starknet_types_core::felt::Felt; @@ -1416,7 +1418,7 @@ mod test { ); let result = run_program(&program, "run_test", &[[1u32, 2u32].into()]).return_value; - assert_eq!(result, JitValue::from([1u32, 2u32])); + assert_eq!(result, Value::from([1u32, 2u32])); } #[test] @@ -1640,7 +1642,7 @@ mod test { jit_enum!(0, 4u32.into()), jit_enum!( 1, - JitValue::Struct { + Value::Struct { fields: Vec::new(), debug_name: None, } @@ -1707,9 +1709,9 @@ mod test { assert_eq!( result, - jit_panic!( - Felt::from_dec_str("1637570914057682275393755530660268060279989363").unwrap() - ) + jit_panic!(felt252_str( + "1637570914057682275393755530660268060279989363" + )) ); } @@ -1731,8 +1733,8 @@ mod test { result, jit_enum!( 0, - jit_struct!(JitValue::from([ - JitValue::Felt252(Felt::from(10)), + jit_struct!(Value::from([ + Value::Felt252(Felt::from(10)), Felt::from(20).into(), Felt::from(30).into() ])) @@ -1776,7 +1778,7 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::from([1u32]), + Value::from([1u32]), ); } @@ -1795,7 +1797,7 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::from([1u32, 2u32]), + Value::from([1u32, 2u32]), ); } @@ -1815,7 +1817,7 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::from([2u32]), + Value::from([2u32]), ); } @@ -1856,7 +1858,7 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::from([2u32]), + Value::from([2u32]), ); } @@ -1874,10 +1876,10 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::from(1u32)], + value: Box::new(Value::Struct { + fields: vec![Value::from(1u32)], debug_name: None, }), debug_name: None, @@ -1900,10 +1902,10 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::from(1u32)], + value: Box::new(Value::Struct { + fields: vec![Value::from(1u32)], debug_name: None, }), debug_name: None, @@ -1927,10 +1929,10 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::from(2u32)], + value: Box::new(Value::Struct { + fields: vec![Value::from(2u32)], debug_name: None, }), debug_name: None, @@ -1956,10 +1958,10 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::from(1u32)], + value: Box::new(Value::Struct { + fields: vec![Value::from(1u32)], debug_name: None, }), debug_name: None, @@ -1983,10 +1985,10 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::from(2u32)], + value: Box::new(Value::Struct { + fields: vec![Value::from(2u32)], debug_name: None, }), debug_name: None, @@ -2005,10 +2007,10 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::Array(vec![])], + value: Box::new(Value::Struct { + fields: vec![Value::Array(vec![])], debug_name: None, }), debug_name: None, @@ -2049,7 +2051,7 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - jit_struct!(JitValue::Array(vec![])), + jit_struct!(Value::Array(vec![])), ); } @@ -2095,7 +2097,7 @@ mod test { assert_eq!( run_program(&program, "run_test", &[]).return_value, - JitValue::Array(vec![1u64.into(), 2u64.into()]), + Value::Array(vec![1u64.into(), 2u64.into()]), ); } @@ -2113,21 +2115,21 @@ mod test { run_program( &program, "run_test", - &[JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), - JitValue::Felt252(3.into()), + &[Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), + Value::Felt252(3.into()), ])], ) .return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::Struct { + value: Box::new(Value::Struct { + fields: vec![Value::Struct { fields: vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), - JitValue::Felt252(3.into()), + Value::Felt252(1.into()), + Value::Felt252(2.into()), + Value::Felt252(3.into()), ], debug_name: None }], @@ -2152,9 +2154,9 @@ mod test { run_program( &program, "run_test", - &[JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), + &[Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), ])], ) .return_value, @@ -2185,16 +2187,16 @@ mod test { // Tuple jit_struct!( // Span of original array - jit_struct!(JitValue::Array(vec![ - JitValue::Felt252(4.into()), - JitValue::Felt252(5.into()), - JitValue::Felt252(6.into()), + jit_struct!(Value::Array(vec![ + Value::Felt252(4.into()), + Value::Felt252(5.into()), + Value::Felt252(6.into()), ])), // Box of fixed array jit_struct!( - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), - JitValue::Felt252(3.into()) + Value::Felt252(1.into()), + Value::Felt252(2.into()), + Value::Felt252(3.into()) ), ) ) @@ -2226,9 +2228,9 @@ mod test { 0, jit_struct!( // Span of original array - jit_struct!(JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), + jit_struct!(Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), ]),) ) ) @@ -2258,16 +2260,16 @@ mod test { // Tuple jit_struct!( // Span of original array - jit_struct!(JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), - JitValue::Felt252(3.into()), + jit_struct!(Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), + Value::Felt252(3.into()), ])), // Box of fixed array jit_struct!( - JitValue::Felt252(4.into()), - JitValue::Felt252(5.into()), - JitValue::Felt252(6.into()) + Value::Felt252(4.into()), + Value::Felt252(5.into()), + Value::Felt252(6.into()) ), ) ) @@ -2299,9 +2301,9 @@ mod test { 0, jit_struct!( // Span of original array - jit_struct!(JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), + jit_struct!(Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), ]),) ) ) @@ -2332,14 +2334,14 @@ mod test { // Tuple jit_struct!( // Span of original array - jit_struct!(JitValue::Array(vec![ - JitValue::Felt252(3.into()), - JitValue::Felt252(4.into()), + jit_struct!(Value::Array(vec![ + Value::Felt252(3.into()), + Value::Felt252(4.into()), ])), // Box of fixed array - jit_struct!(JitValue::Felt252(1.into()), JitValue::Felt252(2.into()),), + jit_struct!(Value::Felt252(1.into()), Value::Felt252(2.into()),), // Box of fixed array - jit_struct!(JitValue::Felt252(5.into()), JitValue::Felt252(6.into())), + jit_struct!(Value::Felt252(5.into()), Value::Felt252(6.into())), ) ) ) diff --git a/src/libfuncs/bitwise.rs b/src/libfuncs/bitwise.rs index 06aa8755d5..3ec9218dd0 100644 --- a/src/libfuncs/bitwise.rs +++ b/src/libfuncs/bitwise.rs @@ -1,7 +1,7 @@ //! # Bitwise libfuncs use super::LibfuncHelper; -use crate::{block_ext::BlockExt, error::Result, metadata::MetadataStorage}; +use crate::{error::Result, metadata::MetadataStorage, utils::BlockExt}; use cairo_lang_sierra::{ extensions::{ core::{CoreLibfunc, CoreType}, diff --git a/src/libfuncs/bool.rs b/src/libfuncs/bool.rs index d61b3d1805..f0b2786a74 100644 --- a/src/libfuncs/bool.rs +++ b/src/libfuncs/bool.rs @@ -2,8 +2,10 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, types::TypeBuilder, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + types::TypeBuilder, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -210,7 +212,7 @@ pub fn build_bool_to_felt252<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_struct, load_cairo, run_program}, - values::JitValue, + values::Value, }; #[test] @@ -368,9 +370,9 @@ mod test { ); let result = run_program(&program, "run_test", &[jit_enum!(1, jit_struct!())]).return_value; - assert_eq!(result, JitValue::Felt252(1.into())); + assert_eq!(result, Value::Felt252(1.into())); let result = run_program(&program, "run_test", &[jit_enum!(0, jit_struct!())]).return_value; - assert_eq!(result, JitValue::Felt252(0.into())); + assert_eq!(result, Value::Felt252(0.into())); } } diff --git a/src/libfuncs/bounded_int.rs b/src/libfuncs/bounded_int.rs index 2c051cc4de..5991a67194 100644 --- a/src/libfuncs/bounded_int.rs +++ b/src/libfuncs/bounded_int.rs @@ -2,8 +2,10 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, types::TypeBuilder, - utils::RangeExt, + error::Result, + metadata::MetadataStorage, + types::TypeBuilder, + utils::{BlockExt, RangeExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/box.rs b/src/libfuncs/box.rs index a8ebe964b7..f7840f7724 100644 --- a/src/libfuncs/box.rs +++ b/src/libfuncs/box.rs @@ -189,7 +189,7 @@ fn build_forward_snapshot<'ctx, 'this>( mod test { use crate::{ utils::test::{load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; #[test] @@ -205,7 +205,7 @@ mod test { } }; - run_program_assert_output(&program, "run_test", &[], JitValue::Uint32(2)); + run_program_assert_output(&program, "run_test", &[], Value::Uint32(2)); } #[test] @@ -221,7 +221,7 @@ mod test { } }; - run_program_assert_output(&program, "run_test", &[], JitValue::Uint32(2)); + run_program_assert_output(&program, "run_test", &[], Value::Uint32(2)); } #[test] @@ -243,9 +243,9 @@ mod test { &program, "run_test", &[], - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Felt252(1234.into())), + value: Box::new(Value::Felt252(1234.into())), debug_name: None, }, ); @@ -271,9 +271,9 @@ mod test { &program, "run_test", &[], - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None, }), @@ -302,9 +302,9 @@ mod test { &program, "run_test", &[], - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None, }), @@ -333,9 +333,9 @@ mod test { &program, "run_test", &[], - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Felt252(1234.into())), + value: Box::new(Value::Felt252(1234.into())), debug_name: None, }, ); diff --git a/src/libfuncs/bytes31.rs b/src/libfuncs/bytes31.rs index dc5d25fc67..0622fe6be6 100644 --- a/src/libfuncs/bytes31.rs +++ b/src/libfuncs/bytes31.rs @@ -2,10 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::{Error, Result}, metadata::MetadataStorage, - utils::ProgramRegistryExt, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/cast.rs b/src/libfuncs/cast.rs index 76f85b0020..f632179acc 100644 --- a/src/libfuncs/cast.rs +++ b/src/libfuncs/cast.rs @@ -2,14 +2,10 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, - types::{ - felt252::{HALF_PRIME, PRIME}, - TypeBuilder, - }, - utils::RangeExt, + types::TypeBuilder, + utils::{BlockExt, RangeExt, HALF_PRIME, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -86,8 +82,8 @@ pub fn build_downcast<'ctx, 'this>( } } else { Range { - lower: -HALF_PRIME.clone(), - upper: HALF_PRIME.clone() + BigInt::one(), + lower: BigInt::from_biguint(Sign::Minus, HALF_PRIME.clone()), + upper: BigInt::from_biguint(Sign::Plus, HALF_PRIME.clone()) + BigInt::one(), } } } else { @@ -282,8 +278,8 @@ pub fn build_upcast<'ctx, 'this>( assert!( if dst_ty.is_felt252(registry)? { let alt_range = Range { - lower: -HALF_PRIME.clone(), - upper: HALF_PRIME.clone() + BigInt::one(), + lower: BigInt::from_biguint(Sign::Minus, HALF_PRIME.clone()), + upper: BigInt::from_biguint(Sign::Plus, HALF_PRIME.clone()) + BigInt::one(), }; (dst_range.lower <= src_range.lower && dst_range.upper >= src_range.upper) @@ -375,7 +371,7 @@ pub fn build_upcast<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -475,7 +471,7 @@ mod test { u32::MAX.into(), u64::MAX.into(), u128::MAX.into(), - JitValue::Bytes31([0xFF; 31]), + Value::Bytes31([0xFF; 31]), ], jit_struct!( jit_struct!(u8::MAX.into()), @@ -499,7 +495,7 @@ mod test { u128::MAX.into() ), jit_struct!( - JitValue::Bytes31([ + Value::Bytes31([ u8::MAX, 0, 0, @@ -532,7 +528,7 @@ mod test { 0, 0, ]), - JitValue::Bytes31([ + Value::Bytes31([ u8::MAX, u8::MAX, 0, @@ -565,7 +561,7 @@ mod test { 0, 0, ]), - JitValue::Bytes31([ + Value::Bytes31([ u8::MAX, u8::MAX, u8::MAX, @@ -598,7 +594,7 @@ mod test { 0, 0, ]), - JitValue::Bytes31([ + Value::Bytes31([ u8::MAX, u8::MAX, u8::MAX, @@ -631,7 +627,7 @@ mod test { 0, 0, ]), - JitValue::Bytes31([ + Value::Bytes31([ u8::MAX, u8::MAX, u8::MAX, @@ -664,7 +660,7 @@ mod test { 0, 0, ]), - JitValue::Bytes31([u8::MAX; 31]), + Value::Bytes31([u8::MAX; 31]), ), ), ); diff --git a/src/libfuncs/circuit.rs b/src/libfuncs/circuit.rs index 550fd7dbe6..0b09d02de8 100644 --- a/src/libfuncs/circuit.rs +++ b/src/libfuncs/circuit.rs @@ -2,12 +2,11 @@ use super::{increment_builtin_counter, increment_builtin_counter_by, LibfuncHelper}; use crate::{ - block_ext::BlockExt, error::{Result, SierraAssertError}, libfuncs::r#struct::build_struct_value, metadata::MetadataStorage, types::TypeBuilder, - utils::{get_integer_layout, layout_repeat, ProgramRegistryExt}, + utils::{get_integer_layout, layout_repeat, BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -1087,14 +1086,14 @@ mod test { felt252_str, test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, }, - values::JitValue, + values::Value, }; use cairo_lang_sierra::extensions::utils::Range; use num_bigint::BigUint; use num_traits::Num; use starknet_types_core::felt::Felt; - fn u384(limbs: [&str; 4]) -> JitValue { + fn u384(limbs: [&str; 4]) -> Value { fn u96_range() -> Range { Range { lower: BigUint::from_str_radix("0", 16).unwrap().into(), @@ -1104,21 +1103,21 @@ mod test { } } - JitValue::Struct { + Value::Struct { fields: vec![ - JitValue::BoundedInt { + Value::BoundedInt { value: Felt::from_hex_unchecked(limbs[0]), range: u96_range(), }, - JitValue::BoundedInt { + Value::BoundedInt { value: Felt::from_hex_unchecked(limbs[1]), range: u96_range(), }, - JitValue::BoundedInt { + Value::BoundedInt { value: Felt::from_hex_unchecked(limbs[2]), range: u96_range(), }, - JitValue::BoundedInt { + Value::BoundedInt { value: Felt::from_hex_unchecked(limbs[3]), range: u96_range(), }, diff --git a/src/libfuncs/const.rs b/src/libfuncs/const.rs index 4f86f247d8..24d6aa4aa9 100644 --- a/src/libfuncs/const.rs +++ b/src/libfuncs/const.rs @@ -1,19 +1,16 @@ //! # Const libfuncs use super::LibfuncHelper; -use crate::block_ext::BlockExt; -use crate::types::felt252::PRIME; -use crate::utils::RangeExt; use crate::{ error::{Error, Result}, libfuncs::{r#enum::build_enum_value, r#struct::build_struct_value}, metadata::{realloc_bindings::ReallocBindingsMeta, MetadataStorage}, types::TypeBuilder, - utils::ProgramRegistryExt, + utils::{BlockExt, ProgramRegistryExt, RangeExt, PRIME}, }; -use cairo_lang_sierra::extensions::bounded_int::BoundedIntConcreteType; use cairo_lang_sierra::{ extensions::{ + bounded_int::BoundedIntConcreteType, const_type::{ ConstAsBoxConcreteLibfunc, ConstAsImmediateConcreteLibfunc, ConstConcreteLibfunc, ConstConcreteType, @@ -290,7 +287,7 @@ pub fn build_const_type_value<'ctx, 'this>( pub mod test { use crate::{ utils::test::{jit_struct, load_cairo, run_program}, - values::JitValue, + values::Value, }; #[test] @@ -311,6 +308,6 @@ pub mod test { ); let result = run_program(&program, "run_test", &[]).return_value; - assert_eq!(result, jit_struct!(JitValue::Sint32(-2))); + assert_eq!(result, jit_struct!(Value::Sint32(-2))); } } diff --git a/src/libfuncs/coupon.rs b/src/libfuncs/coupon.rs index b5114b1dc8..f47999fbd5 100644 --- a/src/libfuncs/coupon.rs +++ b/src/libfuncs/coupon.rs @@ -5,7 +5,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/debug.rs b/src/libfuncs/debug.rs index 02960a3336..ed279aba2d 100644 --- a/src/libfuncs/debug.rs +++ b/src/libfuncs/debug.rs @@ -10,10 +10,10 @@ // U+0020 SPACE use super::LibfuncHelper; -use crate::block_ext::BlockExt; use crate::{ error::Result, metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, + utils::BlockExt, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/ec.rs b/src/libfuncs/ec.rs index cccbd44c3d..2994be1a9c 100644 --- a/src/libfuncs/ec.rs +++ b/src/libfuncs/ec.rs @@ -2,13 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::{Error, Result}, - metadata::{ - prime_modulo::PrimeModuloMeta, runtime_bindings::RuntimeBindingsMeta, MetadataStorage, - }, - types::felt252::register_prime_modulo_meta, - utils::{get_integer_layout, ProgramRegistryExt}, + metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -27,8 +23,6 @@ use melior::{ ir::{operation::OperationBuilder, r#type::IntegerType, Block, Location}, Context, }; -use num_bigint::ToBigInt; -use starknet_types_core::felt::Felt; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -115,7 +109,7 @@ pub fn build_neg<'ctx, 'this>( entry: &'this Block<'ctx>, location: Location<'ctx>, helper: &LibfuncHelper<'ctx, 'this>, - metadata: &mut MetadataStorage, + _metadata: &mut MetadataStorage, _info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { let y = entry.extract_value( @@ -126,24 +120,13 @@ pub fn build_neg<'ctx, 'this>( 1, )?; - let prime = match metadata.get::>() { - Some(x) => x.prime(), - None => { - // Since the `EcPoint` type is external, there is no guarantee that - // `PrimeModuloMeta` will be available. - register_prime_modulo_meta(metadata).prime() - } - }; - - let k_prime = entry.const_int(context, location, prime.to_bigint().unwrap(), 252)?; - + let k_prime = entry.const_int(context, location, PRIME.clone(), 252)?; let k0 = entry.const_int(context, location, 0, 252)?; let y_is_zero = entry.append_op_result(arith::cmpi(context, CmpiPredicate::Eq, y, k0, location))?; let y_neg = entry.append_op_result(arith::subi(k_prime, y, location))?; - let y_neg = entry.append_op_result( OperationBuilder::new("arith.select", location) .add_operands(&[y_is_zero, k0, y_neg]) @@ -518,7 +501,7 @@ pub fn build_zero<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_struct, load_cairo, run_program, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -607,45 +590,43 @@ mod test { #[test] fn ec_point_is_zero() { - let r = |x, y| { - run_program(&EC_POINT_IS_ZERO, "run_test", &[JitValue::EcPoint(x, y)]).return_value - }; + let r = + |x, y| run_program(&EC_POINT_IS_ZERO, "run_test", &[Value::EcPoint(x, y)]).return_value; assert_eq!(r(0.into(), 0.into()), jit_enum!(0, jit_struct!())); assert_eq!( r(0.into(), 1.into()), - jit_enum!(1, JitValue::EcPoint(0.into(), 1.into())) + jit_enum!(1, Value::EcPoint(0.into(), 1.into())) ); assert_eq!(r(1.into(), 0.into()), jit_enum!(0, jit_struct!())); assert_eq!( r(1.into(), 1.into()), - jit_enum!(1, JitValue::EcPoint(1.into(), 1.into())) + jit_enum!(1, Value::EcPoint(1.into(), 1.into())) ); } #[test] fn ec_neg() { - let r = |x, y| run_program(&EC_NEG, "run_test", &[JitValue::EcPoint(x, y)]).return_value; + let r = |x, y| run_program(&EC_NEG, "run_test", &[Value::EcPoint(x, y)]).return_value; - assert_eq!(r(0.into(), 0.into()), JitValue::EcPoint(0.into(), 0.into())); + assert_eq!(r(0.into(), 0.into()), Value::EcPoint(0.into(), 0.into())); assert_eq!( r(0.into(), 1.into()), - JitValue::EcPoint(0.into(), Felt::from(-1)) + Value::EcPoint(0.into(), Felt::from(-1)) ); - assert_eq!(r(1.into(), 0.into()), JitValue::EcPoint(1.into(), 0.into())); + assert_eq!(r(1.into(), 0.into()), Value::EcPoint(1.into(), 0.into())); assert_eq!( r(1.into(), 1.into()), - JitValue::EcPoint(1.into(), Felt::from(-1)) + Value::EcPoint(1.into(), Felt::from(-1)) ); } #[test] fn ec_point_from_x() { - let r = - |x| run_program(&EC_POINT_FROM_X_NZ, "run_test", &[JitValue::Felt252(x)]).return_value; + let r = |x| run_program(&EC_POINT_FROM_X_NZ, "run_test", &[Value::Felt252(x)]).return_value; assert_eq!(r(0.into()), jit_enum!(1, jit_struct!())); - assert_eq!(r(1234.into()), jit_enum!(0, JitValue::EcPoint( + assert_eq!(r(1234.into()), jit_enum!(0, Value::EcPoint( Felt::from(1234), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap() ))); @@ -654,18 +635,18 @@ mod test { #[test] fn ec_state_add() { run_program_assert_output(&EC_STATE_ADD, "run_test", &[ - JitValue::EcState( + Value::EcState( Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap() ), - JitValue::EcPoint( + Value::EcPoint( Felt::from_dec_str("1234").unwrap(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap() ) ], - JitValue::EcState( + Value::EcState( Felt::from_dec_str("763975897824944497806946001227010133599886598340174017198031710397718335159").unwrap(), Felt::from_dec_str("2805180267536471620369715068237762638204710971142209985448115065526708105983").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), @@ -676,19 +657,19 @@ mod test { #[test] fn ec_state_add_mul() { run_program_assert_output(&EC_STATE_ADD_MUL, "run_test", &[ - JitValue::EcState( + Value::EcState( Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap() ), Felt::ONE.into(), // scalar - JitValue::EcPoint( + Value::EcPoint( Felt::from_dec_str("1234").unwrap(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap() ) ], - JitValue::EcState( + Value::EcState( Felt::from_dec_str("763975897824944497806946001227010133599886598340174017198031710397718335159").unwrap(), Felt::from_dec_str("2805180267536471620369715068237762638204710971142209985448115065526708105983").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), @@ -697,19 +678,19 @@ mod test { ); run_program_assert_output(&EC_STATE_ADD_MUL, "run_test", &[ - JitValue::EcState( + Value::EcState( Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap() ), Felt::from(2).into(), // scalar - JitValue::EcPoint( + Value::EcPoint( Felt::from_dec_str("1234").unwrap(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap() ) ], - JitValue::EcState( + Value::EcState( Felt::from_dec_str("3016674370847061744386893405108272070153695046160622325692702034987910716850").unwrap(), Felt::from_dec_str("898133181809473419542838028331350248951548889944002871647069130998202992502").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), @@ -723,7 +704,7 @@ mod test { run_program_assert_output( &EC_STATE_FINALIZE, "run_test", - &[JitValue::EcState( + &[Value::EcState( Felt::from_dec_str( "3151312365169595090315724863753927489909436624354740709748557281394568342450", ) @@ -744,14 +725,14 @@ mod test { jit_enum!(1, jit_struct!()), ); run_program_assert_output(&EC_STATE_FINALIZE, "run_test", &[ - JitValue::EcState( + Value::EcState( Felt::from_dec_str("763975897824944497806946001227010133599886598340174017198031710397718335159").unwrap(), Felt::from_dec_str("2805180267536471620369715068237762638204710971142209985448115065526708105983").unwrap(), Felt::from_dec_str("3151312365169595090315724863753927489909436624354740709748557281394568342450").unwrap(), Felt::from_dec_str("2835232394579952276045648147338966184268723952674536708929458753792035266179").unwrap() ), ], - jit_enum!(0, JitValue::EcPoint( + jit_enum!(0, Value::EcPoint( Felt::from(1234), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap() ) @@ -763,7 +744,7 @@ mod test { fn ec_state_init() { let result = run_program(&EC_STATE_INIT, "run_test", &[]); // cant match the values because the state init is a random point - assert!(matches!(result.return_value, JitValue::EcState(_, _, _, _))); + assert!(matches!(result.return_value, Value::EcState(_, _, _, _))); } #[test] @@ -784,7 +765,7 @@ mod test { Felt::from_dec_str("1234").unwrap().into(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap().into() ], - jit_enum!(0, JitValue::EcPoint( + jit_enum!(0, Value::EcPoint( Felt::from_dec_str("1234").unwrap(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap() )) @@ -796,7 +777,7 @@ mod test { &[ Felt::from_dec_str("1234").unwrap().into(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap().neg().into() ], - jit_enum!(0, JitValue::EcPoint( + jit_enum!(0, Value::EcPoint( Felt::from_dec_str("1234").unwrap(), Felt::from_dec_str("1301976514684871091717790968549291947487646995000837413367950573852273027507").unwrap().neg() )) @@ -819,7 +800,7 @@ mod test { run_program_assert_output( &EC_POINT_UNWRAP, "run_test", - &[JitValue::EcPoint(parse(a), parse(b))], + &[Value::EcPoint(parse(a), parse(b))], jit_struct!(parse(ea).into(), parse(eb).into()), ); } @@ -841,7 +822,7 @@ mod test { &EC_POINT_ZERO, "run_test", &[], - JitValue::EcPoint( + Value::EcPoint( Felt::from_dec_str("0").unwrap(), Felt::from_dec_str("0").unwrap().neg(), ), diff --git a/src/libfuncs/enum.rs b/src/libfuncs/enum.rs index a88b286037..24a9c52233 100644 --- a/src/libfuncs/enum.rs +++ b/src/libfuncs/enum.rs @@ -4,10 +4,10 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::{Error, Result}, metadata::{enum_snapshot_variants::EnumSnapshotVariantsMeta, MetadataStorage}, types::TypeBuilder, + utils::BlockExt, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/felt252.rs b/src/libfuncs/felt252.rs index fb80888815..348ec476e2 100644 --- a/src/libfuncs/felt252.rs +++ b/src/libfuncs/felt252.rs @@ -2,10 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -27,8 +26,7 @@ use melior::{ ir::{r#type::IntegerType, Block, Location, Value, ValueLike}, Context, }; -use num_bigint::{Sign, ToBigInt}; -use starknet_types_core::felt::Felt; +use num_bigint::{BigInt, Sign}; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -77,11 +75,6 @@ pub fn build_binary_operation<'ctx, 'this>( let i256 = IntegerType::new(context, 256).into(); let i512 = IntegerType::new(context, 512).into(); - let prime = metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime(); - let (op, lhs, rhs) = match info { Felt252BinaryOperationConcrete::WithVar(operation) => ( operation.operator, @@ -90,16 +83,10 @@ pub fn build_binary_operation<'ctx, 'this>( ), Felt252BinaryOperationConcrete::WithConst(operation) => { let value = match operation.c.sign() { - Sign::Minus => { - let prime = metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime(); - (&operation.c + prime.to_bigint().expect("always is Some")) - .to_biguint() - .expect("always positive") - } - _ => operation.c.to_biguint().expect("sign already checked"), + Sign::Minus => (&operation.c + BigInt::from_biguint(Sign::Minus, PRIME.clone())) + .magnitude() + .clone(), + _ => operation.c.magnitude().clone(), }; // TODO: Ensure that the constant is on the correct side of the operation. @@ -115,7 +102,7 @@ pub fn build_binary_operation<'ctx, 'this>( let rhs = entry.append_op_result(arith::extui(rhs, i256, location))?; let result = entry.append_op_result(arith::addi(lhs, rhs, location))?; - let prime = entry.const_int_from_type(context, location, prime.clone(), i256)?; + let prime = entry.const_int_from_type(context, location, PRIME.clone(), i256)?; let result_mod = entry.append_op_result(arith::subi(result, prime, location))?; let is_out_of_range = entry.append_op_result(arith::cmpi( context, @@ -138,7 +125,7 @@ pub fn build_binary_operation<'ctx, 'this>( let rhs = entry.append_op_result(arith::extui(rhs, i256, location))?; let result = entry.append_op_result(arith::subi(lhs, rhs, location))?; - let prime = entry.const_int_from_type(context, location, prime.clone(), i256)?; + let prime = entry.const_int_from_type(context, location, PRIME.clone(), i256)?; let result_mod = entry.append_op_result(arith::addi(result, prime, location))?; let is_out_of_range = entry.append_op_result(arith::cmpi( context, @@ -161,7 +148,7 @@ pub fn build_binary_operation<'ctx, 'this>( let rhs = entry.append_op_result(arith::extui(rhs, i512, location))?; let result = entry.append_op_result(arith::muli(lhs, rhs, location))?; - let prime = entry.const_int_from_type(context, location, prime.clone(), i512)?; + let prime = entry.const_int_from_type(context, location, PRIME.clone(), i512)?; let result_mod = entry.append_op_result(arith::remui(result, prime, location))?; let is_out_of_range = entry.append_op_result(arith::cmpi( context, @@ -202,7 +189,7 @@ pub fn build_binary_operation<'ctx, 'this>( // For the initial setup, r0 = PRIME, r1 = a // This order is chosen because if we reverse them, then the first iteration will just swap them let prev_remainder = - start_block.const_int_from_type(context, location, prime.clone(), i512)?; + start_block.const_int_from_type(context, location, PRIME.clone(), i512)?; let remainder = start_block.argument(0)?.into(); // Similarly we'll calculate another series which starts 0,1,... and from which we will retrieve the modular inverse of a let prev_inverse = start_block.const_int_from_type(context, location, 0, i512)?; @@ -272,7 +259,7 @@ pub fn build_binary_operation<'ctx, 'this>( .into(); // if the inverse is < 0, add PRIME let prime = - negative_check_block.const_int_from_type(context, location, prime.clone(), i512)?; + negative_check_block.const_int_from_type(context, location, PRIME.clone(), i512)?; let wrapped_inverse = negative_check_block.append_op_result(arith::addi(inverse, prime, location))?; let inverse = negative_check_block.append_op_result(arith::select( @@ -339,16 +326,10 @@ pub fn build_const<'ctx, 'this>( info: &Felt252ConstConcreteLibfunc, ) -> Result<()> { let value = match info.c.sign() { - Sign::Minus => { - let prime = metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime(); - (&info.c + prime.to_bigint().expect("always is Some")) - .to_biguint() - .expect("always is positive") - } - _ => info.c.to_biguint().expect("sign already checked"), + Sign::Minus => (&info.c + BigInt::from_biguint(Sign::Minus, PRIME.clone())) + .magnitude() + .clone(), + _ => info.c.magnitude().clone(), }; let felt252_ty = registry.build_type( @@ -388,7 +369,7 @@ pub fn build_is_zero<'ctx, 'this>( pub mod test { use crate::{ utils::test::{load_cairo, run_program}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -457,11 +438,11 @@ pub mod test { match run_program( &FELT252_ADD, "run_test", - &[JitValue::Felt252(lhs), JitValue::Felt252(rhs)], + &[Value::Felt252(lhs), Value::Felt252(rhs)], ) .return_value { - JitValue::Felt252(x) => x, + Value::Felt252(x) => x, _ => panic!("invalid return type"), } } @@ -495,11 +476,11 @@ pub mod test { match run_program( &FELT252_SUB, "run_test", - &[JitValue::Felt252(lhs), JitValue::Felt252(rhs)], + &[Value::Felt252(lhs), Value::Felt252(rhs)], ) .return_value { - JitValue::Felt252(x) => x, + Value::Felt252(x) => x, _ => panic!("invalid return type"), } } @@ -531,11 +512,11 @@ pub mod test { match run_program( &FELT252_MUL, "run_test", - &[JitValue::Felt252(lhs), JitValue::Felt252(rhs)], + &[Value::Felt252(lhs), Value::Felt252(rhs)], ) .return_value { - JitValue::Felt252(x) => x, + Value::Felt252(x) => x, _ => panic!("invalid return type"), } } @@ -568,21 +549,21 @@ pub mod test { match run_program( &FELT252_DIV, "run_test", - &[JitValue::Felt252(lhs), JitValue::Felt252(rhs)], + &[Value::Felt252(lhs), Value::Felt252(rhs)], ) .return_value { - JitValue::Enum { tag: 0, value, .. } => match *value { - JitValue::Struct { fields, .. } => { + Value::Enum { tag: 0, value, .. } => match *value { + Value::Struct { fields, .. } => { assert_eq!(fields.len(), 1); Some(match &fields[0] { - JitValue::Felt252(x) => *x, + Value::Felt252(x) => *x, _ => panic!("invalid return type payload"), }) } _ => panic!("invalid return type"), }, - JitValue::Enum { tag: 1, .. } => None, + Value::Enum { tag: 1, .. } => None, _ => panic!("invalid return type"), } } @@ -627,9 +608,9 @@ pub mod test { fn felt252_const() { assert_eq!( run_program(&FELT252_CONST, "run_test", &[]).return_value, - JitValue::Struct { + Value::Struct { fields: [f("0"), f("1"), f("-2"), f("-1")] - .map(JitValue::Felt252) + .map(Value::Felt252) .to_vec(), debug_name: None } @@ -639,8 +620,8 @@ pub mod test { #[test] fn felt252_is_zero() { fn r(x: Felt) -> bool { - match run_program(&FELT252_IS_ZERO, "run_test", &[JitValue::Felt252(x)]).return_value { - JitValue::Enum { tag, .. } => tag != 0, + match run_program(&FELT252_IS_ZERO, "run_test", &[Value::Felt252(x)]).return_value { + Value::Enum { tag, .. } => tag != 0, _ => panic!("invalid return type"), } } diff --git a/src/libfuncs/felt252_dict.rs b/src/libfuncs/felt252_dict.rs index c47930c89e..fb8798f2ff 100644 --- a/src/libfuncs/felt252_dict.rs +++ b/src/libfuncs/felt252_dict.rs @@ -1,10 +1,10 @@ //! # `Felt` dictionary libfuncs use super::LibfuncHelper; -use crate::block_ext::BlockExt; use crate::{ error::Result, metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, + utils::BlockExt, }; use cairo_lang_sierra::{ extensions::{ @@ -113,7 +113,7 @@ pub fn build_squash<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_dict, jit_enum, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; #[test] @@ -229,7 +229,7 @@ mod test { 5 => 6u32, )], jit_struct!( - JitValue::Felt252(0.into()), + Value::Felt252(0.into()), jit_dict!( 1 => 2u32, 2 => 3u32, diff --git a/src/libfuncs/felt252_dict_entry.rs b/src/libfuncs/felt252_dict_entry.rs index 461203d78a..1fb38cf0fa 100644 --- a/src/libfuncs/felt252_dict_entry.rs +++ b/src/libfuncs/felt252_dict_entry.rs @@ -2,14 +2,13 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::{ realloc_bindings::ReallocBindingsMeta, runtime_bindings::RuntimeBindingsMeta, MetadataStorage, }, types::TypeBuilder, - utils::{get_integer_layout, ProgramRegistryExt}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/function_call.rs b/src/libfuncs/function_call.rs index c97fda3b94..4594219ad7 100644 --- a/src/libfuncs/function_call.rs +++ b/src/libfuncs/function_call.rs @@ -5,11 +5,10 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::{tail_recursion::TailRecursionMeta, MetadataStorage}, types::TypeBuilder, - utils::generate_function_name, + utils::{generate_function_name, BlockExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/gas.rs b/src/libfuncs/gas.rs index da21dbf5b9..474fe74437 100644 --- a/src/libfuncs/gas.rs +++ b/src/libfuncs/gas.rs @@ -2,10 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::{gas::GasCost, MetadataStorage}, - utils::ProgramRegistryExt, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/mem.rs b/src/libfuncs/mem.rs index d18d6186a4..c8c2eee795 100644 --- a/src/libfuncs/mem.rs +++ b/src/libfuncs/mem.rs @@ -5,7 +5,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/nullable.rs b/src/libfuncs/nullable.rs index c35717845e..b1fed17fce 100644 --- a/src/libfuncs/nullable.rs +++ b/src/libfuncs/nullable.rs @@ -3,8 +3,7 @@ //! Like a Box but it can be null. use super::LibfuncHelper; -use crate::block_ext::BlockExt; -use crate::{error::Result, metadata::MetadataStorage}; +use crate::{error::Result, metadata::MetadataStorage, utils::BlockExt}; use cairo_lang_sierra::{ extensions::{ core::{CoreLibfunc, CoreType}, @@ -170,7 +169,7 @@ fn build_forward_snapshot<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; #[test] @@ -205,7 +204,7 @@ mod test { } ); - run_program_assert_output(&program, "run_test", &[], JitValue::Null); + run_program_assert_output(&program, "run_test", &[], Value::Null); } #[test] @@ -265,14 +264,14 @@ mod test { "run_test", &[jit_enum!( 1, - JitValue::Struct { + Value::Struct { fields: Vec::new(), debug_name: None } )], jit_enum!( 1, - JitValue::Struct { + Value::Struct { fields: Vec::new(), debug_name: None } diff --git a/src/libfuncs/pedersen.rs b/src/libfuncs/pedersen.rs index b69b9640ff..5d5e995365 100644 --- a/src/libfuncs/pedersen.rs +++ b/src/libfuncs/pedersen.rs @@ -3,10 +3,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, - utils::{get_integer_layout, ProgramRegistryExt}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/poseidon.rs b/src/libfuncs/poseidon.rs index 9d5ad07665..bf06587f6a 100644 --- a/src/libfuncs/poseidon.rs +++ b/src/libfuncs/poseidon.rs @@ -3,10 +3,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, - utils::{get_integer_layout, ProgramRegistryExt}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/sint128.rs b/src/libfuncs/sint128.rs index deaa6e8931..ccee4c3728 100644 --- a/src/libfuncs/sint128.rs +++ b/src/libfuncs/sint128.rs @@ -1,12 +1,10 @@ //! # `i128`-related libfuncs -use super::LibfuncHelper; -use std::ops::Shr; +use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt, HALF_PRIME, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -28,7 +26,6 @@ use melior::{ ir::{operation::OperationBuilder, r#type::IntegerType, Block, Location, Value, ValueLike}, Context, }; -use starknet_types_core::felt::Felt; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -294,16 +291,8 @@ pub fn build_from_felt252<'ctx, 'this>( // make unsigned felt into signed felt // felt > half prime = negative let value = { - let half_prime: melior::ir::Value = block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .shr(1), - felt252_ty, - )?; + let half_prime = + block.const_int_from_type(context, location, HALF_PRIME.clone(), felt252_ty)?; let is_felt_neg = block.append_op_result(arith::cmpi( context, @@ -328,22 +317,12 @@ pub fn build_from_felt252<'ctx, 'this>( )); { - let prime = is_neg_block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .clone(), - felt252_ty, - )?; - - let mut src_value_is_neg: melior::ir::Value = + let prime = + is_neg_block.const_int_from_type(context, location, PRIME.clone(), felt252_ty)?; + let mut src_value_is_neg = is_neg_block.append_op_result(arith::subi(prime, value, location))?; let kneg1 = is_neg_block.const_int_from_type(context, location, -1, felt252_ty)?; - src_value_is_neg = is_neg_block.append_op_result(arith::muli(src_value_is_neg, kneg1, location))?; @@ -353,7 +332,6 @@ pub fn build_from_felt252<'ctx, 'this>( is_not_neg_block.append_operation(cf::br(final_block, &[value], location)); block = final_block; - block.argument(0)?.into() }; @@ -431,7 +409,7 @@ pub fn build_diff<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -549,7 +527,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -601,7 +579,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/sint16.rs b/src/libfuncs/sint16.rs index e29c853f4e..2d3821cf29 100644 --- a/src/libfuncs/sint16.rs +++ b/src/libfuncs/sint16.rs @@ -1,12 +1,10 @@ //! # `i16`-related libfuncs -use super::LibfuncHelper; -use std::ops::Shr; +use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt, HALF_PRIME, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -28,7 +26,6 @@ use melior::{ ir::{operation::OperationBuilder, r#type::IntegerType, Block, Location, Value, ValueLike}, Context, }; -use starknet_types_core::felt::Felt; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -324,16 +321,8 @@ pub fn build_from_felt252<'ctx, 'this>( // make unsigned felt into signed felt // felt > half prime = negative let value = { - let half_prime: melior::ir::Value = block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .shr(1), - felt252_ty, - )?; + let half_prime = + block.const_int_from_type(context, location, HALF_PRIME.clone(), felt252_ty)?; let is_felt_neg = block.append_op_result(arith::cmpi( context, @@ -358,22 +347,12 @@ pub fn build_from_felt252<'ctx, 'this>( )); { - let prime = is_neg_block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .clone(), - felt252_ty, - )?; - - let mut src_value_is_neg: melior::ir::Value = + let prime = + is_neg_block.const_int_from_type(context, location, PRIME.clone(), felt252_ty)?; + let mut src_value_is_neg = is_neg_block.append_op_result(arith::subi(prime, value, location))?; let kneg1 = is_neg_block.const_int_from_type(context, location, -1, felt252_ty)?; - src_value_is_neg = is_neg_block.append_op_result(arith::muli(src_value_is_neg, kneg1, location))?; @@ -381,7 +360,6 @@ pub fn build_from_felt252<'ctx, 'this>( } is_not_neg_block.append_operation(cf::br(final_block, &[value], location)); - block = final_block; block.argument(0)?.into() @@ -461,7 +439,7 @@ pub fn build_diff<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -579,7 +557,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -631,7 +609,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/sint32.rs b/src/libfuncs/sint32.rs index 0544d5c859..0de6c839f7 100644 --- a/src/libfuncs/sint32.rs +++ b/src/libfuncs/sint32.rs @@ -2,10 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt, HALF_PRIME, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -27,8 +26,6 @@ use melior::{ ir::{operation::OperationBuilder, r#type::IntegerType, Block, Location, Value, ValueLike}, Context, }; -use starknet_types_core::felt::Felt; -use std::ops::Shr; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -323,16 +320,8 @@ pub fn build_from_felt252<'ctx, 'this>( // make unsigned felt into signed felt // felt > half prime = negative let value = { - let half_prime: melior::ir::Value = block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .shr(1), - felt252_ty, - )?; + let half_prime = + block.const_int_from_type(context, location, HALF_PRIME.clone(), felt252_ty)?; let is_felt_neg = block.append_op_result(arith::cmpi( context, @@ -357,22 +346,12 @@ pub fn build_from_felt252<'ctx, 'this>( )); { - let prime = is_neg_block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .clone(), - felt252_ty, - )?; - - let mut src_value_is_neg: melior::ir::Value = + let prime = + is_neg_block.const_int_from_type(context, location, PRIME.clone(), felt252_ty)?; + let mut src_value_is_neg = is_neg_block.append_op_result(arith::subi(prime, value, location))?; let kneg1 = is_neg_block.const_int_from_type(context, location, -1, felt252_ty)?; - src_value_is_neg = is_neg_block.append_op_result(arith::muli(src_value_is_neg, kneg1, location))?; @@ -382,7 +361,6 @@ pub fn build_from_felt252<'ctx, 'this>( is_not_neg_block.append_operation(cf::br(final_block, &[value], location)); block = final_block; - block.argument(0)?.into() }; @@ -461,7 +439,7 @@ pub fn build_diff<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -582,7 +560,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -634,7 +612,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/sint64.rs b/src/libfuncs/sint64.rs index 2927b9dd6b..745935da5a 100644 --- a/src/libfuncs/sint64.rs +++ b/src/libfuncs/sint64.rs @@ -2,10 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt, HALF_PRIME, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -27,8 +26,6 @@ use melior::{ ir::{operation::OperationBuilder, r#type::IntegerType, Block, Location, Value, ValueLike}, Context, }; -use starknet_types_core::felt::Felt; -use std::ops::Shr; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -324,16 +321,8 @@ pub fn build_from_felt252<'ctx, 'this>( // make unsigned felt into signed felt // felt > half prime = negative let value = { - let half_prime: melior::ir::Value = block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .shr(1), - felt252_ty, - )?; + let half_prime = + block.const_int_from_type(context, location, HALF_PRIME.clone(), felt252_ty)?; let is_felt_neg = block.append_op_result(arith::cmpi( context, @@ -358,22 +347,12 @@ pub fn build_from_felt252<'ctx, 'this>( )); { - let prime = is_neg_block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .clone(), - felt252_ty, - )?; - - let mut src_value_is_neg: melior::ir::Value = + let prime = + is_neg_block.const_int_from_type(context, location, PRIME.clone(), felt252_ty)?; + let mut src_value_is_neg = is_neg_block.append_op_result(arith::subi(prime, value, location))?; let kneg1 = is_neg_block.const_int_from_type(context, location, -1, felt252_ty)?; - src_value_is_neg = is_neg_block.append_op_result(arith::muli(src_value_is_neg, kneg1, location))?; @@ -383,7 +362,6 @@ pub fn build_from_felt252<'ctx, 'this>( is_not_neg_block.append_operation(cf::br(final_block, &[value], location)); block = final_block; - block.argument(0)?.into() }; @@ -461,7 +439,7 @@ pub fn build_diff<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -585,7 +563,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -637,7 +615,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/sint8.rs b/src/libfuncs/sint8.rs index da48ee8867..f87b305209 100644 --- a/src/libfuncs/sint8.rs +++ b/src/libfuncs/sint8.rs @@ -1,12 +1,10 @@ //! # `i8`-related libfuncs -use super::LibfuncHelper; -use std::ops::Shr; +use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, - utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt, HALF_PRIME, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -28,7 +26,6 @@ use melior::{ ir::{operation::OperationBuilder, r#type::IntegerType, Block, Location, Value, ValueLike}, Context, }; -use starknet_types_core::felt::Felt; /// Select and call the correct libfunc builder function from the selector. pub fn build<'ctx, 'this>( @@ -326,16 +323,8 @@ pub fn build_from_felt252<'ctx, 'this>( // make unsigned felt into signed felt // felt > half prime = negative let value = { - let half_prime: melior::ir::Value = block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .shr(1), - felt252_ty, - )?; + let half_prime = + block.const_int_from_type(context, location, HALF_PRIME.clone(), felt252_ty)?; let is_felt_neg = block.append_op_result(arith::cmpi( context, @@ -360,22 +349,12 @@ pub fn build_from_felt252<'ctx, 'this>( )); { - let prime = is_neg_block.const_int_from_type( - context, - location, - metadata - .get::>() - .ok_or(Error::MissingMetadata)? - .prime() - .clone(), - felt252_ty, - )?; - - let mut src_value_is_neg: melior::ir::Value = + let prime = + is_neg_block.const_int_from_type(context, location, PRIME.clone(), felt252_ty)?; + let mut src_value_is_neg = is_neg_block.append_op_result(arith::subi(prime, value, location))?; let kneg1 = is_neg_block.const_int_from_type(context, location, -1, felt252_ty)?; - src_value_is_neg = is_neg_block.append_op_result(arith::muli(src_value_is_neg, kneg1, location))?; @@ -385,7 +364,6 @@ pub fn build_from_felt252<'ctx, 'this>( is_not_neg_block.append_operation(cf::br(final_block, &[value], location)); block = final_block; - block.argument(0)?.into() }; @@ -463,7 +441,7 @@ pub fn build_diff<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -581,7 +559,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -633,7 +611,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/starknet.rs b/src/libfuncs/starknet.rs index c26aea5a10..7beeeafc68 100644 --- a/src/libfuncs/starknet.rs +++ b/src/libfuncs/starknet.rs @@ -2,13 +2,11 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, - error::{Error, Result}, + error::Result, ffi::get_struct_field_type_at, metadata::MetadataStorage, starknet::handler::StarknetSyscallHandlerCallbacks, - types::felt252::PRIME, - utils::{get_integer_layout, ProgramRegistryExt}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt, PRIME}, }; use cairo_lang_sierra::{ extensions::{ @@ -36,11 +34,9 @@ use melior::{ Context, }; use num_bigint::Sign; -use std::{alloc::Layout, borrow::Cow}; +use std::alloc::Layout; mod secp256; - -#[cfg(feature = "with-cheatcode")] mod testing; /// Select and call the correct libfunc builder function from the selector. @@ -171,16 +167,12 @@ pub fn build_call_contract<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -195,50 +187,22 @@ pub fn build_call_contract<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -296,39 +260,26 @@ pub fn build_call_contract<'ctx, 'this>( calldata_arg_ty, get_integer_layout(64).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(4)?.into(), - calldata_arg_ptr, location, - LoadStoreOptions::default(), - )); + calldata_arg_ptr, + entry.argument(4)?.into(), + )?; // Extract function pointer. - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::CALL_CONTRACT.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::CALL_CONTRACT.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -344,118 +295,83 @@ pub fn build_call_contract<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -479,20 +395,15 @@ pub fn build_class_hash_const<'ctx, 'this>( _metadata: &mut MetadataStorage, info: &SignatureAndConstConcreteLibfunc, ) -> Result<()> { - let value = match info.c.sign() { - Sign::Minus => Cow::Owned(&*PRIME - info.c.magnitude()), - _ => Cow::Borrowed(info.c.magnitude()), - }; - - let value = entry - .append_operation(arith::constant( - context, - Attribute::parse(context, &format!("{value} : i252")) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); + let value = entry.const_int( + context, + location, + match info.c.sign() { + Sign::Minus => &*PRIME - info.c.magnitude(), + _ => info.c.magnitude().clone(), + }, + 252, + )?; entry.append_operation(helper.br(0, &[value], location)); Ok(()) @@ -525,28 +436,22 @@ pub fn build_class_hash_try_from_felt252<'ctx, 'this>( let value = entry.argument(1)?.into(); - let limit = entry - .append_operation(arith::constant( - context, - Attribute::parse( - context, - "3618502788666131106986593281521497120414687020801267626233049500247285301248 : i252", - ) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); - let is_in_range = entry - .append_operation(arith::cmpi( + let limit = entry.append_op_result(arith::constant( + context, + Attribute::parse( context, - CmpiPredicate::Ult, - value, - limit, - location, - )) - .result(0)? - .into(); + "3618502788666131106986593281521497120414687020801267626233049500247285301248 : i252", + ) + .unwrap(), + location, + ))?; + let is_in_range = entry.append_op_result(arith::cmpi( + context, + CmpiPredicate::Ult, + value, + limit, + location, + ))?; entry.append_operation(helper.cond_br( context, @@ -567,20 +472,15 @@ pub fn build_contract_address_const<'ctx, 'this>( _metadata: &mut MetadataStorage, info: &SignatureAndConstConcreteLibfunc, ) -> Result<()> { - let value = match info.c.sign() { - Sign::Minus => Cow::Owned(&*PRIME - info.c.magnitude()), - _ => Cow::Borrowed(info.c.magnitude()), - }; - - let value = entry - .append_operation(arith::constant( - context, - Attribute::parse(context, &format!("{value} : i252")) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); + let value = entry.const_int( + context, + location, + match info.c.sign() { + Sign::Minus => &*PRIME - info.c.magnitude(), + _ => info.c.magnitude().clone(), + }, + 252, + )?; entry.append_operation(helper.br(0, &[value], location)); Ok(()) @@ -600,28 +500,22 @@ pub fn build_contract_address_try_from_felt252<'ctx, 'this>( let value = entry.argument(1)?.into(); - let limit = entry - .append_operation(arith::constant( - context, - Attribute::parse( - context, - "3618502788666131106986593281521497120414687020801267626233049500247285301248 : i252", - ) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); - let is_in_range = entry - .append_operation(arith::cmpi( + let limit = entry.append_op_result(arith::constant( + context, + Attribute::parse( context, - CmpiPredicate::Ult, - value, - limit, - location, - )) - .result(0)? - .into(); + "3618502788666131106986593281521497120414687020801267626233049500247285301248 : i252", + ) + .unwrap(), + location, + ))?; + let is_in_range = entry.append_op_result(arith::cmpi( + context, + CmpiPredicate::Ult, + value, + limit, + location, + ))?; entry.append_operation(helper.cond_br( context, @@ -656,16 +550,12 @@ pub fn build_storage_read<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -680,50 +570,22 @@ pub fn build_storage_read<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -732,13 +594,12 @@ pub fn build_storage_read<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), - gas_builtin_ptr, location, - LoadStoreOptions::default(), - )); + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; // Allocate `address` argument and write the value. let address_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; @@ -750,30 +611,18 @@ pub fn build_storage_read<'ctx, 'this>( )?; // Extract function pointer. - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::STORAGE_READ.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::STORAGE_READ.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -788,118 +637,83 @@ pub fn build_storage_read<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -924,16 +738,12 @@ pub fn build_storage_write<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -952,50 +762,22 @@ pub fn build_storage_write<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -1004,13 +786,12 @@ pub fn build_storage_write<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), - gas_builtin_ptr, location, - LoadStoreOptions::default(), - )); + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; // Allocate `address` argument and write the value. let address_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; @@ -1025,30 +806,18 @@ pub fn build_storage_write<'ctx, 'this>( let value_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; entry.store(context, location, value_arg_ptr, entry.argument(4)?.into())?; - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::STORAGE_WRITE.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::STORAGE_WRITE.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -1064,118 +833,83 @@ pub fn build_storage_write<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() - }; - - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? + }; + + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -1199,20 +933,15 @@ pub fn build_storage_base_address_const<'ctx, 'this>( _metadata: &mut MetadataStorage, info: &SignatureAndConstConcreteLibfunc, ) -> Result<()> { - let value = match info.c.sign() { - Sign::Minus => Cow::Owned(&*PRIME - info.c.magnitude()), - _ => Cow::Borrowed(info.c.magnitude()), - }; - - let value = entry - .append_operation(arith::constant( - context, - Attribute::parse(context, &format!("{value} : i252")) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); + let value = entry.const_int( + context, + location, + match info.c.sign() { + Sign::Minus => &*PRIME - info.c.magnitude(), + _ => info.c.magnitude().clone(), + }, + 252, + )?; entry.append_operation(helper.br(0, &[value], location)); Ok(()) @@ -1230,43 +959,32 @@ pub fn build_storage_base_address_from_felt252<'ctx, 'this>( let range_check = super::increment_builtin_counter(context, entry, location, entry.argument(0)?.into())?; - let k_limit = entry - .append_operation(arith::constant( + let k_limit = entry.append_op_result(arith::constant( + context, + Attribute::parse( context, - Attribute::parse( - context, - "3618502788666131106986593281521497120414687020801267626233049500247285300992 : i252", - ) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); + "3618502788666131106986593281521497120414687020801267626233049500247285300992 : i252", + ) + .unwrap(), + location, + ))?; - let limited_value = entry - .append_operation(arith::subi(entry.argument(1)?.into(), k_limit, location)) - .result(0)? - .into(); + let limited_value = + entry.append_op_result(arith::subi(entry.argument(1)?.into(), k_limit, location))?; - let is_within_limit = entry - .append_operation(arith::cmpi( - context, - CmpiPredicate::Ult, - entry.argument(1)?.into(), - k_limit, - location, - )) - .result(0)? - .into(); - let value = entry - .append_operation( - OperationBuilder::new("arith.select", location) - .add_operands(&[is_within_limit, entry.argument(1)?.into(), limited_value]) - .add_results(&[IntegerType::new(context, 252).into()]) - .build()?, - ) - .result(0)? - .into(); + let is_within_limit = entry.append_op_result(arith::cmpi( + context, + CmpiPredicate::Ult, + entry.argument(1)?.into(), + k_limit, + location, + ))?; + let value = entry.append_op_result(arith::select( + is_within_limit, + entry.argument(1)?.into(), + limited_value, + location, + ))?; entry.append_operation(helper.br(0, &[range_check, value], location)); Ok(()) @@ -1294,18 +1012,12 @@ pub fn build_storage_address_from_base_and_offset<'ctx, 'this>( _metadata: &mut MetadataStorage, _info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { - let offset = entry - .append_operation(arith::extui( - entry.argument(1)?.into(), - entry.argument(0)?.r#type(), - location, - )) - .result(0)? - .into(); - let addr = entry - .append_operation(arith::addi(entry.argument(0)?.into(), offset, location)) - .result(0)? - .into(); + let offset = entry.append_op_result(arith::extui( + entry.argument(1)?.into(), + entry.argument(0)?.r#type(), + location, + ))?; + let addr = entry.append_op_result(arith::addi(entry.argument(0)?.into(), offset, location))?; entry.append_operation(helper.br(0, &[addr], location)); Ok(()) @@ -1338,28 +1050,22 @@ pub fn build_storage_address_try_from_felt252<'ctx, 'this>( let value = entry.argument(1)?.into(); - let limit = entry - .append_operation(arith::constant( - context, - Attribute::parse( - context, - "3618502788666131106986593281521497120414687020801267626233049500247285301248 : i252", - ) - .ok_or(Error::ParseAttributeError)?, - location, - )) - .result(0)? - .into(); - let is_in_range = entry - .append_operation(arith::cmpi( + let limit = entry.append_op_result(arith::constant( + context, + Attribute::parse( context, - CmpiPredicate::Ult, - value, - limit, - location, - )) - .result(0)? - .into(); + "3618502788666131106986593281521497120414687020801267626233049500247285301248 : i252", + ) + .unwrap(), + location, + ))?; + let is_in_range = entry.append_op_result(arith::cmpi( + context, + CmpiPredicate::Ult, + value, + limit, + location, + ))?; entry.append_operation(helper.cond_br( context, @@ -1381,16 +1087,12 @@ pub fn build_emit_event<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -1409,50 +1111,22 @@ pub fn build_emit_event<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -1513,30 +1187,18 @@ pub fn build_emit_event<'ctx, 'this>( )?; entry.store(context, location, data_arg_ptr, entry.argument(3)?.into())?; - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::EMIT_EVENT.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::EMIT_EVENT.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -1551,118 +1213,83 @@ pub fn build_emit_event<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() - }; + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? + }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -1687,16 +1314,12 @@ pub fn build_get_block_hash<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -1711,50 +1334,22 @@ pub fn build_get_block_hash<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -1772,30 +1367,18 @@ pub fn build_get_block_hash<'ctx, 'this>( )); // Extract function pointer. - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::GET_BLOCK_HASH.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::GET_BLOCK_HASH.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -1809,118 +1392,83 @@ pub fn build_get_block_hash<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -1945,16 +1493,12 @@ pub fn build_get_execution_info<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -1969,50 +1513,194 @@ pub fn build_get_execution_info<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; + + // Allocate space and write the current gas. + let gas_builtin_ptr = helper.init_block().alloca1( + context, + location, + IntegerType::new(context, 128).into(), + get_integer_layout(128).align(), + )?; + entry.store( + context, + location, + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; + + // Extract function pointer. + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( + context, + &[StarknetSyscallHandlerCallbacks::<()>::GET_EXECUTION_INFO.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; + + entry.append_operation( + OperationBuilder::new("llvm.call", location) + .add_operands(&[fn_ptr, result_ptr, ptr, gas_builtin_ptr]) + .build()?, + ); + + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; + + let payload_ok = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) .add_attributes(&[ ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], ) .into(), ), ( Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? + }; + let payload_err = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) .into(), ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), ]) - .add_operands(&[k1]) + .add_operands(&[result_ptr]) .add_results(&[llvm::r#type::pointer(context, 0)]) .build()?, - ) - .result(0)? - .into(); + )?; + entry.load(context, location, ptr, variant_tys[1].0)? + }; + + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; + + entry.append_operation(helper.cond_br( + context, + result_tag, + [1, 0], + [ + &[remaining_gas, entry.argument(1)?.into(), payload_err], + &[remaining_gas, entry.argument(1)?.into(), payload_ok], + ], + location, + )); + Ok(()) +} + +pub fn build_get_execution_info_v2<'ctx, 'this>( + context: &'ctx Context, + registry: &ProgramRegistry, + entry: &'this Block<'ctx>, + location: Location<'ctx>, + helper: &LibfuncHelper<'ctx, 'this>, + metadata: &mut MetadataStorage, + info: &SignatureOnlyConcreteLibfunc, +) -> Result<()> { + // Extract self pointer. + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; + + // Allocate space for the return value. + let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = + crate::types::r#enum::get_type_for_variants( + context, + helper, + registry, + metadata, + &[ + info.branch_signatures()[0].vars[2].ty.clone(), + info.branch_signatures()[1].vars[2].ty.clone(), + ], + )?; + + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -2021,39 +1709,26 @@ pub fn build_get_execution_info<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), - gas_builtin_ptr, location, - LoadStoreOptions::default(), - )); + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; // Extract function pointer. - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::GET_EXECUTION_INFO.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::GET_EXECUTION_INFOV2.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -2061,118 +1736,83 @@ pub fn build_get_execution_info<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -2187,7 +1827,7 @@ pub fn build_get_execution_info<'ctx, 'this>( Ok(()) } -pub fn build_get_execution_info_v2<'ctx, 'this>( +pub fn build_deploy<'ctx, 'this>( context: &'ctx Context, registry: &ProgramRegistry, entry: &'this Block<'ctx>, @@ -2197,708 +1837,85 @@ pub fn build_get_execution_info_v2<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. - let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = - crate::types::r#enum::get_type_for_variants( + let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = { + let tag_layout = get_integer_layout(1); + let tag_ty: Type = IntegerType::new(context, 1).into(); + + let mut layout = tag_layout; + let output = [ + { + let (p0_ty, p0_layout) = registry.build_type_with_layout( + context, + helper, + registry, + metadata, + &info.branch_signatures()[0].vars[2].ty, + )?; + let (p1_ty, p1_layout) = registry.build_type_with_layout( + context, + helper, + registry, + metadata, + &info.branch_signatures()[0].vars[3].ty, + )?; + + let payload_ty = llvm::r#type::r#struct(context, &[p0_ty, p1_ty], false); + let payload_layout = p0_layout.extend(p1_layout)?.0; + + let full_layout = tag_layout.extend(payload_layout)?.0; + layout = Layout::from_size_align( + layout.size().max(full_layout.size()), + layout.align().max(full_layout.align()), + )?; + + (payload_ty, payload_layout) + }, + { + let (payload_ty, payload_layout) = registry.build_type_with_layout( + context, + helper, + registry, + metadata, + &info.branch_signatures()[1].vars[2].ty, + )?; + + let full_layout = tag_layout.extend(payload_layout)?.0; + layout = Layout::from_size_align( + layout.size().max(full_layout.size()), + layout.align().max(full_layout.align()), + )?; + + (payload_ty, payload_layout) + }, + ]; + + (layout, (tag_ty, tag_layout), output) + }; + + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - helper, - registry, - metadata, &[ - info.branch_signatures()[0].vars[2].ty.clone(), - info.branch_signatures()[1].vars[2].ty.clone(), + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), ], - )?; - - let k1 = helper - .init_block() - .append_operation(arith::constant( - context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - - // Allocate space and write the current gas. - let gas_builtin_ptr = helper.init_block().alloca1( - context, - location, - IntegerType::new(context, 128).into(), - get_integer_layout(128).align(), - )?; - entry.append_operation(llvm::store( - context, - entry.argument(0)?.into(), - gas_builtin_ptr, - location, - LoadStoreOptions::default(), - )); - - // Extract function pointer. - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::GET_EXECUTION_INFOV2.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( - context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - - entry.append_operation( - OperationBuilder::new("llvm.call", location) - .add_operands(&[fn_ptr, result_ptr, ptr, gas_builtin_ptr]) - .build()?, - ); - - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( - context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); - - let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() - }; - let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() - }; - - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - - entry.append_operation(helper.cond_br( - context, - result_tag, - [1, 0], - [ - &[remaining_gas, entry.argument(1)?.into(), payload_err], - &[remaining_gas, entry.argument(1)?.into(), payload_ok], - ], - location, - )); - Ok(()) -} - -pub fn build_deploy<'ctx, 'this>( - context: &'ctx Context, - registry: &ProgramRegistry, - entry: &'this Block<'ctx>, - location: Location<'ctx>, - helper: &LibfuncHelper<'ctx, 'this>, - metadata: &mut MetadataStorage, - info: &SignatureOnlyConcreteLibfunc, -) -> Result<()> { - // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - - // Allocate space for the return value. - let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = { - let tag_layout = get_integer_layout(1); - let tag_ty: Type = IntegerType::new(context, 1).into(); - - let mut layout = tag_layout; - let output = [ - { - let (p0_ty, p0_layout) = registry.build_type_with_layout( - context, - helper, - registry, - metadata, - &info.branch_signatures()[0].vars[2].ty, - )?; - let (p1_ty, p1_layout) = registry.build_type_with_layout( - context, - helper, - registry, - metadata, - &info.branch_signatures()[0].vars[3].ty, - )?; - - let payload_ty = llvm::r#type::r#struct(context, &[p0_ty, p1_ty], false); - let payload_layout = p0_layout.extend(p1_layout)?.0; - - let full_layout = tag_layout.extend(payload_layout)?.0; - layout = Layout::from_size_align( - layout.size().max(full_layout.size()), - layout.align().max(full_layout.align()), - )?; - - (payload_ty, payload_layout) - }, - { - let (payload_ty, payload_layout) = registry.build_type_with_layout( - context, - helper, - registry, - metadata, - &info.branch_signatures()[1].vars[2].ty, - )?; - - let full_layout = tag_layout.extend(payload_layout)?.0; - layout = Layout::from_size_align( - layout.size().max(full_layout.size()), - layout.align().max(full_layout.align()), - )?; - - (payload_ty, payload_layout) - }, - ]; - - (layout, (tag_ty, tag_layout), output) - }; - - let k1 = helper - .init_block() - .append_operation(arith::constant( - context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - - // Allocate space and write the current gas. - let gas_builtin_ptr = helper.init_block().alloca1( - context, - location, - IntegerType::new(context, 128).into(), - get_integer_layout(128).align(), - )?; - entry.append_operation(llvm::store( - context, - entry.argument(0)?.into(), - gas_builtin_ptr, - location, - LoadStoreOptions::default(), - )); - - // Allocate `class_hash` argument and write the value. - let class_hash_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; - entry.store( - context, - location, - class_hash_arg_ptr, - entry.argument(2)?.into(), - )?; - - // Allocate `entry_point_selector` argument and write the value. - let contract_address_salt_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; - entry.store( - context, - location, - contract_address_salt_arg_ptr, - entry.argument(3)?.into(), - )?; - - // Allocate `calldata` argument and write the value. - let calldata_arg_ptr = helper.init_block().alloca1( - context, - location, - llvm::r#type::r#struct( - context, - &[llvm::r#type::r#struct( - context, - &[ - llvm::r#type::pointer(context, 0), // ptr to felt - IntegerType::new(context, 32).into(), - IntegerType::new(context, 32).into(), - IntegerType::new(context, 32).into(), - ], - false, - )], - false, - ), - get_integer_layout(64).align(), - )?; - entry.store( - context, - location, - calldata_arg_ptr, - entry.argument(4)?.into(), - )?; - - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::DEPLOY.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( - context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - - entry.append_operation( - OperationBuilder::new("llvm.call", location) - .add_operands(&[ - fn_ptr, - result_ptr, - ptr, - gas_builtin_ptr, - class_hash_arg_ptr, - contract_address_salt_arg_ptr, - calldata_arg_ptr, - entry - .append_operation(llvm::extract_value( - context, - entry.argument(5)?.into(), - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(), - ]) - .build()?, - ); - - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( - context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); - - let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() - }; - let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() - }; - - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - - entry.append_operation( - helper.cond_br( - context, - result_tag, - [1, 0], - [ - &[remaining_gas, entry.argument(1)?.into(), payload_err], - &[ - remaining_gas, - entry.argument(1)?.into(), - entry - .append_operation(llvm::extract_value( - context, - payload_ok, - DenseI64ArrayAttribute::new(context, &[0]), - get_struct_field_type_at(&variant_tys[0].0, 0), - location, - )) - .result(0)? - .into(), - entry - .append_operation(llvm::extract_value( - context, - payload_ok, - DenseI64ArrayAttribute::new(context, &[1]), - get_struct_field_type_at(&variant_tys[0].0, 1), - location, - )) - .result(0)? - .into(), - ], - ], - location, - ), - ); - Ok(()) -} - -pub fn build_keccak<'ctx, 'this>( - context: &'ctx Context, - registry: &ProgramRegistry, - entry: &'this Block<'ctx>, - location: Location<'ctx>, - helper: &LibfuncHelper<'ctx, 'this>, - metadata: &mut MetadataStorage, - info: &SignatureOnlyConcreteLibfunc, -) -> Result<()> { - // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - - // Allocate space for the return value. - let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = - crate::types::r#enum::get_type_for_variants( - context, - helper, - registry, - metadata, - &[ - info.branch_signatures()[0].vars[2].ty.clone(), - info.branch_signatures()[1].vars[2].ty.clone(), - ], - )?; - - let k1 = helper - .init_block() - .append_operation(arith::constant( - context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -2907,175 +1924,172 @@ pub fn build_keccak<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), + location, gas_builtin_ptr, + entry.argument(0)?.into(), + )?; + + // Allocate `class_hash` argument and write the value. + let class_hash_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; + entry.store( + context, location, - LoadStoreOptions::default(), - )); + class_hash_arg_ptr, + entry.argument(2)?.into(), + )?; - // Allocate `input` argument and write the value. - let input_arg_ptr = helper.init_block().alloca1( + // Allocate `entry_point_selector` argument and write the value. + let contract_address_salt_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; + entry.store( + context, + location, + contract_address_salt_arg_ptr, + entry.argument(3)?.into(), + )?; + + // Allocate `calldata` argument and write the value. + let calldata_arg_ptr = helper.init_block().alloca1( context, location, llvm::r#type::r#struct( context, - &[ - llvm::r#type::pointer(context, 0), // ptr to u64 - IntegerType::new(context, 32).into(), - IntegerType::new(context, 32).into(), - IntegerType::new(context, 32).into(), - ], + &[llvm::r#type::r#struct( + context, + &[ + llvm::r#type::pointer(context, 0), // ptr to felt + IntegerType::new(context, 32).into(), + IntegerType::new(context, 32).into(), + IntegerType::new(context, 32).into(), + ], + false, + )], false, ), get_integer_layout(64).align(), )?; - entry.store(context, location, input_arg_ptr, entry.argument(2)?.into())?; + entry.store( + context, + location, + calldata_arg_ptr, + entry.argument(4)?.into(), + )?; - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::KECCAK.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::DEPLOY.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) - .add_operands(&[fn_ptr, result_ptr, ptr, gas_builtin_ptr, input_arg_ptr]) - .build()?, - ); - - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( - context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); - - let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, + .add_operands(&[ + fn_ptr, + result_ptr, ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + gas_builtin_ptr, + class_hash_arg_ptr, + contract_address_salt_arg_ptr, + calldata_arg_ptr, + entry + .append_operation(llvm::extract_value( + context, + entry.argument(5)?.into(), + DenseI64ArrayAttribute::new(context, &[0]), + IntegerType::new(context, 1).into(), + location, + )) + .result(0)? + .into(), + ]) + .build()?, + ); + + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; + + let payload_ok = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -3083,14 +2097,31 @@ pub fn build_keccak<'ctx, 'this>( [1, 0], [ &[remaining_gas, entry.argument(1)?.into(), payload_err], - &[remaining_gas, entry.argument(1)?.into(), payload_ok], + &[ + remaining_gas, + entry.argument(1)?.into(), + entry.extract_value( + context, + location, + payload_ok, + get_struct_field_type_at(&variant_tys[0].0, 0), + 0, + )?, + entry.extract_value( + context, + location, + payload_ok, + get_struct_field_type_at(&variant_tys[0].0, 1), + 1, + )?, + ], ], location, )); Ok(()) } -pub fn build_library_call<'ctx, 'this>( +pub fn build_keccak<'ctx, 'this>( context: &'ctx Context, registry: &ProgramRegistry, entry: &'this Block<'ctx>, @@ -3100,16 +2131,12 @@ pub fn build_library_call<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -3124,50 +2151,211 @@ pub fn build_library_call<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; + + // Allocate space and write the current gas. + let gas_builtin_ptr = helper.init_block().alloca1( + context, + location, + IntegerType::new(context, 128).into(), + get_integer_layout(128).align(), + )?; + entry.store( + context, + location, + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; + + // Allocate `input` argument and write the value. + let input_arg_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( + context, + &[ + llvm::r#type::pointer(context, 0), // ptr to u64 + IntegerType::new(context, 32).into(), + IntegerType::new(context, 32).into(), + IntegerType::new(context, 32).into(), + ], + false, + ), + get_integer_layout(64).align(), + )?; + entry.store(context, location, input_arg_ptr, entry.argument(2)?.into())?; + + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( + context, + &[StarknetSyscallHandlerCallbacks::<()>::KECCAK.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; + + entry.append_operation( + OperationBuilder::new("llvm.call", location) + .add_operands(&[fn_ptr, result_ptr, ptr, gas_builtin_ptr, input_arg_ptr]) + .build()?, + ); + + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; + + let payload_ok = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) .add_attributes(&[ ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], ) .into(), ), ( Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? + }; + let payload_err = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) .into(), ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), ]) - .add_operands(&[k1]) + .add_operands(&[result_ptr]) .add_results(&[llvm::r#type::pointer(context, 0)]) .build()?, - ) - .result(0)? - .into(); + )?; + entry.load(context, location, ptr, variant_tys[1].0)? + }; + + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; + + entry.append_operation(helper.cond_br( + context, + result_tag, + [1, 0], + [ + &[remaining_gas, entry.argument(1)?.into(), payload_err], + &[remaining_gas, entry.argument(1)?.into(), payload_ok], + ], + location, + )); + Ok(()) +} + +pub fn build_library_call<'ctx, 'this>( + context: &'ctx Context, + registry: &ProgramRegistry, + entry: &'this Block<'ctx>, + location: Location<'ctx>, + helper: &LibfuncHelper<'ctx, 'this>, + metadata: &mut MetadataStorage, + info: &SignatureOnlyConcreteLibfunc, +) -> Result<()> { + // Extract self pointer. + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; + + // Allocate space for the return value. + let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = + crate::types::r#enum::get_type_for_variants( + context, + helper, + registry, + metadata, + &[ + info.branch_signatures()[0].vars[2].ty.clone(), + info.branch_signatures()[1].vars[2].ty.clone(), + ], + )?; + + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -3176,33 +2364,30 @@ pub fn build_library_call<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), - gas_builtin_ptr, location, - LoadStoreOptions::default(), - )); + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; // Allocate `class_hash` argument and write the value. let class_hash_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(2)?.into(), - class_hash_arg_ptr, location, - LoadStoreOptions::default(), - )); + class_hash_arg_ptr, + entry.argument(2)?.into(), + )?; // Allocate `entry_point_selector` argument and write the value. let function_selector_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(3)?.into(), - function_selector_arg_ptr, location, - LoadStoreOptions::default(), - )); + function_selector_arg_ptr, + entry.argument(3)?.into(), + )?; // Allocate `calldata` argument and write the value. let calldata_arg_ptr = helper.init_block().alloca1( @@ -3224,38 +2409,25 @@ pub fn build_library_call<'ctx, 'this>( ), get_integer_layout(64).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(4)?.into(), - calldata_arg_ptr, location, - LoadStoreOptions::default(), - )); + calldata_arg_ptr, + entry.argument(4)?.into(), + )?; - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::LIBRARY_CALL.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::LIBRARY_CALL.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -3271,118 +2443,83 @@ pub fn build_library_call<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -3407,16 +2544,12 @@ pub fn build_replace_class<'ctx, 'this>( info: &SignatureOnlyConcreteLibfunc, ) -> Result<()> { // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -3435,50 +2568,22 @@ pub fn build_replace_class<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -3487,48 +2592,34 @@ pub fn build_replace_class<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), - gas_builtin_ptr, location, - LoadStoreOptions::default(), - )); + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; // Allocate `class_hash` argument and write the value. let class_hash_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(2)?.into(), - class_hash_arg_ptr, location, - LoadStoreOptions::default(), - )); + class_hash_arg_ptr, + entry.argument(2)?.into(), + )?; - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::REPLACE_CLASS.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::REPLACE_CLASS.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -3536,118 +2627,83 @@ pub fn build_replace_class<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, @@ -3669,19 +2725,15 @@ pub fn build_send_message_to_l1<'ctx, 'this>( location: Location<'ctx>, helper: &LibfuncHelper<'ctx, 'this>, metadata: &mut MetadataStorage, - info: &SignatureOnlyConcreteLibfunc, -) -> Result<()> { - // Extract self pointer. - let ptr = entry - .append_operation(llvm::load( - context, - entry.argument(1)?.into(), - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + info: &SignatureOnlyConcreteLibfunc, +) -> Result<()> { + // Extract self pointer. + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; // Allocate space for the return value. let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = @@ -3700,50 +2752,22 @@ pub fn build_send_message_to_l1<'ctx, 'this>( ], )?; - let k1 = helper - .init_block() - .append_operation(arith::constant( + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( context, - IntegerAttribute::new(IntegerType::new(context, 64).into(), 1).into(), - location, - )) - .result(0)? - .into(); - let result_ptr = helper - .init_block() - .append_operation( - OperationBuilder::new("llvm.alloca", location) - .add_attributes(&[ - ( - Identifier::new(context, "alignment"), - IntegerAttribute::new( - IntegerType::new(context, 64).into(), - result_layout.align().try_into()?, - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - )) - .into(), - ), - ]) - .add_operands(&[k1]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; // Allocate space and write the current gas. let gas_builtin_ptr = helper.init_block().alloca1( @@ -3752,23 +2776,21 @@ pub fn build_send_message_to_l1<'ctx, 'this>( IntegerType::new(context, 128).into(), get_integer_layout(128).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(0)?.into(), - gas_builtin_ptr, location, - LoadStoreOptions::default(), - )); + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; // Allocate `to_address` argument and write the value. let to_address_arg_ptr = helper.init_block().alloca_int(context, location, 252)?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(2)?.into(), - to_address_arg_ptr, location, - LoadStoreOptions::default(), - )); + to_address_arg_ptr, + entry.argument(2)?.into(), + )?; // Allocate `payload` argument and write the value. let payload_arg_ptr = helper.init_block().alloca1( @@ -3786,38 +2808,25 @@ pub fn build_send_message_to_l1<'ctx, 'this>( ), get_integer_layout(64).align(), )?; - entry.append_operation(llvm::store( + entry.store( context, - entry.argument(3)?.into(), - payload_arg_ptr, location, - LoadStoreOptions::default(), - )); + payload_arg_ptr, + entry.argument(3)?.into(), + )?; - let fn_ptr = entry - .append_operation(llvm::get_element_ptr( - context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::SEND_MESSAGE_TO_L1.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), - location, - )) - .result(0)? - .into(); - let fn_ptr = entry - .append_operation(llvm::load( + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( context, - fn_ptr, - llvm::r#type::pointer(context, 0), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + &[StarknetSyscallHandlerCallbacks::<()>::SEND_MESSAGE_TO_L1.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( OperationBuilder::new("llvm.call", location) @@ -3832,118 +2841,83 @@ pub fn build_send_message_to_l1<'ctx, 'this>( .build()?, ); - let result = entry - .append_operation(llvm::load( - context, - result_ptr, - llvm::r#type::r#struct( - context, - &[ - result_tag_ty, - llvm::r#type::array( - IntegerType::new(context, 8).into(), - (result_layout.size() - 1).try_into()?, - ), - ], - false, - ), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); - let result_tag = entry - .append_operation(llvm::extract_value( + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( context, - result, - DenseI64ArrayAttribute::new(context, &[0]), - IntegerType::new(context, 1).into(), - location, - )) - .result(0)? - .into(); + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; let payload_ok = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[0].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? }; let payload_err = { - let ptr = entry - .append_operation( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, - ) - .result(0)? - .into(); - entry - .append_operation(llvm::load( - context, - ptr, - variant_tys[1].0, - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into() + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? }; - let remaining_gas = entry - .append_operation(llvm::load( - context, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - location, - LoadStoreOptions::default(), - )) - .result(0)? - .into(); + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; entry.append_operation(helper.cond_br( context, diff --git a/src/libfuncs/starknet/secp256.rs b/src/libfuncs/starknet/secp256.rs index 4268f5cecf..d06c350944 100644 --- a/src/libfuncs/starknet/secp256.rs +++ b/src/libfuncs/starknet/secp256.rs @@ -1,10 +1,9 @@ use crate::{ - block_ext::BlockExt, error::Result, libfuncs::LibfuncHelper, metadata::MetadataStorage, starknet::handler::StarknetSyscallHandlerCallbacks, - utils::{get_integer_layout, ProgramRegistryExt}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/starknet/testing.rs b/src/libfuncs/starknet/testing.rs index 4d0c735ce8..2b9b024c49 100644 --- a/src/libfuncs/starknet/testing.rs +++ b/src/libfuncs/starknet/testing.rs @@ -1,3 +1,11 @@ +#![cfg(feature = "with-cheatcode")] + +use crate::{ + error::Result, + libfuncs::LibfuncHelper, + metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, + utils::{get_integer_layout, BlockExt, ProgramRegistryExt}, +}; use cairo_lang_sierra::{ extensions::{ core::{CoreLibfunc, CoreType}, @@ -16,14 +24,6 @@ use melior::{ Context, }; -use crate::{ - block_ext::BlockExt, - error::Result, - libfuncs::LibfuncHelper, - metadata::{runtime_bindings::RuntimeBindingsMeta, MetadataStorage}, - utils::{get_integer_layout, ProgramRegistryExt}, -}; - pub fn build<'ctx, 'this>( context: &'ctx Context, registry: &ProgramRegistry, diff --git a/src/libfuncs/struct.rs b/src/libfuncs/struct.rs index 88c67f9e67..0e93415284 100644 --- a/src/libfuncs/struct.rs +++ b/src/libfuncs/struct.rs @@ -1,9 +1,11 @@ //! # Struct-related libfuncs use super::LibfuncHelper; -use crate::block_ext::BlockExt; use crate::{ - error::Result, metadata::MetadataStorage, types::TypeBuilder, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + types::TypeBuilder, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/libfuncs/uint128.rs b/src/libfuncs/uint128.rs index b9222e9f14..9f1ca14c09 100644 --- a/src/libfuncs/uint128.rs +++ b/src/libfuncs/uint128.rs @@ -2,7 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -564,7 +566,7 @@ pub fn build_guarantee_verify<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -653,11 +655,11 @@ mod test { }; } - fn u256(value: BigUint) -> JitValue { + fn u256(value: BigUint) -> Value { assert!(value.bits() <= 256); jit_struct!( - JitValue::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), - JitValue::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), ) } @@ -692,7 +694,7 @@ mod test { fn u128_safe_divmod() { let program = &U128_SAFE_DIVMOD; let max_value = 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFFu128; - let error = JitValue::Felt252(Felt::from_bytes_be_slice(b"Division by 0")); + let error = Value::Felt252(Felt::from_bytes_be_slice(b"Division by 0")); run_program_assert_output( program, @@ -856,7 +858,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -908,7 +910,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/uint16.rs b/src/libfuncs/uint16.rs index 89aac52a92..480cc8a513 100644 --- a/src/libfuncs/uint16.rs +++ b/src/libfuncs/uint16.rs @@ -2,10 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::{Error, Result}, metadata::MetadataStorage, - utils::ProgramRegistryExt, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -551,7 +550,7 @@ pub fn build_from_felt252<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -686,7 +685,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -738,7 +737,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/uint256.rs b/src/libfuncs/uint256.rs index 2a96bb5125..a1f2fd64f2 100644 --- a/src/libfuncs/uint256.rs +++ b/src/libfuncs/uint256.rs @@ -990,7 +990,7 @@ pub fn build_u256_guarantee_inv_mod_n<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -1036,11 +1036,11 @@ mod test { }; } - fn u256(value: BigUint) -> JitValue { + fn u256(value: BigUint) -> Value { assert!(value.bits() <= 256); jit_struct!( - JitValue::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), - JitValue::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), ) } @@ -1075,7 +1075,7 @@ mod test { #[test] fn u256_safe_divmod() { #[track_caller] - fn run(lhs: (u128, u128), rhs: (u128, u128), result: JitValue) { + fn run(lhs: (u128, u128), rhs: (u128, u128), result: Value) { run_program_assert_output( &U256_SAFE_DIVMOD, "run_test", @@ -1166,7 +1166,7 @@ mod test { #[test] fn u256_sqrt() { #[track_caller] - fn run(value: (u128, u128), result: JitValue) { + fn run(value: (u128, u128), result: Value) { run_program_assert_output( &U256_SQRT, "run_test", @@ -1204,7 +1204,7 @@ mod test { #[test] fn u256_inv_mod_n() { #[track_caller] - fn run(a: (u128, u128), n: (u128, u128), result: JitValue) { + fn run(a: (u128, u128), n: (u128, u128), result: Value) { run_program_assert_output( &U256_INV_MOD_N, "run_test", diff --git a/src/libfuncs/uint32.rs b/src/libfuncs/uint32.rs index b33b580253..01e54e11ff 100644 --- a/src/libfuncs/uint32.rs +++ b/src/libfuncs/uint32.rs @@ -2,7 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -519,7 +521,7 @@ pub fn build_from_felt252<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -658,7 +660,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -710,7 +712,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/uint512.rs b/src/libfuncs/uint512.rs index 1f54a39ebb..565c6ee40b 100644 --- a/src/libfuncs/uint512.rs +++ b/src/libfuncs/uint512.rs @@ -2,7 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -184,7 +186,7 @@ pub fn build_divmod_u256<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -204,21 +206,21 @@ mod test { #[test] fn u512_safe_divmod_by_u256() { - fn u512(value: BigUint) -> JitValue { + fn u512(value: BigUint) -> Value { assert!(value.bits() <= 512); jit_struct!( - JitValue::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), - JitValue::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), - JitValue::Uint128(((&value >> 256u32) & &u128::MAX.into()).try_into().unwrap()), - JitValue::Uint128(((&value >> 384u32) & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128(((&value >> 256u32) & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128(((&value >> 384u32) & &u128::MAX.into()).try_into().unwrap()), ) } - fn u256(value: BigUint) -> JitValue { + fn u256(value: BigUint) -> Value { assert!(value.bits() <= 256); jit_struct!( - JitValue::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), - JitValue::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128((&value & &u128::MAX.into()).try_into().unwrap()), + Value::Uint128(((&value >> 128u32) & &u128::MAX.into()).try_into().unwrap()), ) } diff --git a/src/libfuncs/uint64.rs b/src/libfuncs/uint64.rs index 52598b86c5..fbe29f9a57 100644 --- a/src/libfuncs/uint64.rs +++ b/src/libfuncs/uint64.rs @@ -2,7 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -519,7 +521,7 @@ pub fn build_from_felt252<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -661,7 +663,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -713,7 +715,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/libfuncs/uint8.rs b/src/libfuncs/uint8.rs index c3b127c080..9b91ce2bda 100644 --- a/src/libfuncs/uint8.rs +++ b/src/libfuncs/uint8.rs @@ -2,7 +2,9 @@ use super::LibfuncHelper; use crate::{ - block_ext::BlockExt, error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt, + error::Result, + metadata::MetadataStorage, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -516,7 +518,7 @@ pub fn build_from_felt252<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_panic, jit_struct, load_cairo, run_program_assert_output}, - values::JitValue, + values::Value, }; use cairo_lang_sierra::program::Program; use lazy_static::lazy_static; @@ -649,7 +651,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } @@ -701,7 +703,7 @@ mod test { program, "run_test", &[lhs.into(), rhs.into()], - jit_panic!(JitValue::Felt252(error)), + jit_panic!(Value::Felt252(error)), ); } } diff --git a/src/metadata.rs b/src/metadata.rs index a09f4f591a..724b0647ff 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -18,7 +18,6 @@ pub mod auto_breakpoint; pub mod debug_utils; pub mod enum_snapshot_variants; pub mod gas; -pub mod prime_modulo; pub mod realloc_bindings; pub mod runtime_bindings; pub mod snapshot_clones; diff --git a/src/metadata/debug_utils.rs b/src/metadata/debug_utils.rs index e900f9b661..4da04050c9 100644 --- a/src/metadata/debug_utils.rs +++ b/src/metadata/debug_utils.rs @@ -4,7 +4,7 @@ //! //! ## Example //! -//! ``` +//! ```rust,ignore //! # use cairo_lang_sierra::{ //! # extensions::{ //! # core::{CoreLibfunc, CoreType}, @@ -84,9 +84,8 @@ #![cfg(feature = "with-debug-utils")] use crate::{ - block_ext::BlockExt, error::{Error, Result}, - utils::get_integer_layout, + utils::{get_integer_layout, BlockExt}, }; use melior::{ dialect::{ diff --git a/src/metadata/prime_modulo.rs b/src/metadata/prime_modulo.rs deleted file mode 100644 index ec1999a6ab..0000000000 --- a/src/metadata/prime_modulo.rs +++ /dev/null @@ -1,30 +0,0 @@ -//! # Finite field prime modulo -//! -//! Contains the prime modulo number of a finite field. -//! -//! Currently used only for `Felt`. - -use num_bigint::BigUint; -use std::marker::PhantomData; - -/// Prime modulo number metadata. -#[derive(Debug)] -pub struct PrimeModuloMeta { - prime: BigUint, - phantom: PhantomData, -} - -impl PrimeModuloMeta { - /// Create the metadata from the prime number. - pub fn new(prime: BigUint) -> Self { - Self { - prime, - phantom: PhantomData, - } - } - - /// Return the stored prime number. - pub fn prime(&self) -> &BigUint { - &self.prime - } -} diff --git a/src/metadata/snapshot_clones.rs b/src/metadata/snapshot_clones.rs index 269278246b..f820119df4 100644 --- a/src/metadata/snapshot_clones.rs +++ b/src/metadata/snapshot_clones.rs @@ -11,7 +11,7 @@ use melior::{ }; use std::{collections::HashMap, sync::Arc}; -pub type CloneFn

= for<'ctx, 'this> fn( +type CloneFn

= for<'ctx, 'this> fn( &'ctx Context, &ProgramRegistry, &'this Block<'ctx>, @@ -40,7 +40,7 @@ pub struct SnapshotClonesMeta { } impl SnapshotClonesMeta { - pub fn register

(&mut self, id: ConcreteTypeId, handler: CloneFn

, params: P) + pub(crate) fn register

(&mut self, id: ConcreteTypeId, handler: CloneFn

, params: P) where P: 'static, { @@ -64,7 +64,7 @@ impl SnapshotClonesMeta { ); } - pub fn wrap_invoke(&self, id: &ConcreteTypeId) -> Option { + pub(crate) fn wrap_invoke(&self, id: &ConcreteTypeId) -> Option { self.mappings.get(id).cloned() } } diff --git a/src/types.rs b/src/types.rs index ef3eba6da5..fc9cf69c10 100644 --- a/src/types.rs +++ b/src/types.rs @@ -3,27 +3,25 @@ //! Contains type generation stuff (aka. conversion from Sierra to MLIR types). use crate::{ - block_ext::BlockExt, error::Error as CoreTypeBuilderError, libfuncs::LibfuncHelper, metadata::{ realloc_bindings::ReallocBindingsMeta, runtime_bindings::RuntimeBindingsMeta, MetadataStorage, }, - utils::{get_integer_layout, layout_repeat, ProgramRegistryExt, RangeExt}, + utils::{get_integer_layout, layout_repeat, BlockExt, ProgramRegistryExt, RangeExt, PRIME}, }; -use cairo_lang_sierra::extensions::circuit::CircuitTypeConcrete; -use cairo_lang_sierra::extensions::utils::Range; use cairo_lang_sierra::{ extensions::{ + circuit::CircuitTypeConcrete, core::{CoreLibfunc, CoreType, CoreTypeConcrete}, starknet::StarkNetTypeConcrete, + utils::Range, }, ids::{ConcreteTypeId, UserTypeId}, program::GenericArg, program_registry::ProgramRegistry, }; -use felt252::PRIME; use melior::{ dialect::{ llvm::{self, r#type::pointer}, @@ -32,43 +30,43 @@ use melior::{ ir::{r#type::IntegerType, Block, Location, Module, Type, Value}, Context, }; -use num_bigint::{BigInt, ToBigInt}; +use num_bigint::{BigInt, Sign}; use num_traits::{Bounded, One}; use std::{alloc::Layout, error::Error, ops::Deref, sync::OnceLock}; -pub mod array; -pub mod bitwise; -pub mod bounded_int; -pub mod r#box; -pub mod builtin_costs; -pub mod bytes31; -pub mod circuit; -pub mod coupon; -pub mod ec_op; -pub mod ec_point; -pub mod ec_state; -pub mod r#enum; -pub mod felt252; -pub mod felt252_dict; -pub mod felt252_dict_entry; -pub mod gas_builtin; -pub mod non_zero; -pub mod nullable; -pub mod pedersen; -pub mod poseidon; -pub mod range_check; -pub mod segment_arena; -pub mod snapshot; -pub mod squashed_felt252_dict; -pub mod starknet; -pub mod r#struct; -pub mod uint128; -pub mod uint128_mul_guarantee; -pub mod uint16; -pub mod uint32; -pub mod uint64; -pub mod uint8; -pub mod uninitialized; +mod array; +mod bitwise; +mod bounded_int; +mod r#box; +mod builtin_costs; +mod bytes31; +mod circuit; +mod coupon; +mod ec_op; +mod ec_point; +mod ec_state; +pub(crate) mod r#enum; +mod felt252; +mod felt252_dict; +mod felt252_dict_entry; +mod gas_builtin; +mod non_zero; +mod nullable; +mod pedersen; +mod poseidon; +mod range_check; +mod segment_arena; +mod snapshot; +mod squashed_felt252_dict; +mod starknet; +mod r#struct; +mod uint128; +mod uint128_mul_guarantee; +mod uint16; +mod uint32; +mod uint64; +mod uint8; +mod uninitialized; /// Generation of MLIR types from their Sierra counterparts. /// @@ -842,7 +840,7 @@ impl TypeBuilder for CoreTypeConcrete { Self::Uint128(_) => range_of::(), Self::Felt252(_) => Range { lower: BigInt::ZERO, - upper: PRIME.to_bigint().unwrap(), + upper: BigInt::from_biguint(Sign::Plus, PRIME.clone()), }, Self::Sint8(_) => range_of::(), Self::Sint16(_) => range_of::(), diff --git a/src/types/array.rs b/src/types/array.rs index 324cf5e696..82fbac794f 100644 --- a/src/types/array.rs +++ b/src/types/array.rs @@ -18,14 +18,13 @@ //! [^2]: Those numbers are number of items, **not bytes**. use super::{TypeBuilder, WithSelf}; -use crate::block_ext::BlockExt; use crate::{ error::Result, libfuncs::LibfuncHelper, metadata::{ realloc_bindings::ReallocBindingsMeta, snapshot_clones::SnapshotClonesMeta, MetadataStorage, }, - utils::ProgramRegistryExt, + utils::{BlockExt, ProgramRegistryExt}, }; use cairo_lang_sierra::{ extensions::{ @@ -303,7 +302,7 @@ fn snapshot_take<'ctx, 'this>( mod test { use crate::{ utils::test::{load_cairo, run_program}, - values::JitValue, + values::Value, }; use pretty_assertions_sorted::assert_eq; @@ -322,16 +321,16 @@ mod test { assert_eq!( result, - JitValue::Array(vec![ - JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), - JitValue::Felt252(3.into()), + Value::Array(vec![ + Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), + Value::Felt252(3.into()), ]), - JitValue::Array(vec![ - JitValue::Felt252(4.into()), - JitValue::Felt252(5.into()), - JitValue::Felt252(6.into()), + Value::Array(vec![ + Value::Felt252(4.into()), + Value::Felt252(5.into()), + Value::Felt252(6.into()), ]), ]), ); diff --git a/src/types/box.rs b/src/types/box.rs index ec8745f4eb..51701a978b 100644 --- a/src/types/box.rs +++ b/src/types/box.rs @@ -14,13 +14,13 @@ use super::WithSelf; use crate::{ - block_ext::BlockExt, error::Result, libfuncs::LibfuncHelper, metadata::{ realloc_bindings::ReallocBindingsMeta, snapshot_clones::SnapshotClonesMeta, MetadataStorage, }, types::TypeBuilder, + utils::BlockExt, }; use cairo_lang_sierra::{ extensions::{ diff --git a/src/types/circuit.rs b/src/types/circuit.rs index 02db15468e..901a40cb33 100644 --- a/src/types/circuit.rs +++ b/src/types/circuit.rs @@ -23,8 +23,6 @@ use melior::{ Context, }; -pub const CIRCUIT_INPUT_SIZE: usize = 384; - /// Build the MLIR type. /// /// Check out [the module](self) for more info. diff --git a/src/types/felt252.rs b/src/types/felt252.rs index 532fd50aab..6d6c3f5017 100644 --- a/src/types/felt252.rs +++ b/src/types/felt252.rs @@ -2,13 +2,10 @@ //! //! A `felt252` is a 252-bit number within a //! [finite field](https://en.wikipedia.org/wiki/Finite_field) modulo -//! [a prime number](struct@self::PRIME). +//! [a prime number](crate::utils::PRIME). use super::WithSelf; -use crate::{ - error::Result, - metadata::{prime_modulo::PrimeModuloMeta, MetadataStorage}, -}; +use crate::{error::Result, metadata::MetadataStorage}; use cairo_lang_sierra::{ extensions::{ core::{CoreLibfunc, CoreType}, @@ -16,25 +13,10 @@ use cairo_lang_sierra::{ }, program_registry::ProgramRegistry, }; -use lazy_static::lazy_static; use melior::{ ir::{r#type::IntegerType, Module, Type}, Context, }; -use num_bigint::{BigInt, BigUint}; -use starknet_types_core::felt::Felt; - -lazy_static! { - /// The `felt252` prime modulo. - pub static ref PRIME: BigUint = - "3618502788666131213697322783095070105623107215331596699973092056135872020481" - .parse() - .unwrap(); - pub static ref HALF_PRIME: BigInt = - "1809251394333065606848661391547535052811553607665798349986546028067936010240" - .parse() - .unwrap(); -} /// Build the MLIR type. /// @@ -43,20 +25,8 @@ pub fn build<'ctx>( context: &'ctx Context, _module: &Module<'ctx>, _registry: &ProgramRegistry, - metadata: &mut MetadataStorage, + _metadata: &mut MetadataStorage, _info: WithSelf, ) -> Result> { - match metadata.get::>() { - Some(x) => assert_eq!(x.prime(), &*PRIME), - None => { - register_prime_modulo_meta(metadata); - } - } - Ok(IntegerType::new(context, 252).into()) } - -pub fn register_prime_modulo_meta(metadata: &mut MetadataStorage) -> &PrimeModuloMeta { - metadata - .get_or_insert_with::>(|| PrimeModuloMeta::::new(PRIME.clone())) -} diff --git a/src/types/felt252_dict.rs b/src/types/felt252_dict.rs index e5661d0a10..456079f543 100644 --- a/src/types/felt252_dict.rs +++ b/src/types/felt252_dict.rs @@ -6,11 +6,8 @@ //! used to count accesses to the dictionary. The type is interacted through the runtime functions to //! insert, get elements and increment the access counter. -use std::cell::Cell; - use super::WithSelf; use crate::{ - block_ext::BlockExt, error::Result, libfuncs::LibfuncHelper, metadata::{ @@ -18,6 +15,7 @@ use crate::{ snapshot_clones::SnapshotClonesMeta, MetadataStorage, }, types::TypeBuilder, + utils::BlockExt, }; use cairo_lang_sierra::{ extensions::{ @@ -37,6 +35,7 @@ use melior::{ }, Context, }; +use std::cell::Cell; /// Build the MLIR type. /// @@ -258,7 +257,7 @@ fn snapshot_take<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_dict, load_cairo, run_program}, - values::JitValue, + values::Value, }; use pretty_assertions_sorted::assert_eq; use starknet_types_core::felt::Felt; @@ -300,7 +299,7 @@ mod test { assert_eq!( result, jit_dict!( - 2 => JitValue::Array(vec![3u32.into(), 4u32.into()]) + 2 => Value::Array(vec![3u32.into(), 4u32.into()]) ), ); } @@ -346,13 +345,13 @@ mod test { let result = run_program(&program, "run_program", &[]); assert_eq!( result.return_value, - JitValue::Felt252Dict { + Value::Felt252Dict { value: HashMap::from([ ( Felt::ZERO, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None }), @@ -361,9 +360,9 @@ mod test { ), ( Felt::ONE, - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None }), @@ -393,12 +392,12 @@ mod test { let result = run_program(&program, "run_program", &[]); assert_eq!( result.return_value, - JitValue::Felt252Dict { + Value::Felt252Dict { value: HashMap::from([ - (Felt::ZERO, JitValue::Felt252(Felt::ZERO)), - (Felt::ONE, JitValue::Felt252(Felt::ONE)), - (Felt::TWO, JitValue::Felt252(Felt::TWO)), - (Felt::THREE, JitValue::Felt252(Felt::THREE)), + (Felt::ZERO, Value::Felt252(Felt::ZERO)), + (Felt::ONE, Value::Felt252(Felt::ONE)), + (Felt::TWO, Value::Felt252(Felt::TWO)), + (Felt::THREE, Value::Felt252(Felt::THREE)), ]), debug_name: None, }, @@ -429,38 +428,38 @@ mod test { let result = run_program(&program, "run_program", &[]); pretty_assertions_sorted::assert_eq_sorted!( result.return_value, - JitValue::Felt252Dict { + Value::Felt252Dict { value: HashMap::from([ - (Felt::ZERO, JitValue::Null), + (Felt::ZERO, Value::Null), ( Felt::ONE, - JitValue::Struct { + Value::Struct { fields: Vec::from([ - JitValue::Uint8(0), - JitValue::Sint16(1), - JitValue::Felt252(2.into()), + Value::Uint8(0), + Value::Sint16(1), + Value::Felt252(2.into()), ]), debug_name: None, }, ), ( Felt::TWO, - JitValue::Struct { + Value::Struct { fields: Vec::from([ - JitValue::Uint8(1), - JitValue::Sint16(-2), - JitValue::Felt252(3.into()), + Value::Uint8(1), + Value::Sint16(-2), + Value::Felt252(3.into()), ]), debug_name: None, }, ), ( Felt::THREE, - JitValue::Struct { + Value::Struct { fields: Vec::from([ - JitValue::Uint8(2), - JitValue::Sint16(3), - JitValue::Felt252(4.into()), + Value::Uint8(2), + Value::Sint16(3), + Value::Felt252(4.into()), ]), debug_name: None, }, @@ -488,12 +487,12 @@ mod test { let result = run_program(&program, "run_program", &[]); assert_eq!( result.return_value, - JitValue::Felt252Dict { + Value::Felt252Dict { value: HashMap::from([ - (Felt::ZERO, JitValue::Uint128(0)), - (Felt::ONE, JitValue::Uint128(1)), - (Felt::TWO, JitValue::Uint128(2)), - (Felt::THREE, JitValue::Uint128(3)), + (Felt::ZERO, Value::Uint128(0)), + (Felt::ONE, Value::Uint128(1)), + (Felt::TWO, Value::Uint128(2)), + (Felt::THREE, Value::Uint128(3)), ]), debug_name: None, }, diff --git a/src/types/nullable.rs b/src/types/nullable.rs index 62955766ba..54fad4ce0d 100644 --- a/src/types/nullable.rs +++ b/src/types/nullable.rs @@ -6,13 +6,13 @@ //! `Box` we can reuse its pointer, just leaving it null when there's no value. use super::{TypeBuilder, WithSelf}; -use crate::block_ext::BlockExt; use crate::{ error::Result, libfuncs::LibfuncHelper, metadata::{ realloc_bindings::ReallocBindingsMeta, snapshot_clones::SnapshotClonesMeta, MetadataStorage, }, + utils::BlockExt, }; use cairo_lang_sierra::{ extensions::{ @@ -158,7 +158,7 @@ fn snapshot_take<'ctx, 'this>( mod test { use crate::{ utils::test::{jit_enum, jit_struct, load_cairo, run_program}, - values::JitValue, + values::Value, }; use pretty_assertions_sorted::assert_eq; @@ -185,10 +185,10 @@ mod test { result, jit_enum!( 0, - jit_struct!(JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), - JitValue::Felt252(3.into()), + jit_struct!(Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), + Value::Felt252(3.into()), ])) ), ); diff --git a/src/utils.rs b/src/utils.rs index beeb453298..828a0c524a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,28 +1,22 @@ //! # Various utilities -use crate::{ - metadata::MetadataStorage, - types::{felt252::PRIME, TypeBuilder}, - OptLevel, +pub(crate) use self::{ + block_ext::BlockExt, program_registry_ext::ProgramRegistryExt, range_ext::RangeExt, }; +use crate::{metadata::MetadataStorage, OptLevel}; use cairo_lang_compiler::CompilerConfig; use cairo_lang_sierra::{ - extensions::{ - core::{CoreLibfunc, CoreType}, - utils::Range, - }, - ids::{ConcreteTypeId, FunctionId}, + ids::FunctionId, program::{GenFunction, Program, StatementIdx}, - program_registry::ProgramRegistry, }; use melior::{ - ir::{Module, Type}, + ir::Module, pass::{self, PassManager}, Context, Error, ExecutionEngine, }; use num_bigint::{BigInt, BigUint, Sign}; -use num_traits::One; use starknet_types_core::felt::Felt; +use std::sync::LazyLock; use std::{ alloc::Layout, borrow::Cow, @@ -34,11 +28,27 @@ use std::{ }; use thiserror::Error; +mod block_ext; +mod program_registry_ext; +mod range_ext; + #[cfg(target_os = "macos")] pub const SHARED_LIBRARY_EXT: &str = "dylib"; #[cfg(target_os = "linux")] pub const SHARED_LIBRARY_EXT: &str = "so"; +/// The `felt252` prime modulo. +pub static PRIME: LazyLock = LazyLock::new(|| { + "3618502788666131213697322783095070105623107215331596699973092056135872020481" + .parse() + .unwrap() +}); +pub static HALF_PRIME: LazyLock = LazyLock::new(|| { + "1809251394333065606848661391547535052811553607665798349986546028067936010240" + .parse() + .unwrap() +}); + /// Generate a function name. /// /// If the program includes function identifiers, return those. Otherwise return `f` followed by the @@ -95,17 +105,10 @@ pub fn get_integer_layout(width: u32) -> Layout { } else if width <= 64 { Layout::new::() } else if width <= 128 { - #[cfg(not(target_arch = "x86_64"))] - { - Layout::new::() - } - #[cfg(target_arch = "x86_64")] - { - Layout::new::().align_to(16).unwrap() - } + Layout::new::() } else { - let width = (width as usize).next_multiple_of(8); - Layout::from_size_align(width >> 3, 16).expect("align should be power of two") + // According to the docs this should never return an error. + Layout::from_size_align((width as usize).next_multiple_of(8) >> 3, 16).unwrap() } } @@ -453,105 +456,11 @@ pub fn layout_repeat(layout: &Layout, n: usize) -> Result<(Layout, usize), Layou Ok((layout, padded_size)) } -pub trait ProgramRegistryExt { - fn build_type<'ctx>( - &self, - context: &'ctx Context, - module: &Module<'ctx>, - registry: &ProgramRegistry, - metadata: &mut MetadataStorage, - id: &ConcreteTypeId, - ) -> Result, super::error::Error>; - - fn build_type_with_layout<'ctx>( - &self, - context: &'ctx Context, - module: &Module<'ctx>, - registry: &ProgramRegistry, - metadata: &mut MetadataStorage, - id: &ConcreteTypeId, - ) -> Result<(Type<'ctx>, Layout), super::error::Error>; -} - -impl ProgramRegistryExt for ProgramRegistry { - fn build_type<'ctx>( - &self, - context: &'ctx Context, - module: &Module<'ctx>, - registry: &ProgramRegistry, - metadata: &mut MetadataStorage, - id: &ConcreteTypeId, - ) -> Result, super::error::Error> { - registry - .get_type(id)? - .build(context, module, registry, metadata, id) - } - - fn build_type_with_layout<'ctx>( - &self, - context: &'ctx Context, - module: &Module<'ctx>, - registry: &ProgramRegistry, - metadata: &mut MetadataStorage, - id: &ConcreteTypeId, - ) -> Result<(Type<'ctx>, Layout), super::error::Error> { - let concrete_type = registry.get_type(id)?; - - Ok(( - concrete_type.build(context, module, registry, metadata, id)?, - concrete_type.layout(registry)?, - )) - } -} - -pub trait RangeExt { - /// Width in bits when the offset is zero (aka. the natural representation). - fn zero_based_bit_width(&self) -> u32; - /// Width in bits when the offset is not necessarily zero (aka. the compact representation). - fn offset_bit_width(&self) -> u32; -} - -impl RangeExt for Range { - fn zero_based_bit_width(&self) -> u32 { - // Formula for unsigned integers: - // x.bits() - // - // Formula for signed values: - // - Positive: (x.magnitude() + BigUint::one()).bits() - // - Negative: (x.magnitude() - BigUint::one()).bits() + 1 - // - Zero: 0 - - let width = if self.lower.sign() == Sign::Minus { - let lower_width = (self.lower.magnitude() - BigUint::one()).bits() + 1; - let upper_width = { - let upper = &self.upper - &BigInt::one(); - match upper.sign() { - Sign::Minus => (upper.magnitude() - BigUint::one()).bits() + 1, - Sign::NoSign => 0, - Sign::Plus => (upper.magnitude() + BigUint::one()).bits(), - } - }; - - lower_width.max(upper_width) as u32 - } else { - (&self.upper - &BigInt::one()).bits() as u32 - }; - - // FIXME: Workaround for segfault in canonicalization (including LLVM 19). - width.max(1) - } - - fn offset_bit_width(&self) -> u32 { - // FIXME: Workaround for segfault in canonicalization (including LLVM 19). - ((self.size() - BigInt::one()).bits() as u32).max(1) - } -} - #[cfg(test)] pub mod test { use crate::{ context::NativeContext, execution_result::ExecutionResult, executor::JitNativeExecutor, - starknet_stub::StubSyscallHandler, utils::*, values::JitValue, + starknet_stub::StubSyscallHandler, utils::*, values::Value, }; use cairo_lang_compiler::{ compile_prepared_db, db::RootDatabase, diagnostics::DiagnosticsReporter, @@ -584,7 +493,7 @@ pub mod test { // Helper macros for faster testing. macro_rules! jit_struct { ($($y:expr),* $(,)? ) => { - crate::values::JitValue::Struct { + crate::values::Value::Struct { fields: vec![$($y), *], debug_name: None } @@ -592,7 +501,7 @@ pub mod test { } macro_rules! jit_enum { ( $tag:expr, $value:expr ) => { - crate::values::JitValue::Enum { + crate::values::Value::Enum { tag: $tag, value: Box::new($value), debug_name: None, @@ -601,7 +510,7 @@ pub mod test { } macro_rules! jit_dict { ( $($key:expr $(=>)+ $value:expr),* $(,)? ) => { - crate::values::JitValue::Felt252Dict { + crate::values::Value::Felt252Dict { value: { let mut map = std::collections::HashMap::new(); $(map.insert($key.into(), $value.into());)* @@ -670,7 +579,7 @@ pub mod test { pub fn run_program( program: &(String, Program), entry_point: &str, - args: &[JitValue], + args: &[Value], ) -> ExecutionResult { let entry_point = format!("{0}::{0}::{1}", program.0, entry_point); let program = &program.1; @@ -704,8 +613,8 @@ pub mod test { pub fn run_program_assert_output( program: &(String, Program), entry_point: &str, - args: &[JitValue], - output: JitValue, + args: &[Value], + output: Value, ) { let result = run_program(program, entry_point, args); assert_eq!(result.return_value, output); diff --git a/src/block_ext.rs b/src/utils/block_ext.rs similarity index 100% rename from src/block_ext.rs rename to src/utils/block_ext.rs diff --git a/src/utils/program_registry_ext.rs b/src/utils/program_registry_ext.rs new file mode 100644 index 0000000000..a4a0e89151 --- /dev/null +++ b/src/utils/program_registry_ext.rs @@ -0,0 +1,62 @@ +use crate::{error::Result, metadata::MetadataStorage, types::TypeBuilder}; +use cairo_lang_sierra::{ + extensions::core::{CoreLibfunc, CoreType}, + ids::ConcreteTypeId, + program_registry::ProgramRegistry, +}; +use melior::{ + ir::{Module, Type}, + Context, +}; +use std::alloc::Layout; + +pub trait ProgramRegistryExt { + fn build_type<'ctx>( + &self, + context: &'ctx Context, + module: &Module<'ctx>, + registry: &ProgramRegistry, + metadata: &mut MetadataStorage, + id: &ConcreteTypeId, + ) -> Result>; + + fn build_type_with_layout<'ctx>( + &self, + context: &'ctx Context, + module: &Module<'ctx>, + registry: &ProgramRegistry, + metadata: &mut MetadataStorage, + id: &ConcreteTypeId, + ) -> Result<(Type<'ctx>, Layout)>; +} + +impl ProgramRegistryExt for ProgramRegistry { + fn build_type<'ctx>( + &self, + context: &'ctx Context, + module: &Module<'ctx>, + registry: &ProgramRegistry, + metadata: &mut MetadataStorage, + id: &ConcreteTypeId, + ) -> Result> { + registry + .get_type(id)? + .build(context, module, registry, metadata, id) + } + + fn build_type_with_layout<'ctx>( + &self, + context: &'ctx Context, + module: &Module<'ctx>, + registry: &ProgramRegistry, + metadata: &mut MetadataStorage, + id: &ConcreteTypeId, + ) -> Result<(Type<'ctx>, Layout)> { + let concrete_type = registry.get_type(id)?; + + Ok(( + concrete_type.build(context, module, registry, metadata, id)?, + concrete_type.layout(registry)?, + )) + } +} diff --git a/src/utils/range_ext.rs b/src/utils/range_ext.rs new file mode 100644 index 0000000000..89856eddb2 --- /dev/null +++ b/src/utils/range_ext.rs @@ -0,0 +1,46 @@ +use cairo_lang_sierra::extensions::utils::Range; +use num_bigint::{BigInt, BigUint, Sign}; +use num_traits::One; + +pub trait RangeExt { + /// Width in bits when the offset is zero (aka. the natural representation). + fn zero_based_bit_width(&self) -> u32; + /// Width in bits when the offset is not necessarily zero (aka. the compact representation). + fn offset_bit_width(&self) -> u32; +} + +impl RangeExt for Range { + fn zero_based_bit_width(&self) -> u32 { + // Formula for unsigned integers: + // x.bits() + // + // Formula for signed values: + // - Positive: (x.magnitude() + BigUint::one()).bits() + // - Negative: (x.magnitude() - BigUint::one()).bits() + 1 + // - Zero: 0 + + let width = if self.lower.sign() == Sign::Minus { + let lower_width = (self.lower.magnitude() - BigUint::one()).bits() + 1; + let upper_width = { + let upper = &self.upper - &BigInt::one(); + match upper.sign() { + Sign::Minus => (upper.magnitude() - BigUint::one()).bits() + 1, + Sign::NoSign => 0, + Sign::Plus => (upper.magnitude() + BigUint::one()).bits(), + } + }; + + lower_width.max(upper_width) as u32 + } else { + (&self.upper - &BigInt::one()).bits() as u32 + }; + + // FIXME: Workaround for segfault in canonicalization (including LLVM 19). + width.max(1) + } + + fn offset_bit_width(&self) -> u32 { + // FIXME: Workaround for segfault in canonicalization (including LLVM 19). + ((self.size() - BigInt::one()).bits() as u32).max(1) + } +} diff --git a/src/values.rs b/src/values.rs index fec95605dd..34822e6294 100644 --- a/src/values.rs +++ b/src/values.rs @@ -4,8 +4,8 @@ use crate::{ error::{CompilerError, Error}, - types::{felt252::PRIME, TypeBuilder}, - utils::{felt252_bigint, get_integer_layout, layout_repeat, RangeExt}, + types::TypeBuilder, + utils::{felt252_bigint, get_integer_layout, layout_repeat, RangeExt, PRIME}, }; use bumpalo::Bump; use cairo_lang_sierra::{ @@ -33,7 +33,7 @@ use std::{alloc::Layout, collections::HashMap, ptr::NonNull, slice}; /// A Boxed value or a non-null Nullable value is returned with it's inner value. #[derive(Clone, Educe, serde::Serialize, serde::Deserialize)] #[educe(Debug, Eq, PartialEq)] -pub enum JitValue { +pub enum Value { Felt252(#[educe(Debug(method(std::fmt::Display::fmt)))] Felt), Bytes31([u8; 31]), /// all elements need to be same type @@ -85,91 +85,91 @@ pub enum JitValue { // Conversions -impl From for JitValue { +impl From for Value { fn from(value: Felt) -> Self { Self::Felt252(value) } } -impl From for JitValue { +impl From for Value { fn from(value: u8) -> Self { Self::Uint8(value) } } -impl From for JitValue { +impl From for Value { fn from(value: u16) -> Self { Self::Uint16(value) } } -impl From for JitValue { +impl From for Value { fn from(value: u32) -> Self { Self::Uint32(value) } } -impl From for JitValue { +impl From for Value { fn from(value: u64) -> Self { Self::Uint64(value) } } -impl From for JitValue { +impl From for Value { fn from(value: u128) -> Self { Self::Uint128(value) } } -impl From for JitValue { +impl From for Value { fn from(value: i8) -> Self { Self::Sint8(value) } } -impl From for JitValue { +impl From for Value { fn from(value: i16) -> Self { Self::Sint16(value) } } -impl From for JitValue { +impl From for Value { fn from(value: i32) -> Self { Self::Sint32(value) } } -impl From for JitValue { +impl From for Value { fn from(value: i64) -> Self { Self::Sint64(value) } } -impl From for JitValue { +impl From for Value { fn from(value: i128) -> Self { Self::Sint128(value) } } -impl + Clone> From<&[T]> for JitValue { +impl + Clone> From<&[T]> for Value { fn from(value: &[T]) -> Self { Self::Array(value.iter().map(|x| x.clone().into()).collect()) } } -impl> From> for JitValue { +impl> From> for Value { fn from(value: Vec) -> Self { Self::Array(value.into_iter().map(Into::into).collect()) } } -impl, const N: usize> From<[T; N]> for JitValue { +impl, const N: usize> From<[T; N]> for Value { fn from(value: [T; N]) -> Self { Self::Array(value.into_iter().map(Into::into).collect()) } } -impl JitValue { +impl Value { pub(crate) fn resolve_type<'a>( ty: &'a CoreTypeConcrete, registry: &'a ProgramRegistry, @@ -654,9 +654,9 @@ impl JitValue { NonNull::new(ptr.as_ptr().byte_add(tag_layout.extend(payload_layout)?.1)) .unwrap(); let payload = - JitValue::from_jit(payload_ptr, &info.variants[tag_value], registry)?; + Value::from_jit(payload_ptr, &info.variants[tag_value], registry)?; - JitValue::Enum { + Value::Enum { tag: tag_value, value: Box::new(payload), debug_name: type_id.debug_name.as_ref().map(|x| x.to_string()), @@ -683,7 +683,7 @@ impl JitValue { )?); } - JitValue::Struct { + Value::Struct { fields: members, debug_name: type_id.debug_name.as_ref().map(|x| x.to_string()), } @@ -704,7 +704,7 @@ impl JitValue { libc::free(val_ptr.as_ptr()); } - JitValue::Felt252Dict { + Value::Felt252Dict { value: output_map, debug_name: type_id.debug_name.as_ref().map(|x| x.to_string()), } @@ -731,7 +731,7 @@ impl JitValue { // felt values let data = ptr.cast::<[u8; 32]>().as_ref(); let data = Felt::from_bytes_le(data); - JitValue::Felt252(data) + Value::Felt252(data) } StarkNetTypeConcrete::System(_) => { unimplemented!("should be handled before") @@ -743,8 +743,8 @@ impl JitValue { let y = (data[1][0], data[1][1]); match info { - Secp256PointTypeConcrete::K1(_) => JitValue::Secp256K1Point { x, y }, - Secp256PointTypeConcrete::R1(_) => JitValue::Secp256R1Point { x, y }, + Secp256PointTypeConcrete::K1(_) => Value::Secp256K1Point { x, y }, + Secp256PointTypeConcrete::R1(_) => Value::Secp256R1Point { x, y }, } } StarkNetTypeConcrete::Sha256StateHandle(_) => todo!(), @@ -795,119 +795,107 @@ mod test { #[test] fn test_jit_value_conversion_felt() { let felt_value: Felt = 42.into(); - let jit_value: JitValue = felt_value.into(); - assert_eq!(jit_value, JitValue::Felt252(Felt::from(42))); + let jit_value: Value = felt_value.into(); + assert_eq!(jit_value, Value::Felt252(Felt::from(42))); } #[test] fn test_jit_value_conversion_u8() { let u8_value: u8 = 10; - let jit_value: JitValue = u8_value.into(); - assert_eq!(jit_value, JitValue::Uint8(10)); + let jit_value: Value = u8_value.into(); + assert_eq!(jit_value, Value::Uint8(10)); } #[test] fn test_jit_value_conversion_u16() { let u8_value: u16 = 10; - let jit_value: JitValue = u8_value.into(); - assert_eq!(jit_value, JitValue::Uint16(10)); + let jit_value: Value = u8_value.into(); + assert_eq!(jit_value, Value::Uint16(10)); } #[test] fn test_jit_value_conversion_u32() { let u32_value: u32 = 10; - let jit_value: JitValue = u32_value.into(); - assert_eq!(jit_value, JitValue::Uint32(10)); + let jit_value: Value = u32_value.into(); + assert_eq!(jit_value, Value::Uint32(10)); } #[test] fn test_jit_value_conversion_u64() { let u64_value: u64 = 10; - let jit_value: JitValue = u64_value.into(); - assert_eq!(jit_value, JitValue::Uint64(10)); + let jit_value: Value = u64_value.into(); + assert_eq!(jit_value, Value::Uint64(10)); } #[test] fn test_jit_value_conversion_u128() { let u128_value: u128 = 10; - let jit_value: JitValue = u128_value.into(); - assert_eq!(jit_value, JitValue::Uint128(10)); + let jit_value: Value = u128_value.into(); + assert_eq!(jit_value, Value::Uint128(10)); } #[test] fn test_jit_value_conversion_i8() { let i8_value: i8 = -10; - let jit_value: JitValue = i8_value.into(); - assert_eq!(jit_value, JitValue::Sint8(-10)); + let jit_value: Value = i8_value.into(); + assert_eq!(jit_value, Value::Sint8(-10)); } #[test] fn test_jit_value_conversion_i16() { let i16_value: i16 = -10; - let jit_value: JitValue = i16_value.into(); - assert_eq!(jit_value, JitValue::Sint16(-10)); + let jit_value: Value = i16_value.into(); + assert_eq!(jit_value, Value::Sint16(-10)); } #[test] fn test_jit_value_conversion_i32() { let i32_value: i32 = -10; - let jit_value: JitValue = i32_value.into(); - assert_eq!(jit_value, JitValue::Sint32(-10)); + let jit_value: Value = i32_value.into(); + assert_eq!(jit_value, Value::Sint32(-10)); } #[test] fn test_jit_value_conversion_i64() { let i64_value: i64 = -10; - let jit_value: JitValue = i64_value.into(); - assert_eq!(jit_value, JitValue::Sint64(-10)); + let jit_value: Value = i64_value.into(); + assert_eq!(jit_value, Value::Sint64(-10)); } #[test] fn test_jit_value_conversion_i128() { let i128_value: i128 = -10; - let jit_value: JitValue = i128_value.into(); - assert_eq!(jit_value, JitValue::Sint128(-10)); + let jit_value: Value = i128_value.into(); + assert_eq!(jit_value, Value::Sint128(-10)); } #[test] fn test_jit_value_conversion_array_from_slice() { let array_slice: &[u8] = &[1, 2, 3]; - let jit_value: JitValue = array_slice.into(); + let jit_value: Value = array_slice.into(); assert_eq!( jit_value, - JitValue::Array(vec![ - JitValue::Uint8(1), - JitValue::Uint8(2), - JitValue::Uint8(3) - ]) + Value::Array(vec![Value::Uint8(1), Value::Uint8(2), Value::Uint8(3)]) ); } #[test] fn test_jit_value_conversion_array_from_vec() { let array_vec: Vec = vec![1, 2, 3]; - let jit_value: JitValue = array_vec.into(); + let jit_value: Value = array_vec.into(); assert_eq!( jit_value, - JitValue::Array(vec![ - JitValue::Uint8(1), - JitValue::Uint8(2), - JitValue::Uint8(3) - ]) + Value::Array(vec![Value::Uint8(1), Value::Uint8(2), Value::Uint8(3)]) ); } #[test] fn test_jit_value_conversion_array_from_fixed_size_array() { let array_fixed: [u8; 3] = [1, 2, 3]; - let jit_value: JitValue = array_fixed.into(); + let jit_value: Value = array_fixed.into(); assert_eq!( jit_value, - JitValue::Array(vec![ - JitValue::Uint8(1), - JitValue::Uint8(2), - JitValue::Uint8(3) - ]) + Value::Array(vec![Value::Uint8(1), Value::Uint8(2), Value::Uint8(3)]) ); } @@ -944,7 +932,7 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); assert_eq!( - JitValue::resolve_type(&ty, ®istry) + Value::resolve_type(&ty, ®istry) .unwrap() .integer_range(®istry) .unwrap(), @@ -965,7 +953,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Felt252(Felt::from(42)) + *Value::Felt252(Felt::from(42)) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::<[u32; 8]>() @@ -976,7 +964,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Felt252(Felt::MAX) + *Value::Felt252(Felt::MAX) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::<[u32; 8]>() @@ -988,7 +976,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Felt252(Felt::MAX + Felt::ONE) + *Value::Felt252(Felt::MAX + Felt::ONE) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::<[u32; 8]>() @@ -1006,7 +994,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Uint8(9) + *Value::Uint8(9) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1024,7 +1012,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Uint16(17) + *Value::Uint16(17) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1042,7 +1030,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Uint32(33) + *Value::Uint32(33) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1060,7 +1048,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Uint64(65) + *Value::Uint64(65) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1078,7 +1066,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Uint128(129) + *Value::Uint128(129) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1096,7 +1084,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Sint8(-9) + *Value::Sint8(-9) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1114,7 +1102,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Sint16(-17) + *Value::Sint16(-17) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1132,7 +1120,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Sint32(-33) + *Value::Sint32(-33) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1150,7 +1138,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Sint64(-65) + *Value::Sint64(-65) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1168,7 +1156,7 @@ mod test { assert_eq!( unsafe { - *JitValue::Sint128(-129) + *Value::Sint128(-129) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::() @@ -1188,7 +1176,7 @@ mod test { assert_eq!( unsafe { - *JitValue::EcPoint(Felt::from(1234), Felt::from(4321)) + *Value::EcPoint(Felt::from(1234), Felt::from(4321)) .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) .unwrap() .cast::<[[u32; 8]; 2]>() @@ -1208,7 +1196,7 @@ mod test { assert_eq!( unsafe { - *JitValue::EcState( + *Value::EcState( Felt::from(1234), Felt::from(4321), Felt::from(3333), @@ -1242,9 +1230,9 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); // Call to_jit to get the value of the enum - let result = JitValue::Enum { + let result = Value::Enum { tag: 0, - value: Box::new(JitValue::Uint8(10)), + value: Box::new(Value::Uint8(10)), debug_name: None, } .to_jit(&Bump::new(), ®istry, &program.type_declarations[1].id); @@ -1269,7 +1257,7 @@ mod test { // Valid case assert_eq!( unsafe { - *JitValue::BoundedInt { + *Value::BoundedInt { value: Felt::from(16), range: Range { lower: BigInt::from(10), @@ -1299,7 +1287,7 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); // Error case: lower bound greater than upper bound - let result = JitValue::BoundedInt { + let result = Value::BoundedInt { value: Felt::from(16), range: Range { lower: BigInt::from(510), @@ -1328,7 +1316,7 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); // Error case: value less than lower bound - let result = JitValue::BoundedInt { + let result = Value::BoundedInt { value: Felt::from(9), range: Range { lower: BigInt::from(10), @@ -1357,7 +1345,7 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); // Error case: value greater than or equal to upper bound - let result = JitValue::BoundedInt { + let result = Value::BoundedInt { value: Felt::from(512), range: Range { lower: BigInt::from(10), @@ -1386,7 +1374,7 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); // Error case: value equals lower and upper bound (upper bound is exclusive) - let result = JitValue::BoundedInt { + let result = Value::BoundedInt { value: Felt::from(10), range: Range { lower: BigInt::from(10), @@ -1416,9 +1404,9 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); // Call to_jit to get the value of the enum with tag value out of range - let _ = JitValue::Enum { + let _ = Value::Enum { tag: 2, - value: Box::new(JitValue::Uint8(10)), + value: Box::new(Value::Uint8(10)), debug_name: None, } .to_jit(&Bump::new(), ®istry, &program.type_declarations[1].id); @@ -1436,9 +1424,9 @@ mod test { let registry = ProgramRegistry::::new(&program).unwrap(); - let _ = JitValue::Enum { + let _ = Value::Enum { tag: 0, - value: Box::new(JitValue::Uint8(10)), + value: Box::new(Value::Uint8(10)), debug_name: None, } .to_jit(&Bump::new(), ®istry, &program.type_declarations[1].id); @@ -1459,10 +1447,10 @@ mod test { // Invoking to_jit method on a JitValue::Enum to convert it to a JIT representation. // Generating an error by providing an enum value instead of the expected type. - let result = JitValue::Enum { + let result = Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::from(2u32)], + value: Box::new(Value::Struct { + fields: vec![Value::from(2u32)], debug_name: None, }), debug_name: None, @@ -1501,8 +1489,8 @@ mod test { // Invoking to_jit method on a JitValue::Struct to convert it to a JIT representation. // Generating an error by providing a struct value instead of the expected type. - let result = JitValue::Struct { - fields: vec![JitValue::from(2u32)], + let result = Value::Struct { + fields: vec![Value::from(2u32)], debug_name: None, } .to_jit(&Bump::new(), ®istry, &program.type_declarations[0].id) diff --git a/tests/common.rs b/tests/common.rs index 182b297766..f0cac40da1 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -12,7 +12,9 @@ use cairo_lang_runner::{ }; use cairo_lang_sierra::{ extensions::{ + circuit::CircuitTypeConcrete, core::{CoreLibfunc, CoreType, CoreTypeConcrete}, + starknet::StarkNetTypeConcrete, ConcreteType, }, ids::{ConcreteTypeId, FunctionId}, @@ -31,13 +33,8 @@ use cairo_native::{ execution_result::{ContractExecutionResult, ExecutionResult}, executor::JitNativeExecutor, starknet::{DummySyscallHandler, StarknetSyscallHandler}, - types::{ - felt252::{HALF_PRIME, PRIME}, - TypeBuilder, - }, - utils::find_entry_point_by_idx, - values::JitValue, - OptLevel, + utils::{find_entry_point_by_idx, HALF_PRIME, PRIME}, + OptLevel, Value, }; use cairo_vm::{ hint_processor::cairo_1_hint_processor::hint_processor::Cairo1HintProcessor, @@ -213,7 +210,7 @@ pub fn load_cairo_contract_path(path: &str) -> ContractClass { pub fn run_native_program( program: &(String, Program, SierraCasmRunner), entry_point: &str, - args: &[JitValue], + args: &[Value], gas: Option, syscall_handler: Option, ) -> ExecutionResult { @@ -508,7 +505,7 @@ pub fn compare_outputs( memory: &[Option], mut values: &[Felt], ty: &ConcreteTypeId, - ) -> JitValue { + ) -> Value { match registry.get_type(ty).unwrap() { CoreTypeConcrete::Array(info) => { assert_eq!(values.len(), 2); @@ -519,7 +516,7 @@ pub fn compare_outputs( let elem_size = map_vm_sizes(size_cache, registry, &info.ty); assert_eq!(total_len % elem_size, 0); - JitValue::Array( + Value::Array( memory[since_ptr..until_ptr] .chunks(elem_size) .map(|data| data.iter().cloned().map(Option::unwrap).collect::>()) @@ -528,48 +525,46 @@ pub fn compare_outputs( ) } CoreTypeConcrete::Felt252(_) => { - JitValue::Felt252(Felt::from_bytes_le(&values[0].to_bytes_le())) + Value::Felt252(Felt::from_bytes_le(&values[0].to_bytes_le())) } - CoreTypeConcrete::Uint128(_) => JitValue::Uint128(values[0].to_u128().unwrap()), - CoreTypeConcrete::Uint64(_) => JitValue::Uint64(values[0].to_u64().unwrap()), - CoreTypeConcrete::Uint32(_) => JitValue::Uint32(values[0].to_u32().unwrap()), - CoreTypeConcrete::Uint16(_) => JitValue::Uint16(values[0].to_u16().unwrap()), - CoreTypeConcrete::Uint8(_) => JitValue::Uint8(values[0].to_u8().unwrap()), + CoreTypeConcrete::Uint128(_) => Value::Uint128(values[0].to_u128().unwrap()), + CoreTypeConcrete::Uint64(_) => Value::Uint64(values[0].to_u64().unwrap()), + CoreTypeConcrete::Uint32(_) => Value::Uint32(values[0].to_u32().unwrap()), + CoreTypeConcrete::Uint16(_) => Value::Uint16(values[0].to_u16().unwrap()), + CoreTypeConcrete::Uint8(_) => Value::Uint8(values[0].to_u8().unwrap()), CoreTypeConcrete::Sint128(_) => { - JitValue::Sint128(if values[0].to_bigint() >= *HALF_PRIME { + Value::Sint128(if values[0].to_biguint() >= *HALF_PRIME { -(&*PRIME - &values[0].to_biguint()).to_i128().unwrap() } else { values[0].to_biguint().to_i128().unwrap() }) } CoreTypeConcrete::Sint64(_) => { - JitValue::Sint64(if values[0].to_bigint() >= *HALF_PRIME { + Value::Sint64(if values[0].to_biguint() >= *HALF_PRIME { -(&*PRIME - &values[0].to_biguint()).to_i64().unwrap() } else { values[0].to_biguint().to_i64().unwrap() }) } CoreTypeConcrete::Sint32(_) => { - JitValue::Sint32(if values[0].to_bigint() >= *HALF_PRIME { + Value::Sint32(if values[0].to_biguint() >= *HALF_PRIME { -(&*PRIME - &values[0].to_biguint()).to_i32().unwrap() } else { values[0].to_biguint().to_i32().unwrap() }) } CoreTypeConcrete::Sint16(_) => { - JitValue::Sint16(if values[0].to_bigint() >= *HALF_PRIME { + Value::Sint16(if values[0].to_biguint() >= *HALF_PRIME { -(&*PRIME - &values[0].to_biguint()).to_i16().unwrap() } else { values[0].to_biguint().to_i16().unwrap() }) } - CoreTypeConcrete::Sint8(_) => { - JitValue::Sint8(if values[0].to_bigint() >= *HALF_PRIME { - -(&*PRIME - &values[0].to_biguint()).to_i8().unwrap() - } else { - values[0].to_biguint().to_i8().unwrap() - }) - } + CoreTypeConcrete::Sint8(_) => Value::Sint8(if values[0].to_biguint() >= *HALF_PRIME { + -(&*PRIME - &values[0].to_biguint()).to_i8().unwrap() + } else { + values[0].to_biguint().to_i8().unwrap() + }), CoreTypeConcrete::Enum(info) => { let enum_size = map_vm_sizes(size_cache, registry, ty); assert_eq!(values.len(), enum_size); @@ -584,7 +579,7 @@ pub fn compare_outputs( assert!(tag <= info.variants.len()); data = &values[enum_size - size_cache[&info.variants[tag]] - 1..]; - JitValue::Enum { + Value::Enum { tag, value: Box::new(map_vm_values( size_cache, @@ -596,7 +591,7 @@ pub fn compare_outputs( debug_name: ty.debug_name.as_deref().map(String::from), } } - CoreTypeConcrete::Struct(info) => JitValue::Struct { + CoreTypeConcrete::Struct(info) => Value::Struct { fields: info .members .iter() @@ -610,7 +605,7 @@ pub fn compare_outputs( .collect(), debug_name: ty.debug_name.as_deref().map(String::from), }, - CoreTypeConcrete::SquashedFelt252Dict(info) => JitValue::Felt252Dict { + CoreTypeConcrete::SquashedFelt252Dict(info) => Value::Felt252Dict { value: (values[0].to_usize().unwrap()..values[1].to_usize().unwrap()) .step_by(3) .map(|index| { @@ -639,7 +634,7 @@ pub fn compare_outputs( let ty_size = map_vm_sizes(size_cache, registry, &info.ty); match values[0].to_usize().unwrap() { - 0 => JitValue::Null, + 0 => Value::Null, ptr if ty_size == 0 => { assert_eq!(ptr, 1); map_vm_values(size_cache, registry, memory, &[], &info.ty) @@ -685,7 +680,7 @@ pub fn compare_outputs( CoreTypeConcrete::EcPoint(_) => { assert_eq!(values.len(), 2); - JitValue::EcPoint( + Value::EcPoint( Felt::from_bytes_le(&values[0].to_bytes_le()), Felt::from_bytes_le(&values[1].to_bytes_le()), ) @@ -693,7 +688,7 @@ pub fn compare_outputs( CoreTypeConcrete::EcState(_) => { assert_eq!(values.len(), 4); - JitValue::EcState( + Value::EcState( Felt::from_bytes_le(&values[0].to_bytes_le()), Felt::from_bytes_le(&values[1].to_bytes_le()), Felt::from_bytes_le(&values[2].to_bytes_le()), @@ -703,7 +698,7 @@ pub fn compare_outputs( CoreTypeConcrete::Bytes31(_) => { let mut bytes = values[0].to_bytes_le().to_vec(); bytes.pop(); - JitValue::Bytes31(bytes.try_into().unwrap()) + Value::Bytes31(bytes.try_into().unwrap()) } CoreTypeConcrete::Coupon(_) => todo!(), CoreTypeConcrete::Bitwise(_) => unreachable!(), @@ -724,7 +719,24 @@ pub fn compare_outputs( let mut size_cache = HashMap::new(); let ty = function.signature.ret_types.last(); - let is_builtin = ty.map_or(false, |ty| registry.get_type(ty).unwrap().is_builtin()); + let is_builtin = ty.map_or(false, |ty| { + matches!( + registry.get_type(ty).unwrap(), + CoreTypeConcrete::Bitwise(_) + | CoreTypeConcrete::EcOp(_) + | CoreTypeConcrete::GasBuiltin(_) + | CoreTypeConcrete::BuiltinCosts(_) + | CoreTypeConcrete::RangeCheck(_) + | CoreTypeConcrete::RangeCheck96(_) + | CoreTypeConcrete::Pedersen(_) + | CoreTypeConcrete::Poseidon(_) + | CoreTypeConcrete::Coupon(_) + | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::System(_)) + | CoreTypeConcrete::SegmentArena(_) + | CoreTypeConcrete::Circuit(CircuitTypeConcrete::AddMod(_)) + | CoreTypeConcrete::Circuit(CircuitTypeConcrete::MulMod(_)) + ) + }); let returns_panic = ty.map_or(false, |ty| { ty.debug_name .as_ref() @@ -743,7 +755,7 @@ pub fn compare_outputs( CoreTypeConcrete::Enum(info) => &info.variants[0], _ => unreachable!(), }; - JitValue::Enum { + Value::Enum { tag: 0, value: Box::new(map_vm_values( &mut size_cache, @@ -763,25 +775,25 @@ pub fn compare_outputs( ty.unwrap(), ) } else { - JitValue::Struct { + Value::Struct { fields: Vec::new(), debug_name: None, } } } - RunResultValue::Panic(values) => JitValue::Enum { + RunResultValue::Panic(values) => Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { + Value::Struct { fields: Vec::new(), debug_name: None, }, - JitValue::Array( + Value::Array( values .iter() .map(|value| Felt::from_bytes_le(&value.to_bytes_le())) - .map(JitValue::Felt252) + .map(Value::Felt252) .collect(), ), ], @@ -789,7 +801,7 @@ pub fn compare_outputs( }), debug_name: None, }, - _ => JitValue::Struct { + _ => Value::Struct { fields: vec![], debug_name: None, }, diff --git a/tests/tests/arrays.rs b/tests/tests/arrays.rs index 89893afbf1..980dacbc67 100644 --- a/tests/tests/arrays.rs +++ b/tests/tests/arrays.rs @@ -3,7 +3,7 @@ use crate::common::{compare_outputs, DEFAULT_GAS}; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; use cairo_native::starknet::DummySyscallHandler; -use cairo_native::values::JitValue; +use cairo_native::Value; use lazy_static::lazy_static; use proptest::prelude::*; use starknet_types_core::felt::Felt; @@ -62,7 +62,7 @@ fn array_get_test() { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(10.into()), JitValue::Felt252(5.into())], + &[Value::Felt252(10.into()), Value::Felt252(5.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -87,7 +87,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(value), JitValue::Felt252(idx.into())], + &[Value::Felt252(value), Value::Felt252(idx.into())], Some(DEFAULT_GAS as u128), Option::::None, ); diff --git a/tests/tests/boolean.rs b/tests/tests/boolean.rs index 0deeff58f3..0390184856 100644 --- a/tests/tests/boolean.rs +++ b/tests/tests/boolean.rs @@ -1,7 +1,7 @@ use crate::common::{compare_outputs, load_cairo, run_native_program, run_vm_program, DEFAULT_GAS}; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; -use cairo_native::{starknet::DummySyscallHandler, values::JitValue}; +use cairo_native::{starknet::DummySyscallHandler, Value}; use lazy_static::lazy_static; use proptest::prelude::*; use starknet_types_core::felt::Felt; @@ -122,7 +122,7 @@ fn felt252_to_bool_bug() { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -146,7 +146,7 @@ fn felt252_to_bool_bug() { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -170,7 +170,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -193,7 +193,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -217,7 +217,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -241,7 +241,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -265,7 +265,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); diff --git a/tests/tests/dict.rs b/tests/tests/dict.rs index 6735890bed..5017b27a9d 100644 --- a/tests/tests/dict.rs +++ b/tests/tests/dict.rs @@ -3,7 +3,7 @@ use crate::common::{ }; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; -use cairo_native::{starknet::DummySyscallHandler, values::JitValue}; +use cairo_native::{starknet::DummySyscallHandler, Value}; use lazy_static::lazy_static; use proptest::prelude::*; use starknet_types_core::felt::Felt; @@ -35,7 +35,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); diff --git a/tests/tests/ec.rs b/tests/tests/ec.rs index b0668ee324..c1160bd497 100644 --- a/tests/tests/ec.rs +++ b/tests/tests/ec.rs @@ -3,7 +3,7 @@ use crate::common::{ }; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; -use cairo_native::{starknet::DummySyscallHandler, values::JitValue}; +use cairo_native::{starknet::DummySyscallHandler, Value}; use lazy_static::lazy_static; use num_bigint::BigUint; use proptest::prelude::*; @@ -76,7 +76,7 @@ fn ec_point_from_x_big() { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(Felt::from_bytes_be(&x.to_bytes_be()))], + &[Value::Felt252(Felt::from_bytes_be(&x.to_bytes_be()))], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -104,7 +104,7 @@ fn ec_point_from_x_small() { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(Felt::from_bytes_be(&x.to_bytes_be()))], + &[Value::Felt252(Felt::from_bytes_be(&x.to_bytes_be()))], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -132,7 +132,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -158,7 +158,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a)], + &[Value::Felt252(a)], Some(DEFAULT_GAS as u128), Option::::None, ); diff --git a/tests/tests/felt252.rs b/tests/tests/felt252.rs index d9216517f7..7654560f49 100644 --- a/tests/tests/felt252.rs +++ b/tests/tests/felt252.rs @@ -4,7 +4,7 @@ use crate::common::{ }; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; -use cairo_native::{starknet::DummySyscallHandler, values::JitValue}; +use cairo_native::{starknet::DummySyscallHandler, Value}; use lazy_static::lazy_static; use proptest::prelude::*; use starknet_types_core::felt::Felt; @@ -70,7 +70,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -96,7 +96,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -122,7 +122,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -148,7 +148,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); diff --git a/tests/tests/programs.rs b/tests/tests/programs.rs index c655928abe..be558a2721 100644 --- a/tests/tests/programs.rs +++ b/tests/tests/programs.rs @@ -3,7 +3,8 @@ use crate::common::{compare_outputs, DEFAULT_GAS}; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; use cairo_native::starknet::DummySyscallHandler; -use cairo_native::values::JitValue; +use cairo_native::utils::felt252_str; +use cairo_native::Value; use lazy_static::lazy_static; use proptest::prelude::*; use starknet_types_core::felt::Felt; @@ -124,7 +125,7 @@ fn fib() { let result_native = run_native_program( &FIB, "run_test", - &[JitValue::Felt252(10.into())], + &[Value::Felt252(10.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -150,7 +151,7 @@ fn logistic_map() { let result_native = run_native_program( &LOGISTIC_MAP, "run_test", - &[JitValue::Felt252(1000.into())], + &[Value::Felt252(1000.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -190,18 +191,12 @@ fn pedersen() { &PEDERSEN, "run_test", &[ - JitValue::Felt252( - Felt::from_dec_str( - "2163739901324492107409690946633517860331020929182861814098856895601180685", - ) - .unwrap(), - ), - JitValue::Felt252( - Felt::from_dec_str( - "2392090257937917229310563411601744459500735555884672871108624696010915493156", - ) - .unwrap(), - ), + Value::Felt252(felt252_str( + "2163739901324492107409690946633517860331020929182861814098856895601180685", + )), + Value::Felt252(felt252_str( + "2392090257937917229310563411601744459500735555884672871108624696010915493156", + )), ], Some(DEFAULT_GAS as u128), Option::::None, @@ -228,7 +223,7 @@ fn factorial() { let result_native = run_native_program( &FACTORIAL, "run_test", - &[JitValue::Felt252(13.into())], + &[Value::Felt252(13.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -255,7 +250,7 @@ proptest! { let result_native = run_native_program( &FIB, "run_test", - &[JitValue::Felt252(n.into())], + &[Value::Felt252(n.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -280,7 +275,7 @@ proptest! { let result_native = run_native_program( &LOGISTIC_MAP, "run_test", - &[JitValue::Felt252(n.into())], + &[Value::Felt252(n.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -305,7 +300,7 @@ proptest! { let result_native = run_native_program( &FACTORIAL, "run_test", - &[JitValue::Felt252(n.into())], + &[Value::Felt252(n.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -331,7 +326,7 @@ proptest! { let result_native = run_native_program( &PEDERSEN, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b)], + &[Value::Felt252(a), Value::Felt252(b)], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -359,7 +354,7 @@ proptest! { let result_native = run_native_program( &POSEIDON, "run_test", - &[JitValue::Felt252(a), JitValue::Felt252(b), JitValue::Felt252(c)], + &[Value::Felt252(a), Value::Felt252(b), Value::Felt252(c)], Some(DEFAULT_GAS as u128), Option::::None, ); diff --git a/tests/tests/result.rs b/tests/tests/result.rs index 9bc0a981c6..3993aa59b7 100644 --- a/tests/tests/result.rs +++ b/tests/tests/result.rs @@ -1,6 +1,6 @@ use cairo_native::{ execution_result::{BuiltinStats, ContractExecutionResult, ExecutionResult}, - values::JitValue, + Value, }; use test_case::test_case; @@ -11,81 +11,81 @@ fn from_execution_result( } #[test_case( - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Uint8(0)), + value: Box::new(Value::Uint8(0)), debug_name: None, } => panics "wrong type, expected: Struct { Struct { Array } }, value: Uint8(0)")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { debug_name: None, - fields: vec![JitValue::Uint8(0)] + fields: vec![Value::Uint8(0)] }), debug_name: None, } => panics "wrong type, expected: Struct { Struct { Array } }, value: Struct { fields: [Uint8(0)], debug_name: None }")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { debug_name: None, - fields: vec![JitValue::Struct { + fields: vec![Value::Struct { debug_name: None, - fields: vec![JitValue::Uint8(0)] + fields: vec![Value::Uint8(0)] }] }), debug_name: None, } => panics "wrong type, expected: Struct { Struct { Array } }, value: Struct { fields: [Struct { fields: [Uint8(0)], debug_name: None }], debug_name: None }")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { debug_name: None, - fields: vec![JitValue::Struct { + fields: vec![Value::Struct { debug_name: None, - fields: vec![JitValue::Array(vec![JitValue::Uint8(0)])] + fields: vec![Value::Array(vec![Value::Uint8(0)])] }] }), debug_name: None, } => panics "should always be a felt")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Uint8(0)), + value: Box::new(Value::Uint8(0)), debug_name: None, } => panics "wrong type, expected: Struct { [X, Array] }, value: Uint8(0)")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { debug_name: None, - fields: vec![JitValue::Uint8(0)] + fields: vec![Value::Uint8(0)] }), debug_name: None, } => panics "wrong type, expect: struct.fields.len() >= 2, value: [Uint8(0)]")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { debug_name: None, - fields: vec![JitValue::Uint8(0), JitValue::Uint8(0)] + fields: vec![Value::Uint8(0), Value::Uint8(0)] }), debug_name: None, } => panics "wrong type, expected: Struct { [X, Array] }, value: Struct { fields: [Uint8(0), Uint8(0)], debug_name: None }")] #[test_case( - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { debug_name: None, fields: vec![ - JitValue::Uint8(0), - JitValue::Array(vec![JitValue::Uint8(0)]) + Value::Uint8(0), + Value::Array(vec![Value::Uint8(0)]) ] }), debug_name: None, } => panics "should always be a felt")] -fn test_cases(return_value: JitValue) { +fn test_cases(return_value: Value) { let _ = from_execution_result(ExecutionResult { return_value, remaining_gas: None, diff --git a/tests/tests/starknet/secp256.rs b/tests/tests/starknet/secp256.rs index 2be6062a01..423e43c284 100644 --- a/tests/tests/starknet/secp256.rs +++ b/tests/tests/starknet/secp256.rs @@ -3,7 +3,7 @@ use cairo_lang_runner::SierraCasmRunner; use cairo_lang_sierra::program::Program; use cairo_native::{ starknet::{Secp256k1Point, Secp256r1Point, StarknetSyscallHandler, SyscallResult, U256}, - values::JitValue, + Value, }; use lazy_static::lazy_static; use pretty_assertions_sorted::assert_eq; @@ -293,12 +293,12 @@ fn secp256k1_new() { &SECP256_PROGRAM, "secp256k1_new", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, ], @@ -307,11 +307,11 @@ fn secp256k1_new() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None }), @@ -325,12 +325,12 @@ fn secp256k1_new() { &SECP256_PROGRAM, "secp256k1_new", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -339,11 +339,11 @@ fn secp256k1_new() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (0, 0), y: (0, 0), }), @@ -357,12 +357,12 @@ fn secp256k1_new() { &SECP256_PROGRAM, "secp256k1_new", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, ], @@ -371,11 +371,11 @@ fn secp256k1_new() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }), @@ -453,11 +453,11 @@ fn secp256k1_add() { &SECP256_PROGRAM, "secp256k1_add", &[ - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (0, 0), y: (0, 0), }, - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (0, 0), y: (0, 0), }, @@ -467,9 +467,9 @@ fn secp256k1_add() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (0, 0), y: (0, 0), }), @@ -481,11 +481,11 @@ fn secp256k1_add() { &SECP256_PROGRAM, "secp256k1_add", &[ - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }, - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }, @@ -495,9 +495,9 @@ fn secp256k1_add() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }), @@ -509,11 +509,11 @@ fn secp256k1_add() { &SECP256_PROGRAM, "secp256k1_add", &[ - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }, - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }, @@ -523,9 +523,9 @@ fn secp256k1_add() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }), @@ -634,12 +634,12 @@ fn secp256k1_mul() { &SECP256_PROGRAM, "secp256k1_mul", &[ - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (0, 0), y: (0, 0), }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, ], @@ -648,9 +648,9 @@ fn secp256k1_mul() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (0, 0), y: (0, 0), }), @@ -662,12 +662,12 @@ fn secp256k1_mul() { &SECP256_PROGRAM, "secp256k1_mul", &[ - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -676,9 +676,9 @@ fn secp256k1_mul() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }), @@ -690,12 +690,12 @@ fn secp256k1_mul() { &SECP256_PROGRAM, "secp256k1_mul", &[ - JitValue::Secp256K1Point { + Value::Secp256K1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -704,9 +704,9 @@ fn secp256k1_mul() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }), @@ -801,13 +801,13 @@ fn secp256k1_get_point_from_x() { &SECP256_PROGRAM, "secp256k1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -819,11 +819,11 @@ fn secp256k1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -837,13 +837,13 @@ fn secp256k1_get_point_from_x() { &SECP256_PROGRAM, "secp256k1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -855,11 +855,11 @@ fn secp256k1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (0, 0), y: (0, 0), }), @@ -873,13 +873,13 @@ fn secp256k1_get_point_from_x() { &SECP256_PROGRAM, "secp256k1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -891,11 +891,11 @@ fn secp256k1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }), @@ -909,13 +909,13 @@ fn secp256k1_get_point_from_x() { &SECP256_PROGRAM, "secp256k1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -927,11 +927,11 @@ fn secp256k1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256K1Point { + value: Box::new(Value::Secp256K1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }), @@ -1016,7 +1016,7 @@ fn secp256k1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256k1_get_xy", - &[JitValue::Secp256K1Point { + &[Value::Secp256K1Point { x: (0, 0), y: (0, 0), }], @@ -1025,16 +1025,16 @@ fn secp256k1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, ], @@ -1047,7 +1047,7 @@ fn secp256k1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256k1_get_xy", - &[JitValue::Secp256K1Point { + &[Value::Secp256K1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }], @@ -1056,16 +1056,16 @@ fn secp256k1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, ], @@ -1078,7 +1078,7 @@ fn secp256k1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256k1_get_xy", - &[JitValue::Secp256K1Point { + &[Value::Secp256K1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }], @@ -1087,16 +1087,16 @@ fn secp256k1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -1109,7 +1109,7 @@ fn secp256k1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256k1_get_xy", - &[JitValue::Secp256K1Point { + &[Value::Secp256K1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }], @@ -1118,16 +1118,16 @@ fn secp256k1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, ], @@ -1209,12 +1209,12 @@ fn secp256r1_new() { &SECP256_PROGRAM, "secp256r1_new", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, ], @@ -1223,11 +1223,11 @@ fn secp256r1_new() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None }), @@ -1241,12 +1241,12 @@ fn secp256r1_new() { &SECP256_PROGRAM, "secp256r1_new", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -1255,11 +1255,11 @@ fn secp256r1_new() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, 0), y: (0, 0), }), @@ -1273,12 +1273,12 @@ fn secp256r1_new() { &SECP256_PROGRAM, "secp256r1_new", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, ], @@ -1287,11 +1287,11 @@ fn secp256r1_new() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }), @@ -1369,11 +1369,11 @@ fn secp256r1_add() { &SECP256_PROGRAM, "secp256r1_add", &[ - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (0, 0), y: (0, 0), }, - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (0, 0), y: (0, 0), }, @@ -1383,9 +1383,9 @@ fn secp256r1_add() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, 0), y: (0, 0), }), @@ -1397,11 +1397,11 @@ fn secp256r1_add() { &SECP256_PROGRAM, "secp256r1_add", &[ - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }, - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }, @@ -1411,9 +1411,9 @@ fn secp256r1_add() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }), @@ -1425,11 +1425,11 @@ fn secp256r1_add() { &SECP256_PROGRAM, "secp256r1_add", &[ - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }, - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }, @@ -1439,9 +1439,9 @@ fn secp256r1_add() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }), @@ -1550,12 +1550,12 @@ fn secp256r1_mul() { &SECP256_PROGRAM, "secp256r1_mul", &[ - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (0, 0), y: (0, 0), }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, ], @@ -1564,9 +1564,9 @@ fn secp256r1_mul() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, 0), y: (0, 0), }), @@ -1578,12 +1578,12 @@ fn secp256r1_mul() { &SECP256_PROGRAM, "secp256r1_mul", &[ - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -1592,9 +1592,9 @@ fn secp256r1_mul() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }), @@ -1606,12 +1606,12 @@ fn secp256r1_mul() { &SECP256_PROGRAM, "secp256r1_mul", &[ - JitValue::Secp256R1Point { + Value::Secp256R1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, ], @@ -1620,9 +1620,9 @@ fn secp256r1_mul() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }), @@ -1717,13 +1717,13 @@ fn secp256r1_get_point_from_x() { &SECP256_PROGRAM, "secp256r1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -1735,11 +1735,11 @@ fn secp256r1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -1753,13 +1753,13 @@ fn secp256r1_get_point_from_x() { &SECP256_PROGRAM, "secp256r1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -1771,11 +1771,11 @@ fn secp256r1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, 0), y: (0, 0), }), @@ -1789,13 +1789,13 @@ fn secp256r1_get_point_from_x() { &SECP256_PROGRAM, "secp256r1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -1807,11 +1807,11 @@ fn secp256r1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }), @@ -1825,13 +1825,13 @@ fn secp256r1_get_point_from_x() { &SECP256_PROGRAM, "secp256r1_get_point_from_x", &[ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Enum { + Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![], debug_name: None, }), @@ -1843,11 +1843,11 @@ fn secp256r1_get_point_from_x() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Enum { + value: Box::new(Value::Enum { tag: 0, - value: Box::new(JitValue::Secp256R1Point { + value: Box::new(Value::Secp256R1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }), @@ -1932,7 +1932,7 @@ fn secp256r1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256r1_get_xy", - &[JitValue::Secp256R1Point { + &[Value::Secp256R1Point { x: (0, 0), y: (0, 0), }], @@ -1941,16 +1941,16 @@ fn secp256r1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(0)], debug_name: None, }, ], @@ -1963,7 +1963,7 @@ fn secp256r1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256r1_get_xy", - &[JitValue::Secp256R1Point { + &[Value::Secp256R1Point { x: (0, u128::MAX), y: (u128::MAX, 0), }], @@ -1972,16 +1972,16 @@ fn secp256r1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, ], @@ -1994,7 +1994,7 @@ fn secp256r1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256r1_get_xy", - &[JitValue::Secp256R1Point { + &[Value::Secp256R1Point { x: (u128::MAX, 0), y: (0, u128::MAX), }], @@ -2003,16 +2003,16 @@ fn secp256r1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(0), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(0), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(0)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(0)], debug_name: None, }, ], @@ -2025,7 +2025,7 @@ fn secp256r1_get_xy() { let result = run_native_program( &SECP256_PROGRAM, "secp256r1_get_xy", - &[JitValue::Secp256R1Point { + &[Value::Secp256R1Point { x: (u128::MAX, u128::MAX), y: (u128::MAX, u128::MAX), }], @@ -2034,16 +2034,16 @@ fn secp256r1_get_xy() { ); assert_eq!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, - JitValue::Struct { - fields: vec![JitValue::Uint128(u128::MAX), JitValue::Uint128(u128::MAX)], + Value::Struct { + fields: vec![Value::Uint128(u128::MAX), Value::Uint128(u128::MAX)], debug_name: None, }, ], diff --git a/tests/tests/starknet/syscalls.rs b/tests/tests/starknet/syscalls.rs index 005fd0cd23..8f88cd0ebb 100644 --- a/tests/tests/starknet/syscalls.rs +++ b/tests/tests/starknet/syscalls.rs @@ -11,9 +11,8 @@ use cairo_native::{ BlockInfo, ExecutionInfo, ExecutionInfoV2, Secp256k1Point, Secp256r1Point, StarknetSyscallHandler, SyscallResult, TxInfo, TxV2Info, U256, }, - values::JitValue, + Value, }; -use itertools::Itertools; use lazy_static::lazy_static; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; use starknet_types_core::felt::Felt; @@ -522,9 +521,9 @@ fn get_block_hash() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Felt252( + value: Box::new(Value::Felt252( Felt::from_dec_str( "1158579293198495875788224011889333769139150068959598053296510642728083832673", ) @@ -547,62 +546,62 @@ fn get_execution_info() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { + Value::Struct { fields: vec![ - JitValue::Uint64(10057862467973663535), - JitValue::Uint64(13878668747512495966), - JitValue::Felt252(Felt::from_dec_str( + Value::Uint64(10057862467973663535), + Value::Uint64(13878668747512495966), + Value::Felt252(Felt::from_dec_str( "1126241460712630201003776917997524449163698107789103849210792326381258973685", ) .unwrap()), ], debug_name: None, }, - JitValue::Struct { + Value::Struct { fields: vec![ - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1724985403142256920476849371638528834056988111202434162793214195754735917407", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2419272378964094005143278046496347854926114240785059742454535261490265649110", ) .unwrap()), - JitValue::Uint128(67871905340377755668863509019681938001), - JitValue::Struct { + Value::Uint128(67871905340377755668863509019681938001), + Value::Struct { fields: vec![ - JitValue::Array(Vec::new()), + Value::Array(Vec::new()), ], debug_name: None }, - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2073267424102447009330753642820908998776456851902897601865334818765025369132", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1727570805086347994328356733148206517040691113666039929118050093237140484117", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2223335940097352947792108259394621577330089800429182023415494612506457867705", ) .unwrap()), ], debug_name: None, }, - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2367044879643293830108311482898145302930693201376043522909298679498599559539", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2322490563038631685097154208793293355074547843057070254216662565231428808211", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1501296828847480842982002010206952982741090100977850506550982801410247026532", ) .unwrap()), @@ -626,75 +625,75 @@ fn get_execution_info_v2() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Struct { + Value::Struct { fields: vec![ - JitValue::Uint64(10290342497028289173), - JitValue::Uint64(8376161426686560326), - JitValue::Felt252(Felt::from_dec_str( + Value::Uint64(10290342497028289173), + Value::Uint64(8376161426686560326), + Value::Felt252(Felt::from_dec_str( "1815189516202718271265591469295511271015058493881778555617445818147186579905", ) .unwrap()), ], debug_name: None, }, - JitValue::Struct { + Value::Struct { fields: vec![ - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1946630339019864531118751968563861838541265142438690346764722398811248737786", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2501333093425095943815772537228190103182643237630648877273495185321298605376", ) .unwrap()), - JitValue::Uint128(268753657614351187400966367706860329387), - JitValue::Struct { - fields: vec![JitValue::Array(Vec::new())], + Value::Uint128(268753657614351187400966367706860329387), + Value::Struct { + fields: vec![Value::Array(Vec::new())], debug_name: None, }, - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1123336726531770778820945049824733201592457249587063926479184903627272350002", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "2128916697180095451339935431635121484141376377516602728602049361615810538124", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "3012936192361023209451741736298028332652992971202997279327088951248532774884", ) .unwrap()), - JitValue::Struct { - fields: vec![JitValue::Array(Vec::new())], + Value::Struct { + fields: vec![Value::Array(Vec::new())], debug_name: None, }, - JitValue::Uint128(215444579144685671333997376989135077200), - JitValue::Struct { - fields: vec![JitValue::Array(Vec::new())], + Value::Uint128(215444579144685671333997376989135077200), + Value::Struct { + fields: vec![Value::Array(Vec::new())], debug_name: None, }, - JitValue::Uint32(140600095), - JitValue::Uint32(988370659), - JitValue::Struct { - fields: vec![JitValue::Array(Vec::new())], + Value::Uint32(140600095), + Value::Uint32(988370659), + Value::Struct { + fields: vec![Value::Array(Vec::new())], debug_name: None, }, ], debug_name: None, }, - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1185632056775552928459345712365014492063999606476424661067102766803470217687", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "741063429140548584082645215539704615048011618665759826371923004739480130327", ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "477501848519111015718660527024172361930966806556174677443839145770405114061", ) .unwrap()), @@ -718,16 +717,16 @@ fn deploy() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1833707083418045616336697070784512826809940908236872124572250196391719980392", ) .unwrap()), - JitValue::Struct { - fields: vec![JitValue::Array(Vec::new())], + Value::Struct { + fields: vec![Value::Array(Vec::new())], debug_name: None, }, ], @@ -750,9 +749,9 @@ fn replace_class() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None, }), @@ -773,19 +772,19 @@ fn library_call() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::Array(vec![ - JitValue::Felt252(Felt::from_dec_str( + value: Box::new(Value::Struct { + fields: vec![Value::Array(vec![ + Value::Felt252(Felt::from_dec_str( "3358892263739032253767642605669710712087178958719188919195252597609334880396" ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1104291043781086177955655234103730593173963850634630109574183288837411031513" ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "3346377229881115874907650557159666001431249650068516742483979624047277128413" ) .unwrap()), @@ -809,19 +808,19 @@ fn call_contract() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::Array(vec![ - JitValue::Felt252(Felt::from_dec_str( + value: Box::new(Value::Struct { + fields: vec![Value::Array(vec![ + Value::Felt252(Felt::from_dec_str( "3358892263739032253767642605669710712087178958719188919195252597609334880396" ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1104291043781086177955655234103730593173963850634630109574183288837411031513" ) .unwrap()), - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "3346377229881115874907650557159666001431249650068516742483979624047277128413" ) .unwrap()), @@ -845,11 +844,11 @@ fn storage_read() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Felt252(Felt::from_dec_str( + Value::Felt252(Felt::from_dec_str( "1013181629378419652272218169322268188846114273878719855200100663863924329981", ) .unwrap()), @@ -873,10 +872,10 @@ fn storage_write() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::Struct { + value: Box::new(Value::Struct { + fields: vec![Value::Struct { fields: Vec::new(), debug_name: None, }], @@ -899,9 +898,9 @@ fn emit_event() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None, }), @@ -922,9 +921,9 @@ fn send_message_to_l1() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None, }), @@ -945,12 +944,12 @@ fn keccak() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: vec![ - JitValue::Uint128(288102973244655531496349286021939642254), - JitValue::Uint128(330939983442938156232262046592599923289), + Value::Uint128(288102973244655531496349286021939642254), + Value::Uint128(330939983442938156232262046592599923289), ], debug_name: None, }), @@ -968,15 +967,15 @@ fn set_sequencer_address() { let result = run_native_program( &SYSCALLS_PROGRAM, "set_sequencer_address", - &[JitValue::Felt252(address)], + &[Value::Felt252(address)], Some(u128::MAX), Some(SyscallHandler::with(state.clone())), ); assert_eq_sorted!( result.return_value, - JitValue::Struct { - fields: vec![JitValue::Array(vec![])], + Value::Struct { + fields: vec![Value::Array(vec![])], debug_name: Some("core::array::Span::".to_string()) } ); @@ -994,15 +993,15 @@ fn set_max_fee() { let result = run_native_program( &SYSCALLS_PROGRAM, "set_max_fee", - &[JitValue::Felt252(Felt::from(max_fee))], + &[Value::Felt252(Felt::from(max_fee))], Some(u128::MAX), Some(SyscallHandler::with(state.clone())), ); assert_eq_sorted!( result.return_value, - JitValue::Struct { - fields: vec![JitValue::Array(vec![])], + Value::Struct { + fields: vec![Value::Array(vec![])], debug_name: Some("core::array::Span::".to_string()) } ); @@ -1018,23 +1017,23 @@ fn set_signature() { let signature_jit = signature .clone() .into_iter() - .map(JitValue::Felt252) - .collect_vec(); + .map(Value::Felt252) + .collect::>(); let state = Arc::new(Mutex::new(TestingState::default())); let result = run_native_program( &SYSCALLS_PROGRAM, "set_signature", - &[JitValue::Array(signature_jit)], + &[Value::Array(signature_jit)], Some(u128::MAX), Some(SyscallHandler::with(state.clone())), ); assert_eq_sorted!( result.return_value, - JitValue::Struct { - fields: vec![JitValue::Array(vec![])], + Value::Struct { + fields: vec![Value::Array(vec![])], debug_name: Some("core::array::Span::".to_string()) } ); @@ -1060,7 +1059,7 @@ fn pop_log() { let result = run_native_program( &SYSCALLS_PROGRAM, "pop_log", - &[JitValue::Felt252(log_index)], + &[Value::Felt252(log_index)], Some(u128::MAX), Some(SyscallHandler::with(state.clone())), ); @@ -1073,13 +1072,13 @@ fn pop_log() { let serialized_log_jit = serialized_log .into_iter() - .map(JitValue::Felt252) - .collect_vec(); + .map(Value::Felt252) + .collect::>(); assert_eq_sorted!( result.return_value, - JitValue::Struct { - fields: vec![JitValue::Array(serialized_log_jit)], + Value::Struct { + fields: vec![Value::Array(serialized_log_jit)], debug_name: Some("core::array::Span::".to_string()) } ); @@ -1103,15 +1102,15 @@ fn pop_log_empty() { let result = run_native_program( &SYSCALLS_PROGRAM, "pop_log", - &[JitValue::Felt252(log_index)], + &[Value::Felt252(log_index)], Some(u128::MAX), Some(SyscallHandler::with(state.clone())), ); assert_eq_sorted!( result.return_value, - JitValue::Struct { - fields: vec![JitValue::Array(Vec::new())], + Value::Struct { + fields: vec![Value::Array(Vec::new())], debug_name: Some("core::array::Span::".to_string()) } ); @@ -1134,7 +1133,7 @@ fn pop_l2_to_l1_message() { let result = run_native_program( &SYSCALLS_PROGRAM, "pop_l2_to_l1_message", - &[JitValue::Felt252(log_index)], + &[Value::Felt252(log_index)], Some(u128::MAX), Some(SyscallHandler::with(state.clone())), ); @@ -1146,13 +1145,13 @@ fn pop_l2_to_l1_message() { let serialized_message_jit = serialized_message .into_iter() - .map(JitValue::Felt252) - .collect_vec(); + .map(Value::Felt252) + .collect::>(); assert_eq_sorted!( result.return_value, - JitValue::Struct { - fields: vec![JitValue::Array(serialized_message_jit)], + Value::Struct { + fields: vec![Value::Array(serialized_message_jit)], debug_name: Some("core::array::Span::".to_string()) } ); @@ -1179,10 +1178,10 @@ fn sha256_process() { assert_eq_sorted!( result.return_value, - JitValue::Enum { + Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { - fields: vec![JitValue::Struct { + value: Box::new(Value::Struct { + fields: vec![Value::Struct { fields: vec![ 1779033703_u32.into(), 3144134277_u32.into(), diff --git a/tests/tests/trampoline.rs b/tests/tests/trampoline.rs index f48bb9d7ac..02fd83d6d1 100644 --- a/tests/tests/trampoline.rs +++ b/tests/tests/trampoline.rs @@ -5,12 +5,11 @@ use cairo_native::{ execution_result::{BuiltinStats, ExecutionResult}, executor::JitNativeExecutor, utils::find_function_id, - values::JitValue, - OptLevel, + OptLevel, Value, }; use starknet_types_core::felt::Felt; -fn run_program(program: &Program, entry_point: &str, args: &[JitValue]) -> ExecutionResult { +fn run_program(program: &Program, entry_point: &str, args: &[Value]) -> ExecutionResult { let entry_point_id = find_function_id(program, entry_point).expect("entry point not found"); let context = NativeContext::new(); @@ -31,7 +30,7 @@ fn invoke0() { run_program(&program, &format!("{0}::{0}::main", module_name), &[]), ExecutionResult { remaining_gas: None, - return_value: JitValue::Struct { + return_value: Value::Struct { fields: Vec::new(), debug_name: None, }, @@ -49,7 +48,7 @@ fn invoke1_felt252() { }; let r = |x: Felt| { - let x = JitValue::Felt252(x); + let x = Value::Felt252(x); assert_eq!( run_program( &program, @@ -79,7 +78,7 @@ fn invoke1_u8() { }; let r = |x: u8| { - let x = JitValue::Uint8(x); + let x = Value::Uint8(x); assert_eq!( run_program( &program, @@ -109,7 +108,7 @@ fn invoke1_u16() { }; let r = |x: u16| { - let x = JitValue::Uint16(x); + let x = Value::Uint16(x); assert_eq!( run_program( &program, @@ -139,7 +138,7 @@ fn invoke1_u32() { }; let r = |x: u32| { - let x = JitValue::Uint32(x); + let x = Value::Uint32(x); assert_eq!( run_program( &program, @@ -169,7 +168,7 @@ fn invoke1_u64() { }; let r = |x: u64| { - let x = JitValue::Uint64(x); + let x = Value::Uint64(x); assert_eq!( run_program( &program, @@ -199,7 +198,7 @@ fn invoke1_u128() { }; let r = |x: u128| { - let x = JitValue::Uint128(x); + let x = Value::Uint128(x); assert_eq!( run_program( &program, @@ -229,8 +228,8 @@ fn invoke1_tuple1_felt252() { }; let r = |x: (Felt,)| { - let x = JitValue::Struct { - fields: vec![JitValue::Felt252(x.0)], + let x = Value::Struct { + fields: vec![Value::Felt252(x.0)], debug_name: None, }; assert_eq!( @@ -262,8 +261,8 @@ fn invoke1_tuple1_u64() { }; let r = |x: (u64,)| { - let x = JitValue::Struct { - fields: vec![JitValue::Uint64(x.0)], + let x = Value::Struct { + fields: vec![Value::Uint64(x.0)], debug_name: None, }; assert_eq!( @@ -295,13 +294,13 @@ fn invoke1_tuple5_u8_u16_u32_u64_u128() { }; let r = |x: (u8, u16, u32, u64, u128)| { - let x = JitValue::Struct { + let x = Value::Struct { fields: vec![ - JitValue::Uint8(x.0), - JitValue::Uint16(x.1), - JitValue::Uint32(x.2), - JitValue::Uint64(x.3), - JitValue::Uint128(x.4), + Value::Uint8(x.0), + Value::Uint16(x.1), + Value::Uint32(x.2), + Value::Uint64(x.3), + Value::Uint128(x.4), ], debug_name: None, }; @@ -334,7 +333,7 @@ fn invoke1_array_felt252() { }; let r = |x: Vec| { - let x = JitValue::Array(x.into_iter().map(JitValue::Felt252).collect()); + let x = Value::Array(x.into_iter().map(Value::Felt252).collect()); assert_eq!( run_program( &program, @@ -368,9 +367,9 @@ fn invoke1_enum1_unit() { } }; - let x = JitValue::Enum { + let x = Value::Enum { tag: 0, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None, }), @@ -403,9 +402,9 @@ fn invoke1_enum1_u64() { }; let r = |x: u64| { - let x = JitValue::Enum { + let x = Value::Enum { tag: 0, - value: Box::new(JitValue::Uint64(x)), + value: Box::new(Value::Uint64(x)), debug_name: Some("MyEnum".into()), }; assert_eq!( @@ -441,9 +440,9 @@ fn invoke1_enum1_felt252() { }; let r = |x: Felt| { - let x = JitValue::Enum { + let x = Value::Enum { tag: 0, - value: Box::new(JitValue::Felt252(x)), + value: Box::new(Value::Felt252(x)), debug_name: Some("MyEnum".into()), }; assert_eq!( @@ -486,14 +485,14 @@ fn invoke1_enum2_u8_u16() { let r = |x: MyEnum| { let x = match x { - MyEnum::A(x) => JitValue::Enum { + MyEnum::A(x) => Value::Enum { tag: 0, - value: Box::new(JitValue::Uint8(x)), + value: Box::new(Value::Uint8(x)), debug_name: Some("MyEnum".into()), }, - MyEnum::B(x) => JitValue::Enum { + MyEnum::B(x) => Value::Enum { tag: 1, - value: Box::new(JitValue::Uint16(x)), + value: Box::new(Value::Uint16(x)), debug_name: Some("MyEnum".into()), }, }; @@ -533,11 +532,11 @@ fn invoke1_box_felt252() { run_program( &program, &format!("{0}::{0}::main", module_name), - &[JitValue::Felt252(42.into())], + &[Value::Felt252(42.into())], ), ExecutionResult { remaining_gas: None, - return_value: JitValue::Felt252(42.into()), + return_value: Value::Felt252(42.into()), builtin_stats: BuiltinStats::default(), } ); @@ -560,13 +559,13 @@ fn invoke1_nullable_felt252() { run_program( &program, &format!("{0}::{0}::main", module_name), - &[JitValue::Felt252(42.into())], + &[Value::Felt252(42.into())], ), ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 0, - value: Box::new(JitValue::Felt252(42.into())), + value: Box::new(Value::Felt252(42.into())), debug_name: None }, builtin_stats: BuiltinStats::default(), @@ -576,13 +575,13 @@ fn invoke1_nullable_felt252() { run_program( &program, &format!("{0}::{0}::main", module_name), - &[JitValue::Null], + &[Value::Null], ), ExecutionResult { remaining_gas: None, - return_value: JitValue::Enum { + return_value: Value::Enum { tag: 1, - value: Box::new(JitValue::Struct { + value: Box::new(Value::Struct { fields: Vec::new(), debug_name: None }), @@ -609,15 +608,15 @@ fn test_deserialize_param_bug() { }; let args = vec![ - JitValue::Uint64(0), - JitValue::Uint64(0), - JitValue::Uint64(0), - JitValue::Uint128(0), - JitValue::Uint64(0), - JitValue::Struct { - fields: vec![JitValue::Array(vec![ - JitValue::Felt252(1.into()), - JitValue::Felt252(2.into()), + Value::Uint64(0), + Value::Uint64(0), + Value::Uint64(0), + Value::Uint128(0), + Value::Uint64(0), + Value::Struct { + fields: vec![Value::Array(vec![ + Value::Felt252(1.into()), + Value::Felt252(2.into()), ])], debug_name: None, }, @@ -626,7 +625,7 @@ fn test_deserialize_param_bug() { run_program(&program, &format!("{0}::{0}::main", module_name), &args), ExecutionResult { remaining_gas: None, - return_value: JitValue::Struct { + return_value: Value::Struct { fields: args, debug_name: None }, diff --git a/tests/tests/uint.rs b/tests/tests/uint.rs index 5dd9ac7d47..33eacf2354 100644 --- a/tests/tests/uint.rs +++ b/tests/tests/uint.rs @@ -1,7 +1,7 @@ use crate::common::{compare_outputs, load_cairo, run_native_program, run_vm_program, DEFAULT_GAS}; use cairo_lang_runner::{Arg, SierraCasmRunner}; use cairo_lang_sierra::program::Program; -use cairo_native::{starknet::DummySyscallHandler, values::JitValue}; +use cairo_native::{starknet::DummySyscallHandler, Value}; use lazy_static::lazy_static; use proptest::prelude::*; @@ -449,7 +449,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -475,7 +475,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -501,7 +501,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -527,7 +527,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -553,7 +553,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -581,7 +581,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -607,7 +607,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -633,7 +633,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -659,7 +659,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -685,7 +685,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -713,7 +713,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -739,7 +739,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -765,7 +765,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -791,7 +791,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -817,7 +817,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -845,7 +845,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -871,7 +871,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -897,7 +897,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -923,7 +923,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -949,7 +949,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -977,7 +977,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -1003,7 +1003,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -1029,7 +1029,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -1055,7 +1055,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into()), JitValue::Felt252(b.into())], + &[Value::Felt252(a.into()), Value::Felt252(b.into())], Some(DEFAULT_GAS as u128), Option::::None, ); @@ -1081,7 +1081,7 @@ proptest! { let result_native = run_native_program( program, "run_test", - &[JitValue::Felt252(a.into())], + &[Value::Felt252(a.into())], Some(DEFAULT_GAS as u128), Option::::None, );