Function call moved from operand-func.go to function.go
This commit is contained in:
parent
24e6a293b0
commit
ba479a1b99
@ -43,16 +43,16 @@ func (functor *exprFunctor) Invoke(ctx ExprContext, name string, args []any) (re
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func CallExprFunction(parentCtx ExprContext, funcName string, params ...any) (v any, err error) {
|
// func CallExprFunction(parentCtx ExprContext, funcName string, params ...any) (v any, err error) {
|
||||||
ctx := cloneContext(parentCtx)
|
// ctx := cloneContext(parentCtx)
|
||||||
ctx.SetParent(parentCtx)
|
// ctx.SetParent(parentCtx)
|
||||||
|
|
||||||
if err == nil {
|
// if err == nil {
|
||||||
if err = checkFunctionCall(ctx, funcName, ¶ms); err == nil {
|
// if err = checkFunctionCall(ctx, funcName, ¶ms); err == nil {
|
||||||
if v, err = ctx.Call(funcName, params); err == nil {
|
// if v, err = ctx.Call(funcName, params); err == nil {
|
||||||
exportObjects(parentCtx, ctx)
|
// exportObjects(parentCtx, ctx)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
|
@ -41,3 +41,9 @@ func exportObjects(destCtx, sourceCtx ExprContext) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func exportObjectsToParent(sourceCtx ExprContext) {
|
||||||
|
if parentCtx := sourceCtx.GetParent(); parentCtx != nil {
|
||||||
|
exportObjects(parentCtx, sourceCtx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
39
function.go
39
function.go
@ -199,3 +199,42 @@ func (info *funcInfo) MaxArgs() int {
|
|||||||
func (info *funcInfo) Functor() Functor {
|
func (info *funcInfo) Functor() Functor {
|
||||||
return info.functor
|
return info.functor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----- Call a function ---
|
||||||
|
|
||||||
|
func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err error) {
|
||||||
|
if info, exists, owner := GetFuncInfo(ctx, name); exists {
|
||||||
|
passedCount := len(*varParams)
|
||||||
|
if info.MinArgs() > passedCount {
|
||||||
|
err = ErrTooFewParams(name, info.MinArgs(), info.MaxArgs(), passedCount)
|
||||||
|
}
|
||||||
|
for i, p := range info.Params() {
|
||||||
|
if i >= passedCount {
|
||||||
|
if !p.IsDefault() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
*varParams = append(*varParams, p.DefaultValue())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err == nil && info.MaxArgs() >= 0 && info.MaxArgs() < len(*varParams) {
|
||||||
|
err = ErrTooMuchParams(name, info.MaxArgs(), len(*varParams))
|
||||||
|
}
|
||||||
|
if err == nil && owner != ctx {
|
||||||
|
ctx.RegisterFuncInfo(info)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("unknown function %s()", name)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func CallFunction(parentCtx ExprContext, name string, params []any) (result any, err error) {
|
||||||
|
ctx := cloneContext(parentCtx)
|
||||||
|
ctx.SetParent(parentCtx)
|
||||||
|
|
||||||
|
if err = checkFunctionCall(ctx, name, ¶ms); err == nil {
|
||||||
|
result, err = ctx.Call(name, params)
|
||||||
|
exportObjectsToParent(ctx)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -6,7 +6,6 @@ package expr
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// -------- function call term
|
// -------- function call term
|
||||||
@ -22,35 +21,7 @@ func newFuncCallTerm(tk *Token, args []*term) *term {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -------- eval func call
|
// -------- eval func call
|
||||||
func checkFunctionCall(ctx ExprContext, name string, varParams *[]any) (err error) {
|
func evalFuncCall(ctx ExprContext, self *term) (v any, err error) {
|
||||||
if info, exists, owner := GetFuncInfo(ctx, name); exists {
|
|
||||||
passedCount := len(*varParams)
|
|
||||||
if info.MinArgs() > passedCount {
|
|
||||||
err = ErrTooFewParams(name, info.MinArgs(), info.MaxArgs(), passedCount)
|
|
||||||
}
|
|
||||||
for i, p := range info.Params() {
|
|
||||||
if i >= passedCount {
|
|
||||||
if !p.IsDefault() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
*varParams = append(*varParams, p.DefaultValue())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err == nil && info.MaxArgs() >= 0 && info.MaxArgs() < len(*varParams) {
|
|
||||||
err = ErrTooMuchParams(name, info.MaxArgs(), len(*varParams))
|
|
||||||
}
|
|
||||||
if err == nil && owner != ctx {
|
|
||||||
ctx.RegisterFuncInfo(info)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = fmt.Errorf("unknown function %s()", name)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func evalFuncCall(parentCtx ExprContext, self *term) (v any, err error) {
|
|
||||||
ctx := cloneContext(parentCtx)
|
|
||||||
ctx.SetParent(parentCtx)
|
|
||||||
name, _ := self.tk.Value.(string)
|
name, _ := self.tk.Value.(string)
|
||||||
params := make([]any, len(self.children), len(self.children)+5)
|
params := make([]any, len(self.children), len(self.children)+5)
|
||||||
for i, tree := range self.children {
|
for i, tree := range self.children {
|
||||||
@ -62,11 +33,7 @@ func evalFuncCall(parentCtx ExprContext, self *term) (v any, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if err = checkFunctionCall(ctx, name, ¶ms); err == nil {
|
v, err = CallFunction(ctx, name, params)
|
||||||
if v, err = ctx.Call(name, params); err == nil {
|
|
||||||
exportObjects(parentCtx, ctx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user