Змея / Говнокод #26847 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 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 bormand, (Updated )

Комментарии (14) RSS

      • Он ломался до последнего, но потом сдался.

        Жаль конечно что longjmp через питон так и не получилось запинать. Он даже работает раз 20-30, а потом у питона стек заканчивается. А у Lua вся обработка ошибок на longjmp построена.

        Ну и дока у ctypes слабовата. Тема py_object'а не раскрыта. Я так и не понял почему [0] на POINTER(py_object) возвращает не py_object а объект на который тот ссылался.
        Ответить
    • > Зачем? Зачем?

      Малость хотелось разобраться с интеграцией Lua в свой код. Ну и ctypes заодно до конца осознать, а то я коллбеки и py_object в нём никогда толком не юзал.

      Так то конечно готовые либы для этого есть, нету смысла самому пилить.
      Ответить
      • Имхо, с луа лучше разбиарться с няшной напрямую: она очень легко тудой интегрируется. А с py_object -- отдельно.
        Трогать и то, и то -- задача для эквилибирста.
        Ответить
        • По-отдельности скучно же, вся суть в эквилибристике.

          Но не прокатило. Походу полноценный мост между ними можно только на няшной написать.

          Хотя, если писать код без ошибок - то вполне работает.
          Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8