@@ -525,10 +525,60 @@ private[spark] object IndylambdaScalaClosures extends Logging {
525525 op == INVOKESPECIAL && name == " <init>" && desc.startsWith(s " (L $callerInternalName; " )
526526 }
527527
528+ // scalastyle:off line.size.limit
528529 /**
529530 * Scans an indylambda Scala closure, along with its lexically nested closures, and populate
530531 * the accessed fields info on which fields on the outer object are accessed.
532+ *
533+ * Example: run the following code snippet in a Spark Shell w/ Scala 2.12+:
534+ * val topLevelValue = "someValue"; val closure = (j: Int) => {
535+ * class InnerFoo {
536+ * val innerClosure = (x: Int) => (1 to x).map { y => y + topLevelValue }
537+ * }
538+ * val innerFoo = new InnerFoo
539+ * (1 to j).flatMap(innerFoo.innerClosure)
540+ * }
541+ * sc.parallelize(0 to 2).map(closure).collect
542+ *
543+ * produces the following trace-level logs: (omitting the "ignoring ..." logs)
544+ * Cleaning indylambda closure: $anonfun$closure$1$adapted
545+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.$anonfun$closure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;
546+ * found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.$anonfun$closure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;I)Lscala/collection/immutable/IndexedSeq;
547+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.$anonfun$closure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;I)Lscala/collection/immutable/IndexedSeq;
548+ * found inner class $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1
549+ * found call to outer $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.innerClosure()Lscala/Function1;
550+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.innerClosure()Lscala/Function1;
551+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;
552+ * invokedynamic: lambdaDeserialize(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;, bsmHandle=scala/runtime/LambdaDeserialize.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray($line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6), $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq; (6))
553+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;
554+ * found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Lscala/collection/immutable/IndexedSeq;
555+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Lscala/collection/immutable/IndexedSeq;
556+ * invokedynamic: apply(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;)Lscala/Function1;, bsmHandle=java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray((Ljava/lang/Object;)Ljava/lang/Object;, $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6), (Ljava/lang/Object;)Ljava/lang/String;, 7, 1, Lscala/Serializable;, 1, (Ljava/lang/Object;)Ljava/lang/String;)
557+ * found inner closure $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6)
558+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String;
559+ * found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
560+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
561+ * found call to outer $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.topLevelValue()Ljava/lang/String;
562+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.topLevelValue()Ljava/lang/String;
563+ * found field access topLevelValue on $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw
564+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String;
565+ * found intra class call to $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
566+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.<init>(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw;)V
567+ * invokedynamic: apply(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;)Lscala/Function1;, bsmHandle=java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray((Ljava/lang/Object;)Ljava/lang/Object;, $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq; (6), (Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;, 7, 1, Lscala/Serializable;, 1, (Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq;)
568+ * found inner closure $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Lscala/collection/immutable/IndexedSeq; (6)
569+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$1(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Lscala/collection/immutable/IndexedSeq;
570+ * invokedynamic: apply(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;)Lscala/Function1;, bsmHandle=java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; (6), bsmArgs=WrappedArray((Ljava/lang/Object;)Ljava/lang/Object;, $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6), (Ljava/lang/Object;)Ljava/lang/String;, 7, 1, Lscala/Serializable;, 1, (Ljava/lang/Object;)Ljava/lang/String;)
571+ * found inner closure $line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2$adapted(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;Ljava/lang/Object;)Ljava/lang/String; (6)
572+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.$anonfun$innerClosure$2(L$line16/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1;I)Ljava/lang/String;
573+ * found call to outer $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.topLevelValue()Ljava/lang/String;
574+ * scanning $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$InnerFoo$1.innerClosure()Lscala/Function1;
575+ * + fields accessed by starting closure: 2 classes
576+ * (class java.lang.Object,Set())
577+ * (class $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw,Set(topLevelValue))
578+ * + cloning instance of REPL class $line16.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw
579+ * +++ indylambda closure ($anonfun$closure$1$adapted) is now cleaned +++
531580 */
581+ // scalastyle:on line.size.limit
532582 def findAccessedFields (
533583 lambdaProxy : SerializedLambda ,
534584 lambdaClassLoader : ClassLoader ,
0 commit comments