fixing nasety bug

This commit is contained in:
mlokr 2024-09-02 04:45:42 +02:00
parent 75dca64648
commit f172c33247
No known key found for this signature in database
GPG key ID: DEA147DDEE644993
3 changed files with 38 additions and 9 deletions

View file

@ -678,10 +678,23 @@ rect_line := fn(buffer: Buffer, pos: Point, tr: Transform, color: ColorBGRA, thi
return return
} }
random := @use("random.hb")
example := fn(): void {
loop {
random_x := @inline(random.integer, 0, 1024)
random_y := random.integer(0, 768)
a := @inline(screenidx, random_x, random_y)
break
}
return
}
main := fn(): int { main := fn(): int {
line(.(), .(0, 0), .(0, 0), .(0, 0), 10) line(.(), .(0, 0), .(0, 0), .(0, 0), 10)
rect_line(.(), .(0, 0), .(0, 0), .(0, 0), 10) rect_line(.(), .(0, 0), .(0, 0), .(0, 0), 10)
return example()
return 0
} }
// in module: screen.hb // in module: screen.hb
@ -690,4 +703,14 @@ screenidx := fn(orange: int): int {
return orange return orange
} }
// in module: random.hb
integer := fn(min: int, max: int): int {
rng := @eca(int, 3, 4)
if min != 0 | max != 0 {
return rng % (max - min + 1) + min
}
return rng
}
``` ```

View file

@ -8,7 +8,7 @@ use {
parser::{self, find_symbol, idfl, CtorField, Expr, ExprRef, FileId, Pos}, parser::{self, find_symbol, idfl, CtorField, Expr, ExprRef, FileId, Pos},
HashMap, HashMap,
}, },
std::{ops::Range, rc::Rc, usize}, std::{ops::Range, rc::Rc, u32, usize},
}; };
type Offset = u32; type Offset = u32;
@ -1981,7 +1981,7 @@ impl Codegen {
tk => Some(Value::ty(tk.compress())), tk => Some(Value::ty(tk.compress())),
}, },
E::Return { pos, val, .. } => { E::Return { pos, val, .. } => {
if let Some(val) = val { let ty = if let Some(val) = val {
let size = self.ci.ret.map_or(17, |ty| self.tys.size_of(ty)); let size = self.ci.ret.map_or(17, |ty| self.tys.size_of(ty));
let loc = match size { let loc = match size {
_ if self.ci.inline_ret_loc != Loc::default() => { _ if self.ci.inline_ret_loc != Loc::default() => {
@ -1991,12 +1991,16 @@ impl Codegen {
1..=16 => Some(Loc::reg(1)), 1..=16 => Some(Loc::reg(1)),
_ => Some(Loc::reg(self.ci.ret_reg.as_ref()).into_derefed()), _ => Some(Loc::reg(self.ci.ret_reg.as_ref()).into_derefed()),
}; };
let ty = self.expr_ctx(val, Ctx { ty: self.ci.ret, loc })?.ty; self.expr_ctx(val, Ctx { ty: self.ci.ret, loc })?.ty
} else {
ty::VOID.into()
};
match self.ci.ret { match self.ci.ret {
None => self.ci.ret = Some(ty), None => self.ci.ret = Some(ty),
Some(ret) => _ = self.assert_ty(pos, ty, ret), Some(ret) => _ = self.assert_ty(pos, ty, ret),
} }
}
self.ci.ret_relocs.push(Reloc::new(self.local_offset(), 1, 4)); self.ci.ret_relocs.push(Reloc::new(self.local_offset(), 1, 4));
self.output.emit(jmp(0)); self.output.emit(jmp(0));
None None
@ -3050,6 +3054,7 @@ impl Codegen {
if let Some(existing) = self.tys.syms.get(&SymKey { file, ident }) { if let Some(existing) = self.tys.syms.get(&SymKey { file, ident }) {
if let ty::Kind::Func(id) = existing.expand() if let ty::Kind::Func(id) = existing.expand()
&& let func = &mut self.tys.funcs[id as usize] && let func = &mut self.tys.funcs[id as usize]
&& func.offset != u32::MAX
&& let Err(idx) = task::unpack(func.offset) && let Err(idx) = task::unpack(func.offset)
{ {
func.offset = task::id(self.tasks.len()); func.offset = task::id(self.tasks.len());
@ -3438,6 +3443,7 @@ mod tests {
let layout = std::alloc::Layout::from_size_align(size, align).unwrap(); let layout = std::alloc::Layout::from_size_align(size, align).unwrap();
unsafe { std::alloc::dealloc(ptr as *mut u8, layout) }; unsafe { std::alloc::dealloc(ptr as *mut u8, layout) };
} }
3 => vm.write_reg(1, 42),
unknown => unreachable!("unknown ecall: {unknown:?}"), unknown => unreachable!("unknown ecall: {unknown:?}"),
}, },
Ok(ev) => writeln!(output, "ev: {:?}", ev).unwrap(), Ok(ev) => writeln!(output, "ev: {:?}", ev).unwrap(),

View file

@ -1,3 +1,3 @@
code size: 1043 code size: 1521
ret: 0 ret: 0
status: Ok(()) status: Ok(())