git.delta.rocks / jrsonnet / refs/commits / 41ef1e2d3380

difftreelog

fix(evaluator) do not panic in bad operations

Лач2020-06-27parent: #0ba2642.patch.diff
in: master

2 files changed

modifiedcrates/jsonnet-evaluator/src/error.rsdiffbeforeafterboth
--- a/crates/jsonnet-evaluator/src/error.rs
+++ b/crates/jsonnet-evaluator/src/error.rs
@@ -1,5 +1,5 @@
 use crate::ValType;
-use jsonnet_parser::ExprLocation;
+use jsonnet_parser::{BinaryOpType, ExprLocation, UnaryOpType};
 use std::{path::PathBuf, rc::Rc};
 
 #[derive(Debug, Clone)]
@@ -7,6 +7,9 @@
 	IntristicNotFound(Rc<str>, Rc<str>),
 	IntristicArgumentReorderingIsNotSupportedYet,
 
+	UnaryOperatorDoesNotOperateOnType(UnaryOpType, ValType),
+	BinaryOperatorDoesNotOperateOnValues(BinaryOpType, ValType, ValType),
+
 	VariableIsNotDefined(String),
 	TypeMismatch(&'static str, Vec<ValType>, ValType),
 	NoSuchField(Rc<str>),
modifiedcrates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
74 (UnaryOpType::Not, Val::Bool(v)) => Val::Bool(!v),74 (UnaryOpType::Not, Val::Bool(v)) => Val::Bool(!v),
75 (UnaryOpType::Minus, Val::Num(n)) => Val::Num(-*n),75 (UnaryOpType::Minus, Val::Num(n)) => Val::Num(-*n),
76 (UnaryOpType::BitNot, Val::Num(n)) => Val::Num(!(*n as i32) as f64),76 (UnaryOpType::BitNot, Val::Num(n)) => Val::Num(!(*n as i32) as f64),
77 (op, o) => panic!("unary op not implemented: {:?} {:?}", op, o),77 (op, o) => create_error(Error::UnaryOperatorDoesNotOperateOnType(
78 op,
79 o.value_type()?,
80 ))?,
78 })81 })
79}82}
8083
92 (Val::Obj(v1), Val::Obj(v2)) => Val::Obj(v2.with_super(v1.clone())),95 (Val::Obj(v1), Val::Obj(v2)) => Val::Obj(v2.with_super(v1.clone())),
93 (Val::Arr(a), Val::Arr(b)) => Val::Arr(Rc::new([&a[..], &b[..]].concat())),96 (Val::Arr(a), Val::Arr(b)) => Val::Arr(Rc::new([&a[..], &b[..]].concat())),
94 (Val::Num(v1), Val::Num(v2)) => Val::Num(v1 + v2),97 (Val::Num(v1), Val::Num(v2)) => Val::Num(v1 + v2),
95 _ => panic!("can't add: {:?} and {:?}", a, b),98 _ => create_error(Error::BinaryOperatorDoesNotOperateOnValues(
99 BinaryOpType::Add,
100 a.value_type()?,
101 b.value_type()?,
102 ))?,
96 })103 })
97}104}
98105
161 Val::Num(((*v1 as i32) >> (*v2 as i32)) as f64)168 Val::Num(((*v1 as i32) >> (*v2 as i32)) as f64)
162 }169 }
163170
164 _ => panic!("no rules for binary operation: {:?} {:?} {:?}", a, op, b),171 _ => create_error(Error::BinaryOperatorDoesNotOperateOnValues(
172 op,
173 a.value_type()?,
174 b.value_type()?,
175 ))?,
165 })176 })
166}177}
167178