[
https://issues.jboss.org/browse/JASSIST-205?page=com.atlassian.jira.plugi...
]
Scott Marlow commented on JASSIST-205:
--------------------------------------
internally, we have TypedBlock.resetNumLocals() that removes TOP types from the end of the
locals array (only if the previous type is not long or double which take two slots).
However, after the two calls to MethodCall.replace(String) occurs, we go from:
locals { Object_variable, Object_variable}
To:
locals { Object_variable, Object_variable, Object_variable, Object_variable,
Long_variable, Null_variable, Top_variable, Null_variable}
As shown in debug output:
{quote}
TypedBlock.resetNumLocals. tag#0, == 7
TypedBlock.resetNumLocals. tag#1, == 7
TypedBlock.resetNumLocals. tag#2, == 7
TypedBlock.resetNumLocals. tag#3, == 7
TypedBlock.resetNumLocals. tag#4, == 4
TypedBlock.resetNumLocals. tag#5, == 5
TypedBlock.resetNumLocals. tag#6, == 0
TypedBlock.resetNumLocals. tag#7, == 5
{quote}
This is just something interesting that I noticed, not sure if it is important or not
(that we have a Top_variable at locals offset 6.)
"VerifyError: Inconsistent stackmap frames" from PowerMock
(using Javassist 3.18)
---------------------------------------------------------------------------------
Key: JASSIST-205
URL:
https://issues.jboss.org/browse/JASSIST-205
Project: Javassist
Issue Type: Bug
Affects Versions: 3.18.0-GA
Environment: jdk1.7.0_21, Win8amd64
Reporter: Ryan Kenney
Assignee: Shigeru Chiba
Attachments: PowerMockDemo.zip, powermockdemoDEBUG.txt, PowerMockTest.class,
PowerMockTest.javap, PowerMockTestCorrectedOffsets.javap, PowerMockTest_jdk8.javap,
TEST-PowerMockTest.xml
Apologies if this is a duplicate of JASSIST-204. I didn't delve into the actual
Javassist APIs used, I'm simply seeing an error in my PowerMock usage. Fortunately,
this ticket provides a very simple test case for reproducibility.
I was prompted to open a Javassist ticket by the following PowerMock ticket:
https://code.google.com/p/powermock/issues/detail?id=355
I'm attaching a very simple maven project with a unit test to demonstrate the
problem.
Here are the guts of the failing unit test:
{code}
@RunWith(PowerMockRunner.class)
@PrepareForTest( {MyClassUnderTest.class} )
public class PowerMockTest {
/**************************************************************************
* Demonstrates an "Inconsistent stackmap frames" exception that results
* from PowerMock 1.5 and JDK 7.
*************************************************************************/
@Test
public void testWaitForExitMockMonitors() throws InterruptedException {
resetAll();
Object mockMonitor = createStrictMock(Object.class);
MyClassUnderTest myClass = new MyClassUnderTest(mockMonitor);
mockMonitor.wait(0);
mockMonitor.notifyAll();
replayAll();
myClass .run();
verifyAll();
}
public static class MyClassUnderTest {
private Object m_monitor;
public MyClassUnderTest(Object monitor) {
m_monitor = monitor;
}
public void run() throws InterruptedException {
m_monitor.wait(0);
m_monitor.notifyAll();
}
}
}
{code}
And here is my error:
{code}
java.lang.VerifyError: Inconsistent stackmap frames at branch target 283 in method
com.scea.dart.cmd.targetcontrol.target.process.PowerMockTest.testWaitForExitMockMonitors()V
at offset 274
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.privateGetPublicMethods(Class.java:2571)
at java.lang.Class.getMethods(Class.java:1429)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.getTestMethods(PowerMockJUnit44RunnerDelegateImpl.java:95)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:71)
at
org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl.<init>(PowerMockJUnit49RunnerDelegateImpl.java:29)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:143)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:39)
at
org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:217)
at
org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:59)
at
org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:33)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at
org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at
org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira