]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - intrin.cpp
s/NULL/nullptr/
[xonotic/gmqcc.git] / intrin.cpp
index c4f3e3bde2d564ac293aa7fd2264cacb48bca4f2..14cbf7328d2a16286a553913086a07fd17176639 100644 (file)
@@ -4,8 +4,8 @@
 #define intrin_ctx(I) parser_ctx((I)->parser)
 
 static GMQCC_INLINE ast_function *intrin_value(intrin_t *intrin, ast_value **out, const char *name, qcint_t vtype) {
-    ast_value    *value = NULL;
-    ast_function *func  = NULL;
+    ast_value    *value = nullptr;
+    ast_function *func  = nullptr;
     char          buffer[1024];
     char          stype [1024];
 
@@ -32,7 +32,7 @@ static GMQCC_INLINE void intrin_reg(intrin_t *intrin, ast_value *const value, as
 /*
  * since some intrinsics depend on each other there is the possibility
  * that an intrinsic will fail to get a 'depended' function that a
- * builtin needs, causing some dependency in the chain to have a NULL
+ * builtin needs, causing some dependency in the chain to have a nullptr
  * function. This will cause a segmentation fault at code generation,
  * even though an error was raised. To contiue to allow it (instead
  * of stopping compilation right away). We need to return from the
@@ -40,8 +40,8 @@ static GMQCC_INLINE void intrin_reg(intrin_t *intrin, ast_value *const value, as
  */
 static ast_expression *intrin_func_self(intrin_t *intrin, const char *name, const char *from);
 static ast_expression *intrin_nullfunc(intrin_t *intrin) {
-    ast_value    *value = NULL;
-    ast_function *func  = intrin_value(intrin, &value, NULL, TYPE_VOID);
+    ast_value    *value = nullptr;
+    ast_function *func  = intrin_value(intrin, &value, nullptr, TYPE_VOID);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -52,7 +52,7 @@ static ast_expression *intrin_isfinite(intrin_t *intrin) {
      *     return !(isnan(x) || isinf(x));
      * }
      */
-    ast_value    *value     = NULL;
+    ast_value    *value     = nullptr;
     ast_value    *x         = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_function *func      = intrin_value(intrin, &value, "isfinite", TYPE_FLOAT);
     ast_call     *callisnan = ast_call_new(intrin_ctx(intrin), intrin_func_self(intrin, "isnan", "isfinite"));
@@ -85,7 +85,7 @@ static ast_expression *intrin_isfinite(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, block);
+    func->blocks.push_back(block);
     intrin_reg(intrin, value, func);
 
     return (ast_expression*)value;;
@@ -97,7 +97,7 @@ static ast_expression *intrin_isinf(intrin_t *intrin) {
      *     return (x != 0.0) && (x + x == x);
      * }
      */
-    ast_value    *value = NULL;
+    ast_value    *value = nullptr;
     ast_value    *x     = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body  = ast_block_new(intrin_ctx(intrin));
     ast_function *func  = intrin_value(intrin, &value, "isinf", TYPE_FLOAT);
@@ -130,7 +130,7 @@ static ast_expression *intrin_isinf(intrin_t *intrin) {
     );
 
     value->expression.params.push_back(x);
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
 
     intrin_reg(intrin, value, func);
 
@@ -146,7 +146,7 @@ static ast_expression *intrin_isnan(intrin_t *intrin) {
      *   return (x != local);
      * }
      */
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_value    *arg1   = ast_value_new(intrin_ctx(intrin), "x",     TYPE_FLOAT);
     ast_value    *local  = ast_value_new(intrin_ctx(intrin), "local", TYPE_FLOAT);
     ast_block    *body   = ast_block_new(intrin_ctx(intrin));
@@ -175,7 +175,7 @@ static ast_expression *intrin_isnan(intrin_t *intrin) {
     );
 
     value->expression.params.push_back(arg1);
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
 
     intrin_reg(intrin, value, func);
 
@@ -188,7 +188,7 @@ static ast_expression *intrin_isnormal(intrin_t *intrin) {
      *     return isfinite(x);
      * }
      */
-    ast_value    *value         = NULL;
+    ast_value    *value         = nullptr;
     ast_call     *callisfinite  = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "isfinite", "isnormal"));
     ast_value    *x             = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body          = ast_block_new(intrin_ctx(intrin));
@@ -205,7 +205,7 @@ static ast_expression *intrin_isnormal(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -216,7 +216,7 @@ static ast_expression *intrin_signbit(intrin_t *intrin) {
      *     return (x < 0);
      * }
      */
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_value    *x      = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body   = ast_block_new(intrin_ctx(intrin));
     ast_function *func   = intrin_value(intrin, &value, "signbit", TYPE_FLOAT);
@@ -241,7 +241,7 @@ static ast_expression *intrin_signbit(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -252,7 +252,7 @@ static ast_expression *intrin_acosh(intrin_t *intrin) {
      *     return log(x + sqrt((x * x) - 1));
      * }
      */
-    ast_value    *value    = NULL;
+    ast_value    *value    = nullptr;
     ast_value    *x        = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_call     *calllog  = ast_call_new(intrin_ctx(intrin), intrin_func_self(intrin, "log", "acosh"));
     ast_call     *callsqrt = ast_call_new(intrin_ctx(intrin), intrin_func_self(intrin, "sqrt", "acosh"));
@@ -294,7 +294,7 @@ static ast_expression *intrin_acosh(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -305,7 +305,7 @@ static ast_expression *intrin_asinh(intrin_t *intrin) {
      *     return log(x + sqrt((x * x) + 1));
      * }
      */
-    ast_value    *value    = NULL;
+    ast_value    *value    = nullptr;
     ast_value    *x        = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_call     *calllog  = ast_call_new(intrin_ctx(intrin), intrin_func_self(intrin, "log", "asinh"));
     ast_call     *callsqrt = ast_call_new(intrin_ctx(intrin), intrin_func_self(intrin, "sqrt", "asinh"));
@@ -347,7 +347,7 @@ static ast_expression *intrin_asinh(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -358,7 +358,7 @@ static ast_expression *intrin_atanh(intrin_t *intrin) {
      *     return 0.5 * log((1 + x) / (1 - x))
      * }
      */
-    ast_value    *value   = NULL;
+    ast_value    *value   = nullptr;
     ast_value    *x       = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_call     *calllog = ast_call_new(intrin_ctx(intrin), intrin_func_self(intrin, "log", "atanh"));
     ast_block    *body    = ast_block_new(intrin_ctx(intrin));
@@ -396,7 +396,7 @@ static ast_expression *intrin_atanh(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -413,7 +413,7 @@ static ast_expression *intrin_exp(intrin_t *intrin) {
      *     return sum;
      * }
      */
-    ast_value    *value = NULL;
+    ast_value    *value = nullptr;
     ast_value    *x     = ast_value_new(intrin_ctx(intrin), "x",   TYPE_FLOAT);
     ast_value    *sum   = ast_value_new(intrin_ctx(intrin), "sum", TYPE_FLOAT);
     ast_value    *acc   = ast_value_new(intrin_ctx(intrin), "acc", TYPE_FLOAT);
@@ -469,7 +469,7 @@ static ast_expression *intrin_exp(intrin_t *intrin) {
                 (ast_expression*)fold_constgen_float(intrin->fold, 200.0f, false)
             ),
             false,
-            NULL,
+            nullptr,
             false,
             /* ++i; */
             (ast_expression*)ast_binstore_new(
@@ -509,8 +509,7 @@ static ast_expression *intrin_exp(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
-
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -521,7 +520,7 @@ static ast_expression *intrin_exp2(intrin_t *intrin) {
      *     return pow(2, x);
      * }
      */
-    ast_value    *value     = NULL;
+    ast_value    *value     = nullptr;
     ast_call     *callpow   = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "pow", "exp2"));
     ast_value    *arg1      = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body      = ast_block_new(intrin_ctx(intrin));
@@ -540,8 +539,7 @@ static ast_expression *intrin_exp2(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
-
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -552,7 +550,7 @@ static ast_expression *intrin_expm1(intrin_t *intrin) {
      *     return exp(x) - 1;
      * }
      */
-    ast_value    *value    = NULL;
+    ast_value    *value    = nullptr;
     ast_call     *callexp  = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "exp", "expm1"));
     ast_value    *x        = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body     = ast_block_new(intrin_ctx(intrin));
@@ -576,7 +574,7 @@ static ast_expression *intrin_expm1(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -623,7 +621,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
      *     return accumulate;
      * }
      */
-    ast_value    *value = NULL;
+    ast_value    *value = nullptr;
     ast_function *func = intrin_value(intrin, &value, "pow", TYPE_FLOAT);
 
     /* prepare some calls for later */
@@ -686,7 +684,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
                 intrin_ctx(intrin),
                 (ast_expression*)intrin->fold->imm_float[1]
             ),
-            NULL
+            nullptr
         )
     );
 
@@ -707,7 +705,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
                 intrin_ctx(intrin),
                 (ast_expression*)base
             ),
-            NULL
+            nullptr
         )
     );
 
