-#define INTRIN_VAL(VALUE, NAME, FUNC, STYPE, VTYPE) \
- do { \
- (VALUE) = ast_value_new ( \
- parser_ctx(intrin->parser), \
- "__builtin_" NAME, \
- TYPE_FUNCTION \
- ); \
- (VALUE)->intrinsic = true; \
- (VALUE)->expression.next = (ast_expression*)ast_value_new ( \
- parser_ctx(intrin->parser), \
- STYPE, \
- VTYPE \
- ); \
- (FUNC) = ast_function_new ( \
- parser_ctx(intrin->parser), \
- "__builtin_" NAME, \
- (VALUE) \
- ); \
- (VALUE)->expression.flags |= AST_FLAG_ERASEABLE; \
- } while (0)
-
-#define INTRIN_REG(FUNC, VALUE) \
- do { \
- vec_push(intrin->parser->functions, (FUNC)); \
- vec_push(intrin->parser->globals, (ast_expression*)(VALUE)); \
- } while (0)
+#define intrin_ctx(I) parser_ctx((I)->parser)
+
+static GMQCC_INLINE ast_function *intrin_value(intrin_t *intrin, ast_value **value, const char *name, qcint_t vtype) {
+ ast_function *func = NULL;
+ char buffer[1024];
+ char stype [1024];
+
+ util_snprintf(buffer, sizeof(buffer), "__builtin_%s", name);
+ util_snprintf(stype, sizeof(stype), "<%s>", type_name[vtype]);
+
+ *value = ast_value_new(intrin_ctx(intrin), buffer, TYPE_FUNCTION);
+ (*value)->intrinsic = true;
+ (*value)->expression.next = (ast_expression*)ast_value_new(intrin_ctx(intrin), stype, vtype);
+ func = ast_function_new(intrin_ctx(intrin), buffer, *value);
+ (*value)->expression.flags |= AST_FLAG_ERASEABLE;
+
+ return func;
+}
+
+static GMQCC_INLINE void intrin_reg(intrin_t *intrin, ast_value *const value, ast_function *const func) {
+ vec_push(intrin->parser->functions, func);
+ vec_push(intrin->parser->globals, (ast_expression*)value);
+}