git.delta.rocks / jrsonnet / refs/commits / be6d2bdf9187

difftreelog

perf(stdlib) remove allocation from std.base64

Yaroslav Bolyukin2022-11-20parent: #587f5b8.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-stdlib/src/encoding.rsdiffbeforeafterboth
before · crates/jrsonnet-stdlib/src/encoding.rs
1use jrsonnet_evaluator::{2	error::{ErrorKind::RuntimeError, Result},3	function::builtin,4	typed::{Either, Either2},5	IBytes, IStr,6};78#[builtin]9pub fn builtin_encode_utf8(str: IStr) -> Result<IBytes> {10	Ok(str.cast_bytes())11}1213#[builtin]14pub fn builtin_decode_utf8(arr: IBytes) -> Result<IStr> {15	Ok(arr16		.cast_str()17		.ok_or_else(|| RuntimeError("bad utf8".into()))?)18}1920#[builtin]21pub fn builtin_base64(input: Either![IBytes, IStr]) -> Result<String> {22	use Either2::*;23	Ok(match input {24		A(a) => base64::encode(a.as_slice()),25		B(l) => base64::encode(l.bytes().collect::<Vec<_>>()),26	})27}2829#[builtin]30pub fn builtin_base64_decode_bytes(input: IStr) -> Result<IBytes> {31	Ok(base64::decode(input.as_bytes())32		.map_err(|_| RuntimeError("bad base64".into()))?33		.as_slice()34		.into())35}3637#[builtin]38pub fn builtin_base64_decode(input: IStr) -> Result<String> {39	let bytes = base64::decode(input.as_bytes()).map_err(|_| RuntimeError("bad base64".into()))?;40	Ok(String::from_utf8(bytes).map_err(|_| RuntimeError("bad utf8".into()))?)41}
after · crates/jrsonnet-stdlib/src/encoding.rs
1use jrsonnet_evaluator::{2	error::{ErrorKind::RuntimeError, Result},3	function::builtin,4	typed::{Either, Either2},5	IBytes, IStr,6};78#[builtin]9pub fn builtin_encode_utf8(str: IStr) -> Result<IBytes> {10	Ok(str.cast_bytes())11}1213#[builtin]14pub fn builtin_decode_utf8(arr: IBytes) -> Result<IStr> {15	Ok(arr16		.cast_str()17		.ok_or_else(|| RuntimeError("bad utf8".into()))?)18}1920#[builtin]21pub fn builtin_base64(input: Either![IStr, IBytes]) -> Result<String> {22	use Either2::*;23	Ok(match input {24		A(l) => base64::encode(l.as_bytes()),25		B(a) => base64::encode(a.as_slice()),26	})27}2829#[builtin]30pub fn builtin_base64_decode_bytes(input: IStr) -> Result<IBytes> {31	Ok(base64::decode(input.as_bytes())32		.map_err(|_| RuntimeError("bad base64".into()))?33		.as_slice()34		.into())35}3637#[builtin]38pub fn builtin_base64_decode(input: IStr) -> Result<String> {39	let bytes = base64::decode(input.as_bytes()).map_err(|_| RuntimeError("bad base64".into()))?;40	Ok(String::from_utf8(bytes).map_err(|_| RuntimeError("bad utf8".into()))?)41}
modifiedcrates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/lib.rs
+++ b/crates/jrsonnet-stdlib/src/lib.rs
@@ -253,7 +253,7 @@
 				context.build()
 			},
 			#[cfg(feature = "legacy-this-file")]
-			stdlib_obj: stdlib_uncached(s, settings.clone()),
+			stdlib_obj: stdlib_uncached(settings.clone()),
 			settings,
 		}
 	}
@@ -318,17 +318,14 @@
 		builder
 			.member("thisFile".into())
 			.hide()
-			.value(
-				s,
-				Val::Str(match source.source_path().path() {
-					Some(p) => self.settings().path_resolver.resolve(p).into(),
-					None => source.source_path().to_string().into(),
-				}),
-			)
+			.value(Val::Str(match source.source_path().path() {
+				Some(p) => self.settings().path_resolver.resolve(p).into(),
+				None => source.source_path().to_string().into(),
+			}))
 			.expect("this object builder is empty");
 		let stdlib_with_this_file = builder.build();
 
-		let mut context = ContextBuilder::with_capacity(1);
+		let mut context = ContextBuilder::with_capacity(s, 1);
 		context.bind(
 			"std".into(),
 			Thunk::evaluated(Val::Obj(stdlib_with_this_file)),