+
+ case FKind.FlatCall: {
+ Descriptor mdCaller = fm.getMethod();
+
+ FlatCall fc = (FlatCall) fn;
+ MethodDescriptor mdCallee = fc.getMethod();
+ FlatMethod fmCallee = state.getMethodFlat( mdCallee );
+
+ Set<MethodDescriptor> setPossibleCallees = new HashSet<MethodDescriptor>();
+
+ if (mdCallee.isStatic()) {
+ setPossibleCallees.add(mdCallee);
+ } else {
+ TypeDescriptor typeDesc = fc.getThis().getType();
+ setPossibleCallees.addAll(callGraph.getMethods(mdCallee, typeDesc));
+ }
+
+ Iterator<MethodDescriptor> mdItr = setPossibleCallees.iterator();
+ while( mdItr.hasNext() ) {
+ MethodDescriptor mdPossible = mdItr.next();
+ FlatMethod fmPossible = state.getMethodFlat( mdPossible );
+ }
+
+ boolean hasSESECallee=false;
+ for (Iterator iterator = setPossibleCallees.iterator(); iterator.hasNext();) {
+ MethodDescriptor md = (MethodDescriptor) iterator.next();
+ FlatMethod flatMethod = state.getMethodFlat(md);
+ FlatNode flatNode = flatMethod.getNext(0);
+ assert flatNode instanceof FlatSESEEnterNode;
+ FlatSESEEnterNode flatSESE = (FlatSESEEnterNode) flatNode;
+ hasSESECallee |= (!flatSESE.getIsLeafSESE());
+ }
+
+ Stack<FlatSESEEnterNode> seseStack = rra.getRBlockStacks(fm, fn);
+ if (!seseStack.isEmpty()) {
+ FlatSESEEnterNode currentParent = seseStack.peek();
+ if(!status.containsKey(currentParent)){
+// System.out.println("currentParent="+currentParent+" fm="+currentParent.getfmEnclosing()+" hasSESECallee="+hasSESECallee);
+ status.put(currentParent, new Boolean(hasSESECallee));
+ }else{
+ boolean currentParentStatus=status.get(currentParent).booleanValue();
+// System.out.println("currentParent="+currentParent+" fm="+currentParent.getfmEnclosing()+" hasSESECallee="+hasSESECallee+" currentParentStatus="+currentParentStatus);
+ status.put(currentParent, new Boolean(hasSESECallee|currentParentStatus));
+ }
+ }
+
+ } break;