@@ -743,7 +741,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
                     (ast_expression*)callpow1
                 )
             ),
-            NULL
+            nullptr
         )
     );
 
@@ -799,7 +797,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
                 (ast_expression*)intrin->fold->imm_float[1]
             ),
             (ast_expression*)expgt1,
-            NULL
+            nullptr
         )
     );
 
@@ -991,7 +989,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
         (ast_expression*)ast_loop_new(
             intrin_ctx(intrin),
             /* init */
-            NULL,
+            nullptr,
             /* pre condition */
             (ast_expression*)ast_binary_new(
                 intrin_ctx(intrin),
@@ -1002,11 +1000,11 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
             /* pre not */
             false,
             /* post condition */
-            NULL,
+            nullptr,
             /* post not */
             false,
             /* increment expression */
-            NULL,
+            nullptr,
             /* code block */
             (ast_expression*)whileblock
         )
@@ -1021,8 +1019,7 @@ static ast_expression *intrin_pow(intrin_t *intrin) {
     );
 
     /* } */
-    vec_push(func->blocks, body);
-
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -1035,7 +1032,7 @@ static ast_expression *intrin_mod(intrin_t *intrin) {
      *     return a - b * sign * floor(sign * div);
      * }
      */
-    ast_value    *value = NULL;
+    ast_value    *value = nullptr;
     ast_call     *call  = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "floor", "mod"));
     ast_value    *a     = ast_value_new(intrin_ctx(intrin), "a",    TYPE_FLOAT);
     ast_value    *b     = ast_value_new(intrin_ctx(intrin), "b",    TYPE_FLOAT);
