github.com/dfklegend/cell2/utils@v0.0.0-20240402033734-a0a9f3d9335d/golua/method.go (about) 1 package golua 2 3 import ( 4 "errors" 5 6 lua "github.com/yuin/gopher-lua" 7 luar "layeh.com/gopher-luar" 8 ) 9 10 var errorNilFunction = errors.New("nil function") 11 12 func IsLuaFunction(fn lua.LValue) bool { 13 if fn == nil || fn.Type() != lua.LTFunction { 14 return false 15 } 16 return true 17 } 18 19 func Call(state *lua.LState, fn lua.LValue, args ...any) error { 20 if fn == nil { 21 panic(errorNilFunction) 22 } 23 var argsArr []lua.LValue 24 25 for _, arg := range args { 26 argsArr = append(argsArr, luar.New(state, arg)) 27 } 28 29 err := state.CallByParam(lua.P{ 30 Fn: fn, 31 NRet: 0, 32 Protect: true, 33 Handler: nil, 34 }, argsArr...) 35 36 return checkError(err) 37 } 38 39 func CallWithResult(state *lua.LState, fn lua.LValue, args ...any) (lua.LValue, error) { 40 if fn == nil { 41 panic(errorNilFunction) 42 } 43 44 var argsArr []lua.LValue 45 46 for _, arg := range args { 47 argsArr = append(argsArr, luar.New(state, arg)) 48 } 49 50 err := state.CallByParam(lua.P{ 51 Fn: fn, 52 NRet: 1, 53 Protect: true, 54 Handler: nil, 55 }, argsArr...) 56 57 if err != nil { 58 checkError(err) 59 } 60 61 ret := state.Get(-1) 62 state.Pop(1) 63 64 return ret, err 65 }