Created
October 11, 2011 08:00
-
-
Save hdeshev/1277525 to your computer and use it in GitHub Desktop.
Scala structural types implemented with reflection
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
scala> :javap Greeter -c | |
Compiled from "<console>" | |
public class Greeter extends java.lang.Object implements scala.ScalaObject{ | |
public static {}; | |
Code: | |
0: iconst_0 | |
1: anewarray #8; //class java/lang/Class | |
4: putstatic #14; //Field reflParams$Cache1:[Ljava/lang/Class; | |
7: new #16; //class java/lang/ref/SoftReference | |
10: dup | |
11: new #18; //class scala/runtime/EmptyMethodCache | |
14: dup | |
15: invokespecial #21; //Method scala/runtime/EmptyMethodCache."<init>":()V | |
18: invokespecial #24; //Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V | |
21: putstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference; | |
24: return | |
public static java.lang.reflect.Method reflMethod$Method1(java.lang.Class); | |
Code: | |
0: getstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference; | |
3: invokevirtual #34; //Method java/lang/ref/SoftReference.get:()Ljava/lang/Object; | |
6: checkcast #36; //class scala/runtime/MethodCache | |
9: ifnonnull 29 | |
12: new #16; //class java/lang/ref/SoftReference | |
15: dup | |
16: new #18; //class scala/runtime/EmptyMethodCache | |
19: dup | |
20: invokespecial #21; //Method scala/runtime/EmptyMethodCache."<init>":()V | |
23: invokespecial #24; //Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V | |
26: putstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference; | |
29: getstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference; | |
32: invokevirtual #34; //Method java/lang/ref/SoftReference.get:()Ljava/lang/Object; | |
35: checkcast #36; //class scala/runtime/MethodCache | |
38: aload_0 | |
39: invokevirtual #39; //Method scala/runtime/MethodCache.find:(Ljava/lang/Class;)Ljava/lang/reflect/Method; | |
42: astore_1 | |
43: aload_1 | |
44: ifnonnull 89 | |
47: getstatic #45; //Field scala/runtime/ScalaRunTime$.MODULE$:Lscala/runtime/ScalaRunTime$; | |
50: aload_0 | |
51: ldc #47; //String name | |
53: getstatic #14; //Field reflParams$Cache1:[Ljava/lang/Class; | |
56: invokevirtual #51; //Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; | |
59: invokevirtual #55; //Method scala/runtime/ScalaRunTime$.ensureAccessible:(Ljava/lang/reflect/Method;)Ljava/lang/reflect/Method; | |
62: astore_1 | |
63: new #16; //class java/lang/ref/SoftReference | |
66: dup | |
67: getstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference; | |
70: invokevirtual #34; //Method java/lang/ref/SoftReference.get:()Ljava/lang/Object; | |
73: checkcast #36; //class scala/runtime/MethodCache | |
76: aload_0 | |
77: aload_1 | |
78: invokevirtual #59; //Method scala/runtime/MethodCache.add:(Ljava/lang/Class;Ljava/lang/reflect/Method;)Lscala/runtime/MethodCache; | |
81: invokespecial #24; //Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V | |
84: putstatic #28; //Field reflPoly$Cache1:Ljava/lang/ref/SoftReference; | |
87: aload_1 | |
88: areturn | |
89: aload_1 | |
90: areturn | |
public java.lang.String greet(java.lang.Object); | |
Code: | |
0: getstatic #69; //Field scala/Predef$.MODULE$:Lscala/Predef$; | |
3: ldc #71; //String Hello, %s | |
5: invokevirtual #75; //Method scala/Predef$.augmentString:(Ljava/lang/String;)Lscala/collection/immutable/StringOps; | |
8: getstatic #69; //Field scala/Predef$.MODULE$:Lscala/Predef$; | |
11: iconst_1 | |
12: anewarray #77; //class java/lang/Object | |
15: dup | |
16: iconst_0 | |
17: aload_1 | |
18: astore_2 | |
19: aconst_null | |
20: astore_3 | |
21: aload_2 | |
22: invokevirtual #81; //Method java/lang/Object.getClass:()Ljava/lang/Class; | |
25: invokestatic #83; //Method reflMethod$Method1:(Ljava/lang/Class;)Ljava/lang/reflect/Method; | |
28: aload_2 | |
29: iconst_0 | |
30: anewarray #77; //class java/lang/Object | |
33: invokevirtual #89; //Method java/lang/reflect/Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; | |
36: astore_3 | |
37: aload_3 | |
38: checkcast #91; //class java/lang/String | |
41: aastore | |
42: invokevirtual #95; //Method scala/Predef$.genericWrapArray:(Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray; | |
45: invokeinterface #101, 2; //InterfaceMethod scala/collection/immutable/StringLike.format:(Lscala/collection/Seq;)Ljava/lang/String; | |
50: areturn | |
51: astore 4 | |
53: aload 4 | |
55: invokevirtual #107; //Method java/lang/reflect/InvocationTargetException.getCause:()Ljava/lang/Throwable; | |
58: athrow | |
Exception table: | |
from to target type | |
21 37 51 Class java/lang/reflect/InvocationTargetException | |
public Greeter(); | |
Code: | |
0: aload_0 | |
1: invokespecial #114; //Method java/lang/Object."<init>":()V | |
4: return | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment