Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
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.
We need generate a synthetic method $deserializeLambda$ in bytecode like the following:
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
Attachments
Issue Links
- is cloned by
-
GROOVY-9322 Support serializable method reference
- Open
- relates to
-
GROOVY-11137 Improve support for union and intersection types
- Open
- links to