git.delta.rocks / jrsonnet / refs/commits / 625fbae2cdcf

difftreelog

perf(evaluator) use hashmap for object body

Лач2020-07-01parent: #dcbb761.patch.diff
in: master

4 files changed

modifiedbindings/jsonnet/src/lib.rsdiffbeforeafterboth
8 alloc::Layout,8 alloc::Layout,
9 any::Any,9 any::Any,
10 cell::RefCell,10 cell::RefCell,
11 collections::BTreeMap,11 collections::HashMap,
12 ffi::{CStr, CString},12 ffi::{CStr, CString},
13 fs::File,13 fs::File,
14 io::Read,14 io::Read,
191) {191) {
192 match obj {192 match obj {
193 Val::Obj(old) => {193 Val::Obj(old) => {
194 let mut new = BTreeMap::new();194 let mut new = HashMap::new();
195 new.insert(195 new.insert(
196 CStr::from_ptr(name).to_str().unwrap().into(),196 CStr::from_ptr(name).to_str().unwrap().into(),
197 ObjMember {197 ObjMember {
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -9,10 +9,7 @@
 	ForSpecData, IfSpecData, LiteralType, LocExpr, Member, ObjBody, ParamsDesc, UnaryOpType,
 	Visibility,
 };
-use std::{
-	collections::{BTreeMap, HashMap},
-	rc::Rc,
-};
+use std::{collections::HashMap, rc::Rc};
 
 pub fn evaluate_binding(b: &BindSpec, context_creator: ContextCreator) -> (Rc<str>, LazyBinding) {
 	let b = b.clone();
@@ -242,7 +239,7 @@
 		new_bindings.fill(bindings);
 	}
 
-	let mut new_members = BTreeMap::new();
+	let mut new_members = HashMap::new();
 	for member in members.iter() {
 		match member {
 			Member::Field(FieldMember {
@@ -317,7 +314,7 @@
 		ObjBody::MemberList(members) => evaluate_member_list_object(context, &members)?,
 		ObjBody::ObjComp(obj) => {
 			let future_this = FutureObjValue::new();
-			let mut new_members = BTreeMap::new();
+			let mut new_members = HashMap::new();
 			for (k, v) in evaluate_comp(
 				context.clone(),
 				&|ctx| {
@@ -450,13 +447,13 @@
 					0, obj: [Val::Obj]!!Val::Obj, vec![ValType::Obj];
 					1, inc_hidden: [Val::Bool]!!Val::Bool, vec![ValType::Bool];
 				], {
-					Ok(Val::Arr(Rc::new(
-						obj.fields_visibility()
-							.into_iter()
-							.filter(|(_k, v)| *v || inc_hidden)
-							.map(|(k, _v)| Val::Str(k))
-							.collect(),
-					)))
+					let mut out = obj.fields_visibility()
+						.into_iter()
+						.filter(|(_k, v)| *v || inc_hidden)
+						.map(|(k, _v)|k)
+						.collect::<Vec<_>>();
+					out.sort();
+					Ok(Val::Arr(Rc::new(out.into_iter().map(Val::Str).collect())))
 				}))?
 			}
 			// object, field, includeHidden
modifiedcrates/jrsonnet-evaluator/src/obj.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/obj.rs
+++ b/crates/jrsonnet-evaluator/src/obj.rs
@@ -1,12 +1,7 @@
 use crate::{evaluate_add_op, LazyBinding, Result, Val};
 use indexmap::IndexMap;
-use jrsonnet_parser::Visibility;
-use std::{
-	cell::RefCell,
-	collections::{BTreeMap, HashMap},
-	fmt::Debug,
-	rc::Rc,
-};
+use jrsonnet_parser::{ExprLocation, Visibility};
+use std::{cell::RefCell, collections::HashMap, fmt::Debug, rc::Rc};
 
 #[derive(Debug)]
 pub struct ObjMember {
@@ -18,7 +13,7 @@
 #[derive(Debug)]
 pub struct ObjValueInternals {
 	super_obj: Option<ObjValue>,
-	this_entries: Rc<BTreeMap<Rc<str>, ObjMember>>,
+	this_entries: Rc<HashMap<Rc<str>, ObjMember>>,
 	value_cache: RefCell<HashMap<Rc<str>, Val>>,
 }
 #[derive(Clone)]
@@ -44,7 +39,7 @@
 impl ObjValue {
 	pub fn new(
 		super_obj: Option<ObjValue>,
-		this_entries: Rc<BTreeMap<Rc<str>, ObjMember>>,
+		this_entries: Rc<HashMap<Rc<str>, ObjMember>>,
 	) -> ObjValue {
 		ObjValue(Rc::new(ObjValueInternals {
 			super_obj,
@@ -53,7 +48,7 @@
 		}))
 	}
 	pub fn new_empty() -> ObjValue {
-		Self::new(None, Rc::new(BTreeMap::new()))
+		Self::new(None, Rc::new(HashMap::new()))
 	}
 	pub fn with_super(&self, super_obj: ObjValue) -> ObjValue {
 		match &self.0.super_obj {
modifiedcrates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -246,7 +246,8 @@
 		}
 		Val::Obj(obj) => {
 			buf.push_str("{\n");
-			let fields = obj.visible_fields();
+			let mut fields = obj.visible_fields();
+			fields.sort();
 			if !fields.is_empty() {
 				let old_len = cur_padding.len();
 				cur_padding.push_str(padding);