git.delta.rocks / jrsonnet / refs/commits / 9e7e8fe7eb87

difftreelog

perf(evaluator) faster std.base64

Лач2020-07-02parent: #ceab885.patch.diff
in: master

4 files changed

modifiedCargo.lockdiffbeforeafterboth
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -108,6 +108,7 @@
 name = "jrsonnet-evaluator"
 version = "1.0.0"
 dependencies = [
+ "base64",
  "bincode",
  "closure",
  "indexmap",
modifiedcrates/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 }
modifiedcrates/jrsonnet-evaluator/build.rsdiffbeforeafterboth
before · crates/jrsonnet-evaluator/build.rs
1use 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}
after · crates/jrsonnet-evaluator/build.rs
1use 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" || **name == *"base64"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}
modifiedcrates/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];