X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=instance.c;h=5264bd0bd3a54d72f8503e926931f542ab310d96;hp=85ff37e42e42e45fdc36416accd06d0de02b1196;hb=e144452bcdd5f2abbe6b6f3da41ad64f67e39def;hpb=e2768fbcdeba97d10c2beaea709412e6fb8b047d diff --git a/instance.c b/instance.c index 85ff37e..5264bd0 100644 --- a/instance.c +++ b/instance.c @@ -59,7 +59,8 @@ static void oldpins_array_seed(struct srd_decoder_inst *di) count = di->dec_num_channels; arr = g_array_sized_new(FALSE, TRUE, sizeof(uint8_t), count); g_array_set_size(arr, count); - memset(arr->data, SRD_INITIAL_PIN_SAME_AS_SAMPLE0, count); + if (arr->data) + memset(arr->data, SRD_INITIAL_PIN_SAME_AS_SAMPLE0, count); di->old_pins_array = arr; } @@ -182,10 +183,13 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, goto err_out; } } - if (PyDict_SetItemString(py_di_options, sdo->id, py_optval) == -1) + if (PyDict_SetItemString(py_di_options, sdo->id, py_optval) == -1) { + Py_XDECREF(py_optval); goto err_out; + } /* Not harmful even if we used the default. */ g_hash_table_remove(options, sdo->id); + Py_XDECREF(py_optval); } if (g_hash_table_size(options) != 0) srd_warn("Unknown options specified for '%s'", di->inst_id); @@ -193,7 +197,6 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, ret = SRD_OK; err_out: - Py_XDECREF(py_optval); if (PyErr_Occurred()) { srd_exception_catch("Stray exception in srd_inst_option_set()"); ret = SRD_ERR_PYTHON; @@ -693,7 +696,7 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di) PyGILState_Release(gstate); return SRD_ERR_PYTHON; } - Py_DecRef(py_res); + Py_DECREF(py_res); /* Set self.samplenum to 0. */ py_samplenum = PyLong_FromLong(0); @@ -829,6 +832,8 @@ static void update_old_pins_array(struct srd_decoder_inst *di, oldpins_array_seed(di); for (i = 0; i < di->dec_num_channels; i++) { + if (di->dec_channelmap[i] == -1) + continue; /* Ignore unused optional channels. */ byte_offset = di->dec_channelmap[i] / 8; bit_offset = di->dec_channelmap[i] % 8; sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0; @@ -851,6 +856,8 @@ static void update_old_pins_array_initial_pins(struct srd_decoder_inst *di) for (i = 0; i < di->dec_num_channels; i++) { if (di->old_pins_array->data[i] != SRD_INITIAL_PIN_SAME_AS_SAMPLE0) continue; + if (di->dec_channelmap[i] == -1) + continue; /* Ignore unused optional channels. */ byte_offset = di->dec_channelmap[i] / 8; bit_offset = di->dec_channelmap[i] % 8; sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0; @@ -888,6 +895,8 @@ static gboolean all_terms_match(const struct srd_decoder_inst *di, for (l = cond; l; l = l->next) { term = l->data; + if (term->type == SRD_TERM_ALWAYS_FALSE) + return FALSE; if (!term_matches(di, term, sample_pos)) return FALSE; } @@ -1044,7 +1053,7 @@ static gpointer di_thread(gpointer data) * Call self.decode(). Only returns if the PD throws an exception. * "Regular" termination of the decode() method is not expected. */ - Py_IncRef(di->py_inst); + Py_INCREF(di->py_inst); srd_dbg("%s: Calling decode().", di->inst_id); py_res = PyObject_CallMethod(di->py_inst, "decode", NULL); srd_dbg("%s: decode() terminated.", di->inst_id); @@ -1100,7 +1109,7 @@ static gpointer di_thread(gpointer data) * decode() will re-start another thread transparently. */ srd_dbg("%s: decode() terminated (req %d).", di->inst_id, wanted_term); - Py_DecRef(py_res); + Py_DECREF(py_res); PyErr_Clear(); PyGILState_Release(gstate); @@ -1309,7 +1318,7 @@ SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di) srd_inst_reset_state(di); gstate = PyGILState_Ensure(); - Py_DecRef(di->py_inst); + Py_DECREF(di->py_inst); PyGILState_Release(gstate); g_free(di->inst_id);