difftreelog
perf(evaluator) faster std.base64
in: master
4 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -108,6 +108,7 @@
name = "jrsonnet-evaluator"
version = "1.0.0"
dependencies = [
+ "base64",
"bincode",
"closure",
"indexmap",
crates/jrsonnet-evaluator/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-evaluator/Cargo.toml
+++ b/crates/jrsonnet-evaluator/Cargo.toml
@@ -24,6 +24,7 @@
jrsonnet-stdlib = { path = "../jrsonnet-stdlib", version = "1.0.0" }
indexmap = "1.4.0"
md5 = "0.7.0"
+base64 = "0.12.3"
serde = { version = "1.0.114", optional = true }
bincode = { version = "1.3.1", optional = true }
crates/jrsonnet-evaluator/build.rsdiffbeforeafterboth1use bincode::serialize;2use jrsonnet_parser::{3 parse, Expr, FieldMember, FieldName, LocExpr, Member, ObjBody, ParserSettings,4};5use jrsonnet_stdlib::STDLIB_STR;6use std::{7 env,8 fs::File,9 io::Write,10 path::{Path, PathBuf},11 rc::Rc,12};13use structdump::CodegenResult;1415fn main() {16 let parsed = parse(17 STDLIB_STR,18 &ParserSettings {19 file_name: Rc::new(PathBuf::from("std.jsonnet")),20 loc_data: true,21 },22 )23 .expect("parse");2425 let parsed = if cfg!(feature = "faster") {26 let LocExpr(expr, location) = parsed;27 LocExpr(28 Rc::new(match Rc::try_unwrap(expr).unwrap() {29 Expr::Obj(ObjBody::MemberList(members)) => Expr::Obj(ObjBody::MemberList(30 members31 .into_iter()32 .filter(|p| {33 !matches!(34 p,35 Member::Field(FieldMember {36 name: FieldName::Fixed(name),37 ..38 }) if **name == *"join" || **name == *"manifestJsonEx" || **name == *"escapeStringJson" || **name == *"equals"39 )40 })41 .collect(),42 )),43 _ => panic!("std value should be object"),44 }),45 location,46 )47 } else {48 parsed49 };50 {51 let mut codegen = CodegenResult::default();52 let code = codegen.codegen(&parsed);5354 let out_dir = env::var("OUT_DIR").unwrap();55 let dest_path = Path::new(&out_dir).join("stdlib.rs");56 let mut f = File::create(&dest_path).unwrap();57 f.write_all(&code.as_bytes()).unwrap();58 }59 {60 let out_dir = env::var("OUT_DIR").unwrap();61 let dest_path = Path::new(&out_dir).join("stdlib.bincode");62 let mut f = File::create(&dest_path).unwrap();63 f.write_all(&serialize(&parsed).unwrap()).unwrap();64 }65}crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -566,6 +566,22 @@
Ok(Val::Str(format!("{:x}", md5::compute(&str.as_bytes())).into()))
}))?,
// faster
+ ("std", "base64") => parse_args!(context, "std.base64", args, 1, [
+ 0, input: [Val::Str | Val::Arr], vec![ValType::Arr, ValType::Str];
+ ], {
+ Val::Str(match input {
+ Val::Str(s) => {
+ base64::encode(s.bytes().collect::<Vec<_>>()).into()
+ },
+ Val::Arr(a) => {
+ base64::encode(a.iter().map(|v| {
+ Ok(v.clone().try_cast_num("base64 array")? as u8)
+ }).collect::<Result<Vec<_>>>()?).into()
+ },
+ _ => unreachable!()
+ })
+ }),
+ // faster
("std", "join") => noinline!(parse_args!(context, "std.join", args, 2, [
0, sep: [Val::Str|Val::Arr], vec![ValType::Str, ValType::Arr];
1, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];