[
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)