git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@129 379699f6-c40d-0410-875b-85095c16579estable
parent
bb160b1a00
commit
87f79ddf49
@ -0,0 +1,32 @@ |
|||||||
|
/* jode.bytecode.ClassFormatException Copyright (C) 1997-1998 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
package jode.bytecode; |
||||||
|
|
||||||
|
/** |
||||||
|
* This exception is thrown, if the class file has an unknown format. |
||||||
|
* @author Jochen Hoenicke |
||||||
|
*/ |
||||||
|
public class ClassFormatException extends java.io.IOException{ |
||||||
|
public ClassFormatException(String detail) { |
||||||
|
super(detail); |
||||||
|
} |
||||||
|
public ClassFormatException() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,177 @@ |
|||||||
|
/* jode.bytecode.ClassHierarchy Copyright (C) 1997-1998 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
package jode.bytecode; |
||||||
|
import jode.SearchPath; |
||||||
|
import java.io.*; |
||||||
|
import java.util.Hashtable; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class does represent a class similar to java.lang.Class. You |
||||||
|
* can get the super class and the interfaces. |
||||||
|
* |
||||||
|
* The main difference to java.lang.Class is, that the objects are builded |
||||||
|
* from a stream containing the .class file, and that it uses the |
||||||
|
* <code>jode.Type</code> to represent types instead of Class itself. |
||||||
|
* |
||||||
|
* @author Jochen Hoenicke |
||||||
|
*/ |
||||||
|
public class ClassHierarchy { |
||||||
|
private String name; |
||||||
|
private int modifiers = -1; |
||||||
|
private ClassHierarchy superclass; |
||||||
|
private ClassHierarchy[] interfaces; |
||||||
|
private static SearchPath classpath; |
||||||
|
private ConstantPool constantPool; |
||||||
|
private static Hashtable classes = new Hashtable(); // XXX - weak map
|
||||||
|
|
||||||
|
public final static ClassHierarchy javaLangObject = |
||||||
|
ClassHierarchy.forName("java.lang.Object"); |
||||||
|
|
||||||
|
public static void setClassPath(SearchPath path) { |
||||||
|
classpath = path; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static ClassHierarchy forName(String name) { |
||||||
|
if (name == null) |
||||||
|
return null; |
||||||
|
name = name.replace('/', '.'); |
||||||
|
ClassHierarchy clazz = (ClassHierarchy) classes.get(name); |
||||||
|
if (clazz == null) { |
||||||
|
clazz = new ClassHierarchy(name); |
||||||
|
classes.put(name, clazz); |
||||||
|
} |
||||||
|
return clazz; |
||||||
|
} |
||||||
|
|
||||||
|
public ClassHierarchy(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
private void readHeader(DataInputStream input) |
||||||
|
throws IOException { |
||||||
|
if (input.readInt() != 0xcafebabe) |
||||||
|
throw new ClassFormatException("Wrong magic"); |
||||||
|
if (input.readUnsignedShort() > 3) |
||||||
|
throw new ClassFormatException("Wrong minor"); |
||||||
|
if (input.readUnsignedShort() != 45) |
||||||
|
throw new ClassFormatException("Wrong major"); |
||||||
|
} |
||||||
|
|
||||||
|
private void readConstants(DataInputStream input) |
||||||
|
throws IOException { |
||||||
|
constantPool = new ConstantPool(); |
||||||
|
constantPool.read(input); |
||||||
|
} |
||||||
|
|
||||||
|
private void readNameAndSuper(DataInputStream input) |
||||||
|
throws IOException { |
||||||
|
modifiers = input.readUnsignedShort(); |
||||||
|
String name = constantPool.getClassName(input.readUnsignedShort()); |
||||||
|
if (!this.name.equals(name)) |
||||||
|
new ClassFormatException("Class has wrong name: "+name); |
||||||
|
superclass = ClassHierarchy.forName |
||||||
|
(constantPool.getClassName(input.readUnsignedShort())); |
||||||
|
} |
||||||
|
|
||||||
|
private void readInterfaces(DataInputStream input) |
||||||
|
throws IOException { |
||||||
|
int count = input.readUnsignedShort(); |
||||||
|
interfaces = new ClassHierarchy[count]; |
||||||
|
for (int i=0; i< count; i++) { |
||||||
|
interfaces[i] = ClassHierarchy.forName |
||||||
|
(constantPool.getClassName(input.readUnsignedShort())); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void loadHierarchy() { |
||||||
|
try { |
||||||
|
DataInputStream input = |
||||||
|
new DataInputStream(classpath.getFile(name.replace('.', '/') |
||||||
|
+ ".class")); |
||||||
|
readHeader(input); |
||||||
|
readConstants(input); |
||||||
|
readNameAndSuper(input); |
||||||
|
readInterfaces(input); |
||||||
|
|
||||||
|
constantPool = null; // Now allow clean up
|
||||||
|
} catch (IOException ex) { |
||||||
|
String message = ex.getLocalizedMessage(); |
||||||
|
System.err.println("Can't read class " + name |
||||||
|
+ ", types may be incorrect. (" |
||||||
|
+ ex.getClass().getName() |
||||||
|
+ (message != null ? ": " + message : "")+")"); |
||||||
|
|
||||||
|
if (name.equals("java.lang.Object")) |
||||||
|
superclass = null; |
||||||
|
else |
||||||
|
superclass = ClassHierarchy.forName("java.lang.Object"); |
||||||
|
interfaces = new ClassHierarchy[0]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public ClassHierarchy getSuperclass() { |
||||||
|
if (interfaces == null) |
||||||
|
loadHierarchy(); |
||||||
|
return superclass; |
||||||
|
} |
||||||
|
|
||||||
|
public ClassHierarchy[] getInterfaces() { |
||||||
|
if (interfaces == null) |
||||||
|
loadHierarchy(); |
||||||
|
return interfaces; |
||||||
|
} |
||||||
|
|
||||||
|
public int getModifiers() { |
||||||
|
return modifiers; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isInterface() { |
||||||
|
if (interfaces == null) |
||||||
|
loadHierarchy(); |
||||||
|
return java.lang.reflect.Modifier.isInterface(modifiers); |
||||||
|
} |
||||||
|
|
||||||
|
public String toString() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean superClassOf(ClassHierarchy son) { |
||||||
|
while (son != this && son != null) { |
||||||
|
son = son.getSuperclass(); |
||||||
|
} |
||||||
|
return son == this; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean implementedBy(ClassHierarchy clazz) { |
||||||
|
while (clazz != this && clazz != null) { |
||||||
|
ClassHierarchy[] ifaces = clazz.getInterfaces(); |
||||||
|
for (int i=0; i< ifaces.length; i++) { |
||||||
|
if (implementedBy(ifaces[i])) |
||||||
|
return true; |
||||||
|
} |
||||||
|
clazz = clazz.getSuperclass(); |
||||||
|
} |
||||||
|
return clazz == this; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,147 @@ |
|||||||
|
/* jode.bytecode.ConstantPool Copyright (C) 1998 Jochen Hoenicke. |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU General Public License as published by |
||||||
|
* the Free Software Foundation; either version 2, or (at your option) |
||||||
|
* any later version. |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU General Public License |
||||||
|
* along with this program; see the file COPYING. If not, write to |
||||||
|
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
* |
||||||
|
* $Id$ |
||||||
|
*/ |
||||||
|
package jode.bytecode; |
||||||
|
import java.io.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class represent the constant pool. |
||||||
|
* |
||||||
|
* @author Jochen Hoenicke |
||||||
|
*/ |
||||||
|
public class ConstantPool { |
||||||
|
public final static int CLASS = 7; |
||||||
|
public final static int FIELDREF = 9; |
||||||
|
public final static int METHODREF = 10; |
||||||
|
public final static int INTERFACEMETHODREF = 11; |
||||||
|
public final static int STRING = 8; |
||||||
|
public final static int INTEGER = 3; |
||||||
|
public final static int FLOAT = 4; |
||||||
|
public final static int LONG = 5; |
||||||
|
public final static int DOUBLE = 6; |
||||||
|
public final static int NAMEANDTYPE = 12; |
||||||
|
public final static int UTF8 = 1; |
||||||
|
|
||||||
|
int[] tags; |
||||||
|
int[] indices1, indices2; |
||||||
|
|
||||||
|
Object[] constants; |
||||||
|
|
||||||
|
public ConstantPool () { |
||||||
|
} |
||||||
|
|
||||||
|
public void read(DataInputStream stream) |
||||||
|
throws IOException { |
||||||
|
int count = stream.readUnsignedShort(); |
||||||
|
tags = new int[count]; |
||||||
|
indices1 = new int[count]; |
||||||
|
indices2 = new int[count]; |
||||||
|
constants = new Object[count]; |
||||||
|
|
||||||
|
for (int i=1; i< count; i++) { |
||||||
|
int tag = stream.readUnsignedByte(); |
||||||
|
tags[i] = tag; |
||||||
|
switch (tag) { |
||||||
|
case CLASS: |
||||||
|
indices1[i] = stream.readUnsignedShort(); |
||||||
|
break; |
||||||
|
case FIELDREF: |
||||||
|
case METHODREF: |
||||||
|
case INTERFACEMETHODREF: |
||||||
|
indices1[i] = stream.readUnsignedShort(); |
||||||
|
indices2[i] = stream.readUnsignedShort(); |
||||||
|
break; |
||||||
|
case STRING: |
||||||
|
indices1[i] = stream.readUnsignedShort(); |
||||||
|
break; |
||||||
|
case INTEGER: |
||||||
|
constants[i] = new Integer(stream.readInt()); |
||||||
|
break; |
||||||
|
case FLOAT: |
||||||
|
constants[i] = new Float(stream.readFloat()); |
||||||
|
break; |
||||||
|
case LONG: |
||||||
|
constants[i] = new Long(stream.readLong()); |
||||||
|
tags[++i] = -LONG; |
||||||
|
break; |
||||||
|
case DOUBLE: |
||||||
|
constants[i] = new Double(stream.readDouble()); |
||||||
|
tags[++i] = -DOUBLE; |
||||||
|
break; |
||||||
|
case NAMEANDTYPE: |
||||||
|
indices1[i] = stream.readUnsignedShort(); |
||||||
|
indices2[i] = stream.readUnsignedShort(); |
||||||
|
break; |
||||||
|
case UTF8: |
||||||
|
constants[i] = new String(stream.readUTF()); |
||||||
|
break; |
||||||
|
default: |
||||||
|
throw new ClassFormatException("unknown constant tag"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getUTF8(int i) throws ClassFormatException { |
||||||
|
if (i == 0) |
||||||
|
return null; |
||||||
|
if (tags[i] != UTF8) |
||||||
|
throw new ClassFormatException("Tag mismatch"); |
||||||
|
return (String)constants[i]; |
||||||
|
} |
||||||
|
|
||||||
|
public String getClassName(int i) throws ClassFormatException { |
||||||
|
if (i == 0) |
||||||
|
return null; |
||||||
|
if (tags[i] != CLASS) |
||||||
|
throw new ClassFormatException("Tag mismatch"); |
||||||
|
return getUTF8(indices1[i]); |
||||||
|
} |
||||||
|
|
||||||
|
public String toString(int i) { |
||||||
|
switch (tags[i]) { |
||||||
|
case CLASS: |
||||||
|
return "class "+toString(indices1[i]); |
||||||
|
case STRING: |
||||||
|
return "\""+toString(indices1[i])+"\""; |
||||||
|
case INTEGER: |
||||||
|
case FLOAT: |
||||||
|
case LONG: |
||||||
|
case DOUBLE: |
||||||
|
case UTF8: |
||||||
|
return constants[i].toString(); |
||||||
|
case FIELDREF: |
||||||
|
case METHODREF: |
||||||
|
case INTERFACEMETHODREF: |
||||||
|
return "Ref: "+toString(indices1[i])+": " |
||||||
|
+ toString(indices2[i]); |
||||||
|
case NAMEANDTYPE: |
||||||
|
return toString(indices1[i])+" "+toString(indices2[i]); |
||||||
|
default: |
||||||
|
return "unknown tag: "+tags[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String toString() { |
||||||
|
StringBuffer result = new StringBuffer("[ null"); |
||||||
|
for (int i=1; i< tags.length; i++) { |
||||||
|
result.append(", ").append(toString(i)); |
||||||
|
} |
||||||
|
result.append(" ]"); |
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
echo '#!/bin/sh' > co.all |
||||||
|
echo co -u *.java flow/*.java gb/*.java >> co.all |
||||||
|
echo javac -d \$HOME/java -g gb/*.java Decompiler.java >> co.all |
||||||
|
|
||||||
|
cd .. |
||||||
|
tar -cvzf jode.tar.gz jode/co.all jode/maketar \ |
||||||
|
jode/RCS jode/flow/RCS jode/gb/RCS jode/test/*.java |
@ -0,0 +1,63 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
public class AssignOp { |
||||||
|
static int static_int; |
||||||
|
static double static_double; |
||||||
|
static String static_String; |
||||||
|
static long static_long; |
||||||
|
|
||||||
|
int obj_int; |
||||||
|
long obj_long; |
||||||
|
double obj_double; |
||||||
|
String obj_String; |
||||||
|
|
||||||
|
int [] arr_int; |
||||||
|
long[] arr_long; |
||||||
|
double[] arr_double; |
||||||
|
String[] arr_String; |
||||||
|
|
||||||
|
void assop() { |
||||||
|
int local_int = 0; |
||||||
|
double local_double = 1.0; |
||||||
|
String local_String = null; |
||||||
|
|
||||||
|
local_int |= 25 | local_int; |
||||||
|
static_int <<= 3; |
||||||
|
obj_int *= 17 + obj_int; |
||||||
|
arr_int[local_int] /= (obj_int+=7); |
||||||
|
|
||||||
|
local_double /= 3.0; |
||||||
|
static_double *= obj_int; |
||||||
|
obj_double -= 25; |
||||||
|
arr_double[local_int] /= (local_double+=7.0); |
||||||
|
|
||||||
|
static_String += "Hallo"; |
||||||
|
obj_String += "Hallo"; |
||||||
|
arr_String[0] += local_double + static_String + "Hallo" + obj_int; |
||||||
|
local_String += "Hallo"; |
||||||
|
} |
||||||
|
|
||||||
|
void prepost() { |
||||||
|
int local_int= -1; |
||||||
|
long local_long= 4; |
||||||
|
|
||||||
|
local_long = local_int++; |
||||||
|
obj_long = ++obj_int; |
||||||
|
arr_long[static_int] = static_long = (arr_long[--static_int] = (static_int--))+1; |
||||||
|
} |
||||||
|
|
||||||
|
void iinc() { |
||||||
|
int local_int = 0; |
||||||
|
local_int += 5; |
||||||
|
obj_int = (local_int -= 5); |
||||||
|
|
||||||
|
static_int = local_int++; |
||||||
|
obj_int = --local_int; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,17 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
public class For { |
||||||
|
|
||||||
|
boolean nested() { |
||||||
|
outer: |
||||||
|
for (int i=0; i< 100; i++) { |
||||||
|
for (int j=0; j< 100; j++) { |
||||||
|
if (i < j) |
||||||
|
continue outer; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
public class IfCombine { |
||||||
|
boolean a,b,c; |
||||||
|
int i,j,k; |
||||||
|
|
||||||
|
public void foo() { |
||||||
|
if ( a && (b || c) && (i<k)) { |
||||||
|
if (a != b) |
||||||
|
i = 1; |
||||||
|
else |
||||||
|
i = 2; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
public class InnerClass { |
||||||
|
|
||||||
|
private int x; |
||||||
|
|
||||||
|
class Inner { |
||||||
|
int a = 4; |
||||||
|
private int b; |
||||||
|
Inner() { |
||||||
|
b = x; |
||||||
|
} |
||||||
|
|
||||||
|
class InnerInner { |
||||||
|
public InnerInner(int c) { |
||||||
|
x = c; |
||||||
|
a = b; |
||||||
|
} |
||||||
|
|
||||||
|
public int getB() { |
||||||
|
return Inner.this.getB(); |
||||||
|
} |
||||||
|
|
||||||
|
public int getStaticB(InnerInner innerinner) { |
||||||
|
return innerinner.getB(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int getB() { |
||||||
|
return b; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public InnerInner createInnerInner(int a) { |
||||||
|
return new InnerInner(a); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class Extended extends Inner.InnerInner{ |
||||||
|
Extended(Inner inner) { |
||||||
|
inner.super(3); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
InnerClass() { |
||||||
|
new Inner().createInnerInner(10).getB(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,253 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
class A { |
||||||
|
} |
||||||
|
|
||||||
|
interface I1 { |
||||||
|
} |
||||||
|
|
||||||
|
interface I2 { |
||||||
|
} |
||||||
|
|
||||||
|
interface I12 extends I1, I2 { |
||||||
|
} |
||||||
|
|
||||||
|
class B extends A implements I1 { |
||||||
|
} |
||||||
|
|
||||||
|
class C extends B implements I2, I12 { |
||||||
|
} |
||||||
|
|
||||||
|
class D extends A implements I12 { |
||||||
|
} |
||||||
|
|
||||||
|
class E extends A implements I2 { |
||||||
|
} |
||||||
|
|
||||||
|
public class Test { |
||||||
|
A a; |
||||||
|
B b; |
||||||
|
C c; |
||||||
|
D d; |
||||||
|
E e; |
||||||
|
|
||||||
|
I1 i1; |
||||||
|
I2 i2; |
||||||
|
I12 i12; |
||||||
|
|
||||||
|
boolean g_bo; |
||||||
|
byte g_by; |
||||||
|
short g_sh; |
||||||
|
int g_in; |
||||||
|
|
||||||
|
int z; |
||||||
|
int[]ain; |
||||||
|
|
||||||
|
void skip() { |
||||||
|
for (int i=0; i<3; i++) { |
||||||
|
if (z > 5) { |
||||||
|
for (int j=0; j<5; j++) { |
||||||
|
z++; |
||||||
|
} |
||||||
|
} |
||||||
|
i--; |
||||||
|
} |
||||||
|
} |
||||||
|
public void arithTest() { |
||||||
|
int a=1,b=2; |
||||||
|
boolean x = true,y = false; |
||||||
|
int c=0; |
||||||
|
skip(); |
||||||
|
if (x & y) { |
||||||
|
c = 5; |
||||||
|
skip(); |
||||||
|
x &= y; |
||||||
|
skip(); |
||||||
|
x = x | y; |
||||||
|
skip(); |
||||||
|
x ^= y; |
||||||
|
skip(); |
||||||
|
x = x && y; |
||||||
|
skip(); |
||||||
|
b <<= a; |
||||||
|
b <<= c; |
||||||
|
} |
||||||
|
a&=b; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void switchWhileTest() { |
||||||
|
int local_1__114 = g_in; |
||||||
|
int local_2__115 = 0; |
||||||
|
int local_3__116 = 0; |
||||||
|
int local_4__117 = 0; |
||||||
|
z = 5; |
||||||
|
switch (local_1__114) { |
||||||
|
case 1: |
||||||
|
while (local_4__117 == 0) { |
||||||
|
local_4__117 = 1; |
||||||
|
local_2__115 = g_in; |
||||||
|
local_3__116 = g_in; |
||||||
|
if (local_2__115 > 7) |
||||||
|
local_2__115 = local_2__115 - 4; |
||||||
|
int local_5__118 = 0; |
||||||
|
while (local_5__118 < 4) { |
||||||
|
int local_6__119 = 0; |
||||||
|
while (local_6__119 < 5) { |
||||||
|
if (ain[local_6__119] == local_2__115 + local_5__118 && ain[local_6__119] == local_3__116) |
||||||
|
local_4__117 = 0; |
||||||
|
local_6__119 += 1; |
||||||
|
} |
||||||
|
local_5__118 += 1; |
||||||
|
} |
||||||
|
} |
||||||
|
int local_5__120 = 0; |
||||||
|
while (local_5__120 < 5) { |
||||||
|
ain[z] = local_2__115 + local_5__120; |
||||||
|
ain[z] = local_3__116; |
||||||
|
z += 1; |
||||||
|
local_5__120 += 1; |
||||||
|
} |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
while (local_4__117 == 0) { |
||||||
|
local_4__117 = 1; |
||||||
|
local_2__115 = g_in; |
||||||
|
local_3__116 = g_in; |
||||||
|
if (local_3__116 > 7) |
||||||
|
local_3__116 = local_3__116 - 4; |
||||||
|
int local_5__121 = 0; |
||||||
|
while (local_5__121 < 4) { |
||||||
|
int local_6__122 = 0; |
||||||
|
while (local_6__122 < 4) { |
||||||
|
if (ain[local_6__122] == local_2__115 && ain[local_6__122] == local_3__116 + local_5__121) |
||||||
|
local_4__117 = 0; |
||||||
|
local_6__122 += 1; |
||||||
|
} |
||||||
|
local_5__121 += 1; |
||||||
|
} |
||||||
|
} |
||||||
|
int local_5__123 = 0; |
||||||
|
while (local_5__123 < 4) { |
||||||
|
ain[z] = local_2__115; |
||||||
|
ain[z] = local_3__116 + local_5__123; |
||||||
|
z += 1; |
||||||
|
local_5__123 += 1; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void intTypeTest() { |
||||||
|
boolean b = false; |
||||||
|
boolean abo[] = null; |
||||||
|
byte aby[] = null; |
||||||
|
byte by; |
||||||
|
int in; |
||||||
|
short sh; |
||||||
|
b = g_bo; |
||||||
|
in = g_sh; |
||||||
|
sh = (short)g_in; |
||||||
|
by = (byte)sh; |
||||||
|
sh = by; |
||||||
|
in = by; |
||||||
|
abo[0] = g_bo; |
||||||
|
abo[1] = false; |
||||||
|
abo[2] = true; |
||||||
|
aby[0] = g_by; |
||||||
|
aby[1] = 0; |
||||||
|
aby[2] = 1; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This is an example where our flow analysis doesn't find an |
||||||
|
* elegant solution. The reason is, that we try to make |
||||||
|
* while(true)-loops as small as possible (you can't see the real |
||||||
|
* end of the loop, if it is breaked there like here). |
||||||
|
* |
||||||
|
* Look at the assembler code and you know why my Decompiler has |
||||||
|
* problems with this. But the decompiler does produce compilable |
||||||
|
* code which produces the same assembler code. |
||||||
|
* |
||||||
|
* A solution would be, to make switches as big as possible (like we |
||||||
|
* already do it with try-catch-blocks). |
||||||
|
*/ |
||||||
|
void WhileTrueSwitch() { |
||||||
|
int i = 1; |
||||||
|
while (true) { |
||||||
|
switch (i) { |
||||||
|
case 0: |
||||||
|
return; |
||||||
|
case 1: |
||||||
|
i = 5; |
||||||
|
continue; |
||||||
|
case 2: |
||||||
|
i = 6; |
||||||
|
continue; |
||||||
|
case 3: |
||||||
|
throw new RuntimeException(); |
||||||
|
default: |
||||||
|
i = 7; |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
native void arrFunc(B[] b); |
||||||
|
|
||||||
|
/** |
||||||
|
* This is an example where it is really hard to know, which type |
||||||
|
* each local has. |
||||||
|
*/ |
||||||
|
void DifficultType () { |
||||||
|
B myB = c; |
||||||
|
C myC = c; |
||||||
|
I2 myI2 = c; |
||||||
|
I12 myI12 = c; |
||||||
|
boolean bool = true; |
||||||
|
B[] aB = new C[3]; |
||||||
|
arrFunc(new C[3]); |
||||||
|
|
||||||
|
while (bool) { |
||||||
|
if (bool) { |
||||||
|
i1 = myB; |
||||||
|
i2 = myC; |
||||||
|
i1 = aB[0]; |
||||||
|
} else if (bool) { |
||||||
|
i1 = myI12; |
||||||
|
i2 = myI2; |
||||||
|
} else { |
||||||
|
i1 = myC; |
||||||
|
i2 = myI12; |
||||||
|
} |
||||||
|
myB = b; |
||||||
|
if (bool) |
||||||
|
myI2 = i12; |
||||||
|
else { |
||||||
|
myI12 = d; |
||||||
|
myI2 = e; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* This is an example where it is really hard to know, which type |
||||||
|
* each local has. |
||||||
|
*/ |
||||||
|
void DifficultArrayType () { |
||||||
|
boolean bool = true; |
||||||
|
B[] aB = new C[3]; |
||||||
|
arrFunc(new C[3]); |
||||||
|
C[][][][][] x = new C[4][3][4][][]; |
||||||
|
int[][][][][] y = new int[1][2][][][]; |
||||||
|
|
||||||
|
while (bool) { |
||||||
|
if (bool) { |
||||||
|
i1 = aB[0]; |
||||||
|
aB[0] = b; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,20 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
public class TriadicExpr { |
||||||
|
int a,b,c,d,e,f,g,h,i,j; |
||||||
|
boolean bool; |
||||||
|
|
||||||
|
void test() { |
||||||
|
if( (a< b ? bool : (a<b))) |
||||||
|
a=b; |
||||||
|
else |
||||||
|
b=a; |
||||||
|
|
||||||
|
if ((a<b?b<a:i<j) ? (c<d ? e<f : g < h) : (j<i ? h<g:f<e)) |
||||||
|
a=(b<a ? g : h); |
||||||
|
else |
||||||
|
b=a; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
@ -0,0 +1,138 @@ |
|||||||
|
package jode.test; |
||||||
|
|
||||||
|
/** |
||||||
|
* This tests everything that has to do with a ExceptionHandler, that |
||||||
|
* is try, catch, finally and synchronized. |
||||||
|
*/ |
||||||
|
class TryCatch { |
||||||
|
|
||||||
|
int simple() { |
||||||
|
TryCatch i = null; |
||||||
|
try { |
||||||
|
foo(); |
||||||
|
} catch (RuntimeException ex) { |
||||||
|
ex.printStackTrace(); |
||||||
|
} catch (Exception ex) { |
||||||
|
return 0; |
||||||
|
} finally { |
||||||
|
simple(); |
||||||
|
} |
||||||
|
synchronized(this) { |
||||||
|
System.gc(); |
||||||
|
if (i != null) |
||||||
|
return -1; |
||||||
|
} |
||||||
|
synchronized(i) { |
||||||
|
foo(); |
||||||
|
} |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
int localsInCatch() { |
||||||
|
int a = 0; |
||||||
|
try { |
||||||
|
a = 1; |
||||||
|
foo(); |
||||||
|
a = 2; |
||||||
|
simple(); |
||||||
|
a = 3; |
||||||
|
localsInCatch(); |
||||||
|
a = 4; |
||||||
|
return 5; |
||||||
|
} catch (Exception ex) { |
||||||
|
return a; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int finallyBreaks() { |
||||||
|
try { |
||||||
|
simple(); |
||||||
|
throw new Exception(); |
||||||
|
} catch (Exception ex) { |
||||||
|
return 3; |
||||||
|
} finally { |
||||||
|
simple(); |
||||||
|
return 3; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int whileInTry() { |
||||||
|
int a=1; |
||||||
|
try { |
||||||
|
while (true) { |
||||||
|
a= 4; |
||||||
|
whileInTry(); |
||||||
|
} |
||||||
|
} finally { |
||||||
|
synchronized(this) { |
||||||
|
while (true) { |
||||||
|
foo(); |
||||||
|
if (a == 5) |
||||||
|
break; |
||||||
|
finallyBreaks(); |
||||||
|
} |
||||||
|
} |
||||||
|
return a; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void foo() { |
||||||
|
TryCatch local = null; |
||||||
|
while (true) { |
||||||
|
foo(); |
||||||
|
synchronized (this) { |
||||||
|
System.gc(); |
||||||
|
try { |
||||||
|
System.err.println(); |
||||||
|
} catch (RuntimeException ex) { |
||||||
|
ex.printStackTrace(); |
||||||
|
for (int i=0; i<4; i++) |
||||||
|
foo(); |
||||||
|
break; |
||||||
|
} finally { |
||||||
|
System.out.println(); |
||||||
|
for (int i=0; i<4; i++) |
||||||
|
foo(); |
||||||
|
System.out.println(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
synchronized (local) { |
||||||
|
local.foo(); |
||||||
|
} |
||||||
|
if (true) { |
||||||
|
synchronized (this) { |
||||||
|
try { |
||||||
|
System.err.println(); |
||||||
|
} finally { |
||||||
|
Thread.dumpStack(); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
System.out.println(); |
||||||
|
} |
||||||
|
|
||||||
|
void oneEntryFinally() { |
||||||
|
try { |
||||||
|
throw new RuntimeException("ex"); |
||||||
|
} finally { |
||||||
|
System.err.println("hallo"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void finallyMayBreak() { |
||||||
|
while(true) { |
||||||
|
try { |
||||||
|
System.err.println(); |
||||||
|
} finally { |
||||||
|
if (simple() < 2) |
||||||
|
break; |
||||||
|
else if (simple() < 3) |
||||||
|
return; |
||||||
|
} |
||||||
|
System.out.println(); |
||||||
|
} |
||||||
|
System.err.println(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue