Handling of certain loop types in a finally block

master
Stiver 10 years ago
parent b668038ed9
commit b3a1c41244
  1. 7
      src/de/fernflower/main/ClassesProcessor.java
  2. 4
      src/de/fernflower/main/decompiler/helper/PrintStreamLogger.java
  3. 16
      src/de/fernflower/modules/decompiler/ExprProcessor.java

@ -165,11 +165,12 @@ public class ClassesProcessor {
HashSet<String> setNestedClasses = mapNestedClassReferences.get(superClass); HashSet<String> setNestedClasses = mapNestedClassReferences.get(superClass);
if(setNestedClasses != null) { if(setNestedClasses != null) {
StructClass scl = supernode.classStruct; StructClass scl = supernode.classStruct;
StructInnerClassesAttribute inner = (StructInnerClassesAttribute)scl.getAttributes().getWithKey("InnerClasses"); StructInnerClassesAttribute inner = (StructInnerClassesAttribute) scl.getAttributes().getWithKey("InnerClasses");
for(int i=0;i<inner.getStringentries().size();i++) { for(int i = 0; i < inner.getStringentries().size(); i++) {
String nestedClass = inner.getStringentries().get(i)[0]; String nestedClass = inner.getStringentries().get(i)[0];
if(!setNestedClasses.contains(nestedClass)) { if (!setNestedClasses.contains(nestedClass)) {
continue; continue;
} }

@ -35,8 +35,8 @@ public class PrintStreamLogger implements IFernflowerLogger {
public void writeMessage(String message, int severity) { public void writeMessage(String message, int severity) {
if(severity >= this.severity) { if (severity >= this.severity) {
stream.println(InterpreterUtil.getIndentString(indent)+names[severity]+": "+message); stream.println(InterpreterUtil.getIndentString(indent) + names[severity] + ": " + message);
} }
} }

@ -129,9 +129,11 @@ public class ExprProcessor implements CodeConstants {
FlattenStatementsHelper flatthelper = new FlattenStatementsHelper(); FlattenStatementsHelper flatthelper = new FlattenStatementsHelper();
DirectGraph dgraph = flatthelper.buildDirectGraph(root); DirectGraph dgraph = flatthelper.buildDirectGraph(root);
// try { // try {
// DotExporter.toDotFile(dgraph, new File("c:\\Temp\\gr12_my.dot")); // DotExporter.toDotFile(dgraph, new File("c:\\Temp\\gr12_my.dot"));
// } catch(Exception ex) {ex.printStackTrace();} // } catch (Exception ex) {
// ex.printStackTrace();
// }
// collect finally entry points // collect finally entry points
Set<String> setFinallyShortRangeEntryPoints = new HashSet<String>(); Set<String> setFinallyShortRangeEntryPoints = new HashSet<String>();
@ -212,6 +214,14 @@ public class ExprProcessor implements CodeConstants {
// not be null at this point // not be null at this point
} }
// handling of entry point loops
int succ_entry_index = ndentrypoints.indexOf(nd.id);
if(succ_entry_index >= 0) { // we are in a loop (e.g. continue in a finally block), drop all entry points in the list beginning with succ_entry_index
for(int elements_to_remove = ndentrypoints.size() - succ_entry_index; elements_to_remove > 0; elements_to_remove--) {
ndentrypoints.removeLast();
}
}
String ndentrykey = buildEntryPointKey(ndentrypoints); String ndentrykey = buildEntryPointKey(ndentrypoints);
if (!mapSucc.containsKey(ndentrykey)) { if (!mapSucc.containsKey(ndentrykey)) {

Loading…
Cancel
Save