difftreelog
feat add intristic calls to stack
in: master
2 files changed
crates/jrsonnet-evaluator/src/builtin/format.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/builtin/format.rs
+++ b/crates/jrsonnet-evaluator/src/builtin/format.rs
@@ -1,7 +1,7 @@
//! faster std.format impl
#![allow(clippy::too_many_arguments)]
-use crate::{error::Error::*, throw, to_string, LocError, ObjValue, Result, Val, ValType};
+use crate::{error::Error::*, throw, LocError, ObjValue, Result, Val, ValType};
#[derive(Debug, Clone)]
pub enum FormatError {
crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth4 error::Error::*,4 error::Error::*,5 escape_string_json, future_wrapper, lazy_val, manifest_json_ex, parse_args, primitive_equals,5 escape_string_json, future_wrapper, lazy_val, manifest_json_ex, parse_args, primitive_equals,6 push, throw, with_state, Context, ContextCreator, FuncDesc, LazyBinding, LazyVal, LocError,6 push, throw,7 val::ManifestJsonOptions,8 with_state, Context, ContextCreator, FuncDesc, LazyBinding, LazyVal, LocError, ManifestType,7 ObjMember, ObjValue, Result, Val, ValType,9 ObjMember, ObjValue, Result, Val, ValType,8};10};9use closure::closure;11use closure::closure;405 let lazy = evaluate(context.clone(), value)?;407 let lazy = evaluate(context.clone(), value)?;406 let value = lazy.unwrap_if_lazy()?;408 let value = lazy.unwrap_if_lazy()?;407 Ok(match value {409 Ok(match value {408 Val::Intristic(ns, name) => match (&ns as &str, &name as &str) {410 Val::Intristic(ns, name) => push(411 loc,412 || format!("intristic <{}.{}> call", ns, name),413 || {414 Ok(match (&ns as &str, &name as &str) {409 // arr/string/function415 // arr/string/function410 ("std", "length") => parse_args!(context, "std.length", args, 1, [416 ("std", "length") => parse_args!(context, "std.length", args, 1, [411 0, x: [Val::Str|Val::Arr|Val::Obj], vec![ValType::Str, ValType::Arr, ValType::Obj];417 0, x: [Val::Str|Val::Arr|Val::Obj], vec![ValType::Str, ValType::Arr, ValType::Obj];429 Ok(Val::Str(x.value_type()?.name().into()))435 Ok(Val::Str(x.value_type()?.name().into()))430 })?,436 })?,431 // length, idx=>any437 // length, idx=>any432 ("std", "makeArray") => noinline!(parse_args!(context, "std.makeArray", args, 2, [438 ("std", "makeArray") => {439 noinline!(parse_args!(context, "std.makeArray", args, 2, [433 0, sz: [Val::Num]!!Val::Num, vec![ValType::Num];440 0, sz: [Val::Num]!!Val::Num, vec![ValType::Num];434 1, func: [Val::Func]!!Val::Func, vec![ValType::Func];441 1, func: [Val::Func]!!Val::Func, vec![ValType::Func];444 )?)451 )?)445 }452 }446 Ok(Val::Arr(Rc::new(out)))453 Ok(Val::Arr(Rc::new(out)))447 }))?,454 }))?455 }448 // string456 // string449 ("std", "codepoint") => parse_args!(context, "std.codepoint", args, 1, [457 ("std", "codepoint") => parse_args!(context, "std.codepoint", args, 1, [450 0, str: [Val::Str]!!Val::Str, vec![ValType::Str];458 0, str: [Val::Str]!!Val::Str, vec![ValType::Str];483 .any(|(k, _v)| *k == *f),491 .any(|(k, _v)| *k == *f),484 ))492 ))485 })?,493 })?,486 ("std", "primitiveEquals") => parse_args!(context, "std.primitiveEquals", args, 2, [494 ("std", "primitiveEquals") => {495 parse_args!(context, "std.primitiveEquals", args, 2, [487 0, a, vec![];496 0, a, vec![];488 1, b, vec![];497 1, b, vec![];489 ], {498 ], {490 Ok(Val::Bool(primitive_equals(&a, &b)?))499 Ok(Val::Bool(primitive_equals(&a, &b)?))491 })?,500 })?501 }492 // faster502 // faster493 ("std", "equals") => parse_args!(context, "std.equals", args, 2, [503 ("std", "equals") => parse_args!(context, "std.equals", args, 2, [494 0, a, vec![];504 0, a, vec![];649 // faster659 // faster650 ("std", "range") => parse_args!(context, "std.range", args, 2, [660 ("std", "range") => parse_args!(context, "std.range", args, 2, [651 0, from: [Val::Num]!!Val::Num, vec![ValType::Num];661 0, from: [Val::Num]!!Val::Num, vec![ValType::Num];652 0, to: [Val::Num]!!Val::Num, vec![ValType::Num];662 1, to: [Val::Num]!!Val::Num, vec![ValType::Num];653 ], {663 ], {654 let mut out = Vec::with_capacity((1+to as usize-from as usize).max(0));664 let mut out = Vec::with_capacity((1+to as usize-from as usize).max(0));655 for i in from as usize..=to as usize {665 for i in from as usize..=to as usize {740 })750 })741 }))?,751 }))?,742 // Faster752 // Faster743 ("std", "escapeStringJson") => parse_args!(context, "std.escapeStringJson", args, 1, [753 ("std", "escapeStringJson") => {754 parse_args!(context, "std.escapeStringJson", args, 1, [744 0, str_: [Val::Str]!!Val::Str, vec![ValType::Str];755 0, str_: [Val::Str]!!Val::Str, vec![ValType::Str];745 ], {756 ], {746 Ok(Val::Str(escape_string_json(&str_).into()))757 Ok(Val::Str(escape_string_json(&str_).into()))747 })?,758 })?759 }748 // Faster760 // Faster749 ("std", "manifestJsonEx") => parse_args!(context, "std.manifestJsonEx", args, 2, [761 ("std", "manifestJsonEx") => {762 parse_args!(context, "std.manifestJsonEx", args, 2, [750 0, value, vec![];763 0, value, vec![];751 1, indent: [Val::Str]!!Val::Str, vec![ValType::Str];764 1, indent: [Val::Str]!!Val::Str, vec![ValType::Str];752 ], {765 ], {753 Ok(Val::Str(manifest_json_ex(&value, &indent)?.into()))766 Ok(Val::Str(manifest_json_ex(&value, &ManifestJsonOptions {767 padding: &indent,768 mtype: ManifestType::Std,769 })?.into()))754 })?,770 })?771 }755 (ns, name) => throw!(IntristicNotFound(ns.into(), name.into())),772 (ns, name) => throw!(IntristicNotFound(ns.into(), name.into())),756 },773 })774 },775 )?,757 Val::Func(f) => {776 Val::Func(f) => {758 let body = || f.evaluate(context, args, tailstrict);777 let body = || f.evaluate(context, args, tailstrict);759 if tailstrict {778 if tailstrict {