difftreelog
fix forbid negative numbers in %c format
in: master
43 files changed
crates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth104 #[error("intrinsic not found: {0}")]104 #[error("intrinsic not found: {0}")]105 IntrinsicNotFound(IStr),105 IntrinsicNotFound(IStr),106106107 #[error("operator {0} does not operate on type {1}")]107 #[error("unary operator {0} does not operate on type {1}")]108 UnaryOperatorDoesNotOperateOnType(UnaryOpType, ValType),108 UnaryOperatorDoesNotOperateOnType(UnaryOpType, ValType),109 #[error("binary operation {1} {0} {2} is not implemented")]109 #[error("binary operator {0} does not operate on types {1} {0} {2}")]110 BinaryOperatorDoesNotOperateOnValues(BinaryOpType, ValType, ValType),110 BinaryOperatorDoesNotOperateOnValues(BinaryOpType, ValType, ValType),111111112 #[error("self/super/$ are only usable inside objects")]112 #[error("self/super/$ are only usable inside objects")]211211212 #[error("{}", format_empty_str(.0))]212 #[error("{}", format_empty_str(.0))]213 ImportCallbackError(String),213 ImportCallbackError(String),214 #[error("invalid unicode codepoint: {0}")]214 #[error("invalid unicode scalar value: {0} (U+{0:04X})")]215 InvalidUnicodeCodepointGot(u32),215 InvalidUnicodeCodepointGot(u32),216216217 #[error("convert num value: {0}")]217 #[error("failed to convert num value: {0}")]218 ConvertNumValue(#[from] ConvertNumValueError),218 ConvertNumValue(#[from] ConvertNumValueError),219219220 #[error("format error: {0}")]220 #[error("format error: {0}")]crates/jrsonnet-evaluator/src/stdlib/format.rsdiffbeforeafterboth14use crate::{14use crate::{15 Error, ObjValue, Result, Val, bail,15 Error, ObjValue, Result, Val, bail,16 error::{ErrorKind::*, format_found, suggest_object_fields},16 error::{ErrorKind::*, format_found, suggest_object_fields},17 typed::FromUntyped,17 typed::{Codepoint, FromUntyped},18};18};191920#[derive(Debug, Clone, Error, Trace)]20#[derive(Debug, Clone, Error, Trace)]644 }644 }645 }645 }646 ConvTypeV::Char => match value.clone() {646 ConvTypeV::Char => match value.clone() {647 Val::Num(n) => {647 v @ Val::Num(_) => {648 let n = n.get();648 let codepoint = Codepoint::from_untyped(v)?;649 tmp_out.push(649 tmp_out.push(codepoint.try_char()?);650 std::char::from_u32(n as u32)651 .ok_or_else(|| InvalidUnicodeCodepointGot(n as u32))?,652 );653 }650 }654 Val::Str(s) => {651 Val::Str(s) => {crates/jrsonnet-evaluator/src/typed/conversions.rsdiffbeforeafterboth9 ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val,9 ObjValue, ObjValueBuilder, Result, ResultExt, Thunk, Val,10 arr::ArrValue,10 arr::ArrValue,11 bail,11 bail,12 error::ErrorKind::*,12 function::FuncVal,13 function::FuncVal,13 typed::CheckType,14 typed::CheckType,14 val::{IndexableVal, StrValue, ThunkMapper},15 val::{IndexableVal, StrValue, ThunkMapper},889 }890 }890}891}892893pub struct Codepoint(u32);894impl Codepoint {895 pub fn try_char(&self) -> Result<char> {896 Ok(char::from_u32(self.0).ok_or_else(|| InvalidUnicodeCodepointGot(self.0))?)897 }898}899impl Typed for Codepoint {900 const TYPE: &'static ComplexValType = u32::TYPE;901}902impl IntoUntyped for Codepoint {903 fn into_untyped(typed: Self) -> Result<Val> {904 u32::into_untyped(typed.0)905 }906}907impl FromUntyped for Codepoint {908 fn from_untyped(untyped: Val) -> Result<Self> {909 u32::from_untyped(untyped)910 .description("invalid codepoint value")911 .map(Self)912 }913}891914crates/jrsonnet-ir/src/lib.rsdiffbeforeafterboth115#[derive(Clone, Copy, Debug, thiserror::Error, Acyclic)]115#[derive(Clone, Copy, Debug, thiserror::Error, Acyclic)]116pub enum ConvertNumValueError {116pub enum ConvertNumValueError {117 /// The value is too large117 /// The value is too large118 #[error("overflow")]118 #[error("numeric value overflow")]119 Overflow,119 Overflow,120 /// The value is too large (infinity)121 #[error("numeric value overflow (got infinity)")]122 OverflowInfinity,120 /// The value is too small123 /// The value is too small121 #[error("underflow")]124 #[error("numeric value underflow")]122 Underflow,125 Underflow,126 /// The value is too small (negative infinity)127 #[error("numeric value underflow (got negative infinity)")]128 UnderflowInfinity,123 /// Jsonnet numbers can only be finite129 /// Jsonnet numbers can only be finite124 #[error("non-finite")]130 #[error("numeric value is not finite (got NaN)")]125 NonFinite,131 NotANumber,126 /// Number value is out of safe integer range132 /// Number value is out of safe integer range127 #[error("float out of safe int range")]133 #[error("float out of safe int range")]128 BitwiseSafeRange,134 BitwiseSafeRange,154160155 #[inline]161 #[inline]156 fn try_from(value: f64) -> Result<Self, Self::Error> {162 fn try_from(value: f64) -> Result<Self, Self::Error> {157 Self::new(value).ok_or(ConvertNumValueError::NonFinite)163 Self::new(value).ok_or_else(|| {164 if value == f64::INFINITY {165 return ConvertNumValueError::OverflowInfinity;166 }167 if value == f64::NEG_INFINITY {168 return ConvertNumValueError::UnderflowInfinity;169 }170 ConvertNumValueError::NotANumber171 })158 }172 }159}173}160impl TryFrom<f32> for NumValue {174impl TryFrom<f32> for NumValue {161 type Error = ConvertNumValueError;175 type Error = ConvertNumValueError;162176163 #[inline]177 #[inline]164 fn try_from(value: f32) -> Result<Self, Self::Error> {178 fn try_from(value: f32) -> Result<Self, Self::Error> {165 Self::new(f64::from(value)).ok_or(ConvertNumValueError::NonFinite)179 Self::try_from(f64::from(value))166 }180 }167}181}168182crates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth223use jrsonnet_evaluator::{3use jrsonnet_evaluator::{4 Either, IStr, Val, bail,4 Either, IStr, Val, bail,5 error::{ErrorKind::*, Result},5 error::Result,6 function::builtin,6 function::builtin,7 typed::{Either2, FromUntyped, M1},7 typed::{Codepoint, Either2, FromUntyped, M1},8 val::{ArrValue, IndexableVal},8 val::{ArrValue, IndexableVal},9};9};101019}19}202021#[builtin]21#[builtin]22pub fn builtin_char(n: u32) -> Result<char> {22pub fn builtin_char(n: Codepoint) -> Result<char> {23 Ok(std::char::from_u32(n).ok_or_else(|| InvalidUnicodeCodepointGot(n))?)23 n.try_char()24}24}252526#[builtin]26#[builtin]tests/cpp_test_suite_golden_override/error.integer_conversion.jsonnet.goldendiffbeforeafterboth1convert num value: float out of safe int range1failed to convert num value: float out of safe int rangetests/cpp_test_suite_golden_override/error.integer_left_shift.jsonnet.goldendiffbeforeafterboth1convert num value: float out of safe int range1failed to convert num value: float out of safe int rangetests/cpp_test_suite_golden_override/error.overflow.jsonnet.goldendiffbeforeafterboth1syntax error: invalid number value: non-finite1syntax error: invalid number value: numeric value overflow (got infinity)2 error.overflow.jsonnet:17:1-52 error.overflow.jsonnet:17:1-53 error.overflow.jsonnet:17:1-5: parse imported3 error.overflow.jsonnet:17:1-5: parse importedtests/cpp_test_suite_golden_override/error.overflow2.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)tests/cpp_test_suite_golden_override/error.overflow3.jsonnet.goldendiffbeforeafterboth1syntax error: invalid number value: non-finite1syntax error: invalid number value: numeric value overflow (got infinity)2 error.overflow3.jsonnet:17:1-52 error.overflow3.jsonnet:17:1-53 error.overflow3.jsonnet:17:1-5: parse imported3 error.overflow3.jsonnet:17:1-5: parse importedtests/go_testdata_golden_override/array_plus_bad.jsonnet.goldendiffbeforeafterboth1binary operation array + number is not implemented1binary operator + does not operate on types array + numbertests/go_testdata_golden_override/binaryNot2.jsonnet.goldendiffbeforeafterboth1operator ~ does not operate on type string1unary operator ~ does not operate on type stringtests/go_testdata_golden_override/bitwise_and3.jsonnet.goldendiffbeforeafterboth1convert num value: float out of safe int range1failed to convert num value: float out of safe int rangetests/go_testdata_golden_override/bitwise_and7.jsonnet.goldendiffbeforeafterboth1convert num value: float out of safe int range1failed to convert num value: float out of safe int rangetests/go_testdata_golden_override/bitwise_or10.jsonnet.goldendiffbeforeafterboth1binary operation string | number is not implemented1binary operator | does not operate on types string | numbertests/go_testdata_golden_override/builtinChar3.jsonnet.goldendiffbeforeafterboth1type error: number out of bounds: -1 not in 0..42949672951type error: number out of bounds: -1 not in 0..42949672952 invalid codepoint value2 argument <n> evaluation3 argument <n> evaluation3 builtinChar3.jsonnet:1:9-12: function <builtin_char> call4 builtinChar3.jsonnet:1:9-12: function <builtin_char> calltests/go_testdata_golden_override/builtinChar5.jsonnet.goldendiffbeforeafterboth1invalid unicode codepoint: 11141121invalid unicode scalar value: 1114112 (U+110000)2 builtinChar5.jsonnet:2:9-17: function <builtin_char> call2 builtinChar5.jsonnet:2:9-17: function <builtin_char> calltests/go_testdata_golden_override/builtinChar7.jsonnet.goldendiffbeforeafterboth1type error: expected BoundedNumber<0, 4294967295>, got string1type error: expected BoundedNumber<0, 4294967295>, got string2 invalid codepoint value2 argument <n> evaluation3 argument <n> evaluation3 builtinChar7.jsonnet:1:9-15: function <builtin_char> call4 builtinChar7.jsonnet:1:9-15: function <builtin_char> calltests/go_testdata_golden_override/builtin_exp3.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)2 builtin_exp3.jsonnet:1:8-13: function <builtin_exp> call2 builtin_exp3.jsonnet:1:8-13: function <builtin_exp> calltests/go_testdata_golden_override/builtin_exp5.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)2 builtin_exp5.jsonnet:1:8-30: function <builtin_exp> call2 builtin_exp5.jsonnet:1:8-30: function <builtin_exp> calltests/go_testdata_golden_override/builtin_log5.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value underflow (got negative infinity)2 builtin_log5.jsonnet:1:8-10: function <builtin_log> call2 builtin_log5.jsonnet:1:8-10: function <builtin_log> calltests/go_testdata_golden_override/builtin_log7.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value is not finite (got NaN)2 builtin_log7.jsonnet:1:8-11: function <builtin_log> call2 builtin_log7.jsonnet:1:8-11: function <builtin_log> calltests/go_testdata_golden_override/builtin_log8.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value is not finite (got NaN)2 builtin_log8.jsonnet:1:8-23: function <builtin_log> call2 builtin_log8.jsonnet:1:8-23: function <builtin_log> calltests/go_testdata_golden_override/div4.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)tests/go_testdata_golden_override/function_plus_bad.jsonnet.goldendiffbeforeafterboth1binary operation function + number is not implemented1binary operator + does not operate on types function + numbertests/go_testdata_golden_override/inf_min_number.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value underflow (got negative infinity)tests/go_testdata_golden_override/inf_mul_number.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)tests/go_testdata_golden_override/inf_sum_number.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)tests/go_testdata_golden_override/number_divided_by_string.jsonnet.goldendiffbeforeafterboth1binary operation number / string is not implemented1binary operator / does not operate on types number / stringtests/go_testdata_golden_override/object_plus_bad.jsonnet.goldendiffbeforeafterboth1binary operation object + number is not implemented1binary operator + does not operate on types object + numbertests/go_testdata_golden_override/or5.jsonnet.goldendiffbeforeafterboth1binary operation string || boolean is not implemented1binary operator || does not operate on types string || booleantests/go_testdata_golden_override/or6.jsonnet.goldendiffbeforeafterboth1binary operation boolean || string is not implemented1binary operator || does not operate on types boolean || stringtests/go_testdata_golden_override/percent_bad.jsonnet.goldendiffbeforeafterboth1binary operation number % string is not implemented1binary operator % does not operate on types number % stringtests/go_testdata_golden_override/percent_bad3.jsonnet.goldendiffbeforeafterboth1binary operation function % number is not implemented1binary operator % does not operate on types function % numbertests/go_testdata_golden_override/plus5.jsonnet.goldendiffbeforeafterboth1binary operation number + function is not implemented1binary operator + does not operate on types number + functiontests/go_testdata_golden_override/pow4.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value is not finite (got NaN)2 pow4.jsonnet:1:8-16: function <builtin_pow> call2 pow4.jsonnet:1:8-16: function <builtin_pow> calltests/go_testdata_golden_override/pow7.jsonnet.goldendiffbeforeafterboth1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)2 pow7.jsonnet:2:8-22: function <builtin_pow> call2 pow7.jsonnet:2:8-22: function <builtin_pow> calltests/go_testdata_golden_override/stacktrace_plussuper.jsonnet.goldendiffbeforeafterboth1binary operation null + object is not implemented1binary operator + does not operate on types null + object2 field <a> evaluation2 field <a> evaluationtests/go_testdata_golden_override/std.sort4.jsonnet.goldendiffbeforeafterboth1binary operation array < number is not implemented1binary operator < does not operate on types array < number2 std.sort4.jsonnet:1:9-28: function <builtin_sort> call2 std.sort4.jsonnet:1:9-28: function <builtin_sort> calltests/go_testdata_golden_override/string_divided_by_number.jsonnet.goldendiffbeforeafterboth1binary operation string / number is not implemented1binary operator / does not operate on types string / numbertests/go_testdata_golden_override/string_minus_number.jsonnet.goldendiffbeforeafterboth1binary operation string - number is not implemented1binary operator - does not operate on types string - numbertests/go_testdata_golden_override/unary_minus4.jsonnet.goldendiffbeforeafterboth1operator - does not operate on type string1unary operator - does not operate on type stringtests/go_testdata_golden_override/unary_object.jsonnet.goldendiffbeforeafterboth1operator + does not operate on type object1unary operator + does not operate on type object