]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
ast macros to create a field, generating fields in ast-test
authorWolfgang (Blub) Bumiller <blub@speed.at>
Sat, 11 Aug 2012 14:10:33 +0000 (16:10 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Sat, 11 Aug 2012 14:10:33 +0000 (16:10 +0200)
test/ast-macros.h
test/ast-test.c

index ebb3a5bd6b7b09807622a90c8ef9523f0b09e4bb..56df82eb7794272982d4fb8a41bf654b5f7a812b 100644 (file)
@@ -21,6 +21,17 @@ name = ast_value_new(ctx, #varname, type)
 #define MKGLOBAL(name) \
 assert(globals_add(name) >= 0)
 
+#define FIELD(type, name) \
+name = ast_value_new(ctx, #name, TYPE_FIELD);                  \
+do {                                                           \
+    ast_value *field_##name = ast_value_new(ctx, #name, type); \
+    name->expression.next = (ast_expression*)field_##name;     \
+    MKFIELD(name);                                             \
+} while (0)
+
+#define MKFIELD(name) \
+assert(fields_add(name) >= 0)
+
 #define MKCONSTFLOAT(name, value)  \
 do {                               \
     name->isconst = true;          \
index 3862144d8395a30d7d9f7d771bc1cdb67d2591b2..de01d899da9fe955b106a66c4d005ae6d80fde00 100644 (file)
@@ -10,6 +10,7 @@
 #define assert(x) do { if ( !(x) ) { printf("Assertion failed: %s\n", #x); abort(); } } while(0)
 
 VECTOR_MAKE(ast_value*, globals);
+VECTOR_MAKE(ast_value*, fields);
 VECTOR_MAKE(ast_function*, functions);
 
 uint32_t    opts_flags[1 + (COUNT_FLAGS / 32)];
@@ -39,6 +40,8 @@ int main()
     DEFVAR(sHello);
     DEFVAR(print);
 
+    DEFVAR(mema);
+
     /* opts_debug = true; */
 
 BUILTIN(print, TYPE_VOID, -1);
@@ -50,6 +53,7 @@ VAR(TYPE_FLOAT, f0);
 VAR(TYPE_FLOAT, f1);
 VAR(TYPE_FLOAT, f5);
 VAR(TYPE_STRING, sHello);
+FIELD(TYPE_FLOAT, mema);
 MKCONSTFLOAT(f0, 0.0);
 MKCONSTFLOAT(f1, 1.0);
 MKCONSTFLOAT(f5, 5.0);
@@ -81,6 +85,12 @@ ENDFUNCTION(main);
     ir = ir_builder_new("ast_test");
     assert(ir);
 
+    /* gen fields */
+    for (i = 0; i < fields_elements; ++i) {
+        if (!ast_global_codegen(fields_data[i], ir)) {
+            assert(!"failed to generate field");
+        }
+    }
     /* gen globals */
     for (i = 0; i < globals_elements; ++i) {
         if (!ast_global_codegen(globals_data[i], ir)) {