Exec implements the InterpretableV2 interface method.
(frame *ExecutionFrame)
| 980 | |
| 981 | // Exec implements the InterpretableV2 interface method. |
| 982 | func (fold *evalFold) Exec(frame *ExecutionFrame) ref.Val { |
| 983 | // Initialize the folder interface |
| 984 | f := newFolder(fold, frame) |
| 985 | defer releaseFolder(f) |
| 986 | |
| 987 | foldRange := fold.iterRange.Exec(frame) |
| 988 | if types.IsUnknownOrError(foldRange) { |
| 989 | return foldRange |
| 990 | } |
| 991 | if fold.iterVar2 != "" { |
| 992 | var foldable traits.Foldable |
| 993 | switch r := foldRange.(type) { |
| 994 | case traits.Mapper: |
| 995 | foldable = types.ToFoldableMap(r) |
| 996 | case traits.Lister: |
| 997 | foldable = types.ToFoldableList(r) |
| 998 | default: |
| 999 | return types.NewErrWithNodeID(fold.ID(), "unsupported comprehension range type: %T", foldRange) |
| 1000 | } |
| 1001 | foldable.Fold(f) |
| 1002 | return f.evalResult() |
| 1003 | } |
| 1004 | |
| 1005 | if !foldRange.Type().HasTrait(traits.IterableType) { |
| 1006 | return types.ValOrErr(foldRange, "got '%T', expected iterable type", foldRange) |
| 1007 | } |
| 1008 | iterable := foldRange.(traits.Iterable) |
| 1009 | return f.foldIterable(iterable) |
| 1010 | } |
| 1011 | |
| 1012 | // Eval implements the Interpretable interface method. |
| 1013 | func (fold *evalFold) Eval(ctx Activation) ref.Val { |
no test coverage detected