- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
def __gc(self, state):
userdata = self.lib.luaL_testudata(self.state, 1, b'python.object')
if userdata:
obj_ptr = (c.cast(userdata, c.POINTER(c.py_object))).contents
if obj_ptr:
c.pythonapi.Py_DecRef(obj_ptr)
return 0
def push_object(self, obj):
userdata = self.lib.lua_newuserdata(self.state, c.sizeof(c.py_object))
(c.cast(userdata, c.POINTER(c.py_object)))[0] = c.py_object()
if self.lib.luaL_newmetatable(self.state, b'python.object'):
self.gc_thunk = c.CFUNCTYPE(c.c_int, c.c_void_p)(self.__gc)
self.lib.lua_pushcclosure(self.state, self.gc_thunk, 0)
self.lib.lua_setfield(self.state, -2, b'__gc')
self.lib.lua_pushstring(self.state, b'protected')
self.lib.lua_setfield(self.state, -2, b'__metatable')
self.lib.lua_setmetatable(self.state, -2)
obj_ptr = c.py_object(obj)
c.pythonapi.Py_IncRef(obj_ptr)
(c.cast(userdata, c.POINTER(c.py_object)))[0] = obj_ptr
bormand 07.08.2020 07:33 # 0
gost 07.08.2020 09:57 # 0
bormand 07.08.2020 10:29 # 0
Жаль конечно что longjmp через питон так и не получилось запинать. Он даже работает раз 20-30, а потом у питона стек заканчивается. А у Lua вся обработка ошибок на longjmp построена.
Ну и дока у ctypes слабовата. Тема py_object'а не раскрыта. Я так и не понял почему [0] на POINTER(py_object) возвращает не py_object а объект на который тот ссылался.
6a6yuH 07.08.2020 12:05 # +1
bormand 07.08.2020 12:15 # 0
Малость хотелось разобраться с интеграцией Lua в свой код. Ну и ctypes заодно до конца осознать, а то я коллбеки и py_object в нём никогда толком не юзал.
Так то конечно готовые либы для этого есть, нету смысла самому пилить.
6a6yuH 07.08.2020 12:30 # 0
Трогать и то, и то -- задача для эквилибирста.
bormand 07.08.2020 13:17 # +1
Но не прокатило. Походу полноценный мост между ними можно только на няшной написать.
Хотя, если писать код без ошибок - то вполне работает.
OCETuHCKuu_nemyx 07.08.2020 21:44 # 0
6a6yuH 07.08.2020 21:50 # 0
OCETuHCKuu_nemyx 07.08.2020 22:04 # 0
bormand 08.08.2020 03:40 # +1
Но писать всю остальную логику на луа не хочется. Поэтому попробовал сделать мост между ней и питоном.
gost 08.08.2020 05:08 # 0
OCETuHCKuu_nemyx 08.08.2020 09:41 # 0
TOPT 12.05.2021 09:29 # 0