]> de.git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
ast nodes now store their type id, and can be checked via ast_istype
authorWolfgang Bumiller <wolfgang.linux@bumiller.com>
Sun, 29 Jul 2012 08:03:13 +0000 (10:03 +0200)
committerWolfgang Bumiller <wolfgang.linux@bumiller.com>
Sun, 29 Jul 2012 08:03:13 +0000 (10:03 +0200)
ast.c
ast.h

diff --git a/ast.c b/ast.c
index e153a5a7f57ef47b60d5a0f62b7f98e7da68b409..0b61fe0653afbf5b6b6701ff714d0ee98899656c 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -32,7 +32,7 @@
     if (!self) {                                                    \
         return NULL;                                                \
     }                                                               \
-    ast_node_init((ast_node*)self, ctx);                            \
+    ast_node_init((ast_node*)self, ctx, TYPE_##T);                  \
     ( (ast_node*)self )->node.destroy = (ast_node_delete*)destroyfn
 
 /* It must not be possible to get here. */
@@ -43,11 +43,12 @@ static GMQCC_NORETURN void _ast_node_destroy(ast_node *self)
 }
 
 /* Initialize main ast node aprts */
-static void ast_node_init(ast_node *self, lex_ctx ctx)
+static void ast_node_init(ast_node *self, lex_ctx ctx, int nodetype)
 {
     self->node.context = ctx;
     self->node.destroy = &_ast_node_destroy;
     self->node.keep    = false;
+    self->node.nodetype = nodetype;
 }
 
 /* General expression initialization */
diff --git a/ast.h b/ast.h
index fc4fef3553e51dd08a9a8f12bffbdb83a36a0c73..32b28e537e2f2a08e760df8396c0c9b2dfe2e300 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -44,6 +44,25 @@ typedef struct ast_call_s       ast_call;
 typedef struct ast_unary_s      ast_unary;
 typedef struct ast_return_s     ast_return;
 
+enum {
+    TYPE_ast_node,
+    TYPE_ast_expression,
+    TYPE_ast_value,
+    TYPE_ast_function,
+    TYPE_ast_block,
+    TYPE_ast_binary,
+    TYPE_ast_store,
+    TYPE_ast_entfield,
+    TYPE_ast_ifthen,
+    TYPE_ast_ternary,
+    TYPE_ast_loop,
+    TYPE_ast_call,
+    TYPE_ast_unary,
+    TYPE_ast_return
+};
+
+#define ast_istype(x, t) ( ((ast_node_common*)x)->nodetype == (t) )
+
 /* Node interface with common components
  */
 typedef void ast_node_delete(ast_node*);
@@ -52,6 +71,7 @@ typedef struct
     lex_ctx          context;
     /* I don't feel comfortable using keywords like 'delete' as names... */
     ast_node_delete *destroy;
+    int              nodetype;
     /* keep: if a node contains this node, 'keep'
      * prevents its dtor from destroying this node as well.
      */