Update of /cvsroot/alsa/alsa-lib/src/alisp
In directory sc8-pr-cvs1:/tmp/cvs-serv5768/src/alisp

Modified Files:
        alisp_snd.c 
Log Message:
alisp - removed all memory leaks from alisp_snd.c discovered by hctl.lisp script


Index: alisp_snd.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp_snd.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- alisp_snd.c 13 Dec 2003 18:36:01 -0000      1.8
+++ alisp_snd.c 13 Dec 2003 20:03:58 -0000      1.9
@@ -59,12 +59,16 @@
        unsigned int mask;
 }; 
 
-static unsigned int get_flags(struct alisp_object * obj, const struct flags * flags, 
unsigned int deflt)
+static unsigned int get_flags(struct alisp_instance * instance,
+                             struct alisp_object * obj,
+                             const struct flags * flags,
+                             unsigned int deflt)
 {
        const char *key;
        int invert;
        unsigned int result;
        const struct flags *ptr;
+       struct alisp_object *n;
 
        if (obj == &alsa_lisp_nil)
                return deflt;
@@ -86,21 +90,32 @@
                                ptr++;
                        }
                }
-               obj = cdr(obj);
+               delete_tree(instance, car(obj));
+               obj = cdr(n = obj);
+               delete_object(instance, n);
        } while (obj != &alsa_lisp_nil);
        return result;
 }
 
-static const void *get_ptr(struct alisp_object * obj, const char *_ptr_id)
+static const void *get_ptr(struct alisp_instance * instance,
+                          struct alisp_object * obj,
+                          const char *_ptr_id)
 {
        const char *ptr_id;
+       const void *ptr;
        
        ptr_id = get_string(car(obj), NULL);
-       if (ptr_id == NULL)
+       if (ptr_id == NULL) {
+               delete_tree(instance, obj);
                return NULL;
-       if (strcmp(ptr_id, _ptr_id))
+       }
+       if (strcmp(ptr_id, _ptr_id)) {
+               delete_tree(instance, obj);
                return NULL;
-       return get_pointer(cdr(obj));
+       }
+       ptr = get_pointer(cdr(obj));
+       delete_tree(instance, obj);
+       return ptr;
 }
 
 static struct alisp_object * new_lexpr(struct alisp_instance * instance, int err)
@@ -111,83 +126,84 @@
        if (lexpr == NULL)
                return NULL;
        lexpr->value.c.car = new_integer(instance, err);
-       if (lexpr->value.c.car == NULL)
+       if (lexpr->value.c.car == NULL) {
+               delete_object(instance, lexpr);
                return NULL;
+       }
        lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
-       if (lexpr->value.c.cdr == NULL)
+       if (lexpr->value.c.cdr == NULL) {
+               delete_object(instance, lexpr->value.c.car);
+               delete_object(instance, lexpr);
                return NULL;
-       return lexpr;
-}
-
-static struct alisp_object * add_cons(struct alisp_instance * instance, struct 
alisp_object *lexpr, int cdr, const char *id, struct alisp_object *obj)
-{
-       struct alisp_object * p1;
-
-       if (lexpr == NULL || obj == NULL)
-               return NULL;
-       if (cdr) {
-               p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
-       } else {
-               p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
        }
-       lexpr = p1;
-       if (p1 == NULL)
-               return NULL;
-       p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
-       if ((p1 = p1->value.c.car) == NULL)
-               return NULL;
-       p1->value.c.car = new_string(instance, id);
-       if (p1->value.c.car == NULL)
-               return NULL;
-       p1->value.c.cdr = obj;
        return lexpr;
 }
 
-#if 0
-static struct alisp_object * add_cons1(struct alisp_instance * instance, struct 
alisp_object *lexpr, int cdr, int id, struct alisp_object *obj)
+static struct alisp_object * add_cons(struct alisp_instance * instance,
+                                     struct alisp_object *lexpr,
+                                     int cdr, const char *id,
+                                     struct alisp_object *obj)
 {
-       struct alisp_object * p1;
+       struct alisp_object * p1, * p2;
 
-       if (lexpr == NULL || obj == NULL)
+       if (lexpr == NULL || obj == NULL) {
+               delete_tree(instance, obj);
                return NULL;
+       }
        if (cdr) {
                p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
        } else {
                p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
        }
        lexpr = p1;
-       if (p1 == NULL)
+       if (p1 == NULL) {
+               delete_tree(instance, obj);
                return NULL;
+       }
        p1->value.c.car = new_object(instance, ALISP_OBJ_CONS);
-       if ((p1 = p1->value.c.car) == NULL)
-               return NULL;
-       p1->value.c.car = new_integer(instance, id);
-       if (p1->value.c.car == NULL)
+       if ((p2 = p1->value.c.car) == NULL)
+               goto __err;
+       p2->value.c.car = new_string(instance, id);
+       if (p2->value.c.car == NULL) {
+             __err:
+               if (cdr)
+                       lexpr->value.c.cdr = NULL;
+               else
+                       lexpr->value.c.car = NULL;
+               delete_tree(instance, p1);
+               delete_tree(instance, obj);
                return NULL;
-       p1->value.c.cdr = obj;
+       }
+       p2->value.c.cdr = obj;
        return lexpr;
 }
-#endif
 
-static struct alisp_object * add_cons2(struct alisp_instance * instance, struct 
alisp_object *lexpr, int cdr, struct alisp_object *obj)
+static struct alisp_object * add_cons2(struct alisp_instance * instance,
+                                      struct alisp_object *lexpr,
+                                      int cdr, struct alisp_object *obj)
 {
        struct alisp_object * p1;
 
-       if (lexpr == NULL || obj == NULL)
+       if (lexpr == NULL || obj == NULL) {
+               delete_tree(instance, obj);
                return NULL;
+       }
        if (cdr) {
                p1 = lexpr->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
        } else {
                p1 = lexpr->value.c.car = new_object(instance, ALISP_OBJ_CONS);
        }
        lexpr = p1;
-       if (p1 == NULL)
+       if (p1 == NULL) {
+               delete_tree(instance, obj);
                return NULL;
+       }
        p1->value.c.car = obj;
        return lexpr;
 }
 
-static struct alisp_object * new_result1(struct alisp_instance * instance, int err, 
const char *ptr_id, void *ptr)
+static struct alisp_object * new_result1(struct alisp_instance * instance,
+                                        int err, const char *ptr_id, void *ptr)
 {
        struct alisp_object * lexpr, * p1;
 
@@ -197,15 +213,20 @@
        if (lexpr == NULL)
                return NULL;
        lexpr->value.c.car = new_integer(instance, err);
-       if (lexpr->value.c.car == NULL)
+       if (lexpr->value.c.car == NULL) {
+               delete_object(instance, lexpr);
                return NULL;
+       }
        p1 = add_cons(instance, lexpr, 1, ptr_id, new_pointer(instance, ptr));
-       if (p1 == NULL)
+       if (p1 == NULL) {
+               delete_object(instance, lexpr);
                return NULL;
+       }
        return lexpr;
 }
 
-static struct alisp_object * new_result2(struct alisp_instance * instance, int err, 
int val)
+static struct alisp_object * new_result2(struct alisp_instance * instance,
+                                        int err, int val)
 {
        struct alisp_object * lexpr, * p1;
 
@@ -216,12 +237,15 @@
                return NULL;
        p1 = lexpr->value.c.cdr;
        p1->value.c.car = new_integer(instance, val);
-       if (p1->value.c.car == NULL)
+       if (p1->value.c.car == NULL) {
+               delete_object(instance, lexpr);
                return NULL;
+       }
        return lexpr;
 }
 
-static struct alisp_object * new_result3(struct alisp_instance * instance, int err, 
const char *str)
+static struct alisp_object * new_result3(struct alisp_instance * instance,
+                                        int err, const char *str)
 {
        struct alisp_object * lexpr, * p1;
 
@@ -232,8 +256,10 @@
                return NULL;
        p1 = lexpr->value.c.cdr;
        p1->value.c.car = new_string(instance, str);
-       if (p1->value.c.car == NULL)
+       if (p1->value.c.car == NULL) {
+               delete_object(instance, lexpr);
                return NULL;
+       }
        return lexpr;
 }
 
@@ -259,6 +285,7 @@
        const char *name;
        int err, mode;
        void *handle;
+       struct alisp_object *p1, *p2;
        static struct flags flags[] = {
                { "nonblock", SND_CTL_NONBLOCK },
                { "async", SND_CTL_ASYNC },
@@ -266,12 +293,16 @@
                { NULL, 0 }
        };
 
-       name = get_string(eval(instance, car(args)), NULL);
+       name = get_string(p1 = eval(instance, car(args)), NULL);
        if (name == NULL)
                return &alsa_lisp_nil;
-       mode = get_flags(eval(instance, car(cdr(args))), flags, 0);
-       
+       mode = get_flags(instance, p2 = eval(instance, car(cdr(args))), flags, 0);
+       delete_tree(instance, cdr(cdr(args)));
+       delete_object(instance, cdr(args));
+       delete_object(instance, args);
+       delete_tree(instance, p2);
        err = ((snd_int_pp_strp_int_t)item->xfunc)(&handle, name, mode);
+       delete_tree(instance, p1);
        return new_result1(instance, err, item->prefix, handle);
 }
 
@@ -280,13 +311,18 @@
        int err;
        void *handle;
        const char *prefix1;
+       struct alisp_object *p1;
 
        if (item->xfunc == &snd_hctl_open_ctl)
                prefix1 = "ctl";
-       else
+       else {
+               delete_tree(instance, args);
                return &alsa_lisp_nil;
-       args = eval(instance, car(args));
-       handle = (void *)get_ptr(args, prefix1);
+       }
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (void *)get_ptr(instance, p1, prefix1);
        if (handle == NULL)
                return &alsa_lisp_nil;
        err = ((snd_int_pp_p_t)item->xfunc)(&handle, handle);
@@ -297,6 +333,7 @@
 {
        void *handle;
        const char *prefix1;
+       struct alisp_object * p1;
 
        if (item->xfunc == &snd_hctl_first_elem ||
            item->xfunc == &snd_hctl_last_elem ||
@@ -305,10 +342,14 @@
                prefix1 = "hctl_elem";
        else if (item->xfunc == &snd_hctl_ctl)
                prefix1 = "ctl";
-       else
+       else {
+               delete_tree(instance, args);
                return &alsa_lisp_nil;
-       args = eval(instance, car(args));
-       handle = (void *)get_ptr(args, item->prefix);
+       }
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (void *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        handle = ((snd_p_p_t)item->xfunc)(handle);
@@ -318,9 +359,12 @@
 static struct alisp_object * FA_int_p(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
 {
        void *handle;
+       struct alisp_object * p1;
 
-       args = eval(instance, car(args));
-       handle = (void *)get_ptr(args, item->prefix);
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (void *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        return new_integer(instance, ((snd_int_p_t)item->xfunc)(handle));
@@ -329,9 +373,12 @@
 static struct alisp_object * FA_str_p(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
 {
        void *handle;
+       struct alisp_object * p1;
 
-       args = eval(instance, car(args));
-       handle = (void *)get_ptr(args, item->prefix);
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (void *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        return new_string(instance, ((snd_str_p_t)item->xfunc)(handle));
@@ -340,11 +387,17 @@
 static struct alisp_object * FA_int_intp(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
 {
        int val, err;
+       struct alisp_object * p1;
 
-       args = eval(instance, car(args));
-       if (!alisp_compare_type(args, ALISP_OBJ_INTEGER))
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       if (!alisp_compare_type(p1, ALISP_OBJ_INTEGER)) {
+               delete_tree(instance, p1);
                return &alsa_lisp_nil;
-       val = args->value.i;
+       }
+       val = p1->value.i;
+       delete_tree(instance, p1);
        err = ((snd_int_intp_t)item->xfunc)(&val);
        return new_result2(instance, err, val);
 }
@@ -352,12 +405,18 @@
 static struct alisp_object * FA_int_str(struct alisp_instance * instance, struct 
acall_table * item, struct alisp_object * args)
 {
        int err;
+       struct alisp_object * p1;
 
-       args = eval(instance, car(args));
-       if (!alisp_compare_type(args, ALISP_OBJ_STRING) &&
-           !alisp_compare_type(args, ALISP_OBJ_IDENTIFIER))
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       if (!alisp_compare_type(p1, ALISP_OBJ_STRING) &&
+           !alisp_compare_type(p1, ALISP_OBJ_IDENTIFIER)) {
+               delete_tree(instance, p1);
                return &alsa_lisp_nil;
-       err = ((snd_int_str_t)item->xfunc)(args->value.s);
+       }
+       err = ((snd_int_str_t)item->xfunc)(p1->value.s);
+       delete_tree(instance, p1);
        return new_integer(instance, err);
 }
 
@@ -365,11 +424,19 @@
 {
        int err;
        char *str;
+       long val;
+       struct alisp_object * p1;
 
-       args = eval(instance, car(args));
-       if (!alisp_compare_type(args, ALISP_OBJ_INTEGER))
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       if (!alisp_compare_type(p1, ALISP_OBJ_INTEGER)) {
+               delete_tree(instance, p1);
                return &alsa_lisp_nil;
-       err = ((snd_int_int_strp_t)item->xfunc)(args->value.i, &str);
+       }
+       val = p1->value.i;
+       delete_tree(instance, p1);
+       err = ((snd_int_int_strp_t)item->xfunc)(val, &str);
        return new_result3(instance, err, str);
 }
 
@@ -377,11 +444,13 @@
 {
        snd_ctl_t *handle;
        struct alisp_object * lexpr, * p1;
-       snd_ctl_card_info_t *info;
+       snd_ctl_card_info_t * info;
        int err;
 
-       args = eval(instance, car(args));
-       handle = (snd_ctl_t *)get_ptr(args, item->prefix);
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (snd_ctl_t *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        snd_ctl_card_info_alloca(&info);
@@ -395,8 +464,10 @@
        p1 = add_cons(instance, p1, 1, "longname", new_string(instance, 
snd_ctl_card_info_get_longname(info)));
        p1 = add_cons(instance, p1, 1, "mixername", new_string(instance, 
snd_ctl_card_info_get_mixername(info)));
        p1 = add_cons(instance, p1, 1, "components", new_string(instance, 
snd_ctl_card_info_get_components(info)));
-       if (p1 == NULL)
+       if (p1 == NULL) {
+               delete_tree(instance, lexpr);
                return NULL;
+       }
        return lexpr;
 }
 
@@ -411,7 +482,9 @@
        return cons;
 }
 
-static int parse_ctl_elem_id(struct alisp_object * cons, snd_ctl_elem_id_t * id)
+static int parse_ctl_elem_id(struct alisp_instance * instance,
+                            struct alisp_object * cons,
+                            snd_ctl_elem_id_t * id)
 {
        struct alisp_object *p1;
        const char *xid;
@@ -440,7 +513,9 @@
                                snd_ctl_elem_id_set_index(id, 
get_integer(p1->value.c.cdr));
                        }
                }
-               cons = cdr(cons);
+               delete_tree(instance, p1);
+               cons = cdr(p1 = cons);
+               delete_object(instance, p1);
        } while (cons != &alsa_lisp_nil);
        return 0;
 }
@@ -449,12 +524,20 @@
 {
        snd_hctl_t *handle;
        snd_ctl_elem_id_t *id;
+       struct alisp_object *p1;
 
-       handle = (snd_hctl_t *)get_ptr(car(args), item->prefix);
-       if (handle == NULL)
+       handle = (snd_hctl_t *)get_ptr(instance, car(args), item->prefix);
+       if (handle == NULL) {
+               delete_tree(instance, cdr(args));
+               delete_object(instance, args);
                return &alsa_lisp_nil;
+       }
        snd_ctl_elem_id_alloca(&id);
-       if (parse_ctl_elem_id(eval(instance, car(cdr(args))), id) < 0)
+       p1 = car(cdr(args));
+       delete_tree(instance, cdr(cdr(args)));
+       delete_object(instance, cdr(args));
+       delete_object(instance, args);
+       if (parse_ctl_elem_id(instance, eval(instance, p1), id) < 0)
                return &alsa_lisp_nil;
        return new_cons_pointer(instance, "hctl_elem", snd_hctl_find_elem(handle, id));
 }
@@ -468,8 +551,10 @@
        snd_ctl_elem_type_t type;
        int err;
 
-       args = eval(instance, car(args));
-       handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix);
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (snd_hctl_elem_t *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        snd_ctl_elem_info_alloca(&info);
@@ -481,8 +566,10 @@
        type = snd_ctl_elem_info_get_type(info);
        p1 = add_cons(instance, lexpr->value.c.cdr, 0, "id", p2 = new_object(instance, 
ALISP_OBJ_CONS));
        snd_ctl_elem_info_get_id(info, id);
-       if (create_ctl_elem_id(instance, id, p2) == NULL)
+       if (create_ctl_elem_id(instance, id, p2) == NULL) {
+               delete_tree(instance, lexpr);
                return NULL;
+       }
        p1 = add_cons(instance, p1, 1, "type", new_string(instance, 
snd_ctl_elem_type_name(type)));
        p1 = add_cons(instance, p1, 1, "readable", new_integer(instance, 
snd_ctl_elem_info_is_readable(info)));
        p1 = add_cons(instance, p1, 1, "writeable", new_integer(instance, 
snd_ctl_elem_info_is_writable(info)));
@@ -528,8 +615,10 @@
        default:
                break;
        }
-       if (p1 == NULL)
+       if (p1 == NULL) {
+               delete_tree(instance, lexpr);
                return NULL;
+       }
        return lexpr;
 }
 
@@ -543,8 +632,10 @@
        unsigned int idx, count;
        int err;
 
-       args = eval(instance, car(args));
-       handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix);
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (snd_hctl_elem_t *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        snd_ctl_elem_info_alloca(&info);
@@ -588,8 +679,10 @@
                        p1 = add_cons2(instance, p1, 1, obj);
                }
        }
-       if (p1 == NULL)
+       if (p1 == NULL) {
+               delete_tree(instance, lexpr);
                return &alsa_lisp_nil;
+       }
        return lexpr;
 }
 
@@ -604,15 +697,22 @@
        int err;
 
        p1 = car(cdr(args));
-       args = eval(instance, car(args));
-       handle = (snd_hctl_elem_t *)get_ptr(args, item->prefix);
-       if (handle == NULL)
+       obj = eval(instance, car(args));
+       delete_tree(instance, cdr(cdr(args)));
+       delete_object(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (snd_hctl_elem_t *)get_ptr(instance, obj, item->prefix);
+       if (handle == NULL) {
+               delete_tree(instance, p1);
                return &alsa_lisp_nil;
+       }
        snd_ctl_elem_info_alloca(&info);
        snd_ctl_elem_value_alloca(&value);
        err = snd_hctl_elem_info(handle, info);
-       if (err < 0)
+       if (err < 0) {
+               delete_tree(instance, p1);
                return new_integer(instance, err);
+       }
        type = snd_ctl_elem_info_get_type(info);
        count = snd_ctl_elem_info_get_count(info);
        if (type == SND_CTL_ELEM_TYPE_IEC958) {
@@ -621,8 +721,10 @@
        }
        idx = -1;
        do {
-               if (++idx >= count)
+               if (++idx >= count) {
+                       delete_tree(instance, p1);
                        break;
+               }
                obj = car(p1);
                switch (type) {
                case SND_CTL_ELEM_TYPE_BOOLEAN:
@@ -641,10 +743,11 @@
                        snd_ctl_elem_value_set_byte(value, idx, get_integer(obj));
                        break;
                default:
-                       obj = NULL;
                        break;
                }
-               p1 = cdr(p1);
+               delete_tree(instance, obj);
+               p1 = cdr(obj = p1);
+               delete_object(instance, obj);
        } while (p1 != &alsa_lisp_nil);
        err = snd_hctl_elem_write(handle, value);
        return new_integer(instance, err);
@@ -657,8 +760,10 @@
        snd_pcm_info_t *info;
        int err;
 
-       args = eval(instance, car(args));
-       handle = (snd_pcm_t *)get_ptr(args, item->prefix);
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       handle = (snd_pcm_t *)get_ptr(instance, p1, item->prefix);
        if (handle == NULL)
                return &alsa_lisp_nil;
        snd_pcm_info_alloca(&info);
@@ -722,29 +827,56 @@
        struct acall_table key, *item;
 
        p1 = eval(instance, car(args));
+       p2 = cdr(args);
+       delete_object(instance, args);
        if (!alisp_compare_type(p1, ALISP_OBJ_IDENTIFIER) &&
-           !alisp_compare_type(p1, ALISP_OBJ_STRING))
+           !alisp_compare_type(p1, ALISP_OBJ_STRING)) {
+               delete_tree(instance, p2);
                return &alsa_lisp_nil;
-       p2 = cdr(args);
+       }
        key.name = p1->value.s;
        if ((item = bsearch(&key, acall_table,
                            sizeof acall_table / sizeof acall_table[0],
-                           sizeof acall_table[0], acall_compar)) != NULL)
+                           sizeof acall_table[0], acall_compar)) != NULL) {
+               delete_tree(instance, p1);
                return item->func(instance, item, p2);
+       }
+       delete_tree(instance, p1);
+       delete_tree(instance, p2);
        lisp_warn(instance, "acall function %s' is undefined", p1->value.s);
        return &alsa_lisp_nil;
 }
 
