Changed internal type of boolean, because it's obviously Z not B haha
This commit is contained in:
parent
79ddafbf9a
commit
4435f7aac8
@ -11,6 +11,7 @@ public class Main {
|
|||||||
TestEmpty empty = new TestEmpty();
|
TestEmpty empty = new TestEmpty();
|
||||||
TestFields fields = new TestFields();
|
TestFields fields = new TestFields();
|
||||||
TestConstructor constructor = new TestConstructor(42);
|
TestConstructor constructor = new TestConstructor(42);
|
||||||
|
TestArithmetic arithmetic = new TestArithmetic();
|
||||||
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();
|
||||||
@ -21,6 +22,10 @@ public class Main {
|
|||||||
assert fields.a == 0 && fields.b == 42;
|
assert fields.a == 0 && fields.b == 42;
|
||||||
// constructor parameters override initializers
|
// constructor parameters override initializers
|
||||||
assert constructor.a == 42;
|
assert constructor.a == 42;
|
||||||
|
// basic arithmetics
|
||||||
|
assert arithmetic.basic(1, 2, 3) == 2;
|
||||||
|
// we have boolean logic as well
|
||||||
|
assert arithmetic.logic(true, false, true) == true;
|
||||||
// multiple classes within one file work. Referencing another classes fields/methods works.
|
// multiple classes within one file work. Referencing another classes fields/methods works.
|
||||||
assert multipleClasses.a.a == 42;
|
assert multipleClasses.a.a == 42;
|
||||||
// self-referencing classes work.
|
// self-referencing classes work.
|
||||||
|
11
Test/JavaSources/TestArithmetic.java
Normal file
11
Test/JavaSources/TestArithmetic.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
public class TestArithmetic {
|
||||||
|
public int basic(int a, int b, int c)
|
||||||
|
{
|
||||||
|
return a + b - c * a / b % c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean logic(boolean a, boolean b, boolean c)
|
||||||
|
{
|
||||||
|
return a && (c || b);
|
||||||
|
}
|
||||||
|
}
|
@ -23,5 +23,12 @@ public class TestRecursion {
|
|||||||
{
|
{
|
||||||
return fibonacci(n - 1) + this.fibonacci(n - 2);
|
return fibonacci(n - 1) + this.fibonacci(n - 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int ackermann(int m, int n)
|
||||||
|
{
|
||||||
|
if (m == 0) return n + 1;
|
||||||
|
if (n == 0) return ackermann(m - 1, 1);
|
||||||
|
return ackermann(m - 1, ackermann(m, n - 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ methodAssembler (MethodDeclaration returntype name parameters statement) input =
|
|||||||
Just index -> let
|
Just index -> let
|
||||||
declaration = MethodDeclaration returntype name parameters statement
|
declaration = MethodDeclaration returntype name parameters statement
|
||||||
paramNames = "this" : [name | ParameterDeclaration _ name <- parameters]
|
paramNames = "this" : [name | ParameterDeclaration _ name <- parameters]
|
||||||
in case (splitAt index (methods input)) of
|
in case splitAt index (methods input) of
|
||||||
(pre, []) -> input
|
(pre, []) -> input
|
||||||
(pre, method : post) -> let
|
(pre, method : post) -> let
|
||||||
(constants, bytecode, aParamNames) = assembleMethod (constantPool input, [], paramNames) declaration
|
(constants, bytecode, aParamNames) = assembleMethod (constantPool input, [], paramNames) declaration
|
||||||
|
@ -43,7 +43,7 @@ parseMethodType :: ([String], String) -> String -> ([String], String)
|
|||||||
parseMethodType (params, returnType) ('(' : descriptor) = parseMethodType (params, returnType) descriptor
|
parseMethodType (params, returnType) ('(' : descriptor) = parseMethodType (params, returnType) descriptor
|
||||||
parseMethodType (params, returnType) ('I' : descriptor) = parseMethodType (params ++ ["I"], returnType) descriptor
|
parseMethodType (params, returnType) ('I' : descriptor) = parseMethodType (params ++ ["I"], returnType) descriptor
|
||||||
parseMethodType (params, returnType) ('C' : descriptor) = parseMethodType (params ++ ["C"], returnType) descriptor
|
parseMethodType (params, returnType) ('C' : descriptor) = parseMethodType (params ++ ["C"], returnType) descriptor
|
||||||
parseMethodType (params, returnType) ('B' : descriptor) = parseMethodType (params ++ ["B"], returnType) descriptor
|
parseMethodType (params, returnType) ('Z' : descriptor) = parseMethodType (params ++ ["Z"], returnType) descriptor
|
||||||
parseMethodType (params, returnType) ('L' : descriptor) = let
|
parseMethodType (params, returnType) ('L' : descriptor) = let
|
||||||
typeLength = elemIndex ';' descriptor
|
typeLength = elemIndex ';' descriptor
|
||||||
in case typeLength of
|
in case typeLength of
|
||||||
@ -53,7 +53,7 @@ parseMethodType (params, returnType) ('L' : descriptor) = let
|
|||||||
parseMethodType (params ++ [typeName], returnType) restOfDescriptor
|
parseMethodType (params ++ [typeName], returnType) restOfDescriptor
|
||||||
Nothing -> error $ "unterminated class type in function signature: " ++ (show descriptor)
|
Nothing -> error $ "unterminated class type in function signature: " ++ (show descriptor)
|
||||||
parseMethodType (params, _) (')' : descriptor) = (params, descriptor)
|
parseMethodType (params, _) (')' : descriptor) = (params, descriptor)
|
||||||
parseMethodType _ descriptor = error $ "expected start of type name (L, I, C, B) but got: " ++ descriptor
|
parseMethodType _ descriptor = error $ "expected start of type name (L, I, C, Z) but got: " ++ descriptor
|
||||||
|
|
||||||
-- given a method index (constant pool index),
|
-- given a method index (constant pool index),
|
||||||
-- returns the full type of the method. (i.e (LSomething;II)V)
|
-- returns the full type of the method. (i.e (LSomething;II)V)
|
||||||
@ -76,7 +76,7 @@ datatypeDescriptor :: String -> String
|
|||||||
datatypeDescriptor "void" = "V"
|
datatypeDescriptor "void" = "V"
|
||||||
datatypeDescriptor "int" = "I"
|
datatypeDescriptor "int" = "I"
|
||||||
datatypeDescriptor "char" = "C"
|
datatypeDescriptor "char" = "C"
|
||||||
datatypeDescriptor "boolean" = "B"
|
datatypeDescriptor "boolean" = "Z"
|
||||||
datatypeDescriptor x = "L" ++ x ++ ";"
|
datatypeDescriptor x = "L" ++ x ++ ";"
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user