summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/tests/sequences.fate158
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java11
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java11
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/Type.java17
5 files changed, 226 insertions, 1 deletions
diff --git a/data/tests/sequences.fate b/data/tests/sequences.fate
new file mode 100644
index 0000000..62c0948
--- /dev/null
+++ b/data/tests/sequences.fate
@@ -0,0 +1,158 @@
+(fate_version 1)
+
+(global int test_var)
+
+(set test_var 0)
+
+(define_sequence seq0 ()
+ (set test_var 1)
+)
+
+(assert (= (var test_var) 0) FAILED: sequence A)
+
+(call seq0)
+
+(assert (= (var test_var) 1) FAILED: sequence B)
+
+(set test_var 0)
+
+(define_sequence seq1 ()
+ (set test_var (+ 1 (var test_var)))
+ (if (< (var test_var) 6)
+ (call seq1)
+ )
+)
+
+(call seq1)
+
+(assert (= (var test_var) 6) FAILED: sequence C)
+
+(set test_var 0)
+
+(define_sequence seq2 ()
+ (local int a)
+ (set a 2)
+ (set test_var (+ (var a) (var test_var)))
+ (if (< (var test_var) 8)
+ (call seq2)
+ )
+)
+
+(call seq2)
+
+(assert (= (var test_var) 8) FAILED: sequence D)
+
+(set test_var 0)
+
+(define_sequence seq3 (((ptr int) a_ptr))
+ (set (at a_ptr) 2)
+)
+
+(call seq3 (ptr test_var))
+
+(assert (= (var test_var) 2) FAILED: sequence E)
+
+(set test_var 0)
+
+(define_sequence index_of_loop
+ (
+ ((ptr int) result_holder)
+ ((list int) collection)
+ (int target)
+ )
+ (local int collection_size)
+ (local int i)
+
+ (set collection_size (size collection))
+
+ (for (set i 0) (< (var i) (var collection_size)) (set i (+ (var i) 1))
+ (if (= (access collection (var i)) (var target))
+ (
+ (set (at result_holder) (var i))
+ (done)
+ )
+ )
+ )
+ (set (at result_holder) -1)
+)
+
+(global (list int) l0)
+
+(add 0 l0)
+(add 1 l0)
+(add 2 l0)
+(add 3 l0)
+(add 4 l0)
+(add 5 l0)
+
+(call index_of_loop (ptr test_var) (var l0) 5)
+
+(assert (= (var test_var) 5) FAILED: sequence E)
+
+(call index_of_loop (ptr test_var) (var l0) 6)
+
+(assert (= (var test_var) -1) FAILED: sequence F)
+
+(define_sequence index_of_jump
+ (
+ ((ptr int) result_holder)
+ ((list int) collection)
+ (int target)
+ (int i)
+ (int collection_size)
+ )
+ (ifelse (= (var i) (var collection_size))
+ (set (at result_holder) -1)
+ (ifelse (= (access collection (var i)) (var target))
+ (set (at result_holder) (var i))
+ (jump index_of_jump
+ (var result_holder)
+ (var collection)
+ (var target)
+ (+ (var i) 1)
+ (var collection_size)
+ )
+ )
+ )
+)
+
+(call index_of_jump (ptr test_var) (var l0) 5 0 (size l0))
+
+(assert (= (var test_var) 5) FAILED: sequence G)
+
+(call index_of_jump (ptr test_var) (var l0) 6 0 (size l0))
+
+(assert (= (var test_var) -1) FAILED: sequence H)
+
+(define_sequence index_of_call
+ (
+ ((ptr int) result_holder)
+ ((list int) collection)
+ (int target)
+ (int i)
+ (int collection_size)
+ )
+ (ifelse (= (var i) (var collection_size))
+ (set (at result_holder) -1)
+ (ifelse (= (access collection (var i)) (var target))
+ (set (at result_holder) (var i))
+ (call index_of_call
+ (var result_holder)
+ (var collection)
+ (var target)
+ (+ (var i) 1)
+ (var collection_size)
+ )
+ )
+ )
+)
+
+(call index_of_call (ptr test_var) (var l0) 5 0 (size l0))
+
+(assert (= (var test_var) 5) FAILED: sequence I)
+
+(call index_of_call (ptr test_var) (var l0) 6 0 (size l0))
+
+(assert (= (var test_var) -1) FAILED: sequence J)
+
+(end)
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java
index 5607450..8c91206 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java
@@ -17,6 +17,7 @@ import tonkadur.wyrd.v1.lang.meta.Instruction;
import tonkadur.wyrd.v1.lang.computation.Address;
import tonkadur.wyrd.v1.lang.computation.RelativeAddress;
+import tonkadur.wyrd.v1.lang.computation.Operation;
import tonkadur.wyrd.v1.lang.computation.Constant;
import tonkadur.wyrd.v1.lang.computation.Cast;
import tonkadur.wyrd.v1.lang.computation.ValueOf;
@@ -201,7 +202,15 @@ public class RegisterManager
new RelativeAddress
(
pc_stack.get_address(),
- new Cast(new Size(pc_stack.get_address()), Type.STRING),
+ new Cast
+ (
+ Operation.minus
+ (
+ new Size(pc_stack.get_address()),
+ Constant.ONE
+ ),
+ Type.STRING
+ ),
Type.INT
);
@@ -256,6 +265,16 @@ public class RegisterManager
r = parameter_context.reserve(p.get_type());
+ System.out.println
+ (
+ "[D] Storing param ("
+ + p.get_type().toString()
+ + ") "
+ + r.get_name()
+ + " <- "
+ + p.toString()
+ );
+
result.add(new SetValue(r.get_address(), p));
used_registers.add(r);
@@ -284,6 +303,15 @@ public class RegisterManager
r = parameter_context.reserve(p.get_type());
+ System.out.println
+ (
+ "[D] Reading param ("
+ + p.get_type().toString()
+ + ") "
+ + p.get_name()
+ + " <- "
+ + r.get_name()
+ );
result.add(new SetValue(p.get_address(), r.get_value()));
used_registers.add(r);
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
index d8316da..3af830c 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java
@@ -38,4 +38,15 @@ public class MapType extends Type
{
return name;
}
+
+ @Override
+ public boolean equals (final Object o)
+ {
+ if (o instanceof MapType)
+ {
+ return ((MapType) o).member_type.equals(member_type);
+ }
+
+ return false;
+ }
}
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java
index ee34c0d..5f5e563 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java
@@ -23,4 +23,15 @@ public class PointerType extends Type
{
return name;
}
+
+ @Override
+ public boolean equals (final Object o)
+ {
+ if (o instanceof PointerType)
+ {
+ return ((PointerType) o).target_type.equals(target_type);
+ }
+
+ return false;
+ }
}
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
index d2f5684..baa3bc3 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java
@@ -37,4 +37,21 @@ public class Type
{
return name;
}
+
+ @Override
+ public int hashCode ()
+ {
+ return toString().hashCode();
+ }
+
+ @Override
+ public boolean equals (final Object o)
+ {
+ if (o instanceof Type)
+ {
+ return ((Type) o).toString().equals(toString());
+ }
+
+ return false;
+ }
}