git.delta.rocks / jrsonnet / refs/commits / 7df0eec7cd27

difftreelog

fix forbid negative numbers in %c format

myqsozsvYaroslav Bolyukin2026-06-18parent: #363bd28.patch.diff
in: master

43 files changed

modifiedcrates/jrsonnet-evaluator/src/error.rsdiffbeforeafterboth
104 #[error("intrinsic not found: {0}")]104 #[error("intrinsic not found: {0}")]
105 IntrinsicNotFound(IStr),105 IntrinsicNotFound(IStr),
106106
107 #[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),
111111
112 #[error("self/super/$ are only usable inside objects")]112 #[error("self/super/$ are only usable inside objects")]
211211
212 #[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),
216216
217 #[error("convert num value: {0}")]217 #[error("failed to convert num value: {0}")]
218 ConvertNumValue(#[from] ConvertNumValueError),218 ConvertNumValue(#[from] ConvertNumValueError),
219219
220 #[error("format error: {0}")]220 #[error("format error: {0}")]
modifiedcrates/jrsonnet-evaluator/src/stdlib/format.rsdiffbeforeafterboth
14use 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};
1919
20#[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) => {
modifiedcrates/jrsonnet-evaluator/src/typed/conversions.rsdiffbeforeafterboth
9 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}
892
893pub 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}
891914
modifiedcrates/jrsonnet-ir/src/lib.rsdiffbeforeafterboth
115#[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 large
118 #[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 small
121 #[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 finite
124 #[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 range
127 #[error("float out of safe int range")]133 #[error("float out of safe int range")]
128 BitwiseSafeRange,134 BitwiseSafeRange,
154160
155 #[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::NotANumber
171 })
158 }172 }
159}173}
160impl TryFrom<f32> for NumValue {174impl TryFrom<f32> for NumValue {
161 type Error = ConvertNumValueError;175 type Error = ConvertNumValueError;
162176
163 #[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}
168182
modifiedcrates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth
22
3use 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};
1010
19}19}
2020
21#[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}
2525
26#[builtin]26#[builtin]
modifiedtests/cpp_test_suite_golden_override/error.integer_conversion.jsonnet.goldendiffbeforeafterboth
1convert num value: float out of safe int range1failed to convert num value: float out of safe int range
modifiedtests/cpp_test_suite_golden_override/error.integer_left_shift.jsonnet.goldendiffbeforeafterboth
1convert num value: float out of safe int range1failed to convert num value: float out of safe int range
modifiedtests/cpp_test_suite_golden_override/error.overflow.jsonnet.goldendiffbeforeafterboth
1syntax 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-5
3 error.overflow.jsonnet:17:1-5: parse imported3 error.overflow.jsonnet:17:1-5: parse imported
modifiedtests/cpp_test_suite_golden_override/error.overflow2.jsonnet.goldendiffbeforeafterboth
1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)
modifiedtests/cpp_test_suite_golden_override/error.overflow3.jsonnet.goldendiffbeforeafterboth
1syntax 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-5
3 error.overflow3.jsonnet:17:1-5: parse imported3 error.overflow3.jsonnet:17:1-5: parse imported
modifiedtests/go_testdata_golden_override/array_plus_bad.jsonnet.goldendiffbeforeafterboth
1binary operation array + number is not implemented1binary operator + does not operate on types array + number
modifiedtests/go_testdata_golden_override/binaryNot2.jsonnet.goldendiffbeforeafterboth
1operator ~ does not operate on type string1unary operator ~ does not operate on type string
modifiedtests/go_testdata_golden_override/bitwise_and3.jsonnet.goldendiffbeforeafterboth
1convert num value: float out of safe int range1failed to convert num value: float out of safe int range
modifiedtests/go_testdata_golden_override/bitwise_and7.jsonnet.goldendiffbeforeafterboth
1convert num value: float out of safe int range1failed to convert num value: float out of safe int range
modifiedtests/go_testdata_golden_override/bitwise_or10.jsonnet.goldendiffbeforeafterboth
1binary operation string | number is not implemented1binary operator | does not operate on types string | number
modifiedtests/go_testdata_golden_override/builtinChar3.jsonnet.goldendiffbeforeafterboth
1type error: number out of bounds: -1 not in 0..42949672951type error: number out of bounds: -1 not in 0..4294967295
2 invalid codepoint value
2 argument <n> evaluation3 argument <n> evaluation
3 builtinChar3.jsonnet:1:9-12: function <builtin_char> call4 builtinChar3.jsonnet:1:9-12: function <builtin_char> call
modifiedtests/go_testdata_golden_override/builtinChar5.jsonnet.goldendiffbeforeafterboth
1invalid 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> call
modifiedtests/go_testdata_golden_override/builtinChar7.jsonnet.goldendiffbeforeafterboth
1type error: expected BoundedNumber<0, 4294967295>, got string1type error: expected BoundedNumber<0, 4294967295>, got string
2 invalid codepoint value
2 argument <n> evaluation3 argument <n> evaluation
3 builtinChar7.jsonnet:1:9-15: function <builtin_char> call4 builtinChar7.jsonnet:1:9-15: function <builtin_char> call
modifiedtests/go_testdata_golden_override/builtin_exp3.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/builtin_exp5.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/builtin_log5.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/builtin_log7.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/builtin_log8.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/div4.jsonnet.goldendiffbeforeafterboth
1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)
modifiedtests/go_testdata_golden_override/function_plus_bad.jsonnet.goldendiffbeforeafterboth
1binary operation function + number is not implemented1binary operator + does not operate on types function + number
modifiedtests/go_testdata_golden_override/inf_min_number.jsonnet.goldendiffbeforeafterboth
1convert num value: non-finite1failed to convert num value: numeric value underflow (got negative infinity)
modifiedtests/go_testdata_golden_override/inf_mul_number.jsonnet.goldendiffbeforeafterboth
1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)
modifiedtests/go_testdata_golden_override/inf_sum_number.jsonnet.goldendiffbeforeafterboth
1convert num value: non-finite1failed to convert num value: numeric value overflow (got infinity)
modifiedtests/go_testdata_golden_override/number_divided_by_string.jsonnet.goldendiffbeforeafterboth
1binary operation number / string is not implemented1binary operator / does not operate on types number / string
modifiedtests/go_testdata_golden_override/object_plus_bad.jsonnet.goldendiffbeforeafterboth
1binary operation object + number is not implemented1binary operator + does not operate on types object + number
modifiedtests/go_testdata_golden_override/or5.jsonnet.goldendiffbeforeafterboth
1binary operation string || boolean is not implemented1binary operator || does not operate on types string || boolean
modifiedtests/go_testdata_golden_override/or6.jsonnet.goldendiffbeforeafterboth
1binary operation boolean || string is not implemented1binary operator || does not operate on types boolean || string
modifiedtests/go_testdata_golden_override/percent_bad.jsonnet.goldendiffbeforeafterboth
1binary operation number % string is not implemented1binary operator % does not operate on types number % string
modifiedtests/go_testdata_golden_override/percent_bad3.jsonnet.goldendiffbeforeafterboth
1binary operation function % number is not implemented1binary operator % does not operate on types function % number
modifiedtests/go_testdata_golden_override/plus5.jsonnet.goldendiffbeforeafterboth
1binary operation number + function is not implemented1binary operator + does not operate on types number + function
modifiedtests/go_testdata_golden_override/pow4.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/pow7.jsonnet.goldendiffbeforeafterboth
1convert 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> call
modifiedtests/go_testdata_golden_override/stacktrace_plussuper.jsonnet.goldendiffbeforeafterboth
1binary operation null + object is not implemented1binary operator + does not operate on types null + object
2 field <a> evaluation2 field <a> evaluation
modifiedtests/go_testdata_golden_override/std.sort4.jsonnet.goldendiffbeforeafterboth
1binary operation array < number is not implemented1binary operator < does not operate on types array < number
2 std.sort4.jsonnet:1:9-28: function <builtin_sort> call2 std.sort4.jsonnet:1:9-28: function <builtin_sort> call
modifiedtests/go_testdata_golden_override/string_divided_by_number.jsonnet.goldendiffbeforeafterboth
1binary operation string / number is not implemented1binary operator / does not operate on types string / number
modifiedtests/go_testdata_golden_override/string_minus_number.jsonnet.goldendiffbeforeafterboth
1binary operation string - number is not implemented1binary operator - does not operate on types string - number
modifiedtests/go_testdata_golden_override/unary_minus4.jsonnet.goldendiffbeforeafterboth
1operator - does not operate on type string1unary operator - does not operate on type string
modifiedtests/go_testdata_golden_override/unary_object.jsonnet.goldendiffbeforeafterboth
1operator + does not operate on type object1unary operator + does not operate on type object