"Recursive" lambda makes the compiler crash
Grégoire Neuville
gregoire.neuville at gmail.com
Sat Jul 20 04:18:37 PDT 2013
Thanks for the info !
On 20 July 2013 13:11, maurizio cimadamore
<maurizio.cimadamore at oracle.com>wrote:
> Hi - thanks for the report - we are aware of the issue [1], which is
> currently being worked on.
> It appears that some patch that went in for supporting type-annotations
> (JSR 308) broke translation support for lambda expression in certain cases.
>
> [1] - http://bugs.sun.com/view_bug.**do?bug_id=8020715<http://bugs.sun.com/view_bug.do?bug_id=8020715>
>
> Thanks
> Maurizio
>
>
> On 20-Jul-13 12:00 PM, Grégoire Neuville wrote:
>
>> Hello,
>>
>> The following code :
>>
>> public static <A, B> F<Stream<A>, Promise<B>> foldRightS(final
>> Strategy<Unit> s, final F<A, F<P1<B>, B>> f, final B b) {
>>
>> final class Folder {
>> final F<Stream<A>, Promise<B>> foldr = as -> as.isEmpty() ?
>> promise(s, P.p(b)) :
>> liftM2(f).f(promise(s, P.p(as.head())))
>> .f(Promise.<P1<B>>join(s, () ->
>> foldr.f(as.tail()._1()).fmap(**P.p1())));
>> }
>>
>> return new Folder().foldr;
>> }
>>
>> makes the compile crash (cf. stack trace below).
>>
>> That one however :
>>
>> public static <A, B> F<Stream<A>, Promise<B>> foldRightS(final
>> Strategy<Unit> s, final F<A, F<P1<B>, B>> f, final B b) {
>>
>> final F<Stream<A>, Promise<B>> foldr = new F<Stream<A>,
>> Promise<B>>() {
>> final F<Stream<A>, Promise<B>> self = this;
>> public Promise<B> f(Stream<A> as) {
>> return as.isEmpty() ?
>> promise(s, P.p(b)) :
>> liftM2(f).f(promise(s, P.p(as.head())))
>> .f(Promise.<P1<B>>join(s, () ->
>> self.f(as.tail()._1()).fmap(P.**p1())));
>> }
>> };
>>
>> return foldr;
>> }
>>
>> compiles fine.
>>
>> Hope that'll help
>>
>> Grégoire Neuville.
>>
>> Stack trace on crash :
>>
>> java.lang.ClassCastException: com.sun.tools.javac.code.**
>> Symbol$ClassSymbol
>> cannot be cast to com.sun.tools.javac.code.**Symbol$MethodSymbol
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitLambda(**
>> LambdaToMethod.java:259)
>> at com.sun.tools.javac.tree.**JCTree$JCLambda.accept(JCTree.**java:1609)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitVarDef(**
>> TreeTranslator.java:153)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitVarDef(**
>> LambdaToMethod.java:448)
>> at com.sun.tools.javac.tree.**JCTree$JCVariableDecl.accept(**
>> JCTree.java:846)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:70)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitClassDef(**
>> TreeTranslator.java:134)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitClassDef(**
>> LambdaToMethod.java:230)
>> at com.sun.tools.javac.tree.**JCTree$JCClassDecl.accept(**
>> JCTree.java:687)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:70)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitBlock(**
>> TreeTranslator.java:162)
>> at com.sun.tools.javac.tree.**JCTree$JCBlock.accept(JCTree.**java:903)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitMethodDef(**
>> TreeTranslator.java:145)
>> at com.sun.tools.javac.tree.**JCTree$JCMethodDecl.accept(**
>> JCTree.java:772)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:70)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitClassDef(**
>> TreeTranslator.java:134)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitClassDef(**
>> LambdaToMethod.java:230)
>> at com.sun.tools.javac.tree.**JCTree$JCClassDecl.accept(**
>> JCTree.java:687)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.**translateTopLevelClass(**
>> LambdaToMethod.java:210)
>> at com.sun.tools.javac.main.**JavaCompiler.desugar(**
>> JavaCompiler.java:1442)
>> at com.sun.tools.javac.main.**JavaCompiler.desugar(**
>> JavaCompiler.java:1327)
>> at com.sun.tools.javac.main.**JavaCompiler.compile2(**
>> JavaCompiler.java:877)
>> at com.sun.tools.javac.main.**JavaCompiler.compile(**
>> JavaCompiler.java:836)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:517)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:376)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:365)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:356)
>> at com.sun.tools.javac.Main.**compile(Main.java:77)
>> at com.sun.tools.javac.Main.main(**Main.java:62)
>>
>>
>
--
Grégoire Neuville
More information about the lambda-dev
mailing list