X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=test%2Fast-macros.h;h=ebb3a5bd6b7b09807622a90c8ef9523f0b09e4bb;hb=ae251d391464763fd8293efd65627f9f9fd56572;hp=d4ed60721400ee5919ddc3d95e49abf4acb904b1;hpb=f12612bbc52921bc77a647d5a0dd90adc41323bf;p=xonotic%2Fgmqcc.git diff --git a/test/ast-macros.h b/test/ast-macros.h index d4ed607..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,18 +74,51 @@ do { \ STATE(loop); \ } while(0) -#define FUNCTION(name) \ -do { \ - ast_function *func_##name; \ - ast_block *my_funcblock; \ - DEFVAR(var_##name); \ - VARnamed(TYPE_FUNCTION, var_##name, name); \ - MKGLOBAL(var_##name); \ - func_##name = ast_function_new(ctx, #name, var_##name); \ - assert(functions_add(func_##name) >= 0); \ - my_funcblock = ast_block_new(ctx); \ - assert(my_funcblock); \ - assert(ast_function_blocks_add(func_##name, my_funcblock)); \ +#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); \ + DEFVAR(return_##name); \ + VARnamed(TYPE_FUNCTION, var_##name, name); \ + VARnamed(outtype, return_##name, "#returntype"); \ + 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); \ + assert(ast_function_blocks_add(func_##name, my_funcblock)); \ curblock = my_funcblock; #define MKLOCAL(var) \