difftreelog
fix(evaluator) indirect_self bug
in: master
4 files changed
Cargo.lockdiffbeforeafterboth--- 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",
]
crates/jsonnet-evaluator/src/ctx.rsdiffbeforeafterboth--- a/crates/jsonnet-evaluator/src/ctx.rs
+++ b/crates/jsonnet-evaluator/src/ctx.rs
@@ -74,7 +74,6 @@
new_this: Option<ObjValue>,
new_super_obj: Option<ObjValue>,
) -> 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());
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth--- 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<ObjValue>, super_obj: Option<ObjValue>| {
- println!("Context created");
+ closure!(clone context, clone future_bindings, clone future_this, |this: Option<ObjValue>, super_obj: Option<ObjValue>| {
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()
crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth192 // `self` assigned to `me` was lost when being192 // `self` assigned to `me` was lost when being193 // referenced from field193 // referenced from field194 eval_stdlib!(194 eval_stdlib!(195 r#"{195 r#"{196 local me = std.trace("test", self),196 local me = self,197 b: me,197 b: me,198 }.b"#198 }.b"#199 );199 );200 }200 }201201