Skip to content

Instantly share code, notes, and snippets.

@retronym
Created March 18, 2016 00:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save retronym/f174d23f859f0e053580 to your computer and use it in GitHub Desktop.
Save retronym/f174d23f859f0e053580 to your computer and use it in GitHub Desktop.
New trait encoding
trait T {
println("T")
def m1 = m2
private def m2 = "m2"
}
trait U extends T {
println("T")
override def m1 = super[T].m1
}
class C extends U {
println("C")
def test = m1
}
public interface T {
public abstract java.lang.String m1();
}
public abstract class T$class {
public static java.lang.String m1(T);
Code:
0: aload_0
1: invokestatic // Method m2:(LT;)Ljava/lang/String;
4: areturn
private static java.lang.String m2(T);
Code:
0: ldc // String m2
2: areturn
public static void $init$(T);
Code:
0: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc // String T
5: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
}
public interface U extends T {
public abstract java.lang.String m1();
}
public abstract class U$class {
public static java.lang.String m1(U);
Code:
0: aload_0
1: invokestatic // Method T$class.m1:(LT;)Ljava/lang/String;
4: areturn
public static void $init$(U);
Code:
0: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc // String T
5: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
}
public class C implements U {
public java.lang.String m1();
Code:
0: aload_0
1: invokestatic // Method U$class.m1:(LU;)Ljava/lang/String;
4: areturn
public java.lang.String test();
Code:
0: aload_0
1: invokevirtual // Method m1:()Ljava/lang/String;
4: areturn
public C();
Code:
0: aload_0
1: invokespecial // Method java/lang/Object."<init>":()V
4: aload_0
5: invokestatic // Method T$class.$init$:(LT;)V
8: aload_0
9: invokestatic // Method U$class.$init$:(LU;)V
12: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
15: ldc // String C
17: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
20: return
}
public interface T {
public java.lang.String m1();
Code:
0: aload_0
1: invokespecial // Method m2:()Ljava/lang/String;
4: areturn
private java.lang.String m2();
Code:
0: ldc // String m2
2: areturn
public void $init$();
Code:
0: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc // String T
5: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
}
public interface U extends T {
public java.lang.String m1();
Code:
0: aload_0
1: invokespecial // Method T.m1:()Ljava/lang/String;
4: areturn
public void $init$();
Code:
0: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc // String T
5: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
}
public class C implements U,T {
public java.lang.String m1();
Code:
0: aload_0
1: invokespecial // Method U.m1:()Ljava/lang/String;
4: areturn
public java.lang.String test();
Code:
0: aload_0
1: invokevirtual // Method m1:()Ljava/lang/String;
4: areturn
public C();
Code:
0: aload_0
1: invokespecial // Method java/lang/Object."<init>":()V
4: aload_0
5: invokespecial // Method T.$init$:()V
8: aload_0
9: invokespecial // Method U.$init$:()V
12: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
15: ldc // String C
17: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
20: return
}
--- 1.old.log 2016-03-18 10:52:15.000000000 +1000
+++ 2.new.log 2016-03-18 10:52:18.000000000 +1000
@@ -1,65 +1,59 @@
public interface T {
- public abstract java.lang.String m1();
-}
-public abstract class T$class {
- public static java.lang.String m1(T);
+ public java.lang.String m1();
Code:
0: aload_0
- 1: invokestatic // Method m2:(LT;)Ljava/lang/String;
+ 1: invokespecial // Method m2:()Ljava/lang/String;
4: areturn
- private static java.lang.String m2(T);
+ private java.lang.String m2();
Code:
0: ldc // String m2
2: areturn
- public static void $init$(T);
+ public void $init$();
Code:
0: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc // String T
5: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
}
public interface U extends T {
- public abstract java.lang.String m1();
-}
-public abstract class U$class {
- public static java.lang.String m1(U);
+ public java.lang.String m1();
Code:
0: aload_0
- 1: invokestatic // Method T$class.m1:(LT;)Ljava/lang/String;
+ 1: invokespecial // Method T.m1:()Ljava/lang/String;
4: areturn
- public static void $init$(U);
+ public void $init$();
Code:
0: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc // String T
5: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
8: return
}
-public class C implements U {
+public class C implements U,T {
public java.lang.String m1();
Code:
0: aload_0
- 1: invokestatic // Method U$class.m1:(LU;)Ljava/lang/String;
+ 1: invokespecial // Method U.m1:()Ljava/lang/String;
4: areturn
public java.lang.String test();
Code:
0: aload_0
1: invokevirtual // Method m1:()Ljava/lang/String;
4: areturn
public C();
Code:
0: aload_0
1: invokespecial // Method java/lang/Object."<init>":()V
4: aload_0
- 5: invokestatic // Method T$class.$init$:(LT;)V
+ 5: invokespecial // Method T.$init$:()V
8: aload_0
- 9: invokestatic // Method U$class.$init$:(LU;)V
+ 9: invokespecial // Method U.$init$:()V
12: getstatic // Field scala/Predef$.MODULE$:Lscala/Predef$;
15: ldc // String C
17: invokevirtual // Method scala/Predef$.println:(Ljava/lang/Object;)V
20: return
}
@retronym
Copy link
Author

Generated with:

scalac 0.test.scala && javap -c -private T 'T$class' U 'U$class' C 2>&1 | grep -v "Compiled from" | perl -pe 's/#\d+/   /' > 1.old.log && qscalac 0.test.scala && javap -c -private T U C 2>&1 | grep -v "Compiled from" | perl -pe 's/#\d+/   /' > 2.new.log && diff -U1000 1.old.log 2.new.log > 3.diff

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment