You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2017/05/02 02:03:09 UTC

[jira] [Closed] (GROOVY-7325) Verify error cloning a HashSet under CompileStatic conditions

     [ https://issues.apache.org/jira/browse/GROOVY-7325?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Paul King closed GROOVY-7325.
-----------------------------

> Verify error cloning a HashSet under CompileStatic conditions
> -------------------------------------------------------------
>
>                 Key: GROOVY-7325
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7325
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation
>    Affects Versions: 2.4.1
>            Reporter: Tim Yates
>            Assignee: Cédric Champeau
>             Fix For: 2.5.0-alpha-1
>
>
> Taken from:
> http://stackoverflow.com/questions/28761736/java-lang-verifyerror-bad-access-to-protected-data
> The code:
> {code}
> import groovy.transform.CompileStatic
> @CompileStatic
> class Test {
>   final Set<String> HISTORY = [] as HashSet
>   Set<String> getHistory() {
>     return HISTORY.clone() as HashSet<String>
>   }
> }
> Test test = new Test()
> println test.history
> {code}
> Results in the VerifyError:
> {code}
> java.lang.VerifyError: (class: Test, method: getHistory signature: ()Ljava/util/Set;) Bad access to protected data
> 	at java.lang.Class.getDeclaredConstructors0(Native Method)
> 	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2663)
> 	at java.lang.Class.getDeclaredConstructors(Class.java:2012)
> 	at org.codehaus.groovy.reflection.CachedClass$2$1.run(CachedClass.java:71)
> 	at java.security.AccessController.doPrivileged(Native Method)
> 	at org.codehaus.groovy.reflection.CachedClass$2.initValue(CachedClass.java:68)
> 	at org.codehaus.groovy.reflection.CachedClass$2.initValue(CachedClass.java:66)
> 	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
> 	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
> 	at org.codehaus.groovy.reflection.CachedClass.getConstructors(CachedClass.java:265)
> 	at groovy.lang.MetaClassImpl.<init>(MetaClassImpl.java:215)
> 	at groovy.lang.MetaClassImpl.<init>(MetaClassImpl.java:225)
> 	at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createNormalMetaClass(MetaClassRegistry.java:168)
> 	at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.createWithCustomLookup(MetaClassRegistry.java:158)
> 	at groovy.lang.MetaClassRegistry$MetaClassCreationHandle.create(MetaClassRegistry.java:141)
> 	at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:250)
> 	at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:282)
> 	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:255)
> 	at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:872)
> 	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallConstructorSite(CallSiteArray.java:84)
> 	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:232)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:236)
> 	at ConsoleScript0.run(ConsoleScript0:12)
> 	at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:261)
> 	at groovy.lang.GroovyShell.run(GroovyShell.java:522)
> 	at groovy.lang.GroovyShell.run(GroovyShell.java:501)
> 	at groovy.lang.GroovyShell.run(GroovyShell.java:168)
> 	at groovy.lang.GroovyShell$run$1.call(Unknown Source)
> 	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:138)
> 	at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy:977)
> 	at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:483)
> 	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
> 	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
> 	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
> 	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
> 	at groovy.lang.Closure.call(Closure.java:423)
> 	at groovy.lang.Closure.call(Closure.java:417)
> 	at groovy.lang.Closure.run(Closure.java:504)
> 	at java.lang.Thread.run(Thread.java:745)
> {code}
> A workaround is to change the line:
> {code}
>   final Set<String> HISTORY = [] as HashSet
> {code}
> To
> {code}
>   final HashSet<String> HISTORY = [] as HashSet
> {code}
> Then you get expected behaviour



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)