private void assign(Expr source, Variable target) { AssignmentStatement stmt = Statement.assign(Expr.var(target.getIndex()), source); stmt.setLocation(currentLocation); statements.add(stmt); }
@Override public void visit(PutElementInstruction insn) { Expr subscript = Expr.subscript(Expr.var(insn.getArray().getIndex()), Expr.var(insn.getIndex().getIndex()), map(insn.getType())); AssignmentStatement stmt = Statement.assign(subscript, Expr.var(insn.getValue().getIndex())); stmt.setLocation(currentLocation); statements.add(stmt); }
@Override public void visit(ExitInstruction insn) { ReturnStatement stmt = Statement.exitFunction(insn.getValueToReturn() != null ? Expr.var(insn.getValueToReturn().getIndex()) : null); stmt.setLocation(currentLocation); statements.add(stmt); }
@Override public void visit(MonitorExitInstruction insn) { MonitorExitStatement stmt = new MonitorExitStatement(); stmt.setLocation(currentLocation); stmt.setObjectRef(Expr.var(insn.getObjectRef().getIndex())); statements.add(stmt); } }
@Override public void visit(RaiseInstruction insn) { ThrowStatement stmt = new ThrowStatement(); stmt.setLocation(currentLocation); stmt.setException(Expr.var(insn.getException().getIndex())); statements.add(stmt); }
@Override public void visit(MonitorEnterInstruction insn) { MonitorEnterStatement stmt = new MonitorEnterStatement(); stmt.setLocation(currentLocation); stmt.setObjectRef(Expr.var(insn.getObjectRef().getIndex())); async = false; statements.add(stmt); }
@Override public void visit(ConstructMultiArrayInstruction insn) { Expr[] dimensionExprs = new Expr[insn.getDimensions().size()]; for (int i = 0; i < dimensionExprs.length; ++i) { dimensionExprs[i] = Expr.var(insn.getDimensions().get(i).getIndex()); } assign(Expr.createArray(insn.getItemType(), dimensionExprs), insn.getReceiver()); }
private Expr compare(BinaryOperation op, OperationType type, Variable value) { Expr expr = Expr.binary(op, type, Expr.var(value.getIndex()), Expr.constant(0)); expr.setLocation(currentLocation); return expr; }
@Override public void visit(CastInstruction insn) { assign(Expr.var(insn.getValue().getIndex()), insn.getReceiver()); }
@Override public void visit(PutFieldInstruction insn) { Expr right = Expr.var(insn.getValue().getIndex()); Expr left; if (insn.getInstance() != null) { left = Expr.qualify(Expr.var(insn.getInstance().getIndex()), insn.getField()); } else { left = Expr.qualify(null, insn.getField()); } AssignmentStatement stmt = Statement.assign(left, right); stmt.setLocation(currentLocation); statements.add(stmt); }
@Override public void visit(NullCheckInstruction insn) { assign(Expr.unary(UnaryOperation.NULL_CHECK, null, Expr.var(insn.getValue().getIndex())), insn.getReceiver()); }
@Override public void visit(ArrayLengthInstruction insn) { assign(Expr.unary(UnaryOperation.LENGTH, null, Expr.var(insn.getArray().getIndex())), insn.getReceiver()); }
@Override public void visit(CloneArrayInstruction insn) { assign(Expr.invoke(CLONE_METHOD, Expr.var(insn.getArray().getIndex()), new Expr[0]), insn.getReceiver()); }
@Override public void visit(IsInstanceInstruction insn) { assign(Expr.instanceOf(Expr.var(insn.getValue().getIndex()), insn.getType()), insn.getReceiver()); }
@Override public void visit(ConstructArrayInstruction insn) { assign(Expr.createArray(insn.getItemType(), Expr.var(insn.getSize().getIndex())), insn.getReceiver()); }
@Override public void visit(NegateInstruction insn) { assign(Expr.unary(UnaryOperation.NEGATE, mapOperandType(insn.getOperandType()), Expr.var(insn.getOperand().getIndex())), insn.getReceiver()); }
@Override public void visit(UnwrapArrayInstruction insn) { UnwrapArrayExpr unwrapExpr = new UnwrapArrayExpr(map(insn.getElementType())); unwrapExpr.setArray(Expr.var(insn.getArray().getIndex())); assign(unwrapExpr, insn.getReceiver()); }
@Override public void visit(CastNumberInstruction insn) { PrimitiveCastExpr expr = new PrimitiveCastExpr(); expr.setSource(mapOperandType(insn.getSourceType())); expr.setTarget(mapOperandType(insn.getTargetType())); expr.setValue(Expr.var(insn.getValue().getIndex())); assign(expr, insn.getReceiver()); }