From 6a58b0ec338651c2434f912c521f8963eccad5df Mon Sep 17 00:00:00 2001 From: Лач Date: Fri, 26 Jun 2020 11:43:19 +0000 Subject: [PATCH] perf: use json serialization directly --- --- a/cmds/jrsonnet/src/main.rs +++ b/cmds/jrsonnet/src/main.rs @@ -5,7 +5,7 @@ use jsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParserSettings}; use location::{offset_to_location, CodeLocation}; use std::env::current_dir; -use std::{collections::HashMap, path::PathBuf, str::FromStr, rc::Rc}; +use std::{collections::HashMap, path::PathBuf, rc::Rc, str::FromStr}; enum Format { None, @@ -173,40 +173,20 @@ } v => v, }; - let v = match opts.format { - Format::Json => { - if opts.no_stdlib { - evaluator.with_stdlib(); - } - evaluator.add_global("__tmp__to_json__".into(), v); - let v = evaluator.parse_evaluate_raw(&format!( - "std.manifestJsonEx(__tmp__to_json__, \"{}\")", - " ".repeat(opts.line_padding), - )); - match v { - Ok(v) => v, - Err(err) => { - print_error(&err, evaluator, &opts); - std::process::exit(1); - } - } - } + let v = evaluator.run_in_state(|| match opts.format { + Format::Json => Ok(Val::Str(v.into_json(opts.line_padding)?)), Format::Yaml => { - if opts.no_stdlib { - evaluator.with_stdlib(); - } evaluator.add_global("__tmp__to_yaml__".into(), v); - let v = evaluator - .parse_evaluate_raw("std.manifestYamlDoc(__tmp__to_yaml__, \" \")"); - match v { - Ok(v) => v, - Err(err) => { - print_error(&err, evaluator, &opts); - std::process::exit(1); - } - } + evaluator.parse_evaluate_raw("std.manifestYamlDoc(__tmp__to_yaml__, \" \")") + } + _ => Ok(v), + }); + let v = match v { + Ok(v) => v, + Err(err) => { + print_error(&err, evaluator, &opts); + std::process::exit(1); } - _ => v, }; match v { Val::Str(s) => println!("{}", s), --- a/crates/jsonnet-evaluator/src/evaluate.rs +++ b/crates/jsonnet-evaluator/src/evaluate.rs @@ -668,6 +668,7 @@ ) { Val::Arr(Rc::new( arr.iter() + .cloned() .filter(|e| { predicate .evaluate_values(context.clone(), &[e.clone()]) @@ -675,7 +676,6 @@ .try_cast_bool("filter predicate") .unwrap() }) - .cloned() .collect(), )) } else { --- a/crates/jsonnet-evaluator/src/lib.rs +++ b/crates/jsonnet-evaluator/src/lib.rs @@ -296,7 +296,7 @@ Err(LocError(err, self.stack_trace())) } - fn run_in_state(&self, f: impl FnOnce() -> T) -> T { + pub fn run_in_state(&self, f: impl FnOnce() -> T) -> T { EVAL_STATE.with(|v| { let has_state = v.borrow().is_some(); if !has_state { @@ -364,14 +364,11 @@ ($str: expr) => {{ let evaluator = EvaluationState::default(); evaluator.with_stdlib(); - let val = evaluator.parse_evaluate_raw($str).unwrap(); - evaluator.add_global("__tmp__to_yaml__".into(), val); evaluator - .parse_evaluate_raw("std.manifestJsonEx(__tmp__to_yaml__, \"\")") + .parse_evaluate_raw($str) .unwrap() - .try_cast_str("there should be json string") + .into_json(0) .unwrap() - .clone() .replace("\n", "") }}; } --- a/crates/jsonnet-evaluator/src/val.rs +++ b/crates/jsonnet-evaluator/src/val.rs @@ -1,9 +1,9 @@ use crate::{ create_error, evaluate, function::{inline_parse_function_call, place_args}, - with_state, Context, Error, ObjValue, Result, + Context, Error, ObjValue, Result, }; -use jsonnet_parser::{el, Arg, ArgsDesc, Expr, LocExpr, ParamsDesc}; +use jsonnet_parser::{ArgsDesc, LocExpr, ParamsDesc}; use std::{ cell::RefCell, fmt::{Debug, Display}, @@ -170,6 +170,11 @@ Val::Lazy(_) => self.clone().unwrap_if_lazy()?.value_type()?, }) } + #[cfg(feature = "faster")] + pub fn into_json(self, padding: usize) -> Result> { + manifest_json_ex(&self, &" ".repeat(padding)).map(|s| s.into()) + } + #[cfg(not(feature = "faster"))] pub fn into_json(self, padding: usize) -> Result> { with_state(|s| { let ctx = s -- gitstuff