difftreelog
feat trace function names
in: master
2 files changed
crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth1use crate::{1use crate::{2 context_creator, create_error, create_error_result, escape_string_json, future_wrapper,2 context_creator, create_error, create_error_result, equals, escape_string_json, future_wrapper,3 lazy_val, manifest_json_ex, parse_args, push, with_state, Context, ContextCreator, Error,3 lazy_val, manifest_json_ex, parse_args, primitive_equals, push, with_state, Context,4 FuncDesc, LazyBinding, LazyVal, ObjMember, ObjValue, Result, Val, ValType,4 ContextCreator, Error, FuncDesc, LazyBinding, LazyVal, ObjMember, ObjValue, Result, Val,5 ValType,5};6};21 Ok(lazy_val!(22 Ok(lazy_val!(22 closure!(clone b, clone params, clone context_creator, || Ok(evaluate_method(23 closure!(clone b, clone params, clone context_creator, || Ok(evaluate_method(23 context_creator.0(this.clone(), super_obj.clone())?,24 context_creator.0(this.clone(), super_obj.clone())?,25 b.name.clone(),24 params.clone(),26 params.clone(),25 b.value.clone(),27 b.value.clone(),26 )))28 )))32 b.name.clone(),34 b.name.clone(),33 LazyBinding::Bindable(Rc::new(move |this, super_obj| {35 LazyBinding::Bindable(Rc::new(move |this, super_obj| {34 Ok(lazy_val!(closure!(clone context_creator, clone b, ||36 Ok(lazy_val!(closure!(clone context_creator, clone b, ||35 push(&b.value.1, "thunk", ||{37 evaluate_named(36 evaluate(37 context_creator.0(this.clone(), super_obj.clone())?,38 context_creator.0(this.clone(), super_obj.clone())?,38 &b.value39 &b.value,39 )40 b.name.clone()40 })41 )41 )))42 )))42 })),43 })),43 )44 )44 }45 }45}46}464747pub fn evaluate_method(ctx: Context, params: ParamsDesc, body: LocExpr) -> Val {48pub fn evaluate_method(ctx: Context, name: Rc<str>, params: ParamsDesc, body: LocExpr) -> Val {48 Val::Func(FuncDesc { ctx, params, body })49 Val::Func(Rc::new(FuncDesc {50 name,51 ctx,52 params,53 body,54 }))49}55}505651pub fn evaluate_field_name(57pub fn evaluate_field_name(289 }295 }290 let name = name.unwrap();296 let name = name.unwrap();291 new_members.insert(297 new_members.insert(292 name,298 name.clone(),293 ObjMember {299 ObjMember {294 add: false,300 add: false,295 visibility: Visibility::Hidden,301 visibility: Visibility::Hidden,296 invoke: LazyBinding::Bindable(Rc::new(302 invoke: LazyBinding::Bindable(Rc::new(297 closure!(clone value, clone context_creator, clone params, |this, super_obj| {303 closure!(clone value, clone context_creator, clone params, clone name, |this, super_obj| {298 // TODO: Assert304 // TODO: Assert299 Ok(LazyVal::new_resolved(evaluate_method(305 Ok(LazyVal::new_resolved(evaluate_method(300 context_creator.0(this, super_obj)?,306 context_creator.0(this, super_obj)?,307 name.clone(),301 params.clone(),308 params.clone(),302 value.clone(),309 value.clone(),303 )))310 )))647 if tailstrict {654 if tailstrict {648 body()?655 body()?649 } else {656 } else {650 push(loc, "function call", body)?657 push(loc, || format!("function <{}> call", f.name), body)?651 }658 }652 }659 }653 v => create_error_result(crate::Error::OnlyFunctionsCanBeCalledGot(v.value_type()?))?,660 v => create_error_result(crate::Error::OnlyFunctionsCanBeCalledGot(v.value_type()?))?,654 })661 })655}662}663664pub fn evaluate_named(context: Context, lexpr: &LocExpr, name: Rc<str>) -> Result<Val> {665 use Expr::*;666 let LocExpr(expr, _loc) = lexpr;667 Ok(match &**expr {668 Function(params, body) => evaluate_method(context, name, params.clone(), body.clone()),669 _ => evaluate(context, lexpr)?,670 })671}656672657pub fn evaluate(context: Context, expr: &LocExpr) -> Result<Val> {673pub fn evaluate(context: Context, expr: &LocExpr) -> Result<Val> {658 use Expr::*;674 use Expr::*;680 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?,696 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?,681 Var(name) => push(697 Var(name) => push(682 loc,698 loc,683 || "var".to_owned(),699 || format!("variable <{}>", name),684 || Ok(Val::Lazy(context.binding(name.clone())?).unwrap_if_lazy()?),700 || Ok(Val::Lazy(context.binding(name.clone())?).unwrap_if_lazy()?),685 )?,701 )?,686 Index(LocExpr(v, _), index) if matches!(&**v, Expr::Literal(LiteralType::Super)) => {702 Index(LocExpr(v, _), index) if matches!(&**v, Expr::Literal(LiteralType::Super)) => {789 &Val::Obj(evaluate_object(context, t)?),805 &Val::Obj(evaluate_object(context, t)?),790 )?,806 )?,791 Apply(value, args, tailstrict) => evaluate_apply(context, value, args, loc, *tailstrict)?,807 Apply(value, args, tailstrict) => evaluate_apply(context, value, args, loc, *tailstrict)?,792 Function(params, body) => evaluate_method(context, params.clone(), body.clone()),808 Function(params, body) => {809 evaluate_method(context, "anonymous".into(), params.clone(), body.clone())810 }793 AssertExpr(AssertStmt(value, msg), returned) => {811 AssertExpr(AssertStmt(value, msg), returned) => {794 let assertion_result = push(812 let assertion_result = push(795 &value.1,813 &value.1,crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -58,6 +58,7 @@
#[derive(Debug, PartialEq)]
pub struct FuncDesc {
+ pub name: Rc<str>,
pub ctx: Context,
pub params: ParamsDesc,
pub body: LocExpr,