From 535a6891ad5c1772d52c7aef701f4b2cb1507d14 Mon Sep 17 00:00:00 2001 From: mrab Date: Thu, 16 May 2024 09:28:00 +0200 Subject: [PATCH] Local variable assignment --- src/ByteCode/ClassFile/Generator.hs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ByteCode/ClassFile/Generator.hs b/src/ByteCode/ClassFile/Generator.hs index d78dae6..2eabd67 100644 --- a/src/ByteCode/ClassFile/Generator.hs +++ b/src/ByteCode/ClassFile/Generator.hs @@ -268,9 +268,9 @@ assembleStatement (constants, ops, lvars) (TypedStatement _ (LocalVariableDeclar Just exp -> assembleExpression (constants, ops, lvars) exp Nothing -> (constants, ops ++ if isPrimitive then [Opsipush 0] else [Opaconst_null], lvars) localIndex = fromIntegral (length lvars) - loadLocal = if isPrimitive then [Opistore localIndex] else [Opastore localIndex] + storeLocal = if isPrimitive then [Opistore localIndex] else [Opastore localIndex] in - (constants_init, ops_init ++ loadLocal, lvars ++ [name]) + (constants_init, ops_init ++ storeLocal, lvars ++ [name]) assembleStatement _ stmt = error ("Not yet implemented: " ++ show stmt) assembleExpression :: Assembler Expression @@ -312,9 +312,21 @@ assembleExpression (constants, ops, lvars) (TypedExpression _ (FieldVariable nam in case fieldIndex of Just index -> (constants, ops ++ [Opaload 0, Opgetfield (fromIntegral index)], lvars) Nothing -> error ("No such field found in constant pool: " ++ name) -assembleExpression (constants, ops, lvars) (TypedExpression _ (LocalVariable name)) = let +assembleExpression (constants, ops, lvars) (TypedExpression dtype (LocalVariable name)) = let localIndex = findIndex ((==) name) lvars + isPrimitive = elem dtype ["char", "boolean", "int"] in case localIndex of - Just index -> (constants, ops ++ [Opiload (fromIntegral index)], lvars) + Just index -> (constants, ops ++ if isPrimitive then [Opiload (fromIntegral index)] else [Opaload (fromIntegral index)], lvars) Nothing -> error ("No such local variable found in local variable pool: " ++ name) assembleExpression _ expr = error ("unimplemented: " ++ show expr) + +assembleStatementExpression :: Assembler StatementExpression +assembleStatementExpression + (constants, ops, lvars) + (TypedStatementExpression _ (Assignment (TypedExpression dtype (LocalVariable name)) expr)) = let + localIndex = findIndex ((==) name) lvars + (constants_a, ops_a, _) = assembleExpression (constants, ops, lvars) expr + isPrimitive = elem dtype ["char", "boolean", "int"] + in case localIndex of + Just index -> (constants_a, ops_a ++ if isPrimitive then [Opistore (fromIntegral index)] else [Opastore (fromIntegral index)], lvars) + Nothing -> error ("No such local variable found in local variable pool: " ++ name) \ No newline at end of file