git.delta.rocks / jrsonnet / refs/commits / 56c40a985e8c

difftreelog

feat add intristic calls to stack

Лач2020-07-24parent: #ba7b562.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/builtin/format.rsdiffbeforeafterboth
1//! faster std.format impl1//! faster std.format impl
2#![allow(clippy::too_many_arguments)]2#![allow(clippy::too_many_arguments)]
33
4use crate::{error::Error::*, throw, to_string, LocError, ObjValue, Result, Val, ValType};4use crate::{error::Error::*, throw, LocError, ObjValue, Result, Val, ValType};
55
6#[derive(Debug, Clone)]6#[derive(Debug, Clone)]
7pub enum FormatError {7pub enum FormatError {
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
4 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/function
410 ("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=>any
432 ("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 // string
449 ("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 // faster
493 ("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 // faster
650 ("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 // Faster
743 ("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 // Faster
749 ("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 {