aboutsummaryrefslogtreecommitdiffhomepage
path: root/ast.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-11 15:19:18 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:06:21 +0900
commit9c12de31ab03385cea3b7bc78582ef4fdb9b22cc (patch)
tree715f6d472dbf110d864806039f743977c6c90ba7 /ast.c
parentfd7d82869eb42d086174ec02938b49e4f233c319 (diff)
downloadducc-9c12de31ab03385cea3b7bc78582ef4fdb9b22cc.tar.gz
ducc-9c12de31ab03385cea3b7bc78582ef4fdb9b22cc.tar.zst
ducc-9c12de31ab03385cea3b7bc78582ef4fdb9b22cc.zip
feat: grow dynamic array
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/ast.c b/ast.c
index a6fb722..8562088 100644
--- a/ast.c
+++ b/ast.c
@@ -198,7 +198,8 @@ enum AstNodeKind {
typedef enum AstNodeKind AstNodeKind;
#define node_items __n1
-#define node_len __i
+#define node_len __i1
+#define node_cap __i2
#define node_expr __n1
#define node_lhs __n1
#define node_rhs __n2
@@ -212,10 +213,10 @@ typedef enum AstNodeKind AstNodeKind;
#define node_members __n1
#define node_params __n1
#define node_args __n1
-#define node_int_value __i
-#define node_idx __i
-#define node_op __i
-#define node_stack_offset __i
+#define node_int_value __i1
+#define node_idx __i1
+#define node_op __i1
+#define node_stack_offset __i1
struct AstNode {
AstNodeKind kind;
@@ -225,7 +226,8 @@ struct AstNode {
struct AstNode* __n2;
struct AstNode* __n3;
struct AstNode* __n4;
- int __i;
+ int __i1;
+ int __i2;
};
typedef struct AstNode AstNode;
@@ -243,9 +245,12 @@ AstNode* ast_new(AstNodeKind kind) {
}
AstNode* ast_new_list(int capacity) {
+ if (capacity == 0)
+ unreachable();
AstNode* list = ast_new(AstNodeKind_list);
- list->node_items = calloc(capacity, sizeof(AstNode));
+ list->node_cap = capacity;
list->node_len = 0;
+ list->node_items = calloc(list->node_cap, sizeof(AstNode));
return list;
}
@@ -256,6 +261,11 @@ void ast_append(AstNode* list, AstNode* item) {
if (!item) {
return;
}
+ if (list->node_cap <= list->node_len) {
+ list->node_cap *= 2;
+ list->node_items = realloc(list->node_items, sizeof(AstNode) * list->node_cap);
+ memset(list->node_items + list->node_len, 0, sizeof(AstNode) * (list->node_cap - list->node_len));
+ }
memcpy(list->node_items + list->node_len, item, sizeof(AstNode));
++list->node_len;
}