feat: implement go "useful macro" equivalents for lua.h

This commit is contained in:
Erica Marigold 2024-07-20 13:55:39 +05:30
parent e468a36ec7
commit dd9ee216a8
No known key found for this signature in database
GPG key ID: 2768CC0C23D245D1
2 changed files with 159 additions and 7 deletions

View file

@ -15,6 +15,38 @@ import (
"unsafe" "unsafe"
) )
//
// ===========================
// luaconf.h Constants
// ===========================
//
const (
LUAI_MAXCSTACK = 1000000 // Max allowed values in lua stack
LUA_UTAG_LIMIT = 128 // Max number of lua userdata tags
LUA_LUTAG_LIMIT = 128 // Max number of light lua userdata tags
)
const LUA_MULTRET = -1
//
// ====================
// Pseudo Indices
// ====================
//
const (
LUA_REGISTRYINDEX = -LUAI_MAXCSTACK - 2000
LUA_ENVIRONINDEX = -LUAI_MAXCSTACK - 2001
LUA_GLOBALSINDEX = -LUAI_MAXCSTACK - 2002
)
//
// ======================
// Thread Status
// ======================
//
const ( const (
LUA_OK = iota + 1 LUA_OK = iota + 1
LUA_YIELD LUA_YIELD
@ -25,6 +57,12 @@ const (
LUA_BREAK LUA_BREAK
) )
//
// =========================
// Coroutine Status
// =========================
//
const ( const (
LUA_CORUN = iota + 1 LUA_CORUN = iota + 1
LUA_COSUS LUA_COSUS
@ -33,6 +71,13 @@ const (
LUA_COERR LUA_COERR
) )
//
// ===================
// Basic Types
// ===================
//
const LUA_TNONE = -1
const ( const (
LUA_TNIL = iota LUA_TNIL = iota
LUA_TBOOLEAN LUA_TBOOLEAN
@ -46,7 +91,7 @@ const (
LUA_TTABLE LUA_TTABLE
LUA_TFUNCTION LUA_TFUNCTION
LUA_TUSERDATA LUA_TUSERDATA
LUA_THREAD LUA_TTHREAD
LUA_TBUFFER LUA_TBUFFER
LUA_TPROTO LUA_TPROTO
@ -183,8 +228,8 @@ func IsUserData(L *LuaState, idx int32) bool {
return C.lua_isuserdata(L, C.int(idx)) != 0 return C.lua_isuserdata(L, C.int(idx)) != 0
} }
func Type(L *LuaState, idx int32) bool { func Type(L *LuaState, idx int32) int32 {
return C.lua_type(L, C.int(idx)) != 0 return int32(C.lua_type(L, C.int(idx)))
} }
func TypeName(L *LuaState, tp int32) string { func TypeName(L *LuaState, tp int32) string {
@ -334,7 +379,8 @@ func PushLString(L *LuaState, s string, l uint64) {
cs := C.CString(s) cs := C.CString(s)
defer C.free(unsafe.Pointer(cs)) defer C.free(unsafe.Pointer(cs))
C.lua_pushlstring(L, cs, C.size_t(l)) // NOTE: CStrings are null-terminated, and hence one longer than Go strings
C.lua_pushlstring(L, cs, C.size_t(l+1))
} }
func PushString(L *LuaState, s string) { func PushString(L *LuaState, s string) {
@ -815,5 +861,104 @@ func DebugTrace(L *LuaState) string {
return C.GoString(C.lua_debugtrace(L)) return C.GoString(C.lua_debugtrace(L))
} }
// TODO: Implement "useful macros" section as Go functions func ToNumber(L *LuaState, i int32) LuaNumber {
return ToNumberX(L, i, new(bool))
}
func ToInteger(L *LuaState, i int32) LuaInteger {
return ToIntegerX(L, i, new(bool))
}
func ToUnsigned(L *LuaState, i int32) LuaUnsigned {
return ToUnsignedX(L, i, new(bool))
}
func Pop(L *LuaState, n int32) {
SetTop(L, -n-1)
}
func NewTable(L *LuaState) {
CreateTable(L, 0, 0)
}
func NewUserdata(L *LuaState, sz uint64) unsafe.Pointer {
return NewUserdataTagged(L, sz, 0)
}
func IsFunction(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TFUNCTION
}
func IsTable(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TTABLE
}
func IsLightUserdata(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TLIGHTUSERDATA
}
func IsNil(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TNIL
}
func IsBoolean(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TBOOLEAN
}
func IsVector(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TVECTOR
}
func IsThread(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TTHREAD
}
func IsBuffer(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TBUFFER
}
func IsNone(L *LuaState, n int32) bool {
return Type(L, n) == LUA_TNONE
}
func IsNoneOrNil(L *LuaState, n int32) bool {
return Type(L, n) <= LUA_TNIL
}
func PushLiteral(L *LuaState, s string) {
PushLString(L, s, uint64(len(s)))
}
func PushCFunction(L *LuaState, f LuaCFunction) {
PushCClosureK(L, f, *new(string), 0, nil)
}
func PushCFunctionD(L *LuaState, f LuaCFunction, debugname string) {
PushCClosureK(L, f, debugname, 0, nil)
}
func PushCClosure(L *LuaState, f LuaCFunction, nup int32) {
PushCClosureK(L, f, *new(string), nup, nil)
}
func PushCClosureD(L *LuaState, f LuaCFunction, debugname string, nup int32) {
PushCClosureK(L, f, debugname, nup, nil)
}
func PushLightUserdata(L *LuaState, p unsafe.Pointer) {
PushLightUserdataTagged(L, p, 0)
}
func SetGlobal(L *LuaState, global string) {
SetField(L, LUA_GLOBALSINDEX, global)
}
func GetGlobal(L *LuaState, global string) int32 {
return GetField(L, LUA_GLOBALSINDEX, global)
}
func ToString(L *LuaState, i int32) string {
return ToLString(L, i, new(uint64))
}
// TODO: lua_Callbacks and related stuff // TODO: lua_Callbacks and related stuff

11
main.go
View file

@ -6,12 +6,19 @@ func main() {
lua := lualib.LNewState() lua := lualib.LNewState()
println("Lua VM Address: ", lua) println("Lua VM Address: ", lua)
lualib.PushCClosureK(lua, func(L *lualib.LuaState) int32 { lualib.PushCFunction(lua, func(L *lualib.LuaState) int32 {
println("hi from closure?") println("hi from closure?")
return 0 return 0
}, "test", 0, nil) })
lualib.PushString(lua, "123")
lualib.PushNumber(lua, lualib.ToNumber(lua, 2))
if !lualib.IsCFunction(lua, 1) { if !lualib.IsCFunction(lua, 1) {
panic("CFunction was not correctly pushed onto stack") panic("CFunction was not correctly pushed onto stack")
} }
if !lualib.IsNumber(lua, 3) {
panic("Number was not correctly pushed onto stack")
}
} }