block and if assembly (no else)
This commit is contained in:
parent
5284d6ecba
commit
f9f984568f
@ -206,7 +206,7 @@ assembleMethod (MethodDeclaration _ name _ (TypedStatement _ (Block statements))
|
|||||||
(constants_a, ops_a) = foldr assembleStatement (constants, ops) statements
|
(constants_a, ops_a) = foldr assembleStatement (constants, ops) statements
|
||||||
init_ops = [Opaload 0, Opinvokespecial 2]
|
init_ops = [Opaload 0, Opinvokespecial 2]
|
||||||
in
|
in
|
||||||
(constants_a, init_ops ++ ops_a)
|
(constants_a, init_ops ++ ops_a ++ [Opreturn])
|
||||||
| otherwise = let
|
| otherwise = let
|
||||||
(constants_a, ops_a) = foldr assembleStatement (constants, ops) statements
|
(constants_a, ops_a) = foldr assembleStatement (constants, ops) statements
|
||||||
init_ops = [Opaload 0]
|
init_ops = [Opaload 0]
|
||||||
@ -221,6 +221,15 @@ assembleStatement (TypedStatement stype (Return expr)) (constants, ops) = case e
|
|||||||
(expr_constants, expr_ops) = assembleExpression expr (constants, ops)
|
(expr_constants, expr_ops) = assembleExpression expr (constants, ops)
|
||||||
in
|
in
|
||||||
(expr_constants, expr_ops ++ [returnOperation stype])
|
(expr_constants, expr_ops ++ [returnOperation stype])
|
||||||
|
assembleStatement (TypedStatement _ (Block statements)) (constants, ops) =
|
||||||
|
foldr assembleStatement (constants, ops) statements
|
||||||
|
assembleStatement (TypedStatement _ (If expr if_stmt else_stmt)) (constants, ops) = let
|
||||||
|
(constants_cmp, ops_cmp) = assembleExpression expr (constants, [])
|
||||||
|
(constants_ifa, ops_ifa) = assembleStatement if_stmt (constants_cmp, [])
|
||||||
|
skip_length = sum (map opcodeEncodingLength ops_ifa)
|
||||||
|
in
|
||||||
|
(constants_ifa, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq skip_length] ++ ops_ifa)
|
||||||
|
|
||||||
|
|
||||||
assembleExpression :: Assembler Expression
|
assembleExpression :: Assembler Expression
|
||||||
assembleExpression (TypedExpression _ (BinaryOperation op a b)) (constants, ops)
|
assembleExpression (TypedExpression _ (BinaryOperation op a b)) (constants, ops)
|
||||||
|
@ -9,7 +9,9 @@ import ByteCode.ClassFile
|
|||||||
import Data.ByteString (pack, writeFile)
|
import Data.ByteString (pack, writeFile)
|
||||||
|
|
||||||
main = do
|
main = do
|
||||||
let untypedAST = parse $ alexScanTokens "class Testklasse {Testklasse(){} boolean something(){return 5 + 8 - 12 * 22 > 9 - 2 + 3;}}"
|
file <- readFile "Testklasse.java"
|
||||||
|
|
||||||
|
let untypedAST = parse $ alexScanTokens file
|
||||||
let typedAST = head (typeCheckCompilationUnit untypedAST)
|
let typedAST = head (typeCheckCompilationUnit untypedAST)
|
||||||
let abstractClassFile = classBuilder typedAST emptyClassFile
|
let abstractClassFile = classBuilder typedAST emptyClassFile
|
||||||
let assembledClassFile = pack (serialize abstractClassFile)
|
let assembledClassFile = pack (serialize abstractClassFile)
|
||||||
|
Loading…
Reference in New Issue
Block a user