Return-Path: X-Original-To: apmail-openjpa-dev-archive@www.apache.org Delivered-To: apmail-openjpa-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id ADB5811C47 for ; Thu, 10 Apr 2014 19:36:42 +0000 (UTC) Received: (qmail 37348 invoked by uid 500); 10 Apr 2014 19:36:34 -0000 Delivered-To: apmail-openjpa-dev-archive@openjpa.apache.org Received: (qmail 36130 invoked by uid 500); 10 Apr 2014 19:36:28 -0000 Mailing-List: contact dev-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list dev@openjpa.apache.org Received: (qmail 35188 invoked by uid 99); 10 Apr 2014 19:36:20 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 10 Apr 2014 19:36:20 +0000 Date: Thu, 10 Apr 2014 19:36:20 +0000 (UTC) From: "Kevin Sutter (JIRA)" To: dev@openjpa.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (OPENJPA-2442) java.lang.VerifyError in TestProxyManager when loading a dynamically created custom proxy class on Oracle Java 8 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ 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! 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 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] > 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)