@@ -1118,9 +1115,8 @@ static ast_expression *intrin_mod(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
-
     return (ast_expression*)value;
 }
 
@@ -1130,7 +1126,7 @@ static ast_expression *intrin_fabs(intrin_t *intrin) {
      *     return x < 0 ? -x : x;
      * }
      */
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_value    *arg1   = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body   = ast_block_new(intrin_ctx(intrin));
     ast_function *func   = intrin_value(intrin, &value, "fabs", TYPE_FLOAT);
@@ -1158,10 +1154,8 @@ static ast_expression *intrin_fabs(intrin_t *intrin) {
 
     value->expression.params.push_back(arg1);
 
-    vec_push(func->blocks, body);
-
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
-
     return (ast_expression*)value;
 }
 
@@ -1173,7 +1167,7 @@ static ast_expression *intrin_epsilon(intrin_t *intrin) {
      *     return eps;
      * }
      */
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_value    *eps    = ast_value_new(intrin_ctx(intrin), "eps", TYPE_FLOAT);
     ast_block    *body   = ast_block_new(intrin_ctx(intrin));
     ast_function *func   = intrin_value(intrin, &value, "epsilon", TYPE_FLOAT);
@@ -1193,8 +1187,8 @@ static ast_expression *intrin_epsilon(intrin_t *intrin) {
     body->exprs.push_back(
         (ast_expression*)ast_loop_new(
             intrin_ctx(intrin),
-            NULL,
-            NULL,
+            nullptr,
+            nullptr,
             false,
             (ast_expression*)ast_binary_new(
                 intrin_ctx(intrin),
@@ -1213,7 +1207,7 @@ static ast_expression *intrin_epsilon(intrin_t *intrin) {
                 (ast_expression*)intrin->fold->imm_float[1]
             ),
             false,
-            NULL,
+            nullptr,
             (ast_expression*)ast_binstore_new(
                 intrin_ctx(intrin),
                 INSTR_STORE_F,
@@ -1232,9 +1226,8 @@ static ast_expression *intrin_epsilon(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
-
     return (ast_expression*)value;
 }
 
@@ -1245,7 +1238,7 @@ static ast_expression *intrin_nan(intrin_t *intrin) {
      *     return x / x;
      * }
      */
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_value    *x      = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_function *func   = intrin_value(intrin, &value, "nan", TYPE_FLOAT);
     ast_block    *block  = ast_block_new(intrin_ctx(intrin));
@@ -1273,9 +1266,8 @@ static ast_expression *intrin_nan(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, block);
+    func->blocks.push_back(block);
     intrin_reg(intrin, value, func);
-
     return (ast_expression*)value;
 }
 
@@ -1287,7 +1279,7 @@ static ast_expression *intrin_inf(intrin_t *intrin) {
      *     return x / y;
      * }
      */
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_value    *x      = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_value    *y      = ast_value_new(intrin_ctx(intrin), "y", TYPE_FLOAT);
     ast_function *func   = intrin_value(intrin, &value, "inf", TYPE_FLOAT);
@@ -1321,9 +1313,8 @@ static ast_expression *intrin_inf(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, block);
+    func->blocks.push_back(block);
     intrin_reg(intrin, value, func);
-
     return (ast_expression*)value;
 }
 
@@ -1393,7 +1384,7 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
      * }
      */
 
-    ast_value    *value      = NULL;
+    ast_value    *value      = nullptr;
     ast_value    *power      = ast_value_new(intrin_ctx(intrin), "power",     TYPE_FLOAT);
     ast_value    *base       = ast_value_new(intrin_ctx(intrin), "base",      TYPE_FLOAT);
     ast_value    *whole      = ast_value_new(intrin_ctx(intrin), "whole",     TYPE_FLOAT);
@@ -1547,7 +1538,7 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
                     intrin_func_self(intrin, "__builtin_nan", "ln")
                 )
             ),
-            NULL
+            nullptr
         )
     );
 
@@ -1562,7 +1553,7 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
                     (ast_expression*)intrin->fold->imm_float[1]
                 ),
                 (ast_expression*)((i) ? blt1 : plt1),
-                NULL
+                nullptr
             )
         );
     }
@@ -1666,7 +1657,7 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
     whileloop->exprs.push_back(
         (ast_expression*)ast_loop_new(
             intrin_ctx(intrin),
-            NULL,
+            nullptr,
             (ast_expression*)ast_binary_new(
                 intrin_ctx(intrin),
                 INSTR_GE,
@@ -1674,9 +1665,9 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
                 (ast_expression*)newbase2
             ),
             false,
-            NULL,
+            nullptr,
             false,
-            NULL,
+            nullptr,
             (ast_expression*)nestwhile
         )
     );
@@ -1707,7 +1698,7 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
     forloop->exprs.push_back(
         (ast_expression*)ast_loop_new(
             intrin_ctx(intrin),
-            NULL,
+            nullptr,
             (ast_expression*)ast_binary_new(
                 intrin_ctx(intrin),
                 INSTR_GE,
@@ -1715,9 +1706,9 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
                 (ast_expression*)base
             ),
             false,
-            NULL,
+            nullptr,
             false,
-            NULL,
+            nullptr,
             (ast_expression*)whileloop
         )
     );
@@ -1814,7 +1805,7 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
                 false,
                 0
             ),
-            NULL
+            nullptr
         )
     );
 
@@ -1837,13 +1828,13 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
     block->exprs.push_back(
         (ast_expression*)ast_loop_new(
             intrin_ctx(intrin),
-            NULL,
-            /* for(; 1; ) ?? (can this be NULL too?) */
+            nullptr,
+            /* for(; 1; ) ?? (can this be nullptr too?) */
             (ast_expression*)intrin->fold->imm_float[1],
             false,
-            NULL,
+            nullptr,
             false,
-            NULL,
+            nullptr,
             (ast_expression*)forloop
         )
     );
@@ -1866,14 +1857,13 @@ static ast_expression *intrin_ln(intrin_t *intrin) {
         )
     );
 
-    vec_push(func->blocks, block);
+    func->blocks.push_back(block);
     intrin_reg(intrin, value, func);
-
     return (ast_expression*)value;
 }
 
 static ast_expression *intrin_log_variant(intrin_t *intrin, const char *name, float base) {
-    ast_value    *value  = NULL;
+    ast_value    *value  = nullptr;
     ast_call     *callln = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "__builtin_ln", name));
     ast_value    *arg1   = ast_value_new(intrin_ctx(intrin), "x", TYPE_FLOAT);
     ast_block    *body   = ast_block_new(intrin_ctx(intrin));