-static struct alisp_object * F_ahandle(struct alisp_instance *instance 
ATTRIBUTE_UNUSED, struct alisp_object * args)
+static struct alisp_object * F_ahandle(struct alisp_instance *instance, struct 
alisp_object * args)
 {
-       return car(cdr(eval(instance, car(args))));
+       struct alisp_object *p1;
+
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       args = car(cdr(p1));
+       delete_tree(instance, cdr(cdr(p1)));
+       delete_object(instance, cdr(p1));
+       delete_tree(instance, car(p1));
+       delete_object(instance, p1);
+       return args;
 }
 
 static struct alisp_object * F_aerror(struct alisp_instance *instance, struct 
alisp_object * args)
 {
-       args = car(eval(instance, car(args)));
-       if (args == &alsa_lisp_nil)
+       struct alisp_object *p1;
+
+       p1 = eval(instance, car(args));
+       delete_tree(instance, cdr(args));
+       delete_object(instance, args);
+       args = car(p1);
+       if (args == &alsa_lisp_nil) {
+               delete_tree(instance, p1);
                return new_integer(instance, SND_ERROR_ALISP_NIL);
+       } else {
+               delete_tree(instance, cdr(p1));
+               delete_object(instance, p1);
+       }
        return args;
 }
 
@@ -755,8 +887,10 @@
        int err;
        
        err = snd_output_buffer_open(&out);
-       if (err < 0)
+       if (err < 0) {
+               delete_tree(instance, args);
                return err;
+       }
 
        do {
                p1 = eval(instance, car(p));
@@ -764,7 +898,9 @@
                        snd_output_printf(out, "%s", p1->value.s);
                else
                        princ_object(out, p1);
-               p = cdr(p);
+               delete_tree(instance, p1);
+               p = cdr(p1 = p);
+               delete_object(instance, p1);
        } while (p != &alsa_lisp_nil);
 
        *rout = out;



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to