# Quellen * http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html * http://blog.takipi.com/erstellen-von-lambda-ausdrucken-scala-vs-java-8/ # Decompiler * Es wird javap verwendet. Die Datei ~/bin/javap leitet den javap Befehl um. Muss angepasst werden, wenn man andere Version verwenden will. #Quellen * Brian Götz zu Lambdas: http://wiki.jvmlangsummit.com/images/1/1e/2011_Goetz_Lambda.pdf # Doku * 2 Möglichkeiten Lambda Ausdrücke zu kompilieren: Anonymous inner class, Invokedynamic ## Invokedynamic * Hat Argumente auf dem Stack liegen * Indexbytes zeigen auf eine InvokeDynamic_Info structure, welche beinhaltet: * Methodenname der bootstrap-Methode (Symbolic Reference) * Mehrere Symbolic References auf statische Argumente der Bootstrap Methode * Einen Methodenname und Deskriptor. * Ausführung: * Nach dem auflösen dieser Struktur stehen die Informationen des InvokeDynamic_Info zur Verfügung * Anschließend wird ein invokevirtual auf die Bootstrap Methode ausgeführt * Die Index Referenz für InvokeVirtual hat bestimmte Werte: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic * Die Rückgabe der Bootstrap-Methode (CallSite) wird mittels invokevirtual ausgeführt. ## Bootstrap Methods * Ein Attribut im Classfile * Gibt die Bootstrap Methoden an * Die Angabe erfolgt durch Zeiger auf Method_Handle_info Strukturen im Konstantenpool * Rückgabe der Bootstrap-Methode ist ein CallSite Objekt: https://docs.oracle.com/javase/7/docs/api/java/lang/invoke/CallSite.html ## LambdaMetaFactory * Stellt eine mögliche Bootstrap Methode dar # TODO: * Matrix Beispiel muss funktionieren (verschachtelter Lambda Ausdruck) * Automatisch Bytecode generieren, wenn alle Typen eingesetzt sind ## StackMapTable * Attribute für Codeattribut * Wird für Sprünge im Bytecode benötigt * Quelle: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.4