diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/macro_rules/eval.cpp | 16 | ||||
-rw-r--r-- | src/parse/expr.cpp | 2 | ||||
-rw-r--r-- | src/parse/lex.cpp | 2 | ||||
-rw-r--r-- | src/parse/token.cpp | 14 | ||||
-rw-r--r-- | src/parse/token.hpp | 15 |
5 files changed, 26 insertions, 23 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index 109e2c43..d37f0279 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -1029,11 +1029,11 @@ Token MacroExpander::realGetToken() while( const auto* next_ent_ptr = m_state.next_ent() ) { const auto& ent = *next_ent_ptr; - TU_MATCH( MacroExpansionEnt, (ent), (e), - (Token, + TU_IFLET(MacroExpansionEnt, ent, Token, e, return e; - ), - (NamedValue, + ) + else if( ent.is_NamedValue() ) { + const auto& e = ent.as_NamedValue(); if( e >> 30 ) { switch( e & 0x3FFFFFFF ) { @@ -1081,12 +1081,14 @@ Token MacroExpander::realGetToken() } } } - ), - (Loop, + } + else TU_IFLET(MacroExpansionEnt, ent, Loop, e, //assert( e.joiner.tok() != TOK_NULL ); return e.joiner; - ) ) + else { + throw ""; + } } DEBUG("EOF"); diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index ff8be897..6b33b3e7 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -1312,7 +1312,7 @@ public: virtual Position getPosition() const override { return m_input.getPosition(); }
virtual Token realGetToken() override {
Token tok = m_input.getToken();
- m_output.push_back( TokenTree(tok) );
+ m_output.push_back( TokenTree(tok.clone()) );
return tok;
}
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp index 624912c6..76c8ab5d 100644 --- a/src/parse/lex.cpp +++ b/src/parse/lex.cpp @@ -1036,7 +1036,7 @@ Token TTStreamO::realGetToken() if(idx == 0 && tree.is_token()) { idx ++; m_last_pos = tree.tok().get_pos(); - return tree.tok(); + return mv$(tree.tok()); } if(idx < tree.size()) diff --git a/src/parse/token.cpp b/src/parse/token.cpp index 3c4d68ac..6e32f958 100644 --- a/src/parse/token.cpp +++ b/src/parse/token.cpp @@ -142,6 +142,20 @@ Token::Token(TagTakeIP, InterpolatedFragment frag) } } +Token::Token(const Token& t): + m_type(t.m_type), + m_data( Data::make_None({}) ), + m_pos( t.m_pos ) +{ + assert( t.m_data.tag() != Data::TAGDEAD ); + TU_MATCH(Data, (t.m_data), (e), + (None, ), + (String, m_data = Data::make_String(e); ), + (Integer, m_data = Data::make_Integer(e);), + (Float, m_data = Data::make_Float(e);), + (Fragment, BUG(t.m_pos, "Attempted to copy a fragment - " << t);) + ) +} Token Token::clone() const { Token rv(m_type); diff --git a/src/parse/token.hpp b/src/parse/token.hpp index d496a4b2..39d3654f 100644 --- a/src/parse/token.hpp +++ b/src/parse/token.hpp @@ -86,20 +86,7 @@ public: { t.m_type = TOK_NULL; } - Token(const Token& t): - m_type(t.m_type), - m_data( Data::make_None({}) ), - m_pos( t.m_pos ) - { - assert( t.m_data.tag() != Data::TAGDEAD ); - TU_MATCH(Data, (t.m_data), (e), - (None, ), - (String, m_data = Data::make_String(e); ), - (Integer, m_data = Data::make_Integer(e);), - (Float, m_data = Data::make_Float(e);), - (Fragment, assert(!"Copied fragment");) - ) - } + Token(const Token& t); Token clone() const; Token(enum eTokenType type); |