ccebinger / SWPSoSe14

2 stars 1 forks source link

Lambda bytecode generation #219

Open Zelldon opened 10 years ago

Zelldon commented 10 years ago

Java Code:


public class LambdaBytecode {

  interface Lambda {
    public void closure();
  }

  public LambdaBytecode() {
  }

  public static void main(String[] args) {

    Lambda l = new Lambda() {

      @Override
      public void closure() {
        String s = "Hello";
        //more stuff
        System.out.print(s);
      }
    };
    String s = "World";
    l.closure();
    System.out.print(s);
  }
}

Disassembly:

$ javap -c -v LambdaBytecode.class 
Classfile /Users/christopher/Documents/cb-projekt/SWPSoSe14/projekt-compiler/JavaByteCode/build/classes/javabytecode/LambdaBytecode.class
  Last modified Jul 2, 2014; size 834 bytes
  MD5 checksum e9d344c265d2d3ae7949f164451e7c0c
  Compiled from "LambdaBytecode.java"
public class javabytecode.LambdaBytecode
  SourceFile: "LambdaBytecode.java"
  InnerClasses:
       static #11= #10 of #8; //Lambda=class javabytecode/LambdaBytecode$Lambda of class javabytecode/LambdaBytecode
       static #2; //class javabytecode/LambdaBytecode$1
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #9.#31         //  java/lang/Object."":()V
   #2 = Class              #32            //  javabytecode/LambdaBytecode$1
   #3 = Methodref          #2.#31         //  javabytecode/LambdaBytecode$1."":()V
   #4 = String             #33            //  World
   #5 = InterfaceMethodref #10.#34        //  javabytecode/LambdaBytecode$Lambda.closure:()V
   #6 = Fieldref           #35.#36        //  java/lang/System.out:Ljava/io/PrintStream;
   #7 = Methodref          #37.#38        //  java/io/PrintStream.print:(Ljava/lang/String;)V
   #8 = Class              #39            //  javabytecode/LambdaBytecode
   #9 = Class              #40            //  java/lang/Object
  #10 = Class              #41            //  javabytecode/LambdaBytecode$Lambda
  #11 = Utf8               Lambda
  #12 = Utf8               InnerClasses
  #13 = Utf8               
  #14 = Utf8               
  #15 = Utf8               ()V
  #16 = Utf8               Code
  #17 = Utf8               LineNumberTable
  #18 = Utf8               LocalVariableTable
  #19 = Utf8               this
  #20 = Utf8               Ljavabytecode/LambdaBytecode;
  #21 = Utf8               main
  #22 = Utf8               ([Ljava/lang/String;)V
  #23 = Utf8               args
  #24 = Utf8               [Ljava/lang/String;
  #25 = Utf8               l
  #26 = Utf8               Ljavabytecode/LambdaBytecode$Lambda;
  #27 = Utf8               s
  #28 = Utf8               Ljava/lang/String;
  #29 = Utf8               SourceFile
  #30 = Utf8               LambdaBytecode.java
  #31 = NameAndType        #14:#15        //  "":()V
  #32 = Utf8               javabytecode/LambdaBytecode$1
  #33 = Utf8               World
  #34 = NameAndType        #42:#15        //  closure:()V
  #35 = Class              #43            //  java/lang/System
  #36 = NameAndType        #44:#45        //  out:Ljava/io/PrintStream;
  #37 = Class              #46            //  java/io/PrintStream
  #38 = NameAndType        #47:#48        //  print:(Ljava/lang/String;)V
  #39 = Utf8               javabytecode/LambdaBytecode
  #40 = Utf8               java/lang/Object
  #41 = Utf8               javabytecode/LambdaBytecode$Lambda
  #42 = Utf8               closure
  #43 = Utf8               java/lang/System
  #44 = Utf8               out
  #45 = Utf8               Ljava/io/PrintStream;
  #46 = Utf8               java/io/PrintStream
  #47 = Utf8               print
  #48 = Utf8               (Ljava/lang/String;)V
{
  public javabytecode.LambdaBytecode();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return        
      LineNumberTable:
        line 35: 0
        line 36: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   Ljavabytecode/LambdaBytecode;

  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: new           #2                  // class javabytecode/LambdaBytecode$1
         3: dup           
         4: invokespecial #3                  // Method javabytecode/LambdaBytecode$1."":()V
         7: astore_1      
         8: ldc           #4                  // String World
        10: astore_2      
        11: aload_1       
        12: invokeinterface #5,  1            // InterfaceMethod javabytecode/LambdaBytecode$Lambda.closure:()V
        17: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
        20: aload_2       
        21: invokevirtual #7                  // Method java/io/PrintStream.print:(Ljava/lang/String;)V
        24: return        
      LineNumberTable:
        line 40: 0
        line 49: 8
        line 50: 11
        line 51: 17
        line 52: 24
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      25     0  args   [Ljava/lang/String;
               8      17     1     l   Ljavabytecode/LambdaBytecode$Lambda;
              11      14     2     s   Ljava/lang/String;
}

as we can see the anonymous object of the Lambda Interface is named With the Interface-name, a dollar sign and a count ...

Zelldon commented 10 years ago

Problem for each impl. (anonymous object) we need a new class file...

Zelldon commented 10 years ago

successfully build and run!!!!!!!!

kretzschi commented 10 years ago

Sehr gut! :100: