X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=test%2Fast-macros.h;h=ebb3a5bd6b7b09807622a90c8ef9523f0b09e4bb;hb=ae251d391464763fd8293efd65627f9f9fd56572;hp=c4cd7eb63640a60d0fe741c0167a6b3255dca1b1;hpb=c1ea9cc40905daf4a61e43a17135e961721aa549;p=xonotic%2Fgmqcc.git diff --git a/test/ast-macros.h b/test/ast-macros.h index c4cd7eb..ebb3a5b 100644 --- a/test/ast-macros.h +++ b/test/ast-macros.h @@ -28,6 +28,13 @@ do { \ MKGLOBAL(name); \ } while(0) +#define MKCONSTSTRING(name, value) \ +do { \ + name->isconst = true; \ + name->constval.vstring = util_strdup(value); \ + MKGLOBAL(name); \ +} while(0) + #define STATE(a) \ do { \ ast_expression *exp = (ast_expression*)(a); \ @@ -35,11 +42,22 @@ do { \ } while(0) #define ASSIGN(op, a, b) \ -(ast_expression*)ast_store_new(ctx, INSTR_##op, (a), (ast_expression*)(b)) +(ast_expression*)ast_store_new(ctx, INSTR_##op, (ast_expression*)(a), (ast_expression*)(b)) #define BIN(op, a, b) \ (ast_expression*)ast_binary_new(ctx, INSTR_##op, (ast_expression*)(a), (ast_expression*)(b)) +#define CALL(what) \ +do { \ + ast_call *call = ast_call_new(ctx, (ast_expression*)what); \ + +#define CALLPARAM(x) \ + assert(ast_call_params_add(call, (ast_expression*)x)); + +#define ENDCALL() \ + STATE(call); \ +} while(0) + #define WHILE(cond) \ do { \ ast_expression *wh_cond = (ast_expression*)(cond); \ @@ -56,8 +74,36 @@ do { \ STATE(loop); \ } while(0) +#define BUILTIN(name, outtype, number) \ +do { \ + ast_function *func_##name; \ + ast_value *thisfuncval; \ + ast_function *thisfunc; \ + DEFVAR(return_##name); \ + VARnamed(TYPE_FUNCTION, name, name); \ + VARnamed(outtype, return_##name, "#returntype"); \ + name->expression.next = (ast_expression*)return_##name; \ + MKGLOBAL(name); \ + func_##name = ast_function_new(ctx, #name, name); \ + thisfunc = func_##name; \ + (void)thisfunc; \ + thisfuncval = name; \ + (void)thisfuncval; \ + assert(functions_add(func_##name) >= 0); \ + func_##name->builtin = number; + +#define ENDBUILTIN() } while(0) + +#define PARAM(ptype, name) \ +do { \ + DEFVAR(parm); \ + VARnamed(ptype, parm, name); \ + assert(ast_value_params_add(thisfuncval, parm)); \ +} while(0) + #define FUNCTION(name, outtype) \ do { \ + ast_function *thisfunc; \ ast_function *func_##name; \ ast_block *my_funcblock; \ DEFVAR(var_##name); \ @@ -67,6 +113,8 @@ do { \ var_##name->expression.next = (ast_expression*)return_##name; \ MKGLOBAL(var_##name); \ func_##name = ast_function_new(ctx, #name, var_##name); \ + thisfunc = func_##name; \ + (void)thisfunc; \ assert(functions_add(func_##name) >= 0); \ my_funcblock = ast_block_new(ctx); \ assert(my_funcblock); \