openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kevin Sutter (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (OPENJPA-2442) java.lang.VerifyError in TestProxyManager when loading a dynamically created custom proxy class on Oracle Java 8
Date Thu, 10 Apr 2014 19:36:20 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-2442?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13965756#comment-13965756
] 

Kevin Sutter commented on OPENJPA-2442:
---------------------------------------

Looked at the failing tests in openjpa-kernel. Built OpenJPA with Java 7, then attempted to
run the openjpa-kernel tests with Java 8 runtime.  I get 3 errors.  They are related to the
dynamic custom proxies generated for Map attributes in an Entity.  The errors are due to the
fact that OpenJPA does not properly recognize the new remove(key. value) method on the Map
interface.  Actually, it does sort of recognize it due to the ConcurrentHashMap interface,
but the existence of this remove(key, value) method just confuses our proxy generation.  I
don't have a complete answer yet, but I thought I would post what I have found out so that
we don't have to start over the next time...

>From the call stack of one of the failures:

testCopyMaps(org.apache.openjpa.util.TestProxyManager)  Time elapsed: 0.012 sec <<<
ERROR!
<openjpa-2.4.0-SNAPSHOT-r422266:1580972M nonfatal general error> org.apache.openjpa.util.GeneralException:
org.apache.openjpa.util.org$apache$openjpa$util$TestProxyManager$CustomMap$9$proxy
        at org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:72)

You can follow the code path and see that we are attempting to generate the bytecodes right
when we're trying to load the class.  Eventually, we get to this portion of the code in ProxyManagerImpl.generateProxyMapBytecode():

        Class<? extends ProxyMaps> mapProxyClassType =
            ConcurrentMap.class.isAssignableFrom(type) ? ProxyConcurrentMaps.class : ProxyMaps.class;
        proxyRecognizedMethods(bc, type, mapProxyClassType, ProxyMap.class);

This is where things go awry...  Since a standard Map now supports a remove(key, value) method,
we end up matching up with ProxyMaps instead of ProxyConcurrentMaps, which then generates
some strange code (from the javap output):

  public boolean remove(java.lang.Object, java.lang.Object);
    descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Z
    flags: ACC_PUBLIC
    Code:
      stack=4, locals=4, args_size=3
         0: aload_0       
         1: aload_1       
         2: aload_2       
         3: invokespecial #132                // Method org/apache/openjpa/util/TestProxyManager$CustomMap.remove:(Ljava/lang/Object;Ljava/lang/Object;)Z
         6: istore_3      
         7: aload_0       
         8: aload_1       
         9: aload_2       
        10: iload_3       
        11: invokestatic  #101                // Method org/apache/openjpa/util/ProxyMaps.afterRemove:(Lorg/apache/openjpa/util/ProxyMap;Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
        14: ireturn       

There is no matching beforeRemove() method invoked -- which should be a standard practice
of having matching before/after calls.  And, the afterRemove() method that is invoked on ProxyMaps
really doesn't match the expected processing of the remove(key, value) method.  Looking at
our code a bit, it looks like the use of the ProxyConcurrentMaps interface would have been
a better match.  At least the remove(key, value) method is already recognized...

Anyway, that's what I have so far.  I don't know if this is simply a matter of including processing
for remove(key, value) in ProxyMaps, or if there's something more involved than that.  Need
more time to experiment and I have run out of that for the time being...  :-)  Good luck to
the next player.


> java.lang.VerifyError in TestProxyManager when loading a dynamically created custom proxy
class on Oracle Java 8
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-2442
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2442
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.4.0
>         Environment: >java -version
> java version "1.8.0-ea"
> Java(TM) SE Runtime Environment (build 1.8.0-ea-b109)
> Java HotSpot(TM) 64-Bit Server VM (build 25.0-b51, mixed mode)
>            Reporter: Rick Curtis
>
> While testing with Java 8 I encountered the following error noted below[1]. I'm opening
this JIRA as I want to get all known issues documented.
> [1]
> <openjpa-2.3.0-SNAPSHOT-r422266:1532833M nonfatal general error> org.apache.openjpa.util.GeneralException:
org.apache.openjpa.util.java$util$TreeMap$6$proxy
> 	at org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:71)
> 	at org.apache.openjpa.util.ProxyManagerImpl.getFactoryProxyMap(ProxyManagerImpl.java:407)
> 	at org.apache.openjpa.util.ProxyManagerImpl.copyMap(ProxyManagerImpl.java:222)
> 	at org.apache.openjpa.util.TestProxyManager.testCopySortedMaps(TestProxyManager.java:421)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:491)
> 	at junit.framework.TestCase.runTest(TestCase.java:154)
> 	at junit.framework.TestCase.runBare(TestCase.java:127)
> 	at junit.framework.TestResult$1.protect(TestResult.java:106)
> 	at junit.framework.TestResult.runProtected(TestResult.java:124)
> 	at junit.framework.TestResult.run(TestResult.java:109)
> 	at junit.framework.TestCase.run(TestCase.java:118)
> 	at junit.framework.TestSuite.runTest(TestSuite.java:208)
> 	at junit.framework.TestSuite.run(TestSuite.java:203)
> 	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
> 	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> 	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)
> Caused by: java.lang.VerifyError: (class: org/apache/openjpa/util/java$util$TreeMap$6$proxy,
method: remove signature: (Ljava/lang/Object;Ljava/lang/Object;)Z) Expecting to find integer
on stack
> 	at java.lang.Class.forName0(Native Method)
> 	at java.lang.Class.forName(Class.java:339)
> 	at org.apache.openjpa.util.GeneratedClasses.loadBCClass(GeneratedClasses.java:67)
> 	... 21 more



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Mime
View raw message