@@ -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); | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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 { |
@@ -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")); | |||
} | |||
} |
@@ -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(); | |||
} | |||
} |