difftreelog
fix(evaluator) do not panic in bad operations
in: master
2 files changed
crates/jsonnet-evaluator/src/error.rsdiffbeforeafterboth1use crate::ValType;1use crate::ValType;2use jsonnet_parser::ExprLocation;2use jsonnet_parser::{BinaryOpType, ExprLocation, UnaryOpType};3use std::{path::PathBuf, rc::Rc};3use std::{path::PathBuf, rc::Rc};445#[derive(Debug, Clone)]5#[derive(Debug, Clone)]6pub enum Error {6pub enum Error {7 IntristicNotFound(Rc<str>, Rc<str>),7 IntristicNotFound(Rc<str>, Rc<str>),8 IntristicArgumentReorderingIsNotSupportedYet,8 IntristicArgumentReorderingIsNotSupportedYet,910 UnaryOperatorDoesNotOperateOnType(UnaryOpType, ValType),11 BinaryOperatorDoesNotOperateOnValues(BinaryOpType, ValType, ValType),91210 VariableIsNotDefined(String),13 VariableIsNotDefined(String),11 TypeMismatch(&'static str, Vec<ValType>, ValType),14 TypeMismatch(&'static str, Vec<ValType>, ValType),crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth74 (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}808392 (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}98105161 Val::Num(((*v1 as i32) >> (*v2 as i32)) as f64)168 Val::Num(((*v1 as i32) >> (*v2 as i32)) as f64)162 }169 }163170164 _ => 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