2 import java.util.HashSet;
3 import java.util.Hashtable;
5 import java.util.Vector;
7 import Analysis.MLP.SESEEffectsKey;
8 import Analysis.MLP.SESEEffectsSet;
9 import Analysis.MLP.SESEandAgePair;
10 import Analysis.MLP.VariableSourceToken;
11 import IR.ClassDescriptor;
12 import IR.FieldDescriptor;
13 import IR.MethodDescriptor;
14 import IR.TypeDescriptor;
15 import IR.Tree.SESENode;
17 public class FlatSESEEnterNode extends FlatNode {
19 // SESE class identifiers should be numbered
20 // sequentially from 0 to 1-(total # SESE's)
21 private static int identifier=0;
24 protected FlatSESEExitNode exit;
25 protected SESENode treeNode;
26 protected FlatSESEEnterNode parent;
27 protected Integer oldestAgeToTrack;
28 protected boolean isCallerSESEplaceholder;
30 protected Set<FlatSESEEnterNode> children;
32 protected Set<TempDescriptor> inVars;
33 protected Set<TempDescriptor> outVars;
35 protected Set<SESEandAgePair> needStaticNameInCode;
37 protected Set<SESEandAgePair> staticInVarSrcs;
39 protected Set<TempDescriptor> readyInVars;
40 protected Set<TempDescriptor> staticInVars;
41 protected Set<TempDescriptor> dynamicInVars;
43 protected Set<TempDescriptor> dynamicVars;
45 protected Hashtable<TempDescriptor, VariableSourceToken> staticInVar2src;
47 private SESEEffectsSet seseEffectsSet;
50 // scope info for this SESE
51 protected FlatMethod fmEnclosing;
52 protected MethodDescriptor mdEnclosing;
53 protected ClassDescriptor cdEnclosing;
55 // structures that allow SESE to appear as
56 // a normal method to code generation
57 protected FlatMethod fmBogus;
58 protected MethodDescriptor mdBogus;
61 public FlatSESEEnterNode( SESENode sn ) {
62 this.id = identifier++;
65 oldestAgeToTrack = new Integer( 0 );
67 children = new HashSet<FlatSESEEnterNode>();
68 inVars = new HashSet<TempDescriptor>();
69 outVars = new HashSet<TempDescriptor>();
70 needStaticNameInCode = new HashSet<SESEandAgePair>();
71 staticInVarSrcs = new HashSet<SESEandAgePair>();
72 readyInVars = new HashSet<TempDescriptor>();
73 staticInVars = new HashSet<TempDescriptor>();
74 dynamicInVars = new HashSet<TempDescriptor>();
75 dynamicVars = new HashSet<TempDescriptor>();
77 staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
79 seseEffectsSet = new SESEEffectsSet();
85 isCallerSESEplaceholder = false;
88 public void rewriteUse() {
91 public void rewriteDef() {
94 public void setFlatExit( FlatSESEExitNode fsexn ) {
98 public FlatSESEExitNode getFlatExit() {
103 return FKind.FlatSESEEnterNode;
106 public SESENode getTreeNode() {
110 public int getIdentifier() {
114 public String getPrettyIdentifier() {
115 if( treeNode.getID() != null ) {
116 return treeNode.getID();
121 public String toString() {
122 return "sese "+getPrettyIdentifier()+" enter";
125 public void setParent( FlatSESEEnterNode parent ) {
126 this.parent = parent;
129 public FlatSESEEnterNode getParent() {
133 public void addChild( FlatSESEEnterNode child ) {
134 children.add( child );
137 public Set<FlatSESEEnterNode> getChildren() {
141 public void addInVar( TempDescriptor td ) {
145 public void addOutVar( TempDescriptor td ) {
149 public void addInVarSet( Set<TempDescriptor> s ) {
153 public void addOutVarSet( Set<TempDescriptor> s ) {
157 public Set<TempDescriptor> getInVarSet() {
161 Vector<TempDescriptor> vecinVars;
163 HashSet<TempDescriptor> paramset=new HashSet<TempDescriptor>();
164 paramset.addAll(inVars);
165 paramset.addAll(outVars);
166 vecinVars=new Vector<TempDescriptor>();
167 vecinVars.addAll(paramset);
170 public TempDescriptor getParameter(int i) {
171 if (vecinVars==null) {
174 return vecinVars.get(i);
177 public int numParameters() {
178 if (vecinVars==null) {
181 return vecinVars.size();
184 public Set<FlatNode> getNodeSet() {
185 HashSet<FlatNode> tovisit=new HashSet<FlatNode>();
186 HashSet<FlatNode> visited=new HashSet<FlatNode>();
188 while(!tovisit.isEmpty()) {
189 FlatNode fn=tovisit.iterator().next();
194 for(int i=0; i<fn.numNext(); i++) {
195 FlatNode nn=fn.getNext(i);
196 if (!visited.contains(nn))
204 public Set<TempDescriptor> getOutVarSet() {
208 public void addNeededStaticName( SESEandAgePair p ) {
209 needStaticNameInCode.add( p );
212 public Set<SESEandAgePair> getNeededStaticNames() {
213 return needStaticNameInCode;
216 public void addStaticInVarSrc( SESEandAgePair p ) {
217 staticInVarSrcs.add( p );
220 public Set<SESEandAgePair> getStaticInVarSrcs() {
221 return staticInVarSrcs;
224 public void addReadyInVar( TempDescriptor td ) {
225 readyInVars.add( td );
228 public Set<TempDescriptor> getReadyInVarSet() {
232 public void addStaticInVar( TempDescriptor td ) {
233 staticInVars.add( td );
236 public Set<TempDescriptor> getStaticInVarSet() {
240 public void putStaticInVar2src( TempDescriptor staticInVar,
241 VariableSourceToken vst ) {
242 staticInVar2src.put( staticInVar, vst );
245 public VariableSourceToken getStaticInVarSrc( TempDescriptor staticInVar ) {
246 return staticInVar2src.get( staticInVar );
249 public void addDynamicInVar( TempDescriptor td ) {
250 dynamicInVars.add( td );
253 public Set<TempDescriptor> getDynamicInVarSet() {
254 return dynamicInVars;
257 public void addDynamicVar( TempDescriptor td ) {
258 dynamicVars.add( td );
261 public Set<TempDescriptor> getDynamicVarSet() {
265 public void mustTrackAtLeastAge( Integer age ) {
266 if( age > oldestAgeToTrack ) {
267 oldestAgeToTrack = new Integer( age );
271 public Integer getOldestAgeToTrack() {
272 return oldestAgeToTrack;
275 public void setfmEnclosing( FlatMethod fm ) { fmEnclosing = fm; }
276 public FlatMethod getfmEnclosing() { return fmEnclosing; }
278 public void setmdEnclosing( MethodDescriptor md ) { mdEnclosing = md; }
279 public MethodDescriptor getmdEnclosing() { return mdEnclosing; }
281 public void setcdEnclosing( ClassDescriptor cd ) { cdEnclosing = cd; }
282 public ClassDescriptor getcdEnclosing() { return cdEnclosing; }
284 public void setfmBogus( FlatMethod fm ) { fmBogus = fm; }
285 public FlatMethod getfmBogus() { return fmBogus; }
287 public void setmdBogus( MethodDescriptor md ) { mdBogus = md; }
288 public MethodDescriptor getmdBogus() { return mdBogus; }
290 public String getSESEmethodName() {
291 assert cdEnclosing != null;
292 assert mdBogus != null;
295 cdEnclosing.getSafeSymbol()+
296 mdBogus.getSafeSymbol()+
298 mdBogus.getSafeMethodDescriptor();
301 public String getSESErecordName() {
302 assert cdEnclosing != null;
303 assert mdBogus != null;
307 cdEnclosing.getSafeSymbol()+
308 mdBogus.getSafeSymbol()+
310 mdBogus.getSafeMethodDescriptor()+
314 public void setCallerSESEplaceholder() {
315 isCallerSESEplaceholder = true;
318 public boolean getIsCallerSESEplaceholder() {
319 return isCallerSESEplaceholder;
323 public boolean equals( Object o ) {
328 if( !(o instanceof FlatSESEEnterNode) ) {
332 FlatSESEEnterNode fsen = (FlatSESEEnterNode) o;
333 return id == fsen.id;
336 public int hashCode() {
340 public void writeEffects(TempDescriptor td, String fd, TypeDescriptor type, Integer hrnId, boolean strongUpdate){
341 seseEffectsSet.addWritingVar(td, new SESEEffectsKey(fd, type, hrnId));
343 seseEffectsSet.addStrongUpdateVar(td, new SESEEffectsKey(fd, type, hrnId));
347 public void readEffects(TempDescriptor td, String fd, TypeDescriptor type, Integer hrnId ){
348 seseEffectsSet.addReadingVar(td, new SESEEffectsKey(fd, type, hrnId));
351 public SESEEffectsSet getSeseEffectsSet(){
352 return seseEffectsSet;