diff --git a/jode/jode/bytecode/BytecodeInfo.java b/jode/jode/bytecode/BytecodeInfo.java index 4a1917c..556b1e8 100644 --- a/jode/jode/bytecode/BytecodeInfo.java +++ b/jode/jode/bytecode/BytecodeInfo.java @@ -18,7 +18,7 @@ */ package jode.bytecode; -import jode.Decompiler/*XXX*/; +import jode.GlobalOptions/*XXX*/; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.ByteArrayInputStream; @@ -65,12 +65,12 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { DataInputStream input, int howMuch) throws IOException { if (name.equals("LocalVariableTable")) { - if (Decompiler.showLVT) - Decompiler.err.println("LocalVariableTable of "+methodInfo.clazzInfo.getName() + "." + methodInfo.getName()); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_LVT) != 0) + GlobalOptions.err.println("LocalVariableTable of "+methodInfo.clazzInfo.getName() + "." + methodInfo.getName()); int count = input.readUnsignedShort(); if (length != 2 + count * 10) { - if (Decompiler.showLVT) - Decompiler.err.println("Illegal LVT length, ignoring it"); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_LVT) != 0) + GlobalOptions.err.println("Illegal LVT length, ignoring it"); return; } lvt = new LocalVariableInfo[count]; @@ -104,8 +104,8 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { // This is probably an evil lvt as created by HashJava // simply ignore it. - if (Decompiler.showLVT) - Decompiler.err.println("Illegal entry, ignoring LVT"); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_LVT) != 0) + GlobalOptions.err.println("Illegal entry, ignoring LVT"); lvt = null; return; } @@ -114,8 +114,8 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { lvt[i].name = cp.getUTF8(nameIndex); lvt[i].type = cp.getUTF8(typeIndex); lvt[i].slot = slot; - if (Decompiler.showLVT) - Decompiler.err.println("\t" + lvt[i].name + ": " + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_LVT) != 0) + GlobalOptions.err.println("\t" + lvt[i].name + ": " + lvt[i].type +" range "+start+" - "+end +" slot "+slot); @@ -123,7 +123,7 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { } else if (name.equals("LineNumberTable")) { int count = input.readUnsignedShort(); if (length != 2 + count * 4) { - Decompiler.err.println + GlobalOptions.err.println ("Illegal LineNumberTable, ignoring it"); return; } @@ -139,7 +139,7 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { } if (startInstr == null || startInstr.addr != start) { - Decompiler.err.println + GlobalOptions.err.println ("Illegal entry, ignoring LineNumberTable table"); lnt = null; return; @@ -174,8 +174,11 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { lastInstr = instr; int opcode = input.readUnsignedByte(); - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(addr+": "+opcodeString[opcode]); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(addr+": "+opcodeString[opcode]); instr.opcode = opcode; switch (opcode) { @@ -190,8 +193,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { throw new ClassFormatError ("Invalid local slot "+instr.localSlot); instr.length = 4; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+opcodeString[wideopcode] + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+opcodeString[wideopcode] +" "+instr.localSlot); break; case opc_lload: case opc_dload: @@ -201,8 +205,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { throw new ClassFormatError ("Invalid local slot "+instr.localSlot); instr.length = 4; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+opcodeString[wideopcode] + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+opcodeString[wideopcode] +" "+instr.localSlot); break; case opc_ret: @@ -212,8 +217,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { ("Invalid local slot "+instr.localSlot); instr.length = 4; instr.alwaysJumps = true; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" ret "+instr.localSlot); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" ret "+instr.localSlot); break; case opc_iinc: @@ -223,8 +229,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { ("Invalid local slot "+instr.localSlot); instr.intData = input.readShort(); instr.length = 6; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" iinc "+instr.localSlot + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" iinc "+instr.localSlot +" "+instr.intData); break; default: @@ -281,8 +288,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { throw new ClassFormatError ("Invalid local slot "+instr.localSlot); instr.length = 2; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.localSlot); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.localSlot); break; case opc_lstore: case opc_dstore: case opc_lload: case opc_dload: @@ -291,8 +299,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { throw new ClassFormatError ("Invalid local slot "+instr.localSlot); instr.length = 2; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.localSlot); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.localSlot); break; case opc_ret: @@ -302,8 +311,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { ("Invalid local slot "+instr.localSlot); instr.alwaysJumps = true; instr.length = 2; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.localSlot); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.localSlot); break; case opc_aconst_null: @@ -371,8 +381,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { ("Invalid local slot "+instr.localSlot); instr.intData = input.readByte(); instr.length = 3; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.localSlot + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.localSlot +" "+instr.intData); break; @@ -392,8 +403,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { succAddrs[addr][0] = addr+input.readShort(); predcounts[succAddrs[addr][0]]++; instr.length = 3; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+succAddrs[addr][0]); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+succAddrs[addr][0]); break; case opc_goto_w: @@ -404,8 +416,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { succAddrs[addr][0] = addr+input.readInt(); predcounts[succAddrs[addr][0]]++; instr.length = 5; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+succAddrs[addr][0]); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+succAddrs[addr][0]); break; case opc_tableswitch: { @@ -478,8 +491,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { || opcode != opc_invokespecial)) throw new ClassFormatException ("Illegal call of special method/field "+ref); - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+ref); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+ref); instr.objData = ref; instr.length = 3; break; @@ -494,8 +508,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { if (ref.getName().charAt(0) == '<') throw new ClassFormatException ("Illegal call of special method "+ref); - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+ref); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+ref); instr.objData = ref; instr.intData = input.readUnsignedByte(); if (input.readUnsignedByte() != 0) @@ -514,8 +529,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { throw new ClassFormatException ("Can't create array with opc_new"); instr.objData = type; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.objData); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.objData); instr.length = 3; break; } @@ -527,8 +543,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { throw new ClassFormatException ("multianewarray called for non array:" + instr.getDescription()); - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.objData + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.objData +" "+instr.intData); instr.length = 4; break; @@ -536,8 +553,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { String type = cp.getClassType(input.readUnsignedShort()); instr.opcode = opc_multianewarray; instr.objData = "["+type; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.objData); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.objData); instr.intData = 1; instr.length = 3; break; @@ -547,8 +565,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { (input.readUnsignedByte()-4); instr.opcode = opc_multianewarray; instr.objData = new String (new char[] { '[', sig }); - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.print(" "+instr.objData); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.print(" "+instr.objData); instr.intData = 1; instr.length = 2; break; @@ -562,8 +581,9 @@ public class BytecodeInfo extends BinaryInfo implements Opcodes { instr.length = 1; } addr += lastInstr.length; - if (Decompiler.isDebugging)/*XXX*/ - Decompiler.err.println(); + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_BYTECODE) != 0) + GlobalOptions.err.println(); } } firstInstr = instrs[0]; diff --git a/jode/jode/bytecode/SearchPath.java b/jode/jode/bytecode/SearchPath.java index f311997..ed0e0c5 100644 --- a/jode/jode/bytecode/SearchPath.java +++ b/jode/jode/bytecode/SearchPath.java @@ -22,7 +22,7 @@ import java.io.*; import java.net.*; import java.util.zip.*; import java.util.*; -import jode.Decompiler; +import jode.GlobalOptions; /** * This class represents a path of multiple directories and/or zip files, @@ -112,7 +112,7 @@ public class SearchPath { urlzips[nr] = newarr; } } catch (IOException ex) { - Decompiler.err.println("IOException while reading " + GlobalOptions.err.println("IOException while reading " +"remote zip file "+bases[nr]); // disable entry bases[nr] = null; @@ -135,7 +135,7 @@ public class SearchPath { } zis.close(); } catch (IOException ex) { - Decompiler.err.println("Remote zip file "+bases[nr] + GlobalOptions.err.println("Remote zip file "+bases[nr] +" is corrupted."); // disable entry bases[nr] = null; @@ -181,7 +181,7 @@ public class SearchPath { } catch (IOException ex) { // ignore } catch (SecurityException ex) { - Decompiler.err.println("Warning: Security exception " + GlobalOptions.err.println("Warning: Security exception " +"while accessing " +bases[i]+"."); } @@ -203,7 +203,7 @@ public class SearchPath { } } catch (SecurityException ex) { /* disable this entry */ - Decompiler.err.println("Warning: SecurityException while" + GlobalOptions.err.println("Warning: SecurityException while" + " accessing " + token); dirs[i] = null; } @@ -311,10 +311,10 @@ public class SearchPath { conn.setAllowUserInteraction(true); return conn.getInputStream(); } catch (SecurityException ex) { - Decompiler.err.println("Warning: SecurityException" + GlobalOptions.err.println("Warning: SecurityException" +" while accessing " +bases[i]+filename); - ex.printStackTrace(Decompiler.err); + ex.printStackTrace(GlobalOptions.err); /* ignore and take next element */ } catch (FileNotFoundException ex) { /* ignore and take next element */ @@ -336,7 +336,7 @@ public class SearchPath { if (f.exists()) return new FileInputStream(f); } catch (SecurityException ex) { - Decompiler.err.println("Warning: SecurityException" + GlobalOptions.err.println("Warning: SecurityException" +" while accessing " +dirs[i]+filename); /* ignore and take next element */ @@ -372,7 +372,7 @@ public class SearchPath { if (f.exists()) return f.isDirectory(); } catch (SecurityException ex) { - Decompiler.err.println("Warning: SecurityException" + GlobalOptions.err.println("Warning: SecurityException" +" while accessing " +dirs[i]+filename); } @@ -439,7 +439,7 @@ public class SearchPath { files = f.list(); } } catch (SecurityException ex) { - Decompiler.err.println("Warning: SecurityException" + GlobalOptions.err.println("Warning: SecurityException" +" while accessing " +dirs[pathNr]+localDirName); /* ignore and take next element */ diff --git a/jode/jode/decompiler/CodeAnalyzer.java b/jode/jode/decompiler/CodeAnalyzer.java index 51070d6..d5e1662 100644 --- a/jode/jode/decompiler/CodeAnalyzer.java +++ b/jode/jode/decompiler/CodeAnalyzer.java @@ -19,6 +19,7 @@ package jode.decompiler; import jode.Decompiler; +import jode.GlobalOptions; import jode.type.Type; import jode.bytecode.*; import jode.flow.FlowBlock; @@ -135,8 +136,8 @@ public class CodeAnalyzer implements Analyzer { jode.flow.StructuredBlock block = Opcodes.readOpcode(instr, this); - if (jode.Decompiler.isVerbose && instr.addr > mark) { - Decompiler.err.print('.'); + if (GlobalOptions.verboseLevel > 0 && instr.addr > mark) { + GlobalOptions.err.print('.'); mark += 1000; } @@ -184,8 +185,8 @@ public class CodeAnalyzer implements Analyzer { instr != null; instr = instr.nextByAddr) instr.tmpInfo = null; - if (Decompiler.isVerbose) - Decompiler.err.print('-'); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print('-'); // try { // TabbedPrintWriter writer = new TabbedPrintWriter(System.err); diff --git a/jode/jode/decompiler/LocalInfo.java b/jode/jode/decompiler/LocalInfo.java index 64e1cde..3487a13 100644 --- a/jode/jode/decompiler/LocalInfo.java +++ b/jode/jode/decompiler/LocalInfo.java @@ -20,7 +20,7 @@ package jode.decompiler; import java.util.Enumeration; import java.util.Vector; -import jode.Decompiler; +import jode.GlobalOptions; import jode.type.Type; import jode.expr.LocalVarOperator; @@ -93,7 +93,7 @@ public class LocalInfo { } else { if (this != li) { shadow = li; -// Decompiler.err.println("combining "+name+"("+type+") and " +// GlobalOptions.err.println("combining "+name+"("+type+") and " // +li.name+"("+li.type+")"); li.setType(type); @@ -105,8 +105,8 @@ public class LocalInfo { LocalVarOperator lvo = (LocalVarOperator) enum.nextElement(); if (needTypeUpdate) { - if (Decompiler.isTypeDebugging) - Decompiler.err.println("updating " + lvo); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) + GlobalOptions.err.println("updating " + lvo); lvo.updateType(); } shadow.operators.addElement(lvo); @@ -231,12 +231,12 @@ public class LocalInfo { Type newType = li.type.intersection(otherType); if (newType == Type.tError && otherType != Type.tError && li.type != Type.tError) { - Decompiler.err.println("Type error in local " + getName()+": " + GlobalOptions.err.println("Type error in local " + getName()+": " + li.type + " and " + otherType); Thread.dumpStack(); } - else if (Decompiler.isTypeDebugging) - Decompiler.err.println(getName()+" setType, new: "+newType + else if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) + GlobalOptions.err.println(getName()+" setType, new: "+newType + " old: "+li.type); if (!li.type.equals(newType)) { @@ -244,8 +244,8 @@ public class LocalInfo { java.util.Enumeration enum = li.operators.elements(); while (enum.hasMoreElements()) { LocalVarOperator lvo = (LocalVarOperator) enum.nextElement(); - if (Decompiler.isTypeDebugging) - Decompiler.err.println("updating "+lvo); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) + GlobalOptions.err.println("updating "+lvo); lvo.updateType(); } } diff --git a/jode/jode/decompiler/LocalVariableRangeList.java b/jode/jode/decompiler/LocalVariableRangeList.java index d7cd0dd..d0dd234 100644 --- a/jode/jode/decompiler/LocalVariableRangeList.java +++ b/jode/jode/decompiler/LocalVariableRangeList.java @@ -18,7 +18,7 @@ */ package jode.decompiler; -import jode.Decompiler; +import jode.GlobalOptions; import jode.type.Type; public class LocalVariableRangeList { @@ -48,7 +48,7 @@ public class LocalVariableRangeList { next.endAddr = Math.max(next.endAddr, li.endAddr); return; } - Decompiler.err.println("warning: non disjoint locals"); + GlobalOptions.err.println("warning: non disjoint locals"); } li.next = next; if (prev == null) diff --git a/jode/jode/decompiler/MethodAnalyzer.java b/jode/jode/decompiler/MethodAnalyzer.java index 20339a8..c7b2b06 100644 --- a/jode/jode/decompiler/MethodAnalyzer.java +++ b/jode/jode/decompiler/MethodAnalyzer.java @@ -22,6 +22,7 @@ import jode.bytecode.MethodInfo; import jode.type.*; import jode.AssertError; import jode.Decompiler; +import jode.GlobalOptions; import java.lang.reflect.Modifier; import java.io.*; @@ -135,11 +136,11 @@ public class MethodAnalyzer implements Analyzer { imports.useType(methodType.getReturnType()); if (!Decompiler.immediateOutput) { - if (Decompiler.isVerbose) - Decompiler.err.print(methodName+": "); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print(methodName+": "); code.analyze(); - if (Decompiler.isVerbose) - Decompiler.err.println(""); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println(""); } } @@ -169,11 +170,11 @@ public class MethodAnalyzer implements Analyzer { // We do the code.analyze() here, to get // immediate output. - if (Decompiler.isVerbose) - Decompiler.err.print(methodName+": "); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print(methodName+": "); code.analyze(); - if (Decompiler.isVerbose) - Decompiler.err.println(""); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println(""); } if (isConstructor() && isStatic() diff --git a/jode/jode/expr/Expression.java b/jode/jode/expr/Expression.java index 9db86f0..5fb7464 100644 --- a/jode/jode/expr/Expression.java +++ b/jode/jode/expr/Expression.java @@ -19,7 +19,7 @@ package jode.expr; import jode.type.Type; -import jode.Decompiler; +import jode.GlobalOptions; import jode.decompiler.TabbedPrintWriter; public abstract class Expression { @@ -43,7 +43,7 @@ public abstract class Expression { Type newType = type.intersection(otherType); if (newType == Type.tError && type != Type.tError && otherType != Type.tError) - Decompiler.err.println("Type error in "+this+": " + GlobalOptions.err.println("Type error in "+this+": " +"merging "+type+" and "+otherType); type = newType; } @@ -86,7 +86,7 @@ public abstract class Expression { * conflict was found. You may wish to check for >0. */ public int canCombine(Expression e) { -// jode.Decompiler.err.println("Try to combine "+e+" into "+this); +// jode.GlobalOptions.err.println("Try to combine "+e+" into "+this); return containsMatchingLoad(e)? 1 : 0; } @@ -173,7 +173,7 @@ public abstract class Expression { public void dumpExpression(TabbedPrintWriter writer, int minPriority) throws java.io.IOException { boolean needParen1 = false, needParen2 = false; - if (Decompiler.isTypeDebugging) { + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) { if (minPriority > 700) { needParen1 = true; writer.print("("); diff --git a/jode/jode/expr/InvokeOperator.java b/jode/jode/expr/InvokeOperator.java index c20d535..12c46af 100644 --- a/jode/jode/expr/InvokeOperator.java +++ b/jode/jode/expr/InvokeOperator.java @@ -21,7 +21,7 @@ package jode.expr; import jode.decompiler.CodeAnalyzer; import jode.decompiler.ClassAnalyzer; import jode.decompiler.TabbedPrintWriter; -import jode.Decompiler; +import jode.GlobalOptions; import jode.bytecode.*; import jode.jvm.*; import jode.type.*; @@ -259,14 +259,14 @@ public final class InvokeOperator extends Operator try { result = (String) Interpreter.interpretMethod(env, info, locals); } catch (InterpreterException ex) { - Decompiler.err.println("Warning: Can't interpret method " + GlobalOptions.err.println("Warning: Can't interpret method " +methodName); - ex.printStackTrace(Decompiler.err); + ex.printStackTrace(GlobalOptions.err); return null; } catch (InvocationTargetException ex) { - Decompiler.err.println("Warning: Interpreted method throws" + GlobalOptions.err.println("Warning: Interpreted method throws" +" an uncaught exception: "); - ex.getTargetException().printStackTrace(Decompiler.err); + ex.getTargetException().printStackTrace(GlobalOptions.err); return null; } return new ConstOperator(result); diff --git a/jode/jode/expr/LocalLoadOperator.java b/jode/jode/expr/LocalLoadOperator.java index 6648a1a..62c595b 100644 --- a/jode/jode/expr/LocalLoadOperator.java +++ b/jode/jode/expr/LocalLoadOperator.java @@ -18,7 +18,7 @@ */ package jode.expr; -import jode.Decompiler; +import jode.GlobalOptions; import jode.type.Type; import jode.decompiler.LocalInfo; import jode.decompiler.TabbedPrintWriter; @@ -51,8 +51,8 @@ public class LocalLoadOperator extends NoArgOperator } public void updateType() { - if (Decompiler.isTypeDebugging) - Decompiler.err.println("local "+local.getName()+" changed: " + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) + GlobalOptions.err.println("local "+local.getName()+" changed: " +type+" to "+local.getType() +" in "+parent); super.setType(local.getType()); @@ -65,12 +65,12 @@ public class LocalLoadOperator extends NoArgOperator } public Type getType() { -// Decompiler.err.println("LocalLoad.getType of "+local.getName()+": "+local.getType()); +// GlobalOptions.err.println("LocalLoad.getType of "+local.getName()+": "+local.getType()); return local.getType(); } public void setType(Type type) { -// Decompiler.err.println("LocalLoad.setType of "+local.getName()+": "+local.getType()); +// GlobalOptions.err.println("LocalLoad.setType of "+local.getName()+": "+local.getType()); super.setType(local.setType(type)); } diff --git a/jode/jode/flow/CompleteSynchronized.java b/jode/jode/flow/CompleteSynchronized.java index a788cfe..b917cc0 100644 --- a/jode/jode/flow/CompleteSynchronized.java +++ b/jode/jode/flow/CompleteSynchronized.java @@ -18,7 +18,7 @@ */ package jode.flow; -import jode.Decompiler; +import jode.GlobalOptions; import jode.expr.*; public class CompleteSynchronized { @@ -49,8 +49,8 @@ public class CompleteSynchronized { return false; } - if (Decompiler.isVerbose) - Decompiler.err.print('s'); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print('s'); synBlock.isEntered = true; synBlock.moveDefinitions(last.outer,last); diff --git a/jode/jode/flow/CreateExpression.java b/jode/jode/flow/CreateExpression.java index 0a55398..50ebc14 100644 --- a/jode/jode/flow/CreateExpression.java +++ b/jode/jode/flow/CreateExpression.java @@ -18,7 +18,7 @@ */ package jode.flow; -import jode.Decompiler; +import jode.GlobalOptions; import jode.expr.*; /** @@ -107,8 +107,9 @@ public class CreateExpression { sequBlock = (SequentialBlock)sequBlock.outer; } - if(Decompiler.isVerbose && lastExpression.getOperandCount() == 0) - Decompiler.err.print('x'); + if (GlobalOptions.verboseLevel > 0 + && lastExpression.getOperandCount() == 0) + GlobalOptions.err.print('x'); ic.setInstruction(lastExpression); ic.moveDefinitions(sequBlock, last); diff --git a/jode/jode/flow/CreateForInitializer.java b/jode/jode/flow/CreateForInitializer.java index 81d78cd..cada48c 100644 --- a/jode/jode/flow/CreateForInitializer.java +++ b/jode/jode/flow/CreateForInitializer.java @@ -18,7 +18,7 @@ */ package jode.flow; -import jode.Decompiler; +import jode.GlobalOptions; import jode.expr.*; public class CreateForInitializer { @@ -46,8 +46,8 @@ public class CreateForInitializer { || !forBlock.conditionMatches(init)) return false; - if (Decompiler.isVerbose) - Decompiler.err.print('f'); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print('f'); forBlock.setInit((InstructionBlock) sequBlock.subBlocks[0]); return true; diff --git a/jode/jode/flow/CreateIfThenElseOperator.java b/jode/jode/flow/CreateIfThenElseOperator.java index 567b15d..caf3145 100644 --- a/jode/jode/flow/CreateIfThenElseOperator.java +++ b/jode/jode/flow/CreateIfThenElseOperator.java @@ -18,7 +18,7 @@ */ package jode.flow; -import jode.Decompiler; +import jode.GlobalOptions; import jode.type.Type; import jode.expr.*; @@ -63,8 +63,8 @@ public class CreateIfThenElseOperator { | !createFunnyHelper(trueDest, falseDest, ifBlock.elseBlock)) return false; - if (Decompiler.isVerbose) - Decompiler.err.print('?'); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print('?'); IfThenElseOperator iteo = new IfThenElseOperator(Type.tBoolean); ((InstructionBlock)ifBlock.thenBlock).setInstruction @@ -218,8 +218,8 @@ public class CreateIfThenElseOperator { return false; e[0] = ifBlock.cond; - if (Decompiler.isVerbose) - Decompiler.err.print('?'); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.print('?'); thenBlock.flowBlock.removeSuccessor(thenBlock.jump); thenBlock.removeJump(); diff --git a/jode/jode/flow/FlowBlock.java b/jode/jode/flow/FlowBlock.java index 03a2349..1ad6bbc 100644 --- a/jode/jode/flow/FlowBlock.java +++ b/jode/jode/flow/FlowBlock.java @@ -19,7 +19,7 @@ package jode.flow; import java.util.*; -import jode.Decompiler; +import jode.GlobalOptions; import jode.AssertError; import jode.decompiler.TabbedPrintWriter; import jode.decompiler.CodeAnalyzer; @@ -654,11 +654,11 @@ public class FlowBlock { this.in.unionExact(successor.in); this.gen.unionExact(successor.gen); - if (Decompiler.debugInOut) { - Decompiler.err.println("UpdateInOut: gens : "+gens); - Decompiler.err.println(" kills: "+kills); - Decompiler.err.println(" s.in : "+successor.in); - Decompiler.err.println(" in : "+in); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_INOUT) != 0) { + GlobalOptions.err.println("UpdateInOut: gens : "+gens); + GlobalOptions.err.println(" kills: "+kills); + GlobalOptions.err.println(" s.in : "+successor.in); + GlobalOptions.err.println(" in : "+in); } } @@ -672,7 +672,7 @@ public class FlowBlock { /* This checks are very time consuming, so don't do them * normally. */ - if (!Decompiler.doChecks) + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_CHECK) == 0) return; try { @@ -752,9 +752,9 @@ public class FlowBlock { */ public void doSequentialT1(StructuredBlock succ, int length) { checkConsistent(); - if (Decompiler.isFlowDebugging) { - Decompiler.err.println("merging sequentialBlock: "+this); - Decompiler.err.println("and: "+succ); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) { + GlobalOptions.err.println("merging sequentialBlock: "+this); + GlobalOptions.err.println("and: "+succ); } VariableSet succIn = new VariableSet(); succ.fillInGenSet(succIn, this.gen); @@ -822,17 +822,17 @@ public class FlowBlock { /* Update the in/out-Vectors now */ updateInOut(succ, jumps); - if (Decompiler.isFlowDebugging) - Decompiler.err.println("before Resolve: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("before Resolve: "+this); /* Try to eliminate as many jumps as possible. */ jumps = resolveSomeJumps(jumps, succ); - if (Decompiler.isFlowDebugging) - Decompiler.err.println("before Remaining: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("before Remaining: "+this); resolveRemaining(jumps); - if (Decompiler.isFlowDebugging) - Decompiler.err.println("after Resolve: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("after Resolve: "+this); /* Now unify the blocks. */ @@ -1130,8 +1130,8 @@ public class FlowBlock { } public void doTransformations() { - if (Decompiler.isFlowDebugging) - Decompiler.err.println("before Transformation: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("before Transformation: "+this); while (lastModified instanceof SequentialBlock) { if (!lastModified.getSubBlocks()[0].doTransformations()) @@ -1140,8 +1140,8 @@ public class FlowBlock { while (lastModified.doTransformations()) /* empty */; - if (Decompiler.isFlowDebugging) - Decompiler.err.println("after Transformation: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("after Transformation: "+this); } /** @@ -1185,8 +1185,8 @@ public class FlowBlock { * @param end the end of the address range. */ public boolean analyze(int start, int end) { - if (Decompiler.debugAnalyze) - Decompiler.err.println("analyze("+start+", "+end+")"); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_ANALYZE) != 0) + GlobalOptions.err.println("analyze("+start+", "+end+")"); checkConsistent(); boolean changed = false; @@ -1202,11 +1202,11 @@ public class FlowBlock { if (doT2(start, end)) { - if (Decompiler.isFlowDebugging) - Decompiler.err.println("after T2: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("after T2: "+this); - if (Decompiler.debugAnalyze) - Decompiler.err.println("T2("+addr+","+getNextAddr() + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_ANALYZE) != 0) + GlobalOptions.err.println("T2("+addr+","+getNextAddr() +") succeeded"); /* T2 transformation succeeded. This may * make another T1 analysis in the previous @@ -1222,8 +1222,8 @@ public class FlowBlock { /* the Block has no successor where t1 is applicable. * Finish this analyzation. */ - if (Decompiler.debugAnalyze) - Decompiler.err.println + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_ANALYZE) != 0) + GlobalOptions.err.println ("No more successors applicable: " + start + " - " + end + "; " + addr + " - " + getNextAddr()); @@ -1236,8 +1236,8 @@ public class FlowBlock { /* T1 transformation succeeded. */ changed = true; - if (Decompiler.isFlowDebugging) - Decompiler.err.println("after T1: "+this); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) + GlobalOptions.err.println("after T1: "+this); break; } @@ -1250,8 +1250,8 @@ public class FlowBlock { int predAddr = ((FlowBlock)enum.nextElement()).addr; if (predAddr < start || predAddr >= end) { - if (Decompiler.debugAnalyze) - Decompiler.err.println + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_ANALYZE) != 0) + GlobalOptions.err.println ("breaking analyze(" + start + ", " + end + "); " + addr + " - " + getNextAddr()); @@ -1373,7 +1373,7 @@ public class FlowBlock { mergeSuccessors(lastFlow); } - if (Decompiler.isFlowDebugging) + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_FLOW) != 0) System.err.println("after analyzeSwitch: "+this); checkConsistent(); return changed; @@ -1426,9 +1426,9 @@ public class FlowBlock { mapStackToLocal(VariableStack.EMPTY); return true; // } catch (RuntimeException ex) { -// Decompiler.err.println("Can't resolve all PUSHes, " +// GlobalOptions.err.println("Can't resolve all PUSHes, " // +"this is probably illegal bytecode:"); -// ex.printStackTrace(Decompiler.err); +// ex.printStackTrace(GlobalOptions.err); // return false; // } } @@ -1510,7 +1510,7 @@ public class FlowBlock { writer.tab(); } - if (Decompiler.debugInOut) { + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_INOUT) != 0) { writer.println("in: "+in); } @@ -1559,7 +1559,7 @@ public class FlowBlock { java.io.StringWriter strw = new java.io.StringWriter(); TabbedPrintWriter writer = new TabbedPrintWriter(strw); writer.println(super.toString() + ": "+addr+"-"+(addr+length)); - if (Decompiler.debugInOut) { + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_INOUT) != 0) { writer.println("in: "+in); } writer.tab(); diff --git a/jode/jode/flow/Jump.java b/jode/jode/flow/Jump.java index 3d335e8..e7ff528 100644 --- a/jode/jode/flow/Jump.java +++ b/jode/jode/flow/Jump.java @@ -18,6 +18,7 @@ */ package jode.flow; +import jode.GlobalOptions; /** * This class represents an unconditional jump. @@ -85,7 +86,8 @@ public class Jump { public void dumpSource(jode.decompiler.TabbedPrintWriter writer) throws java.io.IOException { - if (jode.Decompiler.debugInOut) { + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_INOUT) != 0) { writer.println("gen : "+ gen.toString()); writer.println("kill: "+ kill.toString()); } diff --git a/jode/jode/flow/SequentialBlock.java b/jode/jode/flow/SequentialBlock.java index 6f8b27f..a6053de 100644 --- a/jode/jode/flow/SequentialBlock.java +++ b/jode/jode/flow/SequentialBlock.java @@ -64,12 +64,12 @@ public class SequentialBlock extends StructuredBlock { */ public VariableStack mapStackToLocal(VariableStack stack) { if (stack == null) - jode.Decompiler.err.println("map stack to local called with null: " + this+ " in "+this.flowBlock); + jode.GlobalOptions.err.println("map stack to local called with null: " + this+ " in "+this.flowBlock); VariableStack middle = subBlocks[0].mapStackToLocal(stack); if (middle != null) // Otherwise the second block is at least "logical" dead code return subBlocks[1].mapStackToLocal(middle); - jode.Decompiler.err.println("Dead code after Block " + subBlocks[0]); + jode.GlobalOptions.err.println("Dead code after Block " + subBlocks[0]); return null; } diff --git a/jode/jode/flow/StructuredBlock.java b/jode/jode/flow/StructuredBlock.java index 9d50e8c..7627017 100644 --- a/jode/jode/flow/StructuredBlock.java +++ b/jode/jode/flow/StructuredBlock.java @@ -19,6 +19,7 @@ package jode.flow; import jode.AssertError; +import jode.GlobalOptions; import jode.decompiler.TabbedPrintWriter; import jode.decompiler.LocalInfo; @@ -553,7 +554,8 @@ public abstract class StructuredBlock { public void dumpSource(jode.decompiler.TabbedPrintWriter writer) throws java.io.IOException { - if (jode.Decompiler.isDebugging) { + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_LOCALS) != 0) { if (declare != null) writer.println("declaring: "+declare); if (done != null) diff --git a/jode/jode/flow/TransformConstructors.java b/jode/jode/flow/TransformConstructors.java index 8e102e0..99cc807 100644 --- a/jode/jode/flow/TransformConstructors.java +++ b/jode/jode/flow/TransformConstructors.java @@ -41,7 +41,7 @@ public class TransformConstructors { if (header == null || !header.hasNoJumps()) return; sb[i] = cons[i].getMethodHeader().block; -// Decompiler.err.println("constr "+i+": "+sb[i]); +// GlobalOptions.err.println("constr "+i+": "+sb[i]); if (!isStatic) { InstructionBlock ib; if (sb[i] instanceof InstructionBlock) @@ -69,7 +69,7 @@ public class TransformConstructors { /* This constructor calls another constructor, so we * can skip it. */ -// Decompiler.err.println("skipping this()"); +// GlobalOptions.err.println("skipping this()"); cons[i] = cons[--constrCount]; continue; } @@ -83,7 +83,7 @@ public class TransformConstructors { sb[i] = sb[i].getSubBlocks()[1]; else sb[i] = null; -// Decompiler.err.println("normal constructor"); +// GlobalOptions.err.println("normal constructor"); } i++; } @@ -112,16 +112,16 @@ public class TransformConstructors { if (!pfo.isThis() || !expr.isConstant()) { -// Decompiler.err.println("not constant: "+expr); +// GlobalOptions.err.println("not constant: "+expr); break big_loop; } -// Decompiler.err.println("field "+pfo.getFieldName()+ " = "+expr); +// GlobalOptions.err.println("field "+pfo.getFieldName()+ " = "+expr); if (!isStatic && !(((ComplexExpression)instr).getSubExpressions()[0] .toString().equals("this"))) { -// Decompiler.err.println("not this: "+instr); +// GlobalOptions.err.println("not this: "+instr); break big_loop; } @@ -131,7 +131,7 @@ public class TransformConstructors { : sb[i]; if (!(ib instanceof InstructionBlock) || !((InstructionBlock)ib).getInstruction().equals(instr)) { -// Decompiler.err.println("constr "+i+" differs: "+ib); +// GlobalOptions.err.println("constr "+i+" differs: "+ib); break big_loop; } } @@ -140,7 +140,7 @@ public class TransformConstructors { if (!(clazzAnalyzer .getField(pfo.getFieldName(), pfo.getFieldType()) .setInitializer(expr))) { -// Decompiler.err.println("setField failed"); +// GlobalOptions.err.println("setField failed"); break big_loop; } @@ -153,7 +153,7 @@ public class TransformConstructors { } for (int i=0; i< constrCount; i++) if (sb[i] == null) { -// Decompiler.err.println("constr "+i+" is over"); +// GlobalOptions.err.println("constr "+i+" is over"); break big_loop; } } diff --git a/jode/jode/flow/TransformExceptionHandlers.java b/jode/jode/flow/TransformExceptionHandlers.java index c105384..2d37396 100644 --- a/jode/jode/flow/TransformExceptionHandlers.java +++ b/jode/jode/flow/TransformExceptionHandlers.java @@ -19,7 +19,7 @@ package jode.flow; import jode.AssertError; -import jode.Decompiler; +import jode.GlobalOptions; import jode.type.Type; import jode.decompiler.LocalInfo; import jode.expr.*; @@ -152,10 +152,10 @@ public class TransformExceptionHandlers { tryFlow.in.unionExact(catchFlow.in); tryFlow.gen.unionExact(catchFlow.gen); - if (Decompiler.debugInOut) { - Decompiler.err.println("UpdateInOutCatch: gens : "+gens); - Decompiler.err.println(" s.in : "+catchFlow.in); - Decompiler.err.println(" in : "+tryFlow.in); + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_INOUT) != 0) { + GlobalOptions.err.println("UpdateInOutCatch: gens : "+gens); + GlobalOptions.err.println(" s.in : "+catchFlow.in); + GlobalOptions.err.println(" in : "+tryFlow.in); } } @@ -854,8 +854,8 @@ public class TransformExceptionHandlers { int endHandler = (i< count-1 && endPCs[i+1] > catches[i].addr) ? endPCs[i+1] : Integer.MAX_VALUE; - if (Decompiler.debugAnalyze) - Decompiler.err.println("analyzeCatch(" + trys[i].addr + ", " + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_ANALYZE) != 0) + GlobalOptions.err.println("analyzeCatch(" + trys[i].addr + ", " + endPCs[i] + ", " +catches[i].addr + ")"); FlowBlock tryFlow = trys[i]; tryFlow.checkConsistent(); @@ -885,8 +885,8 @@ public class TransformExceptionHandlers { analyzeCatchBlock(Type.tObject, tryFlow, catchFlow); tryFlow.checkConsistent(); - if (Decompiler.debugAnalyze) - Decompiler.err.println("analyzeCatch(" + tryFlow.addr + ", " + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_ANALYZE) != 0) + GlobalOptions.err.println("analyzeCatch(" + tryFlow.addr + ", " + (tryFlow.addr + tryFlow.length) + ") done."); } diff --git a/jode/jode/flow/VariableSet.java b/jode/jode/flow/VariableSet.java index 959591c..c8d2017 100644 --- a/jode/jode/flow/VariableSet.java +++ b/jode/jode/flow/VariableSet.java @@ -57,7 +57,7 @@ public final class VariableSet implements Cloneable { size += count; if (size > locals.length) { int nextSize = locals.length * 2; -// Decompiler.err.println("wanted: "+size+" next: "+nextSize); +// GlobalOptions.err.println("wanted: "+size+" next: "+nextSize); LocalInfo[] newLocals = new LocalInfo[nextSize > size ? nextSize : size]; System.arraycopy(locals, 0, newLocals, 0, count); diff --git a/jode/jode/jvm/CodeVerifier.java b/jode/jode/jvm/CodeVerifier.java index 615b700..d028bd7 100644 --- a/jode/jode/jvm/CodeVerifier.java +++ b/jode/jode/jvm/CodeVerifier.java @@ -21,7 +21,7 @@ package jode.jvm; import jode.bytecode.*; import jode.type.*; import jode.AssertError; -import jode.Decompiler; +import jode.GlobalOptions; import java.util.BitSet; import java.util.Stack; @@ -182,16 +182,19 @@ public class CodeVerifier implements Opcodes { } public boolean isOfType(Type t1, Type t2) { + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_VERIFIER) != 0) + GlobalOptions.err.println("isOfType("+t1+","+t2+")"); if (t1.equals(t2)) return true; if (t1.getTypeCode() == Type.TC_INTEGER && t2.getTypeCode() == Type.TC_INTEGER) return true; - if (t1 == Type.tUObject) + if (t1.equals(Type.tUObject)) return (t2.getTypeCode() == Type.TC_CLASS || t2.getTypeCode() == Type.TC_ARRAY || t2.getTypeCode() == -Type.TC_CLASS); - if (t2 == Type.tUObject) + if (t2.equals(Type.tUObject)) return (t1.getTypeCode() == Type.TC_CLASS || t1.getTypeCode() == Type.TC_ARRAY || t1.getTypeCode() == -Type.TC_CLASS); @@ -206,10 +209,10 @@ public class CodeVerifier implements Opcodes { Type e2 = ((ArrayType)t2).getElementType(); if ((e1.getTypeCode() == Type.TC_CLASS || e1.getTypeCode() == Type.TC_ARRAY - || e1 == Type.tUObject) + || e1.equals(Type.tUObject)) && (e2.getTypeCode() == Type.TC_CLASS || e2.getTypeCode() == Type.TC_ARRAY - || e2 == Type.tUObject)) + || e2.equals(Type.tUObject))) return isOfType(e1, e2); return false; } else { @@ -229,11 +232,11 @@ public class CodeVerifier implements Opcodes { if (t1.getTypeCode() == Type.TC_INTEGER && t2.getTypeCode() == Type.TC_INTEGER) return t1; - if (t1 == Type.tUObject) + if (t1.equals(Type.tUObject)) return (t2.getTypeCode() == Type.TC_CLASS || t2.getTypeCode() == Type.TC_ARRAY || t2.getTypeCode() == -Type.TC_CLASS) ? t2 : Type.tError; - if (t2 == Type.tUObject) + if (t2.equals(Type.tUObject)) return (t1.getTypeCode() == Type.TC_CLASS || t1.getTypeCode() == Type.TC_ARRAY || t1.getTypeCode() == -Type.TC_CLASS) ? t1 : Type.tError; @@ -248,10 +251,10 @@ public class CodeVerifier implements Opcodes { Type e2 = ((ArrayType)t2).getElementType(); if ((e1.getTypeCode() == Type.TC_CLASS || e1.getTypeCode() == Type.TC_ARRAY - || e1 == Type.tUObject) + || e1.equals(Type.tUObject)) && (e2.getTypeCode() == Type.TC_CLASS || e2.getTypeCode() == Type.TC_ARRAY - || e2 == Type.tUObject)) + || e2.equals(Type.tUObject))) return Type.tArray(mergeType(e1, e2)); return Type.tObject; } else { @@ -415,7 +418,7 @@ public class CodeVerifier implements Opcodes { || !isOfType(arrType, Type.tArray(Type.tBoolean)))) throw new VerifyException(instr.getDescription()); - Type elemType = (arrType == Type.tUObject ? Type.tUObject + Type elemType = (arrType.equals(Type.tUObject) ? Type.tUObject :((ArrayType)arrType).getElementType()); result.push(elemType); if (((1 << instr.opcode - opc_iaload) & 0xa) != 0) @@ -985,14 +988,15 @@ public class CodeVerifier implements Opcodes { } } - if (false /* debugVerify */) { + if ((GlobalOptions.debuggingFlags + & GlobalOptions.DEBUG_VERIFIER) != 0) { for (Instruction instr = bi.getFirstInstr(); instr != null; instr = instr.nextByAddr) { VerifyInfo info = (VerifyInfo) instr.tmpInfo; if (info != null) - System.err.println(info.toString()); - System.err.println(instr.getDescription()); + GlobalOptions.err.println(info.toString()); + GlobalOptions.err.println(instr.getDescription()); } } @@ -1011,8 +1015,8 @@ public class CodeVerifier implements Opcodes { VerifyInfo info = (VerifyInfo) instr.tmpInfo; if (info != null) - System.err.println(info.toString()); - System.err.println(instr.getDescription()); + GlobalOptions.err.println(info.toString()); + GlobalOptions.err.println(instr.getDescription()); instr.tmpInfo = null; } diff --git a/jode/jode/jvm/SyntheticAnalyzer.java b/jode/jode/jvm/SyntheticAnalyzer.java index 0ca421c..990983d 100644 --- a/jode/jode/jvm/SyntheticAnalyzer.java +++ b/jode/jode/jvm/SyntheticAnalyzer.java @@ -18,7 +18,7 @@ */ package jode.decompiler; -import jode.Decompiler; +import jode.GlobalOptions; import jode.flow.*; import jode.expr.*; import jode.type.Type; @@ -36,8 +36,8 @@ public class SyntheticAnalyzer { public SyntheticAnalyzer(MethodAnalyzer method) { this.method = method; if (method.getName().equals("class$")) - if (!checkGetClass() && Decompiler.isVerbose) - Decompiler.err.println("class$ seems to be wrong"); + if (!checkGetClass() && GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println("class$ seems to be wrong"); } boolean checkGetClass() { diff --git a/jode/jode/obfuscator/ClassBundle.java b/jode/jode/obfuscator/ClassBundle.java index 5015159..e79b5fd 100644 --- a/jode/jode/obfuscator/ClassBundle.java +++ b/jode/jode/obfuscator/ClassBundle.java @@ -18,7 +18,7 @@ */ package jode.obfuscator; -import jode.Obfuscator; +import jode.GlobalOptions; import jode.bytecode.ClassInfo; import jode.bytecode.Reference; import java.io.*; @@ -130,8 +130,8 @@ public class ClassBundle { prop.load(input); input.close(); } catch (java.io.IOException ex) { - Obfuscator.err.println("Can't read rename table "+filename); - ex.printStackTrace(Obfuscator.err); + GlobalOptions.err.println("Can't read rename table "+filename); + ex.printStackTrace(GlobalOptions.err); } basePackage.readTable(prop); } @@ -144,8 +144,8 @@ public class ClassBundle { prop.save(out, "Reverse renaming table"); out.close(); } catch (java.io.IOException ex) { - Obfuscator.err.println("Can't write rename table "+filename); - ex.printStackTrace(Obfuscator.err); + GlobalOptions.err.println("Can't write rename table "+filename); + ex.printStackTrace(GlobalOptions.err); } } @@ -163,12 +163,12 @@ public class ClassBundle { zip.close(); } catch (IOException ex) { System.err.println("Can't write zip file: "+destination); - ex.printStackTrace(Obfuscator.err); + ex.printStackTrace(GlobalOptions.err); } } else { File directory = new File(destination); if (!directory.exists()) { - Obfuscator.err.println("Destination directory " + GlobalOptions.err.println("Destination directory " +directory.getPath() +" doesn't exists."); return; diff --git a/jode/jode/obfuscator/ClassIdentifier.java b/jode/jode/obfuscator/ClassIdentifier.java index 67be143..5656c0f 100644 --- a/jode/jode/obfuscator/ClassIdentifier.java +++ b/jode/jode/obfuscator/ClassIdentifier.java @@ -18,6 +18,7 @@ */ package jode.obfuscator; +import jode.GlobalOptions; import jode.Obfuscator; import jode.bytecode.*; import java.lang.reflect.Modifier; @@ -190,8 +191,8 @@ public class ClassIdentifier extends Identifier { } public void analyze() { - if (Obfuscator.verboseLevel > 0) - Obfuscator.err.println("Reachable: "+this); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println("Reachable: "+this); } public void initClass() { @@ -323,8 +324,8 @@ public class ClassIdentifier extends Identifier { } public void doTransformations() { - if (Obfuscator.verboseLevel > 0) - Obfuscator.err.println("Transforming "+this); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println("Transforming "+this); info.setName(getFullAlias()); transformSuperIfaces(); @@ -359,8 +360,8 @@ public class ClassIdentifier extends Identifier { } public void storeClass(DataOutputStream out) throws IOException { - if (Obfuscator.verboseLevel > 0) - Obfuscator.err.println("Writing "+this); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println("Writing "+this); info.write(out); } diff --git a/jode/jode/obfuscator/ConstantAnalyzer.java b/jode/jode/obfuscator/ConstantAnalyzer.java index 67dcc9f..4a632bb 100644 --- a/jode/jode/obfuscator/ConstantAnalyzer.java +++ b/jode/jode/obfuscator/ConstantAnalyzer.java @@ -19,6 +19,7 @@ package jode.obfuscator; import jode.type.MethodType; +import jode.GlobalOptions; import jode.Obfuscator; import jode.type.Type; import jode.bytecode.*; @@ -1013,20 +1014,18 @@ public class ConstantAnalyzer implements Opcodes, CodeAnalyzer { Object methodResult = null; if (constant) { try { - if (jode.Obfuscator.isDebugging) - jode.Decompiler.isDebugging = true; /*XXX*/ methodResult = runtime.invokeMethod (ref, opcode != opc_invokespecial, cls, args); } catch (InterpreterException ex) { constant = false; - if (jode.Obfuscator.verboseLevel > 3) - Obfuscator.err.println("Can't interpret "+ref+": " + if (jode.GlobalOptions.verboseLevel > 3) + GlobalOptions.err.println("Can't interpret "+ref+": " + ex.getMessage()); /* result is not constant */ } catch (InvocationTargetException ex) { constant = false; - if (jode.Obfuscator.verboseLevel > 3) - Obfuscator.err.println("Method "+ref + if (jode.GlobalOptions.verboseLevel > 3) + GlobalOptions.err.println("Method "+ref +" throwed exception: " + ex.getTargetException() .getMessage()); @@ -1232,7 +1231,7 @@ public class ConstantAnalyzer implements Opcodes, CodeAnalyzer { public BytecodeInfo stripCode() { if (constInfos == null) analyzeCode(); -// bytecode.dumpCode(Obfuscator.err); +// bytecode.dumpCode(GlobalOptions.err); for (Instruction instr = bytecode.getFirstInstr(); instr != null; instr = instr.nextByAddr) { ConstantInfo info = (ConstantInfo) constInfos.get(instr); @@ -1248,8 +1247,8 @@ public class ConstantAnalyzer implements Opcodes, CodeAnalyzer { instr.localSlot = -1; instr.length = 2; instr.objData = info.constant; - if (Obfuscator.verboseLevel > 2) - Obfuscator.err.println + if (GlobalOptions.verboseLevel > 2) + GlobalOptions.err.println (m + ": Replacing " + instr + " with constant " + info.constant); } @@ -1261,8 +1260,8 @@ public class ConstantAnalyzer implements Opcodes, CodeAnalyzer { instr.opcode = opc_pop2; else instr.opcode = opc_pop; - if (Obfuscator.verboseLevel > 2) - Obfuscator.err.println + if (GlobalOptions.verboseLevel > 2) + GlobalOptions.err.println (m + ": Replacing " + instr + " with goto " + pc.addr); instr.alwaysJumps = false; instr.succs[0].removePredecessor(instr); @@ -1330,7 +1329,7 @@ public class ConstantAnalyzer implements Opcodes, CodeAnalyzer { FieldIdentifier fi = (FieldIdentifier) m.clazz.bundle.getIdentifier(ref); if (fi != null - && jode.Obfuscator.shouldStrip && !fi.isReachable()) { + && Obfuscator.shouldStrip && !fi.isReachable()) { insertPop(instr); instr.removeInstruction(); } diff --git a/jode/jode/obfuscator/Identifier.java b/jode/jode/obfuscator/Identifier.java index 669d493..91d45b2 100644 --- a/jode/jode/obfuscator/Identifier.java +++ b/jode/jode/obfuscator/Identifier.java @@ -18,6 +18,7 @@ */ package jode.obfuscator; +import jode.GlobalOptions; import jode.Obfuscator; import java.io.*; import java.util.Hashtable; @@ -158,8 +159,8 @@ public abstract class Identifier { static int serialnr = 0; public void buildTable(int renameRule) { if (isPreserved()) { - if (Obfuscator.isDebugging) - Obfuscator.err.println(toString() + " is preserved"); + if (GlobalOptions.verboseLevel > 4) + GlobalOptions.err.println(toString() + " is preserved"); } else if (renameRule != Obfuscator.RENAME_NONE) { Identifier rep = getRepresentative(); if (rep.wasAliased) diff --git a/jode/jode/obfuscator/MethodIdentifier.java b/jode/jode/obfuscator/MethodIdentifier.java index 64b009e..fda1f9d 100644 --- a/jode/jode/obfuscator/MethodIdentifier.java +++ b/jode/jode/obfuscator/MethodIdentifier.java @@ -19,6 +19,7 @@ package jode.obfuscator; import java.lang.reflect.Modifier; +import jode.GlobalOptions; import jode.Obfuscator; import jode.bytecode.*; import jode.type.Type; @@ -85,8 +86,8 @@ public class MethodIdentifier extends Identifier implements Opcodes { } public void analyze() { - if (Obfuscator.verboseLevel > 1) - Obfuscator.err.println("Analyze: "+this); + if (GlobalOptions.verboseLevel > 1) + GlobalOptions.err.println("Analyze: "+this); String type = getType(); int index = type.indexOf('L'); @@ -169,7 +170,7 @@ public class MethodIdentifier extends Identifier implements Opcodes { info.setType(clazz.bundle.getTypeAlias(info.getType())); if (getCodeAnalyzer() != null) { BytecodeInfo strippedBytecode = getCodeAnalyzer().stripCode(); -// strippedBytecode.dumpCode(Obfuscator.err); +// strippedBytecode.dumpCode(GlobalOptions.err); /* XXX This should be in a if (Obfuscator.distributeLocals) */ LocalOptimizer localOpt = new LocalOptimizer(strippedBytecode, @@ -179,14 +180,14 @@ public class MethodIdentifier extends Identifier implements Opcodes { localOpt.distributeLocals(); -// if (Obfuscator.isDebugging) +// if (GlobalOptions.verboseLevel > 4) // localOpt.dumpLocals(); -// strippedBytecode.dumpCode(Obfuscator.err); +// strippedBytecode.dumpCode(GlobalOptions.err); RemovePopAnalyzer remPop = new RemovePopAnalyzer(strippedBytecode, this); remPop.stripCode(); -// strippedBytecode.dumpCode(Obfuscator.err); +// strippedBytecode.dumpCode(GlobalOptions.err); for (Instruction instr = strippedBytecode.getFirstInstr(); instr != null; instr = instr.nextByAddr) { diff --git a/jode/jode/obfuscator/PackageIdentifier.java b/jode/jode/obfuscator/PackageIdentifier.java index c6b1225..31c61f7 100644 --- a/jode/jode/obfuscator/PackageIdentifier.java +++ b/jode/jode/obfuscator/PackageIdentifier.java @@ -18,6 +18,7 @@ */ package jode.obfuscator; +import jode.GlobalOptions; import jode.Obfuscator; import jode.bytecode.ClassInfo; import jode.bytecode.FieldInfo; @@ -128,7 +129,7 @@ public class PackageIdentifier extends Identifier { ident = new PackageIdentifier(bundle, this, name, true); loadedClasses.put(name, ident); } else if (!ClassInfo.exists(fullname)) { - Obfuscator.err.println("Warning: Can't find class "+fullname); + GlobalOptions.err.println("Warning: Can't find class "+fullname); } else { ident = new ClassIdentifier(bundle, this, name, ClassInfo.forName(fullname)); @@ -170,10 +171,10 @@ public class PackageIdentifier extends Identifier { component, loadOnDemand); loadedClasses.put(component, ident); } else if (!ClassInfo.exists(fullname)) { - Obfuscator.err.println("Warning: Can't find class "+fullname); + GlobalOptions.err.println("Warning: Can't find class "+fullname); } else if (wildcard.matches(fullname)) { - if (Obfuscator.verboseLevel > 1) - Obfuscator.err.println("loading Class " +fullname); + if (GlobalOptions.verboseLevel > 1) + GlobalOptions.err.println("loading Class " +fullname); ident = new ClassIdentifier(bundle, this, name, ClassInfo.forName(fullname)); loadedClasses.put(name, ident); @@ -184,8 +185,8 @@ public class PackageIdentifier extends Identifier { } if (ident instanceof PackageIdentifier) { if (wildcard.matches(ident.getFullName())) { - if (Obfuscator.verboseLevel > 0) - Obfuscator.err.println("loading Package " +ident.getFullName()); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println("loading Package " +ident.getFullName()); ((PackageIdentifier) ident).setLoadOnDemand(); } @@ -207,14 +208,14 @@ public class PackageIdentifier extends Identifier { if (wildcard.matches(subFull)) { if (ClassInfo.isPackage(subFull)) { - if (Obfuscator.verboseLevel > 0) - Obfuscator.err.println("loading Package " +subFull); + if (GlobalOptions.verboseLevel > 0) + GlobalOptions.err.println("loading Package " +subFull); Identifier ident = new PackageIdentifier (bundle, this, subclazz, true); loadedClasses.put(subclazz, ident); } else { - if (Obfuscator.verboseLevel > 1) - Obfuscator.err.println("loading Class " +subFull); + if (GlobalOptions.verboseLevel > 1) + GlobalOptions.err.println("loading Class " +subFull); ClassIdentifier ident = new ClassIdentifier (bundle, this, subclazz, ClassInfo.forName(subFull)); @@ -293,7 +294,7 @@ public class PackageIdentifier extends Identifier { component, loadOnDemand); loadedClasses.put(component, ident); } else if (!ClassInfo.exists(fullname)) { - Obfuscator.err.println("Warning: Can't find class "+fullname); + GlobalOptions.err.println("Warning: Can't find class "+fullname); } else { ident = new ClassIdentifier(bundle, this, name, ClassInfo.forName(fullname)); @@ -457,8 +458,8 @@ public class PackageIdentifier extends Identifier { while (enum.hasMoreElements()) { Identifier ident = (Identifier) enum.nextElement(); if (Obfuscator.shouldStrip && !ident.isReachable()) { - if (Obfuscator.isDebugging) - Obfuscator.err.println("Class/Package " + if (GlobalOptions.verboseLevel > 4) + GlobalOptions.err.println("Class/Package " + ident.getFullName() + " is not reachable"); continue; @@ -475,9 +476,9 @@ public class PackageIdentifier extends Identifier { out.flush(); zip.closeEntry(); } catch (java.io.IOException ex) { - Obfuscator.err.println("Can't write Class " + GlobalOptions.err.println("Can't write Class " + ident.getName()); - ex.printStackTrace(Obfuscator.err); + ex.printStackTrace(GlobalOptions.err); } } } @@ -487,15 +488,15 @@ public class PackageIdentifier extends Identifier { File newDest = (parent == null) ? destination : new File(destination, getAlias()); if (!newDest.exists() && !newDest.mkdir()) { - Obfuscator.err.println("Could not create directory " + GlobalOptions.err.println("Could not create directory " +newDest.getPath()+", check permissions."); } Enumeration enum = loadedClasses.elements(); while (enum.hasMoreElements()) { Identifier ident = (Identifier) enum.nextElement(); if (Obfuscator.shouldStrip && !ident.isReachable()) { - if (Obfuscator.isDebugging) - Obfuscator.err.println("Class/Package " + if (GlobalOptions.verboseLevel > 4) + GlobalOptions.err.println("Class/Package " + ident.getFullName() + " is not reachable"); continue; @@ -507,7 +508,7 @@ public class PackageIdentifier extends Identifier { try { File file = new File(newDest, ident.getAlias()+".class"); // if (file.exists()) { -// Obfuscator.err.println +// GlobalOptions.err.println // ("Refuse to overwrite existing class file " // +file.getPath()+". Remove it first."); // return; @@ -517,9 +518,9 @@ public class PackageIdentifier extends Identifier { ((ClassIdentifier) ident).storeClass(out); out.close(); } catch (java.io.IOException ex) { - Obfuscator.err.println("Can't write Class " + GlobalOptions.err.println("Can't write Class " + ident.getName()); - ex.printStackTrace(Obfuscator.err); + ex.printStackTrace(GlobalOptions.err); } } } diff --git a/jode/jode/swingui/Main.java b/jode/jode/swingui/Main.java index de296e7..3d4884d 100644 --- a/jode/jode/swingui/Main.java +++ b/jode/jode/swingui/Main.java @@ -18,7 +18,7 @@ */ package jode.swingui; -import jode.Decompiler; +import jode.GlobalOptions; import jode.decompiler.*; import jode.bytecode.ClassInfo; ///#ifndef OLDSWING @@ -44,7 +44,7 @@ public class MainWindow public MainWindow() { setClasspath(System.getProperty("java.class.path")); - JFrame frame = new JFrame(Decompiler.copyright); + JFrame frame = new JFrame(GlobalOptions.copyright); fillContentPane(frame.getContentPane()); addMenu(frame); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); @@ -83,7 +83,7 @@ public class MainWindow rightPane.setDividerSize(4); allPane.setDividerLocation(200); allPane.setDividerSize(4); - Decompiler.err = new PrintStream(new AreaOutputStream(errorArea)); + GlobalOptions.err = new PrintStream(new AreaOutputStream(errorArea)); } public synchronized void valueChanged(TreeSelectionEvent e) { @@ -127,9 +127,9 @@ public class MainWindow // out.close(); // } catch (IOException ex) { // errorArea.setText(""); -// Decompiler.err.println("Couldn't write to file " +// GlobalOptions.err.println("Couldn't write to file " // + fileName + ": "); -// ex.printStackTrace(Decompiler.err); +// ex.printStackTrace(GlobalOptions.err); // } } } @@ -176,7 +176,7 @@ public class MainWindow } catch (Throwable t) { sourcecodeArea.setText("Didn't succeed.\n" +"Check the below area for more info."); - t.printStackTrace(Decompiler.err); + t.printStackTrace(GlobalOptions.err); } finally { synchronized(this) { decompileThread = null; diff --git a/jode/jode/type/IntegerType.java b/jode/jode/type/IntegerType.java index 0f82748..03014fa 100644 --- a/jode/jode/type/IntegerType.java +++ b/jode/jode/type/IntegerType.java @@ -18,7 +18,7 @@ */ package jode.type; -import jode.Decompiler; +import jode.GlobalOptions; /** * This is a type class for 16 bit integral types. There are seven @@ -229,8 +229,8 @@ public class IntegerType extends Type { return other; } Type result = mergeTypes == 0 ? tError : new IntegerType(mergeTypes); - if (Decompiler.isTypeDebugging) { - Decompiler.err.println("intersecting "+ this +" and "+ type + + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) { + GlobalOptions.err.println("intersecting "+ this +" and "+ type + " to " + result); } return result; diff --git a/jode/jode/type/RangeType.java b/jode/jode/type/RangeType.java index bb121da..ecafeb0 100644 --- a/jode/jode/type/RangeType.java +++ b/jode/jode/type/RangeType.java @@ -19,7 +19,7 @@ package jode.type; import jode.AssertError; -import jode.Decompiler; +import jode.GlobalOptions; import java.util.Hashtable; /** @@ -168,8 +168,8 @@ public class RangeType extends Type { else result = tError; - if (Decompiler.isTypeDebugging) { - Decompiler.err.println("intersecting "+ this +" and "+ type + + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) { + GlobalOptions.err.println("intersecting "+ this +" and "+ type + " to " + result); } return result; diff --git a/jode/jode/type/ReferenceType.java b/jode/jode/type/ReferenceType.java index 70c94e5..a5b1715 100644 --- a/jode/jode/type/ReferenceType.java +++ b/jode/jode/type/ReferenceType.java @@ -18,7 +18,7 @@ */ package jode.type; -import jode.Decompiler; +import jode.GlobalOptions; import jode.bytecode.ClassInfo; import java.util.Vector; import java.util.Stack; @@ -112,8 +112,8 @@ public abstract class ReferenceType extends Type { else result = tError; - if (Decompiler.isTypeDebugging) { - Decompiler.err.println("intersecting "+ this +" and "+ type + + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) { + GlobalOptions.err.println("intersecting "+ this +" and "+ type + " to " + result); } return result; diff --git a/jode/jode/type/Type.java b/jode/jode/type/Type.java index 26f4b36..0570fc9 100644 --- a/jode/jode/type/Type.java +++ b/jode/jode/type/Type.java @@ -19,7 +19,7 @@ package jode.type; import jode.AssertError; -import jode.Decompiler; +import jode.GlobalOptions; import jode.bytecode.ClassInfo; ///#ifdef JDK12 ///import java.lang.ref.WeakReference; @@ -372,8 +372,8 @@ public class Type { return type; if (type == tUnknown || this == type) return this; - if (Decompiler.isTypeDebugging) - Decompiler.err.println("intersecting "+ this +" and "+ type + if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) + GlobalOptions.err.println("intersecting "+ this +" and "+ type + " to "); return tError; }