Handle evaluating constant index expression

This commit is contained in:
Marcin Serwin 2020-03-19 16:54:19 +01:00
parent 2153abb412
commit 621767136e

View file

@ -268,6 +268,7 @@ impl<'c, 'cc> ConstEvalLateContext<'c, 'cc> {
} }
} }
}, },
ExprKind::Index(ref arr, ref index) => self.index(arr, index),
// TODO: add other expressions. // TODO: add other expressions.
_ => None, _ => None,
} }
@ -345,6 +346,20 @@ impl<'c, 'cc> ConstEvalLateContext<'c, 'cc> {
} }
} }
fn index(&mut self, lhs: &'_ Expr<'_>, index: &'_ Expr<'_>) -> Option<Constant> {
let lhs = self.expr(lhs);
let index = self.expr(index);
match (lhs, index) {
(Some(Constant::Vec(vec)), Some(Constant::Int(index))) => match vec[index as usize] {
Constant::F32(x) => Some(Constant::F32(x)),
Constant::F64(x) => Some(Constant::F64(x)),
_ => None,
},
_ => None,
}
}
/// A block can only yield a constant if it only has one constant expression. /// A block can only yield a constant if it only has one constant expression.
fn block(&mut self, block: &Block<'_>) -> Option<Constant> { fn block(&mut self, block: &Block<'_>) -> Option<Constant> {
if block.stmts.is_empty() { if block.stmts.is_empty() {