git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@263 379699f6-c40d-0410-875b-85095c16579estable
parent
1742ed3380
commit
f1bc11a0f2
@ -0,0 +1,98 @@ |
|||||||
|
/* |
||||||
|
* SyntheticAnalyzer (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.decompiler; |
||||||
|
import jode.Decompiler; |
||||||
|
import jode.flow.*; |
||||||
|
import jode.expr.*; |
||||||
|
import jode.Type; |
||||||
|
import jode.MethodType; |
||||||
|
|
||||||
|
public class SyntheticAnalyzer { |
||||||
|
public final static int UNKNOWN = 0; |
||||||
|
public final static int GETCLASS = 1; |
||||||
|
public final static int GETFIELD = 2; |
||||||
|
public final static int PUTFIELD = 3; |
||||||
|
|
||||||
|
int type = UNKNOWN; |
||||||
|
MethodAnalyzer method; |
||||||
|
|
||||||
|
public SyntheticAnalyzer(MethodAnalyzer method) { |
||||||
|
this.method = method; |
||||||
|
if (method.getName().equals("class$")) |
||||||
|
if (!checkGetClass() && Decompiler.isVerbose) |
||||||
|
Decompiler.err.println("class$ seems to be wrong"); |
||||||
|
} |
||||||
|
|
||||||
|
boolean checkGetClass() { |
||||||
|
MethodType type = method.getType(); |
||||||
|
if (!type.isStatic() |
||||||
|
|| !type.getReturnType().isOfType(Type.tJavaLangClass) |
||||||
|
|| type.getParameterTypes().length != 1 |
||||||
|
|| !type.getParameterTypes()[0].isOfType(Type.tString)) |
||||||
|
return false; |
||||||
|
|
||||||
|
FlowBlock flow = method.getMethodHeader(); |
||||||
|
if (!flow.hasNoJumps()) |
||||||
|
return false; |
||||||
|
StructuredBlock tryblock = flow.getBlock(); |
||||||
|
if (!(tryblock instanceof TryBlock)) |
||||||
|
return false; |
||||||
|
StructuredBlock[] subBlocks = tryblock.getSubBlocks(); |
||||||
|
if (subBlocks.length != 2 |
||||||
|
|| !(subBlocks[0] instanceof ReturnBlock) |
||||||
|
|| !(subBlocks[1] instanceof CatchBlock)) |
||||||
|
return false; |
||||||
|
|
||||||
|
// Now check the return Block, it should be
|
||||||
|
// return Class.forName(local_0);
|
||||||
|
ReturnBlock ret = (ReturnBlock) subBlocks[0]; |
||||||
|
Expression retExpr = ret.getInstruction(); |
||||||
|
if (!(retExpr instanceof ComplexExpression) |
||||||
|
|| !(retExpr.getOperator() instanceof InvokeOperator)) |
||||||
|
return false; |
||||||
|
InvokeOperator invoke = (InvokeOperator) retExpr.getOperator(); |
||||||
|
if (!invoke.isStatic() |
||||||
|
|| !invoke.getClassType().equals(Type.tJavaLangClass) |
||||||
|
|| !(invoke.getMethodType().getReturnType() |
||||||
|
.equals(Type.tJavaLangClass)) |
||||||
|
|| invoke.getMethodType().getParameterTypes().length != 1 |
||||||
|
|| !(invoke.getMethodType().getParameterTypes()[0] |
||||||
|
.equals(Type.tString)) |
||||||
|
|| !invoke.getMethodName().equals("forName")) |
||||||
|
return false; |
||||||
|
|
||||||
|
Expression[] subExpr = |
||||||
|
((ComplexExpression) retExpr).getSubExpressions(); |
||||||
|
if (!(subExpr[0] instanceof LocalLoadOperator) |
||||||
|
|| ((LocalLoadOperator) subExpr[0]).getLocalInfo().getSlot() != 0) |
||||||
|
return false; |
||||||
|
|
||||||
|
// Now check the CatchBlock it should contain (we don't check all):
|
||||||
|
// throw new NoClassDefFoundError(exception.getMessage());
|
||||||
|
CatchBlock catchBlock = (CatchBlock) subBlocks[1]; |
||||||
|
StructuredBlock subBlock = catchBlock.getSubBlocks()[0]; |
||||||
|
if (!(subBlock instanceof ThrowBlock) |
||||||
|
|| !(catchBlock.getExceptionType().equals |
||||||
|
(Type.tClass("java.lang.ClassNotFoundException")))) |
||||||
|
return false; |
||||||
|
this.type = GETCLASS; |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue