[ 
https://issues.apache.org/jira/browse/GROOVY-11993?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18078268#comment-18078268
 ] 

ASF GitHub Bot commented on GROOVY-11993:
-----------------------------------------

Copilot commented on code in PR #2514:
URL: https://github.com/apache/groovy/pull/2514#discussion_r3183382138


##########
src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionalInterfaceWriter.java:
##########
@@ -156,4 +179,92 @@ default Parameter prependParameter(final List<Parameter> 
parameterList, final St
         parameterList.add(0, parameter);
         return parameter;
     }
+
+    default SerializedLambdaKey createSerializedLambdaKey(final String 
abstractMethodDesc, final int implMethodKind, final ClassNode implClass, final 
MethodNode implMethod, final Parameter[] parameters, final ClassNode 
functionalType, final MethodNode abstractMethod, final int capturedArgCount) {
+        return new SerializedLambdaKey(
+                implMethodKind,
+                getClassInternalName(implClass),
+                implMethod.getName(),
+                getMethodDescriptor(implMethod),
+                getClassInternalName(functionalType.redirect()),
+                abstractMethod.getName(),
+                abstractMethodDesc,
+                createInstantiatedMethodType(abstractMethodDesc, implMethod, 
parameters).getDescriptor(),
+                capturedArgCount
+        );
+    }
+
+    default void addDeserializeLambdaDispatcherEntry(final WriterController 
controller, final Parameter[] parameters, final SerializedLambdaKey key, final 
MethodNode helperMethod) {
+        BlockStatement dispatcher = 
getOrAddDeserializeLambdaDispatcher(controller, parameters);
+        MethodCallExpression helperCall = 
callX(classX(controller.getClassNode()), helperMethod.getName(), 
args(varX(parameters[0])));
+        helperCall.setImplicitThis(false);
+        helperCall.setMethodTarget(helperMethod);
+
+        List<Statement> statements = dispatcher.getStatements();
+        statements.add(statements.size() - 1, 
ifS(boolX(matchesSerializedLambda(varX(parameters[0]), key)), 
returnS(helperCall)));
+    }
+
+    default BlockStatement getOrAddDeserializeLambdaDispatcher(final 
WriterController controller, final Parameter[] parameters) {
+        ClassNode enclosingClass = controller.getClassNode();
+        BlockStatement dispatcher = 
enclosingClass.getNodeMetaData(DeserializeLambdaDispatcher.class);
+        if (dispatcher != null) {
+            return dispatcher;
+        }
+
+        dispatcher = new BlockStatement();
+        
dispatcher.addStatement(returnS(callX(classX(ClassHelper.make(Objects.class)), 
"requireNonNull", args(nullX(), constX("Invalid lambda deserialization")))));
+

Review Comment:
   The dispatcher fallback currently does `Objects.requireNonNull(null, 
"Invalid lambda deserialization")`, which will always throw a 
NullPointerException. This works as a fail-fast, but it’s non-obvious and 
produces an exception type/stacktrace that’s harder to diagnose. Consider 
replacing this with an explicit `throw` of a more appropriate exception (e.g., 
`java.io.InvalidObjectException` or `IllegalArgumentException`) so 
invalid/mismatched SerializedLambda cases are clearer.





> Support serializable method reference
> -------------------------------------
>
>                 Key: GROOVY-11993
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11993
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Daniel Sun
>            Priority: Major
>




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to