diff options
author | Daniel Elstner <daniel.kitta@gmail.com> | 2015-10-05 01:53:43 +0200 |
---|---|---|
committer | Daniel Elstner <daniel.kitta@gmail.com> | 2015-10-06 23:25:36 +0200 |
commit | 201a85a8ea071d37f4fda2668c0a1c488d852f4e (patch) | |
tree | f407560b61fc126291ee932d6c897a80dea79a30 /instance.c | |
parent | bd0e7d2e71e7a05b2bb0686a86a75b8fcb92fd54 (diff) | |
download | libsigrokdecode-201a85a8ea071d37f4fda2668c0a1c488d852f4e.tar.gz libsigrokdecode-201a85a8ea071d37f4fda2668c0a1c488d852f4e.zip |
Python: Restrict code to stable ABI subset
Limit usage of the Python C API to the stable ABI subset as defined
by PEP 384. This removes some type definitions and functions which
libsigrokdecode made use of. Convert all affected code to suitable
API alternatives. Also fix a few leaks that became apparent while
working on the code.
The most visible change is that PyTypeObject is now an opaque type.
Thus, the custom Decoder and srd_logic types are now created on the
heap via an alternative API. Unfortunately, since tp_name is now
inaccessible, type names had to be removed from the log output.
Stack traces after Python exceptions are now formatted by calling
into Python, since the trace object C API is no longer available.
Diffstat (limited to 'instance.c')
-rw-r--r-- | instance.c | 14 |
1 files changed, 7 insertions, 7 deletions
@@ -30,8 +30,8 @@ extern SRD_PRIV GSList *sessions; -/* type_logic.c */ -extern SRD_PRIV PyTypeObject srd_logic_type; +/* module_sigrokdecode.c */ +extern SRD_PRIV PyObject *srd_logic_type; /** @endcond */ @@ -163,7 +163,7 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, err_out: Py_XDECREF(py_optval); if (PyErr_Occurred()) { - srd_exception_catch("Stray exception in srd_inst_option_set()."); + srd_exception_catch("Stray exception in srd_inst_option_set()"); ret = SRD_ERR_PYTHON; } @@ -341,7 +341,7 @@ SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess, /* Create a new instance of this decoder class. */ if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) { if (PyErr_Occurred()) - srd_exception_catch("failed to create %s instance: ", + srd_exception_catch("Failed to create %s instance", decoder_id); g_free(di->dec_channelmap); g_free(di); @@ -505,7 +505,7 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di) di->inst_id); if (!(py_res = PyObject_CallMethod(di->py_inst, "start", NULL))) { - srd_exception_catch("Protocol decoder instance %s: ", + srd_exception_catch("Protocol decoder instance %s", di->inst_id); return SRD_ERR_PYTHON; } @@ -572,7 +572,7 @@ SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di, * Create new srd_logic object. Each iteration around the PD's loop * will fill one sample into this object. */ - logic = PyObject_New(srd_logic, &srd_logic_type); + logic = PyObject_New(srd_logic, (PyTypeObject *)srd_logic_type); Py_INCREF(logic); logic->di = (struct srd_decoder_inst *)di; logic->start_samplenum = start_samplenum; @@ -585,7 +585,7 @@ SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di, Py_IncRef(di->py_inst); if (!(py_res = PyObject_CallMethod(di->py_inst, "decode", "KKO", start_samplenum, end_samplenum, logic))) { - srd_exception_catch("Protocol decoder instance %s: ", + srd_exception_catch("Protocol decoder instance %s", di->inst_id); return SRD_ERR_PYTHON; } |