Browse Source

fixed JIRA JASSIST-241

tags/rel_3_20_0_ga
chibash 9 years ago
parent
commit
e59339343a

BIN
javassist.jar View File


+ 8
- 2
src/main/javassist/CtBehavior.java View File

@@ -917,7 +917,9 @@ public abstract class CtBehavior extends CtMember {
// the gap length might be a multiple of 4.
iterator.writeByte(Opcode.NOP, pos);
boolean wide = subr + 2 - pos > Short.MAX_VALUE;
pos = iterator.insertGapAt(pos, wide ? 4 : 2, false).position;
int len = wide ? 4 : 2;
CodeIterator.Gap gap = iterator.insertGapAt(pos, len, false);
pos = gap.position + gap.length - len;
int offset = iterator.getMark() - pos;
if (wide) {
iterator.writeByte(Opcode.GOTO_W, pos);
@@ -928,7 +930,11 @@ public abstract class CtBehavior extends CtMember {
iterator.write16bit(offset, pos + 1);
}
else {
pos = iterator.insertGapAt(pos, 2, false).position;
if (gap.length < 4) {
CodeIterator.Gap gap2 = iterator.insertGapAt(gap.position, 2, false);
pos = gap2.position + gap2.length + gap.length - 4;
}

iterator.writeByte(Opcode.GOTO_W, pos);
iterator.write32bit(iterator.getMark() - pos, pos + 1);
}

+ 1
- 0
src/main/javassist/bytecode/stackmap/BasicBlock.java View File

@@ -360,6 +360,7 @@ public class BasicBlock {
prev.length = m.position - prev.position;
// the incoming flow from dead code is not counted
// bb.incoming++;
prev.stop = true; // because the incoming flow is not counted.
prev.exit = makeArray(bb);
}
}

+ 2
- 2
src/test/javassist/JvstTest4.java View File

@@ -661,9 +661,9 @@ public class JvstTest4 extends JvstTestRoot {
long t2 = endTime2 - endTime;
long t3 = endTime3 - endTime2;
System.out.println("JIRA150: " + t1 + ", " + t2 + ", " + t3);
assertTrue("performance test (the next try may succeed): " + t1 + "/ 6 < " + t2,
assertTrue("performance test (the next try may succeed): " + t2 + " < 6 * " + t1,
t2 < t1 * 6);
assertTrue("", t3 < t1 * 3);
assertTrue(t3 + " < 3 * " + t1, t3 < t1 * 3);
}

public void testJIRA150b() throws Exception {

+ 9
- 0
src/test/javassist/JvstTest5.java View File

@@ -44,4 +44,13 @@ public class JvstTest5 extends JvstTestRoot {
Annotation[] annos = t.getAnnotations();
assertEquals("@test5.TypeAnnoA()", annos[0].toString());
}

public void testJIRA241() throws Exception {
CtClass cc = sloader.get("test5.JIRA241");
CtMethod testMethod = cc.getDeclaredMethod("test");
testMethod.insertAfter("System.out.println(\"inserted!\");");
cc.writeFile();
Object obj = make(cc.getName());
assertEquals(10, invoke(obj, "run"));
}
}

+ 33
- 0
src/test/test5/JIRA241.java View File

@@ -0,0 +1,33 @@
package test5;

import java.util.Random;
import javassist.*;

public class JIRA241 {
public int run() {
test(this);
return 10;
}

public static void test(Object o) {
//part 1
if (o == null) {
return;
}
//part 2
int oper = new Random().nextInt();
switch (oper) {
case 1:
break;
}
}

public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("test5.JIRA241");
CtMethod testMethod = cc.getMethod("test", "(Ljava/lang/Object;)V");
testMethod.insertAfter("System.out.println(\"inserted!\");");
cc.writeFile();
}
}

Loading…
Cancel
Save