mirror of
https://github.com/CompeyDev/lei.git
synced 2024-12-12 04:40:42 +00:00
feat: include more lua.h bindings (50% there!)
This commit is contained in:
parent
1e26c9cac0
commit
89ab81e6e7
4 changed files with 278 additions and 2 deletions
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -7,7 +7,8 @@
|
||||||
"cstdint": "c",
|
"cstdint": "c",
|
||||||
"stdlib.h": "c",
|
"stdlib.h": "c",
|
||||||
"cmath": "cpp",
|
"cmath": "cpp",
|
||||||
"stdio.h": "c"
|
"stdio.h": "c",
|
||||||
|
"_cgo_export.h": "c"
|
||||||
},
|
},
|
||||||
"go.toolsEnvVars": {
|
"go.toolsEnvVars": {
|
||||||
"CGO_LDFLAGS_ALLOW":".*"
|
"CGO_LDFLAGS_ALLOW":".*"
|
||||||
|
|
|
@ -20,4 +20,8 @@ l_noret cluaL_errorL(lua_State* L, char* msg)
|
||||||
|
|
||||||
void clua_pushcclosurek(lua_State* L, void* f, char* debugname, int nup, void* cont) {
|
void clua_pushcclosurek(lua_State* L, void* f, char* debugname, int nup, void* cont) {
|
||||||
return lua_pushcclosurek(L, (lua_CFunction)f, debugname, nup, (lua_Continuation)cont);
|
return lua_pushcclosurek(L, (lua_CFunction)f, debugname, nup, (lua_Continuation)cont);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* clua_newuserdatadtor(lua_State* L, size_t sz, void* dtor) {
|
||||||
|
return lua_newuserdatadtor(L, sz, (void (*)(void*))dtor);
|
||||||
}
|
}
|
|
@ -3,4 +3,5 @@
|
||||||
|
|
||||||
lua_State* clua_newstate(void* f, void* ud);
|
lua_State* clua_newstate(void* f, void* ud);
|
||||||
l_noret cluaL_errorL(lua_State* L, char* msg);
|
l_noret cluaL_errorL(lua_State* L, char* msg);
|
||||||
void clua_pushcclosurek(lua_State* L, void* f, char* debugname, int nup, void* cont);
|
void clua_pushcclosurek(lua_State* L, void* f, char* debugname, int nup, void* cont);
|
||||||
|
void* clua_newuserdatadtor(lua_State* L, size_t sz, void* dtor);
|
270
internal/lua.go
270
internal/lua.go
|
@ -11,6 +11,47 @@ package internal
|
||||||
import "C"
|
import "C"
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
|
const (
|
||||||
|
LUA_OK = iota + 1
|
||||||
|
LUA_YIELD
|
||||||
|
LUA_ERRRUN
|
||||||
|
LUA_ERRSYNTAX
|
||||||
|
LUA_ERRMEM
|
||||||
|
LUA_ERRERR
|
||||||
|
LUA_BREAK
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LUA_CORUN = iota + 1
|
||||||
|
LUA_COSUS
|
||||||
|
LUA_CONOR
|
||||||
|
LUA_COFIN
|
||||||
|
LUA_COERR
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LUA_TNIL = iota
|
||||||
|
LUA_TBOOLEAN
|
||||||
|
|
||||||
|
LUA_TLIGHTUSERDATA
|
||||||
|
LUA_TNUMBER
|
||||||
|
LUA_TVECTOR
|
||||||
|
|
||||||
|
LUA_TSTRING
|
||||||
|
|
||||||
|
LUA_TTABLE
|
||||||
|
LUA_TFUNCTION
|
||||||
|
LUA_TUSERDATA
|
||||||
|
LUA_THREAD
|
||||||
|
LUA_TBUFFER
|
||||||
|
|
||||||
|
LUA_TPROTO
|
||||||
|
LUA_TUPVAL
|
||||||
|
LUA_TDEADKEY
|
||||||
|
|
||||||
|
LUA_T_COUNT = LUA_TPROTO
|
||||||
|
)
|
||||||
|
|
||||||
type LuaNumber float64
|
type LuaNumber float64
|
||||||
type LuaInteger int32
|
type LuaInteger int32
|
||||||
type LuaUnsigned int32
|
type LuaUnsigned int32
|
||||||
|
@ -258,9 +299,11 @@ func ToPointer(L *LuaState, idx int32) unsafe.Pointer {
|
||||||
return unsafe.Pointer(C.lua_topointer(L, C.int(idx)))
|
return unsafe.Pointer(C.lua_topointer(L, C.int(idx)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
// =======================
|
// =======================
|
||||||
// Stack Manipulation
|
// Stack Manipulation
|
||||||
// =======================
|
// =======================
|
||||||
|
//
|
||||||
|
|
||||||
func PushNil(L *LuaState) {
|
func PushNil(L *LuaState) {
|
||||||
C.lua_pushnil(L)
|
C.lua_pushnil(L)
|
||||||
|
@ -314,4 +357,231 @@ func PushCClosureK(L *LuaState, f LuaCFunction, debugname string, nup int32, con
|
||||||
C.clua_pushcclosurek(L, cf, cdebugname, C.int(nup), ccont)
|
C.clua_pushcclosurek(L, cf, cdebugname, C.int(nup), ccont)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PushBoolean(L *LuaState, b bool) {
|
||||||
|
cb := C.int(0)
|
||||||
|
if b {
|
||||||
|
cb = C.int(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
C.lua_pushboolean(L, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PushThread(L *LuaState) bool {
|
||||||
|
return C.lua_pushthread(L) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func PushLightUserdataTagged(L *LuaState, p unsafe.Pointer, tag int32) {
|
||||||
|
C.lua_pushlightuserdatatagged(L, p, C.int(tag))
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserdataTagged(L *LuaState, sz uint64, tag int32) unsafe.Pointer {
|
||||||
|
return C.lua_newuserdatatagged(L, C.size_t(sz), C.int(tag))
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserdataDtor(L *LuaState, sz uint64, dtor LuaUDestructor) unsafe.Pointer {
|
||||||
|
cdtor := C.malloc(C.size_t(unsafe.Sizeof(dtor)))
|
||||||
|
*(*LuaUDestructor)(cdtor) = dtor
|
||||||
|
|
||||||
|
return C.clua_newuserdatadtor(L, C.size_t(sz), cdtor)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBuffer(L *LuaState, sz uint64) unsafe.Pointer {
|
||||||
|
return C.lua_newbuffer(L, C.size_t(sz))
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ===================
|
||||||
|
// Get Functions
|
||||||
|
// ===================
|
||||||
|
//
|
||||||
|
|
||||||
|
func GetTable(L *LuaState, idx int32) int32 {
|
||||||
|
return int32(C.lua_gettable(L, C.int(idx)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetField(L *LuaState, idx int32, k string) int32 {
|
||||||
|
ck := C.CString(k)
|
||||||
|
defer C.free(unsafe.Pointer(ck))
|
||||||
|
|
||||||
|
return int32(C.lua_getfield(L, C.int(idx), ck))
|
||||||
|
}
|
||||||
|
|
||||||
|
func RawGetField(L *LuaState, idx int32, k string) int32 {
|
||||||
|
ck := C.CString(k)
|
||||||
|
defer C.free(unsafe.Pointer(ck))
|
||||||
|
|
||||||
|
return int32(C.lua_rawgetfield(L, C.int(idx), ck))
|
||||||
|
}
|
||||||
|
|
||||||
|
func RawGet(L *LuaState, idx int32) int32 {
|
||||||
|
return int32(C.lua_rawget(L, C.int(idx)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func RawGetI(L *LuaState, idx int32, n int32) int32 {
|
||||||
|
return int32(C.lua_rawgeti(L, C.int(idx), C.int(n)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateTable(L *LuaState, narr int32, nrec int32) {
|
||||||
|
C.lua_createtable(L, C.int(narr), C.int(nrec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetReadonly(L *LuaState, idx int32, enabled bool) {
|
||||||
|
cenabled := C.int(0)
|
||||||
|
if enabled {
|
||||||
|
cenabled = C.int(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
C.lua_setreadonly(L, C.int(idx), cenabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetReadonly(L *LuaState, idx int32) bool {
|
||||||
|
return C.lua_getreadonly(L, C.int(idx)) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetSafeEnv(L *LuaState, idx int32, enabled bool) {
|
||||||
|
cenabled := C.int(0)
|
||||||
|
if enabled {
|
||||||
|
cenabled = C.int(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
C.lua_setsafeenv(L, C.int(idx), cenabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Getfenv(L *LuaState, idx int32) {
|
||||||
|
C.lua_getfenv(L, C.int(idx))
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ===================
|
||||||
|
// Set Functions
|
||||||
|
// ===================
|
||||||
|
//
|
||||||
|
|
||||||
|
func SetTable(L *LuaState, idx int32) {
|
||||||
|
C.lua_settable(L, C.int(idx))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetField(L *LuaState, idx int32, k string) {
|
||||||
|
ck := C.CString(k)
|
||||||
|
defer C.free(unsafe.Pointer(ck))
|
||||||
|
|
||||||
|
C.lua_setfield(L, C.int(idx), ck)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RawSetI(L *LuaState, idx int32, n int32) {
|
||||||
|
C.lua_rawseti(L, C.int(idx), C.int(n))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetMetatable(L *LuaState, objindex int32) int32 {
|
||||||
|
return int32(C.lua_setmetatable(L, C.int(objindex)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func Setfenv(L *LuaState, idx int32) int32 {
|
||||||
|
return int32(C.lua_setfenv(L, C.int(idx)))
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// =========================
|
||||||
|
// Bytecode Functions
|
||||||
|
// =========================
|
||||||
|
//
|
||||||
|
|
||||||
|
func LuauLoad(L *LuaState, chunkname string, data string, size uint64, env int32) int32 {
|
||||||
|
cchunkname := C.CString(chunkname)
|
||||||
|
defer C.free(unsafe.Pointer(cchunkname))
|
||||||
|
|
||||||
|
cdata := C.CString(data)
|
||||||
|
defer C.free(unsafe.Pointer(cdata))
|
||||||
|
|
||||||
|
return int32(C.luau_load(L, cchunkname, cdata, C.size_t(size), C.int(env)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuaCall(L *LuaState, nargs int32, nresults int32) {
|
||||||
|
C.lua_call(L, C.int(nargs), C.int(nresults))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuaPcall(L *LuaState, nargs int32, nresults int32, errfunc int32) int32 {
|
||||||
|
return int32(C.lua_pcall(L, C.int(nargs), C.int(nresults), C.int(errfunc)))
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ========================
|
||||||
|
// Coroutine Functions
|
||||||
|
// ========================
|
||||||
|
//
|
||||||
|
|
||||||
|
func LuaYield(L *LuaState, nresults int32) int32 {
|
||||||
|
return int32(C.lua_yield(L, C.int(nresults)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuaBreak(L *LuaState) int32 {
|
||||||
|
return int32(C.lua_break(L))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuaResume(L *LuaState, from *LuaState, nargs int32) int32 {
|
||||||
|
return int32(C.lua_resume(L, from, C.int(nargs)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuaResumeError(L *LuaState, from *LuaState) int32 {
|
||||||
|
return int32(C.lua_resumeerror(L, from))
|
||||||
|
}
|
||||||
|
|
||||||
|
func LuaStatus(L *LuaState) int32 {
|
||||||
|
return int32(C.lua_status(L))
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsYieldable(L *LuaState) bool {
|
||||||
|
return C.lua_isyieldable(L) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetThreadData(L *LuaState) unsafe.Pointer {
|
||||||
|
return C.lua_getthreaddata(L)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetThreadData(L *LuaState, data unsafe.Pointer) {
|
||||||
|
C.lua_setthreaddata(L, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ======================
|
||||||
|
// Garbage Collection
|
||||||
|
// ======================
|
||||||
|
//
|
||||||
|
|
||||||
|
const (
|
||||||
|
LUA_GCSTOP = iota
|
||||||
|
LUA_GCRESTART
|
||||||
|
|
||||||
|
LUA_GCCOLLECT
|
||||||
|
|
||||||
|
LUA_GCCOUNT
|
||||||
|
LUA_GCCOUNTB
|
||||||
|
|
||||||
|
LUA_GCISRUNNING
|
||||||
|
|
||||||
|
LUA_GCSTEP
|
||||||
|
|
||||||
|
LUA_GCSETGOAL
|
||||||
|
LUA_GCSETSTEPMUL
|
||||||
|
LUA_GCSETSTEPSIZE
|
||||||
|
)
|
||||||
|
|
||||||
|
func LuaGc(L *LuaState, what int32, data int32) int32 {
|
||||||
|
return int32(C.lua_gc(L, C.int(what), C.int(data)))
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ======================
|
||||||
|
// Memory Statistics
|
||||||
|
// ======================
|
||||||
|
//
|
||||||
|
|
||||||
|
func SetMemCat(L *LuaState, category int32) {
|
||||||
|
C.lua_setmemcat(L, C.int(category))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TotalBytes(L *LuaState, category int32) uint64 {
|
||||||
|
return uint64(C.lua_totalbytes(L, C.int(category)))
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Rest of it
|
// TODO: Rest of it
|
||||||
|
|
Loading…
Reference in a new issue