git.delta.rocks / jrsonnet / refs/commits / 6a58b0ec3386

difftreelog

perf use json serialization directly

Лач2020-06-26parent: #bb84d33.patch.diff
in: master

4 files changed

modifiedcmds/jrsonnet/src/main.rsdiffbeforeafterboth
--- 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),
modifiedcrates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
--- 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 {
modifiedcrates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth
296 Err(LocError(err, self.stack_trace()))296 Err(LocError(err, self.stack_trace()))
297 }297 }
298298
299 fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {299 pub fn run_in_state<T>(&self, f: impl FnOnce() -> T) -> T {
300 EVAL_STATE.with(|v| {300 EVAL_STATE.with(|v| {
301 let has_state = v.borrow().is_some();301 let has_state = v.borrow().is_some();
302 if !has_state {302 if !has_state {
364 ($str: expr) => {{364 ($str: expr) => {{
365 let evaluator = EvaluationState::default();365 let evaluator = EvaluationState::default();
366 evaluator.with_stdlib();366 evaluator.with_stdlib();
367 let val = evaluator.parse_evaluate_raw($str).unwrap();367 evaluator
368 .parse_evaluate_raw($str)
369 .unwrap()
368 evaluator.add_global("__tmp__to_yaml__".into(), val);370 .into_json(0)
369 evaluator
370 .parse_evaluate_raw("std.manifestJsonEx(__tmp__to_yaml__, \"\")")
371 .unwrap()371 .unwrap()
372 .try_cast_str("there should be json string")
373 .unwrap()
374 .clone()
375 .replace("\n", "")372 .replace("\n", "")
376 }};373 }};
377 }374 }
modifiedcrates/jsonnet-evaluator/src/val.rsdiffbeforeafterboth
--- 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<Rc<str>> {
+		manifest_json_ex(&self, &" ".repeat(padding)).map(|s| s.into())
+	}
+	#[cfg(not(feature = "faster"))]
 	pub fn into_json(self, padding: usize) -> Result<Rc<str>> {
 		with_state(|s| {
 			let ctx = s