diff --git a/base_data_structures.cpp b/base_data_structures.cpp index af85a11..2457011 100644 --- a/base_data_structures.cpp +++ b/base_data_structures.cpp @@ -38,6 +38,10 @@ struct Array { } } + void dealloc() { + deallocate(allocator, data); + } + S64 get_index(T *item) { assert((data <= item) && ((data + len) > item)); size_t offset = item - data; @@ -50,10 +54,6 @@ struct Array { } } - void reset() { - len = 0; - } - void add(T item) { grow(1); data[len++] = item; @@ -101,6 +101,7 @@ struct Array { force_inline B32 is_last(T *item) { return item == last(); } force_inline B32 is_first(T *item) { return item == begin(); } force_inline void clear() { len = 0; } + force_inline void reset() { len = 0; } force_inline T pop() { return data[--len]; } force_inline T *last() { return data + len - 1; } force_inline T *begin() { return data; } diff --git a/base_string.cpp b/base_string.cpp index 4347931..02d3df6 100644 --- a/base_string.cpp +++ b/base_string.cpp @@ -147,14 +147,12 @@ struct String_Builder { U64 di; void reset() { - for (;;) { + for (; first;) { auto *block = first; first = first->next; block->next = first_free; first_free = block; - - if (!first) break; } last = 0; diff --git a/core_codegen_c_language.cpp b/core_codegen_c_language.cpp index c42f418..ac382cf 100644 --- a/core_codegen_c_language.cpp +++ b/core_codegen_c_language.cpp @@ -828,6 +828,35 @@ CORE_Static String compile_to_c_code() { pctx->time.code_generation = os_time(); + For(pctx->ordered_decls) { + for (Ast_Iter iter = iterate_depth_first(pctx->heap, it); iter.ast; next(&iter)) { + Ast_Decl *decl = (Ast_Decl *)iter.ast; + switch (iter.kind) { + case AST_STRUCT: { + genln("(struct %s", decl->name.str); + global_indent += 1; + } break; + case AST_STRUCT + 128: { + global_indent -= 1; + genln(")"); + } break; + case AST_VAR: { + genln("(var %s: ", decl->name.str); + auto typespec = (Ast_Atom *)decl->typespec; + Ast_Decl *type = typespec->resolved_decl; + assert(typespec); + gen("%s", type->name.str); + } break; + case AST_VAR + 128: { + gen(")"); + } break; + } + } + String str = string_flatten(pctx->perm, &pctx->gen); + printf("%s", str.str); + pctx->gen.reset(); + } + prefixed_string_type = string_fmt(pctx->perm, "%QString", pctx->symbol_prefix); if (pctx->single_header_library_mode) { gen(R"( diff --git a/core_polymorph.cpp b/core_polymorph.cpp index 21ee711..d5090cd 100644 --- a/core_polymorph.cpp +++ b/core_polymorph.cpp @@ -24,6 +24,7 @@ struct Ast_Iter { Ast *ast; Ast_Kind kind; uint32_t visit_id; + uint32_t di; }; uint32_t Ast_Iter_VisitIDGen; @@ -32,6 +33,8 @@ Ast_Iter iterate_depth_first(Allocator *a, Ast *ast) { result.stack = {a}; result.stack.add(ast); result.visit_id = ++Ast_Iter_VisitIDGen; + void next(Ast_Iter * iter); + next(&result); return result; } @@ -39,11 +42,13 @@ void next(Ast_Iter *iter) { if (iter->stack.len <= 0) { iter->ast = 0; iter->kind = AST_NONE; + iter->stack.dealloc(); return; } Ast *ast = iter->stack.pop(); assert(ast != 0); + iter->di += 1; iter->ast = ast; iter->kind = ast->kind; if (ast->visit_id == iter->visit_id) { @@ -54,13 +59,9 @@ void next(Ast_Iter *iter) { switch (iter->kind) { case AST_SCOPE: { Ast_Scope *node = (Ast_Scope *)ast; - For(node->decls) { - iter->stack.add(it); - } - For(node->stmts) { - iter->stack.add(it); - } iter->stack.add(node); + For(node->stmts) iter->stack.add(it); + For(node->decls) iter->stack.add(it); } break; case AST_MODULE: invalid_codepath; break; @@ -73,44 +74,38 @@ void next(Ast_Iter *iter) { case AST_INDEX: { Ast_Index *node = (Ast_Index *)ast; - iter->stack.add(node->expr); - iter->stack.add(node->index); iter->stack.add(node); + iter->stack.add(node->index); + iter->stack.add(node->expr); } break; case AST_UNARY: { Ast_Unary *node = (Ast_Unary *)ast; - iter->stack.add(node->expr); iter->stack.add(node); + iter->stack.add(node->expr); } break; case AST_BINARY: { Ast_Binary *node = (Ast_Binary *)ast; - iter->stack.add(node->left); - iter->stack.add(node->right); iter->stack.add(node); + iter->stack.add(node->right); + iter->stack.add(node->left); } break; case AST_CALL_ITEM: { Ast_Call_Item *node = (Ast_Call_Item *)ast; - iter->stack.add(node->item); - if (node->call_flags & CALL_INDEX) { - iter->stack.add(node->index); - } - else if (node->call_flags & CALL_NAME) { - iter->stack.add(node->name); - } iter->stack.add(node); + iter->stack.add(node->item); + if (node->call_flags & CALL_INDEX) iter->stack.add(node->index); + else if (node->call_flags & CALL_NAME) iter->stack.add(node->name); } break; case AST_COMPOUND: case AST_CALL: { Ast_Call *node = (Ast_Call *)ast; - iter->stack.add(node->name); - For(node->exprs) { - iter->stack.add(it); - } iter->stack.add(node); + For(node->exprs) iter->stack.add(it); + iter->stack.add(node->name); } break; case AST_TYPE_OF: @@ -120,30 +115,30 @@ void next(Ast_Iter *iter) { case AST_RUNTIME_ASSERT: case AST_CONSTANT_ASSERT: { Ast_Builtin *node = (Ast_Builtin *)ast; - iter->stack.add(node->expr); iter->stack.add(node); + iter->stack.add(node->expr); } break; case AST_SWITCH: { Ast_Switch *node = (Ast_Switch *)ast; - iter->stack.add(node->value); - For(node->cases) iter->stack.add(it); - iter->stack.add(node->default_scope); iter->stack.add(node); + iter->stack.add(node->default_scope); + For(node->cases) iter->stack.add(it); + iter->stack.add(node->value); } break; case AST_SWITCH_CASE: { Ast_Switch_Case *node = (Ast_Switch_Case *)ast; - For(node->labels) iter->stack.add(it); - iter->stack.add(node->scope); iter->stack.add(node); + iter->stack.add(node->scope); + For(node->labels) iter->stack.add(it); } break; case AST_VAR_UNPACK: { Ast_Var_Unpack *node = (Ast_Var_Unpack *)ast; - For(node->vars) iter->stack.add(it); - iter->stack.add(node->expr); iter->stack.add(node); + iter->stack.add(node->expr); + For(node->vars) iter->stack.add(it); } break; case AST_PASS: @@ -161,10 +156,10 @@ void next(Ast_Iter *iter) { case AST_VAR: { Ast_Decl *node = (Ast_Decl *)ast; - iter->stack.add(node->typespec); - iter->stack.add(node->expr); - iter->stack.add(node->scope); iter->stack.add(node); + if (node->scope) iter->stack.add(node->scope); + if (node->expr) iter->stack.add(node->expr); + if (node->typespec) iter->stack.add(node->typespec); // omitting polymorphs // omitting polymorph parameters @@ -172,46 +167,45 @@ void next(Ast_Iter *iter) { case AST_ARRAY: { Ast_Array *node = (Ast_Array *)ast; - iter->stack.add(node->expr); iter->stack.add(node); - // dst->expr = (Ast_Expr *)ast_copy(node->expr, parent_scope); + iter->stack.add(node->expr); } break; case AST_FOR: { Ast_For *node = (Ast_For *)ast; - if (node->init) iter->stack.add(node->init); - if (node->cond) iter->stack.add(node->cond); - if (node->iter) iter->stack.add(node->iter); - iter->stack.add(node->scope); iter->stack.add(node); + iter->stack.add(node->scope); + if (node->iter) iter->stack.add(node->iter); + if (node->cond) iter->stack.add(node->cond); + if (node->init) iter->stack.add(node->init); } break; case AST_IF: { Ast_If *node = (Ast_If *)ast; - For(node->ifs) iter->stack.add(it); iter->stack.add(node); + For(node->ifs) iter->stack.add(it); } break; case AST_IF_NODE: { Ast_If_Node *node = (Ast_If_Node *)ast; - if (node->init) iter->stack.add(node->init); - iter->stack.add(node->expr); - iter->stack.add(node->scope); iter->stack.add(node); + iter->stack.add(node->scope); + iter->stack.add(node->expr); + if (node->init) iter->stack.add(node->init); } break; case AST_RETURN: { Ast_Return *node = (Ast_Return *)ast; - For(node->expr) iter->stack.add(it); iter->stack.add(node); + For(node->expr) iter->stack.add(it); } break; case AST_LAMBDA_EXPR: { Ast_Lambda *node = (Ast_Lambda *)ast; - For(node->args) iter->stack.add(it); - For(node->ret) iter->stack.add(it); - iter->stack.add(node->scope); iter->stack.add(node); + iter->stack.add(node->scope); + For(node->ret) iter->stack.add(it); + For(node->args) iter->stack.add(it); } break; } }