difftreelog
Merge branch 'master' of github.com:CertainLach/jrsonnet
in: master
5 files changed
crates/jrsonnet-evaluator/README.mddiffbeforeafterboth--- a/crates/jrsonnet-evaluator/README.md
+++ b/crates/jrsonnet-evaluator/README.md
@@ -8,12 +8,10 @@
- `serialized-stdlib`
- serializes standard library AST using serde
- - slower than `codegenerated-stdlib` at runtime, but have no compilation speed penality
+ - used by default
- none
- leaves only stdlib source code in binary, processing them same way as user supplied data
- slowest (as it involves parsing of standard library source code)
-
-Because of `codegenerated-stdlib` compilation slowdown, `serialized-stdlib` is used by default
### Benchmark
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth126 ("strReplace".into(), builtin_str_replace),126 ("strReplace".into(), builtin_str_replace),127 ("splitLimit".into(), builtin_splitlimit),127 ("splitLimit".into(), builtin_splitlimit),128 ("parseJson".into(), builtin_parse_json),128 ("parseJson".into(), builtin_parse_json),129 ("asciiUpper".into(), builtin_ascii_upper),130 ("asciiLower".into(), builtin_ascii_lower),131 ("member".into(), builtin_member),132 ("count".into(), builtin_count),129 ].iter().cloned().collect()133 ].iter().cloned().collect()130 };134 };131}135}828 })832 })829}833}834835fn builtin_ascii_upper(836 context: Context,837 _loc: Option<&ExprLocation>,838 args: &ArgsDesc,839) -> Result<Val> {840 parse_args!(context, "asciiUpper", args, 1, [841 0, str: ty!(string) => Val::Str;842 ], {843 Ok(Val::Str(str.to_ascii_uppercase().into()))844 })845}846847fn builtin_ascii_lower(848 context: Context,849 _loc: Option<&ExprLocation>,850 args: &ArgsDesc,851) -> Result<Val> {852 parse_args!(context, "asciiLower", args, 1, [853 0, str: ty!(string) => Val::Str;854 ], {855 Ok(Val::Str(str.to_ascii_lowercase().into()))856 })857}858859fn builtin_member(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {860 parse_args!(context, "member", args, 2, [861 0, arr: ty!((array | string));862 1, x: ty!(any);863 ], {864 match arr {865 Val::Str(s) => {866 let x = x.try_cast_str("x should be string")?;867 Ok(Val::Bool(!x.is_empty() && s.contains(&*x)))868 }869 Val::Arr(a) => {870 for item in a.iter() {871 let item = item?;872 if equals(&item, &x)? {873 return Ok(Val::Bool(true));874 }875 }876 Ok(Val::Bool(false))877 }878 _ => unreachable!(),879 }880 })881}882883fn builtin_count(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {884 parse_args!(context, "count", args, 2, [885 0, arr: ty!(array) => Val::Arr;886 1, x: ty!(any);887 ], {888 let mut count = 0;889 for item in arr.iter() {890 let item = item?;891 if equals(&item, &x)? {892 count += 1;893 }894 }895 Ok(Val::Num(count as f64))896 })897}830898831pub fn call_builtin(899pub fn call_builtin(832 context: Context,900 context: Context,crates/jrsonnet-evaluator/src/builtin/stdlib.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/builtin/stdlib.rs
+++ b/crates/jrsonnet-evaluator/src/builtin/stdlib.rs
@@ -5,15 +5,6 @@
/// To avoid parsing again when issued from the same thread
#[allow(unreachable_code)]
static PARSED_STDLIB: LocExpr = {
- #[cfg(feature = "codegenerated-stdlib")]
- {
- #[allow(clippy::all)]
- return {
- use jrsonnet_parser::*;
- include!(concat!(env!("OUT_DIR"), "/stdlib.rs"))
- };
- }
-
#[cfg(feature = "serialized-stdlib")]
{
// Should not panic, stdlib.bincode is generated in build.rs
crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/lib.rs
+++ b/crates/jrsonnet-evaluator/src/lib.rs
@@ -1045,4 +1045,27 @@
.unwrap_err();
assert_eq!(error.error().to_string(), "assert failed: is number");
}
+
+ #[test]
+ fn test_ascii_upper_lower() {
+ assert_eval!(r#"std.assertEqual(std.asciiUpper("aBc😀"), "ABC😀")"#);
+ assert_eval!(r#"std.assertEqual(std.asciiLower("aBc😀"), "abc😀")"#);
+ }
+
+ #[test]
+ fn test_member() {
+ assert_eval!(r#"!std.member("", "")"#);
+ assert_eval!(r#"std.member("abc", "a")"#);
+ assert_eval!(r#"!std.member("abc", "d")"#);
+ assert_eval!(r#"!std.member([], "")"#);
+ assert_eval!(r#"std.member(["a", "b", "c"], "a")"#);
+ assert_eval!(r#"!std.member(["a", "b", "c"], "d")"#);
+ }
+
+ #[test]
+ fn test_count() {
+ assert_eval!(r#"std.assertEqual(std.count([], ""), 0)"#);
+ assert_eval!(r#"std.assertEqual(std.count(["a", "b", "a"], "d"), 0)"#);
+ assert_eval!(r#"std.assertEqual(std.count(["a", "b", "a"], "a"), 2)"#);
+ }
}
crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -128,21 +128,9 @@
strReplace:: $intrinsic(strReplace),
- asciiUpper(str)::
- local cp = std.codepoint;
- local up_letter(c) = if cp(c) >= 97 && cp(c) < 123 then
- std.char(cp(c) - 32)
- else
- c;
- std.join('', std.map(up_letter, std.stringChars(str))),
+ asciiUpper:: $intrinsic(asciiUpper),
- asciiLower(str)::
- local cp = std.codepoint;
- local down_letter(c) = if cp(c) >= 65 && cp(c) < 91 then
- std.char(cp(c) + 32)
- else
- c;
- std.join('', std.map(down_letter, std.stringChars(str))),
+ asciiLower:: $intrinsic(asciiLower),
range:: $intrinsic(range),
@@ -155,14 +143,9 @@
slice:: $intrinsic(slice),
- member(arr, x)::
- if std.isArray(arr) then
- std.count(arr, x) > 0
- else if std.isString(arr) then
- std.length(std.findSubstr(x, arr)) > 0
- else error 'std.member first argument must be an array or a string',
+ member:: $intrinsic(member),
- count(arr, x):: std.length(std.filter(function(v) v == x, arr)),
+ count:: $intrinsic(count),
mod:: $intrinsic(mod),