(call *dag.CallExpr)
| 247 | } |
| 248 | |
| 249 | func (b *Builder) compileCall(call *dag.CallExpr) (expr.Evaluator, error) { |
| 250 | // First check if call is to a user defined function, otherwise check for |
| 251 | // builtin function. |
| 252 | var fn expr.Function |
| 253 | if f, ok := b.funcs[call.Tag]; ok { |
| 254 | var err error |
| 255 | if fn, err = b.compileUDFCall(call.Tag, f); err != nil { |
| 256 | return nil, err |
| 257 | } |
| 258 | } else { |
| 259 | var err error |
| 260 | fn, err = function.New(b.sctx(), call.Tag, len(call.Args)) |
| 261 | if err != nil { |
| 262 | return nil, fmt.Errorf("%s: %w", call.Tag, err) |
| 263 | } |
| 264 | } |
| 265 | exprs, err := b.compileExprs(call.Args) |
| 266 | if err != nil { |
| 267 | return nil, fmt.Errorf("%s: bad argument: %w", call.Tag, err) |
| 268 | } |
| 269 | return expr.NewCall(fn, exprs), nil |
| 270 | } |
| 271 | |
| 272 | func (b *Builder) compileUDFCall(tag string, f *dag.FuncDef) (expr.Function, error) { |
| 273 | if fn, ok := b.compiledUDFs[tag]; ok { //XXX this doesn't work for stateful things |
no test coverage detected