groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mauro Molinari <mauro...@tiscali.it>
Subject Re: Which issue do you MOST want to fix
Date Wed, 20 Feb 2019 12:41:54 GMT
Hi Daniel,
yes, I followed the bug report thank you!
Indeed, I would have at least another GroovyCastException case when 
using @CompileStatic, which however is unrelated to that fix. I can 
easily reproduce with a project we use internally, which is however 
tightly bound to our internal services. Today I spent almost two hours 
to try to isolate the problem in a self-contained test case, but I could 
not succeed :-(

Any idea on what path I may follow to help you further investigate the 
problem?

The code breaks at a point like this:

|@CompileStatic||
|
|public MyClass {|
|  // [...]||
|
|
|
|  private static Foo createFoo(final String type, final Object value) {|
|    if(!type || !value) ||
|
|      return null;|
|    def result = new Foo()|
|    result.with {|
|      beginUpdate()|
|      try {|
|        prop1 = anotherStaticMethodReturningString('blah')|
|        if(value instanceof String)|
|          prop2 = anotherStaticMethodReturningString('oh')|
|        else if (value instanceof BigDecimal)|
|          prop3 = (BigDecimal) value|
|       // else if - other cases of instanceof||
|
|      } finally {|
|        endUpdate()||
|
|      }||
|
|    }|
|    return result;||
|
|  }|
|
|
|  // [...]||
|
|}||
|

where:

  * |Foo| is a Java class coming from a JAR
  * |beginUpdate()| and |endUpdate()| are methods defined in |Foo|
  * |prop1|, |prop2| and |prop3| are properties defined in |Foo| (i.e.:
    there are getters and setters for them)

The exception occurs at the invocation of |endUpdate()| with the 
following exception:

|org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot 
cast object 'class test.MyClass' with class 'java.lang.Class' to class 
'anotherpackage.Foo'||
||    at 
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:414)||
||    at 
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:328)||
||    at 
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:242)||
||    at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:615)||
||    at test.MyClass$_createFoo_closure6.doCall(MyClass.groovy:295)||
||    at test.MyClass$_createFoo_closure6.call(MyClass.groovy)||
||    at 
org.codehaus.groovy.runtime.DefaultGroovyMethods.with(DefaultGroovyMethods.java:369)||
||    at 
org.codehaus.groovy.runtime.DefaultGroovyMethods.with(DefaultGroovyMethods.java:316)||
||    at test.MyClass.createFoo(MyClass.groovy:275)|

So, it seems like it's trying to invoke |endUpdate()| on |MyClass| class 
instance rather than on the |Foo| instance to which |with| should 
delegate to.

The problem goes away if either:

  * I remove |@CompileStatic| (or I just add |@CompileDynamic| to
    |createFoo()| method)||
  * I apply to |MyClass| (or maybe to the consumer code using |MyClass|)
    a sufficient amount of changes (but I can't say exactly which ones)|
    |

Any idea?

Mauro

Il 20/02/2019 11:34, Daniel Sun ha scritto:
> Hi Mauro,
>
> The issue you most want to fix is fixed:
> https://github.com/apache/groovy/commit/f44449ebd615cb5d5f766a30b2a6e904084acece
>
> Cheers,
> Daniel.Sun
>
>
>
>
> --
> Sent from: http://groovy.329449.n5.nabble.com/Groovy-Users-f329450.html



Mime
View raw message