From: Eric S. Raymond Date: Fri, 4 Nov 1994 18:01:11 +0000 (+0000) Subject: Interpreter is semi-working. X-Git-Tag: 1-2~71 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=e07202d8f8a1169f18134866bd00f28aee0a8bd3;p=cupl.git Interpreter is semi-working. --- diff --git a/cupl.h b/cupl.h index ce67466..661e93b 100644 --- a/cupl.h +++ b/cupl.h @@ -67,7 +67,6 @@ typedef struct int rank; /* 0, 1, or 2 */ int width, depth; /* dimensions */ scalar *elements; /* elements */ - int refcount; /* how many copies are there? */ } value; diff --git a/execute.c b/execute.c index dbd4f80..21f1ee7 100644 --- a/execute.c +++ b/execute.c @@ -131,7 +131,7 @@ static value cupl_eval(node *tree) return(result); case IDENTIFIER: - result = EVAL_WRAP(tree->syminf->value); + result = copy_value(tree->syminf->value); return(result); case READ: @@ -155,40 +155,47 @@ static value cupl_eval(node *tree) leftside = EVAL_WRAP(cupl_eval(tree->car)); rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_add(leftside, rightside); + deallocate_value(&leftside); deallocate_value(&rightside); return(result); case MULTIPLY: leftside = EVAL_WRAP(cupl_eval(tree->car)); rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_multiply(leftside, rightside); + deallocate_value(&leftside); deallocate_value(&rightside); return(result); case MINUS: leftside = EVAL_WRAP(cupl_eval(tree->car)); rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_subtract(leftside, rightside); + deallocate_value(&leftside); deallocate_value(&rightside); return(result); case DIVIDE: leftside = EVAL_WRAP(cupl_eval(tree->car)); rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_add(leftside, rightside); + deallocate_value(&leftside); deallocate_value(&rightside); return(result); case POWER: leftside = EVAL_WRAP(cupl_eval(tree->car)); rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_power(leftside, rightside); + deallocate_value(&leftside); deallocate_value(&rightside); return(result); case UMINUS: rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_uminus(rightside); + deallocate_value(&rightside); return(result); case SQRT: rightside = EVAL_WRAP(cupl_eval(tree->cdr)); result = cupl_sqrt(rightside); + deallocate_value(&rightside); return(result); default: