]> thyrsus.com Git - cupl.git/commitdiff
Interpreter is semi-working.
authorEric S. Raymond <esr@thyrsus.com>
Fri, 4 Nov 1994 18:01:11 +0000 (18:01 +0000)
committerEric S. Raymond <esr@thyrsus.com>
Fri, 4 Nov 1994 18:01:11 +0000 (18:01 +0000)
cupl.h
execute.c

diff --git a/cupl.h b/cupl.h
index ce67466ca2bd7e62e7df35076110e815bfa32826..661e93b50bae2f3b0f78cecadd15091ab5f9b378 100644 (file)
--- 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;
 
index dbd4f80f467be714289519a082baebc4220b2fd1..21f1ee70e8061d8df0a90ffbb5d48fcb951fcae9 100644 (file)
--- 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: