difftreelog
perf(stdlib) remove allocation from std.base64
in: master
2 files changed
crates/jrsonnet-stdlib/src/encoding.rsdiffbeforeafterboth1use 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}crates/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)),