Author: kohsuke
Date: Mon Dec 26 21:23:49 2005
New Revision: 359174

URL: http://svn.apache.org/viewcvs?rev=359174&view=rev
Log:
fixed a bug in the instrumentation of the null object in the stack

Modified:
    
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java

Modified: 
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java?rev=359174&r1=359173&r2=359174&view=diff
==============================================================================
--- 
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
 (original)
+++ 
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
 Mon Dec 26 21:23:49 2005
@@ -17,6 +17,7 @@
 
 import org.apache.bcel.Constants;
 import org.apache.bcel.Repository;
+import org.apache.bcel.classfile.Attribute;
 import org.apache.bcel.classfile.ClassFormatException;
 import org.apache.bcel.classfile.ClassParser;
 import org.apache.bcel.classfile.ConstantCP;
@@ -25,12 +26,10 @@
 import org.apache.bcel.classfile.ConstantUtf8;
 import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.classfile.Method;
-import org.apache.bcel.classfile.Attribute;
 import org.apache.bcel.generic.ACONST_NULL;
 import org.apache.bcel.generic.BasicType;
 import org.apache.bcel.generic.ClassGen;
 import org.apache.bcel.generic.ConstantPoolGen;
-import org.apache.bcel.generic.DUP2_X2;
 import org.apache.bcel.generic.GOTO;
 import org.apache.bcel.generic.IFEQ;
 import org.apache.bcel.generic.IFNULL;
@@ -44,16 +43,14 @@
 import org.apache.bcel.generic.InvokeInstruction;
 import org.apache.bcel.generic.MethodGen;
 import org.apache.bcel.generic.ObjectType;
-import org.apache.bcel.generic.POP;
-import org.apache.bcel.generic.POP2;
 import org.apache.bcel.generic.PUSH;
 import org.apache.bcel.generic.RET;
 import org.apache.bcel.generic.ReferenceType;
 import org.apache.bcel.generic.ReturnaddressType;
-import org.apache.bcel.generic.SWAP;
 import org.apache.bcel.generic.TABLESWITCH;
 import org.apache.bcel.generic.TargetLostException;
 import org.apache.bcel.generic.Type;
+import org.apache.bcel.generic.ASTORE;
 import org.apache.bcel.verifier.exc.AssertionViolatedException;
 import org.apache.commons.javaflow.bytecode.Continuable;
 import org.apache.commons.javaflow.bytecode.StackRecorder;
@@ -591,26 +588,33 @@
 
                 // check for types with two words on stack
                 if (type.equals(Type.LONG) || type.equals(Type.DOUBLE)) {
-                    insList.append(new ACONST_NULL()); // create dummy stack 
entry
+                    insList.append(InstructionConstants.ACONST_NULL); // 
create dummy stack entry
                     insList.append(loadStackRecorder);
-                    insList.append(new DUP2_X2()); // swap Stack object and 
long/float
-                    insList.append(new POP2());
+                    insList.append(InstructionConstants.DUP2_X2); // swap 
Stack object and long/float
+                    insList.append(InstructionConstants.POP2);
                 } else {
                     insList.append(loadStackRecorder);
-                    insList.append(new SWAP());
+                    insList.append(InstructionConstants.SWAP);
                 }
                 insList.append(insFactory.createInvoke(STACK_RECORDER_CLASS, 
getPushMethod(type), Type.VOID, new Type[] { type }, Constants.INVOKEVIRTUAL));
                 if (type.equals(Type.LONG) || type.equals(Type.DOUBLE))
-                    insList.append(new POP()); // remove dummy stack entry
+                    insList.append(InstructionConstants.POP); // remove dummy 
stack entry
             } else if (type == null) {
                 insList.append(InstructionConstants.POP);
             } else if (type instanceof UninitializedObjectType) {
                 // After the remove of new, there shouldn't be a
                 // uninitialized object on the stack
             } else if (type instanceof ReferenceType) {
-                insList.append(loadStackRecorder);
-                insList.append(new SWAP());
-                insList.append(insFactory.createInvoke(STACK_RECORDER_CLASS, 
getPushMethod(Type.OBJECT), Type.VOID, new Type[] { Type.OBJECT }, 
Constants.INVOKEVIRTUAL));
+                if(type.equals(Type.NULL)) {
+                    // if it's guaranteed to be null, no need to store.
+                    // in fact, we can't really store this, because we'll never
+                    // be able to restore it as the 'null' type.
+                    insList.append(InstructionConstants.POP);
+                } else {
+                    insList.append(loadStackRecorder);
+                    insList.append(InstructionConstants.SWAP);
+                    
insList.append(insFactory.createInvoke(STACK_RECORDER_CLASS, 
getPushMethod(Type.OBJECT), Type.VOID, new Type[] { Type.OBJECT }, 
Constants.INVOKEVIRTUAL));
+                }
             }
         }
         // add isCapturing test
@@ -687,18 +691,26 @@
                 insList.append(insFactory.createInvoke(STACK_RECORDER_CLASS, 
getPopMethod(type), type, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
                 insList.append(InstructionFactory.createStore(type, i));
             } else if (type == null) {
-                insList.append(new ACONST_NULL());
-                insList.append(InstructionFactory.createStore(new 
ObjectType("<null object>"), i));
+                insList.append(InstructionConstants.ACONST_NULL);
+                insList.append(new ASTORE(i));
             } else if (type instanceof UninitializedObjectType) {
                 // No uninitilaized objects should be found
                 // in the local variables.
+                throw new Error("assertion failure");
             } else if (type instanceof ReferenceType) {
-                insList.append(loadStackRecorder);
-                insList.append(insFactory.createInvoke(STACK_RECORDER_CLASS, 
getPopMethod(Type.OBJECT), Type.OBJECT, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
-                if (!type.equals(Type.OBJECT) && (!type.equals(Type.NULL))) {
-                    insList.append(insFactory.createCast(Type.OBJECT, type));
+                if (type.equals(Type.NULL)) {
+                    // null type is a special type assignable to any type,
+                    // whereas popObject returns a java/lang/Object.
+                    // the saveFrame method is written so that we don't save 
the 'null' object
+                    insList.append(InstructionConstants.ACONST_NULL);
+                } else {
+                    insList.append(loadStackRecorder);
+                    
insList.append(insFactory.createInvoke(STACK_RECORDER_CLASS, 
getPopMethod(Type.OBJECT), Type.OBJECT, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
+                    if (!type.equals(Type.OBJECT)) {
+                        insList.append(insFactory.createCast(Type.OBJECT, 
type));
+                    }
                 }
-                insList.append(InstructionFactory.createStore(type, i));
+                insList.append(new ASTORE(i));
             }
         }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to