From db8ba0bb6c913b7547111d17c1b5164868df1ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaya=20G=C3=B6kalp?= Date: Wed, 3 Jul 2024 03:39:09 -0700 Subject: [PATCH 01/19] fix: deployment estimation deferred to sdk (#6212) --- .github/workflows/ci.yml | 21 +- Cargo.lock | 3 + forc-plugins/forc-client/Cargo.toml | 5 + forc-plugins/forc-client/src/constants.rs | 5 + forc-plugins/forc-client/src/op/deploy.rs | 88 +++--- forc-plugins/forc-client/src/op/mod.rs | 2 +- forc-plugins/forc-client/src/op/run/mod.rs | 24 +- forc-plugins/forc-client/src/util/gas.rs | 63 +---- forc-plugins/forc-client/src/util/tx.rs | 295 ++++++++++++--------- forc-plugins/forc-client/tests/deploy.rs | 128 +++++++++ 10 files changed, 392 insertions(+), 242 deletions(-) create mode 100644 forc-plugins/forc-client/tests/deploy.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ec166a53ef..3928b4f7aee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -517,6 +517,25 @@ jobs: mv fuel-core-${{ needs.get-fuel-core-version.outputs.fuel_core_version }}-x86_64-unknown-linux-gnu/fuel-core /usr/local/bin/fuel-core - name: Run tests run: cargo test --locked --release -p forc-debug + cargo-test-forc-client: + runs-on: ubuntu-latest + needs: get-fuel-core-version + steps: + - uses: actions/checkout@v3 + - name: Install toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUST_VERSION }} + targets: "x86_64-unknown-linux-gnu, wasm32-unknown-unknown" + - uses: Swatinem/rust-cache@v2 + - name: Install fuel-core for tests + run: | + curl -sSLf https://github.com/FuelLabs/fuel-core/releases/download/v${{ needs.get-fuel-core-version.outputs.fuel_core_version }}/fuel-core-${{ needs.get-fuel-core-version.outputs.fuel_core_version }}-x86_64-unknown-linux-gnu.tar.gz -L -o fuel-core.tar.gz + tar -xvf fuel-core.tar.gz + chmod +x fuel-core-${{ needs.get-fuel-core-version.outputs.fuel_core_version }}-x86_64-unknown-linux-gnu/fuel-core + mv fuel-core-${{ needs.get-fuel-core-version.outputs.fuel_core_version }}-x86_64-unknown-linux-gnu/fuel-core /usr/local/bin/fuel-core + - name: Run tests + run: cargo test --locked --release -p forc-client cargo-test-sway-lsp: runs-on: ubuntu-latest steps: @@ -538,7 +557,7 @@ jobs: toolchain: ${{ env.RUST_VERSION }} - uses: Swatinem/rust-cache@v2 - name: Run tests - run: cargo test --locked --release --workspace --exclude forc-debug --exclude sway-lsp + run: cargo test --locked --release --workspace --exclude forc-debug --exclude sway-lsp --exclude forc-client cargo-unused-deps-check: runs-on: ubuntu-latest steps: diff --git a/Cargo.lock b/Cargo.lock index 27dfdded259..d19bd9f0989 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2012,6 +2012,7 @@ dependencies = [ "fuels-core", "futures", "hex", + "portpicker", "rand", "rpassword", "serde", @@ -2019,7 +2020,9 @@ dependencies = [ "sway-core", "sway-types", "sway-utils", + "tempfile", "tokio", + "toml_edit 0.21.1", "tracing", ] diff --git a/forc-plugins/forc-client/Cargo.toml b/forc-plugins/forc-client/Cargo.toml index 7ad1be7d2e2..8ff255fef3b 100644 --- a/forc-plugins/forc-client/Cargo.toml +++ b/forc-plugins/forc-client/Cargo.toml @@ -40,6 +40,11 @@ sway-utils = { version = "0.61.1", path = "../../sway-utils" } tokio = { version = "1.8", features = ["macros", "rt-multi-thread", "process"] } tracing = "0.1" +[dev-dependencies] +portpicker = "0.1.1" +tempfile = "3" +toml_edit = "0.21.1" + [[bin]] name = "forc-deploy" path = "src/bin/deploy.rs" diff --git a/forc-plugins/forc-client/src/constants.rs b/forc-plugins/forc-client/src/constants.rs index bd946af2f44..927323a57b3 100644 --- a/forc-plugins/forc-client/src/constants.rs +++ b/forc-plugins/forc-client/src/constants.rs @@ -12,3 +12,8 @@ pub const DEVNET_FAUCET_URL: &str = "https://faucet-devnet.fuel.network"; pub const DEVNET_ENDPOINT_URL: &str = "https://devnet.fuel.network"; pub const TESTNET_FAUCET_URL: &str = "https://faucet-testnet.fuel.network"; pub const TESTNET_ENDPOINT_URL: &str = "https://testnet.fuel.network"; +/// Default PrivateKey to sign transactions submitted to local node. +pub const DEFAULT_PRIVATE_KEY: &str = + "0xde97d8624a438121b86a1956544bd72ed68cd69f2c99555b08b1e8c51ffd511c"; +/// The maximum time to wait for a transaction to be included in a block by the node +pub const TX_SUBMIT_TIMEOUT_MS: u64 = 30_000u64; diff --git a/forc-plugins/forc-client/src/op/deploy.rs b/forc-plugins/forc-client/src/op/deploy.rs index e0270fa5245..bb7a95cc549 100644 --- a/forc-plugins/forc-client/src/op/deploy.rs +++ b/forc-plugins/forc-client/src/op/deploy.rs @@ -1,10 +1,10 @@ use crate::{ cmd, + constants::TX_SUBMIT_TIMEOUT_MS, util::{ - gas::get_estimated_max_fee, node_url::get_node_url, pkg::built_pkgs, - tx::{TransactionBuilderExt, WalletSelectionMode, TX_SUBMIT_TIMEOUT_MS}, + tx::{prompt_forc_wallet_password, select_secret_key, WalletSelectionMode}, }, }; use anyhow::{bail, Context, Result}; @@ -12,12 +12,14 @@ use forc_pkg::manifest::GenericManifestFile; use forc_pkg::{self as pkg, PackageManifestFile}; use forc_tracing::println_warning; use forc_util::default_output_directory; +use forc_wallet::utils::default_wallet_path; use fuel_core_client::client::types::TransactionStatus; use fuel_core_client::client::FuelClient; use fuel_crypto::fuel_types::ChainId; -use fuel_tx::{Output, Salt, TransactionBuilder}; +use fuel_tx::Salt; use fuel_vm::prelude::*; -use fuels_accounts::provider::Provider; +use fuels_accounts::{provider::Provider, wallet::WalletUnlocked, Account}; +use fuels_core::types::{transaction::TxPolicies, transaction_builders::CreateTransactionBuilder}; use futures::FutureExt; use pkg::{manifest::build_profile::ExperimentalFlags, BuildProfile, BuiltPackage}; use serde::{Deserialize, Serialize}; @@ -30,7 +32,7 @@ use sway_core::language::parsed::TreeType; use sway_core::BuildTarget; use tracing::info; -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub struct DeployedContract { pub id: fuel_tx::ContractId, } @@ -176,6 +178,13 @@ pub async fn deploy(command: cmd::Deploy) -> Result> { None }; + let wallet_mode = if command.default_signer || command.signing_key.is_some() { + WalletSelectionMode::Manual + } else { + let password = prompt_forc_wallet_password(&default_wallet_path())?; + WalletSelectionMode::ForcWallet(password) + }; + for pkg in built_pkgs { if pkg .descriptor @@ -197,8 +206,14 @@ pub async fn deploy(command: cmd::Deploy) -> Result> { bail!("Both `--salt` and `--default-salt` were specified: must choose one") } }; - let contract_id = - deploy_pkg(&command, &pkg.descriptor.manifest_file, &pkg, salt).await?; + let contract_id = deploy_pkg( + &command, + &pkg.descriptor.manifest_file, + &pkg, + salt, + &wallet_mode, + ) + .await?; contract_ids.push(contract_id); } } @@ -211,6 +226,7 @@ pub async fn deploy_pkg( manifest: &PackageManifestFile, compiled: &BuiltPackage, salt: Salt, + wallet_mode: &WalletSelectionMode, ) -> Result { let node_url = get_node_url(&command.node, &manifest.network)?; let client = FuelClient::new(node_url.clone())?; @@ -232,44 +248,30 @@ pub async fn deploy_pkg( let state_root = Contract::initial_state_root(storage_slots.iter()); let contract_id = contract.id(&salt, &root, &state_root); - let wallet_mode = if command.manual_signing { - WalletSelectionMode::Manual - } else { - WalletSelectionMode::ForcWallet - }; - let provider = Provider::connect(node_url.clone()).await?; + let tx_policies = TxPolicies::default(); + + let mut tb = CreateTransactionBuilder::prepare_contract_deployment( + bytecode.clone(), + contract_id, + state_root, + salt, + storage_slots.clone(), + tx_policies, + ); + let signing_key = select_secret_key( + wallet_mode, + command.default_signer || command.unsigned, + command.signing_key, + &provider, + ) + .await? + .ok_or_else(|| anyhow::anyhow!("failed to select a signer for the transaction"))?; + let wallet = WalletUnlocked::new_from_private_key(signing_key, Some(provider.clone())); - // We need a tx for estimation without the signature. - let mut tb = - TransactionBuilder::create(bytecode.as_slice().into(), salt, storage_slots.clone()); - tb.maturity(command.maturity.maturity.into()) - .add_output(Output::contract_created(contract_id, state_root)); - let tx_for_estimation = tb.finalize_without_signature_inner(); - - // If user specified max_fee use that but if not, we will estimate with %10 safety margin. - let max_fee = if let Some(max_fee) = command.gas.max_fee { - max_fee - } else { - let estimation_margin = 10; - get_estimated_max_fee( - tx_for_estimation.clone(), - &provider, - &client, - estimation_margin, - ) - .await? - }; - - let tx = tb - .max_fee_limit(max_fee) - .finalize_signed( - provider.clone(), - command.default_signer || command.unsigned, - command.signing_key, - wallet_mode, - ) - .await?; + wallet.add_witnesses(&mut tb)?; + wallet.adjust_for_fee(&mut tb, 0).await?; + let tx = tb.build(provider).await?; let tx = Transaction::from(tx); let chain_id = client.chain_info().await?.consensus_parameters.chain_id(); diff --git a/forc-plugins/forc-client/src/op/mod.rs b/forc-plugins/forc-client/src/op/mod.rs index bb7e5746eb4..44a1b055551 100644 --- a/forc-plugins/forc-client/src/op/mod.rs +++ b/forc-plugins/forc-client/src/op/mod.rs @@ -2,6 +2,6 @@ mod deploy; mod run; mod submit; -pub use deploy::deploy; +pub use deploy::{deploy, DeployedContract}; pub use run::run; pub use submit::submit; diff --git a/forc-plugins/forc-client/src/op/run/mod.rs b/forc-plugins/forc-client/src/op/run/mod.rs index 0ea4f073b2a..317afd80687 100644 --- a/forc-plugins/forc-client/src/op/run/mod.rs +++ b/forc-plugins/forc-client/src/op/run/mod.rs @@ -1,17 +1,19 @@ mod encode; use crate::{ cmd, + constants::TX_SUBMIT_TIMEOUT_MS, util::{ gas::get_script_gas_used, node_url::get_node_url, pkg::built_pkgs, - tx::{TransactionBuilderExt, WalletSelectionMode, TX_SUBMIT_TIMEOUT_MS}, + tx::{prompt_forc_wallet_password, TransactionBuilderExt, WalletSelectionMode}, }, }; use anyhow::{anyhow, bail, Context, Result}; use forc_pkg::{self as pkg, fuel_core_not_running, PackageManifestFile}; use forc_tracing::println_warning; use forc_util::tx_utils::format_log_receipts; +use forc_wallet::utils::default_wallet_path; use fuel_core_client::client::FuelClient; use fuel_tx::{ContractId, Transaction, TransactionBuilder}; use fuels_accounts::provider::Provider; @@ -49,6 +51,12 @@ pub async fn run(command: cmd::Run) -> Result> { }; let build_opts = build_opts_from_cmd(&command); let built_pkgs_with_manifest = built_pkgs(&curr_dir, &build_opts)?; + let wallet_mode = if command.default_signer || command.signing_key.is_some() { + WalletSelectionMode::Manual + } else { + let password = prompt_forc_wallet_password(&default_wallet_path())?; + WalletSelectionMode::ForcWallet(password) + }; for built in built_pkgs_with_manifest { if built .descriptor @@ -56,7 +64,13 @@ pub async fn run(command: cmd::Run) -> Result> { .check_program_type(&[TreeType::Script]) .is_ok() { - let pkg_receipts = run_pkg(&command, &built.descriptor.manifest_file, &built).await?; + let pkg_receipts = run_pkg( + &command, + &built.descriptor.manifest_file, + &built, + &wallet_mode, + ) + .await?; receipts.push(pkg_receipts); } } @@ -68,6 +82,7 @@ pub async fn run_pkg( command: &cmd::Run, manifest: &PackageManifestFile, compiled: &BuiltPackage, + wallet_mode: &WalletSelectionMode, ) -> Result { let node_url = get_node_url(&command.node, &manifest.network)?; @@ -101,11 +116,6 @@ pub async fn run_pkg( .map_err(|e| anyhow!("Failed to parse contract id: {}", e)) }) .collect::>>()?; - let wallet_mode = if command.manual_signing { - WalletSelectionMode::Manual - } else { - WalletSelectionMode::ForcWallet - }; let mut tb = TransactionBuilder::script(compiled.bytecode.bytes.clone(), script_data); tb.maturity(command.maturity.maturity.into()) diff --git a/forc-plugins/forc-client/src/util/gas.rs b/forc-plugins/forc-client/src/util/gas.rs index 74d87dd0bf2..9667bee8674 100644 --- a/forc-plugins/forc-client/src/util/gas.rs +++ b/forc-plugins/forc-client/src/util/gas.rs @@ -1,15 +1,11 @@ use anyhow::Result; -use fuel_core_client::client::FuelClient; -use fuel_core_types::services::executor::TransactionExecutionResult; use fuel_tx::{ - field::{Inputs, MaxFeeLimit, Witnesses}, - Buildable, Chargeable, Create, Input, Script, Transaction, TxPointer, + field::{Inputs, Witnesses}, + Buildable, Chargeable, Input, Script, TxPointer, }; use fuels_accounts::provider::Provider; -use fuels_core::{ - constants::DEFAULT_GAS_ESTIMATION_BLOCK_HORIZON, types::transaction::ScriptTransaction, -}; +use fuels_core::types::transaction::ScriptTransaction; fn no_spendable_input<'a, I: IntoIterator>(inputs: I) -> bool { !inputs.into_iter().any(|i| { @@ -55,56 +51,3 @@ pub(crate) async fn get_script_gas_used(mut tx: Script, provider: &Provider) -> .await?; Ok(estimated_tx_cost.gas_used) } - -/// Returns an estimation for the max fee of `Create` transactions. -/// Accepts a `tolerance` which is used to add some safety margin to the estimation. -/// Resulting estimation is calculated as `(dry_run_estimation * tolerance)/100 + dry_run_estimation)`. -pub(crate) async fn get_estimated_max_fee( - tx: Create, - provider: &Provider, - client: &FuelClient, - tolerance: u64, -) -> Result { - let mut tx = tx.clone(); - // Add dummy input to get past validation for dry run. - let no_spendable_input = no_spendable_input(tx.inputs()); - let base_asset_id = provider.base_asset_id(); - if no_spendable_input { - tx.inputs_mut().push(Input::coin_signed( - Default::default(), - Default::default(), - 1_000_000_000, - *base_asset_id, - TxPointer::default(), - 0, - )); - - // Add an empty `Witness` for the `coin_signed` we just added - // and increase the witness limit - tx.witnesses_mut().push(Default::default()); - } - let consensus_params = provider.consensus_parameters(); - let gas_price = provider - .estimate_gas_price(DEFAULT_GAS_ESTIMATION_BLOCK_HORIZON) - .await? - .gas_price; - let max_fee = tx.max_fee( - consensus_params.gas_costs(), - consensus_params.fee_params(), - gas_price, - ); - tx.set_max_fee_limit(max_fee as u64); - let tx = Transaction::from(tx); - - let tx_status = client - .dry_run(&[tx]) - .await - .map(|mut status_vec| status_vec.remove(0))?; - let total_fee = match tx_status.result { - TransactionExecutionResult::Success { total_fee, .. } => total_fee, - TransactionExecutionResult::Failed { total_fee, .. } => total_fee, - }; - - let total_fee_with_tolerance = ((total_fee * tolerance) / 100) + total_fee; - Ok(total_fee_with_tolerance) -} diff --git a/forc-plugins/forc-client/src/util/tx.rs b/forc-plugins/forc-client/src/util/tx.rs index be4206b340e..a79f7359255 100644 --- a/forc-plugins/forc-client/src/util/tx.rs +++ b/forc-plugins/forc-client/src/util/tx.rs @@ -1,4 +1,4 @@ -use std::{io::Write, str::FromStr}; +use std::{collections::BTreeMap, io::Write, path::Path, str::FromStr}; use anyhow::{Error, Result}; use async_trait::async_trait; @@ -23,18 +23,12 @@ use forc_wallet::{ utils::default_wallet_path, }; -use crate::util::target::Target; - -/// The maximum time to wait for a transaction to be included in a block by the node -pub const TX_SUBMIT_TIMEOUT_MS: u64 = 30_000u64; - -/// Default PrivateKey to sign transactions submitted to local node. -pub const DEFAULT_PRIVATE_KEY: &str = - "0xde97d8624a438121b86a1956544bd72ed68cd69f2c99555b08b1e8c51ffd511c"; +use crate::{constants::DEFAULT_PRIVATE_KEY, util::target::Target}; #[derive(PartialEq, Eq)] pub enum WalletSelectionMode { - ForcWallet, + /// Holds the password of forc-wallet instance. + ForcWallet(String), Manual, } @@ -66,6 +60,89 @@ fn ask_user_yes_no_question(question: &str) -> Result { let ans = ans.trim(); Ok(ans == "y" || ans == "Y") } + +fn collect_user_accounts( + wallet_path: &Path, + password: &str, +) -> Result> { + let verification = AccountVerification::Yes(password.to_string()); + let accounts = collect_accounts_with_verification(wallet_path, verification).map_err(|e| { + if e.to_string().contains("Mac Mismatch") { + anyhow::anyhow!("Failed to access forc-wallet vault. Please check your password") + } else { + e + } + })?; + Ok(accounts) +} + +pub(crate) fn prompt_forc_wallet_password(wallet_path: &Path) -> Result { + let prompt = format!( + "\nPlease provide the password of your encrypted wallet vault at {wallet_path:?}: " + ); + let password = rpassword::prompt_password(prompt)?; + Ok(password) +} + +pub(crate) fn check_and_create_wallet_at_default_path(wallet_path: &Path) -> Result<()> { + if !wallet_path.exists() { + let question = format!("Could not find a wallet at {wallet_path:?}, would you like to create a new one? [y/N]: "); + let accepted = ask_user_yes_no_question(&question)?; + let new_options = New { + force: false, + cache_accounts: None, + }; + if accepted { + new_wallet_cli(wallet_path, new_options)?; + println!("Wallet created successfully."); + // Derive first account for the fresh wallet we created. + new_at_index_cli(wallet_path, 0)?; + println!("Account derived successfully."); + } else { + anyhow::bail!("Refused to create a new wallet. If you don't want to use forc-wallet, you can sign this transaction manually with --manual-signing flag.") + } + } + Ok(()) +} + +pub(crate) fn secret_key_from_forc_wallet( + wallet_path: &Path, + account_index: usize, + password: &str, +) -> Result { + let secret_key = derive_secret_key(wallet_path, account_index, password).map_err(|e| { + if e.to_string().contains("Mac Mismatch") { + anyhow::anyhow!("Failed to access forc-wallet vault. Please check your password") + } else { + e + } + })?; + Ok(secret_key) +} + +pub(crate) fn bech32_from_secret(secret_key: &SecretKey) -> Result { + let public_key = PublicKey::from(secret_key); + let hashed = public_key.hash(); + let bech32 = Bech32Address::new(FUEL_BECH32_HRP, hashed); + Ok(bech32) +} + +pub(crate) fn select_manual_secret_key( + default_signer: bool, + signing_key: Option, +) -> Option { + match (default_signer, signing_key) { + // Note: unwrap is safe here as we already know that 'DEFAULT_PRIVATE_KEY' is a valid private key. + (true, None) => Some(SecretKey::from_str(DEFAULT_PRIVATE_KEY).unwrap()), + (true, Some(signing_key)) => { + println_warning("Signing key is provided while requesting to sign with a default signer. Using signing key"); + Some(signing_key) + } + (false, None) => None, + (false, Some(signing_key)) => Some(signing_key), + } +} + /// Collect and return balances of each account in the accounts map. async fn collect_account_balances( accounts_map: &AccountsMap, @@ -81,6 +158,78 @@ async fn collect_account_balances( .map_err(|e| anyhow::anyhow!("{e}")) } +// TODO: Simplify the function signature once https://github.com/FuelLabs/sway/issues/6071 is closed. +pub(crate) async fn select_secret_key( + wallet_mode: &WalletSelectionMode, + default_sign: bool, + signing_key: Option, + provider: &Provider, +) -> Result> { + let chain_info = provider.chain_info().await?; + let signing_key = match wallet_mode { + WalletSelectionMode::ForcWallet(password) => { + let wallet_path = default_wallet_path(); + check_and_create_wallet_at_default_path(&wallet_path)?; + // TODO: This is a very simple TUI, we should consider adding a nice TUI + // capabilities for selections and answer collection. + let accounts = collect_user_accounts(&wallet_path, password)?; + let account_balances = collect_account_balances(&accounts, provider).await?; + + let total_balance = account_balances + .iter() + .flat_map(|account| account.values()) + .sum::(); + if total_balance == 0 { + let first_account = accounts + .get(&0) + .ok_or_else(|| anyhow::anyhow!("No account derived for this wallet"))?; + let target = Target::from_str(&chain_info.name).unwrap_or(Target::testnet()); + let faucet_link = format!("{}/?address={first_account}", target.faucet_url()); + anyhow::bail!("Your wallet does not have any funds to pay for the transaction.\ + \n\nIf you are interacting with a testnet consider using the faucet.\ + \n-> {target} network faucet: {faucet_link}\ + \nIf you are interacting with a local node, consider providing a chainConfig which funds your account.") + } + print_account_balances(&accounts, &account_balances); + + let mut account_index; + loop { + print!("\nPlease provide the index of account to use for signing: "); + std::io::stdout().flush()?; + let mut input_account_index = String::new(); + std::io::stdin().read_line(&mut input_account_index)?; + account_index = input_account_index.trim().parse::()?; + if accounts.contains_key(&account_index) { + break; + } + let options: Vec = accounts.keys().map(|key| key.to_string()).collect(); + println_warning(&format!( + "\"{}\" is not a valid account.\nPlease choose a valid option from {}", + account_index, + options.join(","), + )); + } + + let secret_key = secret_key_from_forc_wallet(&wallet_path, account_index, password)?; + + let bech32 = bech32_from_secret(&secret_key)?; + // TODO: Do this via forc-wallet once the functionality is exposed. + let question = format!( + "Do you agree to sign this transaction with {}? [y/N]: ", + bech32 + ); + let accepted = ask_user_yes_no_question(&question)?; + if !accepted { + anyhow::bail!("User refused to sign"); + } + + Some(secret_key) + } + WalletSelectionMode::Manual => select_manual_secret_key(default_sign, signing_key), + }; + Ok(signing_key) +} + #[async_trait] pub trait TransactionBuilderExt { fn add_contract(&mut self, contract_id: ContractId) -> &mut Self; @@ -95,9 +244,9 @@ pub trait TransactionBuilderExt { async fn finalize_signed( &mut self, client: Provider, - unsigned: bool, + default_signature: bool, signing_key: Option, - wallet_mode: WalletSelectionMode, + wallet_mode: &WalletSelectionMode, ) -> Result; } @@ -169,131 +318,17 @@ impl TransactionBuilderExt for Tran provider: Provider, default_sign: bool, signing_key: Option, - wallet_mode: WalletSelectionMode, + wallet_mode: &WalletSelectionMode, ) -> Result { let chain_info = provider.chain_info().await?; let params = chain_info.consensus_parameters; - let signing_key = match (wallet_mode, signing_key, default_sign) { - (WalletSelectionMode::ForcWallet, None, false) => { - // TODO: This is a very simple TUI, we should consider adding a nice TUI - // capabilities for selections and answer collection. - let wallet_path = default_wallet_path(); - if !wallet_path.exists() { - let question = format!("Could not find a wallet at {wallet_path:?}, would you like to create a new one? [y/N]: "); - let accepted = ask_user_yes_no_question(&question)?; - let new_options = New { - force: false, - cache_accounts: None, - }; - if accepted { - new_wallet_cli(&wallet_path, new_options)?; - println!("Wallet created successfully."); - // Derive first account for the fresh wallet we created. - new_at_index_cli(&wallet_path, 0)?; - println!("Account derived successfully."); - } else { - anyhow::bail!("Refused to create a new wallet. If you don't want to use forc-wallet, you can sign this transaction manually with --manual-signing flag.") - } - } - let prompt = format!( - "\nPlease provide the password of your encrypted wallet vault at {wallet_path:?}: " - ); - let password = rpassword::prompt_password(prompt)?; - let verification = AccountVerification::Yes(password.clone()); - let accounts = collect_accounts_with_verification(&wallet_path, verification) - .map_err(|e| { - if e.to_string().contains("Mac Mismatch") { - anyhow::anyhow!( - "Failed to access forc-wallet vault. Please check your password" - ) - } else { - e - } - })?; - let account_balances = collect_account_balances(&accounts, &provider).await?; - - let total_balance = account_balances - .iter() - .flat_map(|account| account.values()) - .sum::(); - if total_balance == 0 { - let first_account = accounts - .get(&0) - .ok_or_else(|| anyhow::anyhow!("No account derived for this wallet"))?; - let target = Target::from_str(&chain_info.name).unwrap_or(Target::testnet()); - let faucet_link = format!("{}/?address={first_account}", target.faucet_url()); - anyhow::bail!("Your wallet does not have any funds to pay for the transaction.\ - \n\nIf you are interacting with a testnet consider using the faucet.\ - \n-> {target} network faucet: {faucet_link}\ - \nIf you are interacting with a local node, consider providing a chainConfig which funds your account.") - } - print_account_balances(&accounts, &account_balances); - - let mut account_index; - loop { - print!("\nPlease provide the index of account to use for signing: "); - std::io::stdout().flush()?; - let mut input_account_index = String::new(); - std::io::stdin().read_line(&mut input_account_index)?; - account_index = input_account_index.trim().parse::()?; - if accounts.contains_key(&account_index) { - break; - } - let options: Vec = accounts.keys().map(|key| key.to_string()).collect(); - println_warning(&format!( - "\"{}\" is not a valid account.\nPlease choose a valid option from {}", - account_index, - options.join(","), - )); - } - - let secret_key = derive_secret_key(&wallet_path, account_index, &password) - .map_err(|e| { - if e.to_string().contains("Mac Mismatch") { - anyhow::anyhow!( - "Failed to access forc-wallet vault. Please check your password" - ) - } else { - e - } - })?; - - // TODO: Do this via forc-wallet once the functionality is exposed. - let public_key = PublicKey::from(&secret_key); - let hashed = public_key.hash(); - let bech32 = Bech32Address::new(FUEL_BECH32_HRP, hashed); - let question = format!( - "Do you agree to sign this transaction with {}? [y/N]: ", - bech32 - ); - let accepted = ask_user_yes_no_question(&question)?; - if !accepted { - anyhow::bail!("User refused to sign"); - } - - Some(secret_key) - } - (WalletSelectionMode::ForcWallet, Some(key), _) => { - println_warning("Signing key is provided while requesting to sign with forc-wallet or with default signer. Using signing key"); - Some(key) - } - (WalletSelectionMode::Manual, None, false) => None, - (WalletSelectionMode::Manual, Some(key), false) => Some(key), - (_, None, true) => { - // Generate a `SecretKey` to sign this transaction from a default private key used - // by fuel-core. - let secret_key = SecretKey::from_str(DEFAULT_PRIVATE_KEY)?; - Some(secret_key) - } - (WalletSelectionMode::Manual, Some(key), true) => { - println_warning("Signing key is provided while requesting to sign with a default signer. Using signing key"); - Some(key) - } - }; + let signing_key = + select_secret_key(wallet_mode, default_sign, signing_key, &provider).await?; // Get the address let address = if let Some(key) = signing_key { Address::from(*key.public_key().hash()) } else { + // TODO: Remove this path https://github.com/FuelLabs/sway/issues/6071 Address::from(prompt_address()?) }; diff --git a/forc-plugins/forc-client/tests/deploy.rs b/forc-plugins/forc-client/tests/deploy.rs new file mode 100644 index 00000000000..d6ca5c6c858 --- /dev/null +++ b/forc-plugins/forc-client/tests/deploy.rs @@ -0,0 +1,128 @@ +use std::{ + fs, + path::{Path, PathBuf}, + process::{Child, Command}, + str::FromStr, +}; + +use forc::cli::shared::Pkg; +use forc_client::{ + cmd, + op::{deploy, DeployedContract}, + NodeTarget, +}; +use fuel_tx::{ContractId, Salt}; +use portpicker::Port; +use tempfile::tempdir; +use toml_edit::{Document, InlineTable, Item, Value}; + +fn get_workspace_root() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../") + .join("../") + .canonicalize() + .unwrap() +} + +/// Return the path to the chain config file which is expected to be in +/// `.github/workflows/local-node` from sway repo root. +fn chain_config_path() -> PathBuf { + get_workspace_root() + .join(".github") + .join("workflows") + .join("local-testnode") +} + +fn test_data_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("test") + .join("data") + .canonicalize() + .unwrap() +} + +fn run_node() -> (Child, Port) { + let port = portpicker::pick_unused_port().expect("No ports free"); + + let chain_config = chain_config_path(); + let child = Command::new("fuel-core") + .arg("run") + .arg("--debug") + .arg("--db-type") + .arg("in-memory") + .arg("--port") + .arg(port.to_string()) + .arg("--snapshot") + .arg(format!("{}", chain_config.display())) + .spawn() + .expect("Failed to start fuel-core"); + (child, port) +} + +/// Copy a directory recursively from `source` to `dest`. +fn copy_dir(source: &Path, dest: &Path) -> anyhow::Result<()> { + fs::create_dir_all(dest)?; + for e in fs::read_dir(source)? { + let entry = e?; + let file_type = entry.file_type()?; + if file_type.is_dir() { + copy_dir(&entry.path(), &dest.join(entry.file_name()))?; + } else { + fs::copy(entry.path(), dest.join(entry.file_name()))?; + } + } + Ok(()) +} + +fn patch_manifest_file_with_path_std(manifest_dir: &Path) -> anyhow::Result<()> { + let toml_path = manifest_dir.join(sway_utils::constants::MANIFEST_FILE_NAME); + let toml_content = fs::read_to_string(&toml_path).unwrap(); + + let mut doc = toml_content.parse::().unwrap(); + let new_std_path = get_workspace_root().join("sway-lib-std"); + + let mut std_dependency = InlineTable::new(); + std_dependency.insert("path", Value::from(new_std_path.display().to_string())); + doc["dependencies"]["std"] = Item::Value(Value::InlineTable(std_dependency)); + + fs::write(&toml_path, doc.to_string()).unwrap(); + Ok(()) +} + +#[tokio::test] +async fn simple_deploy() { + let (mut node, port) = run_node(); + let tmp_dir = tempdir().unwrap(); + let project_dir = test_data_path().join("standalone_contract"); + copy_dir(&project_dir, tmp_dir.path()).unwrap(); + patch_manifest_file_with_path_std(tmp_dir.path()).unwrap(); + + let pkg = Pkg { + path: Some(tmp_dir.path().display().to_string()), + ..Default::default() + }; + + let node_url = format!("http://127.0.0.1:{}/v1/graphql", port); + let target = NodeTarget { + node_url: Some(node_url), + target: None, + testnet: false, + }; + let cmd = cmd::Deploy { + pkg, + salt: Some(vec![format!("{}", Salt::default())]), + node: target, + default_signer: true, + ..Default::default() + }; + let contract_ids = deploy(cmd).await.unwrap(); + node.kill().unwrap(); + let expected = vec![DeployedContract { + id: ContractId::from_str( + "428896412bda8530282a7b8fca5d20b2a73f30037612ca3a31750cf3bf0e976a", + ) + .unwrap(), + }]; + + assert_eq!(contract_ids, expected) +} From edff10d113cd271f1b003d2a999c9038c24acbb2 Mon Sep 17 00:00:00 2001 From: Sophie Dankel <47993817+sdankel@users.noreply.github.com> Date: Wed, 3 Jul 2024 06:32:25 -0700 Subject: [PATCH 02/19] feat: Add helper function for consistent forc output (#6208) ## Description Makes the indendation and formatting consistent for forc's action messages. ### forc build before ![image](https://github.com/FuelLabs/sway/assets/47993817/08d8a30a-82a0-48f5-92d5-1b6c7329ae57) after ![image](https://github.com/FuelLabs/sway/assets/47993817/5dfd4b78-2f7c-47eb-92cf-5c3f518557ef) ### forc test before ![image](https://github.com/FuelLabs/sway/assets/47993817/6eb2d6fe-416b-47ee-97b2-bcd2fabee4db) after ![image](https://github.com/FuelLabs/sway/assets/47993817/68ee4bf3-7dba-4c26-b696-fd8d6ad50a98) ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --- Cargo.lock | 24 +++++++++++- forc-pkg/src/lock.rs | 15 ++++--- forc-pkg/src/pkg.rs | 27 ++++++++----- forc-pkg/src/source/git/mod.rs | 14 ++++--- forc-pkg/src/source/ipfs.rs | 29 +++++++------- forc-plugins/forc-doc/Cargo.toml | 2 +- forc-plugins/forc-doc/src/lib.rs | 28 +++++++------ forc-tracing/Cargo.toml | 3 ++ forc-tracing/src/lib.rs | 67 ++++++++++++++++++++++++++++++++ forc-util/src/lib.rs | 10 ++--- forc/src/cli/commands/test.rs | 23 ++++++----- forc/src/ops/forc_template.rs | 11 ++++-- 12 files changed, 182 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d19bd9f0989..bc48708dfad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2084,11 +2084,11 @@ version = "0.61.1" dependencies = [ "anyhow", "clap 4.5.7", - "colored", "comrak", "dir_indexer", "expect-test", "forc-pkg", + "forc-tracing 0.61.1", "forc-util", "horrorshow", "include_dir", @@ -2201,6 +2201,7 @@ dependencies = [ "ansi_term", "tracing", "tracing-subscriber", + "tracing-test", ] [[package]] @@ -7500,6 +7501,27 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tracing-test" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracing-test-macro", +] + +[[package]] +name = "tracing-test-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" +dependencies = [ + "quote", + "syn 2.0.66", +] + [[package]] name = "try-lock" version = "0.2.5" diff --git a/forc-pkg/src/lock.rs b/forc-pkg/src/lock.rs index b44504cf2b7..594c107bc09 100644 --- a/forc-pkg/src/lock.rs +++ b/forc-pkg/src/lock.rs @@ -1,5 +1,6 @@ use crate::{pkg, source, DepKind, Edge}; use anyhow::{anyhow, Result}; +use forc_tracing::{println_action_green, println_action_red}; use petgraph::{visit::EdgeRef, Direction}; use serde::{Deserialize, Serialize}; use std::{ @@ -351,10 +352,9 @@ where true => format!(" {}", pkg.source), false => String::new(), }; - tracing::info!( - " {} {}{src}", - ansi_term::Colour::Red.bold().paint("Removing"), - ansi_term::Style::new().bold().paint(&pkg.name) + println_action_red( + "Removing", + &format!("{}{src}", ansi_term::Style::new().bold().paint(&pkg.name)), ); } } @@ -370,10 +370,9 @@ where true => format!(" {}", pkg.source), false => "".to_string(), }; - tracing::info!( - " {} {}{src}", - ansi_term::Colour::Green.bold().paint("Adding"), - ansi_term::Style::new().bold().paint(&pkg.name) + println_action_green( + "Adding", + &format!("{}{src}", ansi_term::Style::new().bold().paint(&pkg.name)), ); } } diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index 09b00fa5057..fda1ec4d2c1 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -9,7 +9,7 @@ use crate::{ BuildProfile, }; use anyhow::{anyhow, bail, Context, Error, Result}; -use forc_tracing::println_warning; +use forc_tracing::{println_action_green, println_warning}; use forc_util::{ default_output_directory, find_file_name, kebab_to_snake_case, print_compiling, print_on_failure, print_warnings, @@ -497,7 +497,7 @@ impl BuiltPackage { let json_abi_path = output_dir.join(program_abi_stem).with_extension("json"); self.write_json_abi(&json_abi_path, minify)?; - info!(" Bytecode size: {} bytes", self.bytecode.bytes.len()); + debug!(" Bytecode size: {} bytes", self.bytecode.bytes.len()); // Additional ops required depending on the program type match self.tree_type { TreeType::Contract => { @@ -531,7 +531,7 @@ impl BuiltPackage { let hash_file_name = format!("{}{}", &pkg_name, SWAY_BIN_HASH_SUFFIX); let hash_path = output_dir.join(hash_file_name); fs::write(hash_path, &bytecode_hash)?; - info!(" Bytecode hash: {}", bytecode_hash); + debug!(" Bytecode hash: {}", bytecode_hash); } _ => (), } @@ -713,7 +713,10 @@ impl BuildPlan { cause, ); } - info!(" Creating a new `Forc.lock` file. (Cause: {})", cause); + println_action_green( + "Creating", + &format!("a new `Forc.lock` file. (Cause: {})", cause), + ); let member_names = manifests .iter() .map(|(_, manifest)| manifest.project.name.to_string()) @@ -723,7 +726,7 @@ impl BuildPlan { .map_err(|e| anyhow!("failed to serialize lock file: {}", e))?; fs::write(lock_path, string) .map_err(|e| anyhow!("failed to write lock file: {}", e))?; - info!(" Created new lock file at {}", lock_path.display()); + debug!(" Created new lock file at {}", lock_path.display()); } Ok(plan) @@ -2171,11 +2174,13 @@ pub fn build_with_options(build_options: &BuildOpts) -> Result { )?; let output_dir = pkg.output_directory.as_ref().map(PathBuf::from); - let finished = ansi_term::Colour::Green.bold().paint("Finished"); - info!( - " {finished} {} in {:.2}s", - profile_target_string(&build_profile.name, build_target), - build_start.elapsed().as_secs_f32() + println_action_green( + "Finished", + &format!( + "{} in {:.2}s", + profile_target_string(&build_profile.name, build_target), + build_start.elapsed().as_secs_f32() + ), ); for (node_ix, built_package) in built_packages { print_pkg_summary_header(&built_package); @@ -2299,6 +2304,8 @@ pub fn build( let manifest = &plan.manifest_map()[&pkg.id()]; let program_ty = manifest.program_type().ok(); + // TODO: Only print "Compiling" when the dependency is not already compiled. + // https://github.com/FuelLabs/sway/issues/6209 print_compiling( program_ty.as_ref(), &pkg.name, diff --git a/forc-pkg/src/source/git/mod.rs b/forc-pkg/src/source/git/mod.rs index fdaf0b8a8b0..a89e77f3128 100644 --- a/forc-pkg/src/source/git/mod.rs +++ b/forc-pkg/src/source/git/mod.rs @@ -6,6 +6,7 @@ use crate::{ source, }; use anyhow::{anyhow, bail, Context, Result}; +use forc_tracing::println_action_green; use forc_util::git_checkouts_directory; use serde::{Deserialize, Serialize}; use std::fmt::Display; @@ -15,7 +16,6 @@ use std::{ path::{Path, PathBuf}, str::FromStr, }; -use tracing::info; #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Deserialize, Serialize)] pub struct Url { @@ -204,11 +204,13 @@ impl source::Fetch for Pinned { { let _guard = lock.write()?; if !repo_path.exists() { - info!( - " {} {} {}", - ansi_term::Color::Green.bold().paint("Fetching"), - ansi_term::Style::new().bold().paint(ctx.name), - self + println_action_green( + "Fetching", + &format!( + "{} {}", + ansi_term::Style::new().bold().paint(ctx.name), + self + ), ); fetch(ctx.fetch_id(), ctx.name(), self)?; } diff --git a/forc-pkg/src/source/ipfs.rs b/forc-pkg/src/source/ipfs.rs index 70dc988588d..1a1c5e914fc 100644 --- a/forc-pkg/src/source/ipfs.rs +++ b/forc-pkg/src/source/ipfs.rs @@ -4,6 +4,7 @@ use crate::{ source, }; use anyhow::Result; +use forc_tracing::println_action_green; use futures::TryStreamExt; use ipfs_api::IpfsApi; use ipfs_api_backend_hyper as ipfs_api; @@ -14,7 +15,6 @@ use std::{ str::FromStr, }; use tar::Archive; -use tracing::info; #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct Cid(cid::Cid); @@ -67,11 +67,13 @@ impl source::Fetch for Pinned { { let _guard = lock.write()?; if !repo_path.exists() { - info!( - " {} {} {}", - ansi_term::Color::Green.bold().paint("Fetching"), - ansi_term::Style::new().bold().paint(ctx.name), - self + println_action_green( + "Fetching", + &format!( + "{} {}", + ansi_term::Style::new().bold().paint(ctx.name), + self + ), ); let cid = &self.0; let ipfs_client = ipfs_client(); @@ -79,17 +81,16 @@ impl source::Fetch for Pinned { futures::executor::block_on(async { match ctx.ipfs_node() { source::IPFSNode::Local => { - info!( - " {} with local IPFS node", - ansi_term::Color::Green.bold().paint("Fetching") - ); + println_action_green("Fetching", "with local IPFS node"); cid.fetch_with_client(&ipfs_client, &dest).await } source::IPFSNode::WithUrl(ipfs_node_gateway_url) => { - info!( - " {} from {}. Note: This can take several minutes.", - ansi_term::Color::Green.bold().paint("Fetching"), - ipfs_node_gateway_url + println_action_green( + "Fetching", + &format!( + "from {}. Note: This can take several minutes.", + ipfs_node_gateway_url + ), ); cid.fetch_with_gateway_url(ipfs_node_gateway_url, &dest) .await diff --git a/forc-plugins/forc-doc/Cargo.toml b/forc-plugins/forc-doc/Cargo.toml index 19cff7c7990..c9d8c1fdb89 100644 --- a/forc-plugins/forc-doc/Cargo.toml +++ b/forc-plugins/forc-doc/Cargo.toml @@ -11,9 +11,9 @@ repository.workspace = true [dependencies] anyhow = "1.0.65" clap = { version = "4.5.4", features = ["derive"] } -colored = "2.0.0" comrak = "0.16" forc-pkg = { version = "0.61.1", path = "../../forc-pkg" } +forc-tracing = { version = "0.61.1", path = "../../forc-tracing" } forc-util = { version = "0.61.1", path = "../../forc-util" } horrorshow = "0.8.4" include_dir = "0.7.3" diff --git a/forc-plugins/forc-doc/src/lib.rs b/forc-plugins/forc-doc/src/lib.rs index 5369d5b327f..d629b606563 100644 --- a/forc-plugins/forc-doc/src/lib.rs +++ b/forc-plugins/forc-doc/src/lib.rs @@ -6,13 +6,13 @@ pub mod tests; use anyhow::{bail, Result}; use cli::Command; -use colored::Colorize; use doc::Documentation; use forc_pkg as pkg; use forc_pkg::{ manifest::{GenericManifestFile, ManifestFile}, PackageManifestFile, }; +use forc_tracing::println_action_green; use forc_util::default_output_directory; use render::RenderedDocumentation; use std::{ @@ -77,11 +77,13 @@ pub fn compile_html( } fs::create_dir_all(&doc_path)?; - println!( - " {} {} ({})", - "Compiling".bold().yellow(), - pkg_manifest.project_name(), - manifest.dir().to_string_lossy() + println_action_green( + "Compiling", + &format!( + "{} ({})", + pkg_manifest.project_name(), + manifest.dir().to_string_lossy() + ), ); let member_manifests = manifest.member_manifests()?; @@ -179,11 +181,13 @@ fn build_docs( pkg_manifest, } = program_info; - println!( - " {} documentation for {} ({})", - "Building".bold().yellow(), - pkg_manifest.project_name(), - manifest.dir().to_string_lossy() + println_action_green( + "Building", + &format!( + "documentation for {} ({})", + pkg_manifest.project_name(), + manifest.dir().to_string_lossy() + ), ); let raw_docs = Documentation::from_ty_program( @@ -210,7 +214,7 @@ fn build_docs( // write file contents to doc folder write_content(rendered_docs, doc_path)?; - println!(" {}", "Finished".bold().yellow()); + println_action_green("Finished", pkg_manifest.project_name()); Ok(raw_docs) } diff --git a/forc-tracing/Cargo.toml b/forc-tracing/Cargo.toml index 6815ca322ee..b6384abcb43 100644 --- a/forc-tracing/Cargo.toml +++ b/forc-tracing/Cargo.toml @@ -12,3 +12,6 @@ repository.workspace = true ansi_term = "0.12" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["ansi", "env-filter", "json"] } + +[dev-dependencies] +tracing-test = "0.2" \ No newline at end of file diff --git a/forc-tracing/src/lib.rs b/forc-tracing/src/lib.rs index 7411091da19..0141aa7bf64 100644 --- a/forc-tracing/src/lib.rs +++ b/forc-tracing/src/lib.rs @@ -9,6 +9,37 @@ use tracing_subscriber::{ fmt::MakeWriter, }; +const ACTION_COLUMN_WIDTH: usize = 12; + +/// Returns the indentation for the action prefix relative to [ACTION_COLUMN_WIDTH]. +fn get_action_indentation(action: &str) -> String { + if action.len() < ACTION_COLUMN_WIDTH { + " ".repeat(ACTION_COLUMN_WIDTH - action.len()) + } else { + "".to_string() + } +} + +/// Prints an action message with a green-bold prefix like " Compiling ". +pub fn println_action_green(action: &str, txt: &str) { + tracing::info!( + "{}{} {}", + get_action_indentation(action), + Colour::Green.bold().paint(action), + txt + ); +} + +/// Prints an action message with a red-bold prefix like " Removing ". +pub fn println_action_red(action: &str, txt: &str) { + tracing::info!( + "{}{} {}", + get_action_indentation(action), + Colour::Red.bold().paint(action), + txt + ); +} + /// Prints a warning message to stdout with the yellow prefix "warning: ". pub fn println_warning(txt: &str) { tracing::warn!("{}: {}", Colour::Yellow.paint("warning"), txt); @@ -148,3 +179,39 @@ pub fn init_tracing_subscriber(options: TracingSubscriberOptions) { builder.init(); } } + +#[cfg(test)] +mod tests { + use super::*; + use tracing_test::traced_test; + + #[traced_test] + #[test] + fn test_println_action_green() { + let txt = "main.sw"; + println_action_green("Compiling", txt); + + let expected_action = "\x1b[1;32mCompiling\x1b[0m"; + assert!(logs_contain(&format!(" {} {}", expected_action, txt))); + } + + #[traced_test] + #[test] + fn test_println_action_green_long() { + let txt = "main.sw"; + println_action_green("Supercalifragilistic", txt); + + let expected_action = "\x1b[1;32mSupercalifragilistic\x1b[0m"; + assert!(logs_contain(&format!("{} {}", expected_action, txt))); + } + + #[traced_test] + #[test] + fn test_println_action_red() { + let txt = "main"; + println_action_red("Removing", txt); + + let expected_action = "\x1b[1;31mRemoving\x1b[0m"; + assert!(logs_contain(&format!(" {} {}", expected_action, txt))); + } +} diff --git a/forc-util/src/lib.rs b/forc-util/src/lib.rs index da996311fc2..a630f741023 100644 --- a/forc-util/src/lib.rs +++ b/forc-util/src/lib.rs @@ -3,9 +3,8 @@ use annotate_snippets::{ renderer::{AnsiColor, Style}, Annotation, AnnotationType, Renderer, Slice, Snippet, SourceAnnotation, }; -use ansi_term::Colour; use anyhow::{bail, Context, Result}; -use forc_tracing::{println_error, println_red_err, println_yellow_err}; +use forc_tracing::{println_action_green, println_error, println_red_err, println_yellow_err}; use std::{ collections::{hash_map, HashSet}, fmt::Display, @@ -346,10 +345,9 @@ pub fn print_compiling(ty: Option<&TreeType>, name: &str, src: &dyn std::fmt::Di Some(ty) => format!("{} ", program_type_str(ty)), None => "".to_string(), }; - tracing::debug!( - " {} {ty}{} ({src})", - Colour::Green.bold().paint("Compiling"), - ansi_term::Style::new().bold().paint(name) + println_action_green( + "Compiling", + &format!("{ty}{} ({src})", ansi_term::Style::new().bold().paint(name)), ); } diff --git a/forc/src/cli/commands/test.rs b/forc/src/cli/commands/test.rs index f8e4001fa42..86387522029 100644 --- a/forc/src/cli/commands/test.rs +++ b/forc/src/cli/commands/test.rs @@ -3,6 +3,7 @@ use ansi_term::Colour; use clap::Parser; use forc_pkg as pkg; use forc_test::{decode_log_data, TestFilter, TestRunnerCount, TestedPackage}; +use forc_tracing::println_action_green; use forc_util::{tx_utils::format_log_receipts, ForcError, ForcResult}; use pkg::manifest::build_profile::ExperimentalFlags; use sway_core::fuel_prelude::fuel_tx::Receipt; @@ -90,12 +91,15 @@ pub(crate) fn exec(cmd: Command) -> ForcResult<()> { let test_count = built_tests.test_count(test_filter.as_ref()); let num_tests_running = test_count.total - test_count.ignored; let num_tests_ignored = test_count.ignored; - info!( - " Running {} {}, filtered {} {}", - num_tests_running, - formatted_test_count_string(&num_tests_running), - num_tests_ignored, - formatted_test_count_string(&num_tests_ignored) + println_action_green( + "Running", + &format!( + "{} {}, filtered {} {}", + num_tests_running, + formatted_test_count_string(&num_tests_running), + num_tests_ignored, + formatted_test_count_string(&num_tests_ignored) + ), ); let tested = built_tests.run(test_runner_count, test_filter)?; let duration = start.elapsed(); @@ -105,10 +109,11 @@ pub(crate) fn exec(cmd: Command) -> ForcResult<()> { forc_test::Tested::Workspace(pkgs) => { for pkg in &pkgs { let built = &pkg.built.descriptor.name; - info!("\n tested -- {built}\n"); + info!("\ntested -- {built}\n"); print_tested_pkg(pkg, &test_print_opts)?; } - info!("\n Finished in {:?}", duration); + info!(""); + println_action_green("Finished", &format!("in {:?}", duration)); pkgs.iter().all(|pkg| pkg.tests_passed()) } forc_test::Tested::Package(pkg) => { @@ -210,7 +215,7 @@ fn print_tested_pkg(pkg: &TestedPackage, test_print_opts: &TestPrintOpts) -> For .map(|test_result| test_result.duration) .sum(); info!( - " Result: {}. {} passed. {} failed. Finished in {:?}.", + "\ntest result: {}. {} passed; {} failed; finished in {:?}", color.paint(state), succeeded, failed, diff --git a/forc/src/ops/forc_template.rs b/forc/src/ops/forc_template.rs index 07a0b5846bb..23703ea575e 100644 --- a/forc/src/ops/forc_template.rs +++ b/forc/src/ops/forc_template.rs @@ -4,6 +4,7 @@ use forc_pkg::{ manifest::{self, PackageManifest}, source::{self, git::Url}, }; +use forc_tracing::println_action_green; use forc_util::validate_project_name; use fs_extra::dir::{copy, CopyOptions}; use std::fs::File; @@ -11,7 +12,6 @@ use std::io::{Read, Write}; use std::path::{Path, PathBuf}; use std::{env, str::FromStr}; use sway_utils::constants; -use tracing::info; pub fn init(command: TemplateCommand) -> Result<()> { validate_project_name(&command.project_name)?; @@ -31,7 +31,7 @@ pub fn init(command: TemplateCommand) -> Result<()> { let fetch_ts = std::time::Instant::now(); let fetch_id = source::fetch_id(current_dir, fetch_ts); - info!("Resolving the HEAD of {}", source.repo); + println_action_green("Resolving", &format!("the HEAD of {}", source.repo)); let git_source = source::git::pin(fetch_id, &local_repo_name, source)?; let repo_path = source::git::commit_path( @@ -40,7 +40,7 @@ pub fn init(command: TemplateCommand) -> Result<()> { &git_source.commit_hash, ); if !repo_path.exists() { - info!(" Fetching {}", git_source.to_string()); + println_action_green("Fetching", git_source.to_string().as_str()); source::git::fetch(fetch_id, &local_repo_name, &git_source)?; } @@ -65,7 +65,10 @@ pub fn init(command: TemplateCommand) -> Result<()> { // Create the target dir let target_dir = current_dir.join(&command.project_name); - info!("Creating {} from template", &command.project_name); + println_action_green( + "Creating", + &format!("{} from template", &command.project_name), + ); // Copy contents from template to target dir copy_template_to_target(&from_path, &target_dir)?; From e1b1c2bee73e0ba825e07736cefa6c0abd079595 Mon Sep 17 00:00:00 2001 From: Sophie Dankel <47993817+sdankel@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:24:12 -0700 Subject: [PATCH 03/19] Bump to v0.61.2 (#6213) ## Description Includes critical fix https://github.com/FuelLabs/sway/pull/6212 ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --- Cargo.lock | 66 ++++++++++++++--------------- forc-pkg/Cargo.toml | 14 +++--- forc-plugins/forc-client/Cargo.toml | 18 ++++---- forc-plugins/forc-crypto/Cargo.toml | 6 +-- forc-plugins/forc-debug/Cargo.toml | 12 +++--- forc-plugins/forc-doc/Cargo.toml | 18 ++++---- forc-plugins/forc-fmt/Cargo.toml | 14 +++--- forc-plugins/forc-lsp/Cargo.toml | 4 +- forc-plugins/forc-tx/Cargo.toml | 4 +- forc-test/Cargo.toml | 8 ++-- forc-tracing/Cargo.toml | 2 +- forc-util/Cargo.toml | 12 +++--- forc/Cargo.toml | 20 ++++----- sway-ast/Cargo.toml | 6 +-- sway-core/Cargo.toml | 14 +++--- sway-error/Cargo.toml | 4 +- sway-ir/Cargo.toml | 8 ++-- sway-ir/sway-ir-macros/Cargo.toml | 2 +- sway-lsp/Cargo.toml | 22 +++++----- sway-parse/Cargo.toml | 8 ++-- sway-types/Cargo.toml | 4 +- sway-utils/Cargo.toml | 2 +- swayfmt/Cargo.toml | 16 +++---- 23 files changed, 142 insertions(+), 142 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc48708dfad..3e0426aafd6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1953,7 +1953,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "forc" -version = "0.61.1" +version = "0.61.2" dependencies = [ "annotate-snippets", "ansi_term", @@ -1964,7 +1964,7 @@ dependencies = [ "completest-pty", "forc-pkg", "forc-test", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-util", "fs_extra", "fuel-asm", @@ -1989,7 +1989,7 @@ dependencies = [ [[package]] name = "forc-client" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "async-trait", @@ -1998,7 +1998,7 @@ dependencies = [ "devault", "forc", "forc-pkg", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-tx", "forc-util", "forc-wallet", @@ -2028,13 +2028,13 @@ dependencies = [ [[package]] name = "forc-crypto" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "async-trait", "atty", "clap 4.5.7", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-util", "fuel-core-types", "fuel-crypto", @@ -2054,7 +2054,7 @@ dependencies = [ [[package]] name = "forc-debug" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "clap 4.5.7", @@ -2062,7 +2062,7 @@ dependencies = [ "escargot", "forc-pkg", "forc-test", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "fuel-core-client", "fuel-types", "fuel-vm", @@ -2080,7 +2080,7 @@ dependencies = [ [[package]] name = "forc-doc" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "clap 4.5.7", @@ -2088,7 +2088,7 @@ dependencies = [ "dir_indexer", "expect-test", "forc-pkg", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-util", "horrorshow", "include_dir", @@ -2105,12 +2105,12 @@ dependencies = [ [[package]] name = "forc-fmt" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "clap 4.5.7", "forc-pkg", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-util", "prettydiff 0.5.1", "sway-core", @@ -2122,7 +2122,7 @@ dependencies = [ [[package]] name = "forc-lsp" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "clap 4.5.7", @@ -2133,12 +2133,12 @@ dependencies = [ [[package]] name = "forc-pkg" -version = "0.61.1" +version = "0.61.2" dependencies = [ "ansi_term", "anyhow", "cid", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-util", "fuel-abi-types", "futures", @@ -2169,7 +2169,7 @@ dependencies = [ [[package]] name = "forc-test" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "forc-pkg", @@ -2196,7 +2196,7 @@ dependencies = [ [[package]] name = "forc-tracing" -version = "0.61.1" +version = "0.61.2" dependencies = [ "ansi_term", "tracing", @@ -2206,7 +2206,7 @@ dependencies = [ [[package]] name = "forc-tx" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "clap 4.5.7", @@ -2221,7 +2221,7 @@ dependencies = [ [[package]] name = "forc-util" -version = "0.61.1" +version = "0.61.2" dependencies = [ "annotate-snippets", "ansi_term", @@ -2229,7 +2229,7 @@ dependencies = [ "clap 4.5.7", "dirs 3.0.2", "fd-lock 4.0.2", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "fuel-tx", "hex", "paste", @@ -6537,7 +6537,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "sway-ast" -version = "0.61.1" +version = "0.61.2" dependencies = [ "extension-trait", "num-bigint", @@ -6549,7 +6549,7 @@ dependencies = [ [[package]] name = "sway-core" -version = "0.61.1" +version = "0.61.2" dependencies = [ "clap 4.5.7", "derivative", @@ -6594,7 +6594,7 @@ dependencies = [ [[package]] name = "sway-error" -version = "0.61.1" +version = "0.61.2" dependencies = [ "either", "in_definite", @@ -6607,7 +6607,7 @@ dependencies = [ [[package]] name = "sway-ir" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "downcast-rs", @@ -6626,7 +6626,7 @@ dependencies = [ [[package]] name = "sway-ir-macros" -version = "0.61.1" +version = "0.61.2" dependencies = [ "itertools 0.10.5", "proc-macro2", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "sway-lsp" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "assert-json-diff", @@ -6646,7 +6646,7 @@ dependencies = [ "dirs 4.0.0", "fd-lock 4.0.2", "forc-pkg", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "forc-util", "futures", "indexmap 2.2.6", @@ -6701,7 +6701,7 @@ dependencies = [ [[package]] name = "sway-parse" -version = "0.61.1" +version = "0.61.2" dependencies = [ "assert_matches", "extension-trait", @@ -6719,7 +6719,7 @@ dependencies = [ [[package]] name = "sway-types" -version = "0.61.1" +version = "0.61.2" dependencies = [ "bytecount", "fuel-asm", @@ -6738,7 +6738,7 @@ dependencies = [ [[package]] name = "sway-utils" -version = "0.61.1" +version = "0.61.2" dependencies = [ "serde", "walkdir", @@ -6746,11 +6746,11 @@ dependencies = [ [[package]] name = "swayfmt" -version = "0.61.1" +version = "0.61.2" dependencies = [ "anyhow", "difference", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "paste", "prettydiff 0.6.4", "ropey", @@ -7000,7 +7000,7 @@ dependencies = [ "forc-client", "forc-pkg", "forc-test", - "forc-tracing 0.61.1", + "forc-tracing 0.61.2", "fuel-vm", "futures", "gag", diff --git a/forc-pkg/Cargo.toml b/forc-pkg/Cargo.toml index 5518a379ebb..f4211d4b1a0 100644 --- a/forc-pkg/Cargo.toml +++ b/forc-pkg/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-pkg" -version = "0.61.1" +version = "0.61.2" description = "Building, locking, fetching and updating Sway projects as Forc packages." authors.workspace = true edition.workspace = true @@ -12,8 +12,8 @@ repository.workspace = true ansi_term = "0.12" anyhow = "1" cid = "0.10" -forc-tracing = { version = "0.61.1", path = "../forc-tracing" } -forc-util = { version = "0.61.1", path = "../forc-util" } +forc-tracing = { version = "0.61.2", path = "../forc-tracing" } +forc-util = { version = "0.61.2", path = "../forc-util" } fuel-abi-types = { workspace = true } futures = "0.3" git2 = { version = "0.17.2", features = [ @@ -30,10 +30,10 @@ serde = { version = "1.0", features = ["derive"] } serde_ignored = "0.1.9" serde_json = "1.0" serde_with = "3.3.0" -sway-core = { version = "0.61.1", path = "../sway-core" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-core = { version = "0.61.2", path = "../sway-core" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } tar = "0.4.38" toml = { version = "0.7", features = ["parse"] } tracing = "0.1" diff --git a/forc-plugins/forc-client/Cargo.toml b/forc-plugins/forc-client/Cargo.toml index 8ff255fef3b..b5fc2a34d07 100644 --- a/forc-plugins/forc-client/Cargo.toml +++ b/forc-plugins/forc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-client" -version = "0.61.1" +version = "0.61.2" description = "A `forc` plugin for interacting with a Fuel node." authors.workspace = true edition.workspace = true @@ -14,11 +14,11 @@ async-trait = "0.1.58" chrono = { version = "0.4", default-features = false, features = ["std"] } clap = { version = "4.5.4", features = ["derive", "env"] } devault = "0.1" -forc = { version = "0.61.1", path = "../../forc" } -forc-pkg = { version = "0.61.1", path = "../../forc-pkg" } -forc-tracing = { version = "0.61.1", path = "../../forc-tracing" } -forc-tx = { version = "0.61.1", path = "../forc-tx" } -forc-util = { version = "0.61.1", path = "../../forc-util" } +forc = { version = "0.61.2", path = "../../forc" } +forc-pkg = { version = "0.61.2", path = "../../forc-pkg" } +forc-tracing = { version = "0.61.2", path = "../../forc-tracing" } +forc-tx = { version = "0.61.2", path = "../forc-tx" } +forc-util = { version = "0.61.2", path = "../../forc-util" } forc-wallet = { workspace = true } fuel-abi-types = { workspace = true } fuel-core-client = { workspace = true, features = ["subscriptions"] } @@ -34,9 +34,9 @@ rand = "0.8" rpassword = "7.2" serde = "1.0" serde_json = "1" -sway-core = { version = "0.61.1", path = "../../sway-core" } -sway-types = { version = "0.61.1", path = "../../sway-types" } -sway-utils = { version = "0.61.1", path = "../../sway-utils" } +sway-core = { version = "0.61.2", path = "../../sway-core" } +sway-types = { version = "0.61.2", path = "../../sway-types" } +sway-utils = { version = "0.61.2", path = "../../sway-utils" } tokio = { version = "1.8", features = ["macros", "rt-multi-thread", "process"] } tracing = "0.1" diff --git a/forc-plugins/forc-crypto/Cargo.toml b/forc-plugins/forc-crypto/Cargo.toml index 6d0a5ed7376..69e97679ad4 100644 --- a/forc-plugins/forc-crypto/Cargo.toml +++ b/forc-plugins/forc-crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-crypto" -version = "0.61.1" +version = "0.61.2" description = "A `forc` plugin for handling various cryptographic operations and conversions." authors.workspace = true edition.workspace = true @@ -13,8 +13,8 @@ anyhow = "1.0.75" async-trait = "0.1.58" atty = "0.2.14" clap = { version = "4.5.4", features = ["derive", "env"] } -forc-tracing = { version = "0.61.1", path = "../../forc-tracing" } -forc-util = { version = "0.61.1", path = "../../forc-util" } +forc-tracing = { version = "0.61.2", path = "../../forc-tracing" } +forc-util = { version = "0.61.2", path = "../../forc-util" } fuel-core-types = { workspace = true } fuel-crypto = { workspace = true, features = ["random"] } fuels-core = { workspace = true } diff --git a/forc-plugins/forc-debug/Cargo.toml b/forc-plugins/forc-debug/Cargo.toml index cc1c7a775e7..9bbdbc00190 100644 --- a/forc-plugins/forc-debug/Cargo.toml +++ b/forc-plugins/forc-debug/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-debug" -version = "0.61.1" +version = "0.61.2" description = "Supports debugging Sway code via CLI and DAP server." authors.workspace = true edition.workspace = true @@ -12,9 +12,9 @@ repository.workspace = true anyhow = "1.0" # Used by the examples and for conversion only clap = { version = "4.5.4", features = ["derive", "env"] } dap = "0.4.1-alpha1" -forc-pkg = { version = "0.61.1", path = "../../forc-pkg" } -forc-test = { version = "0.61.1", path = "../../forc-test" } -forc-tracing = { version = "0.61.1", path = "../../forc-tracing" } +forc-pkg = { version = "0.61.2", path = "../../forc-pkg" } +forc-test = { version = "0.61.2", path = "../../forc-test" } +forc-tracing = { version = "0.61.2", path = "../../forc-tracing" } fuel-core-client = { workspace = true } fuel-types = { workspace = true, features = ["serde"] } fuel-vm = { workspace = true, features = ["serde"] } @@ -22,8 +22,8 @@ rayon = "1.7.0" serde = "1.0" serde_json = "1.0" shellfish = { version = "0.6.0", features = ["rustyline", "async", "tokio"] } -sway-core = { version = "0.61.1", path = "../../sway-core" } -sway-types = { version = "0.61.1", path = "../../sway-types" } +sway-core = { version = "0.61.2", path = "../../sway-core" } +sway-types = { version = "0.61.2", path = "../../sway-types" } thiserror = "1.0" tokio = { version = "1.8", features = [ "net", diff --git a/forc-plugins/forc-doc/Cargo.toml b/forc-plugins/forc-doc/Cargo.toml index c9d8c1fdb89..511ffcba773 100644 --- a/forc-plugins/forc-doc/Cargo.toml +++ b/forc-plugins/forc-doc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-doc" -version = "0.61.1" +version = "0.61.2" description = "Build the documentation for the local package and all dependencies. The output is placed in `out/doc` in the same format as the project." authors.workspace = true edition.workspace = true @@ -12,20 +12,20 @@ repository.workspace = true anyhow = "1.0.65" clap = { version = "4.5.4", features = ["derive"] } comrak = "0.16" -forc-pkg = { version = "0.61.1", path = "../../forc-pkg" } -forc-tracing = { version = "0.61.1", path = "../../forc-tracing" } -forc-util = { version = "0.61.1", path = "../../forc-util" } +forc-pkg = { version = "0.61.2", path = "../../forc-pkg" } +forc-tracing = { version = "0.61.2", path = "../../forc-tracing" } +forc-util = { version = "0.61.2", path = "../../forc-util" } horrorshow = "0.8.4" include_dir = "0.7.3" minifier = "0.3.0" opener = "0.5.0" serde = "1.0" serde_json = "1.0" -sway-ast = { version = "0.61.1", path = "../../sway-ast" } -sway-core = { version = "0.61.1", path = "../../sway-core" } -sway-lsp = { version = "0.61.1", path = "../../sway-lsp" } -sway-types = { version = "0.61.1", path = "../../sway-types" } -swayfmt = { version = "0.61.1", path = "../../swayfmt" } +sway-ast = { version = "0.61.2", path = "../../sway-ast" } +sway-core = { version = "0.61.2", path = "../../sway-core" } +sway-lsp = { version = "0.61.2", path = "../../sway-lsp" } +sway-types = { version = "0.61.2", path = "../../sway-types" } +swayfmt = { version = "0.61.2", path = "../../swayfmt" } [dev-dependencies] dir_indexer = "0.0.2" diff --git a/forc-plugins/forc-fmt/Cargo.toml b/forc-plugins/forc-fmt/Cargo.toml index 1ab89a72c6d..4c799e4ed09 100644 --- a/forc-plugins/forc-fmt/Cargo.toml +++ b/forc-plugins/forc-fmt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-fmt" -version = "0.61.1" +version = "0.61.2" description = "A `forc` plugin for running the Sway code formatter." authors.workspace = true edition.workspace = true @@ -11,12 +11,12 @@ repository.workspace = true [dependencies] anyhow = "1" clap = { version = "4.5.4", features = ["derive"] } -forc-pkg = { version = "0.61.1", path = "../../forc-pkg" } -forc-tracing = { version = "0.61.1", path = "../../forc-tracing" } -forc-util = { version = "0.61.1", path = "../../forc-util" } +forc-pkg = { version = "0.61.2", path = "../../forc-pkg" } +forc-tracing = { version = "0.61.2", path = "../../forc-tracing" } +forc-util = { version = "0.61.2", path = "../../forc-util" } prettydiff = "0.5" -sway-core = { version = "0.61.1", path = "../../sway-core" } -sway-utils = { version = "0.61.1", path = "../../sway-utils" } -swayfmt = { version = "0.61.1", path = "../../swayfmt" } +sway-core = { version = "0.61.2", path = "../../sway-core" } +sway-utils = { version = "0.61.2", path = "../../sway-utils" } +swayfmt = { version = "0.61.2", path = "../../swayfmt" } taplo = "0.7" tracing = "0.1" diff --git a/forc-plugins/forc-lsp/Cargo.toml b/forc-plugins/forc-lsp/Cargo.toml index 037f7dcbcc9..b1a5b55f5f9 100644 --- a/forc-plugins/forc-lsp/Cargo.toml +++ b/forc-plugins/forc-lsp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-lsp" -version = "0.61.1" +version = "0.61.2" description = "A simple `forc` plugin for starting the sway language server." authors.workspace = true edition.workspace = true @@ -11,6 +11,6 @@ repository.workspace = true [dependencies] anyhow = "1" clap = { version = "4.5.4", features = ["derive"] } -sway-lsp = { version = "0.61.1", path = "../../sway-lsp" } +sway-lsp = { version = "0.61.2", path = "../../sway-lsp" } tikv-jemallocator = "0.5" tokio = { version = "1.8" } diff --git a/forc-plugins/forc-tx/Cargo.toml b/forc-plugins/forc-tx/Cargo.toml index 5243f745b0b..772815e0991 100644 --- a/forc-plugins/forc-tx/Cargo.toml +++ b/forc-plugins/forc-tx/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-tx" -version = "0.61.1" +version = "0.61.2" description = "A `forc` plugin for constructing transactions." authors.workspace = true edition.workspace = true @@ -19,7 +19,7 @@ path = "src/main.rs" anyhow = "1" clap = { version = "4.5.4", features = ["derive", "env"] } devault = "0.1" -forc-util = { version = "0.61.1", path = "../../forc-util" } +forc-util = { version = "0.61.2", path = "../../forc-util" } fuel-tx = { workspace = true, features = ["serde", "test-helpers", "random"] } fuel-types = { workspace = true, features = ["serde"] } serde = "1.0" diff --git a/forc-test/Cargo.toml b/forc-test/Cargo.toml index 2ae850d3505..8408ff94298 100644 --- a/forc-test/Cargo.toml +++ b/forc-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-test" -version = "0.61.1" +version = "0.61.2" description = "A library for building and running Sway unit tests within Forc packages." authors.workspace = true edition.workspace = true @@ -10,12 +10,12 @@ repository.workspace = true [dependencies] anyhow = "1" -forc-pkg = { version = "0.61.1", path = "../forc-pkg" } +forc-pkg = { version = "0.61.2", path = "../forc-pkg" } fuel-abi-types = { workspace = true } fuel-tx = { workspace = true, features = ["test-helpers"] } fuel-vm = { workspace = true, features = ["random", "test-helpers"] } fuels-core = { workspace = true } rand = "0.8" rayon = "1.7.0" -sway-core = { version = "0.61.1", path = "../sway-core" } -sway-types = { version = "0.61.1", path = "../sway-types" } +sway-core = { version = "0.61.2", path = "../sway-core" } +sway-types = { version = "0.61.2", path = "../sway-types" } diff --git a/forc-tracing/Cargo.toml b/forc-tracing/Cargo.toml index b6384abcb43..00b744814d0 100644 --- a/forc-tracing/Cargo.toml +++ b/forc-tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-tracing" -version = "0.61.1" +version = "0.61.2" description = "Tracing utility shared between forc crates." authors.workspace = true edition.workspace = true diff --git a/forc-util/Cargo.toml b/forc-util/Cargo.toml index c0b100654fb..659171a6bd4 100644 --- a/forc-util/Cargo.toml +++ b/forc-util/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc-util" -version = "0.61.1" +version = "0.61.2" description = "Utility items shared between forc crates." authors.workspace = true edition.workspace = true @@ -15,7 +15,7 @@ anyhow = "1" clap = { version = "4.5.4", features = ["cargo", "derive", "env"] } dirs = "3.0.2" fd-lock = "4.0" -forc-tracing = { version = "0.61.1", path = "../forc-tracing" } +forc-tracing = { version = "0.61.2", path = "../forc-tracing" } fuel-tx = { workspace = true, features = ["serde"], optional = true } hex = "0.4.3" paste = "1.0.14" @@ -23,10 +23,10 @@ regex = "1.10.2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.73" serial_test = "3.0.0" -sway-core = { version = "0.61.1", path = "../sway-core" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-core = { version = "0.61.2", path = "../sway-core" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } tracing = "0.1" tracing-subscriber = { version = "0.3", features = [ "ansi", diff --git a/forc/Cargo.toml b/forc/Cargo.toml index 68450b9d517..b6be0c1991b 100644 --- a/forc/Cargo.toml +++ b/forc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "forc" -version = "0.61.1" +version = "0.61.2" description = "Fuel Orchestrator." authors.workspace = true edition.workspace = true @@ -23,20 +23,20 @@ anyhow = "1.0.41" clap = { version = "4.5.4", features = ["cargo", "derive", "env"] } clap_complete = "4.5.2" clap_complete_fig = "4.5.0" -forc-pkg = { version = "0.61.1", path = "../forc-pkg" } -forc-test = { version = "0.61.1", path = "../forc-test" } -forc-tracing = { version = "0.61.1", path = "../forc-tracing" } -forc-util = { version = "0.61.1", path = "../forc-util" } +forc-pkg = { version = "0.61.2", path = "../forc-pkg" } +forc-test = { version = "0.61.2", path = "../forc-test" } +forc-tracing = { version = "0.61.2", path = "../forc-tracing" } +forc-util = { version = "0.61.2", path = "../forc-util" } fs_extra = "1.2" fuel-asm = { workspace = true } hex = "0.4.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.73" -sway-core = { version = "0.61.1", path = "../sway-core" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-ir = { version = "0.61.1", path = "../sway-ir" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-core = { version = "0.61.2", path = "../sway-core" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-ir = { version = "0.61.2", path = "../sway-ir" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } term-table = "1.3" tokio = { version = "1.8.0", features = ["macros", "rt-multi-thread"] } toml = { version = "0.7", features = ["parse"] } diff --git a/sway-ast/Cargo.toml b/sway-ast/Cargo.toml index 4f181dbe11a..9f5cc592731 100644 --- a/sway-ast/Cargo.toml +++ b/sway-ast/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-ast" -version = "0.61.1" +version = "0.61.2" description = "Sway's AST" authors.workspace = true edition.workspace = true @@ -13,8 +13,8 @@ extension-trait = "1.0.1" num-bigint = { version = "0.4.3", features = ["serde"] } num-traits = "0.2.14" serde = { version = "1.0", features = ["derive"] } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-types = { version = "0.61.1", path = "../sway-types" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-types = { version = "0.61.2", path = "../sway-types" } [lints.clippy] iter_over_hash_type = "deny" diff --git a/sway-core/Cargo.toml b/sway-core/Cargo.toml index 0a13c9150b1..da12d8d10ab 100644 --- a/sway-core/Cargo.toml +++ b/sway-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-core" -version = "0.61.1" +version = "0.61.2" description = "Sway core language." authors.workspace = true edition.workspace = true @@ -39,12 +39,12 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.91" sha2 = "0.9" strum = { version = "0.24.1", features = ["derive"] } -sway-ast = { version = "0.61.1", path = "../sway-ast" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-ir = { version = "0.61.1", path = "../sway-ir" } -sway-parse = { version = "0.61.1", path = "../sway-parse" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-ast = { version = "0.61.2", path = "../sway-ast" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-ir = { version = "0.61.2", path = "../sway-ir" } +sway-parse = { version = "0.61.2", path = "../sway-parse" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } thiserror = "1.0" tracing = "0.1" uint = "0.9" diff --git a/sway-error/Cargo.toml b/sway-error/Cargo.toml index 7c261f03286..5f04e9713a7 100644 --- a/sway-error/Cargo.toml +++ b/sway-error/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-error" -version = "0.61.1" +version = "0.61.2" description = "Sway's error handling" authors.workspace = true edition.workspace = true @@ -13,7 +13,7 @@ either = "1.9.0" in_definite = "1.0.0" num-traits = "0.2.14" smallvec = "1.7" -sway-types = { version = "0.61.1", path = "../sway-types" } +sway-types = { version = "0.61.2", path = "../sway-types" } thiserror = "1.0" uwuify = { version = "^0.2", optional = true } diff --git a/sway-ir/Cargo.toml b/sway-ir/Cargo.toml index 54dc12c9fd0..e3d9def0d58 100644 --- a/sway-ir/Cargo.toml +++ b/sway-ir/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-ir" -version = "0.61.1" +version = "0.61.2" description = "Sway intermediate representation." authors.workspace = true edition.workspace = true @@ -19,9 +19,9 @@ peg = "0.7" prettydiff = "0.6.4" rustc-hash = "1.1.0" slotmap = "1.0.7" -sway-ir-macros = { version = "0.61.1", path = "sway-ir-macros" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-ir-macros = { version = "0.61.2", path = "sway-ir-macros" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } [lints.clippy] iter_over_hash_type = "deny" diff --git a/sway-ir/sway-ir-macros/Cargo.toml b/sway-ir/sway-ir-macros/Cargo.toml index 36de3847a5f..e929e859e5b 100644 --- a/sway-ir/sway-ir-macros/Cargo.toml +++ b/sway-ir/sway-ir-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-ir-macros" -version = "0.61.1" +version = "0.61.2" description = "Macros for sway's intermediate representation." authors.workspace = true edition.workspace = true diff --git a/sway-lsp/Cargo.toml b/sway-lsp/Cargo.toml index ca9c1f3615c..1ba2c297671 100644 --- a/sway-lsp/Cargo.toml +++ b/sway-lsp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-lsp" -version = "0.61.1" +version = "0.61.2" description = "LSP server for Sway." authors.workspace = true edition.workspace = true @@ -13,9 +13,9 @@ anyhow = "1.0.41" crossbeam-channel = "0.5" dashmap = "5.4" fd-lock = "4.0" -forc-pkg = { version = "0.61.1", path = "../forc-pkg" } -forc-tracing = { version = "0.61.1", path = "../forc-tracing" } -forc-util = { version = "0.61.1", path = "../forc-util" } +forc-pkg = { version = "0.61.2", path = "../forc-pkg" } +forc-tracing = { version = "0.61.2", path = "../forc-tracing" } +forc-util = { version = "0.61.2", path = "../forc-util" } indexmap = { version = "2.0.0", features = ["rayon"] } lsp-types = { version = "0.94", features = ["proposed"] } notify = "5.0.0" @@ -28,13 +28,13 @@ rayon-cond = "0.3" ropey = "1.2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.60" -sway-ast = { version = "0.61.1", path = "../sway-ast" } -sway-core = { version = "0.61.1", path = "../sway-core" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-parse = { version = "0.61.1", path = "../sway-parse" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } -swayfmt = { version = "0.61.1", path = "../swayfmt" } +sway-ast = { version = "0.61.2", path = "../sway-ast" } +sway-core = { version = "0.61.2", path = "../sway-core" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-parse = { version = "0.61.2", path = "../sway-parse" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } +swayfmt = { version = "0.61.2", path = "../swayfmt" } syn = { version = "1.0.73", features = ["full"] } tempfile = "3" thiserror = "1.0.30" diff --git a/sway-parse/Cargo.toml b/sway-parse/Cargo.toml index 225f04d1d58..4998f1a1089 100644 --- a/sway-parse/Cargo.toml +++ b/sway-parse/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-parse" -version = "0.61.1" +version = "0.61.2" description = "Sway's parser" authors.workspace = true edition.workspace = true @@ -13,9 +13,9 @@ extension-trait = "1.0.1" num-bigint = "0.4.3" num-traits = "0.2.14" phf = { version = "0.10.1", features = ["macros"] } -sway-ast = { version = "0.61.1", path = "../sway-ast" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-types = { version = "0.61.1", path = "../sway-types" } +sway-ast = { version = "0.61.2", path = "../sway-ast" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-types = { version = "0.61.2", path = "../sway-types" } thiserror = "1.0" unicode-bidi = "0.3.13" unicode-xid = "0.2.2" diff --git a/sway-types/Cargo.toml b/sway-types/Cargo.toml index df888332f6c..fa69a28bab0 100644 --- a/sway-types/Cargo.toml +++ b/sway-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-types" -version = "0.61.1" +version = "0.61.2" description = "Sway core types." authors.workspace = true edition.workspace = true @@ -20,7 +20,7 @@ num-traits = "0.2.16" parking_lot = "0.12" rustc-hash = "1.1.0" serde = { version = "1.0", features = ["derive"] } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } thiserror = "1" [features] diff --git a/sway-utils/Cargo.toml b/sway-utils/Cargo.toml index 896fab71c4d..f7cd08b53db 100644 --- a/sway-utils/Cargo.toml +++ b/sway-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sway-utils" -version = "0.61.1" +version = "0.61.2" description = "Sway common utils." authors.workspace = true edition.workspace = true diff --git a/swayfmt/Cargo.toml b/swayfmt/Cargo.toml index 5404c9aef71..9ccc70928dd 100644 --- a/swayfmt/Cargo.toml +++ b/swayfmt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "swayfmt" -version = "0.61.1" +version = "0.61.2" description = "Sway language formatter." authors.workspace = true edition.workspace = true @@ -10,16 +10,16 @@ repository.workspace = true [dependencies] anyhow = "1" -forc-tracing = { version = "0.61.1", path = "../forc-tracing" } +forc-tracing = { version = "0.61.2", path = "../forc-tracing" } ropey = "1.5" serde = { version = "1.0", features = ["derive"] } serde_ignored = "0.1.9" -sway-ast = { version = "0.61.1", path = "../sway-ast" } -sway-core = { version = "0.61.1", path = "../sway-core" } -sway-error = { version = "0.61.1", path = "../sway-error" } -sway-parse = { version = "0.61.1", path = "../sway-parse" } -sway-types = { version = "0.61.1", path = "../sway-types" } -sway-utils = { version = "0.61.1", path = "../sway-utils" } +sway-ast = { version = "0.61.2", path = "../sway-ast" } +sway-core = { version = "0.61.2", path = "../sway-core" } +sway-error = { version = "0.61.2", path = "../sway-error" } +sway-parse = { version = "0.61.2", path = "../sway-parse" } +sway-types = { version = "0.61.2", path = "../sway-types" } +sway-utils = { version = "0.61.2", path = "../sway-utils" } thiserror = "1.0.30" toml = { version = "0.7", features = ["parse"] } From b7918e5ad97dc84a1a99ae2ad0fa79e3f7822494 Mon Sep 17 00:00:00 2001 From: Sophie Dankel <47993817+sdankel@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:47:42 -0700 Subject: [PATCH 04/19] feat: Print the formatted bytecode size on forc build (#6214) ## Description Users can see the bytecode size for every compiled package using the `--verbose` flag with `forc build`. The PR makes it so they see the total bytecode size by default without verbose mode in the `Finished` status message. For workspaces, the bytecode size is the sum of all of the built packages' bytecode. ![image](https://github.com/FuelLabs/sway/assets/47993817/5a09337f-95e8-4157-b9da-28371fb95a1e) ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --- Cargo.lock | 196 +++++++++++++++++++++++++++++++++++++++++++- forc-pkg/Cargo.toml | 1 + forc-pkg/src/pkg.rs | 21 ++++- 3 files changed, 212 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e0426aafd6..5a425fe4af9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,6 +38,17 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -490,6 +501,30 @@ dependencies = [ "generic-array", ] +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.66", + "syn_derive", +] + [[package]] name = "bs58" version = "0.5.1" @@ -523,6 +558,39 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +[[package]] +name = "byte-unit" +version = "5.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ac19bdf0b2665407c39d82dbc937e951e7e2001609f0fb32edd0af45a2d63e" +dependencies = [ + "rust_decimal", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytecount" version = "0.6.8" @@ -570,6 +638,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.38" @@ -1753,7 +1827,7 @@ dependencies = [ "sha2 0.10.8", "sha3", "thiserror", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -2137,6 +2211,7 @@ version = "0.61.2" dependencies = [ "ansi_term", "anyhow", + "byte-unit", "cid", "forc-tracing 0.61.2", "forc-util", @@ -3008,7 +3083,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a6ad932c6dd3cfaf16b66754a42f87bbeefd591530c4b6a8334270a7df3e853" dependencies = [ - "ahash", + "ahash 0.8.11", "petgraph", "thiserror", ] @@ -3097,6 +3172,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] [[package]] name = "hashbrown" @@ -3104,7 +3182,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.11", ] [[package]] @@ -3113,7 +3191,7 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash", + "ahash 0.8.11", "allocator-api2", "serde", ] @@ -5235,6 +5313,26 @@ version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "ptyprocess" version = "0.4.1" @@ -5490,6 +5588,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.11.27" @@ -5632,6 +5739,35 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid 1.9.1", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rlp" version = "0.5.2" @@ -5709,6 +5845,22 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rust_decimal" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +dependencies = [ + "arrayvec 0.7.4", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -5970,6 +6122,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b84345e4c9bd703274a082fb80caaa99b7612be48dfaa1dd9266577ec412309d" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "sec1" version = "0.7.3" @@ -6289,6 +6447,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "similar" version = "2.5.0" @@ -6789,6 +6953,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -7690,6 +7866,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf8-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + [[package]] name = "utf8parse" version = "0.2.2" @@ -7706,6 +7888,12 @@ dependencies = [ "serde", ] +[[package]] +name = "uuid" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" + [[package]] name = "uwuify" version = "0.2.2" diff --git a/forc-pkg/Cargo.toml b/forc-pkg/Cargo.toml index f4211d4b1a0..dc8364cc648 100644 --- a/forc-pkg/Cargo.toml +++ b/forc-pkg/Cargo.toml @@ -11,6 +11,7 @@ repository.workspace = true [dependencies] ansi_term = "0.12" anyhow = "1" +byte-unit = "5.1.4" cid = "0.10" forc-tracing = { version = "0.61.2", path = "../forc-tracing" } forc-util = { version = "0.61.2", path = "../forc-util" } diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index fda1ec4d2c1..bf5baadbf6e 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -9,6 +9,7 @@ use crate::{ BuildProfile, }; use anyhow::{anyhow, bail, Context, Error, Result}; +use byte_unit::{Byte, UnitType}; use forc_tracing::{println_action_green, println_warning}; use forc_util::{ default_output_directory, find_file_name, kebab_to_snake_case, print_compiling, @@ -497,7 +498,11 @@ impl BuiltPackage { let json_abi_path = output_dir.join(program_abi_stem).with_extension("json"); self.write_json_abi(&json_abi_path, minify)?; - debug!(" Bytecode size: {} bytes", self.bytecode.bytes.len()); + debug!( + " Bytecode size: {} bytes ({})", + self.bytecode.bytes.len(), + format_bytecode_size(self.bytecode.bytes.len()) + ); // Additional ops required depending on the program type match self.tree_type { TreeType::Contract => { @@ -2107,6 +2112,12 @@ fn profile_target_string(profile_name: &str, build_target: &BuildTarget) -> Stri }; format!("{profile_name} [{}] target(s)", targets.join(" + ")) } +/// Returns the size of the bytecode in a human-readable format. +pub fn format_bytecode_size(bytes_len: usize) -> String { + let size = Byte::from_u64(bytes_len as u64); + let adjusted_byte = size.get_appropriate_unit(UnitType::Decimal); + adjusted_byte.to_string() +} /// Check if the given node is a contract dependency of any node in the graph. fn is_contract_dependency(graph: &Graph, node: NodeIx) -> bool { @@ -2173,12 +2184,17 @@ pub fn build_with_options(build_options: &BuildOpts) -> Result { }, )?; let output_dir = pkg.output_directory.as_ref().map(PathBuf::from); + let total_size = built_packages + .iter() + .map(|(_, pkg)| pkg.bytecode.bytes.len()) + .sum::(); println_action_green( "Finished", &format!( - "{} in {:.2}s", + "{} [{}] in {:.2}s", profile_target_string(&build_profile.name, build_target), + format_bytecode_size(total_size), build_start.elapsed().as_secs_f32() ), ); @@ -2294,6 +2310,7 @@ pub fn build( let mut lib_namespace_map = HashMap::default(); let mut compiled_contract_deps = HashMap::new(); + for &node in plan .compilation_order .iter() From acded67b3ec77ce1753356ad46f7ae17290f2ee0 Mon Sep 17 00:00:00 2001 From: Vaivaswatha N Date: Thu, 4 Jul 2024 19:20:37 +0530 Subject: [PATCH 05/19] Inliner shouldn't inline a function into itself (#6218) Also update the testsuite inliner predicate to respect inline annotations. Closes #6149 --- sway-ir/src/optimize/inline.rs | 10 +++- sway-ir/tests/inline/recursive-1.ir | 71 +++++++++++++++++++++++++++++ sway-ir/tests/tests.rs | 26 +++++++---- 3 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 sway-ir/tests/inline/recursive-1.ir diff --git a/sway-ir/src/optimize/inline.rs b/sway-ir/src/optimize/inline.rs index b4ef08d3155..4a3e97302f6 100644 --- a/sway-ir/src/optimize/inline.rs +++ b/sway-ir/src/optimize/inline.rs @@ -35,12 +35,12 @@ pub fn create_fn_inline_pass() -> Pass { /// This is a copy of sway_core::inline::Inline. /// TODO: Reuse: Depend on sway_core? Move it to sway_types? #[derive(Debug)] -enum Inline { +pub enum Inline { Always, Never, } -fn metadata_to_inline(context: &Context, md_idx: Option) -> Option { +pub fn metadata_to_inline(context: &Context, md_idx: Option) -> Option { fn for_each_md_idx Option>( context: &Context, md_idx: Option, @@ -189,6 +189,12 @@ pub fn inline_some_function_calls bool>( for call_site in &call_sites { let call_site_in = call_data.get(call_site).unwrap(); let (block, inlined_function) = *call_site_in.borrow(); + + if function == &inlined_function { + // We can't inline a function into itself. + continue; + } + inline_function_call( context, *function, diff --git a/sway-ir/tests/inline/recursive-1.ir b/sway-ir/tests/inline/recursive-1.ir new file mode 100644 index 00000000000..b7dc13d62f3 --- /dev/null +++ b/sway-ir/tests/inline/recursive-1.ir @@ -0,0 +1,71 @@ +// +// regex: VAR=v\d+ +// regex: LABEL=[[:alpha:]0-9_]+ +// regex: PING=(ping|id_from_ping) +// regex: PONG=(pong|id_from_pong) +script { + + fn id_from_foo(b: u64) -> u64, !1 { + entry(b: u64): + ret u64 b + } + + // check: fn foo + fn foo(b: u64) -> u64 { + entry(b: u64): + + // check: call id_from_foo + v1 = call id_from_foo(b) + // check: call foo + v0 = call foo(v1) + ret u64 v0 + } + + fn id_from_ping(b: u64) -> u64, !1 { + entry(b: u64): + ret u64 b + } + + fn id_from_pong(b: u64) -> u64, !1 { + entry(b: u64): + ret u64 b + } + + // check: fn main + fn main() -> u64 { + entry(): + + v0 = const u64 11 + // check: call foo + v1 = call foo(v0) + + // check: $PING + v2 = call ping(v1) + v3 = add v1, v2 + + ret u64 v3 + } + + // check: fn ping + fn ping(b: u64) -> u64 { + entry(b: u64): + + // check: id_from_ping + v1 = call id_from_ping(b) + v0 = call pong(v1) + ret u64 v0 + } + + // check: fn pong + fn pong(b: u64) -> u64 { + entry(b: u64): + + // check: $PONG + v1 = call id_from_pong(b) + v0 = call ping(v1) + ret u64 v0 + } + +} + +!1 = inline "never" diff --git a/sway-ir/tests/tests.rs b/sway-ir/tests/tests.rs index ed7a745ad73..54bc88176c4 100644 --- a/sway-ir/tests/tests.rs +++ b/sway-ir/tests/tests.rs @@ -5,9 +5,10 @@ use sway_ir::{ create_arg_demotion_pass, create_const_demotion_pass, create_const_folding_pass, create_dce_pass, create_dom_fronts_pass, create_dominators_pass, create_escaped_symbols_pass, create_mem2reg_pass, create_memcpyopt_pass, create_misc_demotion_pass, create_postorder_pass, - create_ret_demotion_pass, create_simplify_cfg_pass, optimize as opt, register_known_passes, - Context, ExperimentalFlags, IrError, PassGroup, PassManager, DCE_NAME, FN_DCE_NAME, - FN_DEDUP_DEBUG_PROFILE_NAME, FN_DEDUP_RELEASE_PROFILE_NAME, MEM2REG_NAME, SROA_NAME, + create_ret_demotion_pass, create_simplify_cfg_pass, metadata_to_inline, optimize as opt, + register_known_passes, Context, ExperimentalFlags, Function, IrError, PassGroup, PassManager, + Value, DCE_NAME, FN_DCE_NAME, FN_DEDUP_DEBUG_PROFILE_NAME, FN_DEDUP_RELEASE_PROFILE_NAME, + MEM2REG_NAME, SROA_NAME, }; use sway_types::SourceEngine; @@ -201,13 +202,18 @@ fn inline() { ); funcs.into_iter().fold(false, |acc, func| { - opt::inline_some_function_calls( - ir, - &func, - opt::is_small_fn(max_blocks, max_instrs, max_stack), - ) - .unwrap() - || acc + let predicate = |context: &Context, function: &Function, call_site: &Value| { + let attributed_inline = + metadata_to_inline(context, function.get_metadata(context)); + match attributed_inline { + Some(opt::Inline::Never) => false, + Some(opt::Inline::Always) => true, + None => (opt::is_small_fn(max_blocks, max_instrs, max_stack))( + context, function, call_site, + ), + } + }; + opt::inline_some_function_calls(ir, &func, predicate).unwrap() || acc }) } }) From 00a9254767c467194943146fa81aad3d8cb0dd53 Mon Sep 17 00:00:00 2001 From: Daniel Frederico Lins Leite Date: Fri, 5 Jul 2024 01:22:36 +0100 Subject: [PATCH 06/19] better error and dca for configurables (#6121) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description This PR closes https://github.com/FuelLabs/sway/issues/6118. If for some reason an older `core` ends up being used, we now warn with a more user-friendly error. ``` error: Configurables need a function named "abi_decode_in_place" to be in scope. --> /home/xunilrj/github/sway/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw:42:5 | ... 42 | ARRAY_BOOL: [bool; 3] = [true, false, true], | ^^^^^^^^^^ | = help: Certify you are accessing a compatible version of the "core" library. ____ ``` We also use a better span when warning about unused configurables. ``` warning --> /home/xunilrj/github/sway/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw:47:5 | 45 | 46 | 47 | NOT_USED: u8 = 1, | -------- This declaration is never used. 48 | #[allow(dead_code)] 49 | NOT_USED_BUT_ALLOWED: u8 = 2, | ____ Compiled script "configurable_consts" with 1 warning. ``` ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [x] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --------- Co-authored-by: Sophie Dankel <47993817+sdankel@users.noreply.github.com> Co-authored-by: Igor Rončević Co-authored-by: Joshua Batty --- .../dead_code_analysis.rs | 30 ++- .../parsed/declaration/configurable.rs | 1 + .../ast_node/declaration/configurable.rs | 57 ++-- .../ast_node/declaration/declaration.rs | 16 +- .../to_parsed_lang/convert_parse_tree.rs | 4 + sway-error/src/error.rs | 16 ++ sway-error/src/handler.rs | 19 ++ .../language/configurable_consts/Forc.lock | 16 +- .../json_abi_oracle_new_encoding.json | 249 +----------------- .../language/configurable_consts/src/main.sw | 81 +----- .../language/configurable_consts/test.toml | 3 + 11 files changed, 131 insertions(+), 361 deletions(-) diff --git a/sway-core/src/control_flow_analysis/dead_code_analysis.rs b/sway-core/src/control_flow_analysis/dead_code_analysis.rs index 4148dbca965..b532f21f8e1 100644 --- a/sway-core/src/control_flow_analysis/dead_code_analysis.rs +++ b/sway-core/src/control_flow_analysis/dead_code_analysis.rs @@ -4,8 +4,8 @@ use crate::{ language::{ parsed::TreeType, ty::{ - self, ConstantDecl, FunctionDecl, ProjectionKind, StructDecl, TraitDecl, TyAstNode, - TyAstNodeContent, TyDecl, TyImplItem, TypeAliasDecl, + self, ConfigurableDecl, ConstantDecl, FunctionDecl, ProjectionKind, StructDecl, + TraitDecl, TyAstNode, TyAstNodeContent, TyDecl, TyImplItem, TypeAliasDecl, }, CallPath, Visibility, }, @@ -81,6 +81,11 @@ fn is_entry_point(node: &TyAstNode, decl_engine: &DeclEngine, tree_type: &TreeTy let decl = decl_engine.get_constant(decl_id); decl.visibility.is_public() } + TyAstNode { + content: + TyAstNodeContent::Declaration(TyDecl::ConfigurableDecl(ConfigurableDecl { .. })), + .. + } => false, TyAstNode { content: TyAstNodeContent::Declaration(TyDecl::TypeAliasDecl(TypeAliasDecl { @@ -567,11 +572,18 @@ fn connect_declaration<'eng: 'cfg, 'cfg>( ty::TyDecl::ConfigurableDecl(ty::ConfigurableDecl { decl_id, .. }) => { let config_decl = decl_engine.get_configurable(decl_id); let ty::TyConfigurableDecl { - call_path, value, .. + call_path, + value, + type_ascription, + .. } = &*config_decl; + graph .namespace .insert_configurable(call_path.suffix.clone(), entry_node); + + connect_type_id(engines, type_ascription.type_id, graph, entry_node)?; + if let Some(value) = &value { connect_expression( engines, @@ -579,7 +591,7 @@ fn connect_declaration<'eng: 'cfg, 'cfg>( graph, &[entry_node], exit_node, - "constant declaration expression", + "configurable declaration expression", tree_type, value.span.clone(), options, @@ -2308,6 +2320,16 @@ fn construct_dead_code_warning_from_node( span: decl_engine.get_constant(decl_id).name().span(), warning_content: Warning::DeadDeclaration, }, + ty::TyAstNode { + content: + ty::TyAstNodeContent::Declaration(ty::TyDecl::ConfigurableDecl(ty::ConfigurableDecl { + decl_id, + })), + .. + } => CompileWarning { + span: decl_engine.get_configurable(decl_id).name().span(), + warning_content: Warning::DeadDeclaration, + }, ty::TyAstNode { content: ty::TyAstNodeContent::Declaration(ty::TyDecl::VariableDecl(decl)), span, diff --git a/sway-core/src/language/parsed/declaration/configurable.rs b/sway-core/src/language/parsed/declaration/configurable.rs index 9a269e64680..c28eb1c2122 100644 --- a/sway-core/src/language/parsed/declaration/configurable.rs +++ b/sway-core/src/language/parsed/declaration/configurable.rs @@ -13,6 +13,7 @@ pub struct ConfigurableDeclaration { pub value: Option, pub visibility: Visibility, pub span: Span, + pub block_keyword_span: Span, } impl Named for ConfigurableDeclaration { diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/configurable.rs b/sway-core/src/semantic_analysis/ast_node/declaration/configurable.rs index 7056a0a2988..f8ab7a73f67 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/configurable.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/configurable.rs @@ -1,6 +1,7 @@ use std::collections::VecDeque; use sway_error::{ + error::CompileError, handler::{ErrorEmitted, Handler}, warning::{CompileWarning, Warning}, }; @@ -33,6 +34,7 @@ impl ty::TyConfigurableDecl { value, attributes, visibility, + block_keyword_span, } = decl; type_ascription.type_id = ctx @@ -84,26 +86,43 @@ impl ty::TyConfigurableDecl { .insert(engines, TypeInfo::RawUntypedSlice, None), ); - let (decode_fn_ref, _, _): (crate::decl_engine::DeclRefFunction, _, _) = - crate::TypeBinding::type_check( - &mut TypeBinding:: { - inner: CallPath { - prefixes: vec![], - suffix: sway_types::Ident::new_no_span("abi_decode_in_place".into()), - is_absolute: false, - }, - type_arguments: crate::TypeArgs::Regular(vec![TypeArgument { - type_id: type_ascription.type_id, - initial_type_id: type_ascription.type_id, - span: sway_types::Span::dummy(), - call_path_tree: None, - }]), - span: sway_types::Span::dummy(), + let value_span = value + .as_ref() + .map(|x| x.span.clone()) + .unwrap_or_else(|| span.clone()); + let abi_decode_in_place_handler = Handler::default(); + let r = crate::TypeBinding::type_check( + &mut TypeBinding:: { + inner: CallPath { + prefixes: vec![], + suffix: sway_types::Ident::new_with_override( + "abi_decode_in_place".into(), + value_span.clone(), + ), + is_absolute: false, }, - handler, - ctx.by_ref(), - ) - .unwrap(); + type_arguments: crate::TypeArgs::Regular(vec![TypeArgument { + type_id: type_ascription.type_id, + initial_type_id: type_ascription.type_id, + span: sway_types::Span::dummy(), + call_path_tree: None, + }]), + span: value_span.clone(), + }, + &abi_decode_in_place_handler, + ctx.by_ref(), + ); + + // Map expected errors to more understandable ones + handler.map_and_emit_errors_from(abi_decode_in_place_handler, |e| match e { + CompileError::SymbolNotFound { .. } => { + Some(CompileError::ConfigurableMissingAbiDecodeInPlace { + span: block_keyword_span.clone(), + }) + } + e => Some(e), + })?; + let (decode_fn_ref, _, _): (crate::decl_engine::DeclRefFunction, _, _) = r?; let mut decode_fn_decl = (*engines.de().get_function(&decode_fn_ref)).clone(); let decl_mapping = crate::TypeParameter::gather_decl_mapping_from_trait_constraints( diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs b/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs index 10c4bb9894c..8514f96d469 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs @@ -180,17 +180,15 @@ impl TyDecl { parsed::Declaration::ConfigurableDeclaration(decl_id) => { let decl = engines.pe().get_configurable(&decl_id).as_ref().clone(); let span = decl.span.clone(); - let config_decl = + let name = decl.name.clone(); + let typed_const_decl = match ty::TyConfigurableDecl::type_check(handler, ctx.by_ref(), decl) { - Ok(res) => res, - Err(err) => return Ok(ty::TyDecl::ErrorRecovery(span, err)), + Ok(config_decl) => { + ty::TyDecl::from(decl_engine.insert(config_decl.clone())) + } + Err(err) => ty::TyDecl::ErrorRecovery(span, err), }; - let typed_const_decl: ty::TyDecl = decl_engine.insert(config_decl.clone()).into(); - ctx.insert_symbol( - handler, - config_decl.name().clone(), - typed_const_decl.clone(), - )?; + ctx.insert_symbol(handler, name, typed_const_decl.clone())?; typed_const_decl } parsed::Declaration::TraitTypeDeclaration(decl_id) => { diff --git a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs index 8d24ef5760d..655b4be620c 100644 --- a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs +++ b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs @@ -1085,6 +1085,7 @@ fn item_configurable_to_configurable_declarations( }); } + let item_configurable_keyword_span = item_configurable.configurable_token.span(); let declarations: Vec> = item_configurable .fields .into_inner() @@ -1101,6 +1102,7 @@ fn item_configurable_to_configurable_declarations( engines, configurable_field.value, attributes, + item_configurable_keyword_span.clone(), )?)) }) .filter_map_ok(|decl| decl) @@ -2571,6 +2573,7 @@ fn configurable_field_to_configurable_declaration( engines: &Engines, configurable_field: sway_ast::ConfigurableField, attributes: AttributesMap, + item_configurable_keyword_span: Span, ) -> Result, ErrorEmitted> { let span = configurable_field.name.span(); @@ -2606,6 +2609,7 @@ fn configurable_field_to_configurable_declaration( visibility: Visibility::Public, attributes, span: span.clone(), + block_keyword_span: item_configurable_keyword_span, }; Ok(engines.pe().insert(config_decl)) } diff --git a/sway-error/src/error.rs b/sway-error/src/error.rs index 9cedd87e612..a2bec9fc219 100644 --- a/sway-error/src/error.rs +++ b/sway-error/src/error.rs @@ -964,6 +964,8 @@ pub enum CompileError { CouldNotGenerateEntryMissingImpl { ty: String, span: Span }, #[error("Only bool, u8, u16, u32, u64, u256, b256, string arrays and string slices can be used here.")] EncodingUnsupportedType { span: Span }, + #[error("Configurables need a function named \"abi_decode_in_place\" to be in scope.")] + ConfigurableMissingAbiDecodeInPlace { span: Span }, } impl std::convert::From for CompileError { @@ -1175,6 +1177,7 @@ impl Spanned for CompileError { CouldNotGenerateEntryMissingImpl { span, .. } => span.clone(), CannotBeEvaluatedToConfigurableSizeUnknown { span } => span.clone(), EncodingUnsupportedType { span } => span.clone(), + ConfigurableMissingAbiDecodeInPlace { span } => span.clone(), } } } @@ -2438,6 +2441,19 @@ impl ToDiagnostic for CompileError { }, } }, + ConfigurableMissingAbiDecodeInPlace { span } => Diagnostic { + reason: Some(Reason::new(code(1), "Configurables need a function named \"abi_decode_in_place\" to be in scope".to_string())), + issue: Issue::error( + source_engine, + span.clone(), + String::new() + ), + hints: vec![], + help: vec![ + "The function \"abi_decode_in_place\" is usually defined in the standard library module \"core::codec\".".into(), + "Verify that you are using a version of the \"core\" standard library that contains this function.".into(), + ], + }, _ => Diagnostic { // TODO: Temporary we use self here to achieve backward compatibility. // In general, self must not be used and will not be used once we diff --git a/sway-error/src/handler.rs b/sway-error/src/handler.rs index a9485d89c9a..e9bd370f1ef 100644 --- a/sway-error/src/handler.rs +++ b/sway-error/src/handler.rs @@ -106,6 +106,25 @@ impl Handler { { self.inner.borrow_mut().errors.retain(f) } + + // Map all errors from `other` into this handler. If any mapping returns `None` it is ignored. This + // method returns if any error was mapped or not. + pub fn map_and_emit_errors_from( + &self, + other: Handler, + mut f: impl FnMut(CompileError) -> Option, + ) -> Result<(), ErrorEmitted> { + let mut emitted = Ok(()); + + let (errs, _) = other.consume(); + for err in errs { + if let Some(err) = (f)(err) { + emitted = Err(self.emit_err(err)); + } + } + + emitted + } } /// Proof that an error was emitted through a `Handler`. diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/Forc.lock b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/Forc.lock index 842942b25da..17cc4b10427 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/Forc.lock +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/Forc.lock @@ -1,13 +1,13 @@ [[package]] -name = 'configurable_consts' -source = 'member' -dependencies = ['std'] +name = "configurable_consts" +source = "member" +dependencies = ["std"] [[package]] -name = 'core' -source = 'path+from-root-7F58364AF9C32FE1' +name = "core" +source = "path+from-root-7F58364AF9C32FE1" [[package]] -name = 'std' -source = 'path+from-root-7F58364AF9C32FE1' -dependencies = ['core'] +name = "std" +source = "path+from-root-7F58364AF9C32FE1" +dependencies = ["core"] diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json index 0f5917231cd..32f83d32de0 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json @@ -1,139 +1,13 @@ { "configurables": [ - { - "configurableType": { - "name": "", - "type": 5, - "typeArguments": null - }, - "name": "BOOL", - "offset": 6888 - }, - { - "configurableType": { - "name": "", - "type": 13, - "typeArguments": null - }, - "name": "U8", - "offset": 7024 - }, - { - "configurableType": { - "name": "", - "type": 13, - "typeArguments": null - }, - "name": "ANOTHER_U8", - "offset": 6816 - }, - { - "configurableType": { - "name": "", - "type": 9, - "typeArguments": null - }, - "name": "U16", - "offset": 6968 - }, - { - "configurableType": { - "name": "", - "type": 11, - "typeArguments": null - }, - "name": "U32", - "offset": 7008 - }, - { - "configurableType": { - "name": "", - "type": 11, - "typeArguments": null - }, - "name": "U64", - "offset": 7016 - }, - { - "configurableType": { - "name": "", - "type": 10, - "typeArguments": null - }, - "name": "U256", - "offset": 6976 - }, - { - "configurableType": { - "name": "", - "type": 4, - "typeArguments": null - }, - "name": "B256", - "offset": 6856 - }, - { - "configurableType": { - "name": "", - "type": 8, - "typeArguments": [] - }, - "name": "CONFIGURABLE_STRUCT", - "offset": 6928 - }, - { - "configurableType": { - "name": "", - "type": 6, - "typeArguments": [] - }, - "name": "CONFIGURABLE_ENUM_A", - "offset": 6896 - }, - { - "configurableType": { - "name": "", - "type": 6, - "typeArguments": [] - }, - "name": "CONFIGURABLE_ENUM_B", - "offset": 6912 - }, - { - "configurableType": { - "name": "", - "type": 2, - "typeArguments": null - }, - "name": "ARRAY_BOOL", - "offset": 6824 - }, - { - "configurableType": { - "name": "", - "type": 3, - "typeArguments": null - }, - "name": "ARRAY_U64", - "offset": 6832 - }, { "configurableType": { "name": "", "type": 1, "typeArguments": null }, - "name": "TUPLE_BOOL_U64", - "offset": 6952 - }, - { - "configurableType": { - "name": "", - "type": 7, - "typeArguments": null - }, - "name": "STR_4", - "offset": 6944 + "name": "BOOL", + "offset": 360 } ], "encoding": "1", @@ -158,127 +32,10 @@ "typeId": 0, "typeParameters": null }, - { - "components": [ - { - "name": "__tuple_element", - "type": 5, - "typeArguments": null - }, - { - "name": "__tuple_element", - "type": 12, - "typeArguments": null - } - ], - "type": "(_, _)", - "typeId": 1, - "typeParameters": null - }, - { - "components": [ - { - "name": "__array_element", - "type": 5, - "typeArguments": null - } - ], - "type": "[_; 3]", - "typeId": 2, - "typeParameters": null - }, - { - "components": [ - { - "name": "__array_element", - "type": 12, - "typeArguments": null - } - ], - "type": "[_; 3]", - "typeId": 3, - "typeParameters": null - }, - { - "components": null, - "type": "b256", - "typeId": 4, - "typeParameters": null - }, { "components": null, "type": "bool", - "typeId": 5, - "typeParameters": null - }, - { - "components": [ - { - "name": "A", - "type": 5, - "typeArguments": null - }, - { - "name": "B", - "type": 12, - "typeArguments": null - } - ], - "type": "enum ConfigurableEnum", - "typeId": 6, - "typeParameters": null - }, - { - "components": null, - "type": "str[4]", - "typeId": 7, - "typeParameters": null - }, - { - "components": [ - { - "name": "a", - "type": 5, - "typeArguments": null - }, - { - "name": "b", - "type": 12, - "typeArguments": null - } - ], - "type": "struct ConfigurableStruct", - "typeId": 8, - "typeParameters": null - }, - { - "components": null, - "type": "u16", - "typeId": 9, - "typeParameters": null - }, - { - "components": null, - "type": "u256", - "typeId": 10, - "typeParameters": null - }, - { - "components": null, - "type": "u32", - "typeId": 11, - "typeParameters": null - }, - { - "components": null, - "type": "u64", - "typeId": 12, - "typeParameters": null - }, - { - "components": null, - "type": "u8", - "typeId": 13, + "typeId": 1, "typeParameters": null } ] diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw index 6e0e94ba5e1..59a4d92df27 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw @@ -1,78 +1,9 @@ - script; - -use std::hash::*; - -struct ConfigurableStruct { - a: bool, - b: u64, -} - -enum ConfigurableEnum { - A: bool, - B: u64, -} +script; -impl core::ops::Eq for ConfigurableEnum { - fn eq(self, other: ConfigurableEnum) -> bool { - match (self, other) { - (ConfigurableEnum::A(inner1), ConfigurableEnum::A(inner2)) => inner1 == inner2, - (ConfigurableEnum::B(inner1), ConfigurableEnum::B(inner2)) => inner1 == inner2, - _ => false, - } - } +configurable { + BOOL: bool = true, } - -type AnotherU8 = u8; - - configurable { - BOOL: bool = true, - U8: u8 = 1, - ANOTHER_U8: AnotherU8 = 3, - U16: u16 = 2, - U32: u32 = 3, - U64: u32 = 4, - U256: u256 = 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu256, - B256: b256 = 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, - CONFIGURABLE_STRUCT: ConfigurableStruct = ConfigurableStruct { - a: true, - b: 5, - }, - CONFIGURABLE_ENUM_A: ConfigurableEnum = ConfigurableEnum::A(true), - CONFIGURABLE_ENUM_B: ConfigurableEnum = ConfigurableEnum::B(12), - ARRAY_BOOL: [bool; 3] = [true, false, true], - ARRAY_U64: [u64; 3] = [9, 8, 7], - TUPLE_BOOL_U64: (bool, u64) = (true, 11), - STR_4: str[4] = __to_str_array("abcd"), - } - fn main() { - assert(BOOL == true); - assert(U8 == 1); - assert(ANOTHER_U8 == 3); - assert(U16 == 2); - assert(U64 == 4); - assert(U256 == 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu256); - assert(B256 == 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB); - assert(CONFIGURABLE_STRUCT.a == true); - assert(CONFIGURABLE_STRUCT.b == 5); - assert(CONFIGURABLE_ENUM_A == ConfigurableEnum::A(true)); - assert(CONFIGURABLE_ENUM_B == ConfigurableEnum::B(12)); - assert(ARRAY_BOOL[0] == true); - assert(ARRAY_BOOL[1] == false); - assert(ARRAY_BOOL[2] == true); - assert(ARRAY_U64[0] == 9); - assert(ARRAY_U64[1] == 8); - assert(ARRAY_U64[2] == 7); - assert(TUPLE_BOOL_U64.0 == true); - assert(TUPLE_BOOL_U64.1 == 11); - assert(sha256_str_array(STR_4) == sha256("abcd")); - - // Assert address do not change - let addr_1 = asm(addr: __addr_of(&BOOL)) { - addr: u64 - }; - let addr_2 = asm(addr: __addr_of(&BOOL)) { - addr: u64 - }; - assert(addr_1 == addr_2); - } \ No newline at end of file +fn main() { + assert(BOOL == true); +} \ No newline at end of file diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml index be5373ea994..69ed91a1f33 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml @@ -4,3 +4,6 @@ expected_result_new_encoding = { action = "return_data", value = "" } validate_abi = true expected_warnings = 6 unsupported_profiles = ["debug"] + +# check: $()NOT_USED: u8 = 1 +# nextln: $()This declaration is never used From bcd1cf92d3695cc7d30710fd394e5e0f9ec79c5e Mon Sep 17 00:00:00 2001 From: Daniel Frederico Lins Leite Date: Fri, 5 Jul 2024 21:59:07 +0100 Subject: [PATCH 07/19] `match` for string slices (#6202) ## Description This PR implements `match` for string slices including radix trie optimization and is a task of https://github.com/FuelLabs/sway/issues/5110. For example a simple `match` like ``` fn return_match_on_str_slice(param: str) -> u64 { match param { "get_a" => { 1u64 }, "get_a_b" => { 2u64 }, "get_b" => { 3u64 }, _ => { 1000u64 }, } } ``` will generate code following this logic: ``` let packed_string = "get_a_b" if str.len() == 5 if str[0..4] == "get_" at packed_string[0] if str[4..5] == "b" at packed_string[6] return branch 2 if str[4..5] == "a" at packed_string[4] return branch 0 return wildcard branch return wildcard branch if str.len() == 7 if str[0..7] == "get_a_b" at packed_string[0] return branch 1 return wildcard branch return wildcard branch ``` In logical terms, this boils down to checking the length and an `O(N)` check on the string. Albeit the bytecode will be more complex because of all the branches. Another interesting optimization is the "packed string literal" that coalesces all "match arms string slices" into just one string. In the case above, given that one of the arms contains all the necessary strings for all other comparisons, we will create just one string literal. Saving a lot of bytes in the data section. The section below describes how `rustc` deals with this desugaring. I think these choices make more sense to us for two reasons: 1 - Avoid testing common prefixes multiple times will spend less gas in general (needs more testing); 2 - packing all strings will decrease the data section size. This is the bytecode generated in this case: ``` fn return_match_on_str_slice(param: str) -> u64 { match param { "get_a" => { 1u64 }, "get_a_b" => { 2u64 }, "get_b" => { 3u64 }, _ => { 1000u64 }, } } @ /home/xunilrj/github/sway/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/src/main.sw:22:1 0x0000017c PSHL 0xf ;; [149, 0, 0, 15] 0x00000180 PSHH 0x80000 ;; [150, 8, 0, 0] 0x00000184 MOVE R59 $sp ;; [26, 236, 80, 0] 0x00000188 CFEI 0x90 ;; [145, 0, 0, 144] 0x0000018c MOVE $writable R58 ;; [26, 67, 160, 0] 0x00000190 MOVE R19 R62 ;; [26, 79, 224, 0] match param { "get_a" => { 1u64 }, "get_a_b" => { 2u64 }, "get_b" => { 3u64 }, _ => { 1000u64 }, } @ /home/xunilrj/github/sway/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/src/main.sw:23:5 0x00000194 ADDI R17 R59 0x80 ;; 0x00000198 MOVI R18 0x10 ;; 0x0000019c MCP R17 $writable R18 ;; 0x000001a0 MOVI R17 0x7 ;; 0x7 = "get_a_b".len() @ :1:1 0x000001a4 LW $writable R59 0x11 ;; R59 + 0x11 = a.len() 0x000001a8 EQ $writable $writable R17 ;; a.len() == 0x7 0x000001ac JNZF $writable $zero 0x3c ;; if false jump to 2a0? 0x000001b0 MOVI R17 0x5 ;; we have two arms with length equals 0x5 0x000001b4 LW $writable R59 0x11 ;; R59 + 0x11 = a.len() 0x000001b8 EQ $writable $writable R17 ;; a.len() == 0x5 0x000001bc MOVI R17 0x3e8 ;; 0x3e8 = 1000 (wildcard return value) 0x000001c0 JNZF $writable $zero 0x1 ;; if true jump to 1c8 0x000001c4 JMPF $zero 0x35 ;; if false jump to 29c (will return R17) 0x000001c8 LW $writable R63 0x3 ;; R63 = start of data section, will load 13c 0x000001cc ADD $writable $writable $pc ;; $writable = 0x308 = packed strings 0x000001d0 ADDI R17 R59 0x20 ;; 0x000001d4 SW R59 $writable 0x4 ;; R59 + 0x4 = packed strings 0x000001d8 MOVI $writable 0x7 ;; 0x000001dc SW R59 $writable 0x5 ;; R59 + 0x5 = 0x7 0x000001e0 ADDI $writable R59 0x30 ;; 0x000001e4 MOVI R18 0x10 ;; 0x000001e8 MCP $writable R17 R18 ;; R59 + 0x30 = R59 + 0x20 0x000001ec MOVI R18 0x4 ;; 0x4 = "get_".len() 0x000001f0 LW $writable R59 0x10 ;; 0x000001f4 ADDI $writable $writable 0x0 ;; 0x000001f8 LW R17 R59 0x6 ;; R17 = a.ptr() 0x000001fc ADDI R17 R17 0x0 ;; 0x00000200 MEQ $writable $writable R17 R18 ;; a[0..4] = packed[0..4] 0x00000204 MOVI R17 0x3e8 ;; 0x3e8 = 1000 (wildcard return value) 0x00000208 JNZF $writable $zero 0x1 ;; if true jump to 210 0x0000020c JMPF $zero 0x23 ;; if false jump to 29c (will return R17) .... .data_section: 0x00000300 .bytes as hex ([]), len i0, as ascii "" 0x00000300 .word i18446744073709486084, as hex be bytes ([FF, FF, FF, FF, FF, FF, 00, 04]) 0x00000308 .bytes as hex ([67, 65, 74, 5F, 61, 5F, 62]), len i7, as ascii "get_a_b" 0x00000310 .word i500, as hex be bytes ([00, 00, 00, 00, 00, 00, 01, F4]) 0x00000318 .word i316, as hex be bytes ([00, 00, 00, 00, 00, 00, 01, 3C]) 0x00000320 .word i244, as hex be bytes ([00, 00, 00, 00, 00, 00, 00, F4]) 0x00000328 .word i176, as hex be bytes ([00, 00, 00, 00, 00, 00, 00, B0]) 0x00000330 .word i100, as hex be bytes ([00, 00, 00, 00, 00, 00, 00, 64]) ``` ## How `rustc` desugar `match` For comparison, this is the generated ASM with comments on how Rust tackles this. First, this is the function used: ``` #[inline(never)] fn f(a: &str) -> u64 { match a { "get_method" => 0, "get_tokens" => 1, "get_something_else" => 2, "get_tokens_2" => 3, "clear" => 4, "get_m" => 5, _ => 6, } } ``` This is the LLVM IR generated. There is a match on the length of each string slice arms. The valid range is (5, 18), everything outside of this is the wildcard match arm. This range will be important later. ``` efine internal fastcc noundef i64 @example::f::hdb860bcd6d383112(ptr noalias nocapture noundef nonnull readonly align 1 %a.0, i64 noundef %a.1) unnamed_addr { start: switch i64 %a.1, label %bb13 [ i64 10, label %"_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h510120b4d3581de7E.exit" i64 18, label %"_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h510120b4d3581de7E.exit30" i64 12, label %"_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h510120b4d3581de7E.exit35" i64 5, label %"_ZN73_$LT$$u5b$A$u5d$$u20$as$u20$core..slice..cmp..SlicePartialEq$LT$B$GT$$GT$5equal17h510120b4d3581de7E.exit40" ] ``` this is how "f" is called ``` mov rbx, qword ptr [rsp + 32] mov r14, qword ptr [rsp + 40] mov rsi, qword ptr [rsp + 48] <- length of the string slice mov rdi, r14 <- ptr to string slice call _ZN4main1f17h126a5dfd4e318ebcE ``` this is `f` body. `ja .LBB8_12` jumps into a simple return, returning EAX as 6. It is the wildcard return value. The cleverness of this is that when `RSI` is smaller than 5, it will become negative (because of `add rsi, -5`, wrapping into huge unsigned ints, and will also trigger `JA` (which stands for `Jump Above`), effectively jumping when the slice length is outside of the expected range which is (5, 18). After that, it uses a jump table based on the string length minus 5. Everywhere the string length is invalid, the jump address is `LBB8_12`., still returning `EAX` as 6. ``` _ZN4main1f17h126a5dfd4e318ebcE: .cfi_startproc mov eax, 6 add rsi, -5 cmp rsi, 13 ja .LBB8_12 lea rcx, [rip + .LJTI8_0] movsxd rdx, dword ptr [rcx + 4*rsi] add rdx, rcx jmp rdx ``` ``` .LBB8_12: ret ``` This is the jump table used: ``` .LJTI8_0: .long .LBB8_9-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_2-.LJTI8_0 <- 5th entry is length = 10 (remember we add -5 to the length) .long .LBB8_12-.LJTI8_0 .long .LBB8_8-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_12-.LJTI8_0 .long .LBB8_6-.LJTI8_0 ``` The interesting entry is entry 5, which has two strings: "get_method" and "get_tokens". Here we can see that `rust` actually compares the complete string slice twice. Even though they have an intersection. ``` .LBB8_2: movabs rcx, 7526752397670245735=6874656D5F746567="htem_teg" (inverted "get_meth") xor rcx, qword ptr [rdi] movzx edx, word ptr [rdi + 8] xor rdx, 25711=646F="do" (inverted "od") or rdx, rcx je .LBB8_3 movabs rcx, 7308057365947114855=656B6F745F746567="ekot_teg" (inverted "get_toke") xor rcx, qword ptr [rdi] movzx edx, word ptr [rdi + 8] xor rdx, 29550=736E="sn" (inverted "ns") or rdx, rcx je .LBB8_5 ``` ``` .LBB8_3: xor eax, eax <- returns 0 ret ``` ``` .LBB8_5: mov eax, 1 <- returns 1 ret ``` This is comparable to what `clang` is doing: https://github.com/rust-lang/rust/issues/61961 ## Code and Bytecode This PR also implements code printing when printing bytecode. For now this is only enable for tests. It gnerates something like: ``` match param { "get_a" => { 1u64 }, "get_a_b" => { 2u64 }, "get_b" => { 3u64 }, _ => { 1000u64 }, } @ /home/xunilrj/github/sway/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/src/main.sw:23:5 0x00000194 ADDI R17 R59 0x80 ;; 0x00000198 MOVI R18 0x10 ;; 0x0000019c MCP R17 $writable R18 ;; 0x000001a0 MOVI R17 0x7 ;; 0x7 = "get_a_b".len() @ :1:1 0x000001a4 LW $writable R59 0x11 ;; R59 + 0x11 = a.len() 0x000001a8 EQ $writable $writable R17 ;; a.len() == 0x7 ``` As we can see, not great, but helpful nonetheless. We can (should?) improve this by better "carrying" spans in all transformations and lowerings. ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --------- Co-authored-by: Joshua Batty Co-authored-by: IGI-111 --- forc-pkg/src/manifest/build_profile.rs | 5 + forc-pkg/src/pkg.rs | 8 +- forc-plugins/forc-client/src/op/deploy.rs | 1 + forc-plugins/forc-client/src/op/run/mod.rs | 1 + forc/src/cli/commands/test.rs | 1 + forc/src/ops/forc_build.rs | 1 + forc/src/ops/forc_contract_id.rs | 1 + forc/src/ops/forc_predicate_root.rs | 1 + sway-core/src/asm_generation/finalized_asm.rs | 107 +++- .../allocated_abstract_instruction_set.rs | 8 +- .../src/asm_generation/fuel/functions.rs | 6 +- sway-core/src/build_config.rs | 7 +- .../match_expression/analysis/usefulness.rs | 2 +- .../typed/typed_match_expression.rs | 533 +++++++++++++++++- .../ast_node/expression/typed_expression.rs | 8 +- sway-core/src/type_system/info.rs | 4 +- sway-ir/src/error.rs | 29 +- sway-ir/src/printer.rs | 47 +- sway-ir/src/verify.rs | 61 +- test/src/e2e_vm_tests/harness.rs | 1 + .../Forc.lock | 6 +- .../Forc.toml | 2 +- .../json_abi_oracle.json | 0 .../json_abi_oracle_new_encoding.json | 4 +- .../src/main.sw | 30 +- .../test.toml | 4 +- 26 files changed, 805 insertions(+), 73 deletions(-) rename test/src/e2e_vm_tests/test_programs/should_pass/language/{match_expressions => match_expressions_all}/Forc.lock (56%) rename test/src/e2e_vm_tests/test_programs/should_pass/language/{match_expressions => match_expressions_all}/Forc.toml (88%) rename test/src/e2e_vm_tests/test_programs/should_pass/language/{match_expressions => match_expressions_all}/json_abi_oracle.json (100%) rename test/src/e2e_vm_tests/test_programs/should_pass/language/{match_expressions => match_expressions_all}/json_abi_oracle_new_encoding.json (88%) rename test/src/e2e_vm_tests/test_programs/should_pass/language/{match_expressions => match_expressions_all}/src/main.sw (64%) rename test/src/e2e_vm_tests/test_programs/should_pass/language/{match_expressions => match_expressions_all}/test.toml (57%) diff --git a/forc-pkg/src/manifest/build_profile.rs b/forc-pkg/src/manifest/build_profile.rs index 0922ba59124..def146b7295 100644 --- a/forc-pkg/src/manifest/build_profile.rs +++ b/forc-pkg/src/manifest/build_profile.rs @@ -24,6 +24,8 @@ pub struct BuildProfile { #[serde(default)] pub print_bytecode: bool, #[serde(default)] + pub print_bytecode_spans: bool, + #[serde(default)] pub terse: bool, #[serde(default)] pub time_phases: bool, @@ -57,6 +59,7 @@ impl BuildProfile { print_ir: PrintIr::default(), print_asm: PrintAsm::default(), print_bytecode: false, + print_bytecode_spans: false, terse: false, time_phases: false, metrics_outfile: None, @@ -80,6 +83,7 @@ impl BuildProfile { print_ir: PrintIr::default(), print_asm: PrintAsm::default(), print_bytecode: false, + print_bytecode_spans: false, terse: false, time_phases: false, metrics_outfile: None, @@ -152,6 +156,7 @@ mod tests { print_ir: PrintIr::r#final(), print_asm: PrintAsm::all(), print_bytecode: true, + print_bytecode_spans: false, terse: true, time_phases: true, metrics_outfile: Some("metrics_outfile".into()), diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index bf5baadbf6e..c887cc68720 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -263,6 +263,8 @@ pub struct PrintOpts { pub asm: PrintAsm, /// Print the bytecode. This is the final output of the compiler. pub bytecode: bool, + /// Print the original source code together with bytecode. + pub bytecode_spans: bool, /// Print the generated Sway IR (Intermediate Representation). pub ir: PrintIr, /// Output build errors and warnings in reverse order. @@ -1557,7 +1559,10 @@ pub fn sway_build_config( .with_print_dca_graph(build_profile.print_dca_graph.clone()) .with_print_dca_graph_url_format(build_profile.print_dca_graph_url_format.clone()) .with_print_asm(build_profile.print_asm) - .with_print_bytecode(build_profile.print_bytecode) + .with_print_bytecode( + build_profile.print_bytecode, + build_profile.print_bytecode_spans, + ) .with_print_ir(build_profile.print_ir.clone()) .with_include_tests(build_profile.include_tests) .with_time_phases(build_profile.time_phases) @@ -2087,6 +2092,7 @@ fn build_profile_from_opts( profile.print_ir |= print.ir.clone(); profile.print_asm |= print.asm; profile.print_bytecode |= print.bytecode; + profile.print_bytecode_spans |= print.bytecode_spans; profile.terse |= pkg.terse; profile.time_phases |= time_phases; if profile.metrics_outfile.is_none() { diff --git a/forc-plugins/forc-client/src/op/deploy.rs b/forc-plugins/forc-client/src/op/deploy.rs index bb7a95cc549..e8a33e9644a 100644 --- a/forc-plugins/forc-client/src/op/deploy.rs +++ b/forc-plugins/forc-client/src/op/deploy.rs @@ -355,6 +355,7 @@ fn build_opts_from_cmd(cmd: &cmd::Deploy) -> pkg::BuildOpts { dca_graph_url_format: cmd.print.dca_graph_url_format.clone(), asm: cmd.print.asm(), bytecode: cmd.print.bytecode, + bytecode_spans: false, ir: cmd.print.ir(), reverse_order: cmd.print.reverse_order, }, diff --git a/forc-plugins/forc-client/src/op/run/mod.rs b/forc-plugins/forc-client/src/op/run/mod.rs index 317afd80687..49047de3a37 100644 --- a/forc-plugins/forc-client/src/op/run/mod.rs +++ b/forc-plugins/forc-client/src/op/run/mod.rs @@ -231,6 +231,7 @@ fn build_opts_from_cmd(cmd: &cmd::Run) -> pkg::BuildOpts { dca_graph_url_format: cmd.print.dca_graph_url_format.clone(), asm: cmd.print.asm(), bytecode: cmd.print.bytecode, + bytecode_spans: false, ir: cmd.print.ir(), reverse_order: cmd.print.reverse_order, }, diff --git a/forc/src/cli/commands/test.rs b/forc/src/cli/commands/test.rs index 86387522029..34245c803df 100644 --- a/forc/src/cli/commands/test.rs +++ b/forc/src/cli/commands/test.rs @@ -242,6 +242,7 @@ fn opts_from_cmd(cmd: Command) -> forc_test::TestOpts { dca_graph_url_format: cmd.build.print.dca_graph_url_format.clone(), asm: cmd.build.print.asm(), bytecode: cmd.build.print.bytecode, + bytecode_spans: false, ir: cmd.build.print.ir(), reverse_order: cmd.build.print.reverse_order, }, diff --git a/forc/src/ops/forc_build.rs b/forc/src/ops/forc_build.rs index 35a03b611a7..91e316c37ba 100644 --- a/forc/src/ops/forc_build.rs +++ b/forc/src/ops/forc_build.rs @@ -26,6 +26,7 @@ fn opts_from_cmd(cmd: BuildCommand) -> pkg::BuildOpts { dca_graph_url_format: cmd.build.print.dca_graph_url_format.clone(), asm: cmd.build.print.asm(), bytecode: cmd.build.print.bytecode, + bytecode_spans: false, ir: cmd.build.print.ir(), reverse_order: cmd.build.print.reverse_order, }, diff --git a/forc/src/ops/forc_contract_id.rs b/forc/src/ops/forc_contract_id.rs index 3a6d975ac40..51e9a7cd708 100644 --- a/forc/src/ops/forc_contract_id.rs +++ b/forc/src/ops/forc_contract_id.rs @@ -61,6 +61,7 @@ fn build_opts_from_cmd(cmd: &ContractIdCommand) -> pkg::BuildOpts { dca_graph_url_format: cmd.print.dca_graph_url_format.clone(), asm: cmd.print.asm(), bytecode: cmd.print.bytecode, + bytecode_spans: false, ir: cmd.print.ir(), reverse_order: cmd.print.reverse_order, }, diff --git a/forc/src/ops/forc_predicate_root.rs b/forc/src/ops/forc_predicate_root.rs index febf7b96ca6..efca0f92bec 100644 --- a/forc/src/ops/forc_predicate_root.rs +++ b/forc/src/ops/forc_predicate_root.rs @@ -30,6 +30,7 @@ fn build_opts_from_cmd(cmd: PredicateRootCommand) -> pkg::BuildOpts { dca_graph_url_format: cmd.print.dca_graph_url_format.clone(), asm: cmd.print.asm(), bytecode: cmd.print.bytecode, + bytecode_spans: false, ir: cmd.print.ir(), reverse_order: cmd.print.reverse_order, }, diff --git a/sway-core/src/asm_generation/finalized_asm.rs b/sway-core/src/asm_generation/finalized_asm.rs index 2fc0fe4326d..c3304b4fd53 100644 --- a/sway-core/src/asm_generation/finalized_asm.rs +++ b/sway-core/src/asm_generation/finalized_asm.rs @@ -4,6 +4,7 @@ use super::{ fuel::{checks, data_section::DataSection}, ProgramABI, ProgramKind, }; +use crate::asm_generation::fuel::data_section::{DataId, Datum, Entry}; use crate::asm_lang::allocated_ops::{AllocatedOp, AllocatedOpcode}; use crate::decl_engine::DeclRefFunction; use crate::source_map::SourceMap; @@ -151,6 +152,13 @@ fn to_bytecode_mut( println!(";; --- START OF TARGET BYTECODE ---\n"); } + let mut last_span = None; + let mut indentation = if build_config.print_bytecode_spans { + 4 + } else { + 0 + }; + let mut half_word_ix = 0; let mut offset_from_instr_start = 0; for op in ops.iter() { @@ -165,7 +173,7 @@ fn to_bytecode_mut( match fuel_op { Either::Right(data) => { if build_config.print_bytecode { - print!("{:#010x} ", bytecode.len()); + print!("{}{:#010x} ", " ".repeat(indentation), bytecode.len()); println!( " ;; {:?}", data @@ -181,8 +189,45 @@ fn to_bytecode_mut( } Either::Left(instructions) => { for instruction in instructions { + // Print original source span only once + if build_config.print_bytecode_spans { + last_span = match (last_span, &span) { + (None, Some(span)) => { + indentation = 4; + let line_col = span.start_pos().line_col(); + println!( + "{} @ {}:{}:{}", + span.as_str(), + span.source_id() + .map(|source_id| source_engine.get_path(source_id)) + .map(|x| x.display().to_string()) + .unwrap_or("".to_string()), + line_col.line, + line_col.col + ); + Some(span.clone()) + } + (Some(last), Some(span)) if last != *span => { + indentation = 4; + let line_col = span.start_pos().line_col(); + println!( + "{} @ {}:{}:{}", + span.as_str(), + span.source_id() + .map(|source_id| source_engine.get_path(source_id)) + .map(|x| x.display().to_string()) + .unwrap_or("".to_string()), + line_col.line, + line_col.col + ); + Some(span.clone()) + } + (last, _) => last, + }; + } + if build_config.print_bytecode { - print!("{:#010x} ", bytecode.len()); + print!("{}{:#010x} ", " ".repeat(indentation), bytecode.len()); print_instruction(&instruction); } @@ -202,8 +247,64 @@ fn to_bytecode_mut( } } } + if build_config.print_bytecode { - println!("{}", data_section); + println!(".data_section:"); + + let offset = bytecode.len(); + + fn print_entry(indentation: usize, offset: usize, pair: &Entry) { + print!("{}{:#010x} ", " ".repeat(indentation), offset); + + match &pair.value { + Datum::Byte(w) => println!(".byte i{w}, as hex {w:02X}"), + Datum::Word(w) => { + println!(".word i{w}, as hex be bytes ({:02X?})", w.to_be_bytes()) + } + Datum::ByteArray(bs) => { + print!(".bytes as hex ({bs:02X?}), len i{}, as ascii \"", bs.len()); + + for b in bs { + print!( + "{}", + if *b == b' ' || b.is_ascii_graphic() { + *b as char + } else { + '.' + } + ); + } + println!("\""); + } + Datum::Slice(bs) => { + print!(".slice as hex ({bs:02X?}), len i{}, as ascii \"", bs.len()); + + for b in bs { + print!( + "{}", + if *b == b' ' || b.is_ascii_graphic() { + *b as char + } else { + '.' + } + ); + } + println!("\""); + } + Datum::Collection(els) => { + println!(".collection"); + for e in els { + print_entry(indentation + 1, offset, e); + } + } + }; + } + + for (i, entry) in data_section.value_pairs.iter().enumerate() { + let entry_offset = data_section.data_id_to_offset(&DataId(i as u32)); + print_entry(indentation, offset + entry_offset, entry); + } + println!(";; --- END OF TARGET BYTECODE ---\n"); } diff --git a/sway-core/src/asm_generation/fuel/allocated_abstract_instruction_set.rs b/sway-core/src/asm_generation/fuel/allocated_abstract_instruction_set.rs index 38466cf3edc..bf0627de013 100644 --- a/sway-core/src/asm_generation/fuel/allocated_abstract_instruction_set.rs +++ b/sway-core/src/asm_generation/fuel/allocated_abstract_instruction_set.rs @@ -121,14 +121,14 @@ impl AllocatedAbstractInstructionSet { new_ops.push(AllocatedAbstractOp { opcode: Either::Left(AllocatedOpcode::PSHL(mask_l)), comment: "Save registers 16..40".into(), - owning_span: None, + owning_span: op.owning_span.clone(), }); } if mask_h.value != 0 { new_ops.push(AllocatedAbstractOp { opcode: Either::Left(AllocatedOpcode::PSHH(mask_h)), comment: "Save registers 40..64".into(), - owning_span: None, + owning_span: op.owning_span.clone(), }); } } @@ -147,14 +147,14 @@ impl AllocatedAbstractInstructionSet { new_ops.push(AllocatedAbstractOp { opcode: Either::Left(AllocatedOpcode::POPH(mask_h)), comment: "Restore registers 40..64".into(), - owning_span: None, + owning_span: op.owning_span.clone(), }); } if mask_l.value != 0 { new_ops.push(AllocatedAbstractOp { opcode: Either::Left(AllocatedOpcode::POPL(mask_l)), comment: "Restore registers 16..40".into(), - owning_span: None, + owning_span: op.owning_span.clone(), }); } } diff --git a/sway-core/src/asm_generation/fuel/functions.rs b/sway-core/src/asm_generation/fuel/functions.rs index fed3a7ed0a3..5939535c716 100644 --- a/sway-core/src/asm_generation/fuel/functions.rs +++ b/sway-core/src/asm_generation/fuel/functions.rs @@ -274,8 +274,8 @@ impl<'ir, 'eng> FuelAsmBuilder<'ir, 'eng> { function.get_name(self.context) ); - self.cur_bytecode.push(match span { - Some(span) => Op::jump_label_comment(start_label, span, comment), + self.cur_bytecode.push(match &span { + Some(span) => Op::jump_label_comment(start_label, span.clone(), comment), None => Op::unowned_jump_label_comment(start_label, comment), }); @@ -285,7 +285,7 @@ impl<'ir, 'eng> FuelAsmBuilder<'ir, 'eng> { self.cur_bytecode.push(Op { opcode: Either::Right(OrganizationalOp::PushAll(start_label)), comment: "save all regs".to_owned(), - owning_span: None, + owning_span: span.clone(), }); } diff --git a/sway-core/src/build_config.rs b/sway-core/src/build_config.rs index b79f2112d66..ab1b3f4b78b 100644 --- a/sway-core/src/build_config.rs +++ b/sway-core/src/build_config.rs @@ -187,6 +187,7 @@ pub struct BuildConfig { pub(crate) print_dca_graph_url_format: Option, pub(crate) print_asm: PrintAsm, pub(crate) print_bytecode: bool, + pub(crate) print_bytecode_spans: bool, pub(crate) print_ir: PrintIr, pub(crate) include_tests: bool, pub(crate) optimization_level: OptLevel, @@ -234,6 +235,7 @@ impl BuildConfig { print_dca_graph_url_format: None, print_asm: PrintAsm::default(), print_bytecode: false, + print_bytecode_spans: false, print_ir: PrintIr::default(), include_tests: false, time_phases: false, @@ -264,9 +266,10 @@ impl BuildConfig { Self { print_asm, ..self } } - pub fn with_print_bytecode(self, a: bool) -> Self { + pub fn with_print_bytecode(self, bytecode: bool, bytecode_spans: bool) -> Self { Self { - print_bytecode: a, + print_bytecode: bytecode, + print_bytecode_spans: bytecode_spans, ..self } } diff --git a/sway-core/src/semantic_analysis/ast_node/expression/match_expression/analysis/usefulness.rs b/sway-core/src/semantic_analysis/ast_node/expression/match_expression/analysis/usefulness.rs index 0f240e6d15c..d403b2c0aef 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/match_expression/analysis/usefulness.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/match_expression/analysis/usefulness.rs @@ -183,7 +183,7 @@ use super::{ /// /// # Details /// -/// This algorithm checks is a match expression is exhaustive and if its match +/// This algorithm checks if a match expression is exhaustive and if its match /// arms are reachable by applying the above definitions of usefulness and /// witnesses. This algorithm sequentially creates a [WitnessReport] for every /// match arm by calling *U(P, q)*, where *P* is the [Matrix] of patterns seen diff --git a/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/typed_match_expression.rs b/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/typed_match_expression.rs index 9f415035b65..7abdfbc54a3 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/typed_match_expression.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/typed_match_expression.rs @@ -1,20 +1,53 @@ -use std::ops::ControlFlow; - -use sway_error::handler::{ErrorEmitted, Handler}; -use sway_types::{Span, Spanned}; - use crate::{ compiler_generated::INVALID_DESUGARED_MATCHED_EXPRESSION_SIGNAL, language::{ parsed::*, - ty::{self, TyExpression}, + ty::{ + self, TyAsmRegisterDeclaration, TyExpression, TyExpressionVariant, + TyIntrinsicFunctionKind, + }, + AsmOp, AsmRegister, }, semantic_analysis::{ ast_node::expression::typed_expression::instantiate_if_expression, expression::match_expression::typed::instantiate::Instantiate, TypeCheckContext, }, - CompileError, TypeId, + CompileError, TypeId, TypeInfo, }; +use std::{collections::BTreeMap, ops::ControlFlow}; +use sway_error::handler::{ErrorEmitted, Handler}; +use sway_types::{BaseIdent, Ident, Span, Spanned}; + +// Enable this to see a pseudo-code printed to understand what is being generated. +const RADIX_TREE_DEBUG: bool = true; + +#[derive(Default, Debug, Clone)] +struct TrieNode { + output: Option, + previous: Option, + next: BTreeMap, +} + +struct Trie { + nodes: Vec, +} + +fn revert(never_type_id: TypeId, u64_type_id: TypeId) -> TyExpression { + TyExpression { + expression: TyExpressionVariant::IntrinsicFunction(TyIntrinsicFunctionKind { + kind: sway_ast::Intrinsic::Revert, + arguments: vec![TyExpression { + expression: TyExpressionVariant::Literal(crate::language::Literal::U64(17)), + return_type: u64_type_id, + span: Span::dummy(), + }], + type_arguments: vec![], + span: Span::dummy(), + }), + return_type: never_type_id, + span: Span::dummy(), + } +} impl ty::TyMatchExpression { pub(crate) fn type_check( @@ -58,7 +91,7 @@ impl ty::TyMatchExpression { Ok((typed_exp, typed_scrutinees)) } - pub(crate) fn convert_to_typed_if_expression( + pub(crate) fn desugar( self, handler: &Handler, ctx: TypeCheckContext, @@ -76,14 +109,490 @@ impl ty::TyMatchExpression { ); } - let typed_if_exp = handler.scope(|handler| { - self.convert_to_typed_if_expression_inner(instantiate, ctx, handler) - })?; + let typed_if_exp = + handler.scope( + |handler| match &*ctx.engines().te().get(self.value_type_id) { + TypeInfo::StringSlice => self.desugar_to_radix_trie(ctx), + _ => self.desugar_to_typed_if_expression(instantiate, ctx, handler), + }, + )?; Ok(typed_if_exp) } - fn convert_to_typed_if_expression_inner( + fn desugar_to_radix_trie( + &self, + mut ctx: TypeCheckContext<'_>, + ) -> Result { + let never_type_id = ctx.engines.te().insert(ctx.engines, TypeInfo::Never, None); + + let u64_type_id = ctx.engines.te().insert( + ctx.engines, + TypeInfo::UnsignedInteger(sway_types::integer_bits::IntegerBits::SixtyFour), + None, + ); + + let bool_type_id = ctx + .engines + .te() + .insert(ctx.engines, TypeInfo::Boolean, None); + + let branch_return_type_id = self + .branches + .iter() + .map(|x| x.result.return_type) + .next() + .unwrap(); + + let matched_value = self + .branches + .iter() + .flat_map(|x| match &x.condition.as_ref().map(|x| &x.expression) { + Some(TyExpressionVariant::FunctionApplication { arguments, .. }) => { + Some(&arguments[0].1) + } + _ => None, + }) + .next() + .unwrap(); + + // the block for the wildcard arm + let wildcard_return_expr = self + .branches + .iter() + .filter(|x| x.condition.is_none()) + .map(|x| x.result.clone()) + .next() + .unwrap_or_else(|| revert(never_type_id, u64_type_id)); + + // All the match string slices, ignoring the wildcard + let match_arms_string_slices = self + .branches + .iter() + .flat_map(|x| match &x.condition.as_ref().map(|x| &x.expression) { + Some(TyExpressionVariant::FunctionApplication { arguments, .. }) => { + match &arguments[1].1.expression { + TyExpressionVariant::Literal(crate::language::Literal::String(v)) => { + Some(v.as_str().to_string()) + } + _ => None, + } + } + _ => None, + }) + .collect::>(); + + // group match arms by size of the arm string slice + let match_arms_by_size = match_arms_string_slices.iter().enumerate().fold( + BTreeMap::>::new(), + |mut map, (i, item)| { + map.entry(item.len()).or_default().push((item.clone(), i)); + map + }, + ); + + // create and compress all tries. One per arm size + let tries = match_arms_by_size + .values() + .map(|branches| self.generate_radix_trie(branches).unwrap()) + .collect::>(); + + // Navigate all valid nodes and collect string pieces. + // Then pack them starting from the biggest. + let mut string_pieces = tries + .iter() + .flat_map(|x| x.nodes.iter()) + .flat_map(|x| x.next.keys().cloned()) + .collect::>(); + string_pieces.sort_by(|l, r| l.len().cmp(&r.len()).reverse()); + let packed_strings = string_pieces + .into_iter() + .fold(String::new(), |mut pack, item| { + if !pack.contains(&item) { + pack.push_str(&item); + } + pack + }); + + if RADIX_TREE_DEBUG { + println!("let packed_string = {packed_strings:?}"); + } + + // Now create the outer expression checking the size of the string slice + let mut block = wildcard_return_expr.clone(); + + for ((k, _), trie) in match_arms_by_size.into_iter().zip(tries.into_iter()) { + if RADIX_TREE_DEBUG { + println!("if str.len() == {k}"); + } + + let expression = TyExpressionVariant::AsmExpression { + registers: vec![ + TyAsmRegisterDeclaration { + name: Ident::new_no_span("is_eq".into()), + initializer: None, + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("slice".into()), + initializer: Some(matched_value.clone()), + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("len".into()), + initializer: None, + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("expected_len".into()), + initializer: Some(TyExpression { + expression: TyExpressionVariant::Literal( + crate::language::Literal::U64(k as u64), + ), + return_type: u64_type_id, + span: Span::dummy(), + }), + }, + ], + body: vec![ + AsmOp { + op_name: Ident::new_no_span("lw".into()), + op_args: vec![ + BaseIdent::new_no_span("len".into()), + BaseIdent::new_no_span("slice".into()), + ], + immediate: Some(BaseIdent::new_no_span("i1".into())), + span: Span::dummy(), + }, + AsmOp { + op_name: Ident::new_no_span("eq".into()), + op_args: vec![ + BaseIdent::new_no_span("is_eq".into()), + BaseIdent::new_no_span("len".into()), + BaseIdent::new_no_span("expected_len".into()), + ], + immediate: None, + span: Span::dummy(), + }, + ], + returns: Some(( + AsmRegister { + name: "is_eq".into(), + }, + Span::dummy(), + )), + whole_block_span: self.span.clone(), + }; + + let then_node = self + .generate_radix_tree_checks( + ctx.by_ref(), + matched_value, + u64_type_id, + branch_return_type_id, + wildcard_return_expr.clone(), + trie, + &packed_strings, + ) + .unwrap(); + + block = TyExpression { + expression: TyExpressionVariant::IfExp { + condition: Box::new(TyExpression { + expression, + return_type: bool_type_id, + span: self.span.clone(), + }), + then: Box::new(then_node), + r#else: Some(Box::new(block)), + }, + return_type: branch_return_type_id, + span: self.span.clone(), + }; + } + + if RADIX_TREE_DEBUG { + println!("return wildcard branch"); + } + + Ok(block) + } + + #[allow(clippy::too_many_arguments)] + fn generate_radix_trie(&self, branches: &[(String, usize)]) -> Result { + let mut nodes = vec![TrieNode::default()]; + + for (b, i) in branches.iter() { + let mut current = 0; + for c in b.chars() { + let c = c.to_string(); + if let Some(next) = nodes[current].next.get(&c) { + current = *next; + continue; + } + + let next = nodes.len(); + nodes[current].next.insert(c, next); + current = next; + nodes.push(TrieNode::default()); + } + + nodes[current].output = Some(*i); + } + + // compress trie + let mut q = vec![0]; + while let Some(i) = q.pop() { + let mut current = nodes[i].clone(); + if current.next.len() == 1 { + let edge = current.next.pop_first().unwrap(); + let mut next = nodes[edge.1].clone(); + if next.next.len() == 1 { + let next_edge = next.next.pop_first().unwrap(); + let compressed_key = format!("{}{}", edge.0, next_edge.0); + + nodes[i].next.clear(); + nodes[i].next.insert(compressed_key, next_edge.1); + nodes[i].output = next.output.take(); + + q.push(i); + } else { + nodes[edge.1].previous = Some(i); + q.push(edge.1); + } + } else { + for (_, v) in current.next.iter() { + nodes[*v].previous = Some(i); + q.push(*v); + } + } + } + + Ok(Trie { nodes }) + } + + #[allow(clippy::too_many_arguments)] + fn generate_radix_tree_checks( + &self, + ctx: TypeCheckContext<'_>, + matched_value: &TyExpression, + u64_type_id: TypeId, + branch_return_type_id: TypeId, + wildcard_return_expr: TyExpression, + trie: Trie, + packed_strings: &str, + ) -> Result { + //generate code + let bool_type_id = ctx + .engines + .te() + .insert(ctx.engines, TypeInfo::Boolean, None); + + let string_slice_type_id = + ctx.engines + .te() + .insert(ctx.engines, TypeInfo::StringSlice, None); + + let packed_strings_expr = TyExpression { + expression: TyExpressionVariant::Literal(crate::language::Literal::String( + Span::from_string(packed_strings.to_string()), + )), + return_type: string_slice_type_id, + span: Span::dummy(), + }; + + let expr = self.generate_radrix_trie_code( + matched_value, + packed_strings, + &packed_strings_expr, + &trie.nodes, + 0, + 0, + bool_type_id, + u64_type_id, + branch_return_type_id, + 1, + wildcard_return_expr, + ); + + Ok(expr) + } + + #[allow(clippy::too_many_arguments)] + fn generate_radrix_trie_code( + &self, + matched_value: &TyExpression, + packed_strings: &str, + packed_strings_expr: &TyExpression, + nodes: &[TrieNode], + slice_pos: usize, + current_node_index: usize, + bool_type_id: TypeId, + u64_type_id: TypeId, + branch_return_type_id: TypeId, + depth: usize, + block_when_all_fail: TyExpression, + ) -> TyExpression { + let current = &nodes[current_node_index]; + + if let Some(output) = current.output { + assert!(current.next.is_empty()); + + if RADIX_TREE_DEBUG { + println!("{}return branch {:?}", " ".repeat(depth * 4), output); + } + + let branch = &self.branches[output]; + return branch.result.clone(); + } + + let mut block = block_when_all_fail.clone(); + + for (prefix, next_node_index) in current.next.iter().rev() { + let start = current_node_index; + let end = current_node_index + prefix.len(); + let eq_len: u64 = end as u64 - start as u64; + + let prefix_pos = packed_strings + .find(prefix) + .expect("prefix should be inside this string"); + + if RADIX_TREE_DEBUG { + println!( + "{}if str[{start}..{end}] == \"{prefix}\" at packed_string[{prefix_pos}]", + " ".repeat(depth * 4), + ); + } + + let then_node = self.generate_radrix_trie_code( + matched_value, + packed_strings, + packed_strings_expr, + nodes, + end, + *next_node_index, + bool_type_id, + u64_type_id, + branch_return_type_id, + depth + 1, + block_when_all_fail.clone(), + ); + + let prefix_pos = packed_strings + .find(prefix) + .expect("prefix should be inside this string"); + + let expression = TyExpressionVariant::AsmExpression { + registers: vec![ + TyAsmRegisterDeclaration { + name: Ident::new_no_span("slice".into()), + initializer: Some(matched_value.clone()), + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("prefix".into()), + initializer: Some(packed_strings_expr.clone()), + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("slice_ptr".into()), + initializer: None, + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("prefix_ptr".into()), + initializer: None, + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("len".into()), + initializer: Some(TyExpression { + expression: TyExpressionVariant::Literal( + crate::language::Literal::U64(eq_len), + ), + return_type: u64_type_id, + span: Span::dummy(), + }), + }, + TyAsmRegisterDeclaration { + name: Ident::new_no_span("is_eq".into()), + initializer: None, + }, + ], + body: vec![ + AsmOp { + op_name: Ident::new_no_span("lw".into()), + op_args: vec![ + BaseIdent::new_no_span("slice_ptr".into()), + BaseIdent::new_no_span("slice".into()), + ], + immediate: Some(BaseIdent::new_no_span("i0".into())), + span: Span::dummy(), + }, + AsmOp { + op_name: Ident::new_no_span("addi".into()), + op_args: vec![ + BaseIdent::new_no_span("slice_ptr".into()), + BaseIdent::new_no_span("slice_ptr".into()), + ], + immediate: Some(BaseIdent::new_no_span(format!("i{}", slice_pos))), + span: Span::dummy(), + }, + AsmOp { + op_name: Ident::new_no_span("lw".into()), + op_args: vec![ + BaseIdent::new_no_span("prefix_ptr".into()), + BaseIdent::new_no_span("prefix".into()), + ], + immediate: Some(BaseIdent::new_no_span("i0".into())), + span: Span::dummy(), + }, + AsmOp { + op_name: Ident::new_no_span("addi".into()), + op_args: vec![ + BaseIdent::new_no_span("prefix_ptr".into()), + BaseIdent::new_no_span("prefix_ptr".into()), + ], + immediate: Some(BaseIdent::new_no_span(format!("i{}", prefix_pos))), + span: Span::dummy(), + }, + AsmOp { + op_name: Ident::new_no_span("meq".into()), + op_args: vec![ + BaseIdent::new_no_span("is_eq".into()), + BaseIdent::new_no_span("slice_ptr".into()), + BaseIdent::new_no_span("prefix_ptr".into()), + BaseIdent::new_no_span("len".into()), + ], + immediate: None, + span: Span::dummy(), + }, + ], + returns: Some(( + AsmRegister { + name: "is_eq".into(), + }, + Span::dummy(), + )), + whole_block_span: Span::dummy(), + }; + + block = TyExpression { + expression: TyExpressionVariant::IfExp { + condition: Box::new(TyExpression { + expression, + return_type: bool_type_id, + span: Span::dummy(), + }), + then: Box::new(then_node), + r#else: Some(Box::new(block)), + }, + return_type: branch_return_type_id, + span: Span::dummy(), + }; + } + + if RADIX_TREE_DEBUG { + println!("{}return wildcard branch", " ".repeat(depth * 4),); + } + + block + } + + fn desugar_to_typed_if_expression( &self, instantiate: Instantiate, mut ctx: TypeCheckContext<'_>, diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs index c9dcd6a7968..9ce246074f3 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs @@ -840,13 +840,13 @@ impl ty::TyExpression { } // desugar the typed match expression to a typed if expression - let typed_if_exp = typed_match_expression.convert_to_typed_if_expression(handler, ctx)?; + let desugared = typed_match_expression.desugar(handler, ctx)?; let match_exp = ty::TyExpression { - span: typed_if_exp.span.clone(), - return_type: typed_if_exp.return_type, + span: desugared.span.clone(), + return_type: desugared.return_type, expression: ty::TyExpressionVariant::MatchExp { - desugared: Box::new(typed_if_exp), + desugared: Box::new(desugared), scrutinees: typed_scrutinees, }, }; diff --git a/sway-core/src/type_system/info.rs b/sway-core/src/type_system/info.rs index 9eae7d6b9d1..6796bb67a69 100644 --- a/sway-core/src/type_system/info.rs +++ b/sway-core/src/type_system/info.rs @@ -1281,7 +1281,8 @@ impl TypeInfo { | TypeInfo::B256 | TypeInfo::UnknownGeneric { .. } | TypeInfo::Numeric - | TypeInfo::Never => Ok(()), + | TypeInfo::Never + | TypeInfo::StringSlice => Ok(()), TypeInfo::Alias { ty, .. } => { let ty = engines.te().get(ty.type_id); ty.expect_is_supported_in_match_expressions(handler, engines, span) @@ -1291,7 +1292,6 @@ impl TypeInfo { | TypeInfo::Ptr(..) | TypeInfo::Slice(..) | TypeInfo::StringArray(_) - | TypeInfo::StringSlice | TypeInfo::Array(_, _) => Err(handler.emit_err(CompileError::Unimplemented { feature: format!( "Matched value has type \"{}\". Matching on this type", diff --git a/sway-ir/src/error.rs b/sway-ir/src/error.rs index b2f44625793..80b0894fe16 100644 --- a/sway-ir/src/error.rs +++ b/sway-ir/src/error.rs @@ -33,8 +33,8 @@ pub enum IrError { VerifyConditionExprNotABool, VerifyContractCallBadTypes(String), VerifyGepElementTypeNonPointer, - VerifyGepFromNonPointer(String), - VerifyGepInconsistentTypes, + VerifyGepFromNonPointer(String, Option), + VerifyGepInconsistentTypes(String, Option), VerifyGepOnNonAggregate, VerifyGetNonExistentPointer, VerifyInsertElementOfIncorrectType, @@ -64,15 +64,26 @@ pub enum IrError { VerifyStateDestBadType(String), VerifyStateKeyBadType, VerifyStateKeyNonPointer(String), - VerifyStoreMismatchedTypes, + VerifyStoreMismatchedTypes(Option), VerifyStoreToNonPointer(String), VerifyUntypedValuePassedToFunction, } +impl IrError { + pub(crate) fn get_problematic_value(&self) -> Option<&Value> { + match self { + Self::VerifyGepFromNonPointer(_, v) => v.as_ref(), + Self::VerifyGepInconsistentTypes(_, v) => v.as_ref(), + Self::VerifyStoreMismatchedTypes(v) => v.as_ref(), + _ => None, + } + } +} impl std::error::Error for IrError {} use std::fmt; +use crate::Value; use itertools::Itertools; impl fmt::Display for IrError { @@ -194,10 +205,14 @@ impl fmt::Display for IrError { IrError::VerifyGepElementTypeNonPointer => { write!(f, "Verification failed: GEP on a non-pointer.") } - IrError::VerifyGepInconsistentTypes => { - write!(f, "Verification failed: Struct field type mismatch.") + IrError::VerifyGepInconsistentTypes(error, _) => { + write!( + f, + "Verification failed: Struct field type mismatch: ({}).", + error + ) } - IrError::VerifyGepFromNonPointer(ty) => { + IrError::VerifyGepFromNonPointer(ty, _) => { write!( f, "Verification failed: Struct access must be to a pointer value, not a {ty}." @@ -337,7 +352,7 @@ impl fmt::Display for IrError { "Verification failed: State access operation must be to a {ty} pointer." ) } - IrError::VerifyStoreMismatchedTypes => { + IrError::VerifyStoreMismatchedTypes(_) => { write!( f, "Verification failed: Store value and pointer type mismatch." diff --git a/sway-ir/src/printer.rs b/sway-ir/src/printer.rs index f14286ccda9..19b90c92861 100644 --- a/sway-ir/src/printer.rs +++ b/sway-ir/src/printer.rs @@ -23,7 +23,7 @@ use crate::{ }; #[derive(Debug)] -enum Doc { +pub(crate) enum Doc { Empty, Space, Comma, @@ -42,7 +42,7 @@ enum Doc { } impl Doc { - fn text>(s: S) -> Self { + pub(crate) fn text>(s: S) -> Self { Doc::Text(s.into()) } @@ -50,7 +50,7 @@ impl Doc { Doc::Line(Box::new(doc)) } - fn text_line>(s: S) -> Self { + pub(crate) fn text_line>(s: S) -> Self { Doc::Line(Box::new(Doc::Text(s.into()))) } @@ -66,7 +66,7 @@ impl Doc { Doc::Parens(Box::new(Doc::list_sep(docs, Doc::Comma))) } - fn append(self, doc: Doc) -> Doc { + pub(crate) fn append(self, doc: Doc) -> Doc { match (&self, &doc) { (Doc::Empty, _) => doc, (_, Doc::Empty) => self, @@ -81,7 +81,7 @@ impl Doc { } } - fn build(self) -> String { + pub(crate) fn build(self) -> String { build_doc(self, 0) } } @@ -90,17 +90,32 @@ impl Doc { /// /// The output from this function must always be suitable for [crate::parser::parse]. pub fn to_string(context: &Context) -> String { + context_print(context, &|_, doc| doc) +} + +pub(crate) fn context_print(context: &Context, map_doc: &impl Fn(&Value, Doc) -> Doc) -> String { let mut md_namer = MetadataNamer::default(); context .modules .iter() .fold(Doc::Empty, |doc, (_, module)| { - doc.append(module_to_doc(context, &mut md_namer, module)) + doc.append(module_to_doc(context, &mut md_namer, module, map_doc)) }) .append(md_namer.to_doc(context)) .build() } +pub(crate) fn block_print( + context: &Context, + function: Function, + block: Block, + map_doc: &impl Fn(&Value, Doc) -> Doc, +) -> String { + let mut md_namer = MetadataNamer::default(); + let mut namer = Namer::new(function); + block_to_doc(context, &mut md_namer, &mut namer, &block, map_doc).build() +} + pub struct ModulePrinterResult; impl AnalysisResultT for ModulePrinterResult {} @@ -116,7 +131,8 @@ pub fn module_printer_pass( module_to_doc( context, &mut md_namer, - context.modules.get(module.0).unwrap() + context.modules.get(module.0).unwrap(), + &|_, doc| doc ) .append(md_namer.to_doc(context)) .build() @@ -132,7 +148,8 @@ pub fn module_print(context: &Context, _analyses: &AnalysisResults, module: Modu module_to_doc( context, &mut md_namer, - context.modules.get(module.0).unwrap() + context.modules.get(module.0).unwrap(), + &|_, doc| doc ) .append(md_namer.to_doc(context)) .build() @@ -148,7 +165,8 @@ pub fn function_print(context: &Context, function: Function) { context, &mut md_namer, &mut Namer::new(function), - context.functions.get(function.0).unwrap() + context.functions.get(function.0).unwrap(), + &|_, doc| doc ) .append(md_namer.to_doc(context)) .build() @@ -170,6 +188,7 @@ fn module_to_doc<'a>( context: &'a Context, md_namer: &mut MetadataNamer, module: &'a ModuleContent, + map_doc: &impl Fn(&Value, Doc) -> Doc, ) -> Doc { Doc::line(Doc::Text(format!( "{} {{", @@ -207,6 +226,7 @@ fn module_to_doc<'a>( md_namer, &mut Namer::new(*function), &context.functions[function.0], + map_doc, ) }) .collect(), @@ -268,6 +288,7 @@ fn function_to_doc<'a>( md_namer: &mut MetadataNamer, namer: &mut Namer, function: &'a FunctionContent, + map_doc: &impl Fn(&Value, Doc) -> Doc, ) -> Doc { let public = if function.is_public { "pub " } else { "" }; let entry = if function.is_entry { "entry " } else { "" }; @@ -373,7 +394,7 @@ fn function_to_doc<'a>( function .blocks .iter() - .map(|block| block_to_doc(context, md_namer, namer, block)) + .map(|block| block_to_doc(context, md_namer, namer, block, map_doc)) .collect(), Doc::line(Doc::Empty), ), @@ -389,6 +410,7 @@ fn block_to_doc( md_namer: &mut MetadataNamer, namer: &mut Namer, block: &Block, + map_doc: &impl Fn(&Value, Doc) -> Doc, ) -> Doc { let block_content = &context.blocks[block.0]; Doc::line( @@ -410,7 +432,10 @@ fn block_to_doc( .append(Doc::List( block .instruction_iter(context) - .map(|ins| instruction_to_doc(context, md_namer, namer, block, &ins)) + .map(|current_value| { + let doc = instruction_to_doc(context, md_namer, namer, block, ¤t_value); + (map_doc)(¤t_value, doc) + }) .collect(), )) } diff --git a/sway-ir/src/verify.rs b/sway-ir/src/verify.rs index f39cb509a08..be2fcc77fc2 100644 --- a/sway-ir/src/verify.rs +++ b/sway-ir/src/verify.rs @@ -13,9 +13,10 @@ use crate::{ irtype::Type, local_var::LocalVar, metadata::{MetadataIndex, Metadatum}, + printer, value::{Value, ValueDatum}, AnalysisResult, AnalysisResultT, AnalysisResults, BinaryOpKind, Block, BlockArgument, - BranchToWithArgs, Module, Pass, PassMutability, ScopedPass, TypeOption, UnaryOpKind, + BranchToWithArgs, Doc, Module, Pass, PassMutability, ScopedPass, TypeOption, UnaryOpKind, }; pub struct ModuleVerifierResult; @@ -131,10 +132,29 @@ impl<'eng> Context<'eng> { } .verify_instructions(); - if r.is_err() { - println!("{}", self); - println!("{}", cur_function.get_name(self)); - println!("{}", cur_block.get_label(self)); + // Help to understand the verification failure + // If the error knows the problematic value, prints everything with the error highlighted, + // if not, print only the block to help pinpoint the issue + if let Err(error) = &r { + println!( + "Verification failed at {}::{}", + cur_function.get_name(self), + cur_block.get_label(self) + ); + + let block = if let Some(problematic_value) = error.get_problematic_value() { + printer::context_print(self, &|current_value: &Value, doc: Doc| { + if *current_value == *problematic_value { + doc.append(Doc::text_line(format!("\x1b[0;31m^ {}\x1b[0m", error))) + } else { + doc + } + }) + } else { + printer::block_print(self, cur_function, cur_block, &|_, doc| doc) + }; + + println!("{}", block); } r?; @@ -303,7 +323,7 @@ impl<'a, 'eng> InstructionVerifier<'a, 'eng> { base, elem_ptr_ty, indices, - } => self.verify_get_elem_ptr(base, elem_ptr_ty, indices)?, + } => self.verify_get_elem_ptr(&ins, base, elem_ptr_ty, indices)?, InstOp::GetLocal(local_var) => self.verify_get_local(local_var)?, InstOp::GetConfig(_, name) => self.verify_get_config(self.cur_module, name)?, InstOp::IntToPtr(value, ty) => self.verify_int_to_ptr(value, ty)?, @@ -323,7 +343,7 @@ impl<'a, 'eng> InstructionVerifier<'a, 'eng> { InstOp::Store { dst_val_ptr, stored_val, - } => self.verify_store(dst_val_ptr, stored_val)?, + } => self.verify_store(&ins, dst_val_ptr, stored_val)?, }; // Verify the instruction metadata too. @@ -743,13 +763,15 @@ impl<'a, 'eng> InstructionVerifier<'a, 'eng> { fn verify_get_elem_ptr( &self, + ins: &Value, base: &Value, elem_ptr_ty: &Type, indices: &[Value], ) -> Result<(), IrError> { use crate::constant::ConstantValue; - let base_ty = self.get_ptr_type(base, IrError::VerifyGepFromNonPointer)?; + let base_ty = + self.get_ptr_type(base, |s| IrError::VerifyGepFromNonPointer(s, Some(*ins)))?; if !base_ty.is_aggregate(self.context) { return Err(IrError::VerifyGepOnNonAggregate); } @@ -759,7 +781,10 @@ impl<'a, 'eng> InstructionVerifier<'a, 'eng> { }; if indices.is_empty() { - return Err(IrError::VerifyGepInconsistentTypes); + return Err(IrError::VerifyGepInconsistentTypes( + "Empty Indices".into(), + Some(*base), + )); } // Fetch the field type from the vector of Values. If the value is a constant int then @@ -781,7 +806,14 @@ impl<'a, 'eng> InstructionVerifier<'a, 'eng> { }); if self.opt_ty_not_eq(&Some(elem_inner_ty), &index_ty) { - return Err(IrError::VerifyGepInconsistentTypes); + return Err(IrError::VerifyGepInconsistentTypes( + format!( + "Element type \"{}\" versus index type {:?}", + elem_inner_ty.as_string(self.context), + index_ty.map(|x| x.as_string(self.context)) + ), + Some(*ins), + )); } Ok(()) @@ -1033,11 +1065,16 @@ impl<'a, 'eng> InstructionVerifier<'a, 'eng> { } } - fn verify_store(&self, dst_val: &Value, stored_val: &Value) -> Result<(), IrError> { + fn verify_store( + &self, + ins: &Value, + dst_val: &Value, + stored_val: &Value, + ) -> Result<(), IrError> { let dst_ty = self.get_ptr_type(dst_val, IrError::VerifyStoreToNonPointer)?; let stored_ty = stored_val.get_type(self.context); if self.opt_ty_not_eq(&Some(dst_ty), &stored_ty) { - Err(IrError::VerifyStoreMismatchedTypes) + Err(IrError::VerifyStoreMismatchedTypes(Some(*ins))) } else { Ok(()) } diff --git a/test/src/e2e_vm_tests/harness.rs b/test/src/e2e_vm_tests/harness.rs index 72ca391a3d1..cb839dc2608 100644 --- a/test/src/e2e_vm_tests/harness.rs +++ b/test/src/e2e_vm_tests/harness.rs @@ -278,6 +278,7 @@ pub(crate) async fn compile_to_bytes(file_name: &str, run_config: &RunConfig) -> dca_graph_url_format: None, asm: run_config.print_asm, bytecode: run_config.print_bytecode, + bytecode_spans: run_config.print_bytecode, ir: run_config.print_ir.clone(), reverse_order: false, }, diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/Forc.lock b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/Forc.lock similarity index 56% rename from test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/Forc.lock rename to test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/Forc.lock index ce884974e55..3a555a8fe55 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/Forc.lock +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/Forc.lock @@ -1,9 +1,9 @@ [[package]] name = "core" -source = "path+from-root-C27B2C742213E5AD" +source = "path+from-root-0B4C76FF57814684" [[package]] -name = "match_expressions" +name = "match_expressions_all" source = "member" dependencies = [ "core", @@ -12,5 +12,5 @@ dependencies = [ [[package]] name = "std" -source = "path+from-root-C27B2C742213E5AD" +source = "path+from-root-0B4C76FF57814684" dependencies = ["core"] diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/Forc.toml b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/Forc.toml similarity index 88% rename from test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/Forc.toml rename to test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/Forc.toml index eaec31a928c..6d1dea0b55d 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/Forc.toml +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/Forc.toml @@ -1,7 +1,7 @@ [project] authors = ["Fuel Labs "] license = "Apache-2.0" -name = "match_expressions" +name = "match_expressions_all" entry = "main.sw" [dependencies] diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/json_abi_oracle.json b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/json_abi_oracle.json similarity index 100% rename from test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/json_abi_oracle.json rename to test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/json_abi_oracle.json diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/json_abi_oracle_new_encoding.json b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/json_abi_oracle_new_encoding.json similarity index 88% rename from test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/json_abi_oracle_new_encoding.json rename to test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/json_abi_oracle_new_encoding.json index 068da3305ab..e60dda965d4 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/json_abi_oracle_new_encoding.json +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/json_abi_oracle_new_encoding.json @@ -17,8 +17,8 @@ "messagesTypes": [], "types": [ { - "components": null, - "type": "u64", + "components": [], + "type": "()", "typeId": 0, "typeParameters": null } diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/src/main.sw similarity index 64% rename from test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/src/main.sw rename to test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/src/main.sw index 689aaffc9b0..0a493b8bc16 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/src/main.sw @@ -18,7 +18,17 @@ fn inc_i(ref mut i: u64) -> Struct { Struct { x: 21, y: 21, z: 1 } } -fn main() -> u64 { +#[inline(never)] +fn return_match_on_str_slice(param: str) -> u64 { + match param { + "get_a" => { 1u64 }, + "get_a_b" => { 2u64 }, + "get_b" => { 3u64 }, + _ => { 1000u64 }, + } +} + +fn main() { let x = match 8 { 7 => { 4 }, 9 => { 5 }, @@ -86,8 +96,22 @@ fn main() -> u64 { }; assert(i == 11); - match 42 { + let r = match 42 { 0 => { 24 }, foo => { foo }, - } + }; + assert(r == 42); + + // string slice + assert(return_match_on_str_slice("") == 1000); + assert(return_match_on_str_slice("g") == 1000); + assert(return_match_on_str_slice("ge") == 1000); + assert(return_match_on_str_slice("get") == 1000); + assert(return_match_on_str_slice("get_") == 1000); + assert(return_match_on_str_slice("get_a") == 1); + assert(return_match_on_str_slice("get_a_") == 1000); + assert(return_match_on_str_slice("get_a_b") == 2); + assert(return_match_on_str_slice("get_b") == 3); + assert(return_match_on_str_slice("get_c") == 1000); } + diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/test.toml b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/test.toml similarity index 57% rename from test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/test.toml rename to test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/test.toml index 057e34e97ef..8fb3859ce4c 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions/test.toml +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/match_expressions_all/test.toml @@ -1,4 +1,4 @@ category = "run" -expected_result = { action = "return", value = 42 } -expected_result_new_encoding = { action = "return_data", value = "000000000000002A" } +expected_result = { action = "return", value = 0 } +expected_result_new_encoding = { action = "return_data", value = "" } validate_abi = true From f81b6c2914b19f78d6c32e992ee284795c352a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaya=20G=C3=B6kalp?= Date: Fri, 5 Jul 2024 15:24:23 -0700 Subject: [PATCH 08/19] fix: typo in comment for ipfs fetching in forc-pkg (#6236) ## Description Curretnly CI is broken as spellcheck is finding a new error it used to not found. This pr fixes it to get CI passing again. --- forc-pkg/src/source/ipfs.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forc-pkg/src/source/ipfs.rs b/forc-pkg/src/source/ipfs.rs index 1a1c5e914fc..1391348834c 100644 --- a/forc-pkg/src/source/ipfs.rs +++ b/forc-pkg/src/source/ipfs.rs @@ -137,7 +137,7 @@ impl Cid { /// Using local node, fetches the content described by this cid. async fn fetch_with_client(&self, ipfs_client: &IpfsClient, dst: &Path) -> Result<()> { let cid_path = format!("/ipfs/{}", self.0); - // Since we are fetching packages as a fodler, they are returned as a tar archive. + // Since we are fetching packages as a folder, they are returned as a tar archive. let bytes = ipfs_client .get(&cid_path) .map_ok(|chunk| chunk.to_vec()) From 9db4fe753dd7c0528401e55b689e4f2d0125b405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Ron=C4=8Devi=C4=87?= Date: Mon, 8 Jul 2024 15:04:01 +0200 Subject: [PATCH 09/19] Add string slices to supported types message in match expressions (#6243) ## Description This PR adds `string slices` to `CURRENTLY_SUPPORTED_TYPES_MESSAGE` in `match` expressions. The support for string slices is added in #6202. ## Checklist - [x] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --- sway-core/src/type_system/info.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sway-core/src/type_system/info.rs b/sway-core/src/type_system/info.rs index 6796bb67a69..793be444b13 100644 --- a/sway-core/src/type_system/info.rs +++ b/sway-core/src/type_system/info.rs @@ -1261,11 +1261,12 @@ impl TypeInfo { engines: &Engines, span: &Span, ) -> Result<(), ErrorEmitted> { - const CURRENTLY_SUPPORTED_TYPES_MESSAGE: [&str; 8] = [ + const CURRENTLY_SUPPORTED_TYPES_MESSAGE: [&str; 9] = [ "Sway currently supports pattern matching on these types:", " - b256", " - boolean", " - enums", + " - string slices", " - structs", " - tuples", " - unsigned integers", From d8e57f3118b9be4a2e044fb54cc5a252a6c4cc30 Mon Sep 17 00:00:00 2001 From: Daniel Frederico Lins Leite Date: Mon, 8 Jul 2024 14:32:26 +0100 Subject: [PATCH 10/19] fix configurable tests (#6242) ## Description This PR recover configurable tests that were deleted by mistake. ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --------- Co-authored-by: Joshua Batty --- .../json_abi_oracle_new_encoding.json | 258 +++++++++++++++++- .../language/configurable_consts/src/main.sw | 73 ++++- .../language/configurable_consts/test.toml | 5 +- 3 files changed, 327 insertions(+), 9 deletions(-) diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json index 32f83d32de0..b76fb86d956 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json @@ -3,11 +3,146 @@ { "configurableType": { "name": "", - "type": 1, + "type": 5, "typeArguments": null }, "name": "BOOL", - "offset": 360 + "offset": 6944 + }, + { + "configurableType": { + "name": "", + "type": 13, + "typeArguments": null + }, + "name": "U8", + "offset": 7088 + }, + { + "configurableType": { + "name": "", + "type": 13, + "typeArguments": null + }, + "name": "ANOTHER_U8", + "offset": 6872 + }, + { + "configurableType": { + "name": "", + "type": 9, + "typeArguments": null + }, + "name": "U16", + "offset": 7032 + }, + { + "configurableType": { + "name": "", + "type": 11, + "typeArguments": null + }, + "name": "U32", + "offset": 7072 + }, + { + "configurableType": { + "name": "", + "type": 11, + "typeArguments": null + }, + "name": "U64", + "offset": 7080 + }, + { + "configurableType": { + "name": "", + "type": 10, + "typeArguments": null + }, + "name": "U256", + "offset": 7040 + }, + { + "configurableType": { + "name": "", + "type": 4, + "typeArguments": null + }, + "name": "B256", + "offset": 6912 + }, + { + "configurableType": { + "name": "", + "type": 8, + "typeArguments": [] + }, + "name": "CONFIGURABLE_STRUCT", + "offset": 6984 + }, + { + "configurableType": { + "name": "", + "type": 6, + "typeArguments": [] + }, + "name": "CONFIGURABLE_ENUM_A", + "offset": 6952 + }, + { + "configurableType": { + "name": "", + "type": 6, + "typeArguments": [] + }, + "name": "CONFIGURABLE_ENUM_B", + "offset": 6968 + }, + { + "configurableType": { + "name": "", + "type": 2, + "typeArguments": null + }, + "name": "ARRAY_BOOL", + "offset": 6880 + }, + { + "configurableType": { + "name": "", + "type": 3, + "typeArguments": null + }, + "name": "ARRAY_U64", + "offset": 6888 + }, + { + "configurableType": { + "name": "", + "type": 1, + "typeArguments": null + }, + "name": "TUPLE_BOOL_U64", + "offset": 7016 + }, + { + "configurableType": { + "name": "", + "type": 7, + "typeArguments": null + }, + "name": "STR_4", + "offset": 7008 + }, + { + "configurableType": { + "name": "", + "type": 13, + "typeArguments": null + }, + "name": "NOT_USED", + "offset": 7000 } ], "encoding": "1", @@ -32,10 +167,127 @@ "typeId": 0, "typeParameters": null }, + { + "components": [ + { + "name": "__tuple_element", + "type": 5, + "typeArguments": null + }, + { + "name": "__tuple_element", + "type": 12, + "typeArguments": null + } + ], + "type": "(_, _)", + "typeId": 1, + "typeParameters": null + }, + { + "components": [ + { + "name": "__array_element", + "type": 5, + "typeArguments": null + } + ], + "type": "[_; 3]", + "typeId": 2, + "typeParameters": null + }, + { + "components": [ + { + "name": "__array_element", + "type": 12, + "typeArguments": null + } + ], + "type": "[_; 3]", + "typeId": 3, + "typeParameters": null + }, + { + "components": null, + "type": "b256", + "typeId": 4, + "typeParameters": null + }, { "components": null, "type": "bool", - "typeId": 1, + "typeId": 5, + "typeParameters": null + }, + { + "components": [ + { + "name": "A", + "type": 5, + "typeArguments": null + }, + { + "name": "B", + "type": 12, + "typeArguments": null + } + ], + "type": "enum ConfigurableEnum", + "typeId": 6, + "typeParameters": null + }, + { + "components": null, + "type": "str[4]", + "typeId": 7, + "typeParameters": null + }, + { + "components": [ + { + "name": "a", + "type": 5, + "typeArguments": null + }, + { + "name": "b", + "type": 12, + "typeArguments": null + } + ], + "type": "struct ConfigurableStruct", + "typeId": 8, + "typeParameters": null + }, + { + "components": null, + "type": "u16", + "typeId": 9, + "typeParameters": null + }, + { + "components": null, + "type": "u256", + "typeId": 10, + "typeParameters": null + }, + { + "components": null, + "type": "u32", + "typeId": 11, + "typeParameters": null + }, + { + "components": null, + "type": "u64", + "typeId": 12, + "typeParameters": null + }, + { + "components": null, + "type": "u8", + "typeId": 13, "typeParameters": null } ] diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw index 59a4d92df27..b1ff46b7e0e 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/src/main.sw @@ -1,9 +1,78 @@ script; +use std::hash::*; + +struct ConfigurableStruct { + a: bool, + b: u64, +} + +enum ConfigurableEnum { + A: bool, + B: u64, +} + +impl core::ops::Eq for ConfigurableEnum { + fn eq(self, other: ConfigurableEnum) -> bool { + match (self, other) { + (ConfigurableEnum::A(inner1), ConfigurableEnum::A(inner2)) => inner1 == inner2, + (ConfigurableEnum::B(inner1), ConfigurableEnum::B(inner2)) => inner1 == inner2, + _ => false, + } + } +} + +type AnotherU8 = u8; + configurable { BOOL: bool = true, + U8: u8 = 1, + ANOTHER_U8: AnotherU8 = 3, + U16: u16 = 2, + U32: u32 = 3, + U64: u32 = 4, + U256: u256 = 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu256, + B256: b256 = 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, + CONFIGURABLE_STRUCT: ConfigurableStruct = ConfigurableStruct { a: true, b: 5 }, + CONFIGURABLE_ENUM_A: ConfigurableEnum = ConfigurableEnum::A(true), + CONFIGURABLE_ENUM_B: ConfigurableEnum = ConfigurableEnum::B(12), + ARRAY_BOOL: [bool; 3] = [true, false, true], + ARRAY_U64: [u64; 3] = [9, 8, 7], + TUPLE_BOOL_U64: (bool, u64) = (true, 11), + STR_4: str[4] = __to_str_array("abcd"), + + NOT_USED: u8 = 1 } - + fn main() { assert(BOOL == true); -} \ No newline at end of file + assert(U8 == 1); + assert(ANOTHER_U8 == 3); + assert(U16 == 2); + assert(U32 == 3); + assert(U64 == 4); + assert(U256 == 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu256); + assert(B256 == 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB); + assert(CONFIGURABLE_STRUCT.a == true); + assert(CONFIGURABLE_STRUCT.b == 5); + assert(CONFIGURABLE_ENUM_A == ConfigurableEnum::A(true)); + assert(CONFIGURABLE_ENUM_B == ConfigurableEnum::B(12)); + assert(ARRAY_BOOL[0] == true); + assert(ARRAY_BOOL[1] == false); + assert(ARRAY_BOOL[2] == true); + assert(ARRAY_U64[0] == 9); + assert(ARRAY_U64[1] == 8); + assert(ARRAY_U64[2] == 7); + assert(TUPLE_BOOL_U64.0 == true); + assert(TUPLE_BOOL_U64.1 == 11); + assert(sha256_str_array(STR_4) == sha256("abcd")); + + // Assert address do not change + let addr_1 = asm(addr: __addr_of(&BOOL)) { + addr: u64 + }; + let addr_2 = asm(addr: __addr_of(&BOOL)) { + addr: u64 + }; + assert(addr_1 == addr_2); +} diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml index 69ed91a1f33..a8b7c2f8903 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/test.toml @@ -2,8 +2,5 @@ category = "run" expected_result = { action = "return", value = 0 } expected_result_new_encoding = { action = "return_data", value = "" } validate_abi = true -expected_warnings = 6 +expected_warnings = 1 unsupported_profiles = ["debug"] - -# check: $()NOT_USED: u8 = 1 -# nextln: $()This declaration is never used From 5db41b52f452dc6c1d3fde4b2a99a21c4e54e0f9 Mon Sep 17 00:00:00 2001 From: Daniel Frederico Lins Leite Date: Mon, 8 Jul 2024 15:43:47 +0100 Subject: [PATCH 11/19] re-enable LDC test (#6240) ## Description This test was disabled when we introduced encoding v1. But it has been fixed since and we can enable it again. ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --- test/src/sdk-harness/test_projects/run_external_proxy/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/src/sdk-harness/test_projects/run_external_proxy/mod.rs b/test/src/sdk-harness/test_projects/run_external_proxy/mod.rs index 27f40242cf4..02882c79fda 100644 --- a/test/src/sdk-harness/test_projects/run_external_proxy/mod.rs +++ b/test/src/sdk-harness/test_projects/run_external_proxy/mod.rs @@ -6,7 +6,6 @@ abigen!(Contract( )); #[tokio::test] -#[ignore] async fn run_external_can_proxy_call() { let wallet = launch_provider_and_get_wallet().await.unwrap(); From ba46821f737b47bb2586a6f3e5f01253dd4d16f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaya=20G=C3=B6kalp?= Date: Mon, 8 Jul 2024 16:41:07 -0700 Subject: [PATCH 12/19] chore: remove snapshot, as accounts are funded by default (#6235) ## Description Removes local snapshot we were using to fund our accounts as it is now done by default as of https://github.com/FuelLabs/fuel-core/pull/1894. By default `--default-signer` is signing it with the account funded by fuel-core out of the box. --- .github/workflows/ci.yml | 4 +- .../local-testnode/chain_config.json | 271 ------------------ .../workflows/local-testnode/metadata.json | 8 - .../local-testnode/state_config.json | 37 --- .../state_transition_bytecode.wasm | Bin 2478862 -> 0 bytes forc-plugins/forc-client/tests/deploy.rs | 12 - 6 files changed, 2 insertions(+), 330 deletions(-) delete mode 100644 .github/workflows/local-testnode/chain_config.json delete mode 100644 .github/workflows/local-testnode/metadata.json delete mode 100644 .github/workflows/local-testnode/state_config.json delete mode 100755 .github/workflows/local-testnode/state_transition_bytecode.wasm diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3928b4f7aee..d6998c534a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -341,7 +341,7 @@ jobs: mv fuel-core-${{ needs.get-fuel-core-version.outputs.fuel_core_version }}-x86_64-unknown-linux-gnu/fuel-core /usr/local/bin/fuel-core - name: Cargo Run E2E Tests (Fuel VM) run: | - fuel-core run --db-type in-memory --debug --snapshot ./.github/workflows/local-testnode & + fuel-core run --db-type in-memory --debug & sleep 5 && cargo run --locked --release --bin test -- --locked @@ -364,7 +364,7 @@ jobs: mv fuel-core-${{ needs.get-fuel-core-version.outputs.fuel_core_version }}-x86_64-unknown-linux-gnu/fuel-core /usr/local/bin/fuel-core - name: Cargo Run E2E Tests (Fuel VM) run: | - fuel-core run --db-type in-memory --debug --snapshot ./.github/workflows/local-testnode & + fuel-core run --db-type in-memory --debug & sleep 5 && cargo run --locked --release --bin test -- --locked --release diff --git a/.github/workflows/local-testnode/chain_config.json b/.github/workflows/local-testnode/chain_config.json deleted file mode 100644 index 334f6f89508..00000000000 --- a/.github/workflows/local-testnode/chain_config.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "chain_name": "Local network", - "consensus_parameters": { - "V1": { - "tx_params": { - "V1": { - "max_inputs": 255, - "max_outputs": 255, - "max_witnesses": 255, - "max_gas_per_tx": 100000000, - "max_size": 262144, - "max_bytecode_subsections": 256 - } - }, - "predicate_params": { - "V1": { - "max_predicate_length": 102400, - "max_predicate_data_length": 102400, - "max_message_data_length": 102400, - "max_gas_per_predicate": 100000000 - } - }, - "script_params": { - "V1": { - "max_script_length": 102400, - "max_script_data_length": 102400 - } - }, - "contract_params": { - "V1": { - "contract_max_size": 262144, - "max_storage_slots": 1760 - } - }, - "fee_params": { - "V1": { - "gas_price_factor": 92, - "gas_per_byte": 63 - } - }, - "chain_id": 0, - "gas_costs": { - "V1": { - "add": 2, - "addi": 2, - "aloc": 2, - "and": 2, - "andi": 2, - "bal": 86, - "bhei": 2, - "bhsh": 2, - "burn": 25770, - "cb": 2, - "cfei": 2, - "cfsi": 2, - "div": 2, - "divi": 2, - "eck1": 3114, - "ecr1": 42270, - "ed19": 2878, - "eq": 2, - "exp": 2, - "expi": 2, - "flag": 1, - "gm": 2, - "gt": 2, - "gtf": 12, - "ji": 2, - "jmp": 2, - "jne": 2, - "jnei": 2, - "jnzi": 2, - "jmpf": 1, - "jmpb": 1, - "jnzf": 1, - "jnzb": 1, - "jnef": 1, - "jneb": 1, - "lb": 2, - "log": 165, - "lt": 2, - "lw": 2, - "mint": 29024, - "mlog": 2, - "mod": 2, - "modi": 2, - "move": 2, - "movi": 2, - "mroo": 4, - "mul": 2, - "muli": 2, - "mldv": 3, - "noop": 1, - "not": 2, - "or": 2, - "ori": 2, - "poph": 3, - "popl": 3, - "pshh": 4, - "pshl": 4, - "ret_contract": 134, - "rvrt_contract": 153, - "sb": 2, - "sll": 2, - "slli": 2, - "srl": 2, - "srli": 2, - "srw": 209, - "sub": 2, - "subi": 2, - "sw": 2, - "sww": 22501, - "time": 50, - "tr": 33912, - "tro": 24294, - "wdcm": 2, - "wqcm": 3, - "wdop": 3, - "wqop": 3, - "wdml": 3, - "wqml": 4, - "wddv": 5, - "wqdv": 6, - "wdmd": 10, - "wqmd": 17, - "wdam": 9, - "wqam": 11, - "wdmm": 10, - "wqmm": 10, - "xor": 2, - "xori": 2, - "call": { - "LightOperation": { - "base": 18190, - "units_per_gas": 5 - } - }, - "ccp": { - "LightOperation": { - "base": 48, - "units_per_gas": 22 - } - }, - "croo": { - "LightOperation": { - "base": 131, - "units_per_gas": 2 - } - }, - "csiz": { - "LightOperation": { - "base": 45, - "units_per_gas": 237 - } - }, - "k256": { - "LightOperation": { - "base": 37, - "units_per_gas": 3 - } - }, - "ldc": { - "LightOperation": { - "base": 39, - "units_per_gas": 68 - } - }, - "logd": { - "LightOperation": { - "base": 565, - "units_per_gas": 2 - } - }, - "mcl": { - "LightOperation": { - "base": 3, - "units_per_gas": 564 - } - }, - "mcli": { - "LightOperation": { - "base": 3, - "units_per_gas": 560 - } - }, - "mcp": { - "LightOperation": { - "base": 4, - "units_per_gas": 185 - } - }, - "mcpi": { - "LightOperation": { - "base": 9, - "units_per_gas": 455 - } - }, - "meq": { - "LightOperation": { - "base": 3, - "units_per_gas": 766 - } - }, - "retd_contract": { - "LightOperation": { - "base": 485, - "units_per_gas": 3 - } - }, - "s256": { - "LightOperation": { - "base": 42, - "units_per_gas": 3 - } - }, - "scwq": { - "HeavyOperation": { - "base": 21672, - "gas_per_unit": 22146 - } - }, - "smo": { - "LightOperation": { - "base": 44437, - "units_per_gas": 1 - } - }, - "srwq": { - "HeavyOperation": { - "base": 239, - "gas_per_unit": 234 - } - }, - "swwq": { - "HeavyOperation": { - "base": 22724, - "gas_per_unit": 21231 - } - }, - "contract_root": { - "LightOperation": { - "base": 42, - "units_per_gas": 2 - } - }, - "state_root": { - "HeavyOperation": { - "base": 323, - "gas_per_unit": 169 - } - }, - "new_storage_per_byte": 63, - "vm_initialization": { - "HeavyOperation": { - "base": 5254820, - "gas_per_unit": 0 - } - } - } - }, - "base_asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07", - "block_gas_limit": 100000000, - "privileged_address": "9f0e19d6c2a6283a3222426ab2630d35516b1799b503f37b02105bebe1b8a3e9" - } - }, - "consensus": { - "PoA": { - "signing_key": "e0a9fcde1b73f545252e01b30b50819eb9547d07531fa3df0385c5695736634d" - } - } -} \ No newline at end of file diff --git a/.github/workflows/local-testnode/metadata.json b/.github/workflows/local-testnode/metadata.json deleted file mode 100644 index 9d12c38b64e..00000000000 --- a/.github/workflows/local-testnode/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "chain_config": "chain_config.json", - "table_encoding": { - "Json": { - "filepath": "state_config.json" - } - } -} diff --git a/.github/workflows/local-testnode/state_config.json b/.github/workflows/local-testnode/state_config.json deleted file mode 100644 index 879ee797e15..00000000000 --- a/.github/workflows/local-testnode/state_config.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "coins": [ - { - "tx_id": "0000000000000000000000000000000000000000000000000000000000000001", - "output_index": 0, - "tx_pointer_block_height": 0, - "tx_pointer_tx_idx": 0, - "owner": "6b63804cfbf9856e68e5b6e7aef238dc8311ec55bec04df774003a2c96e0418e", - "amount": 1152921504606846976, - "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" - } - ], - "messages": [], - "contracts": [ - { - "contract_id": "7777777777777777777777777777777777777777777777777777777777777777", - "code": "900000097b4b30b2437b0073e5ba5a9324cf55831d180a89f66332b541827e12e647b7516140000a504d00205d4d30001a4860004945048076440001240400005050c0043d51345024040000", - "tx_id": "0000000000000000000000000000000000000000000000000000000000000000", - "output_index": 0, - "tx_pointer_block_height": 0, - "tx_pointer_tx_idx": 0, - "states": [], - "balances": [] - }, - { - "contract_id": "0x7e2becd64cd598da59b4d1064b711661898656c6b1f4918a787156b8965dc83c", - "code": "1af030007400000200000000000014605dffc00110ffff00740000001aec500091000b285d43f015104103001a4460005d4d10491b441000104934405d47f008104404405d4920001b44144010453440504fb0205fed10045fed20055047ba8872500010284535005047ba88504fb46072500010284d15005d453000504fb0105fed10025fed20035047ba2872480010284534805047ba285fed00005d43f0085fed00015043b2d0724800102843b480504bb650724c0010284914c05047b660724c0010284504c01ae920001ae5100020f8330058fbe00250fbe0047400041a1a43d00076400001740000a71a4060005d41004a1b441000104104405047ba9872480020284504805043ba985047b03072480020284504805043b0b072480020284114805047b95072480020284504805043b95071440006504bb0f8724c0020284914c05047b890724c0020284504c05043b8f0724c0020284124c0a1411420764000065043b2e05fec005c504bb7907244001028490440740000085043b2805fec10505045000f5c4bf0505e452000504bb79072440010284904405d43f00b264000001a4070005fed01365d43f00b5fed01375fec01385057b9b05043b53072440010284124405d43b0f213410000764000475d43b0a613410040764000025d43f00c364000005043b5305041000f5c4100001ae810001ae5500020f8330058fbe00250fbe0047400042e5d4550005d4950015d4d5002104d3040165124c076500001135124c0765000065047b3605fec006c504fb7a072480018284d14807400000d124d3480104d30401b4d24c0264c0000281d14801a447000504bb1185fec10235fed10245fed3025504fb7a072440018284d24405047b54072480018284534805d47b0f4134510007644000f5d47b0a813451040764400025d43f00c364000005047b54050451008504bb5405049200850492008724c0008285514c050455008724c0008284524c05d4550005d4950021b481480104514805e4500005d415002104100405f550002740000061ae800001ae5500020f8330058fbe00250fbe004740003ef5043b9b050450010504bb1e0724c0008284904c050412008724c0008284114c05043ba3872440010284124405043ba385047b6c072480010284504801ae9100020f8330058fbe00250fbe004740004311a43d0005047ba38504bb780724c0010284914c01ae9200020f8330058fbe00250fbe004740003c01a47d000254110005d43f016104103005047ba28504bb3505fed006a5d43f00d5fed006b5043b3f0724c0010284124c0504bb670724c0010284914c05047b710724c0010284504c01ae920001ae5100020f8330058fbe00250fbe0047400035a1a43d000764000017400012f1a4060005d41004a1b441000104104405047bab872480020284504805043bab85047b05072480020284504805043b13072480020284114805047b97072480020284504805043b97071440006504bb150724c0020284914c05047b8b0724c0020284504c05043b910724c0020284124c0a1411420764000065043b3105fec0062504bb7b872440020284904407400002d5043b2905fec10525047b6405d4bf01710492300724c0008284524c05d4bf008264800001a4c7000284d14805047b1f05fed303e5d4bf00f5fed203f504bb470724c0010284914c05d492001504fb48072500010284d15005d4530001b492040504fb4b05fed10965fed20975047b4c072480010284534805d451000504bb4d072500010284935005d4920015053b4e072540010285135405d4d40015fed10535fed20545fed3055504bb7b872440020284904405d43f00b264000001a4070005fed01395d43f00b5fed013a5fec013b5057b9c85043b58872440020284124405d43b0f713410000764000aa5d43b0b113410040764000025d43f00c364000005043b588504100085047baf872480018284504801ae810001ae5500020f8330058fbe00250fbe00474000347505bbaf85d43b1615d4550005d4950015d4d50025d53f008104d3500165124c076500001135124c0765000065047b3a85fec0075504fb7d872480018284d14807400000d124d3480104d30401b4d24c0264c0000281d14801a447000504bb1705fec102e5fed102f5fed3030504fb7d872440018284d24405047b5d872480018284534805d47b0fb134510007644000f5d47b0bb13451040764400025d43f00c364000005047b5d850451008504bb5d85049200850492008724c0008285514c050455008724c0008284524c05d4550005d4950021b481480104514805f4500005d4150025d47f008104104405f5500021a5c00005d41600216417400764000017400005f5d416002164505c076440001134505c07644000b5d416000104105c05047b2f05fec105e5c4100005049100f5e490000504bb7f07240001028491400740000055043b0705fec000e504bb7f072440010284904405043b62072440010284124405d43b0fe1341004076400001360000005043b6205041000f5c4100005d4550005d4950015d4d5002104d3040165124c076500001135124c0765000065047b3785fec006f504fb80072480018284d14807400000d124d3480104d30401b4d24c0264c0000281d14801a447000504bb2005fec10405fed10415fed3042504fb80072440018284d24405047b55872480018284534805d47b100134510007644000f5d47b0ab13451040764400025d43f00c364000005047b55850451008504bb5585049200850492008724c0008285514c050455008724c0008284524c05d4550005d4950021b481480104514805e4500005d415002104100405f550002105d70407500005b1ae800001ae5500020f8330058fbe00250fbe004740002a75043b9c850450010504bb260724c0008284904c050412008724c0008284114c05043ba4872440010284124405043ba485047b6d072480010284504801ae9100020f8330058fbe00250fbe004740002e91a43d0005047ba48504bb680724c0010284914c01ae9200020f8330058fbe00250fbe004740002781a47d000254110005d43f018104103005047ba28504bb4005fed00805d43f0105fed00815043b410724c0010284124c0504bb720724c0010284914c05047b730724c0010284504c01ae920001ae5100020f8330058fbe00250fbe004740002121a43d000764000017400012f1a4060005d41004a1b441000104104405047bad872480020284504805043bad85047b08072480020284504805043b18872480020284114805047b99072480020284504805043b99071440006504bb1a8724c0020284914c05047b8d0724c0020284504c05043b930724c0020284124c0a1411420764000065043b3305fec0066504bb81872440020284904407400002d5043b2b05fec10565047b6485d4bf01910492300724c0008284524c05d4bf008264800001a4c7000284d14805047b2185fed30435d4bf0125fed2044504bb4f0724c0010284914c05d492001504fb50072500010284d15005d4530001b492040504fb5105fed10a25fed20a35047b52072480010284534805d451000504bb49072500010284935005d4920015053b4a072540010285135405d4d40015fed10575fed20585fed3059504bb81872440020284904405d43f00b264000001a4070005fed013c5d43f00b5fed013d5fec013e5057b9e05043b5a872440020284124405d43b10313410000764000aa5d43b0b513410040764000025d43f00c364000005043b5a8504100085047bb1072480018284504801ae810001ae5500020f8330058fbe00250fbe004740001ff505bbb105d43b1645d4550005d4950015d4d50025d53f008104d3500165124c076500001135124c0765000065047b3c05fec0078504fb83872480018284d14807400000d124d3480104d30401b4d24c0264c0000281d14801a447000504bb1c85fec10395fed103a5fed303b504fb83872440018284d24405047b5f072480018284534805d47b107134510007644000f5d47b0be13451040764400025d43f00c364000005047b5f050451008504bb5f05049200850492008724c0008285514c050455008724c0008284524c05d4550005d4950021b481480104514805f4500005d4150025d47f008104104405f5500021a5c00005d41600216417400764000017400005f5d416002164505c076440001134505c07644000b5d416000104105c05047b3005fec10605c4100005049100f5e490000504bb8507240001028491400740000055043b0a05fec0014504bb85072440010284904405043b63072440010284124405d43b10a1341004076400001360000005043b6305041000f5c4100005d4550005d4950015d4d5002104d3040165124c076500001135124c0765000065047b3905fec0072504fb86072480018284d14807400000d124d3480104d30401b4d24c0264c0000281d14801a447000504bb2285fec10455fed10465fed3047504fb86072440018284d24405047b57072480018284534805d47b10c134510007644000f5d47b0ae13451040764400025d43f00c364000005047b57050451008504bb5705049200850492008724c0008285514c050455008724c0008284524c05d4550005d4950021b481480104514805e4500005d415002104100405f550002105d70407500005b1ae800001ae5500020f8330058fbe00250fbe0047400015f5043b9e050450010504bb270724c0008284904c050412008724c0008284114c05043ba5872440010284124405043ba585047b6e072480010284504801ae9100020f8330058fbe00250fbe004740001a11a43d0005047ba58504bb690724c0010284914c01ae9200020f8330058fbe00250fbe004740001301a47d000254110005d43f01a104103005047ba28504bb4205fed00845d43f0135fed00855043b430724c0010284124c0504bb740724c0010284914c05047b750724c0010284504c01ae920001ae5100020f8330058fbe00250fbe004740000ca1a43d00076400001740000635d43f00b264000001a4070005fed013f5d43f00b5fed01405fec01415053b9f85d43b13f5d47b1405d4bb1415d4ff008104924c0164d1480764c0001134d1480764c00065043b3d85fec007b504bb87872440018284904407400000d12492440104920401b49148026480000281d04401a4070005047b0d05fec101a5fed001b5fed201c504bb87872400018284914005043b60872440018284124405d43b10f134100007640000f5d43b0c113410040764000025d43f00c364000005043b608504100085047b608504510085045100872480008285104805041400872480008284114805d4140005d4540021b441440104104401a4410005f4110005d4140025d47f008104104405f5100025043b9f850450010504bb240724c0008284904c050412008724c0008284114c05043ba6872440010284124405043ba685047b6f072480010284504801ae9100020f8330058fbe00250fbe004740001251a43d0005047ba68504bb6a0724c0010284914c01ae9200020f8330058fbe00250fbe004740000b41a47d000254110005d43f01b104103005047ba28504bb4405fed00885d43f0135fed00895043b450724c0010284124c0504bb760724c0010284914c05047b770724c0010284504c01ae920001ae5100020f8330058fbe00250fbe0047400004e1a43d00076400001740000495043b2505fec004a5d47f00b264400001a4470005fed11425d47f00b5fed11435fec01445047ba10504bb5c8724c0010284904c05d43b04a13410000764000135d43b0b913410040764000025d43f00c364000005d43b0ba1ae810001ae5100020f8330058fbe00250fbe0047400008e1ae900001ae5100020f8330058fbe00250fbe00474000088740000061ae800001ae5100020f8330058fbe00250fbe004740000815043ba1050450010504bb0e8724c0008284904c050412008724c0008284114c05043ba7872440010284124405043ba785047b70072480010284504801ae9100020f8330058fbe00250fbe004740000c31a43d0005047ba78504bb6b0724c0010284914c01ae9200020f8330058fbe00250fbe004740000521a47d000254110005d43f014364000009500003f960800001aec5000910000501a43a0001a4790001a4be000724c001028ed04c01aebb00020f8330058fbe00250fbe004740000301a4fd0005053b01072540010285115401ae9400020f8330058fbe00250fbe004740000271a53d000134d3500134d30001a500000764c001c504fb03072500010284d05001ae9300020f8330058fbe00250fbe004740000811a4fd0005053b04072540010285115401ae9400020f8330058fbe00250fbe004740000781a47d0005053b02072540010285105401ae9400020f8330058fbe00250fbe004740000081a43d000295134501af54000920000501af92000980800009700003f4af8000095000007960800001aec5000910000101a43a0001a47e0007248001028ed04801a43b0005d4100011af50000920000101af9100098080000970000074af8000095000007960800001aec5000910000101a43a0001a47e0007248001028ed04801a43b0005d410001124100401af50000920000101af9100098080000970000074af800009500007f960800001aec5000910000601a4fa0001a5790001a53e0005d5950005d4150015d4550025d4bf00810451480164904407648000113490440764800065043b0185fec0003504bb04872440018284904407400000c12451400104510401b45044026440000281d64001a4070005fec10005fed00015fed1002504bb04872400018284bb4005043b03072440018284124405d43b009134100007640000f5d43b00613410040764000025d43f00c364000005043b030504100085047b030504510085045100872480008285504805041500872480008284114805d4150005d4550021b441440104104405f4130005d4150025d47f008104104405f5500021af40000920000601af94000980800009700007f4af8000095000007960800001aec5000910000101a43a0001a47e0007248001028ed04801a43b0005d4100001af50000920000101af9100098080000970000074af8000095000007960800001aec5000910000101a43a0001a47e0007248001028ed04801a43b0005d4100001af50000920000101af9100098080000970000074af8000047000000646563696d616c736e616d650000000073796d626f6c0000746f74616c5f61737365747300000000746f74616c5f737570706c790000000000000000000002480000000000000008000000000000025009000000000000000000000000000400cccccccccccc0002000000000000000445746865720000000000000000000005000000000000000645544800000000000000000000000003000000000000000c000000000000007b0000000000001460000000000000146800000000000014d0000000000000147000000000000014e800000000000014780000000000001488", - "tx_id": "0000000000000000000000000000000000000000000000000000000000000001", - "output_index": 0, - "tx_pointer_block_height": 0, - "tx_pointer_tx_idx": 0, - "states": [], - "balances": [] - } - ], - "last_block": null -} \ No newline at end of file diff --git a/.github/workflows/local-testnode/state_transition_bytecode.wasm b/.github/workflows/local-testnode/state_transition_bytecode.wasm deleted file mode 100755 index 7547b6d1b097b08f66b807588318bc4770fc9469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2478862 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 >Epc+kd2{&p2Q_` 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

{dye{XcaB0 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%0D4$r|u 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

2=e2#~r)+Z_Q?*QhrI81I_P z)-_jf06p0^o%8?<7j?tpfB{no^{R!qH_$f9_A90Orfm0(s!89BbpoBDy77}*t4^R( z)RX-5V<&{ZQJ1NUB3PS3?;8@VUuc&13uC;g9h~5#I>#+eKecTkwaE7{Vn&F z+Ka>A>=tA1Iu;!>nAkwlg)e3g_4lD4e6jjMjlxT%ztr>6a>SYT`I-AKQQbdGs&k&d zP(@b1nCPxy>^H^F8c-hIhiEn+e3~_|lhoTA24An`r@1^dk50+vUEuz-36}BM9MfKhANBL`4FRfiG47{knM?`Bc`oT#cc`g7L!6y zD#E;8mukEXPJ4_W4JTS`R}2aKL4e7si0y!Ej1d3Vi+eGz=jYW}*Yk5^$aZkO_!{i$ z`FTCI^Zb0{kn&~4gu4`3BjMv@y?D!Tpr5y5QozsKFf!oh+c^^F=k1(`^K&0Y=KS1` zjX6IjF)`=oo!DdX^AILc>S-H-!x=s|WcP^Q2(>#SCQlIFvx>GlNv zXb9=nMBhTXEiq%EIYK_LJwmt+0Ix#`Z(oFTTzR&PN1*>C&*SOmpndpx_AjxF*M*Cs z;)jQg_=>v>@A)gh1bNufgL(aFVGe%rF>Wbjvp={aUyu1+XhD?6vZPb1?hI zj66TDkq4ZE*{c~(e!g11Zw_XMApm~93IgEgUI>7nL-KcXFuMm2r~G`S9NiquUIhX0 z^A!*PKVJ?3@bhJIY;!QX8v@|xE(n01e*^*Wa}WaH=amouKVJ#~@be`Q06zz?iQ{J- zn>c=6f%z;yFUNG2pO;}e%g=snkomcDSm|dp9O`E{9OB(#We>KvB1g!NCt}Z7PmbCD)4zs$J@i4}X6c8whYqd(*}Oe9HR_c);=( zXEz6Sh5Rjxu)vY+CkvPuzt0vdT>L&$U{%ZS)na(3em`Eo4*9)Ozz_NTSOG)i_i_P8 zcJXTMC&+^+0BcsTnd4-N=&c|p*%^kB*ZhqGT4tjD7p zhqGVs-~z#a?Lm8K1d*k45=?G7Fa|vFaX9;V56%(%kO$-2AXCEpSAtE|1?m<=aCq1ZY{)B@0;q0vaS~Y*%gR16_dC;rb z_iFyAV1275mr)c{HGf1w8?h0&{c(t0DMtGbXa8r2JzI?KJe*xrOl<3L_U}EYlCA`t zrwdqsM(Pg*=vdx=5YjFe_zqN~e_w!Ztw#S|Nc&j93ojat%L4dl{Ei3J%>PS4twe{j zr#+}b{|^PJ^v4SXZx#C60!&+>mqOar0>^|Z^tS})S)sof(w-^wIuL2UA;650z(+l( zLVsPsJFU=P^Pmd-RRt;Zlf}q;kqbDn7k@=TF>*ck6UgF^1naOb;6)r7ZFKrE!J5}< zY^Z-%FfFnAcG}14-wCEYg}$X3B8h)1STDSE!&5YZJtf$k;oC6I{{~pyIh_4)UT2!c z#uYN`Q{#)$<-zPscvw=iTYRQ&r6V-$KR(=F9O1OUr!am6nDxr1(km9&$Pt6-C^kiG zbmu#&{kpWJhhOB+@9XBdHN=Y-G}Ww78CUzAKrEueZ@3T-!k{=;b$+*qCW{V6%?|IW z|NR6Q-Loq7CoM4YA(;UD&lA9bfPXUqzpG4z$prJaIV!oxC@cIQ37;*+ZVzUc z3KsB(;i+$c?dJ1kefkGKx{=jiTEF*w5+i?rMH?}a{M47a01*xV96<4Rjsd9T{s^Eb ziabj(T7))nEw~OveUl!e70z0^OF5pi)^(nX{D** zVj|Bqz3^RLd4d9^K9U8l0GAs8`vL%$65uF^6^H;Y2B5@awhjN7F(H9I%dyqFF1zGi zfN^f0>y-jeIp8+wrA#Rq$3xLb9m+Mp-3{P(4Y1w-e%k;TI>tO?g$_Gu0E|OU6A}Vr z1uIVRqnJ2ScTKv%_p5tJeJxX!TGn_8sE?e`-SC1(!iKpu>0%~I7M=550S_HpD&X zrjIV3Cj9B?M^6#nNBA?PpfitwcJJv^r?jhjax`=Fs~=-8Idimp>=X$?I=cRtKCy3) zu8|tDJlcDVucm1jt$xR7N;hf6e&A$Nf$8zGOVu+R!@Bn!b7-KYTqDJ^F0%4mv(w;WQ`pCm!cOC!Ogr)ydV~6& zOuO~I^6EEv^;2G?SYF!6ztH>9_hj1T^N^c14(Y`=y$NSArC45bV0DBA@x+(7xf~X- zNHMG)Se(h~q0WTGEl~KX&}!QQLFI(7J=HK;M` zRec7LOUtzgNA$y|+2U+ki9hy}ESFK5NzkX-&|ja*yK#=3$=l0uCCLZAKfde&MS$Z8 z^0BoSDAL~4_yP=}>RLf$n#8z&(2B9JvJeFJORDK?eGN2@3j>@u`WM$kp$>b{g3 ztXbcys#JC?Y1nD#lh;E>e`954=rKv-2Whf_FsJz6#hCly>@*Wjc^m;x3m$ptv+p2U zX^})18@W0$`iCpY%ygFI7hqrvWT~EmIBy=GKJ8XhH;u0a)1d&bPf=w%#nW?s zg&sT$2FI?Y&MwwBH)S#D^TT3}=cXRH9c`5<)l;t6)ZbVJHtt7sTgceEuE( zw0=8}D{yffMd5rk`#SrmU;oF5KNo}Js63@CuU35Vbw-yPcu6}xoKyc(4s~y88YUe* z`fN~xO6iG!&g5hrZmkG{u}7b7uN;E0O`qnEroL7Vn1({v^WsSTi1^Wm8Ac9IrB2z+ z{kOSeqSKkGcf8(U>F-k-Y7J_OjLEMyikv3a1@FewQ}b|_>yCAbZ@Z!VB0! zd%T?;4>w0x%8rMqBdnF3eXCA<)YyUXKXSXyaq91mK@e7&@##ylU%+4CF`Q@E3+&9W04oI3bl*Li2}^vbWmp8OA!O-hXjq0ttqFi6 z2Ecp7FtqTiPZNgZ0(EEtz`Ou7pHy>p%2RI?U!5~iFq%?nI{ull(3@DsoD;Hvn|i>u zR>m5)V2tbIe9@!hyspI-4+QKvlu$H$G>$mI6mQUp6CF6Udo=qZdr#DyI!nDLQceK% zp6ECNTHQ74-9<%1SMm!VSMP>JMU=p$MJ6a2xTq!pJIvw;xK0r^g#*Bi*NXcqQ2>N= zIx4S-Hd@6erppqoV%qAzkXG?_suExO4KOYQxui$*jihPdx=*?S4uLHw@eEPQI~K9m zo)|T{$D#K8Rq=f4I8CrCu8za|@VGi|s-=#bYN_LbNOa$FW_Ni)++zyZ~nE zxT!`RM^LIfspAxshR@Y;64j{nJ8b8RNC7KHKuhYlscQOE*i!Ro(3m=Is!_+Wm-nu) zZZb_-0@1$Ps*a=B=T*nCAW0oZzpgjxI6DR1$aUJej?cEg7wR}z)=BtQQjWpof^tmf zt5N_;9rwaYyE(9KP968ciZ*0)sNn_nd6}kdqmKL4GB2Xo+F1ESaaF&Pd9#IXmKSA* z;}`ZctM#WPm)98Bz&S`obG9ViSe7A!b7)~W@A2jrjwb&zrh@r7 zwF3fV?VB5BG@ne-&B0MJiPClUI^P@S;24CIg8ii7A_B;Sgm34CECDJznC+=M7(mqa zg=+Y||MjEvj6R>Jp|%5b=4$<;H^R`)PRf^PJ2ktX5>!F`A;XS_!}>vg)&}RL+MNB_ z^>WVM01CcsFE>X#Ho|O59$`RQoum430fPj?O|62nf_RnL?wwQP2 z9c`nj2s>%49$`x8WaR3Cjlb3z(+~-a>P6#()G!8S6QlRekS@l+>$=(0_M+i=-;FQ} zn3Zr0`(E7_dhIa-^!{>%<(GHY7Y|$v5h14r?wIxiSrys0KS%Y;QOVd*@>-TCLW`ncdz{rtr zkH#J)HW-Vojm4_5*!o!P?y=atF{a87@R&o}R0@xh)u)PMcjfperkeC6&^$IiY{k*_aK=Vf9Iu_y z7S=mWgrQ1Yd;)$bvZ-MSr#}u0*rmx=9I4M0gI^TaaXnRelxvn8?uwkuiZ@q*_CMP) zB6P{{x9-^~BP$~3z&&xDvVKZi9#-=UU=ue}As7Zq{s&EKuGI>i0tpxg)7v^^HmcRR zi!v>aD3P*_jah~a`4$!7X?H7d`_&JG{vbO|-ey zz;N_53mMzCka5LOUe%OGNlm+v^P6Ix3f6&Mj0*T7rmHVJ zW#3Enu*3F&b9zHdCw)lKg_AQWU8FoA<-;-4kQ{ABsR(=8Ejp_XdIuLc@?{XsV%M+LgCGD(`Q^>3(*mUc0!Nv^akT{g7#B8`gnHbw~zD@2MJE1tEY5qOZRtaz3rHlcBk!!0k_ zWt0c?#GDu3Bt$)ncow7E@P|Rq86X1Y=!=v^>^TEeeEKQQv9Qp@t}R z)0??A*Cu9T1a(Ngj-Ci()nHpJA!TS5b%1qNLI!=eJh|J>Q!KtNIz{CY(<{YM%f$FN z9rq{bygxAyO4$&bLf|sTEHhE@PL`;vm_zlObe`{q#C;hOcWFT%sx>=WjUFHCV#KH~ zOX8H%Qq_;<#JqFH34pgz=NH_vxggpz`;K5ZV#aAw%nja++SY99xyI`{#o0gm(sI@w z4-d-1Ym>@Cp8YVzrqAJP%qZ`SpesZXlK{pAt~LM~ibBnkO;=cdI5%|?tfT&r2e|_( z1(=jf%okJmPop~x<`1qiv60Q|_vFXc(S353U1!5tW!SfO0KNfRnLbu|*g`z=jq`;P zt2yf2XkMy0fr8qlXBHPdte0oK>cP z5Lp3WkQgEmc>!RM8X_<<{Z@{q#)R*;Kyk{nKyg+DP&IFF^}v$tI~jLeraVrDrI(?e zbb2es==gY%Bzk~VYQxTTL0xB(j$g;e*qJ?>j~2Ll0%NGm%y{7gjES0d-%w}D{gNSV z{=-hA58oxnh3PCWx@FhSKe*?|7F#`O3T`_oPERGy#^k<~~h&ZaN7Hu&sh za$9T`Q;WVxVAMyho|Tn|=2JCoI!Gt;UVR=*u0ACHKjF?_iQ1kz7Y2WtBXtb27Rn;e z=n2{U)Vf9=4l7l<*`3-HQYgnub$wXn)78`Um#5H|q|hjZcBRmA3iUmtnqM{s%IyR! zhMGY(V=Su^!)v1xi_24Sc^!+(>sVY~$Kvuj7MItdIQp>gg1tjc$y2)V-9($|M*oj* z=&JD!GIE;ip@znMe7?tq(Ma*Tn&98ss2TMCYl8o&3GzCDcWYk%aTEN#5EL0`s99-j zu$e+v6{H@QfFUwer|PS7pjb|$oiu7 zmT`~^P4IjZJl6y{wv3;_ovk-ps(!aS8@GYpKqC&MQTe;;KGS z=8sVqsyd7vchD*;`l_j1Rr;hZv}sK{lQ9i}e{2o-;?98X)+r4?Cz-c5Zjg^|m4DrQ zfe|jpDCt^@5e~!LQa5|=^mRh>e0efVMl+(Ape%KYX>Cf!JG$zRD@%RIf7ypT&F3 zKk{mf6GyumfjF2|W7YUrj^3zMjj1n8HLmKmajP10pQCC>$zh6*$GQE1!dZr&m@lQl zYWI@SBC=Qaap*m0ZTawbC_#Kma- zY;nZJX#H$)#Kma*OngjS?4zU`_UG8E(h_cD@|WC9pc(u!y{R1x1>>XycMv}J4U0#_ zF%1rgzaqpNpgj$dqH6OTKk__?S8^K0oYviv!M_7ZI5nVt&yOkgxU7hxcL!AsxjS^BZ?y&EzF6Nip6Jz34F-*;2%J8l%iEgzyCujc zjb{gCC-J25?9h+ItEkhP)ZA~@?9 zQxg76TjR;cIAVElG$V~?%4w>ai5gE{MoVp^E2=(zZnSBUvW**Mc2&+bo>aj#o<8_z zObIj{G3Ey!YJ5LkwzO_Y1K;!=y_?$VqIJZ`Fz89j`s1dzQ)POwD8}e+v-VO&YI|(C zU0H)(GzXOem;OF;Q;iM^sbPPyf)*Pf4*^pdh#pCT-ePQo+;R>(&Of8#bt@ogs0<*RhQbU?3)0 ziNW+;savrqz&03BV;iyL_zMNkaI`}+Mzf}fD?8mObk@_T%OO)&8A_c*95Rk^ctsbj zdWyp@TB$%K{Po+SS3jBE8lGd(a9*doggYeA?zTCeoetOc-_6?PU@X|1yU7zI*f3b zx65EmPltKi4aO9mRzodf4Q0N@xOIe|-B`MHlxt)arxr|BM_$AI7Jd(Ru-rU!Vz_H= zTDF6s!D|Ft4Q@59)nG_bJu+A4L#Fz0Npum~I~s^u2O=4CtUWL*9)hT072Hekv^#>j|i5Qs^R z6dxSksg8cora_uAYgBnK+%Y$$rCI|L#%eBETpN^O()?Q;hcZl>ihCkd!?fQbR3~tS zS2l5*46kb9Hd$UB<8m9;u?YO=CdOfFW|1cKjRuOL)*n1P3o#rJeY7(k168_Q~VJBf+$kCoEm*pU-~+u~2HDz_Ta zVrzlfsnM~X1Q}7)UMw&%@7p`cy7jGb?8K_Mb(6?VJfuaMEqZKqP;3ZndLRFs$2yN0 z4aH-J;<22%CRRNRJa+zT=UEu$c{6+%PAYd%VBk~(eGpBcwBWz&M@Ly*QFoEqXA``qC%nE4Y>o1m9`{WS|Xp!)3q^R3VJ3AvA*1XxC zB21bpMiPS#Oc+14V#1T_J(60INiQO`G}`&Jm$UVLMV(Xzz!j5Mq~XCaSi54i0X$5pq^wiM(lF28LnrJ&LD&kEBB4X_f8P_}DLl z9AWr)rKEPB;m4vD)WBR@bWX zAe^?E80a>p5k8YhLCH&ZHX4^8ODɾ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 diff --git a/forc-plugins/forc-client/tests/deploy.rs b/forc-plugins/forc-client/tests/deploy.rs index d6ca5c6c858..3f786293792 100644 --- a/forc-plugins/forc-client/tests/deploy.rs +++ b/forc-plugins/forc-client/tests/deploy.rs @@ -24,15 +24,6 @@ fn get_workspace_root() -> PathBuf { .unwrap() } -/// Return the path to the chain config file which is expected to be in -/// `.github/workflows/local-node` from sway repo root. -fn chain_config_path() -> PathBuf { - get_workspace_root() - .join(".github") - .join("workflows") - .join("local-testnode") -} - fn test_data_path() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")) .join("test") @@ -44,7 +35,6 @@ fn test_data_path() -> PathBuf { fn run_node() -> (Child, Port) { let port = portpicker::pick_unused_port().expect("No ports free"); - let chain_config = chain_config_path(); let child = Command::new("fuel-core") .arg("run") .arg("--debug") @@ -52,8 +42,6 @@ fn run_node() -> (Child, Port) { .arg("in-memory") .arg("--port") .arg(port.to_string()) - .arg("--snapshot") - .arg(format!("{}", chain_config.display())) .spawn() .expect("Failed to start fuel-core"); (child, port) From 090187e76b539fba0cba0160baf7859416e24e77 Mon Sep 17 00:00:00 2001 From: Daniel Frederico Lins Leite Date: Tue, 9 Jul 2024 00:55:03 +0100 Subject: [PATCH 13/19] Fix `Bytes`, `Vec` and `String` buffer ownership (#6142) ## Description This PR fixes a problem with `std::Bytes`, `std::Vec` and `std::String` buffer ownership. It also fixes a problem with buffer overflow when encoding huge types. ## Buffer Ownership Currently, types like `Bytes`, `Vec` and `String` do not guarantee ownership of their buffer. That means that we can very easily alias the underlying buffer and change its mutability by simply creating a new instance. For example: ```sway let some_slice = ...; let buffer = Bytes::from(some_slice); let mut buffer2 = buffer.clone(); // Now I can change `some_slice` ``` ## Type Inference bug I also had to fix a small problem with the type inference of method applications. The problem is that sometimes the type check does not return an error on the first pass, but the type is still not concrete. For example `x.get(0) == Some(2)`, becomes `eq(x.get(0), Some(2))`. After the first pass, `x.get(0)` is correctly inferred to be `Option`; but `Some(2)` is only typed as `Option`. This happens because the first pass starts with `TypeInfo::Unknown`. We can use the argument types here because they may still be non-concrete types like "Self". What the fix is doing is that it checks if the inferred type `is_concrete`, assuming that `Numeric` is not. This will make "Some(2)" be type-checked again at the second pass, after monomorphization and be correctly typed as "Option". ## IR Verification errors This PR also improves the error message for IR verification. Now the error is shown inside the printed IR. ![image](https://github.com/FuelLabs/sway/assets/83425/4f9eae39-0ce2-428d-be46-a215797ee8dd) ## Script to update contract-ids (optional) At `test/update-contract-ids.sh` there is a small script that automatically updates contract ids. Unfortunately, given the indirect nature of contract calls, it is impossible for the script to know which contract it needs to compile. So we need to specify the path to the contract. We also need to pass the compiler flags, because in some cases we use `debug` profile, and in others we use `release`. ```sway const FUEL_COIN_CONTRACT_ID = 0x1a88d0982d216958d18378b6784614b75868a542dc05f8cc85cf3da44268c76c; // AUTO-CONTRACT-ID ../../test_contracts/test_fuel_coin_contract --release ``` In the example above, the path and flags are appended in the bash script. I failed trying to inject commands, so I think the append is safe. I can remove this from the PR, if we find that this is not the solution we want at the moment. ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --- forc-plugins/forc-client/tests/deploy.rs | 2 +- sway-core/src/ir_generation/function.rs | 218 +++++++++++++++ .../src/language/ty/declaration/function.rs | 12 +- .../ast_node/expression/intrinsic_function.rs | 34 ++- .../typed_expression/method_application.rs | 19 +- sway-core/src/type_system/id.rs | 22 +- sway-core/src/type_system/priv_prelude.rs | 2 +- sway-lib-core/src/codec.sw | 260 ++++++++++++------ sway-lib-std/src/alloc.sw | 5 +- sway-lib-std/src/bytes.sw | 76 ++--- sway-lib-std/src/string.sw | 33 +-- sway-lib-std/src/vec.sw | 34 ++- .../json_abi_oracle_new_encoding.json | 32 +-- .../language/slice/slice_contract/src/main.sw | 3 +- .../string_slice_contract/src/main.sw | 3 +- .../json_abi_oracle_new_encoding.json | 2 +- .../array_of_structs_caller/src/main.sw | 2 +- .../asset_ops_test/src/main.sw | 4 +- .../bal_opcode/src/main.sw | 2 +- .../call_abi_with_tuples/src/main.sw | 2 +- .../call_basic_storage/src/main.sw | 2 +- .../src/main.sw | 2 +- .../call_increment_contract/src/main.sw | 2 +- .../call_storage_enum/src/main.sw | 2 +- .../caller_auth_test/src/main.sw | 2 +- .../caller_context_test/src/main.sw | 2 +- .../nested_struct_args_caller/src/main.sw | 2 +- .../storage_access_caller/src/main.sw | 2 +- .../contract_multi_test/src/main.sw | 6 +- .../bytes_inline_tests/src/main.sw | 4 +- .../string_inline_tests/src/main.sw | 9 +- .../vec_inline_tests/src/main.sw | 4 +- test/update-contract-ids.sh | 48 ++++ 33 files changed, 644 insertions(+), 210 deletions(-) create mode 100755 test/update-contract-ids.sh diff --git a/forc-plugins/forc-client/tests/deploy.rs b/forc-plugins/forc-client/tests/deploy.rs index 3f786293792..04b5a261a86 100644 --- a/forc-plugins/forc-client/tests/deploy.rs +++ b/forc-plugins/forc-client/tests/deploy.rs @@ -107,7 +107,7 @@ async fn simple_deploy() { node.kill().unwrap(); let expected = vec![DeployedContract { id: ContractId::from_str( - "428896412bda8530282a7b8fca5d20b2a73f30037612ca3a31750cf3bf0e976a", + "822c8d3672471f64f14f326447793c7377b6e430122db23b622880ccbd8a33ef", ) .unwrap(), }]; diff --git a/sway-core/src/ir_generation/function.rs b/sway-core/src/ir_generation/function.rs index c459a5cd6fa..b430929dcf8 100644 --- a/sway-core/src/ir_generation/function.rs +++ b/sway-core/src/ir_generation/function.rs @@ -1717,6 +1717,224 @@ impl<'eng> FnCompiler<'eng> { Ok(increase_len(&mut s.current_block, context, len, 8 - offset)) } + fn grow_if_needed( + s: &mut FnCompiler<'_>, + context: &mut Context, + ptr: Value, + cap: Value, + len: Value, + needed_size: Value, + ) -> (Value, Value) { + assert!(ptr.get_type(context).unwrap().is_ptr(context)); + assert!(cap.get_type(context).unwrap().is_uint64(context)); + + let ptr_u8 = Type::new_ptr(context, Type::get_uint8(context)); + + // merge block has two arguments: ptr, cap + let merge_block = s.function.create_block(context, None); + let merge_block_ptr = Value::new_argument( + context, + BlockArgument { + block: merge_block, + idx: 0, + ty: ptr_u8, + }, + ); + merge_block.add_arg(context, merge_block_ptr); + let merge_block_cap = Value::new_argument( + context, + BlockArgument { + block: merge_block, + idx: 1, + ty: Type::get_uint64(context), + }, + ); + merge_block.add_arg(context, merge_block_cap); + + let true_block_begin = s.function.create_block(context, None); + let false_block_begin = s.function.create_block(context, None); + + // if len + needed_size > cap + let needed_cap = s.current_block.append(context).binary_op( + BinaryOpKind::Add, + len, + needed_size, + ); + let needs_realloc = s.current_block.append(context).cmp( + Predicate::GreaterThan, + needed_cap, + cap, + ); + s.current_block.append(context).conditional_branch( + needs_realloc, + true_block_begin, + false_block_begin, + vec![], + vec![], + ); + + // needs realloc block + // new_cap = cap * 2 + // aloc new_cap + // mcp hp old_ptr len + // hp: ptr u8 + s.current_block = true_block_begin; + let u8 = Type::get_uint8(context); + let ptr_u8 = Type::new_ptr(context, u8); + + let two = Constant::new_uint(context, 64, 2); + let two = Value::new_constant(context, two); + let new_cap = + s.current_block + .append(context) + .binary_op(BinaryOpKind::Mul, cap, two); + + let new_ptr = s.current_block.append(context).asm_block( + vec![ + AsmArg { + name: Ident::new_no_span("new_cap".into()), + initializer: Some(new_cap), + }, + AsmArg { + name: Ident::new_no_span("old_ptr".into()), + initializer: Some(ptr), + }, + AsmArg { + name: Ident::new_no_span("len".into()), + initializer: Some(len), + }, + ], + vec![ + AsmInstruction { + op_name: Ident::new_no_span("aloc".into()), + args: vec![Ident::new_no_span("new_cap".into())], + immediate: None, + metadata: None, + }, + AsmInstruction { + op_name: Ident::new_no_span("mcp".into()), + args: vec![ + Ident::new_no_span("hp".into()), + Ident::new_no_span("old_ptr".into()), + Ident::new_no_span("len".into()), + ], + immediate: None, + metadata: None, + }, + ], + ptr_u8, + Some(Ident::new_no_span("hp".into())), + ); + + s.current_block + .append(context) + .branch(merge_block, vec![new_ptr, new_cap]); + + // dont need realloc block + s.current_block = false_block_begin; + s.current_block + .append(context) + .branch(merge_block, vec![ptr, cap]); + + s.current_block = merge_block; + + assert!(merge_block_ptr.get_type(context).unwrap().is_ptr(context)); + assert!(merge_block_cap + .get_type(context) + .unwrap() + .is_uint64(context)); + + (merge_block_ptr, merge_block_cap) + } + + fn to_constant( + _s: &mut FnCompiler<'_>, + context: &mut Context, + needed_size: u64, + ) -> Value { + let needed_size = Constant::new_uint(context, 64, needed_size); + Value::new_constant(context, needed_size) + } + + // Grow the buffer if needed + let (ptr, cap) = match &*item_type { + TypeInfo::Boolean => { + let needed_size = to_constant(self, context, 1); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::UnsignedInteger(IntegerBits::Eight) => { + let needed_size = to_constant(self, context, 1); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::UnsignedInteger(IntegerBits::Sixteen) => { + let needed_size = to_constant(self, context, 2); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::UnsignedInteger(IntegerBits::ThirtyTwo) => { + let needed_size = to_constant(self, context, 4); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::UnsignedInteger(IntegerBits::SixtyFour) => { + let needed_size = to_constant(self, context, 8); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::UnsignedInteger(IntegerBits::V256) | TypeInfo::B256 => { + let needed_size = to_constant(self, context, 32); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::StringArray(string_len) => { + let needed_size = to_constant(self, context, string_len.val() as u64); + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + TypeInfo::StringSlice | TypeInfo::RawUntypedSlice => { + let uint64 = Type::get_uint64(context); + let u64_u64_type = Type::new_struct(context, vec![uint64, uint64]); + + // convert "item" to { u64, u64 } + let item = self.current_block.append(context).asm_block( + vec![AsmArg { + name: Ident::new_no_span("item".into()), + initializer: Some(item), + }], + vec![], + u64_u64_type, + Some(Ident::new_no_span("item".into())), + ); + + // save item to local _anon + let name = self.lexical_map.insert_anon(); + let item_local = self + .function + .new_local_var(context, name, u64_u64_type, None, false) + .map_err(|ir_error| { + CompileError::InternalOwned(ir_error.to_string(), Span::dummy()) + })?; + let ptr_to_local_item = + self.current_block.append(context).get_local(item_local); + self.current_block + .append(context) + .store(ptr_to_local_item, item); + + // _anon.1 = len + let needed_size = self.current_block.append(context).get_elem_ptr_with_idx( + ptr_to_local_item, + uint64, + 1, + ); + let needed_size = self.current_block.append(context).load(needed_size); + let eight = to_constant(self, context, 8); + let needed_size = self.current_block.append(context).binary_op( + BinaryOpKind::Add, + needed_size, + eight, + ); + + grow_if_needed(self, context, ptr, cap, len, needed_size) + } + _ => return Err(CompileError::EncodingUnsupportedType { span: item_span }), + }; + + // Append the value into the buffer let new_len = match &*item_type { TypeInfo::Boolean => { assert!(item.get_type(context).unwrap().is_bool(context)); diff --git a/sway-core/src/language/ty/declaration/function.rs b/sway-core/src/language/ty/declaration/function.rs index f2ff28b6331..c28d862846f 100644 --- a/sway-core/src/language/ty/declaration/function.rs +++ b/sway-core/src/language/ty/declaration/function.rs @@ -565,9 +565,15 @@ impl TyFunctionSig { } pub fn is_concrete(&self, engines: &Engines) -> bool { - self.return_type.is_concrete(engines) - && self.parameters.iter().all(|p| p.is_concrete(engines)) - && self.type_parameters.iter().all(|p| p.is_concrete(engines)) + self.return_type.is_concrete(engines, IncludeNumeric::No) + && self + .parameters + .iter() + .all(|p| p.is_concrete(engines, IncludeNumeric::No)) + && self + .type_parameters + .iter() + .all(|p| p.is_concrete(engines, IncludeNumeric::No)) } /// Returns a String representing the function. diff --git a/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs b/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs index 0a2ffbcc99f..9c324cf1289 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs @@ -247,21 +247,25 @@ fn type_check_encode_append( }; // only supported types - match &*engines.te().get(item_type) { - TypeInfo::Boolean - | TypeInfo::UnsignedInteger(IntegerBits::Eight) - | TypeInfo::UnsignedInteger(IntegerBits::Sixteen) - | TypeInfo::UnsignedInteger(IntegerBits::ThirtyTwo) - | TypeInfo::UnsignedInteger(IntegerBits::SixtyFour) - | TypeInfo::UnsignedInteger(IntegerBits::V256) - | TypeInfo::B256 - | TypeInfo::StringArray(_) - | TypeInfo::StringSlice - | TypeInfo::RawUntypedSlice => {} - _ => { - return Err(handler.emit_err(CompileError::EncodingUnsupportedType { span: item_span })) - } - }; + if item_type.is_concrete(engines, IncludeNumeric::Yes) { + match &*engines.te().get(item_type) { + TypeInfo::Boolean + | TypeInfo::UnsignedInteger(IntegerBits::Eight) + | TypeInfo::UnsignedInteger(IntegerBits::Sixteen) + | TypeInfo::UnsignedInteger(IntegerBits::ThirtyTwo) + | TypeInfo::UnsignedInteger(IntegerBits::SixtyFour) + | TypeInfo::UnsignedInteger(IntegerBits::V256) + | TypeInfo::B256 + | TypeInfo::StringArray(_) + | TypeInfo::StringSlice + | TypeInfo::RawUntypedSlice => {} + _ => { + return Err( + handler.emit_err(CompileError::EncodingUnsupportedType { span: item_span }) + ) + } + }; + } let kind = ty::TyIntrinsicFunctionKind { kind, diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs index f5cfc5c1ff3..7be712a0c00 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs @@ -46,11 +46,25 @@ pub(crate) fn type_check_method_application( .by_ref() .with_help_text("") .with_type_annotation(type_engine.insert(engines, TypeInfo::Unknown, None)); + // Ignore errors in method parameters // On the second pass we will throw the errors if they persist. let arg_handler = Handler::default(); let arg_opt = ty::TyExpression::type_check(&arg_handler, ctx, arg).ok(); + + // Check this type needs a second pass let has_errors = arg_handler.has_errors(); + let is_not_concrete = arg_opt + .as_ref() + .map(|x| { + x.return_type + .extract_inner_types(engines, IncludeSelf::Yes) + .iter() + .any(|x| !x.is_concrete(engines, IncludeNumeric::Yes)) + }) + .unwrap_or_default(); + let needs_second_pass = has_errors || is_not_concrete; + if index == 0 { // We want to emit errors in the self parameter and ignore TraitConstraintNotSatisfied with Placeholder // which may be recoverable on the second pass. @@ -66,7 +80,8 @@ pub(crate) fn type_check_method_application( }); handler.append(arg_handler); } - args_opt_buf.push_back((arg_opt, has_errors)); + + args_opt_buf.push_back((arg_opt, needs_second_pass)); } // resolve the method name to a typed function declaration and type_check @@ -115,6 +130,7 @@ pub(crate) fn type_check_method_application( } else { index }; + let ctx = if let Some(param) = method.parameters.get(param_index) { // We now try to type check it again, this time with the type annotation. ctx.by_ref() @@ -127,6 +143,7 @@ pub(crate) fn type_check_method_application( .with_help_text("") .with_type_annotation(type_engine.insert(engines, TypeInfo::Unknown, None)) }; + args_buf.push_back( ty::TyExpression::type_check(handler, ctx, arg) .unwrap_or_else(|err| ty::TyExpression::error(err, span.clone(), engines)), diff --git a/sway-core/src/type_system/id.rs b/sway-core/src/type_system/id.rs index 9403fcb03ef..9410fd2d6ac 100644 --- a/sway-core/src/type_system/id.rs +++ b/sway-core/src/type_system/id.rs @@ -27,6 +27,11 @@ pub enum IncludeSelf { No, } +pub enum IncludeNumeric { + Yes, + No, +} + /// A identifier to uniquely refer to our type terms #[derive(PartialEq, Eq, Hash, Clone, Copy, Ord, PartialOrd, Debug)] pub struct TypeId(usize); @@ -456,17 +461,26 @@ impl TypeId { })) } - pub(crate) fn is_concrete(&self, engines: &Engines) -> bool { + pub(crate) fn is_concrete(&self, engines: &Engines, include_numeric: IncludeNumeric) -> bool { let nested_types = (*self).extract_nested_types(engines); - !nested_types.into_iter().any(|x| { - matches!( + !nested_types.into_iter().any(|x| match include_numeric { + IncludeNumeric::Yes => matches!( + x, + TypeInfo::UnknownGeneric { .. } + | TypeInfo::Custom { .. } + | TypeInfo::Placeholder(..) + | TypeInfo::TraitType { .. } + | TypeInfo::TypeParam(..) + | TypeInfo::Numeric + ), + IncludeNumeric::No => matches!( x, TypeInfo::UnknownGeneric { .. } | TypeInfo::Custom { .. } | TypeInfo::Placeholder(..) | TypeInfo::TraitType { .. } | TypeInfo::TypeParam(..) - ) + ), }) } diff --git a/sway-core/src/type_system/priv_prelude.rs b/sway-core/src/type_system/priv_prelude.rs index bb40d738d00..b28ac22152d 100644 --- a/sway-core/src/type_system/priv_prelude.rs +++ b/sway-core/src/type_system/priv_prelude.rs @@ -16,6 +16,6 @@ pub use super::{ type_parameter::TypeParameter, }, engine::TypeEngine, - id::{IncludeSelf, TypeId}, + id::{IncludeNumeric, IncludeSelf, TypeId}, info::{AbiEncodeSizeHint, AbiName, TypeInfo, TypeSourceInfo}, }; diff --git a/sway-lib-core/src/codec.sw b/sway-lib-core/src/codec.sw index cc43cdbf2eb..9ab99efc188 100644 --- a/sway-lib-core/src/codec.sw +++ b/sway-lib-core/src/codec.sw @@ -12,6 +12,17 @@ impl Buffer { buffer: __encode_buffer_empty(), } } + + fn with_capacity(cap: u64) -> Self { + let ptr = asm(cap: cap) { + aloc cap; + hp: raw_ptr + }; + + Buffer { + buffer: (ptr, cap, 0), + } + } } impl AsRawSlice for Buffer { @@ -4984,6 +4995,85 @@ where // END TUPLES_DECODE use ::ops::*; +pub fn contract_call( + contract_id: b256, + method_name: str, + args: TArgs, + coins: u64, + asset_id: b256, + gas: u64, +) -> T +where + T: AbiDecode, + TArgs: AbiEncode, +{ + let first_parameter = encode(method_name); + let second_parameter = encode(args); + let params = encode(( + contract_id, + asm(a: first_parameter.ptr()) { + a: u64 + }, + asm(a: second_parameter.ptr()) { + a: u64 + }, + )); + + __contract_call(params.ptr(), coins, asset_id, gas); + let ptr = asm() { + ret: raw_ptr + }; + let len = asm() { + retl: u64 + }; + + let mut buffer = BufferReader::from_parts(ptr, len); + T::abi_decode(buffer) +} + +pub fn decode_script_data() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_script_data(); + T::abi_decode(buffer) +} + +pub fn decode_predicate_data() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_predicate_data(); + T::abi_decode(buffer) +} + +pub fn decode_predicate_data_by_index(index: u64) -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_predicate_data_by_index(index); + T::abi_decode(buffer) +} + +pub fn decode_first_param() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_first_parameter(); + T::abi_decode(buffer) +} + +pub fn decode_second_param() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_second_parameter(); + T::abi_decode(buffer) +} + +// Tests + + fn assert_encoding(value: T, expected: SLICE) where T: AbiEncode, @@ -5062,15 +5152,99 @@ fn to_slice(array: T) -> raw_slice { raw_slice::from_parts::(__addr_of(array), len) } -fn assert_eq(a: T, b: T) +fn assert_eq(a: T, b: T, revert_code: u64) where T: Eq, { if a != b { - __revert(0) + __revert(revert_code) } } +fn assert_neq(a: T, b: T, revert_code: u64) +where + T: Eq, +{ + if a == b { + __revert(revert_code) + } +} + +fn assert_no_write_after_buffer(value_to_append: T, size_of_t: u64) +where + T: AbiEncode, +{ + // This red zone should not be overwritten + let red_zone1 = asm(size: 1024) { + aloc size; + hp: raw_ptr + }; + red_zone1.write(0xFFFFFFFFFFFFFFFF); + + // Create encoding buffer with capacity for one item + let mut buffer = Buffer::with_capacity(size_of_t); + let ptr1 = buffer.buffer.0; + + // Append one item + let buffer = value_to_append.abi_encode(buffer); + assert_eq(ptr1, buffer.buffer.0, 1); // no buffer grow is expected + assert_eq(buffer.buffer.1, size_of_t, 2); // capacity must be still be one item + assert_eq(buffer.buffer.2, size_of_t, 3); // buffer has one item + + // This red zone should not be overwritten + let red_zone2 = asm(size: 1024) { + aloc size; + hp: raw_ptr + }; + red_zone2.write(0xFFFFFFFFFFFFFFFF); + + // Append another item + let buffer = value_to_append.abi_encode(buffer); + assert_neq(ptr1, buffer.buffer.0, 4); // must have allocated new buffer + assert_eq(buffer.buffer.1, size_of_t * 2, 5); // capacity for two items + assert_eq(buffer.buffer.2, size_of_t * 2, 6); // buffer has two items + + // Check that red zones were not overwritten + assert_eq(red_zone1.read::(), 0xFFFFFFFFFFFFFFFF, 7); + assert_eq(red_zone2.read::(), 0xFFFFFFFFFFFFFFFF, 8); +} + +#[test] +fn ok_encoding_should_not_write_outside_buffer() { + assert_no_write_after_buffer::(true, 1); + + // numbers + assert_no_write_after_buffer::(1, 1); + assert_no_write_after_buffer::(1, 2); + assert_no_write_after_buffer::(1, 4); + assert_no_write_after_buffer::(1, 8); + assert_no_write_after_buffer::( + 0x0000000000000000000000000000000000000000000000000000000000000001u256, + 32, + ); + assert_no_write_after_buffer::( + 0x0000000000000000000000000000000000000000000000000000000000000001, + 32, + ); + + // arrays + assert_no_write_after_buffer::<[u8; 1]>([1], 1); + assert_no_write_after_buffer::<[u8; 2]>([1, 1], 2); + assert_no_write_after_buffer::<[u8; 3]>([1, 1, 1], 3); + assert_no_write_after_buffer::<[u8; 4]>([1, 1, 1, 1], 4); + assert_no_write_after_buffer::<[u8; 5]>([1, 1, 1, 1, 1], 5); + + // string arrays + assert_no_write_after_buffer::(__to_str_array("h"), 1); + assert_no_write_after_buffer::(__to_str_array("he"), 2); + assert_no_write_after_buffer::(__to_str_array("hello world"), 11); + + // string slices + assert_no_write_after_buffer::("h", 9); + assert_no_write_after_buffer::("he", 10); + assert_no_write_after_buffer::("hello world", 19); +} + #[test] fn ok_abi_encoding() { // bool @@ -5177,85 +5351,9 @@ fn ok_abi_encoding() { assert_encoding([255u8; 5], [255u8; 5]); let array = abi_decode::<[u8; 1]>(to_slice([255u8])); - assert_eq(array[0], 255u8); + assert_eq(array[0], 255u8, 0); let array = abi_decode::<[u8; 2]>(to_slice([255u8, 254u8])); - assert_eq(array[0], 255u8); - assert_eq(array[1], 254u8); -} - -pub fn contract_call( - contract_id: b256, - method_name: str, - args: TArgs, - coins: u64, - asset_id: b256, - gas: u64, -) -> T -where - T: AbiDecode, - TArgs: AbiEncode, -{ - let first_parameter = encode(method_name); - let second_parameter = encode(args); - let params = encode(( - contract_id, - asm(a: first_parameter.ptr()) { - a: u64 - }, - asm(a: second_parameter.ptr()) { - a: u64 - }, - )); - - __contract_call(params.ptr(), coins, asset_id, gas); - let ptr = asm() { - ret: raw_ptr - }; - let len = asm() { - retl: u64 - }; - - let mut buffer = BufferReader::from_parts(ptr, len); - T::abi_decode(buffer) -} - -pub fn decode_script_data() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_script_data(); - T::abi_decode(buffer) -} - -pub fn decode_predicate_data() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_predicate_data(); - T::abi_decode(buffer) -} - -pub fn decode_predicate_data_by_index(index: u64) -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_predicate_data_by_index(index); - T::abi_decode(buffer) -} - -pub fn decode_first_param() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_first_parameter(); - T::abi_decode(buffer) -} - -pub fn decode_second_param() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_second_parameter(); - T::abi_decode(buffer) + assert_eq(array[0], 255u8, 0); + assert_eq(array[1], 254u8, 0); } diff --git a/sway-lib-std/src/alloc.sw b/sway-lib-std/src/alloc.sw index 9841fe5e1e1..bd3dd7cc095 100644 --- a/sway-lib-std/src/alloc.sw +++ b/sway-lib-std/src/alloc.sw @@ -112,10 +112,9 @@ pub fn realloc(ptr: raw_ptr, count: u64, new_count: u64) -> raw_ptr { /// } /// ``` pub fn alloc_bytes(count: u64) -> raw_ptr { - asm(size: count, ptr) { + asm(size: count) { aloc size; - move ptr hp; - ptr: raw_ptr + hp: raw_ptr } } diff --git a/sway-lib-std/src/bytes.sw b/sway-lib-std/src/bytes.sw index 0b3b99d9bf7..1887b46e41c 100644 --- a/sway-lib-std/src/bytes.sw +++ b/sway-lib-std/src/bytes.sw @@ -74,14 +74,16 @@ impl From for RawBytes { /// assert(raw_bytes.capacity == 3); /// ``` fn from(slice: raw_slice) -> Self { - Self { - ptr: slice.ptr(), - cap: slice.number_of_bytes(), + let cap = slice.number_of_bytes(); + let ptr = alloc_bytes(cap); + if cap > 0 { + slice.ptr().copy_to::(ptr, cap); } + Self { ptr, cap } } } -/// A type used to represent raw bytes. +/// A type used to represent raw bytes. It has ownership over its buffer. pub struct Bytes { /// A barebones struct for the bytes. buf: RawBytes, @@ -723,11 +725,11 @@ impl Bytes { impl core::ops::Eq for Bytes { fn eq(self, other: Self) -> bool { - if self.len != other.len() { + if self.len != other.len { return false; } - asm(result, r2: self.buf.ptr(), r3: other.ptr(), r4: self.len) { + asm(result, r2: self.buf.ptr, r3: other.buf.ptr, r4: self.len) { meq result r2 r3 r4; result: bool } @@ -737,7 +739,7 @@ impl core::ops::Eq for Bytes { impl AsRawSlice for Bytes { /// Returns a raw slice of all of the elements in the type. fn as_raw_slice(self) -> raw_slice { - asm(ptr: (self.buf.ptr(), self.len)) { + asm(ptr: (self.buf.ptr, self.len)) { ptr: raw_slice } } @@ -750,7 +752,7 @@ impl From for Bytes { let mut bytes = Self::with_capacity(32); bytes.len = 32; // Copy bytes from contract_id into the buffer of the target bytes - __addr_of(b).copy_bytes_to(bytes.buf.ptr(), 32); + __addr_of(b).copy_bytes_to(bytes.buf.ptr, 32); bytes } @@ -826,9 +828,7 @@ impl From for raw_slice { /// assert(slice.number_of_bytes() == 3); /// ``` fn from(bytes: Bytes) -> raw_slice { - asm(ptr: (bytes.buf.ptr(), bytes.len)) { - ptr: raw_slice - } + bytes.as_raw_slice() } } @@ -906,38 +906,46 @@ impl From for Vec { impl Clone for Bytes { fn clone(self) -> Self { let len = self.len(); - let mut c = Self::with_capacity(len); - c.len = len; - self.ptr().copy_bytes_to(c.ptr(), len); - c + let buf = RawBytes::with_capacity(len); + if len > 0 { + self.ptr().copy_bytes_to(buf.ptr(), len); + } + Bytes { buf, len } } } impl AbiEncode for Bytes { fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = self.len.abi_encode(buffer); - - let mut i = 0; - while i < self.len { - let item = self.get(i).unwrap(); - buffer = item.abi_encode(buffer); - i += 1; - } - - buffer + self.as_raw_slice().abi_encode(buffer) } } impl AbiDecode for Bytes { fn abi_decode(ref mut buffer: BufferReader) -> Bytes { - let len = u64::abi_decode(buffer); - let data = buffer.read_bytes(len); - Bytes { - buf: RawBytes { - ptr: data.ptr(), - cap: len, - }, - len, - } + raw_slice::abi_decode(buffer).into() } } + +#[test] +fn ok_bytes_buffer_ownership() { + let mut original_array = [1u8, 2u8, 3u8, 4u8]; + let slice = raw_slice::from_parts::(__addr_of(original_array), 4); + + // Check Bytes duplicates the original slice + let mut bytes = Bytes::from(slice); + bytes.set(0, 5); + assert(original_array[0] == 1); + + // At this point, slice equals [5, 2, 3, 4] + let encoded_slice = encode(bytes); + + // `Bytes` should duplicate the underlying buffer, + // so when we write to it, it should not change + // `encoded_slice` + let mut bytes = abi_decode::(encoded_slice); + bytes.set(0, 6); + assert(bytes.get(0) == Some(6)); + + let mut bytes = abi_decode::(encoded_slice); + assert(bytes.get(0) == Some(5)); +} diff --git a/sway-lib-std/src/string.sw b/sway-lib-std/src/string.sw index 97b6cf76df3..abe9673dbdc 100644 --- a/sway-lib-std/src/string.sw +++ b/sway-lib-std/src/string.sw @@ -7,7 +7,7 @@ use ::convert::*; use ::hash::{Hash, Hasher}; use ::option::Option; -/// A UTF-8 encoded growable string. +/// A UTF-8 encoded growable string. It has ownership over its buffer. /// /// # Additional Information /// @@ -40,7 +40,7 @@ impl String { /// } /// ``` pub fn as_bytes(self) -> Bytes { - self.bytes + self.bytes.clone() } /// Gets the amount of memory on the heap allocated to the `String`. @@ -113,7 +113,9 @@ impl String { /// } /// ``` pub fn from_ascii(bytes: Bytes) -> Self { - Self { bytes } + Self { + bytes: bytes.clone(), + } } /// Converts a string slice containing ASCII encoded bytes to a `String` @@ -236,7 +238,9 @@ impl String { impl From for String { fn from(b: Bytes) -> Self { - Self { bytes: b } + Self { + bytes: b.clone(), + } } } @@ -308,7 +312,7 @@ impl From for raw_slice { /// } /// ``` fn from(s: String) -> raw_slice { - raw_slice::from(s.as_bytes()) + s.bytes.as_raw_slice() } } @@ -326,29 +330,14 @@ impl Hash for String { impl AbiEncode for String { fn abi_encode(self, buffer: Buffer) -> Buffer { - // Encode the length - let mut buffer = self.bytes.len().abi_encode(buffer); - - // Encode each byte of the string - let mut i = 0; - while i < self.bytes.len() { - let item = self.bytes.get(i).unwrap(); - buffer = item.abi_encode(buffer); - i += 1; - } - - buffer + self.bytes.abi_encode(buffer) } } impl AbiDecode for String { fn abi_decode(ref mut buffer: BufferReader) -> Self { - // Get length and string data - let len = u64::abi_decode(buffer); - let data = buffer.read_bytes(len); - // Create string from the ptr and len as parts of a raw_slice String { - bytes: Bytes::from(raw_slice::from_parts::(data.ptr(), len)), + bytes: Bytes::abi_decode(buffer), } } } diff --git a/sway-lib-std/src/vec.sw b/sway-lib-std/src/vec.sw index 9c585f45185..5b7830b848c 100644 --- a/sway-lib-std/src/vec.sw +++ b/sway-lib-std/src/vec.sw @@ -131,14 +131,16 @@ impl RawVec { impl From for RawVec { fn from(slice: raw_slice) -> Self { - Self { - ptr: slice.ptr(), - cap: slice.len::(), + let cap = slice.len::(); + let ptr = alloc::(cap); + if cap > 0 { + slice.ptr().copy_to::(ptr, cap); } + Self { ptr, cap } } } -/// A contiguous growable array type, written as `Vec`, short for 'vector'. +/// A contiguous growable array type, written as `Vec`, short for 'vector'. It has ownership over its buffer. pub struct Vec { buf: RawVec, len: u64, @@ -702,3 +704,27 @@ impl Iterator for VecIter { self.values.get(self.index - 1) } } + +#[test] +fn ok_vec_buffer_ownership() { + let mut original_array = [1u8, 2u8, 3u8, 4u8]; + let slice = raw_slice::from_parts::(__addr_of(original_array), 4); + + // Check Vec duplicates the original slice + let mut bytes = Vec::::from(slice); + bytes.set(0, 5); + assert(original_array[0] == 1); + + // At this point, slice equals [5, 2, 3, 4] + let encoded_slice = encode(bytes); + + // `Vec` should duplicate the underlying buffer, + // so when we write to it, it should not change + // `encoded_slice` + let mut bytes = abi_decode::>(encoded_slice); + bytes.set(0, 6); + assert(bytes.get(0) == Some(6)); + + let mut bytes = abi_decode::>(encoded_slice); + assert(bytes.get(0) == Some(5)); +} diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json index b76fb86d956..3f7bf138e5c 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/configurable_consts/json_abi_oracle_new_encoding.json @@ -7,7 +7,7 @@ "typeArguments": null }, "name": "BOOL", - "offset": 6944 + "offset": 6968 }, { "configurableType": { @@ -16,7 +16,7 @@ "typeArguments": null }, "name": "U8", - "offset": 7088 + "offset": 7112 }, { "configurableType": { @@ -25,7 +25,7 @@ "typeArguments": null }, "name": "ANOTHER_U8", - "offset": 6872 + "offset": 6896 }, { "configurableType": { @@ -34,7 +34,7 @@ "typeArguments": null }, "name": "U16", - "offset": 7032 + "offset": 7056 }, { "configurableType": { @@ -43,7 +43,7 @@ "typeArguments": null }, "name": "U32", - "offset": 7072 + "offset": 7096 }, { "configurableType": { @@ -52,7 +52,7 @@ "typeArguments": null }, "name": "U64", - "offset": 7080 + "offset": 7104 }, { "configurableType": { @@ -61,7 +61,7 @@ "typeArguments": null }, "name": "U256", - "offset": 7040 + "offset": 7064 }, { "configurableType": { @@ -70,7 +70,7 @@ "typeArguments": null }, "name": "B256", - "offset": 6912 + "offset": 6936 }, { "configurableType": { @@ -79,7 +79,7 @@ "typeArguments": [] }, "name": "CONFIGURABLE_STRUCT", - "offset": 6984 + "offset": 7008 }, { "configurableType": { @@ -88,7 +88,7 @@ "typeArguments": [] }, "name": "CONFIGURABLE_ENUM_A", - "offset": 6952 + "offset": 6976 }, { "configurableType": { @@ -97,7 +97,7 @@ "typeArguments": [] }, "name": "CONFIGURABLE_ENUM_B", - "offset": 6968 + "offset": 6992 }, { "configurableType": { @@ -106,7 +106,7 @@ "typeArguments": null }, "name": "ARRAY_BOOL", - "offset": 6880 + "offset": 6904 }, { "configurableType": { @@ -115,7 +115,7 @@ "typeArguments": null }, "name": "ARRAY_U64", - "offset": 6888 + "offset": 6912 }, { "configurableType": { @@ -124,7 +124,7 @@ "typeArguments": null }, "name": "TUPLE_BOOL_U64", - "offset": 7016 + "offset": 7040 }, { "configurableType": { @@ -133,7 +133,7 @@ "typeArguments": null }, "name": "STR_4", - "offset": 7008 + "offset": 7032 }, { "configurableType": { @@ -142,7 +142,7 @@ "typeArguments": null }, "name": "NOT_USED", - "offset": 7000 + "offset": 7024 } ], "encoding": "1", diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/slice/slice_contract/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/language/slice/slice_contract/src/main.sw index c86ce974d88..070cff38a82 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/slice/slice_contract/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/slice/slice_contract/src/main.sw @@ -12,7 +12,8 @@ impl MyContract for Contract { #[test] fn test_success() { - let caller = abi(MyContract, CONTRACT_ID); + let contract_id = 0x3a9a75a3dc04f160ec6e286144eeffb6dd73fc0b4235b1793aa656be02e69d9b; // AUTO-CONTRACT-ID . + let caller = abi(MyContract, contract_id); let data = 1u64; let slice = raw_slice::from_parts::(__addr_of(&data), 1); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/string_slice/string_slice_contract/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/language/string_slice/string_slice_contract/src/main.sw index 0a57dc67e6e..5e907a202b1 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/string_slice/string_slice_contract/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/string_slice/string_slice_contract/src/main.sw @@ -12,7 +12,8 @@ impl MyContract for Contract { #[test] fn test_success() { - let caller = abi(MyContract, CONTRACT_ID); + let contract_id = 0xeea596d8fc4e55fb622fd36131eff0401ccfd9f2a211f7ce2d93f816ec0cb23f; // AUTO-CONTRACT-ID . + let caller = abi(MyContract, contract_id); let result = caller.test_function("a"); assert(result == "a") } diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/language/u256/u256_abi/json_abi_oracle_new_encoding.json b/test/src/e2e_vm_tests/test_programs/should_pass/language/u256/u256_abi/json_abi_oracle_new_encoding.json index 58d148218d5..95064cff5f6 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/language/u256/u256_abi/json_abi_oracle_new_encoding.json +++ b/test/src/e2e_vm_tests/test_programs/should_pass/language/u256/u256_abi/json_abi_oracle_new_encoding.json @@ -7,7 +7,7 @@ "typeArguments": null }, "name": "SOME_U256", - "offset": 672 + "offset": 704 } ], "encoding": "1", diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/array_of_structs_caller/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/array_of_structs_caller/src/main.sw index 09d9a08f021..e81345968e4 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/array_of_structs_caller/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/array_of_structs_caller/src/main.sw @@ -6,7 +6,7 @@ use std::hash::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0x14ed3cd06c2947248f69d54bfa681fe40d26267be84df7e19e253622b7921bbe; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xfef18ef24b6cbfd66238fecc3c2704976fdf3177442712a3402b2ab666f12039; +const CONTRACT_ID = 0xb6a63cfbfdef36702cbec327c15629ec88c1c4acc5a3a350b127de8aebc49293; // AUTO-CONTRACT-ID ../../test_contracts/array_of_structs_contract --release fn main() -> u64 { let addr = abi(TestContract, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/asset_ops_test/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/asset_ops_test/src/main.sw index 51a2c5dfbb8..c23eb640723 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/asset_ops_test/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/asset_ops_test/src/main.sw @@ -9,12 +9,12 @@ use test_fuel_coin_abi::*; #[cfg(experimental_new_encoding = false)] const FUEL_COIN_CONTRACT_ID = 0xec2277ebe007ade87e3d797c3b1e070dcd542d5ef8f038b471f262ef9cebc87c; #[cfg(experimental_new_encoding = true)] -const FUEL_COIN_CONTRACT_ID = 0x1a88d0982d216958d18378b6784614b75868a542dc05f8cc85cf3da44268c76c; +const FUEL_COIN_CONTRACT_ID = 0x1a88d0982d216958d18378b6784614b75868a542dc05f8cc85cf3da44268c76c; // AUTO-CONTRACT-ID ../../test_contracts/test_fuel_coin_contract --release #[cfg(experimental_new_encoding = false)] const BALANCE_CONTRACT_ID = 0xf6cd545152ac83225e8e7df2efb5c6fa6e37bc9b9e977b5ea8103d28668925df; #[cfg(experimental_new_encoding = true)] -const BALANCE_CONTRACT_ID = 0x04594851a2bd620dffc360f3976d747598b9184218dc55ff3e839f417ca345ac; +const BALANCE_CONTRACT_ID = 0x0d5fb0c109082f5784f6cd5979d9d25cab2d7307baf4a7661dea7d285c970e9f; // AUTO-CONTRACT-ID ../../test_contracts/balance_test_contract --release fn main() -> bool { let default_gas = 1_000_000_000_000; diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/bal_opcode/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/bal_opcode/src/main.sw index 34bec41ab32..db944a5f3f0 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/bal_opcode/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/bal_opcode/src/main.sw @@ -5,7 +5,7 @@ use balance_test_abi::BalanceTest; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0xf6cd545152ac83225e8e7df2efb5c6fa6e37bc9b9e977b5ea8103d28668925df; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0x04594851a2bd620dffc360f3976d747598b9184218dc55ff3e839f417ca345ac; +const CONTRACT_ID = 0x0d5fb0c109082f5784f6cd5979d9d25cab2d7307baf4a7661dea7d285c970e9f; // AUTO-CONTRACT-ID ../../test_contracts/balance_test_contract --release fn main() -> bool { let balance_test_contract = abi(BalanceTest, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_abi_with_tuples/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_abi_with_tuples/src/main.sw index ef06da8933a..34b3e375761 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_abi_with_tuples/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_abi_with_tuples/src/main.sw @@ -6,7 +6,7 @@ use abi_with_tuples::{MyContract, Location, Person}; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0xfdc14550c8aee742cd556d0ab7f378b7be0d3b1e6e086c097352e94590d4ed02; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xfc32e1cb0635642004594eb3503279b3f4aee3d0b0de0e1aa78dcd7de2389239; +const CONTRACT_ID = 0x5517b7a26c5cbd631796958996ab33708b05282e5e366037efc5ff914682c2d6; // AUTO-CONTRACT-ID ../../test_contracts/abi_with_tuples_contract --release fn main() -> bool { let the_abi = abi(MyContract, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_basic_storage/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_basic_storage/src/main.sw index 3bb81c8e7e4..42605631ca1 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_basic_storage/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_basic_storage/src/main.sw @@ -4,7 +4,7 @@ use basic_storage_abi::{BasicStorage, Quad}; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0x94db39f409a31b9f2ebcadeea44378e419208c20de90f5d8e1e33dc1523754cb; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xa638dae2693fab5fc57f3b61af1a4aae594006f2846175b9954769e3fa243a23; +const CONTRACT_ID = 0xe3e3a00062ed46de91902cda85348b27b371158bb1d5b9a6ccebe7307be59ff4; // AUTO-CONTRACT-ID ../../test_contracts/basic_storage --release fn main() -> u64 { let addr = abi(BasicStorage, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_contract_with_type_aliases/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_contract_with_type_aliases/src/main.sw index cbb435e9b52..08b24d73c5d 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_contract_with_type_aliases/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_contract_with_type_aliases/src/main.sw @@ -5,7 +5,7 @@ use contract_with_type_aliases_abi::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0x0cbeb6efe3104b460be769bdc4ea101ebf16ccc16f2d7b667ec3e1c7f5ce35b5; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0x8bc9728375407f59c86f5b8da0660c414c9225a19e978bebe085a4b954ff29d1; +const CONTRACT_ID = 0x0bd9f9710b0815ce83f1b81614027e3c1ef300ea579b30824b323147dd369ecf; // AUTO-CONTRACT-ID ../../test_contracts/contract_with_type_aliases --release fn main() { let caller = abi(MyContract, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_increment_contract/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_increment_contract/src/main.sw index 6fc782ec42f..15b7895f1d1 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_increment_contract/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_increment_contract/src/main.sw @@ -6,7 +6,7 @@ use dynamic_contract_call::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0xd1b4047af7ef111c023ab71069e01dc2abfde487c0a0ce1268e4f447e6c6e4c2; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0x4b5acfce4ff139e32b4d5466cb85d30496d0c69593dbf8cf214dedda395ddc08; +const CONTRACT_ID = 0xf9ff73e9e0ddc3517fd6fe493847b0572db0d8e7c3672c590103112b4a0d4e5a; // AUTO-CONTRACT-ID ../../test_contracts/increment_contract --release fn main() -> bool { let the_abi = abi(Incrementor, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_storage_enum/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_storage_enum/src/main.sw index 4c0d8e66f0f..85f714468c2 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_storage_enum/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/call_storage_enum/src/main.sw @@ -5,7 +5,7 @@ use storage_enum_abi::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0xc601d11767195485a6654d566c67774134668863d8c797a8c69e8778fb1f89e9; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xbb67310c9d6f3a1147583a4bf5a28c51299601c5fb09cb370724f2d490ec5c0c; +const CONTRACT_ID = 0x7bd5d774e220fa89a3c1b38005f921eb3189a47e3a316175545b7413f6901ec4; // AUTO-CONTRACT-ID ../../test_contracts/storage_enum_contract --release fn main() -> u64 { let caller = abi(StorageEnum, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_auth_test/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_auth_test/src/main.sw index 6a054b04052..dc2ca052d0b 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_auth_test/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_auth_test/src/main.sw @@ -5,7 +5,7 @@ use auth_testing_abi::AuthTesting; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0xc2eec20491b53aab7232cbd27c31d15417b4e9daf0b89c74cc242ef1295f681f; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xeb42a6ba3f230441d7ade26f54cfb9f64fe8dd6397cc685fefc7f3d082d4d2ce; +const CONTRACT_ID = 0xf3b68b9e2ade5b886f4d2bd22bbfd928d418f9532a3a185956c1ca472a04dc0e; // AUTO-CONTRACT-ID ../../test_contracts/auth_testing_contract --release // should be false in the case of a script fn main() -> bool { diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_context_test/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_context_test/src/main.sw index e70c006208e..94b86c30fdc 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_context_test/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/caller_context_test/src/main.sw @@ -6,7 +6,7 @@ use context_testing_abi::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0x6054c11cda000f5990373a4d61929396165be4dfdd61d5b7bd26da60ab0d8577; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0x968479b51e9a6c210df98ba289f586331a502a5be2c2073ef65f82bada5695a9; +const CONTRACT_ID = 0x73061043a4ada05fd79d45d33f4afe5a8e83726beda5310741008aa772512d97; // AUTO-CONTRACT-ID ../../test_contracts/context_testing_contract --release fn main() -> bool { let gas: u64 = u64::max(); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/nested_struct_args_caller/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/nested_struct_args_caller/src/main.sw index ce6698c04ca..fd353f9c22d 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/nested_struct_args_caller/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/nested_struct_args_caller/src/main.sw @@ -5,7 +5,7 @@ use nested_struct_args_abi::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0xe63d33a1b3a6903808b379f6a41a72fa8a370e8b76626775e7d9d2f9c4c5da40; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xbefd6660ae89502652b2ab4e536edf3403208e308a329c06af6017dec242cc37; +const CONTRACT_ID = 0x35f286cf49aa8ecab05e8f41852cb461145ec6e39205dbd073726922a49803e1; // AUTO-CONTRACT-ID ../../test_contracts/nested_struct_args_contract --release fn main() -> bool { let caller = abi(NestedStructArgs, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/storage_access_caller/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/storage_access_caller/src/main.sw index 786e17542cf..f33caa545e1 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/storage_access_caller/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/require_contract_deployment/storage_access_caller/src/main.sw @@ -6,7 +6,7 @@ use std::hash::*; #[cfg(experimental_new_encoding = false)] const CONTRACT_ID = 0x3bc28acd66d327b8c1b9624c1fabfc07e9ffa1b5d71c2832c3bfaaf8f4b805e9; #[cfg(experimental_new_encoding = true)] -const CONTRACT_ID = 0xad4be8f8c517abaa781d488695e36f8dcaf4d609fc2723af4424ec78263163c1; +const CONTRACT_ID = 0xe44ef1c461fec5318ddf2d4b93308ebe5c8a354134d85b08770c0da0ad939d82; // AUTO-CONTRACT-ID ../../test_contracts/storage_access_contract --release fn main() -> bool { let caller = abi(StorageAccess, CONTRACT_ID); diff --git a/test/src/e2e_vm_tests/test_programs/should_pass/unit_tests/workspace_test/contract_multi_test/src/main.sw b/test/src/e2e_vm_tests/test_programs/should_pass/unit_tests/workspace_test/contract_multi_test/src/main.sw index 61e416f17bd..ced5fee81dd 100644 --- a/test/src/e2e_vm_tests/test_programs/should_pass/unit_tests/workspace_test/contract_multi_test/src/main.sw +++ b/test/src/e2e_vm_tests/test_programs/should_pass/unit_tests/workspace_test/contract_multi_test/src/main.sw @@ -17,14 +17,16 @@ fn test_foo() { #[test(should_revert)] fn test_fail() { - let caller = abi(MyContract, CONTRACT_ID); + let contract_id = 0x822c8d3672471f64f14f326447793c7377b6e430122db23b622880ccbd8a33ef; // AUTO-CONTRACT-ID . + let caller = abi(MyContract, contract_id); let result = caller.test_function {}(); assert(result == false) } #[test] fn test_success() { - let caller = abi(MyContract, CONTRACT_ID); + let contract_id = 0x822c8d3672471f64f14f326447793c7377b6e430122db23b622880ccbd8a33ef; // AUTO-CONTRACT-ID . + let caller = abi(MyContract, contract_id); let result = caller.test_function {}(); assert(result == true) } diff --git a/test/src/in_language_tests/test_programs/bytes_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/bytes_inline_tests/src/main.sw index 3d69727a4a2..d5107addd94 100644 --- a/test/src/in_language_tests/test_programs/bytes_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/bytes_inline_tests/src/main.sw @@ -888,7 +888,7 @@ fn bytes_from_raw_slice() { }; let mut bytes = Bytes::from(slice); - assert(bytes.ptr() == slice.ptr()); + assert(bytes.ptr() != slice.ptr()); // Bytes should own its buffer assert(bytes.len() == slice.number_of_bytes()); } @@ -921,7 +921,7 @@ fn bytes_raw_slice_into() { let bytes: Bytes = slice.into(); - assert(bytes.ptr() == slice.ptr()); + assert(bytes.ptr() != slice.ptr()); // Bytes should own its buffer assert(bytes.len() == slice.number_of_bytes()); } diff --git a/test/src/in_language_tests/test_programs/string_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/string_inline_tests/src/main.sw index ec1313fa345..079a28ee78d 100644 --- a/test/src/in_language_tests/test_programs/string_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/string_inline_tests/src/main.sw @@ -55,7 +55,6 @@ fn string_clear_empty() { #[test] fn string_from_ascii() { let mut bytes = Bytes::new(); - bytes.push(0u8); bytes.push(1u8); bytes.push(2u8); @@ -63,11 +62,15 @@ fn string_from_ascii() { bytes.push(4u8); let mut string_from_ascii = String::from_ascii(bytes); - assert(bytes.capacity() == string_from_ascii.capacity()); + assert(bytes.len() == string_from_ascii.capacity()); + let bytes = string_from_ascii.as_bytes(); assert(bytes.get(0).unwrap() == 0u8); assert(bytes.get(1).unwrap() == 1u8); assert(bytes.get(2).unwrap() == 2u8); + assert(bytes.get(3).unwrap() == 3u8); + assert(bytes.get(4).unwrap() == 4u8); + assert(bytes.get(5) == None); } #[test] @@ -147,7 +150,7 @@ fn string_ptr() { let mut string_from_ascii = String::from_ascii(bytes); assert(!string_from_ascii.ptr().is_null()); - assert(string_from_ascii.ptr() == bytes.ptr()); + assert(string_from_ascii.ptr() != bytes.ptr()); } #[test] diff --git a/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw index 5ac6a8fef32..78e2df5d1e5 100644 --- a/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/vec_inline_tests/src/main.sw @@ -641,7 +641,7 @@ fn vec_from_raw_slice() { }; let mut vec: Vec = Vec::from(slice); - assert(vec.ptr() == slice.ptr()); + assert(vec.ptr() != slice.ptr()); // Vec should own its buffer assert(vec.len() == slice.len::()); } @@ -683,7 +683,7 @@ fn vec_raw_slice_into() { let vec: Vec = slice.into(); - assert(vec.ptr() == slice.ptr()); + assert(vec.ptr() != slice.ptr()); // Vec should own its buffer assert(vec.len() == slice.len::()); } diff --git a/test/update-contract-ids.sh b/test/update-contract-ids.sh new file mode 100755 index 00000000000..23c82db18a9 --- /dev/null +++ b/test/update-contract-ids.sh @@ -0,0 +1,48 @@ +#! /bin/bash + +# CHANGES=$(git status --porcelain | wc -l) +# if [ "$CHANGES" != "0" ]; then +# echo "git state is not clean. commit or restore first." +# exit +# fi + +BOLD_RED='\033[1;31m' +BOLD_GREEN="\033[1;32m" +BOLD_YELLOW='\033[1;33m' +BOLD_WHITE='\033[1;97m' +NC='\033[0m' + +function join_by { + local d=${1-} f=${2-} + if shift 2; then + printf %s "$f" "${@/#/$d}" + fi +} + +grep --include \*.sw -Hno "// AUTO-CONTRACT-ID" . -R | while read line ; do + PARTS=($(echo $line | sed 's/:/ /g')) + FOLDER=$(dirname ${PARTS[0]}) + FILE=${PARTS[0]} + LINE=${PARTS[1]} + + CONTRACT_ARGS=($(sed "$LINE!d" $FILE)) + CONTRACT_ARGS=$(join_by " " ${CONTRACT_ARGS[@]:6}) + + if [[ $CONTRACT_ARGS ]]; then + PROJ=$(realpath "$FOLDER/..") + echo -e "${BOLD_WHITE}$PROJ${NC}" + + pushd "$FOLDER/.." >> /dev/null + CONTRACT_ID=$(cargo r -p forc --release -- contract-id --path $CONTRACT_ARGS 2> /dev/null | grep -oP '0x[a-zA-Z0-9]{64}') + + if [[ $CONTRACT_ID ]]; then + popd >> /dev/null + sed -i "${LINE}s/0x[a-zA-Z0-9]*/$CONTRACT_ID/g" $FILE + echo -e " ${BOLD_GREEN}ok${NC} ($CONTRACT_ID)" + else + echo -e " ${BOLD_RED}error${NC}" + cargo r -p forc --release -- contract-id --release + popd >> /dev/null + fi + fi +done From f82d9e67c2a81e600ae61a86dd1a7c905facf6c5 Mon Sep 17 00:00:00 2001 From: Cameron Carstens Date: Tue, 9 Jul 2024 19:40:56 +0800 Subject: [PATCH 14/19] Correctly handle `Input::Message` when calling `msg_sender()` (#6231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description When the input type was of `Input::Message` and the `msg_sender()` function was called, it would revert. It now properly handle `Input::Message`. ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [x] I have added tests that prove my fix is effective or that my feature works. - [x] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --------- Co-authored-by: Kaya Gƶkalp Co-authored-by: SwayStar123 <46050679+SwayStar123@users.noreply.github.com> --- sway-lib-std/src/auth.sw | 24 ++++++- .../auth_testing_contract/src/main.sw | 6 +- .../src/sdk-harness/test_projects/auth/mod.rs | 62 +++++++++++++++++++ 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/sway-lib-std/src/auth.sw b/sway-lib-std/src/auth.sw index cb85965da5e..4551a8ca7d7 100644 --- a/sway-lib-std/src/auth.sw +++ b/sway-lib-std/src/auth.sw @@ -6,7 +6,14 @@ use ::contract_id::ContractId; use ::identity::Identity; use ::option::Option::{self, *}; use ::result::Result::{self, *}; -use ::inputs::{Input, input_coin_owner, input_count, input_message_recipient, input_type}; +use ::inputs::{ + Input, + input_coin_owner, + input_count, + input_message_recipient, + input_message_sender, + input_type, +}; use ::revert::revert; /// The error type used when an `Identity` cannot be determined. @@ -151,7 +158,20 @@ pub fn caller_address() -> Result { } // type == InputCoin or InputMessage. - let owner_of_input = input_coin_owner(i.as_u64()); + let owner_of_input = match type_of_input { + Input::Coin => { + input_coin_owner(i.as_u64()) + }, + Input::Message => { + Some(input_message_sender(i.as_u64())) + }, + _ => { + // type != InputCoin or InputMessage, continue looping. + i += 1u16; + continue; + } + }; + if candidate.is_none() { // This is the first input seen of the correct type. candidate = owner_of_input; diff --git a/test/src/sdk-harness/test_artifacts/auth_testing_contract/src/main.sw b/test/src/sdk-harness/test_artifacts/auth_testing_contract/src/main.sw index c49a0540b15..4fd51ea5edc 100644 --- a/test/src/sdk-harness/test_artifacts/auth_testing_contract/src/main.sw +++ b/test/src/sdk-harness/test_artifacts/auth_testing_contract/src/main.sw @@ -26,7 +26,7 @@ impl AuthTesting for Contract { ret } - fn returns_msg_sender_address(_expected_id: Address) -> bool { + fn returns_msg_sender_address(expected_id: Address) -> bool { let result: Result = msg_sender(); let mut ret = false; if result.is_err() { @@ -34,8 +34,8 @@ impl AuthTesting for Contract { } let unwrapped = result.unwrap(); match unwrapped { - Identity::Address(_) => { - ret = true + Identity::Address(address) => { + ret = expected_id == address }, _ => { ret = false diff --git a/test/src/sdk-harness/test_projects/auth/mod.rs b/test/src/sdk-harness/test_projects/auth/mod.rs index 5672e77b7b4..172bce95282 100644 --- a/test/src/sdk-harness/test_projects/auth/mod.rs +++ b/test/src/sdk-harness/test_projects/auth/mod.rs @@ -9,6 +9,8 @@ use fuels::{ coin::{Coin, CoinStatus}, message::{Message, MessageStatus}, Bytes32, ContractId, + coin_type::CoinType, + input::Input, }, }; use std::str::FromStr; @@ -69,6 +71,66 @@ async fn msg_sender_from_contract() { assert!(result.value); } +#[tokio::test] +async fn input_message_msg_sender_from_contract() { + // Wallet + let mut wallet = WalletUnlocked::new_random(None); + + // Setup coins and messages + let coins = setup_single_asset_coins(wallet.address(), AssetId::BASE, 100, 1000); + let msg = setup_single_message( + &Bech32Address { + hrp: "".to_string(), + hash: Default::default(), + }, + wallet.address(), + DEFAULT_COIN_AMOUNT, + 10.into(), + vec![], + ); + + let provider = setup_test_provider(coins.clone(), vec![msg.clone()], None, None) + .await + .unwrap(); + wallet.set_provider(provider.clone()); + + // Setup contract + let id = Contract::load_from( + "test_artifacts/auth_testing_contract/out/release/auth_testing_contract.bin", + LoadConfiguration::default(), + ) + .unwrap() + .deploy(&wallet, TxPolicies::default()) + .await + .unwrap(); + let instance = AuthContract::new(id.clone(), wallet.clone()); + + // Start building transactions + let call_handler = instance.methods().returns_msg_sender_address(Address::from(*msg.sender.hash())); + let mut tb = call_handler.transaction_builder().await.unwrap(); + + // Inputs + tb.inputs_mut().push(Input::ResourceSigned { + resource: CoinType::Message(wallet + .get_messages() + .await + .unwrap() + .first() + .unwrap() + .clone()), + }); + + // Build transaction + tb.add_signer(wallet.clone()).unwrap(); + let tx = tb.build(provider.clone()).await.unwrap(); + + // Send and verify + let tx_id = provider.send_transaction(tx).await.unwrap(); + let tx_status = provider.tx_status(&tx_id).await.unwrap(); + let response = call_handler.get_response_from(tx_status).unwrap(); + assert!(response.value); +} + async fn get_contracts() -> ( AuthContract, ContractId, From 5456e62ddf3dfd1d02377b2ba1ac1eda03d285bc Mon Sep 17 00:00:00 2001 From: jjcnn <38888011+jjcnn@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:16:06 +0200 Subject: [PATCH 15/19] Memory usage reduction (#6249) ## Description #6044 increased the memory usage of the compiler by an estimated 400%. This PR alleviates some of that increased footprint. `is_external` in the `Module` struct needs to be updated to allow for compilation of dependencies (a module is not external while it is being compiled, but is external when one of its dependents is being compiled). #6044 introduced an extra level of cloning, which in this PR is changed by making `Module` mutable and destructively updating `is_external`. ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [x] I have added tests that prove my fix is effective or that my feature works. - [x] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --- forc-pkg/src/pkg.rs | 14 ++++---- sway-core/src/ir_generation/const_eval.rs | 4 +-- sway-core/src/lib.rs | 8 ++--- .../ast_node/expression/typed_expression.rs | 4 +-- .../namespace/contract_helpers.rs | 4 +-- .../src/semantic_analysis/namespace/module.rs | 7 ++++ .../semantic_analysis/namespace/namespace.rs | 36 +++++++------------ test/src/ir_generation/mod.rs | 4 +-- 8 files changed, 38 insertions(+), 43 deletions(-) diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index c887cc68720..7092d3e63ef 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -1759,7 +1759,7 @@ pub fn compile( pkg: &PackageDescriptor, profile: &BuildProfile, engines: &Engines, - namespace: namespace::Root, + namespace: &mut namespace::Root, source_map: &mut SourceMap, ) -> Result { let mut metrics = PerformanceData::default(); @@ -2373,7 +2373,7 @@ pub fn build( // `ContractIdConst` is a None here since we do not yet have a // contract ID value at this point. - let dep_namespace = match dependency_namespace( + let mut dep_namespace = match dependency_namespace( &lib_namespace_map, &compiled_contract_deps, plan.graph(), @@ -2390,7 +2390,7 @@ pub fn build( &descriptor, &profile, &engines, - dep_namespace, + &mut dep_namespace, &mut source_map, )?; @@ -2437,7 +2437,7 @@ pub fn build( }; // Note that the contract ID value here is only Some if tests are enabled. - let dep_namespace = match dependency_namespace( + let mut dep_namespace = match dependency_namespace( &lib_namespace_map, &compiled_contract_deps, plan.graph(), @@ -2463,7 +2463,7 @@ pub fn build( &descriptor, &profile, &engines, - dep_namespace, + &mut dep_namespace, &mut source_map, )?; @@ -2672,7 +2672,7 @@ pub fn check( let contract_id_value = (idx == plan.compilation_order.len() - 1).then(|| DUMMY_CONTRACT_ID.to_string()); - let dep_namespace = dependency_namespace( + let mut dep_namespace = dependency_namespace( &lib_namespace_map, &compiled_contract_deps, &plan.graph, @@ -2703,7 +2703,7 @@ pub fn check( &handler, engines, input, - dep_namespace, + &mut dep_namespace, Some(&build_config), &pkg.name, retrigger_compilation.clone(), diff --git a/sway-core/src/ir_generation/const_eval.rs b/sway-core/src/ir_generation/const_eval.rs index 5509a812f24..f16e36e5b97 100644 --- a/sway-core/src/ir_generation/const_eval.rs +++ b/sway-core/src/ir_generation/const_eval.rs @@ -1316,7 +1316,7 @@ mod tests { }, ); let mut md_mgr = MetadataManager::default(); - let core_lib = namespace::Root::from(namespace::Module { + let mut core_lib = namespace::Root::from(namespace::Module { name: Some(sway_types::Ident::new_no_span( "assert_is_constant_test".to_string(), )), @@ -1327,7 +1327,7 @@ mod tests { &handler, &engines, std::sync::Arc::from(format!("library; {prefix} fn f() -> u64 {{ {expr}; 0 }}")), - core_lib, + &mut core_lib, None, "test", None, diff --git a/sway-core/src/lib.rs b/sway-core/src/lib.rs index 153358ca0cf..bdc7e683ceb 100644 --- a/sway-core/src/lib.rs +++ b/sway-core/src/lib.rs @@ -520,7 +520,7 @@ pub fn parsed_to_ast( handler: &Handler, engines: &Engines, parse_program: &mut parsed::ParseProgram, - initial_namespace: namespace::Root, + initial_namespace: &mut namespace::Root, build_config: Option<&BuildConfig>, package_name: &str, retrigger_compilation: Option>, @@ -691,7 +691,7 @@ pub fn compile_to_ast( handler: &Handler, engines: &Engines, input: Arc, - initial_namespace: namespace::Root, + initial_namespace: &mut namespace::Root, build_config: Option<&BuildConfig>, package_name: &str, retrigger_compilation: Option>, @@ -783,7 +783,7 @@ pub fn compile_to_asm( handler: &Handler, engines: &Engines, input: Arc, - initial_namespace: namespace::Root, + initial_namespace: &mut namespace::Root, build_config: &BuildConfig, package_name: &str, ) -> Result { @@ -944,7 +944,7 @@ pub fn compile_to_bytecode( handler: &Handler, engines: &Engines, input: Arc, - initial_namespace: namespace::Root, + initial_namespace: &mut namespace::Root, build_config: &BuildConfig, source_map: &mut SourceMap, package_name: &str, diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs index 9ce246074f3..742b24f4fef 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs @@ -2663,8 +2663,8 @@ mod tests { type_annotation: TypeId, experimental: ExperimentalFlags, ) -> Result { - let root_module = namespace::Root::from(namespace::Module::default()); - let mut namespace = Namespace::init_root(root_module); + let mut root_module = namespace::Root::from(namespace::Module::default()); + let mut namespace = Namespace::init_root(&mut root_module); let ctx = TypeCheckContext::from_namespace(&mut namespace, engines, experimental) .with_type_annotation(type_annotation); ty::TyExpression::type_check(handler, ctx, expr) diff --git a/sway-core/src/semantic_analysis/namespace/contract_helpers.rs b/sway-core/src/semantic_analysis/namespace/contract_helpers.rs index 0b1a5851e0c..eaa91f37820 100644 --- a/sway-core/src/semantic_analysis/namespace/contract_helpers.rs +++ b/sway-core/src/semantic_analysis/namespace/contract_helpers.rs @@ -95,8 +95,8 @@ fn default_with_contract_id_inner( content: AstNodeContent::Declaration(Declaration::ConstantDeclaration(const_decl_id)), span: const_item_span.clone(), }; - let root = Root::from(Module::default()); - let mut ns = Namespace::init_root(root); + let mut root = Root::from(Module::default()); + let mut ns = Namespace::init_root(&mut root); // This is pretty hacky but that's okay because of this code is being removed pretty soon ns.root.module.name = ns_name; ns.root.module.visibility = Visibility::Public; diff --git a/sway-core/src/semantic_analysis/namespace/module.rs b/sway-core/src/semantic_analysis/namespace/module.rs index 327abb91410..b61daaa2c01 100644 --- a/sway-core/src/semantic_analysis/namespace/module.rs +++ b/sway-core/src/semantic_analysis/namespace/module.rs @@ -92,6 +92,13 @@ impl Module { &self.submodules } + /// Mutable access to this module's submodules. + pub fn submodules_mut( + &mut self, + ) -> &mut im::HashMap> { + &mut self.submodules + } + /// Insert a submodule into this `Module`. pub fn insert_submodule(&mut self, name: String, submodule: Module) { self.submodules.insert(name, submodule); diff --git a/sway-core/src/semantic_analysis/namespace/namespace.rs b/sway-core/src/semantic_analysis/namespace/namespace.rs index cfe52d93d28..9b2470bb3d3 100644 --- a/sway-core/src/semantic_analysis/namespace/namespace.rs +++ b/sway-core/src/semantic_analysis/namespace/namespace.rs @@ -8,11 +8,9 @@ use super::{ root::{ResolvedDeclaration, Root}, submodule_namespace::SubmoduleNamespace, trait_map::ResolvedTraitImplItem, - ModuleName, ModulePath, ModulePathBuf, + ModulePath, ModulePathBuf, }; -use rustc_hash::FxHasher; -use std::hash::BuildHasherDefault; use sway_error::handler::{ErrorEmitted, Handler}; use sway_types::span::Span; @@ -58,7 +56,7 @@ impl Namespace { /// Initialise the namespace at its root from the given initial namespace. /// If the root module contains submodules these are now considered external. - pub fn init_root(root: Root) -> Self { + pub fn init_root(root: &mut Root) -> Self { assert!( !root.module.is_external, "The root module must not be external during compilation" @@ -69,32 +67,22 @@ impl Namespace { // // Every submodule that has been added before calling init_root is now considered // external, which we have to enforce at this point. - fn clone_with_submodules_external(module: &Module) -> Module { - let mut new_submods = - im::HashMap::>::default(); - for (name, submod) in module.submodules.iter() { - let new_submod = clone_with_submodules_external(submod); - new_submods.insert(name.clone(), new_submod); - } - Module { - submodules: new_submods, - lexical_scopes: module.lexical_scopes.clone(), - current_lexical_scope_id: module.current_lexical_scope_id, - name: module.name.clone(), - visibility: module.visibility, - span: module.span.clone(), - is_external: true, - mod_path: module.mod_path.clone(), + fn set_submodules_external(module: &mut Module) { + for (_, submod) in module.submodules_mut().iter_mut() { + if !submod.is_external { + submod.is_external = true; + set_submodules_external(submod); + } } } - let mut init = clone_with_submodules_external(&root.module); + set_submodules_external(&mut root.module); // The init module itself is not external - init.is_external = false; + root.module.is_external = false; Self { - init: init.clone(), - root: Root { module: init }, + init: root.module.clone(), + root: root.clone(), mod_path, } } diff --git a/test/src/ir_generation/mod.rs b/test/src/ir_generation/mod.rs index 2c21d60c91e..e79226326d5 100644 --- a/test/src/ir_generation/mod.rs +++ b/test/src/ir_generation/mod.rs @@ -238,12 +238,12 @@ pub(super) async fn run( let sway_str = String::from_utf8_lossy(&sway_str); let handler = Handler::default(); - let initial_namespace = namespace::Root::from(core_lib.clone()); + let mut initial_namespace = namespace::Root::from(core_lib.clone()); let compile_res = compile_to_ast( &handler, &engines, Arc::from(sway_str), - initial_namespace, + &mut initial_namespace, Some(&bld_cfg), PACKAGE_NAME, None, From db0651540691579b88d677bb500b1b8cf79193f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Matos?= Date: Wed, 10 Jul 2024 00:24:31 -0300 Subject: [PATCH 16/19] Unify AST nodes for parsed and typed `impl self` and `impl trait`. (#6251) ## Description This PR unifies the AST representation for the parsed and typed `impl self` and `impl trait` declarations. Previously we had a parsed node for `impl self`, which was converted into a `impl trait` typed node. Now we are doing the same for the parsed nodes and using a unified `ImplSelfOrTrait` node. This will make it possible for https://github.com/FuelLabs/sway/pull/6245 to store the parsed decl id relationship for this node. ## Checklist - [x] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --- forc-plugins/forc-doc/src/doc/mod.rs | 12 +- .../forc-doc/src/render/item/context.rs | 6 +- forc-plugins/forc-doc/src/render/title.rs | 2 +- .../analyze_return_paths.rs | 6 +- .../dead_code_analysis.rs | 26 +++-- sway-core/src/decl_engine/engine.rs | 20 ++-- sway-core/src/decl_engine/id.rs | 4 +- sway-core/src/decl_engine/parsed_engine.rs | 35 ++---- sway-core/src/decl_engine/ref.rs | 6 +- sway-core/src/ir_generation/function.rs | 2 +- sway-core/src/language/parsed/declaration.rs | 19 +-- .../language/parsed/declaration/impl_trait.rs | 69 ++++------- sway-core/src/language/ty/ast_node.rs | 6 +- .../language/ty/declaration/declaration.rs | 38 +++--- .../src/language/ty/declaration/function.rs | 2 +- .../src/language/ty/declaration/impl_trait.rs | 18 +-- .../src/language/ty/expression/expression.rs | 4 +- .../ty/expression/expression_variant.rs | 4 +- sway-core/src/language/ty/program.rs | 9 +- .../ast_node/declaration/auto_impl.rs | 4 +- .../ast_node/declaration/declaration.rs | 108 +++++++++--------- .../ast_node/declaration/impl_trait.rs | 34 +++--- .../typed_expression/method_application.rs | 4 +- .../semantic_analysis/cei_pattern_analysis.rs | 8 +- sway-core/src/semantic_analysis/module.rs | 8 +- .../semantic_analysis/node_dependencies.rs | 87 +++++--------- .../semantic_analysis/type_check_analysis.rs | 8 +- .../semantic_analysis/type_check_context.rs | 4 +- .../to_parsed_lang/convert_parse_tree.rs | 17 ++- .../code_actions/struct_decl/struct_new.rs | 10 +- sway-lsp/src/capabilities/rename.rs | 4 +- sway-lsp/src/traverse/parsed_tree.rs | 60 ++++------ sway-lsp/src/traverse/typed_tree.rs | 14 +-- 33 files changed, 301 insertions(+), 357 deletions(-) diff --git a/forc-plugins/forc-doc/src/doc/mod.rs b/forc-plugins/forc-doc/src/doc/mod.rs index 384939a2964..f407eefead7 100644 --- a/forc-plugins/forc-doc/src/doc/mod.rs +++ b/forc-plugins/forc-doc/src/doc/mod.rs @@ -15,7 +15,7 @@ use std::{ }; use sway_core::{ decl_engine::DeclEngine, - language::ty::{TyAstNodeContent, TyDecl, TyImplTrait, TyModule, TyProgram, TySubmodule}, + language::ty::{TyAstNodeContent, TyDecl, TyImplSelfOrTrait, TyModule, TyProgram, TySubmodule}, Engines, }; use sway_types::BaseIdent; @@ -36,7 +36,7 @@ impl Documentation { ) -> Result { // the first module prefix will always be the project name let mut docs = Documentation::default(); - let mut impl_traits: Vec<(TyImplTrait, ModuleInfo)> = Vec::new(); + let mut impl_traits: Vec<(TyImplSelfOrTrait, ModuleInfo)> = Vec::new(); let module_info = ModuleInfo::from_ty_module(vec![project_name.to_owned()], None); Documentation::from_ty_module( engines.de(), @@ -144,14 +144,14 @@ impl Documentation { module_info: &ModuleInfo, ty_module: &TyModule, docs: &mut Documentation, - impl_traits: &mut Vec<(TyImplTrait, ModuleInfo)>, + impl_traits: &mut Vec<(TyImplSelfOrTrait, ModuleInfo)>, document_private_items: bool, ) -> Result<()> { for ast_node in &ty_module.all_nodes { if let TyAstNodeContent::Declaration(ref decl) = ast_node.content { - if let TyDecl::ImplTrait(impl_trait) = decl { + if let TyDecl::ImplSelfOrTrait(impl_trait) = decl { impl_traits.push(( - (*decl_engine.get_impl_trait(&impl_trait.decl_id)).clone(), + (*decl_engine.get_impl_self_or_trait(&impl_trait.decl_id)).clone(), module_info.clone(), )); } else { @@ -175,7 +175,7 @@ impl Documentation { decl_engine: &DeclEngine, typed_submodule: &TySubmodule, docs: &mut Documentation, - impl_traits: &mut Vec<(TyImplTrait, ModuleInfo)>, + impl_traits: &mut Vec<(TyImplSelfOrTrait, ModuleInfo)>, module_info: &ModuleInfo, document_private_items: bool, ) -> Result<()> { diff --git a/forc-plugins/forc-doc/src/render/item/context.rs b/forc-plugins/forc-doc/src/render/item/context.rs index a5720ea1394..3e4a49cc29f 100644 --- a/forc-plugins/forc-doc/src/render/item/context.rs +++ b/forc-plugins/forc-doc/src/render/item/context.rs @@ -16,7 +16,7 @@ use anyhow::Result; use horrorshow::{box_html, Raw, RenderBox, Template}; use std::{collections::BTreeMap, fmt::Write}; use sway_core::language::ty::{ - TyEnumVariant, TyImplTrait, TyStorageField, TyStructField, TyTraitFn, TyTraitItem, + TyEnumVariant, TyImplSelfOrTrait, TyStorageField, TyStructField, TyTraitFn, TyTraitItem, }; /// The actual context of the item displayed by [ItemContext]. @@ -268,7 +268,7 @@ impl Renderable for Context { #[derive(Debug, Clone)] pub struct DocImplTrait { pub impl_for_module: ModuleInfo, - pub impl_trait: TyImplTrait, + pub impl_trait: TyImplSelfOrTrait, pub module_info_override: Option>, } @@ -495,7 +495,7 @@ impl Renderable for ItemContext { } impl Renderable for DocImplTrait { fn render(self, render_plan: RenderPlan) -> Result> { - let TyImplTrait { + let TyImplSelfOrTrait { trait_name, items, implementing_for, diff --git a/forc-plugins/forc-doc/src/render/title.rs b/forc-plugins/forc-doc/src/render/title.rs index ee4b1a44271..26dcc1e85fd 100644 --- a/forc-plugins/forc-doc/src/render/title.rs +++ b/forc-plugins/forc-doc/src/render/title.rs @@ -119,7 +119,7 @@ impl DocBlock for TyDecl { TyDecl::TraitDecl(_) => "trait", TyDecl::AbiDecl(_) => "abi", TyDecl::StorageDecl(_) => "contract_storage", - TyDecl::ImplTrait(_) => "impl_trait", + TyDecl::ImplSelfOrTrait(_) => "impl_trait", TyDecl::FunctionDecl(_) => "fn", TyDecl::ConstantDecl(_) => "constant", TyDecl::TypeAliasDecl(_) => "type_alias", diff --git a/sway-core/src/control_flow_analysis/analyze_return_paths.rs b/sway-core/src/control_flow_analysis/analyze_return_paths.rs index ae18d50f7e5..ea1d932edc4 100644 --- a/sway-core/src/control_flow_analysis/analyze_return_paths.rs +++ b/sway-core/src/control_flow_analysis/analyze_return_paths.rs @@ -224,9 +224,9 @@ fn connect_declaration<'eng: 'cfg, 'cfg>( connect_typed_fn_decl(engines, &fn_decl, graph, entry_node)?; Ok(leaves.to_vec()) } - ty::TyDecl::ImplTrait(ty::ImplTrait { decl_id, .. }) => { - let impl_trait = decl_engine.get_impl_trait(decl_id); - let ty::TyImplTrait { + ty::TyDecl::ImplSelfOrTrait(ty::ImplSelfOrTrait { decl_id, .. }) => { + let impl_trait = decl_engine.get_impl_self_or_trait(decl_id); + let ty::TyImplSelfOrTrait { trait_name, items, .. } = &*impl_trait; let entry_node = graph.add_node(ControlFlowGraphNode::from_node(node)); diff --git a/sway-core/src/control_flow_analysis/dead_code_analysis.rs b/sway-core/src/control_flow_analysis/dead_code_analysis.rs index b532f21f8e1..0098313cd58 100644 --- a/sway-core/src/control_flow_analysis/dead_code_analysis.rs +++ b/sway-core/src/control_flow_analysis/dead_code_analysis.rs @@ -70,7 +70,7 @@ fn is_entry_point(node: &TyAstNode, decl_engine: &DeclEngine, tree_type: &TreeTy struct_decl.visibility == Visibility::Public } TyAstNode { - content: TyAstNodeContent::Declaration(TyDecl::ImplTrait { .. }), + content: TyAstNodeContent::Declaration(TyDecl::ImplSelfOrTrait { .. }), .. } => true, TyAstNode { @@ -198,7 +198,10 @@ impl<'cfg> ControlFlowGraph<'cfg> { ControlFlowGraphNode::ProgramNode { node: ty::TyAstNode { - content: ty::TyAstNodeContent::Declaration(ty::TyDecl::ImplTrait { .. }), + content: + ty::TyAstNodeContent::Declaration(ty::TyDecl::ImplSelfOrTrait { + .. + }), .. }, .. @@ -632,9 +635,9 @@ fn connect_declaration<'eng: 'cfg, 'cfg>( connect_enum_declaration(&enum_decl, *enum_ref.id(), graph, entry_node); Ok(leaves.to_vec()) } - ty::TyDecl::ImplTrait(ty::ImplTrait { decl_id, .. }) => { - let impl_trait_decl = decl_engine.get_impl_trait(decl_id); - let ty::TyImplTrait { + ty::TyDecl::ImplSelfOrTrait(ty::ImplSelfOrTrait { decl_id, .. }) => { + let impl_trait_decl = decl_engine.get_impl_self_or_trait(decl_id); + let ty::TyImplSelfOrTrait { trait_name, items, trait_decl_ref, @@ -1168,8 +1171,8 @@ fn get_trait_fn_node_index<'a>( .namespace .find_trait_method(&struct_decl.call_path.suffix.clone().into(), &fn_decl.name)) } - ty::TyDecl::ImplTrait(ty::ImplTrait { decl_id, .. }) => { - let impl_trait = decl_engine.get_impl_trait(decl_id); + ty::TyDecl::ImplSelfOrTrait(ty::ImplSelfOrTrait { decl_id, .. }) => { + let impl_trait = decl_engine.get_impl_self_or_trait(decl_id); Ok(graph .namespace .find_trait_method(&impl_trait.trait_name, &fn_decl.name)) @@ -2351,12 +2354,13 @@ fn construct_dead_code_warning_from_node( } ty::TyAstNode { content: - ty::TyAstNodeContent::Declaration(ty::TyDecl::ImplTrait(ty::ImplTrait { - decl_id, .. + ty::TyAstNodeContent::Declaration(ty::TyDecl::ImplSelfOrTrait(ty::ImplSelfOrTrait { + decl_id, + .. })), span, } => { - let ty::TyImplTrait { .. } = &*decl_engine.get_impl_trait(decl_id); + let ty::TyImplSelfOrTrait { .. } = &*decl_engine.get_impl_self_or_trait(decl_id); CompileWarning { span: span.clone(), warning_content: Warning::DeadDeclaration, @@ -2554,7 +2558,7 @@ fn allow_dead_code_ast_node(decl_engine: &DeclEngine, node: &ty::TyAstNode) -> b ty::TyDecl::TypeAliasDecl(ty::TypeAliasDecl { decl_id, .. }) => { allow_dead_code(decl_engine.get_type_alias(decl_id).attributes.clone()) } - ty::TyDecl::ImplTrait { .. } => false, + ty::TyDecl::ImplSelfOrTrait { .. } => false, ty::TyDecl::AbiDecl { .. } => false, ty::TyDecl::GenericTypeForFunctionScope { .. } => false, ty::TyDecl::ErrorRecovery(..) => false, diff --git a/sway-core/src/decl_engine/engine.rs b/sway-core/src/decl_engine/engine.rs index 6b96d9932ac..7ea172ad7ed 100644 --- a/sway-core/src/decl_engine/engine.rs +++ b/sway-core/src/decl_engine/engine.rs @@ -13,7 +13,7 @@ use crate::{ engine_threading::*, language::ty::{ self, TyAbiDecl, TyConfigurableDecl, TyConstantDecl, TyEnumDecl, TyFunctionDecl, - TyImplTrait, TyStorageDecl, TyStructDecl, TyTraitDecl, TyTraitFn, TyTraitType, + TyImplSelfOrTrait, TyStorageDecl, TyStructDecl, TyTraitDecl, TyTraitFn, TyTraitType, TyTypeAliasDecl, }, }; @@ -25,7 +25,7 @@ pub struct DeclEngine { trait_slab: ConcurrentSlab, trait_fn_slab: ConcurrentSlab, trait_type_slab: ConcurrentSlab, - impl_trait_slab: ConcurrentSlab, + impl_self_or_trait_slab: ConcurrentSlab, struct_slab: ConcurrentSlab, storage_slab: ConcurrentSlab, abi_slab: ConcurrentSlab, @@ -44,7 +44,7 @@ impl Clone for DeclEngine { trait_slab: self.trait_slab.clone(), trait_fn_slab: self.trait_fn_slab.clone(), trait_type_slab: self.trait_type_slab.clone(), - impl_trait_slab: self.impl_trait_slab.clone(), + impl_self_or_trait_slab: self.impl_self_or_trait_slab.clone(), struct_slab: self.struct_slab.clone(), storage_slab: self.storage_slab.clone(), abi_slab: self.abi_slab.clone(), @@ -105,7 +105,7 @@ decl_engine_get!(function_slab, ty::TyFunctionDecl); decl_engine_get!(trait_slab, ty::TyTraitDecl); decl_engine_get!(trait_fn_slab, ty::TyTraitFn); decl_engine_get!(trait_type_slab, ty::TyTraitType); -decl_engine_get!(impl_trait_slab, ty::TyImplTrait); +decl_engine_get!(impl_self_or_trait_slab, ty::TyImplSelfOrTrait); decl_engine_get!(struct_slab, ty::TyStructDecl); decl_engine_get!(storage_slab, ty::TyStorageDecl); decl_engine_get!(abi_slab, ty::TyAbiDecl); @@ -142,7 +142,7 @@ decl_engine_insert!(function_slab, ty::TyFunctionDecl); decl_engine_insert!(trait_slab, ty::TyTraitDecl); decl_engine_insert!(trait_fn_slab, ty::TyTraitFn); decl_engine_insert!(trait_type_slab, ty::TyTraitType); -decl_engine_insert!(impl_trait_slab, ty::TyImplTrait); +decl_engine_insert!(impl_self_or_trait_slab, ty::TyImplSelfOrTrait); decl_engine_insert!(struct_slab, ty::TyStructDecl); decl_engine_insert!(storage_slab, ty::TyStorageDecl); decl_engine_insert!(abi_slab, ty::TyAbiDecl); @@ -164,7 +164,7 @@ decl_engine_replace!(function_slab, ty::TyFunctionDecl); decl_engine_replace!(trait_slab, ty::TyTraitDecl); decl_engine_replace!(trait_fn_slab, ty::TyTraitFn); decl_engine_replace!(trait_type_slab, ty::TyTraitType); -decl_engine_replace!(impl_trait_slab, ty::TyImplTrait); +decl_engine_replace!(impl_self_or_trait_slab, ty::TyImplSelfOrTrait); decl_engine_replace!(struct_slab, ty::TyStructDecl); decl_engine_replace!(storage_slab, ty::TyStorageDecl); decl_engine_replace!(abi_slab, ty::TyAbiDecl); @@ -182,7 +182,7 @@ decl_engine_index!(function_slab, ty::TyFunctionDecl); decl_engine_index!(trait_slab, ty::TyTraitDecl); decl_engine_index!(trait_fn_slab, ty::TyTraitFn); decl_engine_index!(trait_type_slab, ty::TyTraitType); -decl_engine_index!(impl_trait_slab, ty::TyImplTrait); +decl_engine_index!(impl_self_or_trait_slab, ty::TyImplSelfOrTrait); decl_engine_index!(struct_slab, ty::TyStructDecl); decl_engine_index!(storage_slab, ty::TyStorageDecl); decl_engine_index!(abi_slab, ty::TyAbiDecl); @@ -228,7 +228,7 @@ decl_engine_clear_program!( trait_slab, ty::TyTraitDecl; trait_fn_slab, ty::TyTraitFn; trait_type_slab, ty::TyTraitType; - impl_trait_slab, ty::TyImplTrait; + impl_self_or_trait_slab, ty::TyImplTrait; struct_slab, ty::TyStructDecl; storage_slab, ty::TyStorageDecl; abi_slab, ty::TyAbiDecl; @@ -360,9 +360,9 @@ impl DeclEngine { /// /// Calling [DeclEngine][get] directly is equivalent to this method, but /// this method adds additional syntax that some users may find helpful. - pub fn get_impl_trait(&self, index: &I) -> Arc + pub fn get_impl_self_or_trait(&self, index: &I) -> Arc where - DeclEngine: DeclEngineGet, + DeclEngine: DeclEngineGet, { self.get(index) } diff --git a/sway-core/src/decl_engine/id.rs b/sway-core/src/decl_engine/id.rs index c023b952c0f..dcc2391773d 100644 --- a/sway-core/src/decl_engine/id.rs +++ b/sway-core/src/decl_engine/id.rs @@ -10,7 +10,7 @@ use crate::{ decl_engine::*, engine_threading::*, language::ty::{ - TyEnumDecl, TyFunctionDecl, TyImplTrait, TyStructDecl, TyTraitDecl, TyTraitFn, + TyEnumDecl, TyFunctionDecl, TyImplSelfOrTrait, TyStructDecl, TyTraitDecl, TyTraitFn, TyTypeAliasDecl, }, type_system::*, @@ -167,7 +167,7 @@ impl SubstTypes for DeclId { } } } -impl SubstTypes for DeclId { +impl SubstTypes for DeclId { fn subst_inner(&mut self, type_mapping: &TypeSubstMap, engines: &Engines) -> HasChanges { let decl_engine = engines.de(); let mut decl = (*decl_engine.get(self)).clone(); diff --git a/sway-core/src/decl_engine/parsed_engine.rs b/sway-core/src/decl_engine/parsed_engine.rs index 546764e67f3..8b8f84107eb 100644 --- a/sway-core/src/decl_engine/parsed_engine.rs +++ b/sway-core/src/decl_engine/parsed_engine.rs @@ -3,7 +3,7 @@ use crate::{ decl_engine::*, language::parsed::{ AbiDeclaration, ConfigurableDeclaration, ConstantDeclaration, EnumDeclaration, EnumVariant, - FunctionDeclaration, ImplSelf, ImplTrait, StorageDeclaration, StructDeclaration, + FunctionDeclaration, ImplSelfOrTrait, StorageDeclaration, StructDeclaration, TraitDeclaration, TraitFn, TraitTypeDeclaration, TypeAliasDeclaration, VariableDeclaration, }, }; @@ -21,8 +21,7 @@ pub struct ParsedDeclEngine { trait_slab: ConcurrentSlab, trait_fn_slab: ConcurrentSlab, trait_type_slab: ConcurrentSlab, - impl_trait_slab: ConcurrentSlab, - impl_self_slab: ConcurrentSlab, + impl_self_or_trait_slab: ConcurrentSlab, struct_slab: ConcurrentSlab, storage_slab: ConcurrentSlab, abi_slab: ConcurrentSlab, @@ -66,8 +65,7 @@ decl_engine_get!(function_slab, FunctionDeclaration); decl_engine_get!(trait_slab, TraitDeclaration); decl_engine_get!(trait_fn_slab, TraitFn); decl_engine_get!(trait_type_slab, TraitTypeDeclaration); -decl_engine_get!(impl_trait_slab, ImplTrait); -decl_engine_get!(impl_self_slab, ImplSelf); +decl_engine_get!(impl_self_or_trait_slab, ImplSelfOrTrait); decl_engine_get!(struct_slab, StructDeclaration); decl_engine_get!(storage_slab, StorageDeclaration); decl_engine_get!(abi_slab, AbiDeclaration); @@ -92,8 +90,7 @@ decl_engine_insert!(function_slab, FunctionDeclaration); decl_engine_insert!(trait_slab, TraitDeclaration); decl_engine_insert!(trait_fn_slab, TraitFn); decl_engine_insert!(trait_type_slab, TraitTypeDeclaration); -decl_engine_insert!(impl_trait_slab, ImplTrait); -decl_engine_insert!(impl_self_slab, ImplSelf); +decl_engine_insert!(impl_self_or_trait_slab, ImplSelfOrTrait); decl_engine_insert!(struct_slab, StructDeclaration); decl_engine_insert!(storage_slab, StorageDeclaration); decl_engine_insert!(abi_slab, AbiDeclaration); @@ -121,8 +118,7 @@ decl_engine_clear!( trait_slab, TraitDeclaration; trait_fn_slab, TraitFn; trait_type_slab, TraitTypeDeclaration; - impl_trait_slab, ImplTrait; - impl_self_slab, ImplSelf; + impl_self_or_trait_slab, ImplTrait; struct_slab, StructDeclaration; storage_slab, StorageDeclaration; abi_slab, AbiDeclaration; @@ -158,8 +154,9 @@ decl_engine_clear_program!( (trait_type_slab, |item: &TraitTypeDeclaration| item .name .span()), - (impl_trait_slab, |item: &ImplTrait| item.block_span.clone()), - (impl_self_slab, |item: &ImplSelf| item.block_span.clone()), + (impl_self_or_trait_slab, |item: &ImplSelfOrTrait| item + .block_span + .clone()), (struct_slab, |item: &StructDeclaration| item.name.span()), (storage_slab, |item: &StorageDeclaration| item.span.clone()), (abi_slab, |item: &AbiDeclaration| item.name.span()), @@ -212,21 +209,9 @@ impl ParsedDeclEngine { /// /// Calling [ParsedDeclEngine][get] directly is equivalent to this method, but /// this method adds additional syntax that some users may find helpful. - pub fn get_impl_trait(&self, index: &I) -> Arc + pub fn get_impl_self_or_trait(&self, index: &I) -> Arc where - ParsedDeclEngine: ParsedDeclEngineGet, - { - self.get(index) - } - - /// Friendly helper method for calling the `get` method from the - /// implementation of [ParsedDeclEngineGet] for [ParsedDeclEngine] - /// - /// Calling [ParsedDeclEngine][get] directly is equivalent to this method, but - /// this method adds additional syntax that some users may find helpful. - pub fn get_impl_self(&self, index: &I) -> Arc - where - ParsedDeclEngine: ParsedDeclEngineGet, + ParsedDeclEngine: ParsedDeclEngineGet, { self.get(index) } diff --git a/sway-core/src/decl_engine/ref.rs b/sway-core/src/decl_engine/ref.rs index 6263622efd1..2ed681d87b9 100644 --- a/sway-core/src/decl_engine/ref.rs +++ b/sway-core/src/decl_engine/ref.rs @@ -29,8 +29,8 @@ use crate::{ decl_engine::*, engine_threading::*, language::ty::{ - self, TyAbiDecl, TyConstantDecl, TyEnumDecl, TyFunctionDecl, TyImplTrait, TyStorageDecl, - TyStructDecl, TyTraitDecl, TyTraitFn, TyTraitType, + self, TyAbiDecl, TyConstantDecl, TyEnumDecl, TyFunctionDecl, TyImplSelfOrTrait, + TyStorageDecl, TyStructDecl, TyTraitDecl, TyTraitFn, TyTraitType, }, semantic_analysis::TypeCheckContext, type_system::*, @@ -40,7 +40,7 @@ pub type DeclRefFunction = DeclRef>; pub type DeclRefTrait = DeclRef>; pub type DeclRefTraitFn = DeclRef>; pub type DeclRefTraitType = DeclRef>; -pub type DeclRefImplTrait = DeclRef>; +pub type DeclRefImplTrait = DeclRef>; pub type DeclRefStruct = DeclRef>; pub type DeclRefStorage = DeclRef>; pub type DeclRefAbi = DeclRef>; diff --git a/sway-core/src/ir_generation/function.rs b/sway-core/src/ir_generation/function.rs index b430929dcf8..184a4d88c05 100644 --- a/sway-core/src/ir_generation/function.rs +++ b/sway-core/src/ir_generation/function.rs @@ -229,7 +229,7 @@ impl<'eng> FnCompiler<'eng> { decl_type: "type alias", span: ast_node.span.clone(), }), - ty::TyDecl::ImplTrait { .. } => { + ty::TyDecl::ImplSelfOrTrait { .. } => { // XXX What if we ignore the trait implementation??? Potentially since // we currently inline everything and below we 'recreate' the functions // lazily as they are called, nothing needs to be done here. BUT! diff --git a/sway-core/src/language/parsed/declaration.rs b/sway-core/src/language/parsed/declaration.rs index 374198cb53c..c6a04c93789 100644 --- a/sway-core/src/language/parsed/declaration.rs +++ b/sway-core/src/language/parsed/declaration.rs @@ -46,8 +46,7 @@ pub enum Declaration { StructDeclaration(ParsedDeclId), EnumDeclaration(ParsedDeclId), EnumVariantDeclaration(EnumVariantDeclaration), - ImplTrait(ParsedDeclId), - ImplSelf(ParsedDeclId), + ImplSelfOrTrait(ParsedDeclId), AbiDeclaration(ParsedDeclId), ConstantDeclaration(ParsedDeclId), ConfigurableDeclaration(ParsedDeclId), @@ -88,8 +87,7 @@ impl Declaration { StructDeclaration(_) => "struct", EnumDeclaration(_) => "enum", EnumVariantDeclaration(_) => "enum variant", - ImplSelf(_) => "impl self", - ImplTrait(_) => "impl trait", + ImplSelfOrTrait(_) => "impl self/trait", AbiDeclaration(_) => "abi", StorageDeclaration(_) => "contract storage", TypeAliasDeclaration(_) => "type alias", @@ -106,8 +104,7 @@ impl Declaration { StructDeclaration(decl_id) => pe.get_struct(decl_id).span(), EnumDeclaration(decl_id) => pe.get_enum(decl_id).span(), EnumVariantDeclaration(decl) => decl.variant_decl_span.clone(), - ImplTrait(decl_id) => pe.get_impl_trait(decl_id).span(), - ImplSelf(decl_id) => pe.get_impl_self(decl_id).span(), + ImplSelfOrTrait(decl_id) => pe.get_impl_self_or_trait(decl_id).span(), AbiDeclaration(decl_id) => pe.get_abi(decl_id).span(), ConstantDeclaration(decl_id) => pe.get_constant(decl_id).span(), ConfigurableDeclaration(decl_id) => pe.get_configurable(decl_id).span(), @@ -138,8 +135,7 @@ impl Declaration { decl_engine.get_type_alias(decl_id).visibility } Declaration::VariableDeclaration(_decl_id) => Visibility::Private, - Declaration::ImplTrait(_) - | Declaration::ImplSelf(_) + Declaration::ImplSelfOrTrait(_) | Declaration::StorageDeclaration(_) | Declaration::AbiDeclaration(_) | Declaration::TraitTypeDeclaration(_) => Visibility::Public, @@ -169,7 +165,7 @@ impl DisplayWithEngines for Declaration { Declaration::EnumDeclaration(decl_id) => { engines.pe().get(decl_id).name.as_str().into() } - Declaration::ImplTrait(decl_id) => { + Declaration::ImplSelfOrTrait(decl_id) => { engines .pe() .get(decl_id) @@ -213,10 +209,7 @@ impl PartialEqWithEngines for Declaration { (Declaration::EnumDeclaration(lid), Declaration::EnumDeclaration(rid)) => { decl_engine.get(lid).eq(&decl_engine.get(rid), ctx) } - (Declaration::ImplTrait(lid), Declaration::ImplTrait(rid)) => { - decl_engine.get(lid).eq(&decl_engine.get(rid), ctx) - } - (Declaration::ImplSelf(lid), Declaration::ImplSelf(rid)) => { + (Declaration::ImplSelfOrTrait(lid), Declaration::ImplSelfOrTrait(rid)) => { decl_engine.get(lid).eq(&decl_engine.get(rid), ctx) } (Declaration::AbiDeclaration(lid), Declaration::AbiDeclaration(rid)) => { diff --git a/sway-core/src/language/parsed/declaration/impl_trait.rs b/sway-core/src/language/parsed/declaration/impl_trait.rs index c2115bd1a67..d6ba0a05535 100644 --- a/sway-core/src/language/parsed/declaration/impl_trait.rs +++ b/sway-core/src/language/parsed/declaration/impl_trait.rs @@ -61,8 +61,11 @@ impl DebugWithEngines for ImplItem { } } +/// An impl trait, or impl self of methods without a trait. +/// like `impl MyType { fn foo { .. } }` #[derive(Debug, Clone)] -pub struct ImplTrait { +pub struct ImplSelfOrTrait { + pub is_self: bool, pub impl_type_parameters: Vec, pub trait_name: CallPath, pub trait_type_arguments: Vec, @@ -72,8 +75,8 @@ pub struct ImplTrait { pub(crate) block_span: Span, } -impl EqWithEngines for ImplTrait {} -impl PartialEqWithEngines for ImplTrait { +impl EqWithEngines for ImplSelfOrTrait {} +impl PartialEqWithEngines for ImplSelfOrTrait { fn eq(&self, other: &Self, ctx: &PartialEqWithEnginesContext) -> bool { self.impl_type_parameters .eq(&other.impl_type_parameters, ctx) @@ -87,61 +90,31 @@ impl PartialEqWithEngines for ImplTrait { } } -impl Named for ImplTrait { +impl Named for ImplSelfOrTrait { fn name(&self) -> &sway_types::BaseIdent { &self.trait_name.suffix } } -impl Spanned for ImplTrait { +impl Spanned for ImplSelfOrTrait { fn span(&self) -> sway_types::Span { self.block_span.clone() } } -impl DebugWithEngines for ImplTrait { +impl DebugWithEngines for ImplSelfOrTrait { fn fmt(&self, f: &mut std::fmt::Formatter<'_>, engines: &Engines) -> std::fmt::Result { - f.write_fmt(format_args!( - "impl {} for {:?}", - self.trait_name, - engines.help_out(self.implementing_for.clone()) - )) - } -} - -/// An impl of methods without a trait -/// like `impl MyType { fn foo { .. } }` -#[derive(Debug, Clone)] -pub struct ImplSelf { - pub impl_type_parameters: Vec, - pub implementing_for: TypeArgument, - pub items: Vec, - // the span of the whole impl trait and block - pub(crate) block_span: Span, -} - -impl EqWithEngines for ImplSelf {} -impl PartialEqWithEngines for ImplSelf { - fn eq(&self, other: &Self, ctx: &PartialEqWithEnginesContext) -> bool { - self.impl_type_parameters - .eq(&other.impl_type_parameters, ctx) - && self.implementing_for.eq(&other.implementing_for, ctx) - && self.items.eq(&other.items, ctx) - && self.block_span == other.block_span - } -} - -impl Spanned for ImplSelf { - fn span(&self) -> sway_types::Span { - self.block_span.clone() - } -} - -impl DebugWithEngines for ImplSelf { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>, engines: &Engines) -> std::fmt::Result { - f.write_fmt(format_args!( - "impl {}", - engines.help_out(self.implementing_for.clone()) - )) + if self.is_self { + f.write_fmt(format_args!( + "impl {}", + engines.help_out(self.implementing_for.clone()) + )) + } else { + f.write_fmt(format_args!( + "impl {} for {:?}", + self.trait_name, + engines.help_out(self.implementing_for.clone()) + )) + } } } diff --git a/sway-core/src/language/ty/ast_node.rs b/sway-core/src/language/ty/ast_node.rs index 35020a34c99..f988836d757 100644 --- a/sway-core/src/language/ty/ast_node.rs +++ b/sway-core/src/language/ty/ast_node.rs @@ -236,7 +236,7 @@ impl TyAstNode { } allow_deprecated.exit(token); } - TyDecl::ImplTrait(decl) => { + TyDecl::ImplSelfOrTrait(decl) => { let decl = engines.de().get(&decl.decl_id); for item in decl.items.iter() { match item { @@ -293,7 +293,7 @@ impl TyAstNode { let _ = fn_decl_id.type_check_analyze(handler, &mut ctx); let _ = ctx.check_recursive_calls(handler); } - TyDecl::ImplTrait(decl) => { + TyDecl::ImplSelfOrTrait(decl) => { let decl = engines.de().get(&decl.decl_id); for item in decl.items.iter() { let mut ctx = TypeCheckAnalysisContext::new(engines); @@ -321,7 +321,7 @@ impl TyAstNode { pub fn contract_fns(&self, engines: &Engines) -> Vec { let mut fns = vec![]; - if let TyAstNodeContent::Declaration(TyDecl::ImplTrait(decl)) = &self.content { + if let TyAstNodeContent::Declaration(TyDecl::ImplSelfOrTrait(decl)) = &self.content { let decl = engines.de().get(&decl.decl_id); if decl.is_impl_contract(engines.te()) { for item in &decl.items { diff --git a/sway-core/src/language/ty/declaration/declaration.rs b/sway-core/src/language/ty/declaration/declaration.rs index 6ae0517f19f..904001b1fa2 100644 --- a/sway-core/src/language/ty/declaration/declaration.rs +++ b/sway-core/src/language/ty/declaration/declaration.rs @@ -28,7 +28,7 @@ pub enum TyDecl { StructDecl(StructDecl), EnumDecl(EnumDecl), EnumVariantDecl(EnumVariantDecl), - ImplTrait(ImplTrait), + ImplSelfOrTrait(ImplSelfOrTrait), AbiDecl(AbiDecl), // If type parameters are defined for a function, they are put in the namespace just for // the body of that function. @@ -81,8 +81,8 @@ pub struct EnumVariantDecl { } #[derive(Clone, Debug)] -pub struct ImplTrait { - pub decl_id: DeclId, +pub struct ImplSelfOrTrait { + pub decl_id: DeclId, } #[derive(Clone, Debug)] @@ -151,8 +151,8 @@ impl PartialEqWithEngines for TyDecl { .eq(&decl_engine.get_enum(r_enum), ctx) } ( - TyDecl::ImplTrait(ImplTrait { decl_id: lid, .. }), - TyDecl::ImplTrait(ImplTrait { decl_id: rid, .. }), + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id: lid, .. }), + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id: rid, .. }), ) => decl_engine.get(lid).eq(&decl_engine.get(rid), ctx), ( TyDecl::AbiDecl(AbiDecl { decl_id: lid, .. }), @@ -220,7 +220,7 @@ impl HashWithEngines for TyDecl { enum_ref.hash(state, engines); variant_name.hash(state); } - TyDecl::ImplTrait(ImplTrait { decl_id, .. }) => { + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id, .. }) => { decl_engine.get(decl_id).hash(state, engines); } TyDecl::AbiDecl(AbiDecl { decl_id, .. }) => { @@ -260,7 +260,7 @@ impl SubstTypes for TyDecl { TyDecl::EnumVariantDecl(EnumVariantDecl { ref mut enum_ref, .. }) => enum_ref.subst(type_mapping, engines), - TyDecl::ImplTrait(ImplTrait { + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { ref mut decl_id, .. }) => decl_id.subst(type_mapping, engines), TyDecl::TypeAliasDecl(TypeAliasDecl { @@ -304,8 +304,8 @@ impl SpannedWithEngines for TyDecl { engines.de().get_struct(decl_id).span.clone() } TyDecl::EnumDecl(EnumDecl { decl_id }) => engines.de().get_enum(decl_id).span.clone(), - TyDecl::ImplTrait(ImplTrait { decl_id }) => { - engines.de().get_impl_trait(decl_id).span.clone() + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id }) => { + engines.de().get_impl_self_or_trait(decl_id).span.clone() } TyDecl::AbiDecl(AbiDecl { decl_id }) => engines.de().get_abi(decl_id).span.clone(), TyDecl::VariableDecl(decl) => decl.name.span(), @@ -369,7 +369,7 @@ impl DisplayWithEngines for TyDecl { TyDecl::EnumDecl(EnumDecl { decl_id }) => { engines.de().get(decl_id).name().as_str().into() } - TyDecl::ImplTrait(ImplTrait { decl_id }) => { + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id }) => { engines.de().get(decl_id).name().as_str().into() } TyDecl::TypeAliasDecl(TypeAliasDecl { decl_id }) => @@ -433,7 +433,7 @@ impl CollectTypesMetadata for TyDecl { | TyDecl::StructDecl(_) | TyDecl::EnumDecl(_) | TyDecl::EnumVariantDecl(_) - | TyDecl::ImplTrait(_) + | TyDecl::ImplSelfOrTrait(_) | TyDecl::AbiDecl(_) | TyDecl::TypeAliasDecl(_) | TyDecl::TraitTypeDecl(_) @@ -467,7 +467,7 @@ impl GetDeclIdent for TyDecl { TyDecl::EnumDecl(EnumDecl { decl_id }) => { Some(engines.de().get(decl_id).name().clone()) } - TyDecl::ImplTrait(ImplTrait { decl_id }) => { + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id }) => { Some(engines.de().get(decl_id).name().clone()) } TyDecl::AbiDecl(AbiDecl { decl_id }) => Some(engines.de().get(decl_id).name().clone()), @@ -645,8 +645,8 @@ impl TyDecl { let decl_engine = engines.de(); let type_engine = engines.te(); match self { - TyDecl::ImplTrait(ImplTrait { decl_id, .. }) => { - let decl = decl_engine.get_impl_trait(decl_id); + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id, .. }) => { + let decl = decl_engine.get_impl_self_or_trait(decl_id); let implementing_for_type_id_arc = type_engine.get(decl.implementing_for.type_id); let implementing_for_type_id = &*implementing_for_type_id_arc; format!( @@ -682,7 +682,7 @@ impl TyDecl { StructDecl(_) => "struct", EnumDecl(_) => "enum", EnumVariantDecl(_) => "enum variant", - ImplTrait(_) => "impl trait", + ImplSelfOrTrait(_) => "impl trait", AbiDecl(_) => "abi", GenericTypeForFunctionScope(_) => "generic type parameter", ErrorRecovery(_, _) => "error", @@ -780,7 +780,7 @@ impl TyDecl { decl_engine.get_type_alias(decl_id).visibility } TyDecl::GenericTypeForFunctionScope(_) - | TyDecl::ImplTrait(_) + | TyDecl::ImplSelfOrTrait(_) | TyDecl::StorageDecl(_) | TyDecl::AbiDecl(_) | TyDecl::TraitTypeDecl(_) @@ -838,9 +838,9 @@ impl From>> for TyDecl { } } -impl From>> for TyDecl { - fn from(decl_ref: DeclRef>) -> Self { - TyDecl::ImplTrait(ImplTrait { +impl From>> for TyDecl { + fn from(decl_ref: DeclRef>) -> Self { + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id: *decl_ref.id(), }) } diff --git a/sway-core/src/language/ty/declaration/function.rs b/sway-core/src/language/ty/declaration/function.rs index c28d862846f..a616600bc45 100644 --- a/sway-core/src/language/ty/declaration/function.rs +++ b/sway-core/src/language/ty/declaration/function.rs @@ -434,7 +434,7 @@ impl TyFunctionDecl { }; match &self.implementing_type { - Some(TyDecl::ImplTrait(t)) => { + Some(TyDecl::ImplSelfOrTrait(t)) => { let unify_check = UnifyCheck::non_dynamic_equality(engines); let implementing_for = engines.de().get(&t.decl_id).implementing_for.type_id; diff --git a/sway-core/src/language/ty/declaration/impl_trait.rs b/sway-core/src/language/ty/declaration/impl_trait.rs index 151be5fae58..4224d1b6a17 100644 --- a/sway-core/src/language/ty/declaration/impl_trait.rs +++ b/sway-core/src/language/ty/declaration/impl_trait.rs @@ -13,7 +13,7 @@ pub type TyImplItem = TyTraitItem; // impl Trait for Type #[derive(Clone, Debug)] -pub struct TyImplTrait { +pub struct TyImplSelfOrTrait { pub impl_type_parameters: Vec, pub trait_name: CallPath, pub trait_type_arguments: Vec, @@ -23,26 +23,26 @@ pub struct TyImplTrait { pub span: Span, } -impl TyImplTrait { +impl TyImplSelfOrTrait { pub fn is_impl_contract(&self, te: &TypeEngine) -> bool { matches!(&*te.get(self.implementing_for.type_id), TypeInfo::Contract) } } -impl Named for TyImplTrait { +impl Named for TyImplSelfOrTrait { fn name(&self) -> &Ident { &self.trait_name.suffix } } -impl Spanned for TyImplTrait { +impl Spanned for TyImplSelfOrTrait { fn span(&self) -> Span { self.span.clone() } } -impl EqWithEngines for TyImplTrait {} -impl PartialEqWithEngines for TyImplTrait { +impl EqWithEngines for TyImplSelfOrTrait {} +impl PartialEqWithEngines for TyImplSelfOrTrait { fn eq(&self, other: &Self, ctx: &PartialEqWithEnginesContext) -> bool { self.impl_type_parameters .eq(&other.impl_type_parameters, ctx) @@ -56,9 +56,9 @@ impl PartialEqWithEngines for TyImplTrait { } } -impl HashWithEngines for TyImplTrait { +impl HashWithEngines for TyImplSelfOrTrait { fn hash(&self, state: &mut H, engines: &Engines) { - let TyImplTrait { + let TyImplSelfOrTrait { impl_type_parameters, trait_name, trait_type_arguments, @@ -78,7 +78,7 @@ impl HashWithEngines for TyImplTrait { } } -impl SubstTypes for TyImplTrait { +impl SubstTypes for TyImplSelfOrTrait { fn subst_inner(&mut self, type_mapping: &TypeSubstMap, engines: &Engines) -> HasChanges { has_changes! { self.impl_type_parameters.subst(type_mapping, engines); diff --git a/sway-core/src/language/ty/expression/expression.rs b/sway-core/src/language/ty/expression/expression.rs index f1cb109857c..fc1b1b3a0f5 100644 --- a/sway-core/src/language/ty/expression/expression.rs +++ b/sway-core/src/language/ty/expression/expression.rs @@ -404,7 +404,9 @@ impl TyExpression { TyExpressionVariant::FunctionApplication { call_path, fn_ref, .. } => { - if let Some(TyDecl::ImplTrait(t)) = &engines.de().get(fn_ref).implementing_type { + if let Some(TyDecl::ImplSelfOrTrait(t)) = + &engines.de().get(fn_ref).implementing_type + { let t = &engines.de().get(&t.decl_id).implementing_for; if let TypeInfo::Struct(struct_id) = &*engines.te().get(t.type_id) { let s = engines.de().get(struct_id); diff --git a/sway-core/src/language/ty/expression/expression_variant.rs b/sway-core/src/language/ty/expression/expression_variant.rs index 4a804c4356b..12f68716031 100644 --- a/sway-core/src/language/ty/expression/expression_variant.rs +++ b/sway-core/src/language/ty/expression/expression_variant.rs @@ -1348,8 +1348,8 @@ fn find_const_decl_from_impl( const_decl: &TyConstantDecl, ) -> Option { match implementing_type { - TyDecl::ImplTrait(ImplTrait { decl_id, .. }) => { - let impl_trait = decl_engine.get_impl_trait(&decl_id.clone()); + TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { decl_id, .. }) => { + let impl_trait = decl_engine.get_impl_self_or_trait(&decl_id.clone()); impl_trait .items .iter() diff --git a/sway-core/src/language/ty/program.rs b/sway-core/src/language/ty/program.rs index 0040a2adb9a..7d585533f18 100644 --- a/sway-core/src/language/ty/program.rs +++ b/sway-core/src/language/ty/program.rs @@ -131,9 +131,12 @@ impl TyProgram { // ABI entries are all functions declared in impl_traits on the contract type // itself, except for ABI supertraits, which do not expose their methods to // the user - TyAstNodeContent::Declaration(TyDecl::ImplTrait(ImplTrait { decl_id, .. })) => { - let impl_trait_decl = decl_engine.get_impl_trait(decl_id); - let TyImplTrait { + TyAstNodeContent::Declaration(TyDecl::ImplSelfOrTrait(ImplSelfOrTrait { + decl_id, + .. + })) => { + let impl_trait_decl = decl_engine.get_impl_self_or_trait(decl_id); + let TyImplSelfOrTrait { items, implementing_for, trait_decl_ref, diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/auto_impl.rs b/sway-core/src/semantic_analysis/ast_node/declaration/auto_impl.rs index 0052e107019..efb07857886 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/auto_impl.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/auto_impl.rs @@ -368,7 +368,7 @@ where .unwrap(); let decl = match nodes[0].content { - AstNodeContent::Declaration(Declaration::ImplTrait(f)) => f, + AstNodeContent::Declaration(Declaration::ImplSelfOrTrait(f)) => f, _ => unreachable!("unexpected item"), }; @@ -376,7 +376,7 @@ where let ctx = self.ctx.by_ref(); let r = ctx.scoped_and_namespace(|ctx| { - TyDecl::type_check(&handler, ctx, Declaration::ImplTrait(decl)) + TyDecl::type_check(&handler, ctx, Declaration::ImplSelfOrTrait(decl)) }); // Uncomment this to understand why auto impl failed for a type. diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs b/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs index 8514f96d469..8a972bc6b80 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/declaration.rs @@ -1,5 +1,5 @@ use sway_error::handler::{ErrorEmitted, Handler}; -use sway_types::{BaseIdent, Ident, Named, Spanned}; +use sway_types::{Ident, Named, Spanned}; use crate::{ decl_engine::{DeclEngineGet, DeclEngineInsert, DeclRef, ReplaceFunctionImplementingType}, @@ -55,8 +55,12 @@ impl TyDecl { let trait_decl = engines.pe().get_trait(decl_id).as_ref().clone(); ctx.insert_parsed_symbol(handler, engines, trait_decl.name.clone(), decl)?; } - parsed::Declaration::ImplTrait(decl_id) => { - let impl_trait = engines.pe().get_impl_trait(decl_id).as_ref().clone(); + parsed::Declaration::ImplSelfOrTrait(decl_id) => { + let impl_trait = engines + .pe() + .get_impl_self_or_trait(decl_id) + .as_ref() + .clone(); ctx.insert_parsed_symbol( handler, engines, @@ -64,15 +68,6 @@ impl TyDecl { decl, )?; } - parsed::Declaration::ImplSelf(decl_id) => { - let impl_self = engines.pe().get_impl_self(decl_id).as_ref().clone(); - ctx.insert_parsed_symbol( - handler, - engines, - BaseIdent::new(impl_self.implementing_for.span), - decl, - )?; - } parsed::Declaration::StructDeclaration(decl_id) => { let struct_decl = engines.pe().get_struct(decl_id).as_ref().clone(); ctx.insert_parsed_symbol(handler, engines, struct_decl.name.clone(), decl)?; @@ -285,16 +280,56 @@ impl TyDecl { ctx.insert_symbol(handler, name, decl.clone())?; decl } - parsed::Declaration::ImplTrait(decl_id) => { - let impl_trait = engines.pe().get_impl_trait(&decl_id).as_ref().clone(); - let span = impl_trait.block_span.clone(); - let mut impl_trait = - match ty::TyImplTrait::type_check_impl_trait(handler, ctx.by_ref(), impl_trait) - { - Ok(res) => res, + parsed::Declaration::ImplSelfOrTrait(decl_id) => { + let impl_self_or_trait = engines + .pe() + .get_impl_self_or_trait(&decl_id) + .as_ref() + .clone(); + let span = impl_self_or_trait.block_span.clone(); + let mut impl_trait = if impl_self_or_trait.is_self { + let impl_trait_decl = match ty::TyImplSelfOrTrait::type_check_impl_self( + handler, + ctx.by_ref(), + impl_self_or_trait, + ) { + Ok(val) => val, Err(err) => return Ok(ty::TyDecl::ErrorRecovery(span, err)), }; + let impl_trait = + if let TyDecl::ImplSelfOrTrait(impl_trait_id) = &impl_trait_decl { + decl_engine.get_impl_self_or_trait(&impl_trait_id.decl_id) + } else { + unreachable!(); + }; + ctx.insert_trait_implementation( + handler, + impl_trait.trait_name.clone(), + impl_trait.trait_type_arguments.clone(), + impl_trait.implementing_for.type_id, + &impl_trait.items, + &impl_trait.span, + impl_trait + .trait_decl_ref + .as_ref() + .map(|decl_ref| decl_ref.decl_span().clone()), + IsImplSelf::Yes, + IsExtendingExistingImpl::No, + )?; + + return Ok(impl_trait_decl); + } else { + match ty::TyImplSelfOrTrait::type_check_impl_trait( + handler, + ctx.by_ref(), + impl_self_or_trait, + ) { + Ok(res) => res, + Err(err) => return Ok(ty::TyDecl::ErrorRecovery(span, err)), + } + }; + // Insert prefixed symbols when implementing_for is Contract let is_contract = engines .te() @@ -357,35 +392,6 @@ impl TyDecl { }); impl_trait_decl } - parsed::Declaration::ImplSelf(decl_id) => { - let impl_self = engines.pe().get_impl_self(&decl_id).as_ref().clone(); - let span = impl_self.block_span.clone(); - let impl_trait_decl = - match ty::TyImplTrait::type_check_impl_self(handler, ctx.by_ref(), impl_self) { - Ok(val) => val, - Err(err) => return Ok(ty::TyDecl::ErrorRecovery(span, err)), - }; - let impl_trait = if let TyDecl::ImplTrait(impl_trait_id) = &impl_trait_decl { - decl_engine.get_impl_trait(&impl_trait_id.decl_id) - } else { - unreachable!(); - }; - ctx.insert_trait_implementation( - handler, - impl_trait.trait_name.clone(), - impl_trait.trait_type_arguments.clone(), - impl_trait.implementing_for.type_id, - &impl_trait.items, - &impl_trait.span, - impl_trait - .trait_decl_ref - .as_ref() - .map(|decl_ref| decl_ref.decl_span().clone()), - IsImplSelf::Yes, - IsExtendingExistingImpl::No, - )?; - impl_trait_decl - } parsed::Declaration::StructDeclaration(decl_id) => { let decl = engines.pe().get_struct(&decl_id).as_ref().clone(); let span = decl.span.clone(); @@ -636,7 +642,7 @@ impl TypeCheckAnalysis for TyDecl { enum_decl.type_check_analyze(handler, ctx)?; } TyDecl::EnumVariantDecl(_) => {} - TyDecl::ImplTrait(node) => { + TyDecl::ImplSelfOrTrait(node) => { node.type_check_analyze(handler, ctx)?; } TyDecl::AbiDecl(node) => { @@ -693,8 +699,8 @@ impl TypeCheckFinalization for TyDecl { enum_decl.type_check_finalize(handler, ctx)?; } TyDecl::EnumVariantDecl(_) => {} - TyDecl::ImplTrait(node) => { - let mut impl_trait = (*decl_engine.get_impl_trait(&node.decl_id)).clone(); + TyDecl::ImplSelfOrTrait(node) => { + let mut impl_trait = (*decl_engine.get_impl_self_or_trait(&node.decl_id)).clone(); impl_trait.type_check_finalize(handler, ctx)?; } TyDecl::AbiDecl(node) => { diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/impl_trait.rs b/sway-core/src/semantic_analysis/ast_node/declaration/impl_trait.rs index 36297c67300..38646cd29e6 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/impl_trait.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/impl_trait.rs @@ -15,7 +15,7 @@ use crate::{ engine_threading::*, language::{ parsed::*, - ty::{self, TyDecl, TyImplItem, TyImplTrait, TyTraitInterfaceItem, TyTraitItem}, + ty::{self, TyDecl, TyImplItem, TyImplSelfOrTrait, TyTraitInterfaceItem, TyTraitItem}, *, }, namespace::{IsExtendingExistingImpl, IsImplSelf, TryInsertingTraitImplOnFailure}, @@ -27,19 +27,20 @@ use crate::{ type_system::*, }; -impl TyImplTrait { +impl TyImplSelfOrTrait { pub(crate) fn type_check_impl_trait( handler: &Handler, mut ctx: TypeCheckContext, - impl_trait: ImplTrait, + impl_trait: ImplSelfOrTrait, ) -> Result { - let ImplTrait { + let ImplSelfOrTrait { impl_type_parameters, trait_name, mut trait_type_arguments, mut implementing_for, items, block_span, + .. } = impl_trait; let type_engine = ctx.engines.te(); @@ -177,7 +178,7 @@ impl TyImplTrait { &block_span, false, )?; - ty::TyImplTrait { + ty::TyImplSelfOrTrait { impl_type_parameters: new_impl_type_parameters, trait_name: trait_name.clone(), trait_type_arguments, @@ -254,7 +255,7 @@ impl TyImplTrait { &block_span, true, )?; - ty::TyImplTrait { + ty::TyImplSelfOrTrait { impl_type_parameters: vec![], // this is empty because abi definitions don't support generics trait_name, trait_type_arguments: vec![], // this is empty because abi definitions don't support generics @@ -282,13 +283,14 @@ impl TyImplTrait { pub(crate) fn type_check_impl_self( handler: &Handler, ctx: TypeCheckContext, - impl_self: ImplSelf, + impl_self: ImplSelfOrTrait, ) -> Result { - let ImplSelf { + let ImplSelfOrTrait { impl_type_parameters, mut implementing_for, items, block_span, + .. } = impl_self; let type_engine = ctx.engines.te(); @@ -434,7 +436,7 @@ impl TyImplTrait { } } - let mut impl_trait = ty::TyImplTrait { + let mut impl_trait = ty::TyImplSelfOrTrait { impl_type_parameters: new_impl_type_parameters, trait_name, trait_type_arguments: vec![], // this is empty because impl self's don't support generics on the "Self" trait, @@ -493,8 +495,8 @@ impl TyImplTrait { // This returns a vector with ordered indexes to the items in the order that they // should be processed. let ordered_node_indices_opt = - if let TyDecl::ImplTrait(impl_trait) = &impl_trait_decl { - ty::TyImplTrait::type_check_analyze_impl_self_items( + if let TyDecl::ImplSelfOrTrait(impl_trait) = &impl_trait_decl { + ty::TyImplSelfOrTrait::type_check_analyze_impl_self_items( handler, ctx.by_ref(), impl_trait, @@ -565,7 +567,7 @@ impl TyImplTrait { item.replace_implementing_type(engines, impl_trait_decl.clone()) }); - if let TyDecl::ImplTrait(impl_trait_id) = &impl_trait_decl { + if let TyDecl::ImplSelfOrTrait(impl_trait_id) = &impl_trait_decl { decl_engine.replace(impl_trait_id.decl_id, impl_trait); } @@ -577,7 +579,7 @@ impl TyImplTrait { pub(crate) fn type_check_analyze_impl_self_items( handler: &Handler, ctx: TypeCheckContext, - impl_self: &ty::ImplTrait, + impl_self: &ty::ImplSelfOrTrait, ) -> Result>, ErrorEmitted> { let engines = ctx.engines; handler.scope(|handler| { @@ -1537,14 +1539,14 @@ fn handle_supertraits( }) } -impl TypeCheckAnalysis for ty::ImplTrait { +impl TypeCheckAnalysis for ty::ImplSelfOrTrait { fn type_check_analyze( &self, handler: &Handler, ctx: &mut TypeCheckAnalysisContext, ) -> Result<(), ErrorEmitted> { let decl_engine = ctx.engines.de(); - let impl_trait = decl_engine.get_impl_trait(&self.decl_id); + let impl_trait = decl_engine.get_impl_self_or_trait(&self.decl_id); // Lets create a graph node for the impl trait and for every item in the trait. ctx.push_nodes_for_impl_trait(self); @@ -1562,7 +1564,7 @@ impl TypeCheckAnalysis for ty::ImplTrait { } } -impl TypeCheckFinalization for TyImplTrait { +impl TypeCheckFinalization for TyImplSelfOrTrait { fn type_check_finalize( &mut self, handler: &Handler, diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs index 7be712a0c00..ba2a5ac861f 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs @@ -601,7 +601,7 @@ pub(crate) fn type_check_method_application( // Unify method type parameters with implementing type type parameters. if let Some(implementing_for_typeid) = method.implementing_for_typeid { - if let Some(TyDecl::ImplTrait(t)) = method.clone().implementing_type { + if let Some(TyDecl::ImplSelfOrTrait(t)) = method.clone().implementing_type { let t = &engines.de().get(&t.decl_id).implementing_for; if let TypeInfo::Custom { type_arguments: Some(type_arguments), @@ -665,7 +665,7 @@ pub(crate) fn type_check_method_application( fn_ref = cached_fn_ref; } else { // This handles the case of substituting the generic blanket type by call_path_typeid. - if let Some(TyDecl::ImplTrait(t)) = method.clone().implementing_type { + if let Some(TyDecl::ImplSelfOrTrait(t)) = method.clone().implementing_type { let t = &engines.de().get(&t.decl_id).implementing_for; if let TypeInfo::Custom { qualified_call_path, diff --git a/sway-core/src/semantic_analysis/cei_pattern_analysis.rs b/sway-core/src/semantic_analysis/cei_pattern_analysis.rs index ad445675a26..808d114c23a 100644 --- a/sway-core/src/semantic_analysis/cei_pattern_analysis.rs +++ b/sway-core/src/semantic_analysis/cei_pattern_analysis.rs @@ -11,7 +11,7 @@ use crate::{ decl_engine::*, language::{ - ty::{self, TyFunctionDecl, TyImplTrait}, + ty::{self, TyFunctionDecl, TyImplSelfOrTrait}, AsmOp, }, Engines, @@ -111,7 +111,7 @@ fn contract_entry_points( Declaration(ty::TyDecl::FunctionDecl(ty::FunctionDecl { decl_id, .. })) => { decl_id_to_fn_decls(decl_engine, decl_id) } - Declaration(ty::TyDecl::ImplTrait(ty::ImplTrait { decl_id, .. })) => { + Declaration(ty::TyDecl::ImplSelfOrTrait(ty::ImplSelfOrTrait { decl_id, .. })) => { impl_trait_methods(decl_engine, decl_id) } _ => vec![], @@ -128,9 +128,9 @@ fn decl_id_to_fn_decls( fn impl_trait_methods( decl_engine: &DeclEngine, - impl_trait_decl_id: &DeclId, + impl_trait_decl_id: &DeclId, ) -> Vec> { - let impl_trait = decl_engine.get_impl_trait(impl_trait_decl_id); + let impl_trait = decl_engine.get_impl_self_or_trait(impl_trait_decl_id); impl_trait .items .iter() diff --git a/sway-core/src/semantic_analysis/module.rs b/sway-core/src/semantic_analysis/module.rs index 06ba200265a..2edc16ae3b7 100644 --- a/sway-core/src/semantic_analysis/module.rs +++ b/sway-core/src/semantic_analysis/module.rs @@ -387,7 +387,7 @@ impl ty::TyModule { fn get_all_impls( ctx: TypeCheckContext<'_>, nodes: &[AstNode], - predicate: fn(&ImplTrait) -> bool, + predicate: fn(&ImplSelfOrTrait) -> bool, ) -> HashMap> { let engines = ctx.engines(); // Check which structs and enums needs to have auto impl for AbiEncode @@ -396,8 +396,10 @@ impl ty::TyModule { let mut impls = HashMap::>::new(); for node in nodes.iter() { - if let AstNodeContent::Declaration(Declaration::ImplTrait(decl_id)) = &node.content { - let decl = &*engines.pe().get_impl_trait(decl_id); + if let AstNodeContent::Declaration(Declaration::ImplSelfOrTrait(decl_id)) = + &node.content + { + let decl = &*engines.pe().get_impl_self_or_trait(decl_id); let implementing_for = ctx.engines.te().get(decl.implementing_for.type_id); let implementing_for = match &*implementing_for { TypeInfo::Struct(decl_id) => { diff --git a/sway-core/src/semantic_analysis/node_dependencies.rs b/sway-core/src/semantic_analysis/node_dependencies.rs index f9d67914263..45d2858a1b8 100644 --- a/sway-core/src/semantic_analysis/node_dependencies.rs +++ b/sway-core/src/semantic_analysis/node_dependencies.rs @@ -376,14 +376,14 @@ impl Dependencies { }, ) } - Declaration::ImplTrait(decl_id) => { - let ImplTrait { + Declaration::ImplSelfOrTrait(decl_id) => { + let ImplSelfOrTrait { impl_type_parameters, trait_name, implementing_for, items, .. - } = &*engines.pe().get_impl_trait(decl_id); + } = &*engines.pe().get_impl_self_or_trait(decl_id); self.gather_from_call_path(trait_name, false, false) .gather_from_type_argument(engines, implementing_for) .gather_from_type_parameters(impl_type_parameters) @@ -402,28 +402,6 @@ impl Dependencies { } }) } - Declaration::ImplSelf(decl_id) => { - let ImplSelf { - implementing_for, - items, - .. - } = &*engines.pe().get_impl_self(decl_id); - self.gather_from_type_argument(engines, implementing_for) - .gather_from_iter(items.iter(), |deps, item| match item { - ImplItem::Fn(fn_decl_id) => { - let fn_decl = engines.pe().get_function(fn_decl_id); - deps.gather_from_fn_decl(engines, &fn_decl) - } - ImplItem::Constant(decl_id) => { - let const_decl = engines.pe().get_constant(decl_id); - deps.gather_from_constant_decl(engines, &const_decl) - } - ImplItem::Type(decl_id) => { - let type_decl = engines.pe().get_trait_type(decl_id); - deps.gather_from_type_decl(engines, &type_decl) - } - }) - } Declaration::AbiDeclaration(decl_id) => { let AbiDeclaration { interface_surface, @@ -937,37 +915,34 @@ fn decl_name(engines: &Engines, decl: &Declaration) -> Option { let decl = engines.pe().get_type_alias(decl_id); dep_sym(decl.name.clone()) } - - // These have the added complexity of converting CallPath and/or TypeInfo into a name. - Declaration::ImplSelf(decl_id) => { - let decl = engines.pe().get_impl_self(decl_id); - let trait_name = Ident::new_with_override("self".into(), decl.implementing_for.span()); - impl_sym( - trait_name, - &type_engine.get(decl.implementing_for.type_id), - decl.items - .iter() - .map(|item| match item { - ImplItem::Fn(fn_decl_id) => { - let fn_decl = engines.pe().get_function(fn_decl_id); - fn_decl.name.to_string() - } - ImplItem::Constant(decl_id) => { - let const_decl = engines.pe().get_constant(decl_id); - const_decl.name.to_string() - } - ImplItem::Type(decl_id) => { - let type_decl = engines.pe().get_trait_type(decl_id); - type_decl.name.to_string() - } - }) - .collect::>() - .join(""), - ) - } - Declaration::ImplTrait(decl_id) => { - let decl = engines.pe().get_impl_trait(decl_id); - if decl.trait_name.prefixes.is_empty() { + Declaration::ImplSelfOrTrait(decl_id) => { + let decl = engines.pe().get_impl_self_or_trait(decl_id); + if decl.is_self { + let trait_name = + Ident::new_with_override("self".into(), decl.implementing_for.span()); + impl_sym( + trait_name, + &type_engine.get(decl.implementing_for.type_id), + decl.items + .iter() + .map(|item| match item { + ImplItem::Fn(fn_decl_id) => { + let fn_decl = engines.pe().get_function(fn_decl_id); + fn_decl.name.to_string() + } + ImplItem::Constant(decl_id) => { + let const_decl = engines.pe().get_constant(decl_id); + const_decl.name.to_string() + } + ImplItem::Type(decl_id) => { + let type_decl = engines.pe().get_trait_type(decl_id); + type_decl.name.to_string() + } + }) + .collect::>() + .join(""), + ) + } else if decl.trait_name.prefixes.is_empty() { impl_sym( decl.trait_name.suffix.clone(), &type_engine.get(decl.implementing_for.type_id), diff --git a/sway-core/src/semantic_analysis/type_check_analysis.rs b/sway-core/src/semantic_analysis/type_check_analysis.rs index 41b260538de..6ad5337561d 100644 --- a/sway-core/src/semantic_analysis/type_check_analysis.rs +++ b/sway-core/src/semantic_analysis/type_check_analysis.rs @@ -38,7 +38,7 @@ impl Display for TyNodeDepGraphEdge { #[derive(Clone, Debug)] pub enum TyNodeDepGraphNode { - ImplTrait { node: ty::ImplTrait }, + ImplTrait { node: ty::ImplSelfOrTrait }, ImplTraitItem { node: ty::TyTraitItem }, Fn { node: DeclId }, } @@ -125,7 +125,7 @@ impl TypeCheckAnalysisContext<'_> { #[allow(clippy::map_entry)] pub(crate) fn push_nodes_for_impl_trait( &mut self, - impl_trait: &ty::ImplTrait, + impl_trait: &ty::ImplSelfOrTrait, ) -> TyNodeDepGraphNodeId { if self.nodes.contains_key(&impl_trait.decl_id.unique_id()) { *self.nodes.get(&impl_trait.decl_id.unique_id()).unwrap() @@ -136,7 +136,7 @@ impl TypeCheckAnalysisContext<'_> { self.nodes.insert(impl_trait.decl_id.unique_id(), node); let decl_engine = self.engines.de(); - let impl_trait = decl_engine.get_impl_trait(&impl_trait.decl_id); + let impl_trait = decl_engine.get_impl_self_or_trait(&impl_trait.decl_id); for item in impl_trait.items.iter() { let item_node = self.get_or_create_node_for_impl_item(item); @@ -372,7 +372,7 @@ impl DebugWithEngines for TyNodeDepGraphNode { format!("{:?}", str) } TyNodeDepGraphNode::ImplTrait { node } => { - let decl = engines.de().get_impl_trait(&node.decl_id); + let decl = engines.de().get_impl_self_or_trait(&node.decl_id); format!("{:?}", decl.name().as_str()) } TyNodeDepGraphNode::Fn { node } => { diff --git a/sway-core/src/semantic_analysis/type_check_context.rs b/sway-core/src/semantic_analysis/type_check_context.rs index 27f8c7267a8..b25992ba437 100644 --- a/sway-core/src/semantic_analysis/type_check_context.rs +++ b/sway-core/src/semantic_analysis/type_check_context.rs @@ -1143,10 +1143,10 @@ impl<'a> TypeCheckContext<'a> { let mut impl_self_method = None; for method_ref in maybe_method_decl_refs.clone() { let method = decl_engine.get_function(&method_ref); - if let Some(ty::TyDecl::ImplTrait(impl_trait)) = + if let Some(ty::TyDecl::ImplSelfOrTrait(impl_trait)) = method.implementing_type.clone() { - let trait_decl = decl_engine.get_impl_trait(&impl_trait.decl_id); + let trait_decl = decl_engine.get_impl_self_or_trait(&impl_trait.decl_id); let mut skip_insert = false; if let Some(as_trait) = as_trait { if let TypeInfo::Custom { diff --git a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs index 655b4be620c..28337cc6c87 100644 --- a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs +++ b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs @@ -39,6 +39,7 @@ use sway_types::{ TEST_ATTRIBUTE_NAME, VALID_ATTRIBUTE_NAMES, }, integer_bits::IntegerBits, + BaseIdent, }; use sway_types::{Ident, Span, Spanned}; @@ -767,7 +768,8 @@ pub fn item_impl_to_declaration( Some((path_type, _)) => { let (trait_name, trait_type_arguments) = path_type_to_call_path_and_type_arguments(context, handler, engines, path_type)?; - let impl_trait = ImplTrait { + let impl_trait = ImplSelfOrTrait { + is_self: false, impl_type_parameters, trait_name: trait_name.to_call_path(handler)?, trait_type_arguments, @@ -776,20 +778,27 @@ pub fn item_impl_to_declaration( block_span, }; let impl_trait = engines.pe().insert(impl_trait); - Ok(Declaration::ImplTrait(impl_trait)) + Ok(Declaration::ImplSelfOrTrait(impl_trait)) } None => match &*engines.te().get(implementing_for.type_id) { TypeInfo::Contract => Err(handler .emit_err(ConvertParseTreeError::SelfImplForContract { span: block_span }.into())), _ => { - let impl_self = ImplSelf { + let impl_self = ImplSelfOrTrait { + is_self: true, + trait_name: CallPath { + is_absolute: false, + prefixes: vec![], + suffix: BaseIdent::dummy(), + }, + trait_type_arguments: vec![], implementing_for, impl_type_parameters, items, block_span, }; let impl_self = engines.pe().insert(impl_self); - Ok(Declaration::ImplSelf(impl_self)) + Ok(Declaration::ImplSelfOrTrait(impl_self)) } }, } diff --git a/sway-lsp/src/capabilities/code_actions/struct_decl/struct_new.rs b/sway-lsp/src/capabilities/code_actions/struct_decl/struct_new.rs index 5b2fbc8671a..2ad3674f68f 100644 --- a/sway-lsp/src/capabilities/code_actions/struct_decl/struct_new.rs +++ b/sway-lsp/src/capabilities/code_actions/struct_decl/struct_new.rs @@ -6,13 +6,13 @@ use crate::{ core::{token::TypedAstToken, token_map::TokenMapExt}, }; use lsp_types::{CodeActionDisabled, Position, Range, Url}; -use sway_core::language::ty::{self, TyImplTrait, TyStructDecl, TyStructField}; +use sway_core::language::ty::{self, TyImplSelfOrTrait, TyStructDecl, TyStructField}; use sway_types::{LineCol, Spanned}; pub(crate) struct StructNewCodeAction<'a> { decl: &'a TyStructDecl, uri: &'a Url, - existing_impl_decl: Option, + existing_impl_decl: Option, } impl<'a> GenerateImplCodeAction<'a, TyStructDecl> for StructNewCodeAction<'a> { @@ -31,11 +31,11 @@ impl<'a> CodeAction<'a, TyStructDecl> for StructNewCodeAction<'a> { .iter() .all_references_of_token(ctx.token, ctx.engines) .find_map(|item| { - if let Some(TypedAstToken::TypedDeclaration(ty::TyDecl::ImplTrait( - ty::ImplTrait { decl_id, .. }, + if let Some(TypedAstToken::TypedDeclaration(ty::TyDecl::ImplSelfOrTrait( + ty::ImplSelfOrTrait { decl_id, .. }, ))) = item.value().typed { - Some((*ctx.engines.de().get_impl_trait(&decl_id)).clone()) + Some((*ctx.engines.de().get_impl_self_or_trait(&decl_id)).clone()) } else { None } diff --git a/sway-lsp/src/capabilities/rename.rs b/sway-lsp/src/capabilities/rename.rs index a0eb011c948..c00d9374f94 100644 --- a/sway-lsp/src/capabilities/rename.rs +++ b/sway-lsp/src/capabilities/rename.rs @@ -217,8 +217,8 @@ fn find_all_methods_for_decl<'a>( engines.se(), )) } - ty::TyDecl::ImplTrait(ty::ImplTrait { decl_id, .. }) => { - let impl_trait = engines.de().get_impl_trait(decl_id); + ty::TyDecl::ImplSelfOrTrait(ty::ImplSelfOrTrait { decl_id, .. }) => { + let impl_trait = engines.de().get_impl_self_or_trait(decl_id); Some( impl_trait .items diff --git a/sway-lsp/src/traverse/parsed_tree.rs b/sway-lsp/src/traverse/parsed_tree.rs index 08b8f647876..39ba771f879 100644 --- a/sway-lsp/src/traverse/parsed_tree.rs +++ b/sway-lsp/src/traverse/parsed_tree.rs @@ -23,15 +23,15 @@ use sway_core::{ ConstantDeclaration, Declaration, DelineatedPathExpression, EnumDeclaration, EnumVariant, Expression, ExpressionKind, ForLoopExpression, FunctionApplicationExpression, FunctionDeclaration, FunctionParameter, IfExpression, - ImplItem, ImplSelf, ImplTrait, ImportType, IncludeStatement, - IntrinsicFunctionExpression, LazyOperatorExpression, MatchExpression, - MethodApplicationExpression, MethodName, ParseModule, ParseProgram, ParseSubmodule, - QualifiedPathType, ReassignmentExpression, ReassignmentTarget, RefExpression, - Scrutinee, StorageAccessExpression, StorageDeclaration, StorageEntry, StorageField, - StorageNamespace, StructDeclaration, StructExpression, StructExpressionField, - StructField, StructScrutineeField, SubfieldExpression, Supertrait, TraitDeclaration, - TraitFn, TraitItem, TraitTypeDeclaration, TupleIndexExpression, TypeAliasDeclaration, - UseStatement, VariableDeclaration, WhileLoopExpression, + ImplItem, ImplSelfOrTrait, ImportType, IncludeStatement, IntrinsicFunctionExpression, + LazyOperatorExpression, MatchExpression, MethodApplicationExpression, MethodName, + ParseModule, ParseProgram, ParseSubmodule, QualifiedPathType, ReassignmentExpression, + ReassignmentTarget, RefExpression, Scrutinee, StorageAccessExpression, + StorageDeclaration, StorageEntry, StorageField, StorageNamespace, StructDeclaration, + StructExpression, StructExpressionField, StructField, StructScrutineeField, + SubfieldExpression, Supertrait, TraitDeclaration, TraitFn, TraitItem, + TraitTypeDeclaration, TupleIndexExpression, TypeAliasDeclaration, UseStatement, + VariableDeclaration, WhileLoopExpression, }, CallPathTree, HasSubmodules, Literal, }, @@ -126,8 +126,7 @@ impl Parse for Declaration { Declaration::StructDeclaration(decl_id) => decl_id.parse(ctx), Declaration::EnumDeclaration(decl_id) => decl_id.parse(ctx), Declaration::EnumVariantDeclaration(_decl) => unreachable!(), - Declaration::ImplTrait(decl_id) => decl_id.parse(ctx), - Declaration::ImplSelf(decl_id) => decl_id.parse(ctx), + Declaration::ImplSelfOrTrait(decl_id) => decl_id.parse(ctx), Declaration::AbiDeclaration(decl_id) => decl_id.parse(ctx), Declaration::ConstantDeclaration(decl_id) => decl_id.parse(ctx), Declaration::ConfigurableDeclaration(decl_id) => decl_id.parse(ctx), @@ -779,58 +778,49 @@ impl Parse for ParsedDeclId { } } -impl Parse for ParsedDeclId { +impl Parse for ParsedDeclId { fn parse(&self, ctx: &ParseContext) { - let impl_trait = ctx.engines.pe().get_impl_trait(self); - adaptive_iter(&impl_trait.trait_name.prefixes, |ident| { + let impl_self_or_trait = ctx.engines.pe().get_impl_self_or_trait(self); + adaptive_iter(&impl_self_or_trait.trait_name.prefixes, |ident| { ctx.tokens.insert( ctx.ident(ident), Token::from_parsed(AstToken::Ident(ident.clone()), SymbolKind::Module), ); }); ctx.tokens.insert( - ctx.ident(&impl_trait.trait_name.suffix), + ctx.ident(&impl_self_or_trait.trait_name.suffix), Token::from_parsed( - AstToken::Declaration(Declaration::ImplTrait(*self)), + AstToken::Declaration(Declaration::ImplSelfOrTrait(*self)), SymbolKind::Trait, ), ); - impl_trait.implementing_for.parse(ctx); - adaptive_iter(&impl_trait.impl_type_parameters, |type_param| { - type_param.parse(ctx); - }); - adaptive_iter(&impl_trait.items, |item| match item { - ImplItem::Fn(fn_decl) => fn_decl.parse(ctx), - ImplItem::Constant(const_decl) => const_decl.parse(ctx), - ImplItem::Type(type_decl) => type_decl.parse(ctx), - }); - } -} - -impl Parse for ParsedDeclId { - fn parse(&self, ctx: &ParseContext) { - let impl_self = ctx.engines.pe().get_impl_self(self); if let TypeInfo::Custom { qualified_call_path, type_arguments, root_type_id: _, - } = &&*ctx.engines.te().get(impl_self.implementing_for.type_id) + } = &&*ctx + .engines + .te() + .get(impl_self_or_trait.implementing_for.type_id) { ctx.tokens.insert( ctx.ident(&qualified_call_path.call_path.suffix), Token::from_parsed( - AstToken::Declaration(Declaration::ImplSelf(*self)), + AstToken::Declaration(Declaration::ImplSelfOrTrait(*self)), SymbolKind::Struct, ), ); if let Some(type_arguments) = type_arguments { adaptive_iter(type_arguments, |type_arg| type_arg.parse(ctx)); } + } else { + impl_self_or_trait.implementing_for.parse(ctx); } - adaptive_iter(&impl_self.impl_type_parameters, |type_param| { + + adaptive_iter(&impl_self_or_trait.impl_type_parameters, |type_param| { type_param.parse(ctx); }); - adaptive_iter(&impl_self.items, |item| match item { + adaptive_iter(&impl_self_or_trait.items, |item| match item { ImplItem::Fn(fn_decl) => fn_decl.parse(ctx), ImplItem::Constant(const_decl) => const_decl.parse(ctx), ImplItem::Type(type_decl) => type_decl.parse(ctx), diff --git a/sway-lsp/src/traverse/typed_tree.rs b/sway-lsp/src/traverse/typed_tree.rs index dfd350393e8..58003027f20 100644 --- a/sway-lsp/src/traverse/typed_tree.rs +++ b/sway-lsp/src/traverse/typed_tree.rs @@ -82,7 +82,7 @@ impl Parse for ty::TyDecl { ty::TyDecl::StructDecl(decl) => decl.parse(ctx), ty::TyDecl::EnumDecl(decl) => collect_enum(ctx, &decl.decl_id, self), ty::TyDecl::EnumVariantDecl(decl) => collect_enum(ctx, decl.enum_ref.id(), self), - ty::TyDecl::ImplTrait(decl) => decl.parse(ctx), + ty::TyDecl::ImplSelfOrTrait(decl) => decl.parse(ctx), ty::TyDecl::AbiDecl(decl) => decl.parse(ctx), ty::TyDecl::GenericTypeForFunctionScope(decl) => decl.parse(ctx), ty::TyDecl::ErrorRecovery(_, _) => {} @@ -719,10 +719,10 @@ impl Parse for ty::StructDecl { } } -impl Parse for ty::ImplTrait { +impl Parse for ty::ImplSelfOrTrait { fn parse(&self, ctx: &ParseContext) { - let impl_trait_decl = ctx.engines.de().get_impl_trait(&self.decl_id); - let ty::TyImplTrait { + let impl_trait_decl = ctx.engines.de().get_impl_self_or_trait(&self.decl_id); + let ty::TyImplSelfOrTrait { impl_type_parameters, trait_name, trait_type_arguments, @@ -754,9 +754,9 @@ impl Parse for ty::ImplTrait { .tokens .try_get_mut_with_retry(&ctx.ident(&trait_name.suffix)) { - token.typed = Some(TypedAstToken::TypedDeclaration(ty::TyDecl::ImplTrait( - self.clone(), - ))); + token.typed = Some(TypedAstToken::TypedDeclaration( + ty::TyDecl::ImplSelfOrTrait(self.clone()), + )); token.type_def = if let Some(decl_ref) = &trait_decl_ref { typed_token = Some(TypedAstToken::TypedArgument(implementing_for.clone())); match &decl_ref.id().clone() { From cbcb2f00b9daaa8f75694d40e40950c2607603d3 Mon Sep 17 00:00:00 2001 From: Daniel Frederico Lins Leite Date: Wed, 10 Jul 2024 06:20:50 +0100 Subject: [PATCH 17/19] uncomment update contract update check (#6247) ## Description - Uncomment clean git status - allow interactive update with the `-i` flag. ## Checklist - [ ] I have linked to any relevant issues. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [ ] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [ ] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [ ] I have requested a review from the relevant team or maintainers. --------- Co-authored-by: IGI-111 Co-authored-by: Joshua Batty --- test/update-contract-ids.sh | 68 ++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/test/update-contract-ids.sh b/test/update-contract-ids.sh index 23c82db18a9..591a2a7052d 100755 --- a/test/update-contract-ids.sh +++ b/test/update-contract-ids.sh @@ -1,10 +1,23 @@ #! /bin/bash -# CHANGES=$(git status --porcelain | wc -l) -# if [ "$CHANGES" != "0" ]; then -# echo "git state is not clean. commit or restore first." -# exit -# fi +print_help() { + echo " + -i run interactively +"; +} + +INTERACTIVELY="0" + +while [[ "$#" -gt 0 ]]; do + case $1 in + -i) INTERACTIVELY="1"; shift ;; + *) print_help; exit 1 ;; + esac + shift +done + + +CHANGES=$(git status --porcelain | wc -l) BOLD_RED='\033[1;31m' BOLD_GREEN="\033[1;32m" @@ -19,13 +32,27 @@ function join_by { fi } +ask_confirmation() { + echo -e "${BOLD_WHITE}Command below needs confirmation before running.${NC} $2" + echo "> $1" + read -p "Run the command above? (y/n) " -n 1 -r > /dev/null - sed -i "${LINE}s/0x[a-zA-Z0-9]*/$CONTRACT_ID/g" $FILE - echo -e " ${BOLD_GREEN}ok${NC} ($CONTRACT_ID)" + + SED_EXPR="${LINE}s/0x[a-zA-Z0-9]*/$CONTRACT_ID/g" + + # check if there is a diff + diff -s --color <(cat $FILE) <(cat $FILE | sed --expression="$SED_EXPR") > /dev/null + if [ $? -eq 0 ]; then + # no diff, continue + echo -e " ${BOLD_GREEN}no changes needed${NC} ($CONTRACT_ID)" + else + # diff detected, check we are clean to update files, if not abort + if [[ "$INTERACTIVELY" == "0" ]]; then + # DonĀ“t change anything if git is dirty + if [ "$CHANGES" != "0" ]; then + echo -e " ${BOLD_RED}Aborting${NC} This contract id needs update, but git state is not clean. commit, restore first or run with \"-i\"." + echo $FILE + diff -s --color <(cat $FILE) <(cat $FILE | sed --expression="$SED_EXPR") + exit + fi + # we are clean and can update files + sed -i "$SED_EXPR" $FILE + else + # ask confirmation before applying the change + diff -s --color <(cat $FILE) <(cat $FILE | sed --expression="$SED_EXPR") + ask_confirmation "sed -i \"$SED_EXPR\" $FILE" "Update contract id" + fi + echo -e " ${BOLD_GREEN}updated${NC} ($CONTRACT_ID)" + fi else echo -e " ${BOLD_RED}error${NC}" cargo r -p forc --release -- contract-id --release From 250666d3de43439dd4026ef844616c448b6ffde7 Mon Sep 17 00:00:00 2001 From: Joshua Batty Date: Wed, 10 Jul 2024 15:35:18 +1000 Subject: [PATCH 18/19] Add LRU Session Cache to Reduce RAM Usage (#6239) ## Description This PR introduces an LRU (Least Recently Used) cache mechanism for managing sessions in large workspaces. This change aims to address the issue of high RAM usage reported in workspaces with multiple projects. closes #6222 ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [x] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [x] I have added tests that prove my fix is effective or that my feature works. - [x] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --- sway-lsp/src/server_state.rs | 111 +++++++++++++++++++++++++++++++---- 1 file changed, 98 insertions(+), 13 deletions(-) diff --git a/sway-lsp/src/server_state.rs b/sway-lsp/src/server_state.rs index 4415f0b2d91..f744adc8847 100644 --- a/sway-lsp/src/server_state.rs +++ b/sway-lsp/src/server_state.rs @@ -10,12 +10,15 @@ use crate::{ utils::{debug, keyword_docs::KeywordDocs}, }; use crossbeam_channel::{Receiver, Sender}; -use dashmap::DashMap; +use dashmap::{mapref::multiple::RefMulti, DashMap}; use forc_pkg::manifest::GenericManifestFile; use forc_pkg::PackageManifestFile; use lsp_types::{Diagnostic, Url}; -use parking_lot::RwLock; -use std::{collections::BTreeMap, process::Command}; +use parking_lot::{Mutex, RwLock}; +use std::{ + collections::{BTreeMap, VecDeque}, + process::Command, +}; use std::{ mem, path::PathBuf, @@ -28,13 +31,17 @@ use sway_core::LspConfig; use tokio::sync::Notify; use tower_lsp::{jsonrpc, Client}; +const DEFAULT_SESSION_CACHE_CAPACITY: usize = 4; + /// `ServerState` is the primary mutable state of the language server pub struct ServerState { pub(crate) client: Option, pub config: Arc>, pub(crate) keyword_docs: Arc, - /// A collection of [Session]s, each of which represents a project that has been opened in the users workspace - pub(crate) sessions: Arc>>, + /// A Least Recently Used (LRU) cache of [Session]s, each representing a project opened in the user's workspace. + /// This cache limits memory usage by maintaining a fixed number of active sessions, automatically + /// evicting the least recently used sessions when the capacity is reached. + pub(crate) sessions: LruSessionCache, pub documents: Documents, // Compilation thread related fields pub(crate) retrigger_compilation: Arc, @@ -52,7 +59,7 @@ impl Default for ServerState { client: None, config: Arc::new(RwLock::new(Config::default())), keyword_docs: Arc::new(KeywordDocs::new()), - sessions: Arc::new(DashMap::new()), + sessions: LruSessionCache::new(DEFAULT_SESSION_CACHE_CAPACITY), documents: Documents::new(), retrigger_compilation: Arc::new(AtomicBool::new(false)), is_compiling: Arc::new(AtomicBool::new(false)), @@ -357,17 +364,95 @@ impl ServerState { .ok_or(DirectoryError::ManifestDirNotFound)? .to_path_buf(); - let session = if let Some(item) = self.sessions.try_get(&manifest_dir).try_unwrap() { - item.value().clone() - } else { + let session = self.sessions.get(&manifest_dir).unwrap_or({ // If no session can be found, then we need to call init and insert a new session into the map self.init_session(uri).await?; self.sessions - .try_get(&manifest_dir) - .try_unwrap() - .map(|item| item.value().clone()) + .get(&manifest_dir) .expect("no session found even though it was just inserted into the map") - }; + }); Ok(session) } } + +/// A Least Recently Used (LRU) cache for storing and managing `Session` objects. +/// This cache helps limit memory usage by maintaining a fixed number of active sessions. +pub(crate) struct LruSessionCache { + /// Stores the actual `Session` objects, keyed by their file paths. + sessions: Arc>>, + /// Keeps track of the order in which sessions were accessed, with most recent at the front. + usage_order: Arc>>, + /// The maximum number of sessions that can be stored in the cache. + capacity: usize, +} + +impl LruSessionCache { + /// Creates a new `LruSessionCache` with the specified capacity. + pub(crate) fn new(capacity: usize) -> Self { + LruSessionCache { + sessions: Arc::new(DashMap::new()), + usage_order: Arc::new(Mutex::new(VecDeque::with_capacity(capacity))), + capacity, + } + } + + pub(crate) fn iter(&self) -> impl Iterator>> { + self.sessions.iter() + } + + /// Retrieves a session from the cache and updates its position to the front of the usage order. + pub(crate) fn get(&self, path: &PathBuf) -> Option> { + if let Some(session) = self.sessions.try_get(path).try_unwrap() { + if self.sessions.len() >= self.capacity { + self.move_to_front(path); + } + Some(session.clone()) + } else { + None + } + } + + /// Inserts or updates a session in the cache. + /// If at capacity and inserting a new session, evicts the least recently used one. + /// For existing sessions, updates their position in the usage order if at capacity. + pub(crate) fn insert(&self, path: PathBuf, session: Arc) { + if self.sessions.get(&path).is_some() { + tracing::trace!("Updating existing session for path: {:?}", path); + // Session already exists, just update its position in the usage order if at capacity + if self.sessions.len() >= self.capacity { + self.move_to_front(&path); + } + } else { + // New session + tracing::trace!("Inserting new session for path: {:?}", path); + if self.sessions.len() >= self.capacity { + self.evict_least_used(); + } + self.sessions.insert(path.clone(), session); + let mut order = self.usage_order.lock(); + order.push_front(path); + } + } + + /// Moves the specified path to the front of the usage order, marking it as most recently used. + fn move_to_front(&self, path: &PathBuf) { + tracing::trace!("Moving path to front of usage order: {:?}", path); + let mut order = self.usage_order.lock(); + if let Some(index) = order.iter().position(|p| p == path) { + order.remove(index); + } + order.push_front(path.clone()); + } + + /// Removes the least recently used session from the cache when the capacity is reached. + fn evict_least_used(&self) { + let mut order = self.usage_order.lock(); + if let Some(old_path) = order.pop_back() { + tracing::trace!( + "Cache at capacity. Evicting least used session: {:?}", + old_path + ); + self.sessions.remove(&old_path); + } + } +} From f43342b3d8d9efca9681ee4cb6cef76a6c0d8feb Mon Sep 17 00:00:00 2001 From: Olexandr Radovenchyk <93856062+Olexandr88@users.noreply.github.com> Date: Thu, 11 Jul 2024 19:16:31 +0300 Subject: [PATCH 19/19] Update index.md (#6261) Error correction ## Description ## Checklist - [x] I have linked to any relevant issues. - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have updated the documentation where relevant (API docs, the reference, and the Sway book). - [x] If my change requires substantial documentation changes, I have [requested support from the DevRel team](https://github.com/FuelLabs/devrel-requests/issues/new/choose) - [x] I have added tests that prove my fix is effective or that my feature works. - [x] I have added (or requested a maintainer to add) the necessary `Breaking*` or `New Feature` labels where relevant. - [x] I have done my best to ensure that my PR adheres to [the Fuel Labs Code Review Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md). - [x] I have requested a review from the relevant team or maintainers. --- docs/book/src/sway-program-types/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/book/src/sway-program-types/index.md b/docs/book/src/sway-program-types/index.md index fdd076181da..4efe5b47057 100644 --- a/docs/book/src/sway-program-types/index.md +++ b/docs/book/src/sway-program-types/index.md @@ -9,7 +9,7 @@ Every Sway file _must_ begin with a declaration of what type of program it is. A Contracts are used primarily for protocols or systems that operate within a fixed set of rules. A good example would be a staking contract or a decentralized exchange (also called a DEX). -Scripts are used for complex on-chain interactions that won't persist. An example of this may be using a DEX and Lender to create a leveraged position (borrow, swap, re-collateralize, borrow) which is a complex transaction that would usually take multiple steps. +Scripts are used for complex on-chain interactions that won't persist. An example of this may be using a DEX and Lender to create a leveraged position (borrow, swap, re-collateralize) which is a complex transaction that would usually take multiple steps. Libraries are for code that is reusable and useful for handling common situations. A good example of this would be a library to handle fixed-point math or big number math.

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