c/lua:userdata
This commit is contained in:
43
c/lua/_demo/userdata/userdata.go
Normal file
43
c/lua/_demo/userdata/userdata.go
Normal 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
|
||||||
|
*/
|
||||||
19
c/lua/lua.go
19
c/lua/lua.go
@@ -202,7 +202,8 @@ func (L *State) Iscfunction(idx c.Int) c.Int { return 0 }
|
|||||||
// llgo:link (*State).Isinteger C.lua_isinteger
|
// llgo:link (*State).Isinteger C.lua_isinteger
|
||||||
func (L *State) Isinteger(idx c.Int) c.Int { return 0 }
|
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
|
// llgo:link (*State).Type C.lua_type
|
||||||
func (L *State) Type(idx c.Int) c.Int { return 0 }
|
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
|
// llgo:link (*State).Tocfunction C.lua_tocfunction
|
||||||
func (L *State) Tocfunction(idx c.Int) CFunction { return nil }
|
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 State *(lua_tothread) (State *L, int idx);
|
||||||
// LUA_API const void *(lua_topointer) (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
|
// llgo:link (*State).Pushboolean C.lua_pushboolean
|
||||||
func (L *State) Pushboolean(b c.Int) {}
|
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);
|
//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
|
// llgo:link (*State).Createtable C.lua_createtable
|
||||||
func (L *State) Createtable(narr c.Int, nrec c.Int) {}
|
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
|
// llgo:link (*State).Getmetatable C.lua_getmetatable
|
||||||
func (L *State) Getmetatable(objindex c.Int) c.Int { return 0 }
|
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_getuservalue(L,idx) lua_getiuservalue(L,idx,1)
|
||||||
// #define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1)
|
// #define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user