aboutsummaryrefslogtreecommitdiff
path: root/MoonParser/ast.hpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2019-09-22 11:21:37 +0800
committerLi Jin <dragon-fly@qq.com>2019-09-22 11:21:37 +0800
commit50eeb71a81d86cd7eb334058d1fd2d7eb899e12d (patch)
tree2b82351a857702c885bda58fd38a4334ef68b1e7 /MoonParser/ast.hpp
parent42485c6f26b16900b228aeb73907fdbdd9ed17e0 (diff)
downloadyuescript-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.hpp46
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 {