aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 07996433a..75c9cfc75 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -113,7 +113,7 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) {
if (node == nullptr) {
return nullptr;
}
- AstNode *n = gb_alloc_item(a, AstNode);
+ AstNode *n = alloc_ast_node(node->file, node->kind);
gb_memmove(n, node, gb_size_of(AstNode));
switch (n->kind) {
@@ -422,12 +422,13 @@ bool ast_node_expect(AstNode *node, AstNodeKind kind) {
// NOTE(bill): And this below is why is I/we need a new language! Discriminated unions are a pain in C/C++
AstNode *alloc_ast_node(AstFile *f, AstNodeKind kind) {
- gbArena *arena = &f->arena;
- if (gb_arena_size_remaining(arena, GB_DEFAULT_MEMORY_ALIGNMENT) <= gb_size_of(AstNode)) {
- // NOTE(bill): If a syntax error is so bad, just quit!
- gb_exit(1);
- }
- AstNode *node = gb_alloc_item(gb_arena_allocator(arena), AstNode);
+ Arena *arena = &global_ast_arena;
+ gbAllocator a = arena_allocator(arena);
+ AstNode *node = gb_alloc_item(a, AstNode);
+ gb_mutex_lock(&arena->mutex);
+ defer (gb_mutex_unlock(&arena->mutex));
+ arena->possible_used += ALIGN_UP(24 + ast_node_sizes[kind], 8);
+
node->kind = kind;
node->file = f;
return node;
@@ -3865,10 +3866,6 @@ ParseFileError init_ast_file(AstFile *f, String fullpath, TokenPos *err_pos) {
f->prev_token = f->tokens[f->curr_token_index];
f->curr_token = f->tokens[f->curr_token_index];
- // NOTE(bill): Is this big enough or too small?
- isize arena_size = gb_size_of(AstNode);
- arena_size *= 2*f->tokens.count;
- gb_arena_init_from_allocator(&f->arena, heap_allocator(), arena_size);
array_init(&f->comments, heap_allocator());
array_init(&f->imports, heap_allocator());
@@ -3879,7 +3876,6 @@ ParseFileError init_ast_file(AstFile *f, String fullpath, TokenPos *err_pos) {
void destroy_ast_file(AstFile *f) {
GB_ASSERT(f != nullptr);
- gb_arena_free(&f->arena);
array_free(&f->tokens);
array_free(&f->comments);
array_free(&f->imports);
@@ -4197,10 +4193,8 @@ void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNod
if (node->kind == AstNode_ExprStmt) {
AstNode *expr = node->ExprStmt.expr;
if (expr->kind == AstNode_CallExpr &&
- expr->CallExpr.proc->kind == AstNode_BasicDirective &&
- expr->CallExpr.proc->BasicDirective.name == "assert") {
-
- f->assert_decl_count += 1;
+ expr->CallExpr.proc->kind == AstNode_BasicDirective) {
+ f->directive_count += 1;
continue;
}
}
@@ -4224,7 +4218,6 @@ void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNod
ast_node(fl, ForeignImportDecl, node);
String file_str = fl->filepath.string;
- fl->base_dir = base_dir;
fl->fullpath = file_str;
if (fl->collection_name != "system") {