rednaxelafx commented on a change in pull request #28463:
URL: https://github.com/apache/spark/pull/28463#discussion_r421315768
##########
File path: core/src/main/scala/org/apache/spark/util/ClosureCleaner.scala
##########
@@ -414,6 +433,142 @@ private[spark] object ClosureCleaner extends Logging {
}
}
+private[spark] object IndylambdaScalaClosures extends Logging {
+ // internal name of java.lang.invoke.LambdaMetafactory
+ val LambdaMetafactoryClassName = "java/lang/invoke/LambdaMetafactory"
+ // the method that Scala indylambda use for bootstrap method
+ val LambdaMetafactoryMethodName = "altMetafactory"
+ val LambdaMetafactoryMethodDesc = "(Ljava/lang/invoke/MethodHandles$Lookup;"
+
+ "Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)" +
+ "Ljava/lang/invoke/CallSite;"
+
+ /**
+ * Check if the given reference is a indylambda style Scala closure.
+ * If so, return a non-empty serialization proxy (SerializedLambda) of the
closure;
+ * otherwise return None.
+ *
+ * @param maybeClosure the closure to check.
+ */
+ def getSerializationProxy(maybeClosure: AnyRef): Option[SerializedLambda] = {
+ val maybeClosureClass = maybeClosure.getClass
+
+ // shortcut the fast check:
+ // indylambda closure classes are generated by Java's LambdaMetafactory,
and they're always
+ // synthetic.
+ if (!maybeClosureClass.isSynthetic) return None
+
+ val implementedInterfaces =
ClassUtils.getAllInterfaces(maybeClosureClass).asScala
+ val isClosureCandidate = implementedInterfaces.exists(_.getName ==
"scala.Serializable") &&
Review comment:
Thank you very much! This is very useful information. Does that mean I
should check for `maybeClosure.isInstanceOf[Serializable]` here instead of
bothering with explicitly checking the name `scala.Serializable`? Assuming
we're running on a JVM instead of running in a no-Java environment, this
instanceof check should always be true for Scala closures, right?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]