difftreelog
perf(evaluator) use hashmap for object body
in: master
4 files changed
bindings/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 {
crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth10 Visibility,10 Visibility,11};11};12use std::{12use std::{collections::HashMap, rc::Rc};13 collections::{BTreeMap, HashMap},14 rc::Rc,15};161317pub 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 }244241245 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, includeHiddencrates/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 {
crates/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);