typedef struct AstNodeAssign AstNodeAssign;
typedef struct AstNodeNumLit AstNodeNumLit;
typedef struct AstNodeLocal AstNodeLocal;
-typedef struct AstNodeScope AstNodeScope;
+typedef struct AstNodeLocalGroup AstNodeLocalGroup;
typedef struct AstNodeReturn AstNodeReturn;
typedef struct AstNodeBlock AstNodeBlock;
typedef struct AstNodeIf AstNodeIf;
AST_NODE_KIND_FUNCTION,
AST_NODE_KIND_FOREIGN,
AST_NODE_KIND_BLOCK,
- AST_NODE_KIND_SCOPE,
+ AST_NODE_KIND_LOCAL_GROUP,
AST_NODE_KIND_LOCAL,
AST_NODE_KIND_GLOBAL,
AST_NODE_KIND_SYMBOL,
AstNodeTyped* expr;
};
-struct AstNodeScope {
+struct AstNodeLocalGroup {
AstNode base;
- AstNodeScope *prev_scope;
+ AstNodeLocalGroup *prev_group;
AstNodeLocal *last_local;
};
AstNode base;
AstNode *body;
- AstNodeScope *scope;
+ AstNodeLocalGroup *locals;
};
struct AstNodeIf {
OnyxMessages *msgs;
// NOTE: Used in symbol resolution phase
- AstNodeScope* curr_scope;
+ AstNodeLocalGroup* curr_local_group;
// NOTE: Used in type checking phase
TypeInfo* expected_return_type;
+ // NOTE: All symbols a given point that we can resolve
bh_table(SemPassSymbol *) symbols;
} OnyxSemPassState;
static AstNodeBlock* parse_block(OnyxParser* parser) {
AstNodeBlock* block = make_node(AstNodeBlock, AST_NODE_KIND_BLOCK);
- AstNodeScope* scope = make_node(AstNodeScope, AST_NODE_KIND_SCOPE);
- block->scope = scope;
+ AstNodeLocalGroup* lg = make_node(AstNodeLocalGroup, AST_NODE_KIND_LOCAL_GROUP);
+ block->locals = lg;
// --- is for an empty block
if (parser->curr_token->type == '-') {
.msgs = msgs,
- .curr_scope = NULL,
+ .curr_local_group = NULL,
.symbols = NULL,
};
bh_arr_set_length(traversal_queue, 0);
bh_arr_each(AstNodeFunction *, func, program->functions) {
- AstNodeScope* top_scope = (*func)->body->scope;
+ AstNodeLocalGroup* top_locals = (*func)->body->locals;
bh_arr_push(traversal_queue, (*func)->body);
while (!bh_arr_is_empty(traversal_queue)) {
} else {
- if (block->scope != top_scope && block->scope->last_local != NULL) {
- AstNodeLocal* last_local = block->scope->last_local;
+ if (block->locals != top_locals && block->locals->last_local != NULL) {
+ AstNodeLocal* last_local = block->locals->last_local;
while (last_local && last_local->prev_local != NULL) last_local = last_local->prev_local;
- last_local->prev_local = top_scope->last_local;
- top_scope->last_local = block->scope->last_local;
- block->scope->last_local = NULL;
+ last_local->prev_local = top_locals->last_local;
+ top_locals->last_local = block->locals->last_local;
+ block->locals->last_local = NULL;
}
AstNode* walker = block->body;
static b32 symbol_unique_introduce(OnyxSemPassState* state, AstNode* symbol);
static void symbol_remove(OnyxSemPassState* state, AstNode* symbol);
static AstNode* symbol_resolve(OnyxSemPassState* state, AstNode* symbol);
-static void scope_enter(OnyxSemPassState* state, AstNodeScope* scope);
-static AstNodeScope* scope_leave(OnyxSemPassState* state);
+static void local_group_enter(OnyxSemPassState* state, AstNodeLocalGroup* local_group);
+static void local_group_leave(OnyxSemPassState* state);
static void symres_local(OnyxSemPassState* state, AstNodeLocal** local);
static void symres_call(OnyxSemPassState* state, AstNodeCall* call);
static void symres_expression(OnyxSemPassState* state, AstNode** expr);
if (symbol->kind == AST_NODE_KIND_LOCAL) {
AstNodeLocal* local = (AstNodeLocal *) symbol;
- local->prev_local = state->curr_scope->last_local;
- state->curr_scope->last_local = local;
+ local->prev_local = state->curr_local_group->last_local;
+ state->curr_local_group->last_local = local;
}
onyx_token_null_toggle(symbol->token);
return sp_sym->node;
}
-static void scope_enter(OnyxSemPassState* state, AstNodeScope* scope) {
- scope->prev_scope = state->curr_scope;
- state->curr_scope = scope;
+static void local_group_enter(OnyxSemPassState* state, AstNodeLocalGroup* local_group) {
+ local_group->prev_group = state->curr_local_group;
+ state->curr_local_group = local_group;
}
-static AstNodeScope* scope_leave(OnyxSemPassState* state) {
- // NOTE: Can't leave a scope if there is no scope
- assert(state->curr_scope != NULL);
+static void local_group_leave(OnyxSemPassState* state) {
+ assert(state->curr_local_group != NULL);
- for (AstNodeLocal *walker = state->curr_scope->last_local; walker != NULL; walker = walker->prev_local) {
+ for (AstNodeLocal *walker = state->curr_local_group->last_local; walker != NULL; walker = walker->prev_local) {
symbol_remove(state, (AstNode *) walker);
}
- state->curr_scope = state->curr_scope->prev_scope;
- return state->curr_scope;
+ state->curr_local_group = state->curr_local_group->prev_group;
}
static b32 symbol_unique_introduce(OnyxSemPassState* state, AstNode* symbol) {
}
static void symres_block(OnyxSemPassState* state, AstNodeBlock* block) {
- scope_enter(state, block->scope);
+ local_group_enter(state, block->locals);
if (block->body)
symres_statement_chain(state, block->body, &block->body);
- scope_leave(state);
+ local_group_leave(state);
}
static void symres_function(OnyxSemPassState* state, AstNodeFunction* func) {
static void typecheck_block(OnyxSemPassState* state, AstNodeBlock* block) {
typecheck_statement_chain(state, block->body);
- forll(AstNodeLocal, local, block->scope->last_local, prev_local) {
+ forll(AstNodeLocal, local, block->locals->last_local, prev_local) {
if (!local->base.type->is_known) {
onyx_message_add(state->msgs,
ONYX_MESSAGE_TYPE_UNRESOLVED_TYPE,
}
+void onyx_ast_print(AstNode* node, i32 indent) {
+ assert(0);
+}
+#if 0
#define print_indent { if (indent > 0) bh_printf("\n"); for (int i = 0; i < indent; i++) bh_printf(" "); }
node = node->next;
}
}
+
+#endif
bh_arr(WasmInstruction) code = *pcode;
switch (stmt->kind) {
- case AST_NODE_KIND_SCOPE: break;
case AST_NODE_KIND_RETURN: compile_return(mod, &code, (AstNodeReturn *) stmt); break;
case AST_NODE_KIND_ASSIGNMENT: compile_assignment(mod, &code, (AstNodeAssign *) stmt); break;
case AST_NODE_KIND_IF: compile_if(mod, &code, (AstNodeIf *) stmt); break;
type->param_count = param_count;
// HACK ish thing
- memcpy(type->param_types, type_repr_buf, type->param_count);
+ memcpy(type->param_types, type_repr_buf, type->param_count);
bh_arr_push(mod->functypes, type);
// is the same as the order of the local_types above
u8* count = &wasm_func.locals.i32_count;
fori (ti, 0, 3) {
- forll (AstNodeLocal, local, fd->body->scope->last_local, prev_local) {
+ forll (AstNodeLocal, local, fd->body->locals->last_local, prev_local) {
if (onyx_type_to_wasm_type(local->base.type) == local_types[ti]) {
bh_imap_put(&mod->local_map, (u64) local, localidx++);