You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (Jira)" <ji...@apache.org> on 2019/11/29 09:49:00 UTC
[jira] [Updated] (GROOVY-9320) Make lambda expression Serializable
[ https://issues.apache.org/jira/browse/GROOVY-9320?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Daniel Sun updated GROOVY-9320:
-------------------------------
Fix Version/s: 3.0.0-rc-2
> Make lambda expression Serializable
> -----------------------------------
>
> Key: GROOVY-9320
> URL: https://issues.apache.org/jira/browse/GROOVY-9320
> Project: Groovy
> Issue Type: Improvement
> Reporter: Daniel Sun
> Priority: Major
> Fix For: 3.0.0-rc-2
>
>
> Here is a word count example for Flink.
> As groovy's lambda expression is not serializable, the following code has to be replaced with {{sum(1)}} as workaround, or {{java.io.NotSerializableException: Non-serializable lambda}} will be raised.
> https://github.com/danielsun1106/flink-wordcount/blob/0.1/src/main/groovy/me/sunlan/flinklabs/wordcount/WordCount.groovy#L49
> We need generate a synthetic method {{$deserializeLambda$}} in bytecode like the following:
> {code:java}
> private static synthetic $deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;
> L0
> LINENUMBER 3 L0
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getImplMethodName ()Ljava/lang/String;
> ASTORE 1
> ICONST_M1
> ISTORE 2
> ALOAD 1
> INVOKEVIRTUAL java/lang/String.hashCode ()I
> LOOKUPSWITCH
> -50212388: L1
> default: L2
> L1
> FRAME APPEND [java/lang/String I]
> ALOAD 1
> LDC "lambda$main$9f099bdf$1"
> INVOKEVIRTUAL java/lang/String.equals (Ljava/lang/Object;)Z
> IFEQ L2
> ICONST_0
> ISTORE 2
> L2
> FRAME SAME
> ILOAD 2
> LOOKUPSWITCH
> 0: L3
> default: L4
> L3
> FRAME SAME
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getImplMethodKind ()I
> BIPUSH 6
> IF_ICMPNE L4
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getFunctionalInterfaceClass ()Ljava/lang/String;
> LDC "java/lang/Runnable"
> INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
> IFEQ L4
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodName ()Ljava/lang/String;
> LDC "run"
> INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
> IFEQ L4
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getFunctionalInterfaceMethodSignature ()Ljava/lang/String;
> LDC "()V"
> INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
> IFEQ L4
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getImplClass ()Ljava/lang/String;
> LDC "Test"
> INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
> IFEQ L4
> ALOAD 0
> INVOKEVIRTUAL java/lang/invoke/SerializedLambda.getImplMethodSignature ()Ljava/lang/String;
> LDC "()V"
> INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
> IFEQ L4
> INVOKEDYNAMIC run()Ljava/lang/Runnable; [
> // handle kind 0x6 : INVOKESTATIC
> java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
> // arguments:
> ()V,
> // handle kind 0x6 : INVOKESTATIC
> Test.lambda$main$9f099bdf$1()V,
> ()V,
> 5,
> 0
> ]
> ARETURN
> L4
> FRAME CHOP 2
> NEW java/lang/IllegalArgumentException
> DUP
> LDC "Invalid lambda deserialization"
> INVOKESPECIAL java/lang/IllegalArgumentException.<init> (Ljava/lang/String;)V
> ATHROW
> MAXSTACK = 3
> MAXLOCALS = 3
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)