From 53347ed088832ae9d055935e0d9fd7984bd76e01 Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Mon, 5 Aug 2024 11:24:43 -0700 Subject: [PATCH] core: Remove unnecessary defined `#[no_dynamic]` `proc_macro_attribute` --- core/macros/src/lib.rs | 54 +++++++++++++++++++++++------------------ core/src/avm2/object.rs | 2 +- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/core/macros/src/lib.rs b/core/macros/src/lib.rs index bc589f2bb..656b06ce7 100644 --- a/core/macros/src/lib.rs +++ b/core/macros/src/lib.rs @@ -4,7 +4,7 @@ use proc_macro::TokenStream; use quote::quote; use syn::{ parse_macro_input, parse_quote, FnArg, ImplItem, ImplItemFn, ItemEnum, ItemTrait, Meta, Pat, - TraitItem, TraitItemFn, Visibility, + TraitItem, Visibility, }; /// `enum_trait_object` will define an enum whose variants each implement a trait. @@ -35,7 +35,7 @@ use syn::{ #[proc_macro_attribute] pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream { // Parse the input. - let input_trait = parse_macro_input!(item as ItemTrait); + let mut input_trait = parse_macro_input!(item as ItemTrait); let trait_name = &input_trait.ident; let trait_generics = &input_trait.generics; let enum_input = parse_macro_input!(args as ItemEnum); @@ -62,21 +62,38 @@ pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream { // to the underlying type. let trait_methods: Vec<_> = input_trait .items - .iter() + .iter_mut() .filter_map(|item| match item { - TraitItem::Fn(method) => { + TraitItem::Fn(ref mut method) => { let method_name = &method.sig.ident; - let is_no_dynamic = method.attrs.iter().any(|attr| match &attr.meta { - Meta::Path(path) => { - if let Some(ident) = path.get_ident() { - ident == "no_dynamic" - } else { - false + let mut is_no_dynamic = false; + + let new_attrs = method + .attrs + .iter() + .filter(|attr| match &attr.meta { + Meta::Path(path) => { + if let Some(ident) = path.get_ident() { + if ident == "no_dynamic" { + is_no_dynamic = true; + + // Remove the #[no_dynamic] attribute from the + // list of method attributes. + false + } else { + true + } + } else { + true + } } - } - _ => false, - }); + _ => true, + }) + .map(|o| o.clone()) + .collect::>(); + + method.attrs = new_attrs; if is_no_dynamic { // Don't create this method as a dynamic-dispatch method @@ -166,14 +183,3 @@ pub fn enum_trait_object(args: TokenStream, item: TokenStream) -> TokenStream { out.into() } - -#[proc_macro_attribute] -pub fn no_dynamic(_args: TokenStream, item: TokenStream) -> TokenStream { - let input_fn = parse_macro_input!(item as TraitItemFn); - - let out = quote!( - #input_fn - ); - - out.into() -} diff --git a/core/src/avm2/object.rs b/core/src/avm2/object.rs index 4a2c8d504..a3924073c 100644 --- a/core/src/avm2/object.rs +++ b/core/src/avm2/object.rs @@ -23,7 +23,7 @@ use crate::html::TextFormat; use crate::streams::NetStream; use crate::string::AvmString; use gc_arena::{lock::RefLock, Collect, Gc, Mutation}; -use ruffle_macros::{enum_trait_object, no_dynamic}; +use ruffle_macros::enum_trait_object; use std::cell::{Ref, RefMut}; use std::fmt::Debug; use std::hash::{Hash, Hasher};