fix: broken conditionals
This commit is contained in:
parent
b231e66b49
commit
97a43f63eb
33 changed files with 358 additions and 313 deletions
24
src/Sema.zig
24
src/Sema.zig
|
|
@ -563,6 +563,7 @@ fn irDeclRef(
|
|||
fn irAlloc(_: *Sema, builder: *Builder, _: Ir.Inst.Index) InnerError!ValueInfo {
|
||||
// TODO: Add constraints on how many temporaries we can have.
|
||||
// max(u8) or max(u16) are most likey appropriate.
|
||||
builder.code.locals_count += 1;
|
||||
return .{ .temp = builder.addStackSlot() };
|
||||
}
|
||||
|
||||
|
|
@ -608,8 +609,8 @@ fn irCondBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!Valu
|
|||
const else_label = try builder.addLabel();
|
||||
const end_label = try builder.addLabel();
|
||||
const condition = sema.resolveInst(extra.data.condition);
|
||||
if (condition != .none) try builder.ensureLoad(condition);
|
||||
|
||||
try builder.ensureLoad(condition);
|
||||
try builder.addFixup(.jmp_f, else_label);
|
||||
try builder.addByteOp(.pop);
|
||||
_ = try analyzeBodyInner(sema, builder, then_body, false);
|
||||
|
|
@ -636,16 +637,18 @@ fn irBlock(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void
|
|||
}
|
||||
|
||||
fn irSwitchBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void {
|
||||
const gpa = sema.gpa;
|
||||
const data = sema.ir.instructions[@intFromEnum(inst)].data.payload;
|
||||
const extra = sema.ir.extraData(Ir.Inst.SwitchBr, data.extra_index);
|
||||
const cases_slice = sema.ir.bodySlice(extra.end, extra.data.cases_len);
|
||||
|
||||
var case_labels: std.ArrayListUnmanaged(usize) = .empty;
|
||||
try case_labels.ensureUnusedCapacity(sema.gpa, cases_slice.len + 1);
|
||||
defer case_labels.deinit(sema.gpa);
|
||||
try case_labels.ensureUnusedCapacity(gpa, cases_slice.len + 1);
|
||||
defer case_labels.deinit(gpa);
|
||||
|
||||
const condition = sema.resolveInst(extra.data.operand);
|
||||
if (condition != .none) try builder.ensureLoad(condition);
|
||||
|
||||
// TODO: Do something with this value?
|
||||
//const condition = builder.resolveInst(extra.data.operand);
|
||||
const exit_label = try builder.addLabel();
|
||||
const cmp_var = builder.addStackSlot();
|
||||
try builder.addConstOp(.store, cmp_var);
|
||||
|
|
@ -699,13 +702,14 @@ fn irContentFlush(_: *Sema, builder: *Builder, _: Ir.Inst.Index) InnerError!void
|
|||
}
|
||||
|
||||
fn irChoiceBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void {
|
||||
const gpa = sema.gpa;
|
||||
const data = sema.ir.instructions[@intFromEnum(inst)].data.payload;
|
||||
const choice_extra = sema.ir.extraData(Ir.Inst.ChoiceBr, data.extra_index);
|
||||
const options_slice = sema.ir.bodySlice(choice_extra.end, choice_extra.data.cases_len);
|
||||
|
||||
var branch_labels: std.ArrayListUnmanaged(usize) = .empty;
|
||||
try branch_labels.ensureUnusedCapacity(sema.gpa, options_slice.len + 1);
|
||||
defer branch_labels.deinit(sema.gpa);
|
||||
try branch_labels.ensureUnusedCapacity(gpa, options_slice.len + 1);
|
||||
defer branch_labels.deinit(gpa);
|
||||
|
||||
for (options_slice) |option_index| {
|
||||
const case_extra = sema.ir.extraData(Ir.Inst.ChoiceBr.Case, @intFromEnum(option_index));
|
||||
|
|
@ -766,8 +770,10 @@ fn irChoiceBr(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!vo
|
|||
|
||||
fn irRet(sema: *Sema, builder: *Builder, inst: Ir.Inst.Index) InnerError!void {
|
||||
const data = sema.ir.instructions[@intFromEnum(inst)].data.un;
|
||||
const value = sema.resolveInst(data.lhs);
|
||||
if (value != .none) try builder.ensureLoad(value);
|
||||
if (data.lhs.toIndexAllowNone()) |index| {
|
||||
const value = sema.inst_map.get(index).?;
|
||||
if (value != .none) try builder.ensureLoad(value);
|
||||
}
|
||||
try builder.addByteOp(.ret);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue