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  }