1.9 KiB
1.9 KiB
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