git.delta.rocks / jrsonnet / refs/commits / a82a6f1d1dd0

difftreelog

feat trace function names

Лач2020-07-16parent: #0dad2a6.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
1use 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}
4647
47pub 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}
5056
51pub 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: Assert
299 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}
663
664pub 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}
656672
657pub 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,
modifiedcrates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth
5858
59#[derive(Debug, PartialEq)]59#[derive(Debug, PartialEq)]
60pub struct FuncDesc {60pub struct FuncDesc {
61 pub name: Rc<str>,
61 pub ctx: Context,62 pub ctx: Context,
62 pub params: ParamsDesc,63 pub params: ParamsDesc,
63 pub body: LocExpr,64 pub body: LocExpr,