[prev in list] [next in list] [prev in thread] [next in thread]
List: jakarta-commons-dev
Subject: svn commit: r360309 -
From: kohsuke () apache ! org
Date: 2005-12-31 16:08:21
Message-ID: 20051231160822.68526.qmail () minotaur ! apache ! org
[Download RAW message or body]
Author: kohsuke
Date: Sat Dec 31 08:08:18 2005
New Revision: 360309
URL: http://svn.apache.org/viewcvs?rev=360309&view=rev
Log:
SimpleVerifier assumes that the types involved in the computation is loadable through \
Class.forName(), which isn't true when we are running inside Ant.
The correct computation would require us to parse referenced types (through a \
pluggable resolver.) For now, I'm just replacing it with BasicVerifier.
Given that the purpose of this part of the code is just to check that we generated \
the right code, perhaps we can remove it altogether in the production system?
i.e.,
if(DEBUG) {
... run a verifier
}
Modified:
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org \
/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java?rev=360309&r1=360308&r2=360309&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java \
(original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java \
Sat Dec 31 08:08:18 2005 @@ -39,6 +39,7 @@
import org.objectweb.asm.tree.analysis.DataflowValue;
import org.objectweb.asm.tree.analysis.Frame;
import org.objectweb.asm.tree.analysis.SimpleVerifier;
+import org.objectweb.asm.tree.analysis.BasicVerifier;
/**
@@ -50,22 +51,22 @@
protected final String className;
protected final ClassVisitor cv;
protected final MethodVisitor mv;
-
+
protected final List labels = new ArrayList();
protected final List nodes = new ArrayList();
protected final List methods = new ArrayList();
-
+
protected Analyzer analyzer;
-
-
- public ContinuationMethodAnalyzer(String className, ClassVisitor cv,
- MethodVisitor mv, int access, String name, String desc, String \
signature, String[] exceptions) { +
+
+ public ContinuationMethodAnalyzer(String className, ClassVisitor cv,
+ MethodVisitor mv, int access, String name, \
String desc, String signature, String[] exceptions) { super( access, name, desc, \
signature, exceptions); this.className = className;
this.cv = cv;
this.mv = mv;
}
-
+
public void visitMethodInsn( int opcode, String owner, String name, String desc) \
{
MethodInsnNode mnode = new MethodInsnNode(opcode, owner, name, desc);
if(opcode == INVOKESPECIAL || "<init>".equals(name)) {
@@ -79,7 +80,7 @@
}
instructions.add(mnode);
}
-
+
public void visitEnd() {
if(instructions.size()==0 || labels.size()==0) {
accept(mv);
@@ -89,10 +90,10 @@
try {
moveNew();
- analyzer = new Analyzer(new SimpleVerifier());
+ analyzer = new Analyzer(new BasicVerifier());
analyzer.analyze(className, this);
accept(new ContinuationMethodAdapter(this));
-
+
} catch(AnalyzerException ex) {
// TODO log the error or fail?
ex.printStackTrace();
@@ -105,9 +106,9 @@
DataflowInterpreter i = new DataflowInterpreter();
Analyzer a = new Analyzer(i);
a.analyze(className, this);
-
+
HashMap movable = new HashMap();
-
+
Frame[] frames = a.getFrames();
for( int j = 0; j < methods.size(); j++) {
MethodInsnNode mnode = (MethodInsnNode) methods.get(j);
@@ -115,7 +116,7 @@
int n = a.getIndex(mnode);
Frame f = frames[n];
Type[] args = Type.getArgumentTypes(mnode.desc);
-
+
DataflowValue v = (DataflowValue) \
f.getStack(f.getStackSize()-args.length-1); Set insns = v.insns;
for( Iterator it = insns.iterator(); it.hasNext();) {
@@ -131,19 +132,19 @@
}
}
}
-
+
for( Iterator it = movable.entrySet().iterator(); it.hasNext();) {
- Map.Entry e = (Map.Entry) it.next();
- AbstractInsnNode node1 = (AbstractInsnNode) e.getKey();
+ Map.Entry e = (Map.Entry) it.next();
+ AbstractInsnNode node1 = (AbstractInsnNode) e.getKey();
int n1 = instructions.indexOf(node1);
AbstractInsnNode node2 = (AbstractInsnNode) instructions.get(n1+1);
boolean hasCopy = node2.getOpcode()==DUP;
-
+
instructions.remove(node1); // NEW
if(hasCopy) {
instructions.remove(node2); // DUP
}
-
+
MethodInsnNode mnode = (MethodInsnNode) e.getValue();
int nm = instructions.indexOf(mnode);
@@ -157,7 +158,7 @@
varOffset += type.getSize();
}
maxLocals = varOffset;
-
+
instructions.add(nm++, node1); // NEW
if(hasCopy) {
instructions.add(nm++, node2); // DUP
@@ -176,7 +177,7 @@
}
}
}
-
+
// TODO
boolean needsFrameGuard( int opcode, String owner, String name, String desc ) {
if (opcode == Opcodes.INVOKEINTERFACE ||
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic