From 6b6bd30b60a58aba8d06de687c041947144508b6 Mon Sep 17 00:00:00 2001 From: Benjamin Woodruff Date: Thu, 23 Oct 2025 16:38:14 -0700 Subject: [PATCH] chore: Remove mopa dependency in turbo-tasks (2nd attempt) --- Cargo.lock | 7 -- turbopack/crates/turbo-tasks/Cargo.toml | 1 - turbopack/crates/turbo-tasks/src/magic_any.rs | 69 +++---------------- .../crates/turbo-tasks/src/native_function.rs | 28 ++++---- .../crates/turbo-tasks/src/task/function.rs | 7 +- 5 files changed, 31 insertions(+), 81 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cca56b629f9643..525976e64715ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4105,12 +4105,6 @@ dependencies = [ "swc_ecma_visit", ] -[[package]] -name = "mopa" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915" - [[package]] name = "more-asserts" version = "0.2.2" @@ -9184,7 +9178,6 @@ dependencies = [ "futures", "indexmap 2.9.0", "inventory", - "mopa", "once_cell", "parking_lot", "pin-project-lite", diff --git a/turbopack/crates/turbo-tasks/Cargo.toml b/turbopack/crates/turbo-tasks/Cargo.toml index 2fed2d83292fb8..b17f3eadaa977f 100644 --- a/turbopack/crates/turbo-tasks/Cargo.toml +++ b/turbopack/crates/turbo-tasks/Cargo.toml @@ -31,7 +31,6 @@ erased-serde = { workspace = true } event-listener = "5.4.0" futures = { workspace = true } indexmap = { workspace = true, features = ["serde"] } -mopa = "0.2.0" once_cell = { workspace = true } parking_lot = { workspace = true, features = ["serde"]} pin-project-lite = { workspace = true } diff --git a/turbopack/crates/turbo-tasks/src/magic_any.rs b/turbopack/crates/turbo-tasks/src/magic_any.rs index 9cefc18505729f..57235e54467d11 100644 --- a/turbopack/crates/turbo-tasks/src/magic_any.rs +++ b/turbopack/crates/turbo-tasks/src/magic_any.rs @@ -1,92 +1,43 @@ -use core::fmt; -use std::{ - any::{Any, TypeId}, - fmt::Debug, - hash::Hash, - sync::Arc, -}; +use std::{any::Any, fmt::Debug, hash::Hash}; use serde::{Deserialize, Serialize, de::DeserializeSeed}; use turbo_dyn_eq_hash::{ - DynEq, DynHash, DynPartialEq, impl_eq_for_dyn, impl_hash_for_dyn, impl_partial_eq_for_dyn, + DynEq, DynHash, impl_eq_for_dyn, impl_hash_for_dyn, impl_partial_eq_for_dyn, }; -use crate::trace::{TraceRawVcs, TraceRawVcsContext}; - -pub trait MagicAny: mopa::Any + DynPartialEq + DynEq + DynHash + Send + Sync { - fn magic_any_arc(self: Arc) -> Arc; - - fn magic_debug(&self, f: &mut fmt::Formatter) -> fmt::Result; - - fn magic_trace_raw_vcs(&self, trace_context: &mut TraceRawVcsContext); +use crate::trace::TraceRawVcs; +pub trait MagicAny: Debug + DynEq + DynHash + TraceRawVcs + Send + Sync + 'static { #[cfg(debug_assertions)] fn magic_type_name(&self) -> &'static str; } -#[allow(clippy::transmute_ptr_to_ref)] // can't fix as it's in the macro -mod clippy { - use mopa::mopafy; - - use super::MagicAny; - - mopafy!(MagicAny); -} - -impl MagicAny for T { - fn magic_any_arc(self: Arc) -> Arc { - self - } - - fn magic_debug(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut d = f.debug_tuple("MagicAny"); - d.field(&TypeId::of::()); - - #[cfg(debug_assertions)] - d.field(&std::any::type_name::()); - - d.field(&(self as &Self)); - d.finish() - } - - fn magic_trace_raw_vcs(&self, trace_context: &mut TraceRawVcsContext) { - self.trace_raw_vcs(trace_context); - } - +impl MagicAny for T +where + T: Debug + Eq + Hash + Send + Sync + TraceRawVcs + 'static, +{ #[cfg(debug_assertions)] fn magic_type_name(&self) -> &'static str { std::any::type_name::() } } -impl fmt::Debug for dyn MagicAny { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.magic_debug(f) - } -} - impl_partial_eq_for_dyn!(dyn MagicAny); impl_eq_for_dyn!(dyn MagicAny); impl_hash_for_dyn!(dyn MagicAny); -impl TraceRawVcs for dyn MagicAny { - fn trace_raw_vcs(&self, trace_context: &mut TraceRawVcsContext) { - self.magic_trace_raw_vcs(trace_context) - } -} - impl dyn MagicAny { pub fn as_serialize( &self, ) -> &dyn erased_serde::Serialize { - if let Some(r) = self.downcast_ref::() { + if let Some(r) = (self as &dyn Any).downcast_ref::() { r } else { #[cfg(debug_assertions)] panic!( "MagicAny::as_serializable broken: got {} but expected {}", self.magic_type_name(), - std::any::type_name::() + std::any::type_name::(), ); #[cfg(not(debug_assertions))] panic!("MagicAny::as_serializable bug"); diff --git a/turbopack/crates/turbo-tasks/src/native_function.rs b/turbopack/crates/turbo-tasks/src/native_function.rs index fb33edf5344934..32313df66ee391 100644 --- a/turbopack/crates/turbo-tasks/src/native_function.rs +++ b/turbopack/crates/turbo-tasks/src/native_function.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, hash::Hash, pin::Pin}; +use std::{any::Any, fmt::Debug, hash::Hash, pin::Pin}; use anyhow::Result; use futures::Future; @@ -105,19 +105,22 @@ fn resolve_functor_impl(value: &dyn MagicAny) -> Resolv #[cfg(debug_assertions)] #[inline(never)] -pub fn debug_downcast_args_error_msg(expected: &str, actual: &dyn MagicAny) -> String { - format!( - "Invalid argument type, expected {expected} got {}", - (*actual).magic_type_name() - ) +pub fn debug_downcast_args_error_msg(expected: &str, actual: &str) -> String { + format!("Invalid argument type, expected {expected} got {actual}") } pub fn downcast_args_owned(args: Box) -> Box { - #[allow(unused_variables)] - args.downcast::() - .map_err(|args| { + #[cfg(debug_assertions)] + let args_type_name = args.magic_type_name(); + + (args as Box) + .downcast::() + .map_err(|_args| { #[cfg(debug_assertions)] - return debug_downcast_args_error_msg(std::any::type_name::(), &*args); + return anyhow::anyhow!(debug_downcast_args_error_msg( + std::any::type_name::(), + args_type_name, + )); #[cfg(not(debug_assertions))] return anyhow::anyhow!("Invalid argument type"); }) @@ -125,12 +128,13 @@ pub fn downcast_args_owned(args: Box) -> Box { } pub fn downcast_args_ref(args: &dyn MagicAny) -> &T { - args.downcast_ref::() + (args as &dyn Any) + .downcast_ref::() .ok_or_else(|| { #[cfg(debug_assertions)] return anyhow::anyhow!(debug_downcast_args_error_msg( std::any::type_name::(), - args + args.magic_type_name(), )); #[cfg(not(debug_assertions))] return anyhow::anyhow!("Invalid argument type"); diff --git a/turbopack/crates/turbo-tasks/src/task/function.rs b/turbopack/crates/turbo-tasks/src/task/function.rs index 3ec3af6c541a8a..9fe47d8741fc63 100644 --- a/turbopack/crates/turbo-tasks/src/task/function.rs +++ b/turbopack/crates/turbo-tasks/src/task/function.rs @@ -172,10 +172,13 @@ macro_rules! task_inputs_impl { /// gives the compiler more chances to dedupe monomorphized code across small functions with less /// typevars. fn get_args(arg: &dyn MagicAny) -> Result { - let value = arg.downcast_ref::().cloned(); + let value = (arg as &dyn std::any::Any).downcast_ref::().cloned(); #[cfg(debug_assertions)] return anyhow::Context::with_context(value, || { - crate::native_function::debug_downcast_args_error_msg(std::any::type_name::(), arg) + crate::native_function::debug_downcast_args_error_msg( + std::any::type_name::(), + arg.magic_type_name(), + ) }); #[cfg(not(debug_assertions))] return anyhow::Context::context(value, "Invalid argument type");