public void outANonstaticInvokeExpr(ANonstaticInvokeExpr node) { List args; if (node.getArgList() != null) args = (List) mProductions.removeLast(); else args = new ArrayList(); SootMethodRef method = (SootMethodRef) mProductions.removeLast(); String local = (String) mProductions.removeLast(); Local l = (Local) mLocals.get(local); if (l == null) throw new RuntimeException("did not find local: " + local); Node invokeType = (Node) node.getNonstaticInvoke(); Expr invokeExpr; if (invokeType instanceof ASpecialNonstaticInvoke) { invokeExpr = Jimple.v().newSpecialInvokeExpr(l, method, args); } else if (invokeType instanceof AVirtualNonstaticInvoke) { invokeExpr = Jimple.v().newVirtualInvokeExpr(l, method, args); } else { if (debug) if (!(invokeType instanceof AInterfaceNonstaticInvoke)) throw new RuntimeException("expected interface invoke."); invokeExpr = Jimple.v().newInterfaceInvokeExpr(l, method, args); } mProductions.addLast(invokeExpr); }
public void outAIdentityNoTypeStatement(AIdentityNoTypeStatement node) { mProductions.removeLast(); // get rid of @caughtexception string presently on top of the stack Value local = (Value) mLocals.get(mProductions.removeLast()); // the local ref from it's identifier Unit u = Jimple.v().newIdentityStmt(local, Jimple.v().newCaughtExceptionRef()); mProductions.addLast(u); }
public void outAGotoStatement(AGotoStatement node) { String targetLabel = (String) mProductions.removeLast(); UnitBox box = Jimple.v().newStmtBox(null); Unit branch = Jimple.v().newGotoStmt(box); addBoxToPatch(targetLabel, box); mProductions.addLast(branch); }
public void outAIfStatement(AIfStatement node) { String targetLabel = (String) mProductions.removeLast(); Value condition = (Value) mProductions.removeLast(); UnitBox box = Jimple.v().newStmtBox(null); Unit u = Jimple.v().newIfStmt(condition, box); addBoxToPatch(targetLabel, box); mProductions.addLast(u); }
public void outAReturnStatement(AReturnStatement node) { Value v; Stmt s = null; if (node.getImmediate() != null) { v = (Value) mProductions.removeLast(); s = Jimple.v().newReturnStmt(v); } else { s = Jimple.v().newReturnVoidStmt(); } mProductions.addLast(s); }
public void outAAssignStatement(AAssignStatement node) { Value rvalue = (Value) mProductions.removeLast(); Value variable = (Value) mProductions.removeLast(); Unit u = Jimple.v().newAssignStmt(variable, rvalue); mProductions.addLast(u); }
public void outALookupswitchStatement(ALookupswitchStatement node) { List lookupValues = new ArrayList(); List targets = new ArrayList(); UnitBox defaultTarget = null; if (node.getCaseStmt() != null) { int size = node.getCaseStmt().size(); for (int i = 0; i < size; i++) { Object valueTargetPair = mProductions.removeLast(); if (valueTargetPair instanceof UnitBox) { if (defaultTarget != null) throw new RuntimeException("error: can't ;have more than 1 default stmt"); defaultTarget = (UnitBox) valueTargetPair; } else { Object[] pair = (Object[]) valueTargetPair; lookupValues.add(0, pair[0]); targets.add(0, pair[1]); } } } else { throw new RuntimeException("error: switch stmt has no case stmts"); } Value key = (Value) mProductions.removeLast(); Unit switchStmt = Jimple.v().newLookupSwitchStmt(key, lookupValues, targets, defaultTarget); mProductions.addLast(switchStmt); }
public void outAInvokeStatement(AInvokeStatement node) { Value op = (Value) mProductions.removeLast(); Unit u = Jimple.v().newInvokeStmt(op); mProductions.addLast(u); }
public void outAArrayRef(AArrayRef node) { Value immediate = (Value) mProductions.removeLast(); String identifier = (String) mProductions.removeLast(); Local l = (Local) mLocals.get(identifier); if (l == null) throw new RuntimeException("did not find local: " + identifier); mProductions.addLast(Jimple.v().newArrayRef(l, immediate)); }
public void outALocalFieldRef(ALocalFieldRef node) { SootFieldRef field = (SootFieldRef) mProductions.removeLast(); String local = (String) mProductions.removeLast(); Local l = (Local) mLocals.get(local); if (l == null) throw new RuntimeException("did not find local: " + local); mProductions.addLast(Jimple.v().newInstanceFieldRef(l, field)); }
public void outACatchClause(ACatchClause node) { String exceptionName; UnitBox withUnit, fromUnit, toUnit; withUnit = Jimple.v().newStmtBox(null); addBoxToPatch((String) mProductions.removeLast(), withUnit); toUnit = Jimple.v().newStmtBox(null); addBoxToPatch((String) mProductions.removeLast(), toUnit); fromUnit = Jimple.v().newStmtBox(null); addBoxToPatch((String) mProductions.removeLast(), fromUnit); exceptionName = (String) mProductions.removeLast(); Trap trap = Jimple.v().newTrap(mResolver.makeClassRef(exceptionName), fromUnit, toUnit, withUnit); mProductions.addLast(trap); }
public void outAIdentityStatement(AIdentityStatement node) { Type identityRefType = (Type) mProductions.removeLast(); String atClause = (String) mProductions.removeLast(); Value local = (Value) mLocals.get(mProductions.removeLast()); // the local ref from it's identifier Value ref = null; if (atClause.startsWith("@this")) { ref = Jimple.v().newThisRef((RefType) identityRefType); } else if (atClause.startsWith("@parameter")) { int index = Integer.parseInt(atClause.substring(10, atClause.length() - 1)); ref = Jimple.v().newParameterRef(identityRefType, index); } else throw new RuntimeException( "shouldn't @caughtexception be handled by outAIdentityNoTypeStatement: got" + atClause); Unit u = Jimple.v().newIdentityStmt(local, ref); mProductions.addLast(u); }
public void outADeclaration(ADeclaration node) { List localNameList = (List) mProductions.removeLast(); Type type = (Type) mProductions.removeLast(); Iterator it = localNameList.iterator(); List localList = new ArrayList(); while (it.hasNext()) { Local l = Jimple.v().newLocal((String) it.next(), type); mLocals.put(l.getName(), l); localList.add(l); } mProductions.addLast(localList); }
public void outAStaticInvokeExpr(AStaticInvokeExpr node) { List args; if (node.getArgList() != null) args = (List) mProductions.removeLast(); else args = new ArrayList(); SootMethodRef method = (SootMethodRef) mProductions.removeLast(); method = Scene.v() .makeMethodRef( method.declaringClass(), method.name(), method.parameterTypes(), method.returnType(), true); mProductions.addLast(Jimple.v().newStaticInvokeExpr(method, args)); }
public void outAMultiNewExpr(AMultiNewExpr node) { LinkedList arrayDesc = node.getArrayDescriptor(); int descCnt = arrayDesc.size(); List sizes = new LinkedList(); Iterator it = arrayDesc.iterator(); while (it.hasNext()) { AArrayDescriptor o = (AArrayDescriptor) it.next(); if (o.getImmediate() != null) sizes.add(0, (Value) mProductions.removeLast()); else break; } Type type = (Type) mProductions.removeLast(); ArrayType arrayType = ArrayType.v(type, descCnt); mProductions.addLast(Jimple.v().newNewMultiArrayExpr(arrayType, sizes)); }
/* case_stmt = case_label colon goto_stmt; */ public void outACaseStmt(ACaseStmt node) { String labelName = (String) mProductions.removeLast(); UnitBox box = Jimple.v().newStmtBox(null); addBoxToPatch(labelName, box); Value labelValue = null; if (node.getCaseLabel() instanceof AConstantCaseLabel) labelValue = (Value) mProductions.removeLast(); // if labelValue == null, this is the default label. if (labelValue == null) mProductions.addLast(box); else { Object[] valueTargetPair = new Object[2]; valueTargetPair[0] = labelValue; valueTargetPair[1] = box; mProductions.addLast(valueTargetPair); } }
public void outATableswitchStatement(ATableswitchStatement node) { List targets = new ArrayList(); UnitBox defaultTarget = null; int lowIndex = 0, highIndex = 0; if (node.getCaseStmt() != null) { int size = node.getCaseStmt().size(); for (int i = 0; i < size; i++) { Object valueTargetPair = mProductions.removeLast(); if (valueTargetPair instanceof UnitBox) { if (defaultTarget != null) throw new RuntimeException("error: can't ;have more than 1 default stmt"); defaultTarget = (UnitBox) valueTargetPair; } else { Object[] pair = (Object[]) valueTargetPair; if ((i == 0 && defaultTarget == null) || (i == 1 && defaultTarget != null)) highIndex = ((IntConstant) pair[0]).value; if (i == (size - 1)) lowIndex = ((IntConstant) pair[0]).value; targets.add(0, pair[1]); } } } else { throw new RuntimeException("error: switch stmt has no case stmts"); } Value key = (Value) mProductions.removeLast(); Unit switchStmt = Jimple.v().newTableSwitchStmt(key, lowIndex, highIndex, targets, defaultTarget); mProductions.addLast(switchStmt); }
/* expression = {new} new_expr | {cast} l_paren nonvoid_type r_paren local_name | {instanceof} immediate instanceof nonvoid_type | {invoke} invoke_expr | {reference} reference | {binop} binop_expr | {unop} unop_expr | {immediate} immediate; */ public void outACastExpression(ACastExpression node) { Value val = (Value) mProductions.removeLast(); Type type = (Type) mProductions.removeLast(); mProductions.addLast(Jimple.v().newCastExpr(val, type)); }
public void outASigFieldRef(ASigFieldRef node) { SootFieldRef field = (SootFieldRef) mProductions.removeLast(); field = Scene.v().makeFieldRef(field.declaringClass(), field.name(), field.type(), true); mProductions.addLast(Jimple.v().newStaticFieldRef(field)); }
/* unop = {lengthof} lengthof | {neg} neg; */ public void outALengthofUnop(ALengthofUnop node) { mProductions.addLast(Jimple.v().newLengthExpr(mValue)); }
public void outAInstanceofExpression(AInstanceofExpression node) { Type nonvoidType = (Type) mProductions.removeLast(); Value immediate = (Value) mProductions.removeLast(); mProductions.addLast(Jimple.v().newInstanceOfExpr(immediate, nonvoidType)); }
public void outAFullMethodBody(AFullMethodBody node) { Object catchClause = null; JimpleBody jBody = Jimple.v().newBody(); if (node.getCatchClause() != null) { int size = node.getCatchClause().size(); for (int i = 0; i < size; i++) jBody.getTraps().addFirst((Trap) mProductions.removeLast()); } if (node.getStatement() != null) { int size = node.getStatement().size(); Unit lastStmt = null; for (int i = 0; i < size; i++) { Object o = mProductions.removeLast(); if (o instanceof Unit) { jBody.getUnits().addFirst(o); lastStmt = (Unit) o; } else if (o instanceof String) { if (lastStmt == null) throw new RuntimeException("impossible"); mLabelToStmtMap.put(o, lastStmt); } else throw new RuntimeException("impossible"); } } if (node.getDeclaration() != null) { int size = node.getDeclaration().size(); for (int i = 0; i < size; i++) { List localList = (List) mProductions.removeLast(); int listSize = localList.size(); for (int j = listSize - 1; j >= 0; j--) jBody.getLocals().addFirst(localList.get(j)); } } Iterator it = mLabelToPatchList.keySet().iterator(); while (it.hasNext()) { String label = (String) it.next(); Unit target = (Unit) mLabelToStmtMap.get(label); Iterator patchIt = ((List) mLabelToPatchList.get(label)).iterator(); while (patchIt.hasNext()) { UnitBox box = (UnitBox) patchIt.next(); box.setUnit(target); } } /* Iterator it = mLabelToStmtMap.keySet().iterator(); while(it.hasNext()) { String label = (String) it.next(); Unit target = (Unit) mLabelToStmtMap.get(label); List l = (List) mLabelToPatchList.get(label); if(l != null) { Iterator patchIt = l.iterator(); while(patchIt.hasNext()) { UnitBox box = (UnitBox) patchIt.next(); box.setUnit(target); } } } */ mProductions.addLast(jBody); }
public void outANegUnop(ANegUnop node) { mProductions.addLast(Jimple.v().newNegExpr(mValue)); }
public void outADivBinop(ADivBinop node) { mProductions.addLast(Jimple.v().newDivExpr(mValue, mValue)); }
public void outAArrayNewExpr(AArrayNewExpr node) { Value size = (Value) mProductions.removeLast(); Type type = (Type) mProductions.removeLast(); mProductions.addLast(Jimple.v().newNewArrayExpr(type, size)); }
public void outANopStatement(ANopStatement node) { Unit u = Jimple.v().newNopStmt(); mProductions.addLast(u); }
public void outAExitmonitorStatement(AExitmonitorStatement node) { Value op = (Value) mProductions.removeLast(); Unit u = Jimple.v().newExitMonitorStmt(op); mProductions.addLast(u); }
public void outABreakpointStatement(ABreakpointStatement node) { Unit u = Jimple.v().newBreakpointStmt(); mProductions.addLast(u); }
public void outAMultBinop(AMultBinop node) { mProductions.addLast(Jimple.v().newMulExpr(mValue, mValue)); }
/* new_expr = {simple} new base_type | {array} newarray l_paren nonvoid_type r_paren fixed_array_descriptor | {multi} newmultiarray l_paren base_type r_paren array_descriptor+; */ public void outASimpleNewExpr(ASimpleNewExpr node) { mProductions.addLast(Jimple.v().newNewExpr((RefType) mProductions.removeLast())); }