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
--- a/bindings/jsonnet/src/lib.rs
+++ b/bindings/jsonnet/src/lib.rs
@@ -8,7 +8,7 @@
 	alloc::Layout,
 	any::Any,
 	cell::RefCell,
-	collections::BTreeMap,
+	collections::HashMap,
 	ffi::{CStr, CString},
 	fs::File,
 	io::Read,
@@ -191,7 +191,7 @@
 ) {
 	match obj {
 		Val::Obj(old) => {
-			let mut new = BTreeMap::new();
+			let mut new = HashMap::new();
 			new.insert(
 				CStr::from_ptr(name).to_str().unwrap().into(),
 				ObjMember {
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
10 Visibility,10 Visibility,
11};11};
12use std::{12use std::{collections::HashMap, rc::Rc};
13 collections::{BTreeMap, HashMap},
14 rc::Rc,
15};
1613
17pub fn evaluate_binding(b: &BindSpec, context_creator: ContextCreator) -> (Rc<str>, LazyBinding) {14pub fn evaluate_binding(b: &BindSpec, context_creator: ContextCreator) -> (Rc<str>, LazyBinding) {
242 new_bindings.fill(bindings);239 new_bindings.fill(bindings);
243 }240 }
244241
245 let mut new_members = BTreeMap::new();242 let mut new_members = HashMap::new();
246 for member in members.iter() {243 for member in members.iter() {
247 match member {244 match member {
248 Member::Field(FieldMember {245 Member::Field(FieldMember {
317 ObjBody::MemberList(members) => evaluate_member_list_object(context, &members)?,314 ObjBody::MemberList(members) => evaluate_member_list_object(context, &members)?,
318 ObjBody::ObjComp(obj) => {315 ObjBody::ObjComp(obj) => {
319 let future_this = FutureObjValue::new();316 let future_this = FutureObjValue::new();
320 let mut new_members = BTreeMap::new();317 let mut new_members = HashMap::new();
321 for (k, v) in evaluate_comp(318 for (k, v) in evaluate_comp(
322 context.clone(),319 context.clone(),
323 &|ctx| {320 &|ctx| {
450 0, obj: [Val::Obj]!!Val::Obj, vec![ValType::Obj];447 0, obj: [Val::Obj]!!Val::Obj, vec![ValType::Obj];
451 1, inc_hidden: [Val::Bool]!!Val::Bool, vec![ValType::Bool];448 1, inc_hidden: [Val::Bool]!!Val::Bool, vec![ValType::Bool];
452 ], {449 ], {
453 Ok(Val::Arr(Rc::new(
454 obj.fields_visibility()450 let mut out = obj.fields_visibility()
455 .into_iter()451 .into_iter()
456 .filter(|(_k, v)| *v || inc_hidden)452 .filter(|(_k, v)| *v || inc_hidden)
457 .map(|(k, _v)| Val::Str(k))453 .map(|(k, _v)|k)
454 .collect::<Vec<_>>();
455 out.sort();
458 .collect(),456 Ok(Val::Arr(Rc::new(out.into_iter().map(Val::Str).collect())))
459 )))
460 }))?457 }))?
461 }458 }
462 // object, field, includeHidden459 // 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);