summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/macro_rules/eval.cpp16
-rw-r--r--src/parse/expr.cpp2
-rw-r--r--src/parse/lex.cpp2
-rw-r--r--src/parse/token.cpp14
-rw-r--r--src/parse/token.hpp15
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);