diff options
| author | gingerBill <bill@gingerbill.org> | 2023-07-19 15:37:33 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-07-19 15:37:33 +0100 |
| commit | fb041033528ca03d1a3240cd1e4712b0d57a959c (patch) | |
| tree | b5263250e9c09405d2e88427e5a1a08c3809bd51 /src/tilde_proc.cpp | |
| parent | 9abf43b0d29abf3c560cd26081fb4adf0b38a5c6 (diff) | |
Add `defer` statements; add implicit `context` pointer to context stack
Diffstat (limited to 'src/tilde_proc.cpp')
| -rw-r--r-- | src/tilde_proc.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/tilde_proc.cpp b/src/tilde_proc.cpp index 2bb18a2de..e2764bc50 100644 --- a/src/tilde_proc.cpp +++ b/src/tilde_proc.cpp @@ -181,11 +181,8 @@ gb_internal void cg_procedure_begin(cgProcedure *p) { GB_ASSERT(p->type->kind == Type_Proc); TypeProc *pt = &p->type->Proc; - if (pt->params == nullptr) { - return; - } int param_index = 0; - for (Entity *e : pt->params->Tuple.variables) { + if (pt->params != nullptr) for (Entity *e : pt->params->Tuple.variables) { if (e->kind != Entity_Variable) { continue; } @@ -247,6 +244,28 @@ gb_internal void cg_procedure_begin(cgProcedure *p) { // } // } } + + if (p->type->Proc.calling_convention == ProcCC_Odin) { + // NOTE(bill): Push context on to stack from implicit parameter + + String name = str_lit("__.context_ptr"); + + Entity *e = alloc_entity_param(nullptr, make_token_ident(name), t_context_ptr, false, false); + e->flags |= EntityFlag_NoAlias; + + TB_Node *param = p->param_nodes[p->param_nodes.count-1]; + param = tb_inst_load(p->func, TB_TYPE_PTR, param, cast(TB_CharUnits)build_context.ptr_size, false); + + cgValue local = cg_value(param, t_context_ptr); + cgAddr addr = cg_addr(local); + map_set(&p->variable_map, e, addr); + + + cgContextData *cd = array_add_and_get(&p->context_stack); + cd->ctx = addr; + cd->scope_index = -1; + cd->uses = +1; // make sure it has been used already + } } gb_internal void cg_procedure_end(cgProcedure *p) { |