- if( writeDebugDOTs ) {
- writeGraph( debugGraphPrefix+"caller35BeforeAssignReturnValue",
- resolveMethodDebugDOTwriteLabels,
- resolveMethodDebugDOTselectTemps,
- resolveMethodDebugDOTpruneGarbage,
- resolveMethodDebugDOThideSubsetReach,
- resolveMethodDebugDOThideEdgeTaints );
- }
-
-
-
- // TODO: WAIT! THIS SHOULD BE MERGED INTO OTHER PARTS, BECAUSE
- // AS IT IS WE'RE NOT VERIFYING PREDICATES OF RETURN VALUE
- // EDGES, JUST BRINGING THEM ALL! It'll work for now, over approximation
-
- // 3.d) handle return value assignment if needed
- TempDescriptor returnTemp = fc.getReturnTemp();
- if( returnTemp != null &&
- DisjointAnalysis.shouldAnalysisTrack( returnTemp.getType() )
- ) {
-
- VariableNode vnLhsCaller = getVariableNodeFromTemp( returnTemp );
- clearRefEdgesFrom( vnLhsCaller, null, null, true );
-
- VariableNode vnReturnCallee = rgCallee.getVariableNodeFromTemp( tdReturn );
- Iterator<RefEdge> reCalleeItr = vnReturnCallee.iteratorToReferencees();
- while( reCalleeItr.hasNext() ) {
- RefEdge reCallee = reCalleeItr.next();
- HeapRegionNode hrnDstCallee = reCallee.getDst();
-
- // some edge types are not possible return values when we can
- // see what type variable we are assigning it to
- if( !isSuperiorType( returnTemp.getType(), reCallee.getType() ) ) {
- System.out.println( "*** NOT EXPECTING TO SEE THIS: Throwing out "+
- reCallee+
- " for return temp "+returnTemp+
- " of type "+returnTemp.getType()
- );
- // prune
- continue;
- }
-
- AllocSite asDst = hrnDstCallee.getAllocSite();
- allocSites.add( asDst );
-
- Integer hrnIDDstShadow = asDst.getShadowIDfromID( hrnDstCallee.getID() );
-
- HeapRegionNode hrnDstCaller = id2hrn.get( hrnIDDstShadow );
- if( hrnDstCaller == null ) {
- hrnDstCaller =
- createNewHeapRegionNode( hrnIDDstShadow, // id or null to generate a new one
- hrnDstCallee.isSingleObject(), // single object?
- hrnDstCallee.isNewSummary(), // summary?
- false, // out-of-context?
- hrnDstCallee.getType(), // type
- hrnDstCallee.getAllocSite(), // allocation site
- toCallerContext( hrnDstCallee.getInherent(),
- calleeStatesSatisfied ), // inherent reach
- toCallerContext( hrnDstCallee.getAlpha(),
- calleeStatesSatisfied ), // current reach
- predsTrue, // predicates
- hrnDstCallee.getDescription() // description
- );
- }
-
- TypeDescriptor tdNewEdge =
- mostSpecificType( reCallee.getType(),
- hrnDstCallee.getType(),
- hrnDstCaller.getType()
- );
-
- RefEdge reCaller = new RefEdge( vnLhsCaller,
- hrnDstCaller,
- tdNewEdge,
- null,
- toCallerContext( reCallee.getBeta(),
- calleeStatesSatisfied ),
- predsTrue
- );
-
- addRefEdge( vnLhsCaller, hrnDstCaller, reCaller );
- }
- }
-
-