fixing yet another edge case
This commit is contained in:
parent
c61efc3933
commit
b6274f3455
|
@ -617,12 +617,14 @@ main := fn(): uint {
|
||||||
|
|
||||||
#### storing_into_nullable_struct
|
#### storing_into_nullable_struct
|
||||||
```hb
|
```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 {
|
optionala := fn(): ?StructA {
|
||||||
return .(.(1))
|
return .(.(&0, .(1)), &0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
Struct := struct {inner: uint}
|
Struct := struct {inner: uint}
|
||||||
|
@ -635,13 +637,17 @@ do_stuff := fn(arg: uint): uint {
|
||||||
return arg
|
return arg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
just_read := fn(s: StructA): void {
|
||||||
|
}
|
||||||
|
|
||||||
main := fn(): uint {
|
main := fn(): uint {
|
||||||
a := optionala()
|
a := optionala()
|
||||||
if a == null {
|
if a == null {
|
||||||
return 10
|
return 10
|
||||||
}
|
}
|
||||||
a.b = .(0)
|
a.b.c = .(0)
|
||||||
innera := do_stuff(a.b.c)
|
just_read(a)
|
||||||
|
innera := do_stuff(a.b.c.c)
|
||||||
|
|
||||||
val := optional()
|
val := optional()
|
||||||
if val == null {
|
if val == null {
|
||||||
|
|
|
@ -1247,20 +1247,22 @@ impl Nodes {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
let size = tys.size_of(ty);
|
let size = tys.size_of(ty);
|
||||||
|
let mut offset = 0;
|
||||||
loop {
|
loop {
|
||||||
break match s[region].kind {
|
match s[region].kind {
|
||||||
_ if region == loc => 0..size as usize,
|
_ if region == loc => {
|
||||||
|
break offset as usize..offset as usize + size as usize
|
||||||
|
}
|
||||||
Kind::Assert { kind: AssertKind::NullCheck, .. } => {
|
Kind::Assert { kind: AssertKind::NullCheck, .. } => {
|
||||||
region = s[region].inputs[2];
|
region = s[region].inputs[2]
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
Kind::BinOp { op: TokenKind::Add | TokenKind::Sub }
|
Kind::BinOp { op: TokenKind::Add | TokenKind::Sub }
|
||||||
if let Kind::CInt { value } = s[s[region].inputs[2]].kind
|
if let Kind::CInt { value } = s[s[region].inputs[2]].kind =>
|
||||||
&& s[region].inputs[1] == loc =>
|
|
||||||
{
|
{
|
||||||
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 {
|
if range.start >= load_range.end || range.end <= load_range.start {
|
||||||
cursor = self[cursor].inputs[3];
|
cursor = self[cursor].inputs[3];
|
||||||
} else {
|
} else {
|
||||||
|
let reg = self.aclass_index(self[cursor].inputs[2]).1;
|
||||||
|
self[reg].peep_triggers.push(target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4327,7 +4331,7 @@ impl<'a> Codegen<'a> {
|
||||||
self.ci.nodes.basic_blocks();
|
self.ci.nodes.basic_blocks();
|
||||||
self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID));
|
self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID));
|
||||||
} else {
|
} 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
|
self.errors.borrow().len() == prev_err_len
|
||||||
|
|
|
@ -1,40 +1,42 @@
|
||||||
do_stuff:
|
do_stuff:
|
||||||
CP r1, r2
|
CP r1, r2
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
|
just_read:
|
||||||
|
JALA r0, r31, 0a
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -104d
|
ADDI64 r254, r254, -120d
|
||||||
ST r31, r254, 32a, 72h
|
ST r31, r254, 48a, 72h
|
||||||
ADDI64 r32, r254, 16d
|
ADDI64 r32, r254, 16d
|
||||||
|
CP r1, r32
|
||||||
JAL r31, r0, :optionala
|
JAL r31, r0, :optionala
|
||||||
ST r1, r254, 16a, 16h
|
CP r2, r32
|
||||||
LI8 r33, 0b
|
LI64 r33, 0d
|
||||||
LD r34, r254, 16a, 1h
|
LD r34, r254, 16a, 8h
|
||||||
ANDI r34, r34, 255d
|
|
||||||
ANDI r33, r33, 255d
|
|
||||||
JNE r34, r33, :0
|
JNE r34, r33, :0
|
||||||
LI64 r1, 10d
|
LI64 r1, 10d
|
||||||
JMP :1
|
JMP :1
|
||||||
0: LI64 r35, 0d
|
0: ST r33, r254, 24a, 8h
|
||||||
ST r35, r254, 24a, 8h
|
JAL r31, r0, :just_read
|
||||||
LD r2, r254, 24a, 8h
|
LD r2, r254, 24a, 8h
|
||||||
JAL r31, r0, :do_stuff
|
JAL r31, r0, :do_stuff
|
||||||
CP r36, r1
|
CP r35, r1
|
||||||
ADDI64 r37, r254, 0d
|
ADDI64 r36, r254, 0d
|
||||||
JAL r31, r0, :optional
|
JAL r31, r0, :optional
|
||||||
ST r1, r254, 0a, 16h
|
ST r1, r254, 0a, 16h
|
||||||
|
LI8 r37, 0b
|
||||||
LD r38, r254, 0a, 1h
|
LD r38, r254, 0a, 1h
|
||||||
ANDI r38, r38, 255d
|
ANDI r38, r38, 255d
|
||||||
ANDI r33, r33, 255d
|
ANDI r37, r37, 255d
|
||||||
JNE r38, r33, :2
|
JNE r38, r37, :2
|
||||||
LI64 r1, 20d
|
LI64 r1, 20d
|
||||||
JMP :1
|
JMP :1
|
||||||
2: LI64 r39, 100d
|
2: LI64 r39, 100d
|
||||||
ST r39, r254, 8a, 8h
|
ST r39, r254, 8a, 8h
|
||||||
LD r2, r254, 8a, 8h
|
LD r2, r254, 8a, 8h
|
||||||
JAL r31, r0, :do_stuff
|
JAL r31, r0, :do_stuff
|
||||||
ADD64 r1, r1, r36
|
ADD64 r1, r1, r35
|
||||||
1: LD r31, r254, 32a, 72h
|
1: LD r31, r254, 48a, 72h
|
||||||
ADDI64 r254, r254, 104d
|
ADDI64 r254, r254, 120d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
optional:
|
optional:
|
||||||
ADDI64 r254, r254, -16d
|
ADDI64 r254, r254, -16d
|
||||||
|
@ -47,18 +49,22 @@ optional:
|
||||||
ADDI64 r254, r254, 16d
|
ADDI64 r254, r254, 16d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
optionala:
|
optionala:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -56d
|
||||||
ADDI64 r1, r254, 0d
|
ADDI64 r7, r254, 0d
|
||||||
LI64 r3, 1d
|
LI64 r8, 1d
|
||||||
LI8 r7, 1b
|
ADDI64 r9, r254, 16d
|
||||||
ADDI64 r6, r254, 8d
|
ADDI64 r6, r254, 24d
|
||||||
ST r3, r254, 0a, 8h
|
ST r8, r254, 0a, 8h
|
||||||
ST r7, r254, 8a, 1h
|
ST r9, r254, 24a, 8h
|
||||||
ADDI64 r11, r6, 8d
|
ADDI64 r3, r6, 8d
|
||||||
BMC r1, r11, 8h
|
BMC r7, r3, 8h
|
||||||
LD r1, r6, 0a, 16h
|
ADDI64 r4, r254, 8d
|
||||||
ADDI64 r254, r254, 24d
|
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
|
JALA r0, r31, 0a
|
||||||
code size: 568
|
code size: 604
|
||||||
ret: 100
|
ret: 100
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
Loading…
Reference in a new issue