git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@273 379699f6-c40d-0410-875b-85095c16579estable
parent
a0b46d37c5
commit
bd06c30075
@ -0,0 +1,91 @@ |
||||
/* |
||||
* CreateClassField (c) 1998 Jochen Hoenicke |
||||
* |
||||
* You may distribute under the terms of the GNU General Public License. |
||||
* |
||||
* IN NO EVENT SHALL JOCHEN HOENICKE BE LIABLE TO ANY PARTY FOR DIRECT, |
||||
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF |
||||
* THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF JOCHEN HOENICKE |
||||
* HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
* JOCHEN HOENICKE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
||||
* PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" |
||||
* BASIS, AND JOCHEN HOENICKE HAS NO OBLIGATION TO PROVIDE MAINTENANCE, |
||||
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
||||
* |
||||
* $Id$ |
||||
*/ |
||||
|
||||
package jode.flow; |
||||
import jode.expr.*; |
||||
import jode.Type; |
||||
import jode.decompiler.LocalInfo; |
||||
|
||||
public class CreateClassField { |
||||
|
||||
|
||||
public static boolean transform(IfThenElseBlock ifBlock, |
||||
StructuredBlock last) { |
||||
// convert
|
||||
// if (class$classname == null)
|
||||
// class$classname = class$("java.lang.Object");
|
||||
// to
|
||||
// if (classname.class == null) {
|
||||
// }
|
||||
if (!(ifBlock.cond instanceof ComplexExpression) |
||||
|| !(ifBlock.cond.getOperator() instanceof CompareUnaryOperator) |
||||
|| !(ifBlock.cond.getOperator().getOperatorIndex() |
||||
== Operator.EQUALS_OP) |
||||
|| !(ifBlock.thenBlock instanceof InstructionBlock) |
||||
|| ifBlock.elseBlock != null) |
||||
return false; |
||||
|
||||
if (ifBlock.thenBlock.jump != null |
||||
&& (ifBlock.jump == null |
||||
|| (ifBlock.jump.destination |
||||
!= ifBlock.thenBlock.jump.destination))) |
||||
return false; |
||||
|
||||
ComplexExpression cmp = (ComplexExpression) ifBlock.cond; |
||||
Expression instr = |
||||
((InstructionBlock)ifBlock.thenBlock).getInstruction(); |
||||
if (!(cmp.getSubExpressions()[0] instanceof GetFieldOperator) |
||||
|| !(instr instanceof ComplexExpression) |
||||
|| !(instr.getOperator() instanceof PutFieldOperator)) |
||||
return false; |
||||
|
||||
ComplexExpression ass = (ComplexExpression) instr; |
||||
PutFieldOperator put = (PutFieldOperator) ass.getOperator(); |
||||
if (!put.isSynthetic() |
||||
|| !put.matches((GetFieldOperator)cmp.getSubExpressions()[0]) |
||||
|| !(ass.getSubExpressions()[0] instanceof ComplexExpression) |
||||
|| !(ass.getSubExpressions()[0].getOperator() |
||||
instanceof InvokeOperator)) |
||||
return false; |
||||
|
||||
InvokeOperator invoke = (InvokeOperator) |
||||
ass.getSubExpressions()[0].getOperator(); |
||||
Expression param = |
||||
((ComplexExpression)ass.getSubExpressions()[0]) |
||||
.getSubExpressions()[0]; |
||||
if (invoke.isGetClass() |
||||
&& param instanceof ConstOperator |
||||
&& param.getType().equals(Type.tString)) { |
||||
String clazz = ((ConstOperator)param).getValue(); |
||||
clazz = clazz.substring(1, clazz.length()-1); |
||||
if (put.getFieldName() |
||||
.equals("class$" + clazz.replace('.', '$')) |
||||
|| put.getFieldName() |
||||
.equals("class$L" + clazz.replace('.', '$'))) { |
||||
cmp.setSubExpressions |
||||
(0, new ClassFieldOperator(Type.tClass(clazz))); |
||||
EmptyBlock empty = new EmptyBlock(); |
||||
empty.moveJump(ifBlock.thenBlock.jump); |
||||
ifBlock.setThenBlock(empty); |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,74 @@ |
||||
package jode.test; |
||||
import java.io.*; |
||||
import java.lang.reflect.*; |
||||
|
||||
public class ArrayTest { |
||||
Serializable s; |
||||
Serializable[] u; |
||||
Cloneable c; |
||||
|
||||
public void test() { |
||||
int[] i = {4,3,2}; |
||||
i = new int[] {1, 2, 3}; |
||||
int[] j = new int[] {4,5,6}; |
||||
|
||||
int[][] k = {i,j}; |
||||
|
||||
u = k; |
||||
s = i; |
||||
c = i; |
||||
} |
||||
|
||||
public void typetest() { |
||||
int[] arr = null; |
||||
s = arr; |
||||
c = arr; |
||||
arr[0] = 3; |
||||
arr = arr != null ? arr : new int[4]; |
||||
} |
||||
|
||||
public static void main(String[] param) { |
||||
int[] arr = new int[4]; |
||||
Class cls = arr.getClass(); |
||||
System.err.println("int[].getClass() is: "+cls); |
||||
System.err.println("int[].getClass().getSuperclass() is: " |
||||
+ cls.getSuperclass()); |
||||
Class[] ifaces = cls.getInterfaces(); |
||||
System.err.print("int[].getClass().getInterfaces() are: "); |
||||
for (int i = 0; i < ifaces.length; i++) { |
||||
if (i > 0) |
||||
System.err.print(", "); |
||||
System.err.print(ifaces[i]); |
||||
} |
||||
System.err.println(); |
||||
|
||||
Field[] fields = cls.getDeclaredFields(); |
||||
System.err.print("int[].getClass().getDeclaredFields() are: "); |
||||
for (int i = 0; i < fields.length; i++) { |
||||
if (i > 0) |
||||
System.err.print(", "); |
||||
System.err.print(fields[i]); |
||||
} |
||||
System.err.println(); |
||||
|
||||
Method[] methods = cls.getDeclaredMethods(); |
||||
System.err.print("int[].getClass().getDeclaredMethods() are: "); |
||||
for (int i = 0; i < methods.length; i++) { |
||||
if (i > 0) |
||||
System.err.print(", "); |
||||
System.err.print(methods[i]); |
||||
} |
||||
System.err.println(); |
||||
|
||||
Object o = arr; |
||||
System.err.println("arr instanceof Serializable: "+ |
||||
(o instanceof Serializable)); |
||||
System.err.println("arr instanceof Externalizable: "+ |
||||
(o instanceof Externalizable)); |
||||
System.err.println("arr instanceof Cloneable: "+ |
||||
(o instanceof Cloneable)); |
||||
// System.err.println("arr instanceof Comparable: "+
|
||||
// (o instanceof Comparable));
|
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue