Compare commits

..

3 Commits

Author SHA1 Message Date
Matthias Raba
74f52c3c35 fixed small typo in documentation 2024-06-24 07:47:43 +02:00
Matthias Raba
711620bdd9 Merge branch 'bytecode' of https://gitea.hb.dhbw-stuttgart.de/MisterChaos69/MiniJavaCompiler into bytecode 2024-06-24 07:44:42 +02:00
Matthias Raba
946a1f374c fixed stack op depth for getfield 2024-06-24 07:44:04 +02:00
3 changed files with 6 additions and 11 deletions

View File

@ -1,5 +0,0 @@
public class Something
{
public int a = 4134123;
//public Something something = null;
}

View File

@ -4,7 +4,7 @@ Die Bytecodegenerierung ist letztendlich eine zweistufige Transformation:
`Getypter AST -> [ClassFile] -> [[Word8]]` `Getypter AST -> [ClassFile] -> [[Word8]]`
Vom AST, der bereits den Typcheck durchlaufen hat, wird zunächst eine Abbildung in die einzelnen ClassFiles vorgenommen. Diese ClassFiles werden anschließend in deren Byte-Repräsentation serialisiert. Dieser Teil der Aufgabenstellung wurde gemeinsam von Christian Brier und Matthias Raba umgesetzt. Vom AST, der bereits den Typcheck durchlaufen hat, wird zunächst eine Abbildung in die einzelnen ClassFiles vorgenommen. Diese ClassFiles werden anschließend in deren Byte-Repräsentation serialisiert.
## Codegenerierung ## Codegenerierung
@ -80,4 +80,4 @@ Die Struktur ClassFile ruft für deren Kinder rekursiv diese `serialize` Funktio
## Aufgabenteilung ## Aufgabenteilung
Die Bytecodegenerierung wurde von Matthias Raba und Christian Brier im Stille des Pair Programming zu zweit erarbeitet. Durch bisher gute Erfahrungen in vorherigen Projekten, sowie dem Interesse alle Teile der Bytecodegenerierung zu sehen, wurde diese Programmierungsform als die Beste ausgewählt. Insgesamt lief die Implementierungsphase wie geplant und ohne weitere Komplikationen ab. Die Bytecodegenerierung wurde von Matthias Raba und Christian Brier im Stile des Pair Programmings zu zweit erarbeitet. Durch bisher gute Erfahrungen in vorherigen Projekten, sowie dem Interesse, alle Teile der Bytecodegenerierung zu sehen, wurde diese Programmierungsform als die Beste ausgewählt. Insgesamt lief die Implementierungsphase wie geplant und ohne weitere Komplikationen ab.

View File

@ -279,14 +279,14 @@ operationStackCost constants (Opiload _) = 1
operationStackCost constants (Opastore _) = -1 operationStackCost constants (Opastore _) = -1
operationStackCost constants (Opistore _) = -1 operationStackCost constants (Opistore _) = -1
operationStackCost constants (Opputfield _) = -2 operationStackCost constants (Opputfield _) = -2
operationStackCost constants (Opgetfield _) = -1 operationStackCost constants (Opgetfield _) = 0
simulateStackOperation :: [ConstantInfo] -> Operation -> (Int, Int) -> (Int, Int) simulateStackOperation :: (Int, Int) -> [ConstantInfo] -> Operation -> (Int, Int)
simulateStackOperation constants op (cd, md) = let simulateStackOperation (cd, md) constants op = let
depth = cd + operationStackCost constants op depth = cd + operationStackCost constants op
in if depth < 0 in if depth < 0
then error ("Consuming value off of empty stack: " ++ show op) then error ("Consuming value off of empty stack: " ++ show op)
else (depth, max depth md) else (depth, max depth md)
maxStackDepth :: [ConstantInfo] -> [Operation] -> Int maxStackDepth :: [ConstantInfo] -> [Operation] -> Int
maxStackDepth constants ops = snd $ foldr (simulateStackOperation constants) (0, 0) (reverse ops) maxStackDepth constants ops = snd $ foldl (`simulateStackOperation` constants) (0, 0) ops