He-Pin commented on PR #983:
URL: https://github.com/apache/incubator-pekko/pull/983#issuecomment-1901809838
```scala
object Cast {
val NotApplied: Any => Any = _ => NotApplied
def cast[A](a: Any): A = a.asInstanceOf[A]
def castWithMatch[A](a: Any): A = a match {
case NotApplied => ???
case a: A @unchecked => a
}
def castWithRef[A](a: Any): A = {
if (a.asInstanceOf[AnyRef] eq NotApplied) {
???
} else {
a.asInstanceOf[A]
}
}
}
```
and the bytecode:
```scala
// class version 52.0 (52)
// access flags 0x31
public final class org/apache/pekko/stream/impl/Cast$ {
// compiled from: Cast.scala
ATTRIBUTE Scala : unknown
ATTRIBUTE ScalaInlineInfo : unknown
// access flags 0x19
public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup
java/lang/invoke/MethodHandles Lookup
// access flags 0x19
public final static Lorg/apache/pekko/stream/impl/Cast$; MODULE$
// access flags 0x1A
// signature Lscala/Function1<Ljava/lang/Object;Ljava/lang/Object;>;
// declaration: NotApplied extends scala.Function1<java.lang.Object,
java.lang.Object>
private final static Lscala/Function1; NotApplied
// access flags 0x9
public static <clinit>()V
L0
LINENUMBER 25 L0
NEW org/apache/pekko/stream/impl/Cast$
DUP
INVOKESPECIAL org/apache/pekko/stream/impl/Cast$.<init> ()V
PUTSTATIC org/apache/pekko/stream/impl/Cast$.MODULE$ :
Lorg/apache/pekko/stream/impl/Cast$;
L1
LINENUMBER 27 L1
INVOKEDYNAMIC apply()Lscala/Function1; [
// 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:
(Ljava/lang/Object;)Ljava/lang/Object;,
// handle kind 0x6 : INVOKESTATIC
org/apache/pekko/stream/impl/Cast$.$anonfun$NotApplied$1(Ljava/lang/Object;)Lscala/Function1;,
(Ljava/lang/Object;)Lscala/Function1;,
5,
1,
(Ljava/lang/Object;)Lscala/Function1;
]
PUTSTATIC org/apache/pekko/stream/impl/Cast$.NotApplied :
Lscala/Function1;
L2
LINENUMBER 25 L2
RETURN
MAXSTACK = 2
MAXLOCALS = 0
// access flags 0x1
// signature ()Lscala/Function1<Ljava/lang/Object;Ljava/lang/Object;>;
// declaration: scala.Function1<java.lang.Object, java.lang.Object>
NotApplied()
public NotApplied()Lscala/Function1;
L0
LINENUMBER 27 L0
GETSTATIC org/apache/pekko/stream/impl/Cast$.NotApplied :
Lscala/Function1;
ARETURN
L1
LOCALVARIABLE this Lorg/apache/pekko/stream/impl/Cast$; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
// signature <A:Ljava/lang/Object;>(Ljava/lang/Object;)TA;
// declaration: A cast<A>(java.lang.Object)
public cast(Ljava/lang/Object;)Ljava/lang/Object;
// parameter final a
L0
LINENUMBER 28 L0
ALOAD 1
ARETURN
L1
LOCALVARIABLE this Lorg/apache/pekko/stream/impl/Cast$; L0 L1 0
LOCALVARIABLE a Ljava/lang/Object; L0 L1 1
MAXSTACK = 1
MAXLOCALS = 2
// access flags 0x1
// signature <A:Ljava/lang/Object;>(Ljava/lang/Object;)TA;
// declaration: A castWithMatch<A>(java.lang.Object)
public castWithMatch(Ljava/lang/Object;)Ljava/lang/Object;
// parameter final a
L0
LINENUMBER 31 L0
ALOAD 0
INVOKEVIRTUAL org/apache/pekko/stream/impl/Cast$.NotApplied
()Lscala/Function1;
DUP
IFNONNULL L1
POP
ALOAD 1
IFNULL L2
GOTO L3
L1
FRAME SAME1 scala/Function1
ALOAD 1
INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
IFEQ L3
L2
FRAME SAME
GETSTATIC scala/Predef$.MODULE$ : Lscala/Predef$;
INVOKEVIRTUAL scala/Predef$.$qmark$qmark$qmark ()Lscala/runtime/Nothing$;
ATHROW
L3
LINENUMBER 32 L3
FRAME SAME
ALOAD 1
INSTANCEOF java/lang/Object
IFEQ L4
ALOAD 1
ARETURN
L4
LINENUMBER 30 L4
FRAME SAME
NEW scala/MatchError
DUP
ALOAD 1
INVOKESPECIAL scala/MatchError.<init> (Ljava/lang/Object;)V
ATHROW
L5
LOCALVARIABLE this Lorg/apache/pekko/stream/impl/Cast$; L0 L5 0
LOCALVARIABLE a Ljava/lang/Object; L0 L5 1
MAXSTACK = 3
MAXLOCALS = 2
// access flags 0x1
// signature <A:Ljava/lang/Object;>(Ljava/lang/Object;)TA;
// declaration: A castWithRef<A>(java.lang.Object)
public castWithRef(Ljava/lang/Object;)Ljava/lang/Object;
// parameter final a
L0
LINENUMBER 36 L0
ALOAD 0
INVOKEVIRTUAL org/apache/pekko/stream/impl/Cast$.NotApplied
()Lscala/Function1;
ASTORE 2
L1
LINENUMBER 37 L1
ALOAD 1
ALOAD 2
IF_ACMPNE L2
L3
LINENUMBER 38 L3
GETSTATIC scala/Predef$.MODULE$ : Lscala/Predef$;
INVOKEVIRTUAL scala/Predef$.$qmark$qmark$qmark ()Lscala/runtime/Nothing$;
ATHROW
L2
LINENUMBER 40 L2
FRAME APPEND [scala/Function1]
ALOAD 1
ARETURN
L4
LOCALVARIABLE sentinel Lscala/Function1; L1 L4 2
LOCALVARIABLE this Lorg/apache/pekko/stream/impl/Cast$; L0 L4 0
LOCALVARIABLE a Ljava/lang/Object; L0 L4 1
MAXSTACK = 2
MAXLOCALS = 3
// access flags 0x1019
public final static synthetic
$anonfun$NotApplied$1(Ljava/lang/Object;)Lscala/Function1;
// parameter final x$1
L0
LINENUMBER 27 L0
GETSTATIC org/apache/pekko/stream/impl/Cast$.MODULE$ :
Lorg/apache/pekko/stream/impl/Cast$;
INVOKEVIRTUAL org/apache/pekko/stream/impl/Cast$.NotApplied
()Lscala/Function1;
ARETURN
L1
LOCALVARIABLE x$1 Ljava/lang/Object; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x2
private <init>()V
L0
LINENUMBER 25 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Lorg/apache/pekko/stream/impl/Cast$; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x100A
private static synthetic
$deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;
ALOAD 0
INVOKEDYNAMIC
lambdaDeserialize(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; [
// handle kind 0x6 : INVOKESTATIC
scala/runtime/LambdaDeserialize.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
// arguments:
// handle kind 0x6 : INVOKESTATIC
org/apache/pekko/stream/impl/Cast$.$anonfun$NotApplied$1(Ljava/lang/Object;)Lscala/Function1;
]
ARETURN
MAXSTACK = 1
MAXLOCALS = 1
}
```
--
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.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]