]> sigrok.org Git - libsigrokdecode.git/blobdiff - type_decoder.c
Make srd_inst_decode() return the actual decoder state, not SRD_OK
[libsigrokdecode.git] / type_decoder.c
index 324d2ef34e3066f679e8038cacbd0db141cdd81f..6692c3d44e34c54960381aa56812748726e81406 100644 (file)
@@ -50,7 +50,6 @@ static void release_annotation(struct srd_proto_data_annotation *pda)
                return;
        if (pda->ann_text)
                g_strfreev(pda->ann_text);
-       g_free(pda);
 }
 
 static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj,
@@ -110,10 +109,9 @@ static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj,
                goto err;
        }
 
-       pda = g_malloc(sizeof(struct srd_proto_data_annotation));
+       pda = pdata->data;
        pda->ann_class = ann_class;
        pda->ann_text = ann_text;
-       pdata->data = pda;
 
        PyGILState_Release(gstate);
 
@@ -130,7 +128,6 @@ static void release_binary(struct srd_proto_data_binary *pdb)
        if (!pdb)
                return;
        g_free((void *)pdb->data);
-       g_free(pdb);
 }
 
 static int convert_binary(struct srd_decoder_inst *di, PyObject *obj,
@@ -194,15 +191,12 @@ static int convert_binary(struct srd_decoder_inst *di, PyObject *obj,
 
        PyGILState_Release(gstate);
 
-       pdb = g_malloc(sizeof(struct srd_proto_data_binary));
+       pdb = pdata->data;
        pdb->bin_class = bin_class;
        pdb->size = size;
-       if (!(pdb->data = g_try_malloc(pdb->size))) {
-               g_free(pdb);
+       if (!(pdb->data = g_try_malloc(pdb->size)))
                return SRD_ERR_MALLOC;
-       }
        memcpy((void *)pdb->data, (const void *)buf, pdb->size);
-       pdata->data = pdb;
 
        return SRD_OK;
 
@@ -212,7 +206,7 @@ err:
        return SRD_ERR_PYTHON;
 }
 
-static struct srd_decoder_inst *srd_sess_inst_find_by_obj(
+static inline struct srd_decoder_inst *srd_sess_inst_find_by_obj(
        struct srd_session *sess, const GSList *stack, const PyObject *obj)
 {
        const GSList *l;
@@ -249,13 +243,19 @@ static struct srd_decoder_inst *srd_sess_inst_find_by_obj(
  *
  * @since 0.1.0
  */
-static struct srd_decoder_inst *srd_inst_find_by_obj(
+static inline struct srd_decoder_inst *srd_inst_find_by_obj(
                const GSList *stack, const PyObject *obj)
 {
        struct srd_decoder_inst *di;
        struct srd_session *sess;
        GSList *l;
 
+       /* Performance shortcut: Handle the most common case first. */
+       sess = sessions->data;
+       di = sess->di_list->data;
+       if (di->py_inst == obj)
+               return di; 
+
        di = NULL;
        for (l = sessions; di == NULL && l != NULL; l = l->next) {
                sess = l->data;
@@ -319,6 +319,8 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args)
        struct srd_decoder_inst *di, *next_di;
        struct srd_pd_output *pdo;
        struct srd_proto_data pdata;
+       struct srd_proto_data_annotation pda;
+       struct srd_proto_data_binary pdb;
        uint64_t start_sample, end_sample;
        int output_id;
        struct srd_pd_callback *cb;
@@ -364,6 +366,7 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args)
        case SRD_OUTPUT_ANN:
                /* Annotations are only fed to callbacks. */
                if ((cb = srd_pd_output_callback_find(di->sess, pdo->output_type))) {
+                       pdata.data = &pda;
                        /* Convert from PyDict to srd_proto_data_annotation. */
                        if (convert_annotation(di, py_data, &pdata) != SRD_OK) {
                                /* An error was already logged. */
@@ -399,6 +402,7 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args)
                break;
        case SRD_OUTPUT_BINARY:
                if ((cb = srd_pd_output_callback_find(di->sess, pdo->output_type))) {
+                       pdata.data = &pdb;
                        /* Convert from PyDict to srd_proto_data_binary. */
                        if (convert_binary(di, py_data, &pdata) != SRD_OK) {
                                /* An error was already logged. */