Skip to content

Commit 80ef033

Browse files
committed
destructive: change to eager evaluation
1 parent e8fda0b commit 80ef033

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

dsl/execute.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/pkg/errors"
1212
"github.com/vim-volt/volt/config"
1313
"github.com/vim-volt/volt/dsl/dslctx"
14+
"github.com/vim-volt/volt/dsl/ops/util"
1415
"github.com/vim-volt/volt/dsl/types"
1516
"github.com/vim-volt/volt/lockjson"
1617
"github.com/vim-volt/volt/pathutil"
@@ -46,7 +47,7 @@ func Execute(ctx context.Context, expr types.Expr) (_ types.Value, result error)
4647
return nil, err
4748
}
4849

49-
val, rollback, err := expr.Eval(ctx)
50+
val, rollback, err := evalDepthFirst(ctx, expr)
5051
if err != nil {
5152
if rollback != nil {
5253
rollback()
@@ -56,6 +57,35 @@ func Execute(ctx context.Context, expr types.Expr) (_ types.Value, result error)
5657
return val, nil
5758
}
5859

60+
func evalDepthFirst(ctx context.Context, expr types.Expr) (_ types.Value, _ func(), result error) {
61+
op := expr.Op()
62+
g := util.FuncGuard(op.String())
63+
defer func() {
64+
result = g.Error(recover())
65+
}()
66+
67+
// Evaluate arguments first
68+
args := expr.Args()
69+
newArgs := make([]types.Value, 0, len(args))
70+
for i := range args {
71+
innerExpr, ok := args[i].(types.Expr)
72+
if !ok {
73+
newArgs = append(newArgs, args[i])
74+
continue
75+
}
76+
ret, rbFunc, err := evalDepthFirst(ctx, innerExpr)
77+
g.Add(rbFunc)
78+
if err != nil {
79+
return nil, g.Rollback, g.Error(err)
80+
}
81+
newArgs = append(newArgs, ret)
82+
}
83+
84+
ret, rbFunc, err := op.EvalExpr(ctx, newArgs)
85+
g.Add(rbFunc)
86+
return ret, g.Rollback, g.Error(err)
87+
}
88+
5989
func expandMacro(expr types.Expr) (types.Expr, error) {
6090
val, err := doExpandMacro(expr)
6191
if err != nil {

0 commit comments

Comments
 (0)