use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class PoolLocalValueResolver method checkRecursive.
private void checkRecursive(Local l) {
Set<Local> visited = new HashSet<>();
Queue<Local> worklist = new LinkedList<>();
worklist.add(l);
while (!worklist.isEmpty()) {
l = worklist.poll();
AbstractCopyStmt copy = pool.defs.get(l);
Set<Local> set = new HashSet<>();
Expr rhs = copy.getExpression();
if (rhs.getOpcode() == Opcode.LOCAL_LOAD) {
set.add(((VarExpr) rhs).getLocal());
} else if (rhs.getOpcode() == Opcode.PHI) {
for (Expr e : ((PhiExpr) rhs).getArguments().values()) {
set.add(((VarExpr) e).getLocal());
}
}
for (Local v : set) {
if (visited.contains(v)) {
System.err.println(copy.getBlock().getGraph());
System.err.printf("visited: %s%n", visited);
System.err.printf(" copy: %s%n", copy);
System.err.printf(" dup: %s%n", v);
throw new RuntimeException();
}
}
worklist.addAll(set);
visited.addAll(set);
}
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class DynamicInvocationExpr method copy.
@Override
public Expr copy() {
Expr[] arguments = new Expr[args.length];
for (int i = 0; i < arguments.length; i++) {
arguments[i] = args[i].copy();
}
Object[] pargs = new Object[providerArgs.length];
System.arraycopy(providerArgs, 0, pargs, 0, pargs.length);
return new DynamicInvocationExpr(new Handle(provider.getTag(), provider.getOwner(), provider.getName(), provider.getDesc()), pargs, name, desc, arguments);
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class NewArrayExpr method onChildUpdated.
@Override
public void onChildUpdated(int ptr) {
if (ptr >= 0 && ptr < bounds.length) {
Expr e;
if (children[ptr] == null) {
e = null;
} else {
e = read(ptr);
}
updateLength(ptr, e, true);
}
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class PhiExpr method equivalent.
@Override
public boolean equivalent(CodeUnit s) {
if (s instanceof PhiExpr) {
PhiExpr phi = (PhiExpr) s;
Set<BasicBlock> sources = new HashSet<>();
sources.addAll(arguments.keySet());
sources.addAll(phi.arguments.keySet());
if (sources.size() != arguments.size()) {
return false;
}
for (BasicBlock b : sources) {
Expr e1 = arguments.get(b);
Expr e2 = phi.arguments.get(b);
if (e1 == null || e2 == null) {
return false;
}
if (!e1.equivalent(e2)) {
return false;
}
}
return true;
}
return false;
}
use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.
the class InitialisedObjectExpr method onChildUpdated.
@Override
public void onChildUpdated(int ptr) {
Expr argument = read(ptr);
if (ptr < 0 || (ptr) >= args.length) {
throw new ArrayIndexOutOfBoundsException();
}
args[ptr] = argument;
overwrite(argument, ptr);
}
Aggregations