Skip to content

Commit 31b33e0

Browse files
committed
Auto merge of #151830 - cyrgani:pm-opts, r=<try>
remove `TokenStream` from the bridge
2 parents e823167 + 279a45f commit 31b33e0

8 files changed

Lines changed: 177 additions & 275 deletions

File tree

compiler/rustc_expand/src/proc_macro.rs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,19 @@ impl base::BangProcMacro for BangProcMacro {
5757

5858
let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace;
5959
let strategy = exec_strategy(ecx.sess);
60-
let server = proc_macro_server::Rustc::new(ecx);
61-
self.client.run(&strategy, server, input, proc_macro_backtrace).map_err(|e| {
62-
ecx.dcx().emit_err(errors::ProcMacroPanicked {
60+
let mut server = proc_macro_server::Rustc::new(ecx);
61+
let input = server.ts_rustc_to_pm(input);
62+
let output = self.client.run(&strategy, &mut server, input, proc_macro_backtrace);
63+
64+
match output {
65+
Ok(stream) => Ok(server.ts_pm_to_rustc(stream)),
66+
Err(e) => Err(ecx.dcx().emit_err(errors::ProcMacroPanicked {
6367
span,
6468
message: e
6569
.as_str()
6670
.map(|message| errors::ProcMacroPanickedHelp { message: message.into() }),
67-
})
68-
})
71+
})),
72+
}
6973
}
7074
}
7175

@@ -88,17 +92,20 @@ impl base::AttrProcMacro for AttrProcMacro {
8892

8993
let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace;
9094
let strategy = exec_strategy(ecx.sess);
91-
let server = proc_macro_server::Rustc::new(ecx);
92-
self.client.run(&strategy, server, annotation, annotated, proc_macro_backtrace).map_err(
93-
|e| {
94-
ecx.dcx().emit_err(errors::CustomAttributePanicked {
95-
span,
96-
message: e.as_str().map(|message| errors::CustomAttributePanickedHelp {
97-
message: message.into(),
98-
}),
99-
})
100-
},
101-
)
95+
let mut server = proc_macro_server::Rustc::new(ecx);
96+
let annotation = server.ts_rustc_to_pm(annotation);
97+
let annotated = server.ts_rustc_to_pm(annotated);
98+
let output =
99+
self.client.run(&strategy, &mut server, annotation, annotated, proc_macro_backtrace);
100+
match output {
101+
Ok(stream) => Ok(server.ts_pm_to_rustc(stream)),
102+
Err(e) => Err(ecx.dcx().emit_err(errors::CustomAttributePanicked {
103+
span,
104+
message: e
105+
.as_str()
106+
.map(|message| errors::CustomAttributePanickedHelp { message: message.into() }),
107+
})),
108+
}
102109
}
103110
}
104111

@@ -221,10 +228,11 @@ fn expand_derive_macro(
221228

222229
let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace;
223230
let strategy = exec_strategy(ecx.sess);
224-
let server = proc_macro_server::Rustc::new(ecx);
231+
let mut server = proc_macro_server::Rustc::new(ecx);
232+
let input = server.ts_rustc_to_pm(input);
225233

226-
match client.run(&strategy, server, input, proc_macro_backtrace) {
227-
Ok(stream) => Ok(stream),
234+
match client.run(&strategy, &mut server, input, proc_macro_backtrace) {
235+
Ok(stream) => Ok(server.ts_pm_to_rustc(stream)),
228236
Err(e) => {
229237
let invoc_expn_data = invoc_id.expn_data();
230238
let span = invoc_expn_data.call_site;

compiler/rustc_expand/src/proc_macro_server.rs

Lines changed: 47 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl ToInternal<token::LitKind> for LitKind {
103103
}
104104
}
105105

106-
impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStream, Span, Symbol>> {
106+
impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<Span, Symbol>> {
107107
fn from_internal((stream, rustc): (TokenStream, &mut Rustc<'_, '_>)) -> Self {
108108
use rustc_ast::token::*;
109109

@@ -150,7 +150,7 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
150150

151151
trees.push(TokenTree::Group(Group {
152152
delimiter: rustc_proc_macro::Delimiter::from_internal(delim),
153-
stream: Some(stream),
153+
stream: Some(rustc.ts_rustc_to_pm(stream)),
154154
span: DelimSpan {
155155
open: span.open,
156156
close: span.close,
@@ -277,7 +277,7 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
277277
TokenStream::token_alone(token::Lifetime(ident.name, is_raw), ident.span);
278278
trees.push(TokenTree::Group(Group {
279279
delimiter: rustc_proc_macro::Delimiter::None,
280-
stream: Some(stream),
280+
stream: Some(rustc.ts_rustc_to_pm(stream)),
281281
span: DelimSpan::from_single(span),
282282
}))
283283
}
@@ -309,7 +309,7 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
309309
}
310310
trees.push(TokenTree::Group(Group {
311311
delimiter: rustc_proc_macro::Delimiter::Bracket,
312-
stream: Some(stream),
312+
stream: Some(rustc.ts_rustc_to_pm(stream)),
313313
span: DelimSpan::from_single(span),
314314
}));
315315
}
@@ -324,7 +324,7 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
324324

325325
// We use a `SmallVec` because the output size is always one or two `TokenTree`s.
326326
impl ToInternal<SmallVec<[tokenstream::TokenTree; 2]>>
327-
for (TokenTree<TokenStream, Span, Symbol>, &mut Rustc<'_, '_>)
327+
for (TokenTree<Span, Symbol>, &mut Rustc<'_, '_>)
328328
{
329329
fn to_internal(self) -> SmallVec<[tokenstream::TokenTree; 2]> {
330330
use rustc_ast::token::*;
@@ -378,7 +378,7 @@ impl ToInternal<SmallVec<[tokenstream::TokenTree; 2]>>
378378
tokenstream::DelimSpan { open, close },
379379
DelimSpacing::new(Spacing::Alone, Spacing::Alone),
380380
delimiter.to_internal(),
381-
stream.unwrap_or_default(),
381+
rustc.ts_pm_to_rustc(stream.unwrap_or_default()),
382382
)]
383383
}
384384
TokenTree::Ident(self::Ident { sym, is_raw, span }) => {
@@ -431,6 +431,8 @@ impl ToInternal<rustc_errors::Level> for Level {
431431
}
432432
}
433433

434+
type BridgeTokenStream = rustc_proc_macro::bridge::TokenStream<Span, Symbol>;
435+
434436
pub(crate) struct Rustc<'a, 'b> {
435437
ecx: &'a mut ExtCtxt<'b>,
436438
def_site: Span,
@@ -456,10 +458,27 @@ impl<'a, 'b> Rustc<'a, 'b> {
456458
fn psess(&self) -> &ParseSess {
457459
self.ecx.psess()
458460
}
461+
462+
pub(crate) fn ts_pm_to_rustc(&mut self, ts: BridgeTokenStream) -> tokenstream::TokenStream {
463+
let mut t = tokenstream::TokenStream::new(vec![]);
464+
for tree in ts.trees {
465+
let internal: SmallVec<[tokenstream::TokenTree; 2]> =
466+
ToInternal::to_internal((tree, &mut *self));
467+
for tree in internal {
468+
t.push_tree(tree);
469+
}
470+
}
471+
472+
t
473+
}
474+
475+
pub(crate) fn ts_rustc_to_pm(&mut self, ts: tokenstream::TokenStream) -> BridgeTokenStream {
476+
let trees: Vec<TokenTree<Span, Symbol>> = FromInternal::from_internal((ts, self));
477+
BridgeTokenStream { trees }
478+
}
459479
}
460480

461-
impl server::Server for Rustc<'_, '_> {
462-
type TokenStream = TokenStream;
481+
impl server::Server for &mut Rustc<'_, '_> {
463482
type Span = Span;
464483
type Symbol = Symbol;
465484

@@ -564,35 +583,24 @@ impl server::Server for Rustc<'_, '_> {
564583
diag.emit();
565584
}
566585

567-
fn ts_drop(&mut self, stream: Self::TokenStream) {
568-
drop(stream);
569-
}
570-
571-
fn ts_clone(&mut self, stream: &Self::TokenStream) -> Self::TokenStream {
572-
stream.clone()
573-
}
574-
575-
fn ts_is_empty(&mut self, stream: &Self::TokenStream) -> bool {
576-
stream.is_empty()
577-
}
578-
579-
fn ts_from_str(&mut self, src: &str) -> Self::TokenStream {
580-
unwrap_or_emit_fatal(source_str_to_stream(
586+
fn ts_from_str(&mut self, src: &str) -> BridgeTokenStream {
587+
self.ts_rustc_to_pm(unwrap_or_emit_fatal(source_str_to_stream(
581588
self.psess(),
582589
FileName::proc_macro_source_code(src),
583590
src.to_string(),
584591
Some(self.call_site),
585-
))
592+
)))
586593
}
587594

588-
fn ts_to_string(&mut self, stream: &Self::TokenStream) -> String {
589-
pprust::tts_to_string(stream)
595+
fn ts_to_string(&mut self, stream: BridgeTokenStream) -> String {
596+
pprust::tts_to_string(&self.ts_pm_to_rustc(stream))
590597
}
591598

592-
fn ts_expand_expr(&mut self, stream: &Self::TokenStream) -> Result<Self::TokenStream, ()> {
599+
fn ts_expand_expr(&mut self, stream: BridgeTokenStream) -> Result<BridgeTokenStream, ()> {
593600
// Parse the expression from our tokenstream.
594601
let expr: PResult<'_, _> = try {
595-
let mut p = Parser::new(self.psess(), stream.clone(), Some("proc_macro expand expr"));
602+
let stream = self.ts_pm_to_rustc(stream);
603+
let mut p = Parser::new(self.psess(), stream, Some("proc_macro expand expr"));
596604
let expr = p.parse_expr()?;
597605
if p.token != token::Eof {
598606
p.unexpected()?;
@@ -615,32 +623,34 @@ impl server::Server for Rustc<'_, '_> {
615623
// We don't use `TokenStream::from_ast` as the tokenstream currently cannot
616624
// be recovered in the general case.
617625
match &expr.kind {
618-
ast::ExprKind::Lit(token_lit) if token_lit.kind == token::Bool => {
619-
Ok(tokenstream::TokenStream::token_alone(
626+
ast::ExprKind::Lit(token_lit) if token_lit.kind == token::Bool => Ok(self
627+
.ts_rustc_to_pm(tokenstream::TokenStream::token_alone(
620628
token::Ident(token_lit.symbol, IdentIsRaw::No),
621629
expr.span,
622-
))
623-
}
624-
ast::ExprKind::Lit(token_lit) => {
625-
Ok(tokenstream::TokenStream::token_alone(token::Literal(*token_lit), expr.span))
626-
}
630+
))),
631+
ast::ExprKind::Lit(token_lit) => Ok(self.ts_rustc_to_pm(
632+
tokenstream::TokenStream::token_alone(token::Literal(*token_lit), expr.span),
633+
)),
627634
ast::ExprKind::IncludedBytes(byte_sym) => {
628635
let lit = token::Lit::new(
629636
token::ByteStr,
630637
escape_byte_str_symbol(byte_sym.as_byte_str()),
631638
None,
632639
);
633-
Ok(tokenstream::TokenStream::token_alone(token::TokenKind::Literal(lit), expr.span))
640+
Ok(self.ts_rustc_to_pm(tokenstream::TokenStream::token_alone(
641+
token::TokenKind::Literal(lit),
642+
expr.span,
643+
)))
634644
}
635645
ast::ExprKind::Unary(ast::UnOp::Neg, e) => match &e.kind {
636646
ast::ExprKind::Lit(token_lit) => match token_lit {
637647
token::Lit { kind: token::Integer | token::Float, .. } => {
638-
Ok(Self::TokenStream::from_iter([
648+
Ok(self.ts_rustc_to_pm(tokenstream::TokenStream::from_iter([
639649
// FIXME: The span of the `-` token is lost when
640650
// parsing, so we cannot faithfully recover it here.
641651
tokenstream::TokenTree::token_joint_hidden(token::Minus, e.span),
642652
tokenstream::TokenTree::token_alone(token::Literal(*token_lit), e.span),
643-
]))
653+
])))
644654
}
645655
_ => Err(()),
646656
},
@@ -650,46 +660,6 @@ impl server::Server for Rustc<'_, '_> {
650660
}
651661
}
652662

653-
fn ts_from_token_tree(
654-
&mut self,
655-
tree: TokenTree<Self::TokenStream, Self::Span, Self::Symbol>,
656-
) -> Self::TokenStream {
657-
Self::TokenStream::new((tree, &mut *self).to_internal().into_iter().collect::<Vec<_>>())
658-
}
659-
660-
fn ts_concat_trees(
661-
&mut self,
662-
base: Option<Self::TokenStream>,
663-
trees: Vec<TokenTree<Self::TokenStream, Self::Span, Self::Symbol>>,
664-
) -> Self::TokenStream {
665-
let mut stream = base.unwrap_or_default();
666-
for tree in trees {
667-
for tt in (tree, &mut *self).to_internal() {
668-
stream.push_tree(tt);
669-
}
670-
}
671-
stream
672-
}
673-
674-
fn ts_concat_streams(
675-
&mut self,
676-
base: Option<Self::TokenStream>,
677-
streams: Vec<Self::TokenStream>,
678-
) -> Self::TokenStream {
679-
let mut stream = base.unwrap_or_default();
680-
for s in streams {
681-
stream.push_stream(s);
682-
}
683-
stream
684-
}
685-
686-
fn ts_into_trees(
687-
&mut self,
688-
stream: Self::TokenStream,
689-
) -> Vec<TokenTree<Self::TokenStream, Self::Span, Self::Symbol>> {
690-
FromInternal::from_internal((stream, self))
691-
}
692-
693663
fn span_debug(&mut self, span: Self::Span) -> String {
694664
if self.ecx.ecfg.span_debug {
695665
format!("{span:?}")

library/proc_macro/src/bridge/client.rs

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,17 @@
22
33
use std::cell::RefCell;
44
use std::marker::PhantomData;
5+
use std::rc::Rc;
56
use std::sync::atomic::AtomicU32;
67

78
use super::*;
89

910
#[repr(C)]
1011
pub(super) struct HandleCounters {
11-
pub(super) token_stream: AtomicU32,
1212
pub(super) span: AtomicU32,
1313
}
1414

15-
static COUNTERS: HandleCounters =
16-
HandleCounters { token_stream: AtomicU32::new(1), span: AtomicU32::new(1) };
17-
18-
pub(crate) struct TokenStream {
19-
handle: handle::Handle,
20-
}
21-
22-
impl !Send for TokenStream {}
23-
impl !Sync for TokenStream {}
24-
25-
// Forward `Drop::drop` to the inherent `drop` method.
26-
impl Drop for TokenStream {
27-
fn drop(&mut self) {
28-
Methods::ts_drop(TokenStream { handle: self.handle });
29-
}
30-
}
31-
32-
impl<S> Encode<S> for TokenStream {
33-
fn encode(self, w: &mut Buffer, s: &mut S) {
34-
mem::ManuallyDrop::new(self).handle.encode(w, s);
35-
}
36-
}
37-
38-
impl<S> Encode<S> for &TokenStream {
39-
fn encode(self, w: &mut Buffer, s: &mut S) {
40-
self.handle.encode(w, s);
41-
}
42-
}
43-
44-
impl<S> Decode<'_, '_, S> for TokenStream {
45-
fn decode(r: &mut &[u8], s: &mut S) -> Self {
46-
TokenStream { handle: handle::Handle::decode(r, s) }
47-
}
48-
}
15+
static COUNTERS: HandleCounters = HandleCounters { span: AtomicU32::new(1) };
4916

5017
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
5118
pub(crate) struct Span {
@@ -67,12 +34,6 @@ impl<S> Decode<'_, '_, S> for Span {
6734
}
6835
}
6936

70-
impl Clone for TokenStream {
71-
fn clone(&self) -> Self {
72-
Methods::ts_clone(self)
73-
}
74-
}
75-
7637
impl Span {
7738
pub(crate) fn def_site() -> Span {
7839
Bridge::with(|bridge| bridge.globals.def_site)
@@ -296,7 +257,9 @@ impl Client<crate::TokenStream, crate::TokenStream> {
296257
Client {
297258
handle_counters: &COUNTERS,
298259
run: super::selfless_reify::reify_to_extern_c_fn_hrt_bridge(move |bridge| {
299-
run_client(bridge, |input| f(crate::TokenStream(Some(input))).0)
260+
run_client(bridge, |input| {
261+
Rc::unwrap_or_clone(f(crate::TokenStream(Rc::new(input))).0)
262+
})
300263
}),
301264
_marker: PhantomData,
302265
}
@@ -311,7 +274,10 @@ impl Client<(crate::TokenStream, crate::TokenStream), crate::TokenStream> {
311274
handle_counters: &COUNTERS,
312275
run: super::selfless_reify::reify_to_extern_c_fn_hrt_bridge(move |bridge| {
313276
run_client(bridge, |(input, input2)| {
314-
f(crate::TokenStream(Some(input)), crate::TokenStream(Some(input2))).0
277+
Rc::unwrap_or_clone(
278+
f(crate::TokenStream(Rc::new(input)), crate::TokenStream(Rc::new(input2)))
279+
.0,
280+
)
315281
})
316282
}),
317283
_marker: PhantomData,

0 commit comments

Comments
 (0)