diff options
author | Li Jin <dragon-fly@qq.com> | 2019-09-22 11:21:37 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2019-09-22 11:21:37 +0800 |
commit | 50eeb71a81d86cd7eb334058d1fd2d7eb899e12d (patch) | |
tree | 2b82351a857702c885bda58fd38a4334ef68b1e7 /MoonParser/ast.hpp | |
parent | 42485c6f26b16900b228aeb73907fdbdd9ed17e0 (diff) | |
download | yuescript-50eeb71a81d86cd7eb334058d1fd2d7eb899e12d.tar.gz yuescript-50eeb71a81d86cd7eb334058d1fd2d7eb899e12d.tar.bz2 yuescript-50eeb71a81d86cd7eb334058d1fd2d7eb899e12d.zip |
spec/cond.moon completed.
Diffstat (limited to 'MoonParser/ast.hpp')
-rw-r--r-- | MoonParser/ast.hpp | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/MoonParser/ast.hpp b/MoonParser/ast.hpp index 63dccba..480f9b3 100644 --- a/MoonParser/ast.hpp +++ b/MoonParser/ast.hpp | |||
@@ -230,13 +230,19 @@ public: | |||
230 | return static_cast<T*>(m_ptr); | 230 | return static_cast<T*>(m_ptr); |
231 | } | 231 | } |
232 | 232 | ||
233 | template <class T> | ||
234 | bool is() const { | ||
235 | return m_ptr->get_type() == ast_type<T>(); | ||
236 | } | ||
237 | |||
233 | void set(ast_node* node) { | 238 | void set(ast_node* node) { |
234 | if (node == m_ptr) return; | 239 | if (node == m_ptr) { |
235 | else if (!node) { | 240 | return; |
241 | } else if (!node) { | ||
236 | if (m_ptr) m_ptr->release(); | 242 | if (m_ptr) m_ptr->release(); |
237 | m_ptr = nullptr; | 243 | m_ptr = nullptr; |
238 | } | 244 | } else { |
239 | else if (accept(node)) { | 245 | assert(accept(node)); |
240 | if (m_ptr) m_ptr->release(); | 246 | if (m_ptr) m_ptr->release(); |
241 | m_ptr = node; | 247 | m_ptr = node; |
242 | node->retain(); | 248 | node->retain(); |
@@ -383,33 +389,29 @@ public: | |||
383 | } | 389 | } |
384 | 390 | ||
385 | void push_back(ast_node* node) { | 391 | void push_back(ast_node* node) { |
386 | if (accept(node)) { | 392 | assert(node && accept(node)); |
387 | m_objects.push_back(node); | 393 | m_objects.push_back(node); |
388 | node->retain(); | 394 | node->retain(); |
389 | } | ||
390 | } | 395 | } |
391 | 396 | ||
392 | void push_front(ast_node* node) { | 397 | void push_front(ast_node* node) { |
393 | if (accept(node)) { | 398 | assert(node && accept(node)); |
394 | m_objects.push_front(node); | 399 | m_objects.push_front(node); |
395 | node->retain(); | 400 | node->retain(); |
396 | } | ||
397 | } | 401 | } |
398 | 402 | ||
399 | void set_front(ast_node* node) { | 403 | void set_front(ast_node* node) { |
400 | if (accept(node)) { | 404 | assert(node && accept(node)); |
401 | m_objects.front()->release(); | 405 | m_objects.front()->release(); |
402 | m_objects.front() = node; | 406 | m_objects.front() = node; |
403 | node->retain(); | 407 | node->retain(); |
404 | } | ||
405 | } | 408 | } |
406 | 409 | ||
407 | void set_back(ast_node* node) { | 410 | void set_back(ast_node* node) { |
408 | if (accept(node)) { | 411 | assert(node && accept(node)); |
409 | m_objects.back()->release(); | 412 | m_objects.back()->release(); |
410 | m_objects.back() = node; | 413 | m_objects.back() = node; |
411 | node->retain(); | 414 | node->retain(); |
412 | } | ||
413 | } | 415 | } |
414 | 416 | ||
415 | const container& objects() const { | 417 | const container& objects() const { |