[
https://issues.apache.org/jira/browse/GROOVY-11079?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17728867#comment-17728867
]
Christopher Smith commented on GROOVY-11079:
--------------------------------------------
Update: This entire section is inside a {{forEach}}, which expects a
{{Consumer}} (closure2), and I think perhaps the outside closure's void return
may be "pulling inside" and leading to the compiler trying really hard to get a
{{Void}} out of the nested closure.
> GroovyCastException on closure implementing Consumer
> ----------------------------------------------------
>
> Key: GROOVY-11079
> URL: https://issues.apache.org/jira/browse/GROOVY-11079
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 4.0.12
> Reporter: Christopher Smith
> Priority: Major
>
> I'm having trouble making a minimal repro for this one, but here's the actual
> code. Libraries are PDFBox (PDDocument) and Vavr. The bytecode problem seems
> to be that although 31 pushes {{null}} onto the stack, it's popped before
> being cast to {{Void}}, leaving the {{String}} on top. Shouldn't these be
> reversed?
> {code}
> loadOriginal(ep.payload)
> .onSuccess { sps.envelope.filename = it._1 } // exception thrown at the
> end of this closure
> .<PDDocument> map(Tuple2::_2)
> {code}
> {code}
> org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast
> object 'dummy.pdf' with class 'java.lang.String' to class 'java.lang.Void'
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:424)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:335)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:255)
> at
> org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
> at
> com.example.EsignFinisherImpl$_notifySignatureApplied_closure2$_closure11.doCall(EsignFinisherImpl.groovy:70)
> {code}
> {code}
> public java.lang.Void doCall(java.lang.Object);
> descriptor: (Ljava/lang/Object;)Ljava/lang/Void;
> flags: (0x0001) ACC_PUBLIC
> Code:
> stack=3, locals=3, args_size=2
> 0: aload_1
> 1: checkcast #35 // class io/vavr/Tuple2
> 4: getfield #38 // Field
> io/vavr/Tuple2._1:Ljava/lang/Object;
> 7: dup
> 8: astore_2
> 9: aload_0
> 10: getfield #27 // Field
> sps:Lgroovy/lang/Reference;
> 13: invokevirtual #44 // Method
> groovy/lang/Reference.get:()Ljava/lang/Object;
> 16: checkcast #46 // class SignaturePageSpec
> 19: invokevirtual #50 // Method
> SignaturePageSpec.getEnvelope:()LSignaturePageSpec$Envelope;
> 22: aload_2
> 23: invokedynamic #64, 0 // InvokeDynamic
> #0:cast:(Ljava/lang/Object;)Ljava/lang/String;
> 28: invokevirtual #70 // Method
> SignaturePageSpec$Envelope.setFilename:(Ljava/lang/String;)V
> 31: aconst_null
> 32: pop
> 33: invokedynamic #72, 0 // InvokeDynamic
> #0:cast:(Ljava/lang/Object;)Ljava/lang/Void;
> 38: areturn
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)