[jboss-jira] [JBoss JIRA] (JASSIST-205) "VerifyError: Inconsistent stackmap frames" from PowerMock (using Javassist 3.18)

Scott Marlow (JIRA) jira-events at lists.jboss.org
Fri Aug 2 17:16:28 EDT 2013


    [ https://issues.jboss.org/browse/JASSIST-205?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12794891#comment-12794891 ] 

Scott Marlow commented on JASSIST-205:
--------------------------------------

For the if_acmpeq, Tracer.doOpcode148_201(int pos, byte[] code, int op) decrements the operand stack top pointer by two (for the two references that will be popped off the stack).  Since the action is to branch or not to target, what exactly is being verified for instruction if_acmpeq?  Probably the types of the references popped off the stack.  

Looking at the two references on the operand stack, which is based on the previous two instructions:

{code}
       272: aload_3       
       273: aconst_null   
       274: if_acmpeq     283
{code}

I'll investigate what happened with the aload_3 next
aload_3
                
> "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


More information about the jboss-jira mailing list