diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991, 1992 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Progamming Language. @@ -318,7 +318,10 @@ register NODE *volatile tree; break; case Node_K_delete: - do_delete(tree->lnode, tree->rnode); + if (tree->rnode != NULL) + do_delete(tree->lnode, tree->rnode); + else + assoc_clear(tree->lnode); break; case Node_K_next: @@ -967,18 +970,20 @@ NODE *arg_list; /* Node_expression_list of calling args. */ /* should we free arg->var_value ? */ arg->var_array = n->var_array; arg->type = Node_var_array; + arg->array_size = n->array_size; + arg->table_size = n->table_size; } - unref(n->lnode); + /* n->lnode overlays the array size, don't unref it if array */ + if (n->type != Node_var_array) + unref(n->lnode); freenode(n); count--; } while (count-- > 0) { n = *sp++; /* if n is an (local) array, all the elements should be freed */ - if (n->type == Node_var_array) { + if (n->type == Node_var_array) assoc_clear(n); - free(n->var_array); - } unref(n->lnode); freenode(n); } |