Squashed commit of the following: [raii_pyobjects]
closes #4 commit8f060dc87bAuthor: John McCardle <mccardle.john@gmail.com> Date: Fri Mar 15 22:20:03 2024 -0400 Removing std::cout debugging statements commitc9d5251c71Author: John McCardle <mccardle.john@gmail.com> Date: Fri Mar 15 20:00:57 2024 -0400 In-place map modification worked commit0a8f67e391Author: John McCardle <mccardle.john@gmail.com> Date: Thu Mar 14 23:13:13 2024 -0400 Stress test is failing: By removing a timer to a function (from inside that function?) I can immediately cause a segfault. commit05d9f6a882Author: John McCardle <mccardle.john@gmail.com> Date: Tue Mar 12 22:27:12 2024 -0400 wow, good test of Key and Click Callable classes. Cleanup, squash, and merge after I give it a lookover in daylight, though. commit972768eb26Author: John McCardle <mccardle.john@gmail.com> Date: Tue Mar 12 21:02:48 2024 -0400 inital PyCallable work; isolate very well behaved usage of PyObject references behind RAII
This commit is contained in:
parent
2c3c1449ee
commit
cdaf309272
13 changed files with 302 additions and 28 deletions
114
src/PyCallable.cpp
Normal file
114
src/PyCallable.cpp
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
#include "PyCallable.h"
|
||||
|
||||
PyCallable::PyCallable(PyObject* _target)
|
||||
{
|
||||
target = Py_XNewRef(_target);
|
||||
}
|
||||
|
||||
PyCallable::~PyCallable()
|
||||
{
|
||||
if (target)
|
||||
Py_DECREF(target);
|
||||
}
|
||||
|
||||
PyObject* PyCallable::call(PyObject* args, PyObject* kwargs)
|
||||
{
|
||||
return PyObject_Call(target, args, kwargs);
|
||||
}
|
||||
|
||||
bool PyCallable::isNone()
|
||||
{
|
||||
return (target == Py_None || target == NULL);
|
||||
}
|
||||
|
||||
PyTimerCallable::PyTimerCallable(PyObject* _target, int _interval, int now)
|
||||
: PyCallable(_target), interval(_interval), last_ran(now)
|
||||
{}
|
||||
|
||||
PyTimerCallable::PyTimerCallable()
|
||||
: PyCallable(Py_None), interval(0), last_ran(0)
|
||||
{}
|
||||
|
||||
bool PyTimerCallable::hasElapsed(int now)
|
||||
{
|
||||
return now >= last_ran + interval;
|
||||
}
|
||||
|
||||
void PyTimerCallable::call(int now)
|
||||
{
|
||||
PyObject* args = Py_BuildValue("(i)", now);
|
||||
PyObject* retval = PyCallable::call(args, NULL);
|
||||
if (!retval)
|
||||
{
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
} else if (retval != Py_None)
|
||||
{
|
||||
std::cout << "timer returned a non-None value. It's not an error, it's just not being saved or used." << std::endl;
|
||||
std::cout << PyUnicode_AsUTF8(PyObject_Repr(retval)) << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
bool PyTimerCallable::test(int now)
|
||||
{
|
||||
if(hasElapsed(now))
|
||||
{
|
||||
call(now);
|
||||
last_ran = now;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
PyClickCallable::PyClickCallable(PyObject* _target)
|
||||
: PyCallable(_target)
|
||||
{}
|
||||
|
||||
PyClickCallable::PyClickCallable()
|
||||
: PyCallable(Py_None)
|
||||
{}
|
||||
|
||||
void PyClickCallable::call(sf::Vector2f mousepos, std::string button, std::string action)
|
||||
{
|
||||
PyObject* args = Py_BuildValue("(iiss)", (int)mousepos.x, (int)mousepos.y, button.c_str(), action.c_str());
|
||||
PyObject* retval = PyCallable::call(args, NULL);
|
||||
if (!retval)
|
||||
{
|
||||
std::cout << "ClickCallable has raised an exception. It's going to STDERR and being dropped:" << std::endl;
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
} else if (retval != Py_None)
|
||||
{
|
||||
std::cout << "ClickCallable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl;
|
||||
std::cout << PyUnicode_AsUTF8(PyObject_Repr(retval)) << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
PyObject* PyClickCallable::borrow()
|
||||
{
|
||||
return target;
|
||||
}
|
||||
|
||||
PyKeyCallable::PyKeyCallable(PyObject* _target)
|
||||
: PyCallable(_target)
|
||||
{}
|
||||
|
||||
PyKeyCallable::PyKeyCallable()
|
||||
: PyCallable(Py_None)
|
||||
{}
|
||||
|
||||
void PyKeyCallable::call(std::string key, std::string action)
|
||||
{
|
||||
if (target == Py_None || target == NULL) return;
|
||||
PyObject* args = Py_BuildValue("(ss)", key.c_str(), action.c_str());
|
||||
PyObject* retval = PyCallable::call(args, NULL);
|
||||
if (!retval)
|
||||
{
|
||||
std::cout << "KeyCallable has raised an exception. It's going to STDERR and being dropped:" << std::endl;
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
} else if (retval != Py_None)
|
||||
{
|
||||
std::cout << "KeyCallable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue