Daniel Sun created GROOVY-9322:
----------------------------------

             Summary: Make method reference Serializable
                 Key: GROOVY-9322
                 URL: https://issues.apache.org/jira/browse/GROOVY-9322
             Project: Groovy
          Issue Type: Improvement
            Reporter: Daniel Sun


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)

Reply via email to