summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/ast.hpp2
-rw-r--r--src/ast/macro.hpp1
-rw-r--r--src/expand/macro_rules.cpp4
-rw-r--r--src/expand/macro_rules.hpp2
-rw-r--r--src/expand/mod.cpp8
-rw-r--r--src/macro_rules/eval.cpp23
-rw-r--r--src/macro_rules/macro_rules.hpp2
-rw-r--r--src/parse/lex.cpp6
-rw-r--r--src/parse/token.cpp6
-rw-r--r--src/parse/tokentree.hpp14
10 files changed, 39 insertions, 29 deletions
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 <ast/attrs.hpp>
#include <ast/expr_ptr.hpp>
#include <ast/item.hpp>
-#include <ast/macro.hpp>
+#include <ast/macro.hpp> // 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<TokenStream> Macro_Invoke(const char* name, const MacroRules& rules, const TokenTree& tt, AST::Module& mod)
+::std::unique_ptr<TokenStream> 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<TokenStream> Macro_Invoke(const char* name, const MacroRules& rules, const TokenTree& tt, AST::Module& mod);
+extern ::std::unique_ptr<TokenStream> 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<TokenStream> Expand_Macro(
bool is_early, const ::AST::Crate& crate, LList<const AST::Module*> 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<TokenStream>();
}
-::std::unique_ptr<TokenStream> Expand_Macro(bool is_early, const ::AST::Crate& crate, LList<const AST::Module*> modstack, ::AST::Module& mod, const ::AST::MacroInvocation& mi)
+::std::unique_ptr<TokenStream> Expand_Macro(bool is_early, const ::AST::Crate& crate, LList<const AST::Module*> 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<TTStream> m_ttstream;
+ ::std::unique_ptr<TTStreamO> 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<unsigned int>& iterations, ParameterMappings& bound_tts)
+void Macro_HandlePatternCap(TokenStream& lex, unsigned int index, MacroPatEnt::Type type, const ::std::vector<unsigned int>& 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<unsigned int>& iterations, ParameterMappings& bound_tts)
+bool Macro_HandlePattern(TokenStream& lex, const MacroPatEnt& pat, ::std::vector<unsigned int>& 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<un
}
/// Parse the input TokenTree according to the `macro_rules!` patterns and return a token stream of the replacement
-::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const TokenTree& input, AST::Module& mod)
+::std::unique_ptr<TokenStream> 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<un
ParameterMappings bound_tts;
unsigned int rule_index;
- TTStream lex(input);
+ TTStreamO lex( mv$(input) );
SET_MODULE(lex, mod);
while(true)
{
@@ -898,7 +898,14 @@ Token MacroExpander::realGetToken()
DEBUG("Insert replacement #" << e << " = " << *frag);
if( frag->m_type == InterpolatedFragment::TT )
{
- m_ttstream.reset( new TTStream( frag->as_tt() ) );
+ if( can_steal )
+ {
+ m_ttstream.reset( new TTStreamO( mv$(frag->as_tt()) ) );
+ }
+ else
+ {
+ m_ttstream.reset( new TTStreamO( frag->as_tt().clone() ) );
+ }
return m_ttstream->getToken();
}
else
diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp
index 265ea73a..550068b8 100644
--- a/src/macro_rules/macro_rules.hpp
+++ b/src/macro_rules/macro_rules.hpp
@@ -150,7 +150,7 @@ public:
SERIALISABLE_PROTOTYPES();
};
-extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const TokenTree& input, AST::Module& mod);
+extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, TokenTree input, AST::Module& mod);
extern MacroRulesPtr Parse_MacroRules(TokenStream& lex);
#endif // MACROS_HPP_INCLUDED
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp
index 4a50d659..624912c6 100644
--- a/src/parse/lex.cpp
+++ b/src/parse/lex.cpp
@@ -1031,7 +1031,7 @@ Token TTStreamO::realGetToken()
{
// If current index is above TT size, go up
unsigned int& idx = m_stack.back().first;
- const TokenTree& tree = *( m_stack.back().second ? m_stack.back().second : &m_input_tt );
+ TokenTree& tree = *( m_stack.back().second ? m_stack.back().second : &m_input_tt );
if(idx == 0 && tree.is_token()) {
idx ++;
@@ -1041,11 +1041,11 @@ Token TTStreamO::realGetToken()
if(idx < tree.size())
{
- const TokenTree& subtree = tree[idx];
+ TokenTree& subtree = tree[idx];
idx ++;
if( subtree.size() == 0 ) {
m_last_pos = subtree.tok().get_pos();
- return subtree.tok();
+ return mv$( subtree.tok() );
}
else {
m_stack.push_back( ::std::make_pair(0, &subtree ) );
diff --git a/src/parse/token.cpp b/src/parse/token.cpp
index b261f248..c5add18a 100644
--- a/src/parse/token.cpp
+++ b/src/parse/token.cpp
@@ -185,8 +185,12 @@ Token Token::clone() const
case TOK_INTERPOLATED_META:
rv.m_data = new AST::MetaItem( reinterpret_cast<AST::MetaItem*>(e)->clone() );
break;
+ case TOK_INTERPOLATED_ITEM:
+ TODO(m_pos, "clone interpolated item");
+ //rv.m_data = new AST::Named( AST::Item( reinterpret_cast<AST::MetaItem*>(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<unsigned int, const TokenTree*> > m_stack;
+ TokenTree m_input_tt;
+ ::std::vector< ::std::pair<unsigned int, TokenTree*> > m_stack;
public:
TTStreamO(TokenTree input_tt);
TTStreamO(TTStreamO&& x) = default;