You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2012/10/02 17:15:02 UTC
svn commit: r1392964 - in
/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis:
ClassDifferentiator.java MethodDifferentiator.java
Author: luc
Date: Tue Oct 2 15:15:01 2012
New Revision: 1392964
URL: http://svn.apache.org/viewvc?rev=1392964&view=rev
Log:
Reorganize work between class and method differentiators.
Modified:
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
Modified: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java
URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java?rev=1392964&r1=1392963&r2=1392964&view=diff
==============================================================================
--- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java (original)
+++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/ClassDifferentiator.java Tue Oct 2 15:15:01 2012
@@ -132,6 +132,20 @@ public class ClassDifferentiator {
}
+ /** Get the name of the primitive class.
+ * @return name of the primitive class
+ */
+ public String getPrimitiveName() {
+ return primitiveNode.name;
+ }
+
+ /** Get the name of the derived class.
+ * @return name of the derived class
+ */
+ public String getDerivedName() {
+ return classNode.name;
+ }
+
/**
* Differentiate a method.
* @param name of the method
@@ -146,9 +160,9 @@ public class ClassDifferentiator {
for (final MethodNode method : primitiveNode.methods) {
if (method.name.equals(name) && Type.getType(method.desc).equals(primitiveMethodType)) {
- final MethodDifferentiator differentiator =
- new MethodDifferentiator(mathClasses, classNode);
- differentiator.differentiate(primitiveNode.name, method, derivativedMethodType);
+ final MethodDifferentiator differentiator = new MethodDifferentiator(mathClasses, this);
+ differentiator.differentiate(method, derivativedMethodType);
+ classNode.methods.add(method);
}
}
Modified: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java?rev=1392964&r1=1392963&r2=1392964&view=diff
==============================================================================
--- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java (original)
+++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java Tue Oct 2 15:15:01 2012
@@ -52,7 +52,6 @@ import org.apache.commons.nabla.forward.
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
@@ -73,8 +72,8 @@ public class MethodDifferentiator {
/** Math implementation classes. */
private final Set<String> mathClasses;
- /** Derived class (which is under construction). */
- private final ClassNode derivedClass;
+ /** Differentiator for the complete class. */
+ private final ClassDifferentiator classDifferentiator;
/** Set of converted values. */
private final Set<TrackingValue> converted;
@@ -87,32 +86,31 @@ public class MethodDifferentiator {
/** Build a differentiator for a method.
* @param mathClasses math implementation classes
- * @param derivedName name of the derived class
+ * @param classDifferentiator differentiator for the complete class
*/
- public MethodDifferentiator(final Set<String> mathClasses, final ClassNode derivedClass) {
- this.mathClasses = mathClasses;
- this.derivedClass = derivedClass;
- this.converted = new HashSet<TrackingValue>();
- this.frames = new IdentityHashMap<AbstractInsnNode, Frame<TrackingValue>>();
- this.successors = new IdentityHashMap<AbstractInsnNode, Set<AbstractInsnNode>>();
+ public MethodDifferentiator(final Set<String> mathClasses,
+ final ClassDifferentiator classDifferentiator) {
+ this.mathClasses = mathClasses;
+ this.classDifferentiator = classDifferentiator;
+ this.converted = new HashSet<TrackingValue>();
+ this.frames = new IdentityHashMap<AbstractInsnNode, Frame<TrackingValue>>();
+ this.successors = new IdentityHashMap<AbstractInsnNode, Set<AbstractInsnNode>>();
}
/** Get the name of the derived class.
* @return name of the derived class
*/
public String getDerivedName() {
- return derivedClass.name;
+ return classDifferentiator.getDerivedName();
}
/**
* Differentiate a method.
- * @param primitiveName primitive class name
* @param method method to differentiate (<em>will</em> be modified)
* @param derivedMethodType type of the derived method
* @exception DifferentiationException if method cannot be differentiated
*/
- public void differentiate(final String primitiveName, final MethodNode method,
- final Type derivedMethodType)
+ public void differentiate(final MethodNode method, final Type derivedMethodType)
throws DifferentiationException {
try {
@@ -122,7 +120,8 @@ public class MethodDifferentiator {
// analyze the original code, tracing values production/consumption
final FlowAnalyzer analyzer =
new FlowAnalyzer(new TrackingInterpreter(), method.instructions);
- final Frame<TrackingValue>[] array = analyzer.analyze(primitiveName, method);
+ final Frame<TrackingValue>[] array =
+ analyzer.analyze(classDifferentiator.getPrimitiveName(), method);
// convert the array into a map, since code changes will shift all indices
for (int i = 0; i < array.length; ++i) {
@@ -174,17 +173,14 @@ public class MethodDifferentiator {
method.access |= Opcodes.ACC_SYNTHETIC;
method.maxLocals = dsIndex + 1;
- // store the new method in the class
- derivedClass.methods.add(method);
-
-
} catch (AnalyzerException ae) {
ae.printStackTrace(System.err);
if ((ae.getCause() != null) && ae.getCause() instanceof DifferentiationException) {
throw (DifferentiationException) ae.getCause();
} else {
throw new DifferentiationException(NablaMessages.UNABLE_TO_ANALYZE_METHOD,
- primitiveName, method.name, ae.getMessage());
+ classDifferentiator.getPrimitiveName(),
+ method.name, ae.getMessage());
}
}
}