Messages in this thread Patch in this message | | | Date | Thu, 03 Aug 2023 17:20:11 +0800 | Subject | Re: [PATCH 1/1] rust: macros: fix redefine const_name in `vtable` | From | "Qingsong Chen" <> |
| |
On 8/3/23 4:02 AM, Gary Guo wrote: > On Wed, 2 Aug 2023 19:50:20 +0000 > Alice Ryhl <aliceryhl@google.com> wrote: > >> Qingsong Chen <changxian.cqs@antgroup.com> writes: >>> let mut body_it = body.stream().into_iter(); >>> - let mut functions = Vec::new(); >>> + let mut functions = HashSet::new(); >> >> Please use a `BTreeSet` instead of a `HashSet`. A `HashSet` has >> non-deterministic iteration order, so this will make the macro output >> different things each time you run it. >> >> Alice >> > > Good point. > > Another way is to just use the existing `consts` HashSet to avoid > duplication. Something like > > consts.insert(gen_const_name); > > after emitting the const item would probably be sufficient.
According to the suggestions of Alice and Gary, we could do the fix like this:
--- a/rust/macros/vtable.rs +++ b/rust/macros/vtable.rs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0
use proc_macro::{Delimiter, Group, TokenStream, TokenTree}; -use std::collections::HashSet; +use std::collections::BTreeSet; use std::fmt::Write;
pub(crate) fn vtable(_attr: TokenStream, ts: TokenStream) -> TokenStream { @@ -28,7 +28,7 @@ pub(crate) fn vtable(_attr: TokenStream, ts: TokenStream) -> TokenStream {
let mut body_it = body.stream().into_iter(); let mut functions = Vec::new(); - let mut consts = HashSet::new(); + let mut consts = BTreeSet::new(); while let Some(token) = body_it.next() { match token { TokenTree::Ident(ident) if ident.to_string() == "fn" => { @@ -74,6 +74,7 @@ pub(crate) fn vtable(_attr: TokenStream, ts: TokenStream) -> TokenStream { const {gen_const_name}: bool = false;", ) .unwrap(); + consts.insert(gen_const_name); } } else { const_items = "const USE_VTABLE_ATTR: () = ();".to_owned();
| |