1. Python / Говнокод #26847

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 07 Августа 2020

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

    • Ебал я этот ctypes...
      Ответить
      • Как ощущения?
        Ответить
        • Он ломался до последнего, но потом сдался.

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

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

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

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

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

            Хотя, если писать код без ошибок - то вполне работает.
            Ответить
    • Какую задачу ты решаешь?
      Ответить
      • скрестить ужа с ежом.
        Ответить
      • Есть куча кода на луа, надо его запускать и выдирать из него данные.

        Но писать всю остальную логику на луа не хочется. Поэтому попробовал сделать мост между ней и питоном.
        Ответить

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