Local variable assignment
This commit is contained in:
parent
e572975bda
commit
535a6891ad
@ -268,9 +268,9 @@ assembleStatement (constants, ops, lvars) (TypedStatement _ (LocalVariableDeclar
|
|||||||
Just exp -> assembleExpression (constants, ops, lvars) exp
|
Just exp -> assembleExpression (constants, ops, lvars) exp
|
||||||
Nothing -> (constants, ops ++ if isPrimitive then [Opsipush 0] else [Opaconst_null], lvars)
|
Nothing -> (constants, ops ++ if isPrimitive then [Opsipush 0] else [Opaconst_null], lvars)
|
||||||
localIndex = fromIntegral (length lvars)
|
localIndex = fromIntegral (length lvars)
|
||||||
loadLocal = if isPrimitive then [Opistore localIndex] else [Opastore localIndex]
|
storeLocal = if isPrimitive then [Opistore localIndex] else [Opastore localIndex]
|
||||||
in
|
in
|
||||||
(constants_init, ops_init ++ loadLocal, lvars ++ [name])
|
(constants_init, ops_init ++ storeLocal, lvars ++ [name])
|
||||||
assembleStatement _ stmt = error ("Not yet implemented: " ++ show stmt)
|
assembleStatement _ stmt = error ("Not yet implemented: " ++ show stmt)
|
||||||
|
|
||||||
assembleExpression :: Assembler Expression
|
assembleExpression :: Assembler Expression
|
||||||
@ -312,9 +312,21 @@ assembleExpression (constants, ops, lvars) (TypedExpression _ (FieldVariable nam
|
|||||||
in case fieldIndex of
|
in case fieldIndex of
|
||||||
Just index -> (constants, ops ++ [Opaload 0, Opgetfield (fromIntegral index)], lvars)
|
Just index -> (constants, ops ++ [Opaload 0, Opgetfield (fromIntegral index)], lvars)
|
||||||
Nothing -> error ("No such field found in constant pool: " ++ name)
|
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
|
localIndex = findIndex ((==) name) lvars
|
||||||
|
isPrimitive = elem dtype ["char", "boolean", "int"]
|
||||||
in case localIndex of
|
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)
|
Nothing -> error ("No such local variable found in local variable pool: " ++ name)
|
||||||
assembleExpression _ expr = error ("unimplemented: " ++ show expr)
|
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)
|
Loading…
Reference in New Issue
Block a user