getrelation2 can return 0 in cases of a relation that maps objects to ints. This...
authorbdemsky <bdemsky>
Mon, 17 May 2004 22:01:36 +0000 (22:01 +0000)
committerbdemsky <bdemsky>
Mon, 17 May 2004 22:01:36 +0000 (22:01 +0000)
Repair/RepairCompiler/MCC/IR/RepairGenerator.java
Repair/RepairCompiler/MCC/Runtime/SimpleHash.cc
Repair/RepairCompiler/MCC/Runtime/SimpleHash.h

index a3b8efdd219cc208aa33578151c3d9991efdc69f..7921577c12624606d5e3c9b7e47253c817ce9268 100755 (executable)
@@ -1367,7 +1367,11 @@ public class RepairGenerator {
                cr.startblock(); {
                    /* Have update to call into */
                    VarDescriptor mdfyptr=VarDescriptor.makeNew("modifyptr");
-                   cr.outputline("int "+mdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->getrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+                   VarDescriptor ismdfyptr=VarDescriptor.makeNew("ismodifyptr");
+                   cr.outputline("int "+ismdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->ismodify("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+
+
+
                    
                    String parttype="";
                    for(int i=0;i<currentrule.numQuantifiers();i++) {
@@ -1399,9 +1403,10 @@ public class RepairGenerator {
                    
                    cr.outputline("void *"+tmpptr.getSafeSymbol()+"=");
                    cr.outputline("(void *) "+repairtable.getSafeSymbol()+"->getrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
-                   cr.outputline("if ("+mdfyptr.getSafeSymbol()+")");
+                   cr.outputline("if ("+ismdfyptr.getSafeSymbol()+")");
                    {
                        cr.startblock();
+                       cr.outputline("int "+mdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->getrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
                        cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)) "+tmpptr.getSafeSymbol()+";");
                        cr.outputline(methodcall+","+leftvar+", "+rightvar+", "+mdfyptr.getSafeSymbol() +");");
                        cr.endblock();
index 25cf6dd84f7cf97ccd64785cec47d1a3167ecbf8..bed5c1fc3ad9780c35dd042784ef874c016e9441 100755 (executable)
@@ -341,7 +341,7 @@ SimpleHashException::SimpleHashException() {}
 // ************************************************************
 
 
-RepairHashNode::RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2){
+RepairHashNode::RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2, int ismodify){
     this->setrelation = setrelation;
     this->lvalue=lvalue;
     this->rvalue=rvalue;
@@ -350,6 +350,7 @@ RepairHashNode::RepairHashNode(int setrelation, int rule, int lvalue, int rvalue
     this->next = 0;
     this->lnext=0;
     this->rule=rule;
+    this->ismodify=ismodify;
 }
 
 // ************************************************************
@@ -393,7 +394,29 @@ int RepairHash::addset(int setv, int rule, int value, int data) {
 }
 
 int RepairHash::addrelation(int relation, int rule, int lvalue, int rvalue, int data) {
-  return addrelation(relation,rule,lvalue,rvalue,data, 0);
+    unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
+    
+    RepairHashNode **ptr = &bucket[hashkey];
+
+    /* check that this key/object pair isn't already here */
+    // TBD can be optimized for set v. relation */
+    while (*ptr) {
+        if ((*ptr)->setrelation == relation && 
+           (*ptr)->rule==rule &&
+           (*ptr)->lvalue==lvalue &&
+           (*ptr)->rvalue==rvalue &&
+           (*ptr)->data == data&&
+           (*ptr)->data2 == 0) {
+            return 0;
+        }
+        ptr = &((*ptr)->next);
+    }
+    
+    *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data,0,0);
+    (*ptr)->lnext=nodelist;
+    nodelist=*ptr;
+    numelements++;
+    return 1;
 }
 
 int RepairHash::addrelation(int relation, int rule, int lvalue, int rvalue, int data, int data2) {
@@ -415,7 +438,7 @@ int RepairHash::addrelation(int relation, int rule, int lvalue, int rvalue, int
         ptr = &((*ptr)->next);
     }
     
-    *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data,data2);
+    *ptr = new RepairHashNode(relation,rule,lvalue,rvalue, data,data2,1);
     (*ptr)->lnext=nodelist;
     nodelist=*ptr;
     numelements++;
@@ -449,6 +472,25 @@ int RepairHash::getset(int setv, int rule, int value) {
   return getrelation(setv||SETFLAG, rule, value,0);
 }
 
+int RepairHash::ismodify(int relation, int rule, int lvalue,int rvalue) {
+    unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
+    
+    RepairHashNode **ptr = &bucket[hashkey];
+
+    /* check that this key/object pair isn't already here */
+    // TBD can be optimized for set v. relation */
+    while (*ptr) {
+        if ((*ptr)->setrelation == relation && 
+           (*ptr)->rule==rule &&
+           (*ptr)->lvalue==lvalue &&
+           (*ptr)->rvalue==rvalue) {
+         return (*ptr)->ismodify;
+        }
+        ptr = &((*ptr)->next);
+    }
+    return 0;
+}
+
 int RepairHash::getrelation2(int relation, int rule, int lvalue,int rvalue) {
     unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
     
@@ -467,6 +509,7 @@ int RepairHash::getrelation2(int relation, int rule, int lvalue,int rvalue) {
     }
     return 0;
 }
+
 int RepairHash::getrelation(int relation, int rule, int lvalue,int rvalue) {
     unsigned int hashkey = ((unsigned int)(relation ^ rule ^ lvalue ^ rvalue)) % size;
     
index da21f2f0faeed986d377f27cc6e055da72e635a9..0823fd4ed91c6cafc01206991d8dc7f14cacdab4 100755 (executable)
@@ -175,7 +175,8 @@ class RepairHashNode {
     int lvalue;  
     int rvalue;  
     int rule;
-    RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2);
+    int ismodify;
+    RepairHashNode(int setrelation, int rule, int lvalue, int rvalue, int data, int data2,int ismodify);
 };
 
 class RepairHash {
@@ -198,6 +199,7 @@ public:
     int getset(int setv, int rule, int value);
     int getrelation(int relation, int rule, int lvalue, int rvalue);
     int getrelation2(int relation, int rule, int lvalue, int rvalue);
+    int ismodify(int relation, int rule, int lvalue, int rvalue);
 };
 
 #endif