Fix Leak
[satune.git] / src / AST / function.c
index daa3dc38b3868af935a4b639869feb548424249e..a67fe291bfa4372d26d8b833fbc0707071f0dd77 100644 (file)
@@ -3,31 +3,48 @@
 #include "set.h"
 
 
-Function* allocFunctionOperator( ArithOp op, Set ** domain, uint numDomain, Set * range,OverFlowBehavior overflowbehavior){
+Function* allocFunctionOperator(ArithOp op, Set ** domain, uint numDomain, Set * range, OverFlowBehavior overflowbehavior) {
        FunctionOperator* This = (FunctionOperator*) ourmalloc(sizeof(FunctionOperator));
        GETFUNCTIONTYPE(This)=OPERATORFUNC;
-       This->numDomains=numDomain;
-       This->domains = ourmalloc(numDomain * sizeof(Set *));
-       memcpy(This->domains, domain, numDomain * sizeof(Set *));
+       initArrayInitSet(&This->domains, domain, numDomain);
        This->op=op;
        This->overflowbehavior = overflowbehavior;
        This->range=range;
        return &This->base;
 }
 
-Function* allocFunctionTable (Table* table){
+Function* allocFunctionTable (Table* table, UndefinedBehavior undefBehavior){
        FunctionTable* This = (FunctionTable*) ourmalloc(sizeof(FunctionTable));
        GETFUNCTIONTYPE(This)=TABLEFUNC;
        This->table = table;
+       This->undefBehavior = undefBehavior;
        return &This->base;
 }
 
+uint64_t applyFunctionOperator(FunctionOperator* This, uint numVals, uint64_t * values) {
+       ASSERT(numVals == 2);
+       switch(This->op){
+               case ADD:
+                       return values[0] + values[1];
+                       break;
+               case SUB:
+                       return values[0] - values[1];
+                       break;
+               default:
+                       ASSERT(0);
+       }
+}
+
+bool isInRangeFunction(FunctionOperator *This, uint64_t val) {
+       return existsInSet(This->range, val);
+}
+
 void deleteFunction(Function* This){
        switch(GETFUNCTIONTYPE(This)){
        case TABLEFUNC:
                break;
        case OPERATORFUNC:
-               ourfree(((FunctionOperator*) This)->domains);
+               deleteInlineArraySet(&((FunctionOperator*) This)->domains);
                break;
        default:
                ASSERT(0);