From 2e6febe0ffcda089478ea1e10cd543d9bafd7a32 Mon Sep 17 00:00:00 2001 From: Лач Date: Sat, 30 May 2020 21:08:37 +0000 Subject: [PATCH] fix(evaluator): indirect_self bug --- --- a/Cargo.lock +++ b/Cargo.lock @@ -1,9 +1,16 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] +name = "closure" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6173fd61b610d15a7566dd7b7620775627441c4ab9dac8906e17cb93a24b782" + +[[package]] name = "jsonnet-evaluator" version = "0.1.0" dependencies = [ + "closure", "jsonnet-parser", "jsonnet-stdlib", ] --- a/crates/jsonnet-evaluator/src/ctx.rs +++ b/crates/jsonnet-evaluator/src/ctx.rs @@ -74,7 +74,6 @@ new_this: Option, new_super_obj: Option, ) -> Context { - println!("Extend with {:?} {:?}", new_dollar, new_this); let dollar = new_dollar.or_else(|| self.0.dollar.clone()); let this = new_this.or_else(|| self.0.this.clone()); let super_obj = new_super_obj.or_else(|| self.0.super_obj.clone()); --- a/crates/jsonnet-evaluator/src/evaluate.rs +++ b/crates/jsonnet-evaluator/src/evaluate.rs @@ -29,9 +29,8 @@ } else { ( b.name.clone(), - binding!(move |this, super_obj| { - println!("Evaluating binding"); - Val::Lazy(lazy_val!( + binding!(move |this, super_obj| { + Val::Lazy(lazy_val!( closure!(clone context_creator, clone b, || evaluate( context_creator.0(this.clone(), super_obj.clone()), &b.value @@ -137,12 +136,11 @@ let future_bindings = FutureNewBindings::new(); let future_this = FutureObjValue::new(); let context_creator = context_creator!( - closure!(clone context, clone future_bindings, |this: Option, super_obj: Option| { - println!("Context created"); + closure!(clone context, clone future_bindings, clone future_this, |this: Option, super_obj: Option| { context.clone().extend( future_bindings.clone().unwrap(), context.clone().dollar().clone().or_else(||this.clone()), - this, + Some(future_this.clone().unwrap()), super_obj ) }) @@ -154,15 +152,12 @@ Member::BindStmt(b) => Some(b.clone()), _ => None, }) - .map(|b| { - evaluate_binding(&b, context_creator.clone()) - }) + .map(|b| evaluate_binding(&b, context_creator.clone())) { bindings.insert(n, b); } future_bindings.fill(bindings); - println!("Bindings filled"); let mut new_members = BTreeMap::new(); for member in members.into_iter() { match member { @@ -180,8 +175,7 @@ add: plus, visibility: visibility.clone(), invoke: binding!( - closure!(clone value, clone context_creator, clone future_this, |this, super_obj| { - // FIXME: I should take "this" instead of "future_this" there? + closure!(clone value, clone context_creator, |this, super_obj| { // TODO: Assert evaluate( context_creator.0(this, super_obj), @@ -205,8 +199,7 @@ add: false, visibility: Visibility::Hidden, invoke: binding!( - closure!(clone value, clone context_creator, clone future_this, |this, super_obj| { - // FIXME: I should take "this" instead of "future_this" there? + closure!(clone value, clone context_creator, |this, super_obj| { // TODO: Assert evaluate_method( context_creator.0(this, super_obj), @@ -231,15 +224,12 @@ pub fn evaluate(context: Context, expr: &Expr) -> Val { use Expr::*; match &*expr { - Literal(LiteralType::This) => { - println!("{:?}", context.this()); - Val::Obj( - context - .this() - .clone() - .unwrap_or_else(|| panic!("this not found")), - ) - } + Literal(LiteralType::This) => Val::Obj( + context + .this() + .clone() + .unwrap_or_else(|| panic!("this not found")), + ), Literal(LiteralType::Super) => Val::Obj( context .super_obj() --- a/crates/jsonnet-evaluator/src/lib.rs +++ b/crates/jsonnet-evaluator/src/lib.rs @@ -193,7 +193,7 @@ // referenced from field eval_stdlib!( r#"{ - local me = std.trace("test", self), + local me = self, b: me, }.b"# ); -- gitstuff