diff --git a/jode/jode/decompiler/CodeAnalyzer.java b/jode/jode/decompiler/CodeAnalyzer.java index 928ed92..37badf7 100644 --- a/jode/jode/decompiler/CodeAnalyzer.java +++ b/jode/jode/decompiler/CodeAnalyzer.java @@ -21,15 +21,26 @@ package jode.decompiler; import jode.Decompiler; import jode.GlobalOptions; import jode.type.Type; +import jode.util.SimpleDictionary; import jode.bytecode.*; +import jode.expr.Expression; +import jode.expr.ConstOperator; +import jode.expr.CheckNullOperator; +import jode.expr.ThisOperator; +import jode.expr.LocalLoadOperator; +import jode.expr.OuterLocalOperator; +import jode.expr.ConstructorOperator; +import jode.flow.StructuredBlock; import jode.flow.FlowBlock; import jode.flow.TransformExceptionHandlers; +import jode.flow.Jump; import jode.jvm.CodeVerifier; import jode.jvm.VerifyException; import java.util.BitSet; import java.util.Stack; import java.util.Vector; +import java.util.Dictionary; import java.util.Enumeration; import java.io.DataInputStream; import java.io.ByteArrayInputStream; @@ -41,9 +52,17 @@ public class CodeAnalyzer implements Analyzer, Scope { BytecodeInfo code; MethodAnalyzer method; ImportHandler imports; - + boolean analyzedAnonymous = false; + StructuredBlock insertBlock = null; + Vector allLocals = new Vector(); - Vector anonClasses = new Vector(); + /** + * This dictionary maps an anonymous ClassInfo to the + * ConstructorOperator that creates this class. + */ + Dictionary anonClasses = new SimpleDictionary(); + Vector anonAnalyzers = new Vector(); + LocalInfo[] param; LocalVariableTable lvt; @@ -96,6 +115,12 @@ public class CodeAnalyzer implements Analyzer, Scope { return methodHeader; } + public void insertStructuredBlock(StructuredBlock superBlock) { + if (insertBlock != null) + throw new jode.AssertError(); + insertBlock = superBlock; + } + void readCode() { /* The adjacent analyzation relies on this */ DeadCodeAnalysis.removeDeadCode(code); @@ -171,6 +196,14 @@ public class CodeAnalyzer implements Analyzer, Scope { } methodHeader = (FlowBlock) code.getFirstInstr().tmpInfo; + if (insertBlock != null) { + insertBlock.setJump(new Jump(methodHeader)); + FlowBlock insertFlowBlock = new FlowBlock(this, 0, 0); + insertFlowBlock.setBlock(insertBlock); + insertFlowBlock.setNextByAddr(methodHeader); + methodHeader = insertFlowBlock; + } + excHandlers = new TransformExceptionHandlers(); for (int i=0; i