X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=test%2Fast-test.c;h=74800dd8ce7e0d0e753793d0d959109f0f50f895;hb=0c74f8fdb929e0dbb04ba861ff083764f6738476;hp=2217a396e5ccc1373e9800f86e54a512a929601e;hpb=ed24ea0cef206020757e9d549929313447988033;p=xonotic%2Fgmqcc.git diff --git a/test/ast-test.c b/test/ast-test.c index 2217a39..74800dd 100644 --- a/test/ast-test.c +++ b/test/ast-test.c @@ -10,8 +10,18 @@ #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)]; +uint32_t opts_warn [1 + (COUNT_WARNINGS / 32)]; + +uint32_t opts_O = 1; +const char *opts_output = "progs.dat"; +int opts_standard = COMPILER_GMQCC; +bool opts_debug = false; +bool opts_memchk = false; + #include "ast-macros.h" int main() @@ -27,41 +37,120 @@ int main() DEFVAR(f0); DEFVAR(f1); DEFVAR(f5); + DEFVAR(cv3x4x5); + DEFVAR(cv1x1x1); + DEFVAR(sHello); + DEFVAR(sNL); DEFVAR(print); + DEFVAR(ftos); + DEFVAR(spawn); -#if 0 - BUILTIN(print, TYPE_VOID, -1); - PARAM(TYPE_STRING, text); - ENDBUILTIN(); -#endif + DEFVAR(mema); + DEFVAR(memb); + DEFVAR(memv); + DEFVAR(pawn); + + /* opts_debug = true; */ + +BUILTIN(print, TYPE_VOID, -1); +PARAM(TYPE_STRING, text); +ENDBUILTIN(); + +BUILTIN(ftos, TYPE_STRING, -2); +PARAM(TYPE_FLOAT, value); +ENDBUILTIN(); + +BUILTIN(spawn, TYPE_ENTITY, -3); +ENDBUILTIN(); TESTINIT(); VAR(TYPE_FLOAT, f0); VAR(TYPE_FLOAT, f1); VAR(TYPE_FLOAT, f5); +VAR(TYPE_STRING, sHello); +VAR(TYPE_STRING, sNL); +VAR(TYPE_VECTOR, cv3x4x5); +VAR(TYPE_VECTOR, cv1x1x1); + +FIELD(TYPE_FLOAT, mema); +FIELD(TYPE_FLOAT, memb); +FIELD(TYPE_VECTOR, memv); + MKCONSTFLOAT(f0, 0.0); MKCONSTFLOAT(f1, 1.0); MKCONSTFLOAT(f5, 5.0); +MKCONSTSTRING(sHello, "Hello, World\n"); +MKCONSTSTRING(sNL, "\n"); +MKCONSTVECTOR(cv3x4x5, 3, 4, 5); +MKCONSTVECTOR(cv1x1x1, 1, 1, 1); -FUNCTION(main, TYPE_VOID); +FUNCTION(foo, TYPE_VOID); +ENDFUNCTION(foo); -VAR(TYPE_FLOAT, vi); -VAR(TYPE_FLOAT, vx); +#define PRINTNL() do { CALL(print) CALLPARAM(sNL) ENDCALL(); } while(0) -MKLOCAL(vi); -MKLOCAL(vx); +FUNCTION(main, TYPE_VOID); -STATE(ASSIGN(STORE_F, vi, f0)); -WHILE(BIN(LT, vi, f5)); -STATE(ASSIGN(STORE_F, vx, BIN(MUL_F, vi, f5))); -STATE(ASSIGN(STORE_F, vi, BIN(ADD_F, vi, f1))); -ENDWHILE(); + VAR(TYPE_FLOAT, vi); + VAR(TYPE_FLOAT, vx); + VAR(TYPE_ENTITY, pawn); + + MKLOCAL(vi); + MKLOCAL(vx); + MKLOCAL(pawn); + + STATE(ASSIGN(STORE_F, vi, f0)); + WHILE(BIN(LT, vi, f5)); + STATE(ASSIGN(STORE_F, vx, BIN(MUL_F, vi, f5))); + STATE(ASSIGN(STORE_F, vi, BIN(ADD_F, vi, f1))); + ENDWHILE(); + + CALL(print) + CALLPARAM(sHello) + ENDCALL(); + + CALL(spawn) + ENDCALLWITH(newent, STATE(ASSIGN(STORE_ENT, pawn, newent))); + + STATE(ASSIGN(STOREP_F, ENTFIELD(pawn, mema), f5)); + STATE(ASSIGN(STOREP_F, ENTFIELD(pawn, memb), f1)); + STATE(ASSIGN(STOREP_V, ENTFIELD(pawn, memv), cv3x4x5)); + CALL(ftos) + CALLPARAM(ENTFIELD(pawn, mema)) + ENDCALLWITH(output, + CALL(print) + CALLPARAM(output) + CALLPARAM(sNL) + ENDCALL(); + ); + CALL(ftos) + CALLPARAM(ENTFIELD(pawn, memb)) + ENDCALLWITH(output, + CALL(print) + CALLPARAM(output) + CALLPARAM(sNL) + ENDCALL(); + ); + CALL(ftos) + CALLPARAM(ENTFIELD(pawn, VECMEM(memv, 2))) + ENDCALLWITH(output, + CALL(print) + CALLPARAM(output) + CALLPARAM(sNL) + ENDCALL(); + ); 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)) {