diff --git a/src/ByteCode/ClassFile/Generator.hs b/src/ByteCode/ClassFile/Generator.hs index 866c375..69382b3 100644 --- a/src/ByteCode/ClassFile/Generator.hs +++ b/src/ByteCode/ClassFile/Generator.hs @@ -206,7 +206,7 @@ assembleMethod (MethodDeclaration _ name _ (TypedStatement _ (Block statements)) (constants_a, ops_a) = foldr assembleStatement (constants, ops) statements init_ops = [Opaload 0, Opinvokespecial 2] in - (constants_a, init_ops ++ ops_a) + (constants_a, init_ops ++ ops_a ++ [Opreturn]) | otherwise = let (constants_a, ops_a) = foldr assembleStatement (constants, ops) statements 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) in (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 (TypedExpression _ (BinaryOperation op a b)) (constants, ops) diff --git a/src/Main.hs b/src/Main.hs index c9f5c18..858d5bb 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -9,7 +9,9 @@ import ByteCode.ClassFile import Data.ByteString (pack, writeFile) 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 abstractClassFile = classBuilder typedAST emptyClassFile let assembledClassFile = pack (serialize abstractClassFile)