fixed local variable declaration being ignore inside for loop
This commit is contained in:
parent
c8b3caa2af
commit
6b4b9b496d
@ -15,6 +15,7 @@ public class Main {
|
|||||||
TestMultipleClasses multipleClasses = new TestMultipleClasses();
|
TestMultipleClasses multipleClasses = new TestMultipleClasses();
|
||||||
TestRecursion recursion = new TestRecursion(10);
|
TestRecursion recursion = new TestRecursion(10);
|
||||||
TestMalicious malicious = new TestMalicious();
|
TestMalicious malicious = new TestMalicious();
|
||||||
|
TestLoop loop = new TestLoop();
|
||||||
|
|
||||||
// constructing a basic class works
|
// constructing a basic class works
|
||||||
assert empty != null;
|
assert empty != null;
|
||||||
@ -32,6 +33,7 @@ public class Main {
|
|||||||
assert recursion.child.child.child.child.child.value == 5;
|
assert recursion.child.child.child.child.child.value == 5;
|
||||||
// self-referencing methods work.
|
// self-referencing methods work.
|
||||||
assert recursion.fibonacci(15) == 610;
|
assert recursion.fibonacci(15) == 610;
|
||||||
|
assert loop.factorial(5) == 120;
|
||||||
// intentionally dodgy expressions work
|
// intentionally dodgy expressions work
|
||||||
assert malicious.assignNegativeIncrement(42) == -42;
|
assert malicious.assignNegativeIncrement(42) == -42;
|
||||||
assert malicious.tripleAddition(1, 2, 3) == 6;
|
assert malicious.tripleAddition(1, 2, 3) == 6;
|
||||||
|
12
Test/JavaSources/TestLoop.java
Normal file
12
Test/JavaSources/TestLoop.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
public class TestLoop {
|
||||||
|
public int factorial(int n)
|
||||||
|
{
|
||||||
|
int tally = 1;
|
||||||
|
for(int i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
tally *= i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tally;
|
||||||
|
}
|
||||||
|
}
|
@ -221,26 +221,26 @@ assembleStatement (constants, ops, lvars) (TypedStatement _ (Block statements))
|
|||||||
|
|
||||||
assembleStatement (constants, ops, lvars) (TypedStatement dtype (If expr if_stmt else_stmt)) = let
|
assembleStatement (constants, ops, lvars) (TypedStatement dtype (If expr if_stmt else_stmt)) = let
|
||||||
(constants_cmp, ops_cmp, _) = assembleExpression (constants, [], lvars) expr
|
(constants_cmp, ops_cmp, _) = assembleExpression (constants, [], lvars) expr
|
||||||
(constants_ifa, ops_ifa, _) = assembleStatement (constants_cmp, [], lvars) if_stmt
|
(constants_ifa, ops_ifa, lvars_ifa) = assembleStatement (constants_cmp, [], lvars) if_stmt
|
||||||
(constants_elsea, ops_elsea, _) = case else_stmt of
|
(constants_elsea, ops_elsea, _) = case else_stmt of
|
||||||
Nothing -> (constants_ifa, [], lvars)
|
Nothing -> (constants_ifa, [], lvars_ifa)
|
||||||
Just stmt -> assembleStatement (constants_ifa, [], lvars) stmt
|
Just stmt -> assembleStatement (constants_ifa, [], lvars_ifa) stmt
|
||||||
-- +6 because we insert 2 gotos, one for if, one for else
|
-- +6 because we insert 2 gotos, one for if, one for else
|
||||||
if_length = sum (map opcodeEncodingLength ops_ifa)
|
if_length = sum (map opcodeEncodingLength ops_ifa)
|
||||||
-- +3 because we need to account for the goto in the if statement.
|
-- +3 because we need to account for the goto in the if statement.
|
||||||
else_length = sum (map opcodeEncodingLength ops_elsea)
|
else_length = sum (map opcodeEncodingLength ops_elsea)
|
||||||
in case dtype of
|
in case dtype of
|
||||||
"void" -> (constants_ifa, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq (if_length + 6)] ++ ops_ifa ++ [Opgoto (else_length + 3)] ++ ops_elsea, lvars)
|
"void" -> (constants_ifa, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq (if_length + 6)] ++ ops_ifa ++ [Opgoto (else_length + 3)] ++ ops_elsea, lvars_ifa)
|
||||||
_ -> (constants_ifa, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq (if_length + 3)] ++ ops_ifa ++ ops_elsea, lvars)
|
_ -> (constants_ifa, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq (if_length + 3)] ++ ops_ifa ++ ops_elsea, lvars_ifa)
|
||||||
|
|
||||||
assembleStatement (constants, ops, lvars) (TypedStatement _ (While expr stmt)) = let
|
assembleStatement (constants, ops, lvars) (TypedStatement _ (While expr stmt)) = let
|
||||||
(constants_cmp, ops_cmp, _) = assembleExpression (constants, [], lvars) expr
|
(constants_cmp, ops_cmp, _) = assembleExpression (constants, [], lvars) expr
|
||||||
(constants_stmta, ops_stmta, _) = assembleStatement (constants_cmp, [], lvars) stmt
|
(constants_stmta, ops_stmta, lvars_stmta) = assembleStatement (constants_cmp, [], lvars) stmt
|
||||||
-- +3 because we insert 2 gotos, one for the comparison, one for the goto back to the comparison
|
-- +3 because we insert 2 gotos, one for the comparison, one for the goto back to the comparison
|
||||||
stmt_length = sum (map opcodeEncodingLength ops_stmta) + 6
|
stmt_length = sum (map opcodeEncodingLength ops_stmta) + 6
|
||||||
entire_length = stmt_length + sum (map opcodeEncodingLength ops_cmp)
|
entire_length = stmt_length + sum (map opcodeEncodingLength ops_cmp)
|
||||||
in
|
in
|
||||||
(constants_stmta, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq stmt_length] ++ ops_stmta ++ [Opgoto (-entire_length)], lvars)
|
(constants_stmta, ops ++ ops_cmp ++ [Opsipush 0, Opif_icmpeq stmt_length] ++ ops_stmta ++ [Opgoto (-entire_length)], lvars_stmta)
|
||||||
|
|
||||||
assembleStatement (constants, ops, lvars) (TypedStatement _ (LocalVariableDeclaration (VariableDeclaration dtype name expr))) = let
|
assembleStatement (constants, ops, lvars) (TypedStatement _ (LocalVariableDeclaration (VariableDeclaration dtype name expr))) = let
|
||||||
isPrimitive = elem dtype ["char", "boolean", "int"]
|
isPrimitive = elem dtype ["char", "boolean", "int"]
|
||||||
|
Loading…
Reference in New Issue
Block a user