Instructions, that have separate class name and field/method name now

use FieldReference and MethodReference instead
This commit is contained in:
Alexey Andreev 2013-11-17 16:45:35 +04:00
parent 91a50605bc
commit 6efbb75783
15 changed files with 95 additions and 141 deletions

View File

@ -17,10 +17,7 @@ package org.teavm.dependency;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.*;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.teavm.codegen.ConcurrentCachedMapper; import org.teavm.codegen.ConcurrentCachedMapper;
import org.teavm.codegen.ConcurrentCachedMapper.KeyListener; import org.teavm.codegen.ConcurrentCachedMapper.KeyListener;
import org.teavm.codegen.Mapper; import org.teavm.codegen.Mapper;
@ -48,6 +45,13 @@ public class DependencyChecker {
public DependencyChecker(ClassHolderSource classSource, int numThreads) { public DependencyChecker(ClassHolderSource classSource, int numThreads) {
this.classSource = classSource; this.classSource = classSource;
executor = new ScheduledThreadPoolExecutor(numThreads); executor = new ScheduledThreadPoolExecutor(numThreads);
executor.setThreadFactory(new ThreadFactory() {
@Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(true);
return thread;
}
});
methodCache = new ConcurrentCachedMapper<>(new Mapper<MethodReference, MethodGraph>() { methodCache = new ConcurrentCachedMapper<>(new Mapper<MethodReference, MethodGraph>() {
@Override public MethodGraph map(MethodReference preimage) { @Override public MethodGraph map(MethodReference preimage) {
return createMethodGraph(preimage); return createMethodGraph(preimage);

View File

@ -129,8 +129,7 @@ class DependencyGraphBuilder {
} }
private void invokeSpecial(InvokeInstruction insn) { private void invokeSpecial(InvokeInstruction insn) {
MethodReference method = new MethodReference(insn.getClassName(), insn.getMethod()); MethodGraph targetGraph = dependencyChecker.attachMethodGraph(insn.getMethod());
MethodGraph targetGraph = dependencyChecker.attachMethodGraph(method);
DependencyNode[] targetParams = targetGraph.getVariableNodes(); DependencyNode[] targetParams = targetGraph.getVariableNodes();
List<Variable> arguments = insn.getArguments(); List<Variable> arguments = insn.getArguments();
for (int i = 0; i < arguments.size(); ++i) { for (int i = 0; i < arguments.size(); ++i) {
@ -152,7 +151,7 @@ class DependencyGraphBuilder {
} }
actualArgs[0] = nodes[insn.getInstance().getIndex()]; actualArgs[0] = nodes[insn.getInstance().getIndex()];
DependencyConsumer listener = new VirtualCallPropagationListener(nodes[insn.getInstance().getIndex()], DependencyConsumer listener = new VirtualCallPropagationListener(nodes[insn.getInstance().getIndex()],
insn.getMethod(), dependencyChecker, actualArgs, insn.getMethod().getDescriptor(), dependencyChecker, actualArgs,
insn.getReceiver() != null ? nodes[insn.getReceiver().getIndex()] : null); insn.getReceiver() != null ? nodes[insn.getReceiver().getIndex()] : null);
nodes[insn.getInstance().getIndex()].addConsumer(listener); nodes[insn.getInstance().getIndex()].addConsumer(listener);
} }
@ -190,16 +189,14 @@ class DependencyGraphBuilder {
@Override @Override
public void visit(PutFieldInstruction insn) { public void visit(PutFieldInstruction insn) {
DependencyNode fieldNode = dependencyChecker.getFieldNode(new FieldReference(insn.getClassName(), DependencyNode fieldNode = dependencyChecker.getFieldNode(insn.getField());
insn.getField()));
DependencyNode valueNode = nodes[insn.getValue().getIndex()]; DependencyNode valueNode = nodes[insn.getValue().getIndex()];
valueNode.connect(fieldNode); valueNode.connect(fieldNode);
} }
@Override @Override
public void visit(GetFieldInstruction insn) { public void visit(GetFieldInstruction insn) {
DependencyNode fieldNode = dependencyChecker.getFieldNode(new FieldReference(insn.getClassName(), DependencyNode fieldNode = dependencyChecker.getFieldNode(insn.getField());
insn.getField()));
DependencyNode receiverNode = nodes[insn.getReceiver().getIndex()]; DependencyNode receiverNode = nodes[insn.getReceiver().getIndex()];
fieldNode.connect(receiverNode); fieldNode.connect(receiverNode);
} }

View File

@ -156,18 +156,16 @@ class OptimizingVisitor implements StatementVisitor, ExprVisitor {
} }
switch (expr.getType()) { switch (expr.getType()) {
case STATIC: case STATIC:
resultExpr = Expr.invokeStatic(expr.getClassName(), expr.getMethod(), args); resultExpr = Expr.invokeStatic(expr.getMethod(), args);
break; break;
case DYNAMIC: case DYNAMIC:
resultExpr = Expr.invoke(expr.getClassName(), expr.getMethod(), args[0], Arrays.copyOfRange( resultExpr = Expr.invoke(expr.getMethod(), args[0], Arrays.copyOfRange(args, 1, args.length));
args, 1, args.length));
break; break;
case SPECIAL: case SPECIAL:
resultExpr = Expr.invokeSpecial(expr.getClassName(), expr.getMethod(), args[0], Arrays.copyOfRange( resultExpr = Expr.invokeSpecial(expr.getMethod(), args[0], Arrays.copyOfRange(args, 1, args.length));
args, 1, args.length));
break; break;
case CONSTRUCTOR: case CONSTRUCTOR:
resultExpr = Expr.constructObject(expr.getClassName(), expr.getMethod(), args); resultExpr = Expr.constructObject(expr.getMethod(), args);
break; break;
} }
} }
@ -199,12 +197,12 @@ class OptimizingVisitor implements StatementVisitor, ExprVisitor {
return false; return false;
} }
NewExpr constructed = (NewExpr)assignment.getRightValue(); NewExpr constructed = (NewExpr)assignment.getRightValue();
if (!constructed.getConstructedClass().equals(expr.getClassName())) { if (!constructed.getConstructedClass().equals(expr.getMethod().getClassName())) {
return false; return false;
} }
Expr[] args = expr.getArguments().toArray(new Expr[0]); Expr[] args = expr.getArguments().toArray(new Expr[0]);
args = Arrays.copyOfRange(args, 1, args.length); args = Arrays.copyOfRange(args, 1, args.length);
assignment.setRightValue(Expr.constructObject(expr.getClassName(), expr.getMethod(), args)); assignment.setRightValue(Expr.constructObject(expr.getMethod(), args));
stats.reads[var.getIndex()]--; stats.reads[var.getIndex()]--;
return true; return true;
} }
@ -213,7 +211,7 @@ class OptimizingVisitor implements StatementVisitor, ExprVisitor {
public void visit(QualificationExpr expr) { public void visit(QualificationExpr expr) {
expr.getQualified().acceptVisitor(this); expr.getQualified().acceptVisitor(this);
Expr qualified = resultExpr; Expr qualified = resultExpr;
resultExpr = Expr.qualify(qualified, expr.getClassName(), expr.getField()); resultExpr = Expr.qualify(qualified, expr.getField());
} }
@Override @Override

View File

@ -689,8 +689,8 @@ public class Renderer implements ExprVisitor, StatementVisitor {
@Override @Override
public void visit(InvocationExpr expr) { public void visit(InvocationExpr expr) {
String className = naming.getNameFor(expr.getClassName()); String className = naming.getNameFor(expr.getMethod().getClassName());
String name = naming.getNameFor(new MethodReference(expr.getClassName(), expr.getMethod())); String name = naming.getNameFor(expr.getMethod());
switch (expr.getType()) { switch (expr.getType()) {
case STATIC: case STATIC:
writer.append(className).append("_").append(name).append("("); writer.append(className).append("_").append(name).append("(");
@ -738,7 +738,7 @@ public class Renderer implements ExprVisitor, StatementVisitor {
@Override @Override
public void visit(QualificationExpr expr) { public void visit(QualificationExpr expr) {
expr.getQualified().acceptVisitor(this); expr.getQualified().acceptVisitor(this);
writer.append('.').appendField(new FieldReference(expr.getClassName(), expr.getField())); writer.append('.').appendField(expr.getField());
} }
@Override @Override

View File

@ -412,10 +412,10 @@ public class StatementGenerator implements InstructionVisitor {
public void visit(GetFieldInstruction insn) { public void visit(GetFieldInstruction insn) {
if (insn.getInstance() != null) { if (insn.getInstance() != null) {
statements.add(Statement.assign(Expr.var(insn.getReceiver().getIndex()), statements.add(Statement.assign(Expr.var(insn.getReceiver().getIndex()),
Expr.qualify(Expr.var(insn.getInstance().getIndex()), insn.getClassName(), insn.getField()))); Expr.qualify(Expr.var(insn.getInstance().getIndex()), insn.getField())));
} else { } else {
Expr fieldExpr = Expr.qualify(Expr.staticClass(ValueType.object(insn.getClassName())), Expr fieldExpr = Expr.qualify(Expr.staticClass(ValueType.object(insn.getField().getClassName())),
insn.getClassName(), insn.getField()); insn.getField());
statements.add(Statement.assign(Expr.var(insn.getReceiver().getIndex()), fieldExpr)); statements.add(Statement.assign(Expr.var(insn.getReceiver().getIndex()), fieldExpr));
} }
} }
@ -423,11 +423,11 @@ public class StatementGenerator implements InstructionVisitor {
@Override @Override
public void visit(PutFieldInstruction insn) { public void visit(PutFieldInstruction insn) {
if (insn.getInstance() != null) { if (insn.getInstance() != null) {
statements.add(Statement.assign(Expr.qualify(Expr.var(insn.getInstance().getIndex()), statements.add(Statement.assign(Expr.qualify(Expr.var(insn.getInstance().getIndex()), insn.getField()),
insn.getClassName(), insn.getField()), Expr.var(insn.getValue().getIndex()))); Expr.var(insn.getValue().getIndex())));
} else { } else {
Expr fieldExpr = Expr.qualify(Expr.staticClass(ValueType.object(insn.getClassName())), Expr fieldExpr = Expr.qualify(Expr.staticClass(ValueType.object(insn.getField().getClassName())),
insn.getClassName(), insn.getField()); insn.getField());
statements.add(Statement.assign(fieldExpr, Expr.var(insn.getValue().getIndex()))); statements.add(Statement.assign(fieldExpr, Expr.var(insn.getValue().getIndex())));
} }
} }
@ -439,8 +439,9 @@ public class StatementGenerator implements InstructionVisitor {
@Override @Override
public void visit(CloneArrayInstruction insn) { public void visit(CloneArrayInstruction insn) {
MethodDescriptor cloneMethod = new MethodDescriptor("clone", ValueType.object("java.lang.Object")); MethodDescriptor cloneMethodDesc = new MethodDescriptor("clone", ValueType.object("java.lang.Object"));
assign(Expr.invoke("java.lang.Object", cloneMethod, Expr.var(insn.getArray().getIndex()), new Expr[0]), MethodReference cloneMethod = new MethodReference("java.lang.Object", cloneMethodDesc);
assign(Expr.invoke(cloneMethod, Expr.var(insn.getArray().getIndex()), new Expr[0]),
insn.getReceiver().getIndex()); insn.getReceiver().getIndex());
} }
@ -458,10 +459,9 @@ public class StatementGenerator implements InstructionVisitor {
@Override @Override
public void visit(InvokeInstruction insn) { public void visit(InvokeInstruction insn) {
String declaringClass = findDeclaringClass(insn.getClassName(), insn.getMethod()); MethodReference method = findDeclaringClass(insn.getMethod());
if (declaringClass == null) { if (method == null) {
throw new IllegalArgumentException("Method not found: " + insn.getClassName() + "." + throw new IllegalArgumentException("Method not found: " + insn.getMethod());
insn.getMethod());
} }
Expr[] exprArgs = new Expr[insn.getMethod().getParameterTypes().length]; Expr[] exprArgs = new Expr[insn.getMethod().getParameterTypes().length];
for (int i = 0; i < insn.getArguments().size(); ++i) { for (int i = 0; i < insn.getArguments().size(); ++i) {
@ -470,14 +470,12 @@ public class StatementGenerator implements InstructionVisitor {
Expr invocationExpr; Expr invocationExpr;
if (insn.getInstance() != null) { if (insn.getInstance() != null) {
if (insn.getType() == InvocationType.VIRTUAL) { if (insn.getType() == InvocationType.VIRTUAL) {
invocationExpr = Expr.invoke(declaringClass, insn.getMethod(), invocationExpr = Expr.invoke(insn.getMethod(), Expr.var(insn.getInstance().getIndex()), exprArgs);
Expr.var(insn.getInstance().getIndex()), exprArgs);
} else { } else {
invocationExpr = Expr.invokeSpecial(declaringClass, insn.getMethod(), invocationExpr = Expr.invokeSpecial(method, Expr.var(insn.getInstance().getIndex()), exprArgs);
Expr.var(insn.getInstance().getIndex()), exprArgs);
} }
} else { } else {
invocationExpr = Expr.invokeStatic(declaringClass, insn.getMethod(), exprArgs); invocationExpr = Expr.invokeStatic(method, exprArgs);
} }
if (insn.getReceiver() != null) { if (insn.getReceiver() != null) {
assign(invocationExpr, insn.getReceiver().getIndex()); assign(invocationExpr, insn.getReceiver().getIndex());
@ -486,12 +484,12 @@ public class StatementGenerator implements InstructionVisitor {
} }
} }
public String findDeclaringClass(String className, MethodDescriptor method) { public MethodReference findDeclaringClass(MethodReference method) {
ClassHolder cls = classSource.getClassHolder(className); ClassHolder cls = classSource.getClassHolder(method.getClassName());
while (cls != null && cls.getMethod(method) == null) { while (cls != null && cls.getMethod(method.getDescriptor()) == null) {
cls = cls.getParent() != null ? classSource.getClassHolder(cls.getParent()) : null; cls = cls.getParent() != null ? classSource.getClassHolder(cls.getParent()) : null;
} }
return cls != null ? cls.getName() : null; return cls != null ? new MethodReference(cls.getName(), method.getDescriptor()) : null;
} }
@Override @Override

View File

@ -95,26 +95,23 @@ public abstract class Expr implements Cloneable {
return expr; return expr;
} }
public static Expr constructObject(String cls, MethodDescriptor method, Expr[] arguments) { public static Expr constructObject(MethodReference method, Expr[] arguments) {
InvocationExpr expr = new InvocationExpr(); InvocationExpr expr = new InvocationExpr();
expr.setClassName(cls);
expr.setMethod(method); expr.setMethod(method);
expr.setType(InvocationType.CONSTRUCTOR); expr.setType(InvocationType.CONSTRUCTOR);
expr.getArguments().addAll(Arrays.asList(arguments)); expr.getArguments().addAll(Arrays.asList(arguments));
return expr; return expr;
} }
public static Expr qualify(Expr target, String className, String field) { public static Expr qualify(Expr target, FieldReference field) {
QualificationExpr expr = new QualificationExpr(); QualificationExpr expr = new QualificationExpr();
expr.setQualified(target); expr.setQualified(target);
expr.setClassName(className);
expr.setField(field); expr.setField(field);
return expr; return expr;
} }
public static Expr invoke(String cls, MethodDescriptor method, Expr target, Expr[] arguments) { public static Expr invoke(MethodReference method, Expr target, Expr[] arguments) {
InvocationExpr expr = new InvocationExpr(); InvocationExpr expr = new InvocationExpr();
expr.setClassName(cls);
expr.setMethod(method); expr.setMethod(method);
expr.setType(InvocationType.DYNAMIC); expr.setType(InvocationType.DYNAMIC);
expr.getArguments().add(target); expr.getArguments().add(target);
@ -122,10 +119,8 @@ public abstract class Expr implements Cloneable {
return expr; return expr;
} }
public static Expr invokeSpecial(String cls, MethodDescriptor method, public static Expr invokeSpecial(MethodReference method, Expr target, Expr[] arguments) {
Expr target, Expr[] arguments) {
InvocationExpr expr = new InvocationExpr(); InvocationExpr expr = new InvocationExpr();
expr.setClassName(cls);
expr.setMethod(method); expr.setMethod(method);
expr.setType(InvocationType.SPECIAL); expr.setType(InvocationType.SPECIAL);
expr.getArguments().add(target); expr.getArguments().add(target);
@ -133,9 +128,8 @@ public abstract class Expr implements Cloneable {
return expr; return expr;
} }
public static Expr invokeStatic(String cls, MethodDescriptor method, Expr[] arguments) { public static Expr invokeStatic(MethodReference method, Expr[] arguments) {
InvocationExpr expr = new InvocationExpr(); InvocationExpr expr = new InvocationExpr();
expr.setClassName(cls);
expr.setMethod(method); expr.setMethod(method);
expr.setType(InvocationType.STATIC); expr.setType(InvocationType.STATIC);
expr.getArguments().addAll(Arrays.asList(arguments)); expr.getArguments().addAll(Arrays.asList(arguments));

View File

@ -18,31 +18,22 @@ package org.teavm.javascript.ast;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.teavm.model.MethodDescriptor; import org.teavm.model.MethodReference;
/** /**
* *
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public class InvocationExpr extends Expr { public class InvocationExpr extends Expr {
private String className; private MethodReference method;
private MethodDescriptor method;
private InvocationType type; private InvocationType type;
private List<Expr> arguments = new ArrayList<>(); private List<Expr> arguments = new ArrayList<>();
public String getClassName() { public MethodReference getMethod() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public MethodDescriptor getMethod() {
return method; return method;
} }
public void setMethod(MethodDescriptor method) { public void setMethod(MethodReference method) {
this.method = method; this.method = method;
} }
@ -72,7 +63,6 @@ public class InvocationExpr extends Expr {
InvocationExpr copy = new InvocationExpr(); InvocationExpr copy = new InvocationExpr();
cache.put(this, copy); cache.put(this, copy);
copy.setMethod(method); copy.setMethod(method);
copy.setClassName(className);
for (Expr arg : arguments) { for (Expr arg : arguments) {
copy.getArguments().add(arg.clone(cache)); copy.getArguments().add(arg.clone(cache));
} }

View File

@ -16,6 +16,7 @@
package org.teavm.javascript.ast; package org.teavm.javascript.ast;
import java.util.Map; import java.util.Map;
import org.teavm.model.FieldReference;
/** /**
* *
@ -23,8 +24,7 @@ import java.util.Map;
*/ */
public class QualificationExpr extends Expr { public class QualificationExpr extends Expr {
private Expr qualified; private Expr qualified;
private String className; private FieldReference field;
private String field;
public Expr getQualified() { public Expr getQualified() {
return qualified; return qualified;
@ -34,19 +34,11 @@ public class QualificationExpr extends Expr {
this.qualified = qualified; this.qualified = qualified;
} }
public String getClassName() { public FieldReference getField() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getField() {
return field; return field;
} }
public void setField(String field) { public void setField(FieldReference field) {
this.field = field; this.field = field;
} }
@ -63,7 +55,6 @@ public class QualificationExpr extends Expr {
} }
QualificationExpr copy = new QualificationExpr(); QualificationExpr copy = new QualificationExpr();
cache.put(this, copy); cache.put(this, copy);
copy.setClassName(className);
copy.setField(field); copy.setField(field);
copy.setQualified(qualified != null ? qualified.clone(cache) : null); copy.setQualified(qualified != null ? qualified.clone(cache) : null);
return copy; return copy;

View File

@ -22,7 +22,19 @@ public class MethodReference {
} }
public int parameterCount() { public int parameterCount() {
return descriptor.getParameterTypes().length; return descriptor.parameterCount();
}
public ValueType[] getParameterTypes() {
return descriptor.getParameterTypes();
}
public ValueType[] getSignature() {
return descriptor.getSignature();
}
public String getName() {
return descriptor.getName();
} }
@Override @Override

View File

@ -1,5 +1,6 @@
package org.teavm.model.instructions; package org.teavm.model.instructions;
import org.teavm.model.FieldReference;
import org.teavm.model.Instruction; import org.teavm.model.Instruction;
import org.teavm.model.ValueType; import org.teavm.model.ValueType;
import org.teavm.model.Variable; import org.teavm.model.Variable;
@ -10,8 +11,7 @@ import org.teavm.model.Variable;
*/ */
public class GetFieldInstruction extends Instruction { public class GetFieldInstruction extends Instruction {
private Variable instance; private Variable instance;
private String className; private FieldReference field;
private String field;
private ValueType fieldType; private ValueType fieldType;
private Variable receiver; private Variable receiver;
@ -23,19 +23,11 @@ public class GetFieldInstruction extends Instruction {
this.instance = instance; this.instance = instance;
} }
public String getClassName() { public FieldReference getField() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getField() {
return field; return field;
} }
public void setField(String field) { public void setField(FieldReference field) {
this.field = field; this.field = field;
} }

View File

@ -10,8 +10,7 @@ import org.teavm.model.*;
*/ */
public class InvokeInstruction extends Instruction { public class InvokeInstruction extends Instruction {
private InvocationType type; private InvocationType type;
private String className; private MethodReference method;
private MethodDescriptor method;
private Variable instance; private Variable instance;
private List<Variable> arguments = new ArrayList<>(); private List<Variable> arguments = new ArrayList<>();
private Variable receiver; private Variable receiver;
@ -36,19 +35,11 @@ public class InvokeInstruction extends Instruction {
return arguments; return arguments;
} }
public String getClassName() { public MethodReference getMethod() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public MethodDescriptor getMethod() {
return method; return method;
} }
public void setMethod(MethodDescriptor method) { public void setMethod(MethodReference method) {
this.method = method; this.method = method;
} }

View File

@ -1,5 +1,6 @@
package org.teavm.model.instructions; package org.teavm.model.instructions;
import org.teavm.model.FieldReference;
import org.teavm.model.Instruction; import org.teavm.model.Instruction;
import org.teavm.model.Variable; import org.teavm.model.Variable;
@ -9,8 +10,7 @@ import org.teavm.model.Variable;
*/ */
public class PutFieldInstruction extends Instruction { public class PutFieldInstruction extends Instruction {
private Variable instance; private Variable instance;
private String className; private FieldReference field;
private String field;
private Variable value; private Variable value;
public Variable getInstance() { public Variable getInstance() {
@ -21,19 +21,11 @@ public class PutFieldInstruction extends Instruction {
this.instance = instance; this.instance = instance;
} }
public String getClassName() { public FieldReference getField() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getField() {
return field; return field;
} }
public void setField(String field) { public void setField(FieldReference field) {
this.field = field; this.field = field;
} }

View File

@ -197,12 +197,14 @@ class ClassRefsRenamer implements InstructionVisitor {
@Override @Override
public void visit(GetFieldInstruction insn) { public void visit(GetFieldInstruction insn) {
insn.setClassName(classNameMapper.map(insn.getClassName())); String className = classNameMapper.map(insn.getField().getClassName());
insn.setField(new FieldReference(className, insn.getField().getFieldName()));
} }
@Override @Override
public void visit(PutFieldInstruction insn) { public void visit(PutFieldInstruction insn) {
insn.setClassName(classNameMapper.map(insn.getClassName())); String className = classNameMapper.map(insn.getField().getClassName());
insn.setField(new FieldReference(className, insn.getField().getFieldName()));
} }
@Override @Override
@ -223,12 +225,12 @@ class ClassRefsRenamer implements InstructionVisitor {
@Override @Override
public void visit(InvokeInstruction insn) { public void visit(InvokeInstruction insn) {
insn.setClassName(classNameMapper.map(insn.getClassName())); String className = classNameMapper.map(insn.getMethod().getClassName());
ValueType[] signature = insn.getMethod().getSignature(); ValueType[] signature = insn.getMethod().getSignature();
for (int i = 0; i < signature.length; ++i) { for (int i = 0; i < signature.length; ++i) {
signature[i] = rename(signature[i]); signature[i] = rename(signature[i]);
} }
insn.setMethod(new MethodDescriptor(insn.getMethod().getName(), signature)); insn.setMethod(new MethodReference(className, new MethodDescriptor(insn.getMethod().getName(), signature)));
} }
@Override @Override

View File

@ -236,7 +236,7 @@ public class InstructionStringifier implements InstructionVisitor {
if (insn.getInstance() != null) { if (insn.getInstance() != null) {
sb.append("@").append(insn.getInstance().getIndex()); sb.append("@").append(insn.getInstance().getIndex());
} else { } else {
sb.append(insn.getClassName()); sb.append(insn.getField().getClassName());
} }
sb.append(".").append(insn.getField()); sb.append(".").append(insn.getField());
} }
@ -246,7 +246,7 @@ public class InstructionStringifier implements InstructionVisitor {
if (insn.getInstance() != null) { if (insn.getInstance() != null) {
sb.append("@").append(insn.getInstance().getIndex()); sb.append("@").append(insn.getInstance().getIndex());
} else { } else {
sb.append(insn.getClassName()); sb.append(insn.getField().getClassName());
} }
sb.append(".").append(insn.getField()).append(" := @").append(insn.getValue().getIndex()); sb.append(".").append(insn.getField()).append(" := @").append(insn.getValue().getIndex());
} }
@ -273,7 +273,7 @@ public class InstructionStringifier implements InstructionVisitor {
if (insn.getInstance() != null) { if (insn.getInstance() != null) {
sb.append("@").append(insn.getInstance().getIndex()); sb.append("@").append(insn.getInstance().getIndex());
} else { } else {
sb.append(insn.getClassName()); sb.append(insn.getMethod().getClassName());
} }
sb.append(".").append(insn.getMethod().getName()).append("("); sb.append(".").append(insn.getMethod().getName()).append("(");
List<Variable> arguments = insn.getArguments(); List<Variable> arguments = insn.getArguments();

View File

@ -357,8 +357,7 @@ public class ProgramParser {
} }
args[--j] = getVariable(--currentDepth); args[--j] = getVariable(--currentDepth);
} }
MethodDescriptor method = new MethodDescriptor(name, MethodDescriptor method = new MethodDescriptor(name, MethodDescriptor.parseSignature(desc));
MethodDescriptor.parseSignature(desc));
int instance = -1; int instance = -1;
if (opcode != Opcodes.INVOKESTATIC) { if (opcode != Opcodes.INVOKESTATIC) {
instance = --currentDepth; instance = --currentDepth;
@ -374,8 +373,7 @@ public class ProgramParser {
} }
if (instance == -1) { if (instance == -1) {
InvokeInstruction insn = new InvokeInstruction(); InvokeInstruction insn = new InvokeInstruction();
insn.setClassName(ownerCls); insn.setMethod(new MethodReference(ownerCls, method));
insn.setMethod(method);
if (result >= 0) { if (result >= 0) {
insn.setReceiver(getVariable(result)); insn.setReceiver(getVariable(result));
} }
@ -388,8 +386,7 @@ public class ProgramParser {
} else { } else {
insn.setType(InvocationType.VIRTUAL); insn.setType(InvocationType.VIRTUAL);
} }
insn.setClassName(ownerCls); insn.setMethod(new MethodReference(ownerCls, method));
insn.setMethod(method);
if (result >= 0) { if (result >= 0) {
insn.setReceiver(getVariable(result)); insn.setReceiver(getVariable(result));
} }
@ -1292,8 +1289,7 @@ public class ProgramParser {
} }
GetFieldInstruction insn = new GetFieldInstruction(); GetFieldInstruction insn = new GetFieldInstruction();
insn.setInstance(getVariable(instance)); insn.setInstance(getVariable(instance));
insn.setClassName(ownerCls); insn.setField(new FieldReference(ownerCls, name));
insn.setField(name);
insn.setFieldType(type); insn.setFieldType(type);
insn.setReceiver(getVariable(value)); insn.setReceiver(getVariable(value));
builder.add(insn); builder.add(insn);
@ -1309,8 +1305,7 @@ public class ProgramParser {
int instance = --currentDepth; int instance = --currentDepth;
PutFieldInstruction insn = new PutFieldInstruction(); PutFieldInstruction insn = new PutFieldInstruction();
insn.setInstance(getVariable(instance)); insn.setInstance(getVariable(instance));
insn.setClassName(ownerCls); insn.setField(new FieldReference(ownerCls, name));
insn.setField(name);
insn.setValue(getVariable(value)); insn.setValue(getVariable(value));
builder.add(insn); builder.add(insn);
break; break;
@ -1322,8 +1317,7 @@ public class ProgramParser {
currentDepth++; currentDepth++;
} }
GetFieldInstruction insn = new GetFieldInstruction(); GetFieldInstruction insn = new GetFieldInstruction();
insn.setClassName(ownerCls); insn.setField(new FieldReference(ownerCls, name));
insn.setField(name);
insn.setFieldType(type); insn.setFieldType(type);
insn.setReceiver(getVariable(value)); insn.setReceiver(getVariable(value));
builder.add(insn); builder.add(insn);
@ -1335,8 +1329,7 @@ public class ProgramParser {
} }
int value = --currentDepth; int value = --currentDepth;
PutFieldInstruction insn = new PutFieldInstruction(); PutFieldInstruction insn = new PutFieldInstruction();
insn.setClassName(ownerCls); insn.setField(new FieldReference(ownerCls, name));
insn.setField(name);
insn.setValue(getVariable(value)); insn.setValue(getVariable(value));
builder.add(insn); builder.add(insn);
break; break;