From b2e0f5c122b64fe31ba935f9cb5c6a397fd8f6ab Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 26 Sep 2016 12:01:57 +0800 Subject: Expand - Pass ownership of the input TT to macro_rules! expand --- src/ast/ast.hpp | 2 +- src/ast/macro.hpp | 1 + src/expand/macro_rules.cpp | 4 ++-- src/expand/macro_rules.hpp | 2 +- src/expand/mod.cpp | 8 ++++---- src/macro_rules/eval.cpp | 23 +++++++++++++++-------- src/macro_rules/macro_rules.hpp | 2 +- src/parse/lex.cpp | 6 +++--- src/parse/token.cpp | 6 +++++- src/parse/tokentree.hpp | 14 ++++++-------- 10 files changed, 39 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp index 1b923ef3..533832e2 100644 --- a/src/ast/ast.hpp +++ b/src/ast/ast.hpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include // MacroInvocation #include "generics.hpp" diff --git a/src/ast/macro.hpp b/src/ast/macro.hpp index 2798ad4a..e68d85ac 100644 --- a/src/ast/macro.hpp +++ b/src/ast/macro.hpp @@ -51,6 +51,7 @@ public: const ::std::string& input_ident() const { return m_ident; } const TokenTree& input_tt() const { return m_input; } + TokenTree& input_tt() { return m_input; } friend ::std::ostream& operator<<(::std::ostream& os, const MacroInvocation& x) { os << x.m_attrs; diff --git a/src/expand/macro_rules.cpp b/src/expand/macro_rules.cpp index 1a3fe246..b42d5162 100644 --- a/src/expand/macro_rules.cpp +++ b/src/expand/macro_rules.cpp @@ -99,9 +99,9 @@ class CMacroUseHandler: }; -::std::unique_ptr Macro_Invoke(const char* name, const MacroRules& rules, const TokenTree& tt, AST::Module& mod) +::std::unique_ptr Macro_Invoke(const char* name, const MacroRules& rules, TokenTree tt, AST::Module& mod) { - return Macro_InvokeRules(name, rules, tt, mod); + return Macro_InvokeRules(name, rules, mv$(tt), mod); } diff --git a/src/expand/macro_rules.hpp b/src/expand/macro_rules.hpp index fc4a2851..b5f09f1c 100644 --- a/src/expand/macro_rules.hpp +++ b/src/expand/macro_rules.hpp @@ -13,4 +13,4 @@ class TokenTree; class TokenStream; class MacroRules; -extern ::std::unique_ptr Macro_Invoke(const char* name, const MacroRules& rules, const TokenTree& tt, AST::Module& mod); +extern ::std::unique_ptr Macro_Invoke(const char* name, const MacroRules& rules, TokenTree tt, AST::Module& mod); diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 1ca7f3eb..887aa159 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -76,7 +76,7 @@ void Expand_Attrs(const ::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate& ::std::unique_ptr Expand_Macro( bool is_early, const ::AST::Crate& crate, LList modstack, ::AST::Module& mod, - Span mi_span, const ::std::string& name, const ::std::string& input_ident, const TokenTree& input_tt + Span mi_span, const ::std::string& name, const ::std::string& input_ident, TokenTree& input_tt ) { if( name == "" ) { @@ -105,7 +105,7 @@ void Expand_Attrs(const ::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate& if( input_ident != "" ) ERROR(mi_span, E0000, "macro_rules! macros can't take an ident"); - auto e = Macro_Invoke(name.c_str(), *mr.data, input_tt, mod); + auto e = Macro_Invoke(name.c_str(), *mr.data, mv$(input_tt), mod); return e; } } @@ -117,7 +117,7 @@ void Expand_Attrs(const ::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate& if( input_ident != "" ) ERROR(mi_span, E0000, "macro_rules! macros can't take an ident"); - auto e = Macro_Invoke(name.c_str(), *mri.data, input_tt, mod); + auto e = Macro_Invoke(name.c_str(), *mri.data, mv$(input_tt), mod); return e; } } @@ -131,7 +131,7 @@ void Expand_Attrs(const ::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate& // Leave valid and return an empty expression return ::std::unique_ptr(); } -::std::unique_ptr Expand_Macro(bool is_early, const ::AST::Crate& crate, LList modstack, ::AST::Module& mod, const ::AST::MacroInvocation& mi) +::std::unique_ptr Expand_Macro(bool is_early, const ::AST::Crate& crate, LList modstack, ::AST::Module& mod, ::AST::MacroInvocation& mi) { return Expand_Macro(is_early, crate, modstack, mod, mi.span(), mi.name(), mi.input_ident(), mi.input_tt()); } diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index 8a64c72a..aa20a1dc 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -469,7 +469,7 @@ class MacroExpander: MacroExpandState m_state; Token m_next_token; // used for inserting a single token into the stream - ::std::unique_ptr m_ttstream; + ::std::unique_ptr m_ttstream; public: MacroExpander(const MacroExpander& x) = delete; @@ -490,7 +490,7 @@ void Macro_InitDefaults() { } -bool Macro_TryPatternCap(/*const*/ TTStream& lex, MacroPatEnt::Type type) +bool Macro_TryPatternCap(TokenStream& lex, MacroPatEnt::Type type) { switch(type) { @@ -521,7 +521,7 @@ bool Macro_TryPatternCap(/*const*/ TTStream& lex, MacroPatEnt::Type type) } BUG(lex.getPosition(), ""); } -bool Macro_TryPattern(TTStream& lex, const MacroPatEnt& pat) +bool Macro_TryPattern(TokenStream& lex, const MacroPatEnt& pat) { DEBUG("pat = " << pat); Token tok; @@ -542,7 +542,7 @@ bool Macro_TryPattern(TTStream& lex, const MacroPatEnt& pat) } } -void Macro_HandlePatternCap(TTStream& lex, unsigned int index, MacroPatEnt::Type type, const ::std::vector& iterations, ParameterMappings& bound_tts) +void Macro_HandlePatternCap(TokenStream& lex, unsigned int index, MacroPatEnt::Type type, const ::std::vector& iterations, ParameterMappings& bound_tts) { Token tok; switch(type) @@ -592,7 +592,7 @@ void Macro_HandlePatternCap(TTStream& lex, unsigned int index, MacroPatEnt::Type break; } } -bool Macro_HandlePattern(TTStream& lex, const MacroPatEnt& pat, ::std::vector& iterations, ParameterMappings& bound_tts) +bool Macro_HandlePattern(TokenStream& lex, const MacroPatEnt& pat, ::std::vector& iterations, ParameterMappings& bound_tts) { TRACE_FUNCTION_F("iterations = " << iterations); Token tok; @@ -647,7 +647,7 @@ bool Macro_HandlePattern(TTStream& lex, const MacroPatEnt& pat, ::std::vector Macro_InvokeRules(const char *name, const MacroRules& rules, const TokenTree& input, AST::Module& mod) +::std::unique_ptr Macro_InvokeRules(const char *name, const MacroRules& rules, TokenTree input, AST::Module& mod) { TRACE_FUNCTION; Span sp;// = input @@ -663,7 +663,7 @@ bool Macro_HandlePattern(TTStream& lex, const MacroPatEnt& pat, ::std::vector(e)->clone() ) ); + break; default: - assert(!"Token::clone() - fragment with invalid token type"); + BUG(m_pos, "Fragment with invalid token type (" << *this << ")"); break; } ) diff --git a/src/parse/tokentree.hpp b/src/parse/tokentree.hpp index 833b39dc..0856c326 100644 --- a/src/parse/tokentree.hpp +++ b/src/parse/tokentree.hpp @@ -29,12 +29,10 @@ public: unsigned int size() const { return m_subtrees.size(); } - const TokenTree& operator[](unsigned int idx) const { - return m_subtrees[idx]; - } - const Token& tok() const { - return m_tok; - } + const TokenTree& operator[](unsigned int idx) const { return m_subtrees[idx]; } + TokenTree& operator[](unsigned int idx) { return m_subtrees[idx]; } + const Token& tok() const { return m_tok; } + Token& tok() { return m_tok; } friend ::std::ostream& operator<<(::std::ostream& os, const TokenTree& tt) { if( tt.m_subtrees.size() == 0 ) @@ -74,8 +72,8 @@ class TTStreamO: public TokenStream { Position m_last_pos; - TokenTree m_input_tt; - ::std::vector< ::std::pair > m_stack; + TokenTree m_input_tt; + ::std::vector< ::std::pair > m_stack; public: TTStreamO(TokenTree input_tt); TTStreamO(TTStreamO&& x) = default; -- cgit v1.2.3