Skip to content

Commit 95d6ea6

Browse files
chapter17: type changes (doesn't compile yet)
1 parent f497b46 commit 95d6ea6

File tree

2 files changed

+77
-23
lines changed

2 files changed

+77
-23
lines changed

src/sea_of_nodes/parser.rs

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -713,11 +713,8 @@ impl<'s, 't> Parser<'s, 't> {
713713
}
714714

715715
// Lift expression, based on type
716-
let lift = self.lift_expr(
717-
expr,
718-
self.nodes[self.scope].vars[def].ty(),
719-
self.nodes[self.scope].vars[def].final_field,
720-
)?;
716+
let var_t = self.nodes[self.scope].vars[def].ty(&self.name_to_type, &self.types);
717+
let lift = self.lift_expr(expr, var_t, self.nodes[self.scope].vars[def].final_field)?;
721718
// Update
722719
self.scope.update(name, lift, &mut self.nodes);
723720
// Return un-lifted expr
@@ -757,7 +754,8 @@ impl<'s, 't> Parser<'s, 't> {
757754

758755
fn widen_int(&mut self, expr: Node, t: Ty<'t>) -> Node {
759756
if t.is_float() && expr.ty(&self.nodes).is_some_and(|i| i.is_int()) {
760-
self.peep(ToFloat::new(expr, &mut self.nodes))
757+
let f = ToFloat::new(expr, &mut self.nodes);
758+
self.peep(f)
761759
} else {
762760
expr
763761
}
@@ -832,7 +830,7 @@ impl<'s, 't> Parser<'s, 't> {
832830
if self.x_scopes.len() > 1 {
833831
return Err(self.error_syntax("struct declarations can only appear in top level scope"));
834832
}
835-
let type_name = self.require_id()?;
833+
let type_name = self.types.get_str(self.require_id()?);
836834
let t = self.name_to_type.get(type_name);
837835
if t.is_some_and(|t| !t.to_mem_ptr().is_some_and(|tmp| tmp.is_fref())) {
838836
return Err(self.error_syntax(&format!("struct '{type_name}' cannot be redefined")));
@@ -862,7 +860,7 @@ impl<'s, 't> Parser<'s, 't> {
862860
});
863861
self.alias += 1;
864862
}
865-
let ts = self.types.get_struct(type_name, fs);
863+
let ts = self.types.get_struct(type_name, &fs);
866864
self.name_to_type
867865
.insert(type_name, *self.types.get_mem_ptr(ts, false));
868866
self.inits.insert(
@@ -967,7 +965,7 @@ impl<'s, 't> Parser<'s, 't> {
967965

968966
/// Fixup forward refs lazily. Basically a Union-Find flavored read
969967
/// barrier.
970-
fn lazy_f_ref(&mut self, t: Ty<'t>) -> PResult<Ty<'t>> {
968+
fn lazy_f_ref(&mut self, _t: Ty<'t>) -> PResult<Ty<'t>> {
971969
//if( !t.isFRef() ) return t;
972970
//Type def = Parser.TYPES.get(((TypeMemPtr)t)._obj._name);
973971
Err("Not yet implemented".to_string())
@@ -1194,12 +1192,16 @@ impl<'s, 't> Parser<'s, 't> {
11941192
'-' => self.nodes.create((Op::Sub, vec![None, Some(rvalue), None])),
11951193
'*' => self.nodes.create((Op::Mul, vec![None, Some(rvalue), None])),
11961194
'/' => self.nodes.create((Op::Div, vec![None, Some(rvalue), None])),
1197-
'\u{1}' => self
1198-
.nodes
1199-
.create((Op::Add, vec![None, Some(rvalue), Some(*self.int_con(1))])),
1200-
'\u{FFFF}' => self
1201-
.nodes
1202-
.create((Op::Add, vec![None, Some(rvalue), Some(*self.int_con(-1))])),
1195+
'\u{1}' => {
1196+
let rhs = self.int_con(1);
1197+
self.nodes
1198+
.create((Op::Add, vec![None, Some(rvalue), Some(*rhs)]))
1199+
}
1200+
'\u{FFFF}' => {
1201+
let rhs = self.int_con(-1);
1202+
self.nodes
1203+
.create((Op::Add, vec![None, Some(rvalue), Some(*rhs)]))
1204+
}
12031205
_ => return Err("Not yet implemented".to_string()),
12041206
};
12051207
// Return pre-value (x+=1) or post-value (x++)
@@ -1213,8 +1215,9 @@ impl<'s, 't> Parser<'s, 't> {
12131215
rvalue.keep(&mut self.nodes); // Keep post-value across peeps
12141216
}
12151217
let n_ty = self.nodes[self.scope].vars[n].ty(&self.name_to_type, self.types);
1216-
let op = self.zs_mask(self.peep(op), n_ty)?;
1217-
self.scope.update(n, op, &mut self.nodes);
1218+
let op = self.peep(op);
1219+
let op = self.zs_mask(op, n_ty)?;
1220+
self.scope.update_var_index(n, Some(op), &mut self.nodes);
12181221
Ok(if pre {
12191222
op
12201223
} else {
@@ -1451,7 +1454,11 @@ impl<'s, 't> Parser<'s, 't> {
14511454

14521455
let index = self.parse_asgn()?;
14531456
self.require("]")?;
1454-
let offset = Shl::new(index, Some(self.int_con(base.ary_scale())), &mut self.nodes);
1457+
let offset = Shl::new(
1458+
index,
1459+
Some(*self.int_con(base.ary_scale())),
1460+
&mut self.nodes,
1461+
);
14551462

14561463
self.peep(Add::new(*b, self.peep(offset), &mut self.nodes))
14571464
} else {
@@ -1506,12 +1513,12 @@ impl<'s, 't> Parser<'s, 't> {
15061513
// ary[idx]++ or ptr.fld++
15071514
let inc = self.matchx("++");
15081515
if inc || self.matchx("--") {
1509-
if f.final_field && !f.fname == "[]" {
1516+
if f.final_field && f.fname != "[]" {
15101517
return Err(format!("Cannot reassign final '{}'", f.fname));
15111518
}
15121519
let delta = self.int_con(if inc { 1 } else { -1 });
15131520
let inc = self.peep(Add::new(load, *delta, &mut self.nodes));
1514-
let val = self.zs_mask(inc, tf);
1521+
let val = self.zs_mask(inc, tf)?;
15151522
let st = Store::new(
15161523
name,
15171524
f.alias,
@@ -1548,11 +1555,15 @@ impl<'s, 't> Parser<'s, 't> {
15481555
if let Some(t0) = t.to_int() {
15491556
if !self.types.isa(tval, t0) {
15501557
if t0.min() == 0 {
1551-
self.peep(And::new(val, self.int_con(t0.max()))) // Unsigned
1558+
return Ok(self.peep(And::new(
1559+
val,
1560+
Some(*self.int_con(t0.max())),
1561+
&mut self.nodes,
1562+
))); // Unsigned
15521563
}
15531564
// Signed extension
15541565
let shift = t0.max().leading_zeros() - 1;
1555-
let shf = self.int_con(shift);
1566+
let shf = self.int_con(shift as i64);
15561567
if shf.ty(&self.nodes) == Some(*self.types.int_zero) {
15571568
return Ok(val);
15581569
}

src/sea_of_nodes/types/type.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::fmt;
33
use std::fmt::Display;
44
use std::hash::Hash;
55

6-
use crate::sea_of_nodes::types::ty::TyFloat;
6+
use crate::sea_of_nodes::types::ty::{TyFloat, TyInt};
77
use crate::sea_of_nodes::types::{Field, Ty, TyStruct};
88

99
#[derive(Eq, PartialEq, Copy, Clone, Hash, Debug)]
@@ -26,6 +26,25 @@ pub struct Int {
2626
pub max: i64,
2727
}
2828

29+
impl<'t> TyInt<'t> {
30+
pub fn min(self) -> i64 {
31+
self.data().min
32+
}
33+
34+
pub fn max(self) -> i64 {
35+
self.data().max
36+
}
37+
38+
pub fn value(self) -> i64 {
39+
debug_assert!(self.is_constant());
40+
self.min()
41+
}
42+
43+
pub fn mask(self) -> i64 {
44+
todo!()
45+
}
46+
}
47+
2948
#[derive(Eq, PartialEq, Copy, Clone, Hash, Debug)]
3049
pub struct Float {
3150
sz: i8,
@@ -69,6 +88,30 @@ impl<'t> TyStruct<'t> {
6988
pub fn fields(self) -> &'t [Field<'t>] {
7089
self.data().fields
7190
}
91+
92+
pub fn find(self, fname: &str) -> Option<usize> {
93+
self.data().fields.iter().position(|f| f.fname == fname)
94+
}
95+
96+
pub fn find_alias(self, alias: u32) -> Option<usize> {
97+
self.data().fields.iter().position(|f| f.alias == alias)
98+
}
99+
100+
pub fn is_ary(self) -> bool {
101+
self.fields().len() == 2 && self.fields()[1].fname == "[]"
102+
}
103+
104+
pub fn ary_base(self) -> i64 {
105+
todo!()
106+
}
107+
108+
pub fn ary_scale(self) -> i64 {
109+
todo!()
110+
}
111+
112+
pub fn offset(self, index: usize) -> i64 {
113+
todo!()
114+
}
72115
}
73116

74117
#[derive(Eq, PartialEq, Copy, Clone, Hash, Debug)]

0 commit comments

Comments
 (0)