git.delta.rocks / jrsonnet / refs/commits / 3d527a7bcaaf

difftreelog

perf use pointer equality in std.equals

Yaroslav Bolyukin2021-01-12parent: #c214d99.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/obj.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/obj.rs
+++ b/crates/jrsonnet-evaluator/src/obj.rs
@@ -139,6 +139,10 @@
 			.evaluate(Some(real_this.clone()), self.0.super_obj.clone())?
 			.evaluate()?)
 	}
+
+	pub fn ptr_eq(a: &ObjValue, b: &ObjValue) -> bool {
+		Rc::ptr_eq(&a.0, &b.0)
+	}
 }
 impl PartialEq for ObjValue {
 	fn eq(&self, other: &Self) -> bool {
modifiedcrates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth
254 }254 }
255 }255 }
256
257 pub fn ptr_eq(a: &ArrValue, b: &ArrValue) -> bool {
258 match (a, b) {
259 (ArrValue::Lazy(a), ArrValue::Lazy(b)) => Rc::ptr_eq(a, b),
260 (ArrValue::Eager(a), ArrValue::Eager(b)) => Rc::ptr_eq(a, b),
261 _ => false,
262 }
263 }
256}264}
257265
258impl From<Vec<LazyVal>> for ArrValue {266impl From<Vec<LazyVal>> for ArrValue {
533 return Ok(false);541 return Ok(false);
534 }542 }
535 match (val_a, val_b) {543 match (val_a, val_b) {
536 // Cant test for ptr equality, because all fields needs to be evaluated
537 (Val::Arr(a), Val::Arr(b)) => {544 (Val::Arr(a), Val::Arr(b)) => {
545 if ArrValue::ptr_eq(a, b) {
546 return Ok(true);
547 }
538 if a.len() != b.len() {548 if a.len() != b.len() {
539 return Ok(false);549 return Ok(false);
540 }550 }
546 Ok(true)556 Ok(true)
547 }557 }
548 (Val::Obj(a), Val::Obj(b)) => {558 (Val::Obj(a), Val::Obj(b)) => {
559 if ObjValue::ptr_eq(a, b) {
560 return Ok(true);
561 }
549 let fields = a.visible_fields();562 let fields = a.visible_fields();
550 if fields != b.visible_fields() {563 if fields != b.visible_fields() {
551 return Ok(false);564 return Ok(false);