typedef struct AstCompound AstCompound;
typedef struct AstDirectiveSolidify AstDirectiveSolidify;
+typedef struct AstStaticIf AstStaticIf;
typedef struct AstReturn AstReturn;
typedef struct AstJump AstJump;
Ast_Kind_Switch_Case,
Ast_Kind_Directive_Solidify,
+ Ast_Kind_Static_If,
Ast_Kind_Count
} AstKind;
bh_table(AstSolidifiedFunction) concrete_funcs;
};
+
+struct AstStaticIf {
+ AstNode_base;
+
+ AstTyped* cond;
+
+ bh_arr(struct Entity *) true_entities;
+ bh_arr(struct Entity *) false_entities;
+};
+
+
+
+
extern AstNode empty_node;
typedef enum EntityState {
Entity_State_Parse_Builtin,
Entity_State_Introduce_Symbols,
Entity_State_Parse,
+ Entity_State_Comptime_Resolve_Symbols,
+ Entity_State_Comptime_Check_Types,
Entity_State_Resolve_Symbols,
Entity_State_Check_Types,
Entity_State_Code_Gen,
} Entity;
typedef struct EntityHeap {
- bh_arr(Entity) entities;
+ bh_arena entity_arena;
+ bh_arr(Entity *) entities;
i32 state_count[Entity_State_Count];
} EntityHeap;
+void entity_heap_init(EntityHeap* entities);
+void entity_heap_insert_existing(EntityHeap* entities, Entity* e);
void entity_heap_insert(EntityHeap* entities, Entity e);
-Entity entity_heap_top(EntityHeap* entities);
-void entity_heap_change_top(EntityHeap* entities, Entity new_top);
+Entity* entity_heap_top(EntityHeap* entities);
+void entity_heap_change_top(EntityHeap* entities, Entity* new_top);
void entity_heap_remove_top(EntityHeap* entities);
void add_entities_for_node(AstNode* node, Scope* scope, Package* package);
context.wasm_module = bh_alloc_item(global_heap_allocator, OnyxWasmModule);
*context.wasm_module = onyx_wasm_module_create(global_heap_allocator);
+ entity_heap_init(&context.entities);
+
// NOTE: Add builtin entities to pipeline.
entity_heap_insert(&context.entities, ((Entity) {
.state = Entity_State_Parse_Builtin,
printf("\e[2;1H");
for (i32 i = 0; i < Entity_State_Count - 1; i++) {
- printf("%20s (%4d) | ", entity_state_strings[i], eh->state_count[i]);
+ printf("%25s (%4d) | ", entity_state_strings[i], eh->state_count[i]);
printf("\e[0K");
for (i32 c = 0; c < eh->state_count[i] * 50 / bh_arr_length(eh->entities); c++) printf("\xe2\x96\x88");
printf("\e[2J");
while (!bh_arr_is_empty(context.entities.entities)) {
- Entity ent = entity_heap_top(&context.entities);
+ Entity* ent = entity_heap_top(&context.entities);
entity_heap_remove_top(&context.entities);
#if defined(_BH_LINUX)
if (context.options->fun_output) {
output_dummy_progress_bar();
- if (ent.expr->token) {
- OnyxFilePos pos = ent.expr->token->pos;
- printf("\e[0K%s on %s in %s:%d:%d\n", entity_state_strings[ent.state], entity_type_strings[ent.type], pos.filename, pos.line, pos.column);
+ if (ent->expr->token) {
+ OnyxFilePos pos = ent->expr->token->pos;
+ printf("\e[0K%s on %s in %s:%d:%d\n", entity_state_strings[ent->state], entity_type_strings[ent->type], pos.filename, pos.line, pos.column);
}
// Slowing things down for the effect
}
#endif
- b32 changed = process_entity(&ent);
+ b32 changed = process_entity(ent);
if (onyx_has_errors()) return ONYX_COMPILER_PROGRESS_ERROR;
- if (changed && ent.state != Entity_State_Finalized)
- entity_heap_insert(&context.entities, ent);
+ if (changed && ent->state != Entity_State_Finalized)
+ entity_heap_insert_existing(&context.entities, ent);
}
// NOTE: Output to file
"SWITCH",
"SWITCH CASE",
+ "SOLIDIFY",
+ "STATIC IF",
+
"AST_NODE_KIND_COUNT",
};
"Parse Builtin",
"Introduce Symbols",
"Parse",
+ "Resolve Static Symbols",
+ "Check Static Types",
"Resolve Symbols",
"Check Types",
"Code Gen",
AstFieldAccess* field = *pfield;
CHECK(expression, &field->expr);
if (field->expr->type == NULL) {
- onyx_report_error(field->token->pos, "Unable able to deduce type of expression for accessing field.");
+ onyx_report_error(field->token->pos, "Unable to deduce type of expression for accessing field.");
return Check_Error;
}
#define eh_rchild(index) (((index) * 2) + 2)
static void eh_shift_up(EntityHeap* entities, i32 index) {
- while (index > 0 && entity_compare(&entities->entities[eh_parent(index)], &entities->entities[index]) > 0) {
- Entity tmp = entities->entities[eh_parent(index)];
+ while (index > 0 && entity_compare(entities->entities[eh_parent(index)], entities->entities[index]) > 0) {
+ Entity* tmp = entities->entities[eh_parent(index)];
entities->entities[eh_parent(index)] = entities->entities[index];
entities->entities[index] = tmp;
i32 l = eh_lchild(index);
if (l < bh_arr_length(entities->entities)
- && entity_compare(&entities->entities[l], &entities->entities[min_index]) < 0) {
+ && entity_compare(entities->entities[l], entities->entities[min_index]) < 0) {
min_index = l;
}
i32 r = eh_rchild(index);
if (r < bh_arr_length(entities->entities)
- && entity_compare(&entities->entities[r], &entities->entities[min_index]) < 0) {
+ && entity_compare(entities->entities[r], entities->entities[min_index]) < 0) {
min_index = r;
}
if (index != min_index) {
- Entity tmp = entities->entities[min_index];
+ Entity* tmp = entities->entities[min_index];
entities->entities[min_index] = entities->entities[index];
entities->entities[index] = tmp;
}
}
-void entity_heap_insert(EntityHeap* entities, Entity e) {
+void entity_heap_init(EntityHeap* entities) {
+ bh_arena_init(&entities->entity_arena, global_heap_allocator, 32 * 1024);
+}
+
+// nocheckin
+// Allocates the entity in the entity heap. Don't quite feel this is necessary...
+Entity* entity_heap_register(EntityHeap* entities, Entity e) {
+ bh_allocator alloc = bh_arena_allocator(&entities->entity_arena);
+ Entity* entity = bh_alloc_item(alloc, Entity);
+ *entity = e;
+
+ return entity;
+}
+
+void entity_heap_insert_existing(EntityHeap* entities, Entity* e) {
if (entities->entities == NULL) {
bh_arr_new(global_heap_allocator, entities->entities, 128);
}
bh_arr_push(entities->entities, e);
eh_shift_up(entities, bh_arr_length(entities->entities) - 1);
- entities->state_count[e.state]++;
+ entities->state_count[e->state]++;
+}
+
+// nocheckin
+// Temporary wrapper
+void entity_heap_insert(EntityHeap* entities, Entity e) {
+ Entity* entity = entity_heap_register(entities, e);
+ entity_heap_insert_existing(entities, entity);
}
-Entity entity_heap_top(EntityHeap* entities) {
+Entity* entity_heap_top(EntityHeap* entities) {
return entities->entities[0];
}
-void entity_heap_change_top(EntityHeap* entities, Entity new_top) {
- entities->state_count[entities->entities[0].state]--;
- entities->state_count[new_top.state]--;
+void entity_heap_change_top(EntityHeap* entities, Entity* new_top) {
+ entities->state_count[entities->entities[0]->state]--;
+ entities->state_count[new_top->state]--;
entities->entities[0] = new_top;
eh_shift_down(entities, 0);
}
void entity_heap_remove_top(EntityHeap* entities) {
- entities->state_count[entities->entities[0].state]--;
+ entities->state_count[entities->entities[0]->state]--;
entities->entities[0] = entities->entities[bh_arr_length(entities->entities) - 1];
bh_arr_pop(entities->entities);