JavaCompilerCore/notizen/stan/lambdaBytecode/Notizen.md
2015-09-22 18:43:36 +02:00

38 lines
1.7 KiB
Markdown

# 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