Search in sources :

Example 1 with DSpecialInvokeExpr

use of soot.dava.internal.javaRep.DSpecialInvokeExpr in project soot by Sable.

the class DavaBody method javafy_invoke_expr.

private void javafy_invoke_expr(ValueBox vb) {
    InvokeExpr ie = (InvokeExpr) vb.getValue();
    String className = ie.getMethodRef().declaringClass().toString();
    String packageName = ie.getMethodRef().declaringClass().getJavaPackageName();
    String classPackageName = packageName;
    if (className.lastIndexOf('.') > 0) {
        // 0 doesnt make sense
        classPackageName = className.substring(0, className.lastIndexOf('.'));
    }
    if (!packageName.equals(classPackageName))
        throw new DecompilationException("Unable to retrieve package name for identifier. Please report to developer.");
    addToImportList(className);
    for (int i = 0; i < ie.getArgCount(); i++) {
        Value arg = ie.getArg(i);
        if (arg instanceof IntConstant)
            ie.getArgBox(i).setValue(DIntConstant.v(((IntConstant) arg).value, ie.getMethodRef().parameterType(i)));
        else
            javafy(ie.getArgBox(i));
    }
    if (ie instanceof InstanceInvokeExpr) {
        javafy(((InstanceInvokeExpr) ie).getBaseBox());
        if (ie instanceof VirtualInvokeExpr) {
            VirtualInvokeExpr vie = (VirtualInvokeExpr) ie;
            vb.setValue(new DVirtualInvokeExpr(vie.getBase(), vie.getMethodRef(), vie.getArgs(), thisLocals));
        } else if (ie instanceof SpecialInvokeExpr) {
            SpecialInvokeExpr sie = (SpecialInvokeExpr) ie;
            vb.setValue(new DSpecialInvokeExpr(sie.getBase(), sie.getMethodRef(), sie.getArgs()));
        } else if (ie instanceof InterfaceInvokeExpr) {
            InterfaceInvokeExpr iie = (InterfaceInvokeExpr) ie;
            vb.setValue(new DInterfaceInvokeExpr(iie.getBase(), iie.getMethodRef(), iie.getArgs()));
        } else
            throw new RuntimeException("InstanceInvokeExpr " + ie + " not javafied correctly");
    } else if (ie instanceof StaticInvokeExpr) {
        StaticInvokeExpr sie = (StaticInvokeExpr) ie;
        if (sie instanceof NewInvokeExpr) {
            NewInvokeExpr nie = (NewInvokeExpr) sie;
            RefType rt = nie.getBaseType();
            className = rt.getSootClass().toString();
            packageName = rt.getSootClass().getJavaPackageName();
            classPackageName = packageName;
            if (className.lastIndexOf('.') > 0) {
                // 0 doesnt make sense
                classPackageName = className.substring(0, className.lastIndexOf('.'));
            }
            if (!packageName.equals(classPackageName))
                throw new DecompilationException("Unable to retrieve package name for identifier. Please report to developer.");
            addToImportList(className);
            vb.setValue(new DNewInvokeExpr((RefType) nie.getType(), nie.getMethodRef(), nie.getArgs()));
        } else {
            SootMethodRef methodRef = sie.getMethodRef();
            className = methodRef.declaringClass().toString();
            packageName = methodRef.declaringClass().getJavaPackageName();
            classPackageName = packageName;
            if (className.lastIndexOf('.') > 0) {
                // 0 doesnt make sense
                classPackageName = className.substring(0, className.lastIndexOf('.'));
            }
            if (!packageName.equals(classPackageName))
                throw new DecompilationException("Unable to retrieve package name for identifier. Please report to developer.");
            addToImportList(className);
            // addPackage(methodRef.declaringClass().getJavaPackageName());
            vb.setValue(new DStaticInvokeExpr(methodRef, sie.getArgs()));
        }
    } else
        throw new RuntimeException("InvokeExpr " + ie + " not javafied correctly");
}
Also used : DNewInvokeExpr(soot.dava.internal.javaRep.DNewInvokeExpr) NewInvokeExpr(soot.grimp.NewInvokeExpr) DSpecialInvokeExpr(soot.dava.internal.javaRep.DSpecialInvokeExpr) SootMethodRef(soot.SootMethodRef) SpecialInvokeExpr(soot.jimple.SpecialInvokeExpr) DSpecialInvokeExpr(soot.dava.internal.javaRep.DSpecialInvokeExpr) InstanceInvokeExpr(soot.jimple.InstanceInvokeExpr) InterfaceInvokeExpr(soot.jimple.InterfaceInvokeExpr) DInterfaceInvokeExpr(soot.dava.internal.javaRep.DInterfaceInvokeExpr) DInterfaceInvokeExpr(soot.dava.internal.javaRep.DInterfaceInvokeExpr) DVirtualInvokeExpr(soot.dava.internal.javaRep.DVirtualInvokeExpr) DStaticInvokeExpr(soot.dava.internal.javaRep.DStaticInvokeExpr) StaticInvokeExpr(soot.jimple.StaticInvokeExpr) RefType(soot.RefType) DNewInvokeExpr(soot.dava.internal.javaRep.DNewInvokeExpr) DNewInvokeExpr(soot.dava.internal.javaRep.DNewInvokeExpr) InterfaceInvokeExpr(soot.jimple.InterfaceInvokeExpr) SpecialInvokeExpr(soot.jimple.SpecialInvokeExpr) DInterfaceInvokeExpr(soot.dava.internal.javaRep.DInterfaceInvokeExpr) InstanceInvokeExpr(soot.jimple.InstanceInvokeExpr) NewInvokeExpr(soot.grimp.NewInvokeExpr) DVirtualInvokeExpr(soot.dava.internal.javaRep.DVirtualInvokeExpr) VirtualInvokeExpr(soot.jimple.VirtualInvokeExpr) InvokeExpr(soot.jimple.InvokeExpr) DStaticInvokeExpr(soot.dava.internal.javaRep.DStaticInvokeExpr) StaticInvokeExpr(soot.jimple.StaticInvokeExpr) DSpecialInvokeExpr(soot.dava.internal.javaRep.DSpecialInvokeExpr) DStaticInvokeExpr(soot.dava.internal.javaRep.DStaticInvokeExpr) Value(soot.Value) IntConstant(soot.jimple.IntConstant) DIntConstant(soot.dava.internal.javaRep.DIntConstant) DVirtualInvokeExpr(soot.dava.internal.javaRep.DVirtualInvokeExpr) VirtualInvokeExpr(soot.jimple.VirtualInvokeExpr)

Example 2 with DSpecialInvokeExpr

use of soot.dava.internal.javaRep.DSpecialInvokeExpr in project soot by Sable.

the class SuperFirstStmtHandler method changeOriginalAST.

/*
	 * Remove the entire body and replace with the statement this(args1,
	 * B.preInit(args1));
	 */
public boolean changeOriginalAST() {
    // argsOne followed by a method call to preInit
    if (originalConstructorExpr == null) {
        // System.out.println("originalConstructorExpr is null");
        return false;
    }
    List thisArgList = new ArrayList();
    thisArgList.addAll(argsOneValues);
    DStaticInvokeExpr newInvokeExpr = new DStaticInvokeExpr(newSootPreInitMethod.makeRef(), argsOneValues);
    thisArgList.add(newInvokeExpr);
    // the methodRef of themethod to be called is the new constructor we
    // created
    InstanceInvokeExpr tempExpr = new DSpecialInvokeExpr(originalConstructorExpr.getBase(), newConstructor.makeRef(), thisArgList);
    originalDavaBody.set_ConstructorExpr(tempExpr);
    // create Invoke Stmt with tempExpr as the expression
    GInvokeStmt s = new GInvokeStmt(tempExpr);
    originalDavaBody.set_ConstructorUnit(s);
    // originalASTMethod has to be made empty
    originalASTMethod.setDeclarations(new ASTStatementSequenceNode(new ArrayList<AugmentedStmt>()));
    originalASTMethod.replaceBody(new ArrayList<Object>());
    return true;
}
Also used : DSpecialInvokeExpr(soot.dava.internal.javaRep.DSpecialInvokeExpr) DStaticInvokeExpr(soot.dava.internal.javaRep.DStaticInvokeExpr) GInvokeStmt(soot.grimp.internal.GInvokeStmt) ArrayList(java.util.ArrayList) InstanceInvokeExpr(soot.jimple.InstanceInvokeExpr) List(java.util.List) ArrayList(java.util.ArrayList) ASTStatementSequenceNode(soot.dava.internal.AST.ASTStatementSequenceNode)

Aggregations

DSpecialInvokeExpr (soot.dava.internal.javaRep.DSpecialInvokeExpr)2 DStaticInvokeExpr (soot.dava.internal.javaRep.DStaticInvokeExpr)2 InstanceInvokeExpr (soot.jimple.InstanceInvokeExpr)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1 RefType (soot.RefType)1 SootMethodRef (soot.SootMethodRef)1 Value (soot.Value)1 ASTStatementSequenceNode (soot.dava.internal.AST.ASTStatementSequenceNode)1 DIntConstant (soot.dava.internal.javaRep.DIntConstant)1 DInterfaceInvokeExpr (soot.dava.internal.javaRep.DInterfaceInvokeExpr)1 DNewInvokeExpr (soot.dava.internal.javaRep.DNewInvokeExpr)1 DVirtualInvokeExpr (soot.dava.internal.javaRep.DVirtualInvokeExpr)1 NewInvokeExpr (soot.grimp.NewInvokeExpr)1 GInvokeStmt (soot.grimp.internal.GInvokeStmt)1 IntConstant (soot.jimple.IntConstant)1 InterfaceInvokeExpr (soot.jimple.InterfaceInvokeExpr)1 InvokeExpr (soot.jimple.InvokeExpr)1 SpecialInvokeExpr (soot.jimple.SpecialInvokeExpr)1 StaticInvokeExpr (soot.jimple.StaticInvokeExpr)1