From 38714f53bb0794c075b74dfe7ec89a823a078bf0 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Fri, 11 Jan 2008 05:08:54 +0000 Subject: [PATCH] more changes --- .../Analysis/TaskStateAnalysis/TagState.java | 12 ++++ .../TaskStateAnalysis/TagWrapper.java | 5 ++ .../TaskStateAnalysis/TaskBinding.java | 10 ++-- .../TaskStateAnalysis/TaskTagAnalysis.java | 56 +++++++++++++++---- 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/Robust/src/Analysis/TaskStateAnalysis/TagState.java b/Robust/src/Analysis/TaskStateAnalysis/TagState.java index 925ed818..91b505ec 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TagState.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TagState.java @@ -8,16 +8,28 @@ import Util.GraphNode; public class TagState extends GraphNode { private TagDescriptor tag; + private ClassDescriptor cd; private Hashtable flags; public static final int KLIMIT=2; + public HashSet sourceset; public TagState() { this(null); } + public TagState(ClassDescriptor cd) { + this(null); + this.cd=cd; + } + + public void addSource(TaskDescriptor td) { + sourceset.add(td); + } + public TagState(TagDescriptor tag) { this.tag=tag; this.flags=new Hashtable(); + this.sourceset=new HashSet,TaskDescriptor>(); } public TagDescriptor getTag() { diff --git a/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java b/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java index 7e48b82f..2a6b96f8 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java @@ -17,6 +17,11 @@ public class TagWrapper implements Wrapper { private TagWrapper() { } + public TagState getState() { + assert(ts.size()==1); + return ts.iterator().next(); + } + public TagWrapper clone() { TagWrapper tw=new TagWrapper(); tw.initts=initts; diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java b/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java index 27d46c47..b3911b98 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java @@ -91,19 +91,19 @@ public class TaskBinding { FlagTagState fts=tqi.ftsarray[objindex]; ObjWrapper ow=new ObjWrapper(fts.fs); Hashtable > ctable=new Hashtable>(); - ctable.put(tw.ts, new HashSet()); - ctable.get(tw.ts).add(tw); + ctable.put(tw.getState(), new HashSet()); + ctable.get(tw.getState()).add(tw); ow.tags.add(tw); TagExpressionList tel=tqi.tq.task.getTag(tqi.tq.task.getParameter(i)); for(int j=0;j()); - ctable.get(twtmp.ts).add(twtmp); + ctable.put(twtmp.getState(), new HashSet()); + ctable.get(twtmp.getState()).add(twtmp); ow.tags.add(twtmp); int tagcount=ctable.get(twtmp.ts).size(); - int fstagcount=fts.fs.getTagCount(twtmp.ts.getTag()); + int fstagcount=fts.fs.getTagCount(twtmp.getState().getTag()); if (fstagcount>=0&&(tagcount>fstagcount)) { //Too many unique tags of this type bound to object wrapper incrementlevel=i; diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java index 09b8c6d9..78a230f0 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java @@ -13,8 +13,11 @@ public class TaskTagAnalysis { TypeUtil typeutil; FlagInfo flaginfo; HashSet toprocess; + HashSet discovered; Hashtable tasktable; - + Hashtable> tsresults; + Hashtable> fsresults; + /** * Class Constructor @@ -26,7 +29,12 @@ public class TaskTagAnalysis { this.taganalysis=taganalysis; this.flaginfo=new FlagInfo(state); this.toprocess=new HashSet(); + this.discovered=new HashSet(); this.tasktable=new Hashtable(); + this.tsresults=new Hashtable>(); + this.fsresults=new Hashtable>(); + + for(Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator();taskit.hasNext();) { TaskDescriptor td=(TaskDescriptor)taskit.next(); tasktable.put(td, new TaskQueue(td)); @@ -302,7 +310,7 @@ public class TaskTagAnalysis { } } - private void evalNewNode(FlatFlagActionNode fn, Hashtable table) { + private void evalNewNode(FlatFlagActionNode fn, Hashtable table, TaskDescriptor td) { TempDescriptor fntemp=null; { /* Compute type */ @@ -345,12 +353,24 @@ public class TaskTagAnalysis { else throw new Error("Can't clear tag in newly allocated object"); } + for(Iterator fsit=ow.fs.iterator();fsit.hasNext();) { + FlagState fs2=fsit.ext(); + fs2.addAllocatingTask(td); + TagState ts2=new TagState(fs2.getClassDesc()); + ts2.addFS(fs2); + ts2=canonical(ts2); + ts2.addSource(td); + if (!discovered.contains(ts2)) { + discovered.add(ts2); + toprocess.add(ts2); + } + } } - private void processFlatTag(FlatTagDeclaration fn, Hashtable table) { + private void processFlatTag(FlatTagDeclaration fn, Hashtable table, TaskDescriptor td) { TempDescriptor tmp=fn.getDst(); if (table.containsKey(tmp)) { - recordtagchange((TagWrapper)table.get(tmp)); + recordtagchange((TagWrapper)table.get(tmp), td); } TagDescriptor tag=fn.getType(); TagState ts=canonical(new TagState(tag)); @@ -359,14 +379,30 @@ public class TaskTagAnalysis { table.put(tmp, tw); } - public void recordtagchange(TagWrapper tw) { + private void addresult(TagDescriptor td, TagState ts) { + if (!tsresults.containsKey(td)) + tsresults.put(td, new HashSet()); + tsresults.get(td).add(ts); } - + + public void recordtagchange(TagWrapper tw, TaskDescriptor td) { + assert(tw.initts==null); + for(Iterator tsit=tw.ts.iterator(); tsit.hasNext();) { + TagState ts=tsit.next(); + ts.addSource(td); + addresult(ts.getTag(), ts); + if (!discovered.contains(ts)) { + discovered.add(ts); + toprocess.add(ts); + } + } + } + private void processFlatCall(FlatCall fc, Hashtable table) { //Do nothing for now } - - private void processFlatReturnNode(FlatReturnNode fr, Hashtable table) { + + private void processFlatReturnNode(FlatReturnNode fr, Hashtable table, TaskDescriptor td) { } @@ -428,13 +464,13 @@ public class TaskTagAnalysis { processFlatFlag((FlatFlagActionNode)fn, table); break; case FKind.FlatTagDeclaration: - processFlatTag((FlatTagDeclaration)fn, table); + processFlatTag((FlatTagDeclaration)fn, table, td); break; case FKind.FlatCall: processFlatCall((FlatCall)fn, table); break; case FKind.FlatReturnNode: - processFlatReturnNode((FlatReturnNode)fn, table); + processFlatReturnNode((FlatReturnNode)fn, table, td); break; default: } -- 2.34.1