summaryrefslogtreecommitdiffstats
path: root/src/main/javassist/bytecode/stackmap/Tracer.java
diff options
context:
space:
mode:
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2007-05-29 03:51:47 +0000
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>2007-05-29 03:51:47 +0000
commit2cecffb9c750eeb468700e90a00710821ad534c3 (patch)
tree7c6dfb8e1ee17a43344953e3061c7243ec2023c3 /src/main/javassist/bytecode/stackmap/Tracer.java
parentf57f2a7450beac7f29b7287ed27f4ff32b8ed3dc (diff)
downloadjavassist-2cecffb9c750eeb468700e90a00710821ad534c3.tar.gz
javassist-2cecffb9c750eeb468700e90a00710821ad534c3.zip
fixed bugs of javassist.bytecode.stackmap
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@375 30ef5769-5b8d-40dd-aea6-55b5d6557bb3
Diffstat (limited to 'src/main/javassist/bytecode/stackmap/Tracer.java')
-rw-r--r--src/main/javassist/bytecode/stackmap/Tracer.java18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/main/javassist/bytecode/stackmap/Tracer.java b/src/main/javassist/bytecode/stackmap/Tracer.java
index bae3ae16..8142f103 100644
--- a/src/main/javassist/bytecode/stackmap/Tracer.java
+++ b/src/main/javassist/bytecode/stackmap/Tracer.java
@@ -307,7 +307,7 @@ public abstract class Tracer implements TypeTag {
return 2;
}
- private int doOpcode54_95(int pos, byte[] code, int op) {
+ private int doOpcode54_95(int pos, byte[] code, int op) throws BadBytecode {
TypeData[] localsTypes = this.localsTypes;
TypeData[] stackTypes = this.stackTypes;
switch (op) {
@@ -366,11 +366,18 @@ public abstract class Tracer implements TypeTag {
case Opcode.LASTORE :
case Opcode.FASTORE :
case Opcode.DASTORE :
+ stackTop -= (op == Opcode.LASTORE || op == Opcode.DASTORE) ? 4 : 3;
+ break;
case Opcode.AASTORE :
+ TypeData.setType(stackTypes[stackTop - 1],
+ TypeData.ArrayElement.getElementType(stackTypes[stackTop - 3].getName()),
+ classPool);
+ stackTop -= 3;
+ break;
case Opcode.BASTORE :
case Opcode.CASTORE :
case Opcode.SASTORE :
- stackTop -= (op == Opcode.LASTORE || op == Opcode.DASTORE) ? 4 : 3;
+ stackTop -= 3;
break;
case Opcode.POP :
stackTop--;
@@ -437,7 +444,6 @@ public abstract class Tracer implements TypeTag {
stackTop--;
// implicit upcast might be done.
localsTypes[index] = stackTypes[stackTop].copy();
-
return 2;
}
@@ -632,6 +638,7 @@ public abstract class Tracer implements TypeTag {
= new TypeData.ClassName(type);
return 3; }
case Opcode.ARRAYLENGTH :
+ TypeData.setType(stackTypes[stackTop - 1], "[Ljava.lang.Object;", classPool);
stackTypes[stackTop - 1] = INTEGER;
break;
case Opcode.ATHROW :
@@ -639,17 +646,18 @@ public abstract class Tracer implements TypeTag {
visitThrow(pos, code);
break;
case Opcode.CHECKCAST : {
- // TypeData.setType(stackData[stackTop - 1], "java.lang.Object", classPool);
+ // TypeData.setType(stackTypes[stackTop - 1], "java.lang.Object", classPool);
int i = ByteArray.readU16bit(code, pos + 1);
stackTypes[stackTop - 1] = new TypeData.ClassName(cpool.getClassInfo(i));
return 3; }
case Opcode.INSTANCEOF :
- // TypeData.setType(stackData[stackTop - 1], "java.lang.Object", classPool);
+ // TypeData.setType(stackTypes[stackTop - 1], "java.lang.Object", classPool);
stackTypes[stackTop - 1] = INTEGER;
return 3;
case Opcode.MONITORENTER :
case Opcode.MONITOREXIT :
stackTop--;
+ // TypeData.setType(stackTypes[stackTop], "java.lang.Object", classPool);
break;
case Opcode.WIDE :
return doWIDE(pos, code);