summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert Vermeulen <bert@biot.com>2012-01-20 22:23:27 +0100
committerBert Vermeulen <bert@biot.com>2012-01-21 15:06:21 +0100
commit11ea8ae1b2279566125978766735a26252dff412 (patch)
tree1affb222c19d38a3f42d5b30629bce8b45b33aa6
parentd42fc6ee118ff673cef1c4ffbce0c7f603519f63 (diff)
downloadlibsigrokdecode-11ea8ae1b2279566125978766735a26252dff412.tar.gz
libsigrokdecode-11ea8ae1b2279566125978766735a26252dff412.zip
srd: decoder class structure check belongs in module loader
-rw-r--r--controller.c5
-rw-r--r--decoder.c15
2 files changed, 13 insertions, 7 deletions
diff --git a/controller.c b/controller.c
index ebda088..fa67004 100644
--- a/controller.c
+++ b/controller.c
@@ -186,11 +186,6 @@ int srd_instance_set_options(struct srd_decoder_instance *di,
py_dec_options = py_dec_optkeys = py_di_options = py_optval = NULL;
py_optlist = py_classval = NULL;
py_dec_options = PyObject_GetAttrString(di->decoder->py_dec, "options");
- if (!PyDict_Check(py_dec_options)) {
- srd_err("Protocol decoder %s options is not a dictionary.",
- di->decoder->name);
- goto err_out;
- }
/* All of these are synthesized objects, so they're good. */
py_dec_optkeys = PyDict_Keys(py_dec_options);
diff --git a/decoder.c b/decoder.c
index 6651642..5b9223c 100644
--- a/decoder.c
+++ b/decoder.c
@@ -75,12 +75,12 @@ struct srd_decoder *srd_get_decoder_by_id(const char *id)
*/
int srd_load_decoder(const char *name, struct srd_decoder **dec)
{
- PyObject *py_basedec, *py_method, *py_annlist, *py_ann;
+ PyObject *py_basedec, *py_method, *py_attr, *py_annlist, *py_ann;
struct srd_decoder *d;
int alen, ret, i;
char **ann;
- py_basedec = py_method = NULL;
+ py_basedec = py_method = py_attr = NULL;
srd_dbg("decoder: %s: loading module '%s'", __func__, name);
@@ -150,6 +150,17 @@ int srd_load_decoder(const char *name, struct srd_decoder **dec)
}
Py_DecRef(py_method);
+ /* If present, options must be a dictionary. */
+ if (PyObject_HasAttrString(d->py_dec, "options")) {
+ py_attr = PyObject_GetAttrString(d->py_dec, "options");
+ if (!PyDict_Check(py_attr)) {
+ srd_err("Protocol decoder %s options attribute is not "
+ "a dictionary.", d->name);
+ goto err_out;
+ }
+ Py_DecRef(py_attr);
+ }
+
if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK)
goto err_out;