c/lua:userdata

This commit is contained in:
luoliwoshang
2024-08-24 15:24:47 +08:00
parent 876aea39e5
commit 85c2cda7b6
2 changed files with 57 additions and 5 deletions

View File

@@ -0,0 +1,43 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
type lightdata struct {
value int
}
func main() {
L := lua.Newstate()
defer L.Close()
L.Openlibs()
data := L.Newuserdata(unsafe.Sizeof(0))
*((*int)(data)) = 42
L.Setglobal(c.Str("data"))
light := &lightdata{value: 24}
L.Pushlightuserdata(unsafe.Pointer(light))
L.Setglobal(c.Str("lightdata"))
L.Getglobal(c.Str("data"))
if L.Isuserdata(-1) != 0 {
data := L.Touserdata(-1)
c.Printf(c.Str("userdata %d\n"), *(*int)(data))
}
L.Getglobal(c.Str("lightdata"))
if L.Islightuserdata(-1) {
light := (*lightdata)(L.Touserdata(-1))
c.Printf(c.Str("lightdata %d\n"), light.value)
}
}
/* Expected output:
userdata 42
lightdata 24
*/

View File

@@ -202,7 +202,8 @@ func (L *State) Iscfunction(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Isinteger C.lua_isinteger
func (L *State) Isinteger(idx c.Int) c.Int { return 0 }
// LUA_API int (lua_isuserdata) (State *L, int idx);
// llgo:link (*State).Isuserdata C.lua_isuserdata
func (L *State) Isuserdata(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Type C.lua_type
func (L *State) Type(idx c.Int) c.Int { return 0 }
@@ -227,7 +228,9 @@ func (L *State) Tolstring(idx c.Int, len *c.Ulong) *c.Char { return nil }
// llgo:link (*State).Tocfunction C.lua_tocfunction
func (L *State) Tocfunction(idx c.Int) CFunction { return nil }
// LUA_API void *(lua_touserdata) (State *L, int idx);
// llgo:link (*State).Touserdata C.lua_touserdata
func (L *State) Touserdata(idx c.Int) c.Pointer { return nil }
// LUA_API State *(lua_tothread) (State *L, int idx);
// LUA_API const void *(lua_topointer) (State *L, int idx);
@@ -262,7 +265,9 @@ func (L *State) Pushcclosure(fn CFunction, n c.Int) {}
// llgo:link (*State).Pushboolean C.lua_pushboolean
func (L *State) Pushboolean(b c.Int) {}
//void (lua_pushlightuserdata) (State *L, void *p);
// llgo:link (*State).Pushlightuserdata C.lua_pushlightuserdata
func (L *State) Pushlightuserdata(p c.Pointer) {}
//int (lua_pushthread) (State *L);
// /*
@@ -286,7 +291,8 @@ func (L *State) Getfield(idx c.Int, k *c.Char) c.Int { return 0 }
// llgo:link (*State).Createtable C.lua_createtable
func (L *State) Createtable(narr c.Int, nrec c.Int) {}
// LUA_API void *(lua_newuserdatauv) (State *L, size_t sz, int nuvalue);
// llgo:link (*State).Newuserdatauv C.lua_newuserdatauv
func (L *State) Newuserdatauv(sz uintptr, nuvalue c.Int) c.Pointer { return nil }
// llgo:link (*State).Getmetatable C.lua_getmetatable
func (L *State) Getmetatable(objindex c.Int) c.Int { return 0 }
@@ -447,7 +453,10 @@ func (L *State) Isnoneornil(n c.Int) bool { return L.Type(n) <= 0 }
// ** ===============================================================
// */
// #define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1)
func (L *State) Newuserdata(sz uintptr) c.Pointer {
return L.Newuserdatauv(sz, 1)
}
// #define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1)
// #define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1)