From c1597c621eac0fbe86953a8b93442917dc60d6fb Mon Sep 17 00:00:00 2001
From: bdemsky <bdemsky>
Date: Wed, 9 Jan 2008 09:07:22 +0000
Subject: [PATCH] changes

---
 .../TaskStateAnalysis/ObjWrapper.java         |   2 +-
 .../TaskStateAnalysis/TagWrapper.java         |  14 +--
 .../TaskStateAnalysis/TaskTagAnalysis.java    | 102 ++++++++++++++----
 3 files changed, 85 insertions(+), 33 deletions(-)

diff --git a/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java b/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java
index 042c9226..3fe4b458 100644
--- a/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java
+++ b/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java
@@ -4,7 +4,7 @@ import IR.Tree.*;
 import IR.Flat.*;
 import java.util.*;
 
-public class ObjWrapper {
+public class ObjWrapper implements Wrapper{
     FlagState fs;
     Vector<TagWrapper> tags;
 
diff --git a/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java b/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java
index eedda217..1cdad2c2 100644
--- a/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java
+++ b/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java
@@ -4,7 +4,7 @@ import IR.Tree.*;
 import IR.Flat.*;
 import java.util.*;
 
-public class TagWrapper {
+public class TagWrapper implements Wrapper {
     TagState initts;
     Vector<TagState> ts;
 
@@ -20,16 +20,4 @@ public class TagWrapper {
 	tw.ts=ts.clone();
 	return tw;
     }
-
-    public boolean equals(Object o) {
-	if (o instanceof TagWrapper) {
-	    TagWrapper tw=(TagWrapper)o;
-	    return tw.initts.equals(initts)&&tw.ts.equals(ts);
-	}
-	return false;
-    }
-
-    public int hashCode() {
-	return initts.hashCode()^ts.hashCode();
-    }
 }
diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java
index 093102e9..f83c2588 100644
--- a/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java
+++ b/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java
@@ -73,37 +73,81 @@ public class TaskTagAnalysis {
 	}
     }
 
-    private Hashtable<TempDescriptor, TagWrapper> computeInitialState(Hashtable<FlatNode, Hashtable<TempDescriptor, TagWrapper>> table, FlatNode fn) {
-	Hashtable<TempDescriptor, TagWrapper> table=new Hashtable<TempDescriptor, TagWrapper>();
+    private Hashtable<TempDescriptor, Wrapper> computeInitialState(Hashtable<FlatNode, Hashtable<TempDescriptor, Wrapper>> maintable, FlatNode fn) {
+	Hashtable<TempDescriptor, Wrapper> table=new Hashtable<TempDescriptor, Wrapper>();
+	Hashtable<TagWrapper,TagWrapper> tagtable=new Hashtable<TagWrapper, TagWrapper>();
 	for(int i=0;i<fn.numPrev();i++) {
 	    FlatNode fnprev=fn.getPrev(i);
-	    Hashtable<TempDescriptor, TagWrapper> prevtable=table.get(fn);
+	    Hashtable<TempDescriptor, Wrapper> prevtable=maintable.get(fn);
+
+	    //Iterator through the Tags
 	    for(Iterator<TempDescriptor> tmpit=prevtable.keySet().iterator();tmpit.hasNext();) {
 		TempDescriptor tmp=tmpit.next();
-		TagWrapper prevtag=prevtable.get(tmp);
+		Wrapper prevtag=prevtable.get(tmp);
+		if (prevtag instanceof ObjWrapper)
+		    continue;
 		if (table.containsKey(tmp)) {
 		    //merge tag states
-		    TagWrapper currtag=table.get(tmp);
-		    assert(currtag.initts.equals(prevtag.initts));
-		    for(Iterator<TagState> tagit=prevtag.ts.iterator();tagit.hasNext();) {
+		    TagWrapper currtag=(TagWrapper) table.get(tmp);
+		    tagtable.put((TagWrapper)prevtag, currtag);
+		    assert(currtag.initts.equals(((TagWrapper)prevtag).initts));
+		    for(Iterator<TagState> tagit=((TagWrapper)prevtag).ts.iterator();tagit.hasNext();) {
 			TagState tag=tagit.next();
 			if (!currtag.ts.contains(tag)) {
 			    currtag.ts.add(tag);
 			}
 		    }
 		} else {
-		    table.put(tmp, prevtag.clone());
+		    TagWrapper clonetag=prevtag.clone();
+		    tagtable.put(prevtag, clonetag);
+		    table.put(tmp, clonetag);
+		}
+	    }
+
+	    //Iterator through the Objects
+	    for(Iterator<TempDescriptor> tmpit=prevtable.keySet().iterator();tmpit.hasNext();) {
+		TempDescriptor tmp=tmpit.next();
+		Wrapper obj=prevtable.get(tmp);
+		if (obj instanceof TagWrapper)
+		    continue;
+		ObjWrapper prevobj=(ObjWrapper)obj;
+		if (table.containsKey(tmp)) {
+		    //merge tag states
+		    ObjWrapper newobj=new ObjWrapper(prevobj.fs);
+		    table.put(tmp, newobj);
+		}
+		ObjWrapper currobj=(ObjWrapper) table.get(tmp);
+		for(int j=0;j<prevobj.tags.size();j++) {
+		    TagWrapper t=tagtable.get(prevobj.tags.get(j));
+		    if (!currobj.tags.contains(t))
+			currobj.tags.add(t);
 		}
 	    }
 	}
 	return table;
     }
 
+    private void processFlatFlag(FlatFlagActionNode fn, Hashtable<TempDescriptor, TagState> table) {
+
+    }
+
+    private void processFlatCall(FlatCall fc, Hashtable<TempDescriptor, TagState> table) {
+
+    }
+
+    private void processFlatReturnNode(FlatReturnNode fr, Hashtable<TempDescriptor, TagState> table) {
+
+    }
+
+    private boolean equivalent(Hashtable<TempDescriptor, TagState> table1, Hashtable<TempDescriptor, TagState> table2) {
+
+    }
+
     private void doAnalysis(TaskBinding tb) {
 	TaskDescriptor td=tb.tqi.tq.getTask();
 	FlatMethod fm=state.getMethodFlat(td);
-	Hashtable<FlatNode, Hashtable<TempDescriptor, TagWrapper>> table=new Hashtable<FlatNode, Hashtable<TempDescriptor, TagWrapper>>();
-	table.put(fm, buildinittable(tb));
+	Hashtable<FlatNode, Hashtable<TempDescriptor, Wrapper>> wtable=new Hashtable<FlatNode, Hashtable<TempDescriptor, Wrapper>>();
+	wtable.put(fm, buildinittable(tb));
 	HashSet<FlatNode> visited=new HashSet<FlatNode>();
 	HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
 	tovisit.add(fm.getNext(0));
@@ -111,25 +155,45 @@ public class TaskTagAnalysis {
 	    FlatNode fn=tovisit.iterator().next();
 	    tovisit.remove(fn);
 	    visited.add(fn);
-	    Hashtable<TempDescriptor, TagState> table=computeInitialState(table, fn);
-	    
+	    Hashtable<TempDescriptor, TagState> table=computeInitialState(wtable, fn);
+	    switch(fn.kind()) {
+	    case FKind.FlatFlagActionNode:
+		processFlatFlag((FlatFlagActionNode)fn, table);
+		break;
+	    case FKind.FlatCall:
+		processFlatCall((FlatCall)fn, table);
+		break;
+	    case FKind.FlatReturnNode:
+		processFlatReturnNode((FlatReturn)fn, table);
+		break;
+	    default:
+	    }
 
-	    for(int i=0;i<fn.numNext();i++) {
-		if (!visited.contains(fn.getNext(i)))
+	    if (!equivalent(table, wtable.get(fn))) {
+		wtable.put(fn, table);
+		for(int i=0;i<fn.numNext();i++) {
 		    tovisit.add(fn.getNext(i));
+		}
+	    } else {
+		for(int i=0;i<fn.numNext();i++) {
+		    if (!visited.contains(fn.getNext(i)))
+			tovisit.add(fn.getNext(i));
+		}
 	    }
 	}
 	
     }
 
-    private Hashtable<TempDescriptor, Set<TagWrapper>> buildinittable(TaskBinding tb) {
-	Hashtable<TempDescriptor, Set<TagWrapper>> table=new Hashtable<TempDescriptor, Set<TagWrapper>>();
+    private Hashtable<TempDescriptor, Wrapper> buildinittable(TaskBinding tb, FlatMethod fm) {
+	Hashtable<TempDescriptor, Wrapper> table=new Hashtable<TempDescriptor, Wrapper>();
 	Vector<TempDescriptor> tagtmps=tb.tqi.tq.tags;
 	for(int i=0;i<tagtmps.size();i++) {
 	    TempDescriptor tmp=tagtmps.get(i);
-	    HashSet<TagWrapper> tset=new HashSet<TagWrapper>();
-	    tset.add(tb.getTag(tmp));
-	    table.put(tmp, tset);
+	    table.put(tmp, tb.getTag(tmp));
+	}
+	for(int i=0;i<fm.numParameters();i++) {
+	    TempDescriptor tmp=fm.getParameter(i);
+	    table.put(tmp, tb.getParameter(i));
 	}
 	return table;
     }
-- 
2.34.1