fixing yet another edge case

This commit is contained in:
Jakub Doka 2024-11-10 20:30:35 +01:00
parent c61efc3933
commit b6274f3455
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
3 changed files with 58 additions and 42 deletions

View file

@ -617,12 +617,14 @@ main := fn(): uint {
#### storing_into_nullable_struct
```hb
StructA := struct {b: StructB}
StructA := struct {b: StructB, c: ^uint, d: uint}
StructB := struct {c: uint}
StructB := struct {g: ^uint, c: StructC}
StructC := struct {c: uint}
optionala := fn(): ?StructA {
return .(.(1))
return .(.(&0, .(1)), &0, 0)
}
Struct := struct {inner: uint}
@ -635,13 +637,17 @@ do_stuff := fn(arg: uint): uint {
return arg
}
just_read := fn(s: StructA): void {
}
main := fn(): uint {
a := optionala()
if a == null {
return 10
}
a.b = .(0)
innera := do_stuff(a.b.c)
a.b.c = .(0)
just_read(a)
innera := do_stuff(a.b.c.c)
val := optional()
if val == null {

View file

@ -1247,20 +1247,22 @@ impl Nodes {
},
);
let size = tys.size_of(ty);
let mut offset = 0;
loop {
break match s[region].kind {
_ if region == loc => 0..size as usize,
match s[region].kind {
_ if region == loc => {
break offset as usize..offset as usize + size as usize
}
Kind::Assert { kind: AssertKind::NullCheck, .. } => {
region = s[region].inputs[2];
continue;
region = s[region].inputs[2]
}
Kind::BinOp { op: TokenKind::Add | TokenKind::Sub }
if let Kind::CInt { value } = s[s[region].inputs[2]].kind
&& s[region].inputs[1] == loc =>
if let Kind::CInt { value } = s[s[region].inputs[2]].kind =>
{
value as usize..value as usize + size as usize
offset += value;
region = s[region].inputs[1];
}
_ => 0..full_size as usize,
_ => break 0..full_size as usize,
};
}
}
@ -1280,6 +1282,8 @@ impl Nodes {
if range.start >= load_range.end || range.end <= load_range.start {
cursor = self[cursor].inputs[3];
} else {
let reg = self.aclass_index(self[cursor].inputs[2]).1;
self[reg].peep_triggers.push(target);
break;
}
}
@ -4327,7 +4331,7 @@ impl<'a> Codegen<'a> {
self.ci.nodes.basic_blocks();
self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID));
} else {
//self.ci.nodes.graphviz_in_browser(self.ty_display(ty::Id::VOID));
self.ci.nodes.graphviz_in_browser(self.ty_display(ty::Id::VOID));
}
self.errors.borrow().len() == prev_err_len

View file

@ -1,40 +1,42 @@
do_stuff:
CP r1, r2
JALA r0, r31, 0a
just_read:
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -104d
ST r31, r254, 32a, 72h
ADDI64 r254, r254, -120d
ST r31, r254, 48a, 72h
ADDI64 r32, r254, 16d
CP r1, r32
JAL r31, r0, :optionala
ST r1, r254, 16a, 16h
LI8 r33, 0b
LD r34, r254, 16a, 1h
ANDI r34, r34, 255d
ANDI r33, r33, 255d
CP r2, r32
LI64 r33, 0d
LD r34, r254, 16a, 8h
JNE r34, r33, :0
LI64 r1, 10d
JMP :1
0: LI64 r35, 0d
ST r35, r254, 24a, 8h
0: ST r33, r254, 24a, 8h
JAL r31, r0, :just_read
LD r2, r254, 24a, 8h
JAL r31, r0, :do_stuff
CP r36, r1
ADDI64 r37, r254, 0d
CP r35, r1
ADDI64 r36, r254, 0d
JAL r31, r0, :optional
ST r1, r254, 0a, 16h
LI8 r37, 0b
LD r38, r254, 0a, 1h
ANDI r38, r38, 255d
ANDI r33, r33, 255d
JNE r38, r33, :2
ANDI r37, r37, 255d
JNE r38, r37, :2
LI64 r1, 20d
JMP :1
2: LI64 r39, 100d
ST r39, r254, 8a, 8h
LD r2, r254, 8a, 8h
JAL r31, r0, :do_stuff
ADD64 r1, r1, r36
1: LD r31, r254, 32a, 72h
ADDI64 r254, r254, 104d
ADD64 r1, r1, r35
1: LD r31, r254, 48a, 72h
ADDI64 r254, r254, 120d
JALA r0, r31, 0a
optional:
ADDI64 r254, r254, -16d
@ -47,18 +49,22 @@ optional:
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
optionala:
ADDI64 r254, r254, -24d
ADDI64 r1, r254, 0d
LI64 r3, 1d
LI8 r7, 1b
ADDI64 r6, r254, 8d
ST r3, r254, 0a, 8h
ST r7, r254, 8a, 1h
ADDI64 r11, r6, 8d
BMC r1, r11, 8h
LD r1, r6, 0a, 16h
ADDI64 r254, r254, 24d
ADDI64 r254, r254, -56d
ADDI64 r7, r254, 0d
LI64 r8, 1d
ADDI64 r9, r254, 16d
ADDI64 r6, r254, 24d
ST r8, r254, 0a, 8h
ST r9, r254, 24a, 8h
ADDI64 r3, r6, 8d
BMC r7, r3, 8h
ADDI64 r4, r254, 8d
ST r4, r254, 40a, 8h
LI64 r2, 0d
ST r2, r254, 48a, 8h
BMC r6, r1, 32h
ADDI64 r254, r254, 56d
JALA r0, r31, 0a
code size: 568
code size: 604
ret: 100
status: Ok(())