@@ -1891,7 +1881,7 @@ static ast_expression *intrin_log_variant(intrin_t *intrin, const char *name, fl
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -1915,7 +1905,7 @@ static ast_expression *intrin_shift_variant(intrin_t *intrin, const char *name,
      * float [shift] (float a, float b) {
      *   return floor(a [instr] pow(2, b));
      */
-    ast_value    *value     = NULL;
+    ast_value    *value     = nullptr;
     ast_call     *callpow   = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "pow", name));
     ast_call     *callfloor = ast_call_new (intrin_ctx(intrin), intrin_func_self(intrin, "floor", name));
     ast_value    *a         = ast_value_new(intrin_ctx(intrin), "a", TYPE_FLOAT);
@@ -1948,7 +1938,7 @@ static ast_expression *intrin_shift_variant(intrin_t *intrin, const char *name,
         )
     );
 
-    vec_push(func->blocks, body);
+    func->blocks.push_back(body);
     intrin_reg(intrin, value, func);
     return (ast_expression*)value;
 }
@@ -2008,51 +1998,45 @@ static void intrin_error(intrin_t *intrin, const char *fmt, ...) {
 
 /* exposed */
 intrin_t *intrin_init(parser_t *parser) {
-    intrin_t *intrin = (intrin_t*)mem_a(sizeof(intrin_t));
-    size_t    i;
+    intrin_t *intrin = new intrin_t;
 
-    intrin->parser     = parser;
-    intrin->fold       = parser->fold;
-    intrin->intrinsics = NULL;
-    intrin->generated  = NULL;
+    intrin->parser = parser;
+    intrin->fold = parser->fold;
 
-    vec_append(intrin->intrinsics, GMQCC_ARRAY_COUNT(intrinsics), intrinsics);
-
-    /* populate with null pointers for tracking generation */
-    for (i = 0; i < GMQCC_ARRAY_COUNT(intrinsics); i++)
-        vec_push(intrin->generated, NULL);
+    for (auto &it : intrinsics) {
+        intrin->intrinsics.push_back(it);
+        intrin->generated.push_back(nullptr);
+    }
 
     return intrin;
 }
 
 void intrin_cleanup(intrin_t *intrin) {
-    vec_free(intrin->intrinsics);
-    vec_free(intrin->generated);
-    mem_d(intrin);
+    delete intrin;
 }
 
 ast_expression *intrin_fold(intrin_t *intrin, ast_value *value, ast_expression **exprs) {
-    size_t i;
     if (!value || !value->name)
-        return NULL;
-    for (i = 0; i < vec_size(intrin->intrinsics); i++)
-        if (!strcmp(value->name, intrin->intrinsics[i].name))
-            return (vec_size(exprs) != intrin->intrinsics[i].args)
-                        ? NULL
+        return nullptr;
+    for (auto &it : intrin->intrinsics) {
+        if (!strcmp(value->name, it.name))
+            return (vec_size(exprs) != it.args)
+                        ? nullptr
                         : fold_intrin(intrin->fold, value->name + 10, exprs);
-    return NULL;
+    }
+    return nullptr;
 }
 
 static GMQCC_INLINE ast_expression *intrin_func_try(intrin_t *intrin, size_t offset, const char *compare) {
-    size_t i;
-    for (i = 0; i < vec_size(intrin->intrinsics); i++) {
-        if (strcmp(*(char **)((char *)&intrin->intrinsics[i] + offset), compare))
+    for (auto &it : intrin->intrinsics) {
+        const size_t index = &it - &intrin->intrinsics[0];
+        if (strcmp(*(char **)((char *)&it + offset), compare))
             continue;
-        if (intrin->generated[i])
-            return intrin->generated[i];
-        return intrin->generated[i] = intrin->intrinsics[i].intrin(intrin);
+        if (intrin->generated[index])
+            return intrin->generated[index];
+        return intrin->generated[index] = it.intrin(intrin);
     }
-    return NULL;
+    return nullptr;
 }
 
 static ast_expression *intrin_func_self(intrin_t *intrin, const char *name, const char *from) {
@@ -2071,11 +2055,11 @@ static ast_expression *intrin_func_self(intrin_t *intrin, const char *name, cons
 
     if (from) {
         intrin_error(intrin, "need function `%s', compiler depends on it for `__builtin_%s'", name, from);
-        return intrin_func_self(intrin, "#nullfunc", NULL);
+        return intrin_func_self(intrin, "#nullfunc", nullptr);
     }
-    return NULL;
+    return nullptr;
 }
 
 ast_expression *intrin_func(intrin_t *intrin, const char *name) {
-    return intrin_func_self(intrin, name, NULL);
+    return intrin_func_self(intrin, name, nullptr);
 }