use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class GenerationPass method _jump_cmp.
protected void _jump_cmp(BasicBlock target, ComparisonType type) {
save_stack(false);
Expr right = pop();
Expr left = pop();
_jump_cmp(target, type, left, right);
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class GenerationPass method _dup_x2.
protected void _dup_x2() {
int baseHeight = currentStack.height();
save_stack(false);
if (currentStack.peek(1).getType().getSize() == 2) {
// prestack: var2, var0 (height = 3)
// poststack: var3, var1, var0
// assignments: var0 = var2(initial)
// assignments: var1 = var0(initial)
// assignments: var3 = var2(initial)
currentStack.assertHeights(DUP_X2_64_HEIGHTS);
Expr var2 = pop();
Expr var0 = pop();
// var4 = var0(initial)
Type var4Type = assign_stack(baseHeight + 1, var0);
// var0 = var2(initial)
Type var0Type = assign_stack(baseHeight - 3, var2);
// var3 = var2(initial)
Type var3Type = assign_stack(baseHeight + 0, var2);
// var1 = var4 = var0(initial)
Type var1Type = assign_stack(baseHeight - 2, load_stack(baseHeight + 1, var4Type));
// push var0
push(load_stack(baseHeight - 3, var0Type));
// push var1
push(load_stack(baseHeight - 2, var1Type));
// push var3
push(load_stack(baseHeight + 0, var3Type));
} else {
// prestack: var2, var1, var0 (height = 3)
// poststack: var3, var2, var1, var0
// assignments: var0 = var2(initial)
// assignments: var1 = var0(initial)
// assignments: var2 = var1(initial)
// assignments: var3 = var2(initial)
currentStack.assertHeights(DUP_X2_32_HEIGHTS);
Expr var2 = pop();
Expr var1 = pop();
Expr var0 = pop();
// var4 = var0(initial)
Type var4Type = assign_stack(baseHeight + 1, var0);
// var5 = var1(initial)
Type var5Type = assign_stack(baseHeight + 2, var1);
// var0 = var2(initial)
Type var0Type = assign_stack(baseHeight - 3, var2);
// var3 = var2(initial)
Type var3Type = assign_stack(baseHeight + 0, var2.copy());
// var1 = var4 = var0(initial)
Type var1Type = assign_stack(baseHeight - 2, load_stack(baseHeight + 1, var4Type));
// var2 = var5 = var1(initial)
Type var2Type = assign_stack(baseHeight - 1, load_stack(baseHeight + 2, var5Type));
// push var0
push(load_stack(baseHeight - 3, var0Type));
// push var1
push(load_stack(baseHeight - 2, var1Type));
// push var2
push(load_stack(baseHeight - 1, var2Type));
// push var3
push(load_stack(baseHeight + 0, var3Type));
}
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class GenerationPass method _load_field.
protected void _load_field(int opcode, String owner, String name, String desc) {
save_stack(false);
if (opcode == GETFIELD || opcode == GETSTATIC) {
Expr inst = null;
if (opcode == GETFIELD) {
inst = pop();
}
FieldLoadExpr fExpr = new FieldLoadExpr(inst, owner, name, desc);
int index = currentStack.height();
Type type = assign_stack(index, fExpr);
push(load_stack(index, type));
} else {
throw new UnsupportedOperationException(Printer.OPCODES[opcode] + " " + owner + "." + name + " " + desc);
}
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class GenerationPass method _dynamic_call.
protected void _dynamic_call(Handle _bsm, Object[] _args, String name, String desc) {
save_stack(false);
Handle provider = new Handle(_bsm.getTag(), _bsm.getOwner(), _bsm.getName(), _bsm.getDesc());
Object[] pArgs = new Object[_args.length];
System.arraycopy(_args, 0, pArgs, 0, pArgs.length);
// FIXME: can this end up as a virtual call
Expr[] args = new Expr[Type.getArgumentTypes(desc).length];
for (int i = args.length - 1; i >= 0; i--) {
args[i] = pop();
}
DynamicInvocationExpr expr = new DynamicInvocationExpr(provider, pArgs, name, desc, args);
if (expr.getType() == Type.VOID_TYPE) {
addStmt(new PopStmt(expr));
} else {
int index = currentStack.height();
Type type = assign_stack(index, expr);
push(load_stack(index, type));
}
// TODO: redo vm lambdas as static resolution calls/concrete calls.
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class GenerationPass method _const.
protected void _const(Object o, Type type) {
Expr e = new ConstantExpr(o, type, true);
// int index = currentStack.height();
// Type type = assign_stack(index, e);
// push(load_stack(index, type));
push(e);
}
Aggregations