summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/unit-testing/access.fate6
-rw-r--r--data/unit-testing/access_pointer.fate94
-rw-r--r--data/unit-testing/field_access.fate10
-rw-r--r--data/unit-testing/map.fate4
-rw-r--r--data/unit-testing/merge.fate301
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMerge.java20
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java20
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g46
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g472
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java219
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java123
11 files changed, 501 insertions, 374 deletions
diff --git a/data/unit-testing/access.fate b/data/unit-testing/access.fate
index 7c1976f..fe92293 100644
--- a/data/unit-testing/access.fate
+++ b/data/unit-testing/access.fate
@@ -9,13 +9,13 @@
(global int i)
(for (set i 0) (=< i 10) (set i (+ i 1))
- (assert (= (access li i) (var i))
+ (assert (= (access i li) (var i))
[FAILED] ACCESS assert failed on (var i) for li.
)
- (assert (= (access li_ptr i) (var i))
+ (assert (= (access i li_ptr) (var i))
[FAILED] ACCESS assert failed on (var i) with for li_ptr.
)
- (assert (= (access (range 0 10 1) i) (var i))
+ (assert (= (access i (range 0 10 1)) (var i))
[FAILED] ACCESS assert failed on (var i) with for range.
)
)
diff --git a/data/unit-testing/access_pointer.fate b/data/unit-testing/access_pointer.fate
index e9218e9..c98c31a 100644
--- a/data/unit-testing/access_pointer.fate
+++ b/data/unit-testing/access_pointer.fate
@@ -13,10 +13,10 @@
(global int i)
(for (set i 0) (=< i 10) (set i (+ i 1))
- (assert (= (at (access_ptr li i)) (var i))
+ (assert (= (at (access_ptr i li)) (var i))
[FAILED] ACCESS POINTER assert failed on (var i) for li.
)
- (assert (= (at (access_ptr li_ptr i)) (var i))
+ (assert (= (at (access_ptr i li_ptr)) (var i))
[FAILED] ACCESS POINTER assert failed on (var i) with for li_ptr.
)
)
@@ -27,29 +27,73 @@
(add! (range 0 i 1) lili)
)
-(assert (= (at (access_ptr (at (access_ptr lili 10)) 0)) 0) [FAILED] (var test_name) lili.10.0 was (at (access_ptr (at (access_ptr lili 10)) 0)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 9)) 1)) 1) [FAILED] (var test_name) lili.9.1 was (at (access_ptr (at (access_ptr lili 9)) 1)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 8)) 2)) 2) [FAILED] (var test_name) lili.8.2 was (at (access_ptr (at (access_ptr lili 8)) 2)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 7)) 3)) 3) [FAILED] (var test_name) lili.7.3 was (at (access_ptr (at (access_ptr lili 7)) 3)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 6)) 4)) 4) [FAILED] (var test_name) lili.6.4 was (at (access_ptr (at (access_ptr lili 6)) 4)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 5)) 5)) 5) [FAILED] (var test_name) lili.5.5 was (at (access_ptr (at (access_ptr lili 5)) 5)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 4)) 3)) 3) [FAILED] (var test_name) lili.4.3 was (at (access_ptr (at (access_ptr lili 4)) 3)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 3)) 2)) 2) [FAILED] (var test_name) lili.3.2 was (at (access_ptr (at (access_ptr lili 3)) 2)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 2)) 1)) 1) [FAILED] (var test_name) lili.2.1 was (at (access_ptr (at (access_ptr lili 2)) 1)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 1)) 0)) 0) [FAILED] (var test_name) lili.1.0 was (at (access_ptr (at (access_ptr lili 1)) 0)) for part A.)
-(assert (= (at (access_ptr (at (access_ptr lili 0)) 0)) 0) [FAILED] (var test_name) lili.0.0 was (at (access_ptr (at (access_ptr lili 0)) 0)) for part A.)
-
-(assert (= (at (access_ptr lili.10 0)) 0) [FAILED] (var test_name) lili.10.0 was (at (access_ptr lili.10 0)) for part B.)
-(assert (= (at (access_ptr lili.9 1)) 1) [FAILED] (var test_name) lili.9.1 was (at (access_ptr lili.9 1)) for part B.)
-(assert (= (at (access_ptr lili.8 2)) 2) [FAILED] (var test_name) lili.8.2 was (at (access_ptr lili.8 2)) for part B.)
-(assert (= (at (access_ptr lili.7 3)) 3) [FAILED] (var test_name) lili.7.3 was (at (access_ptr lili.7 3)) for part B.)
-(assert (= (at (access_ptr lili.6 4)) 4) [FAILED] (var test_name) lili.6.4 was (at (access_ptr lili.6 4)) for part B.)
-(assert (= (at (access_ptr lili.5 5)) 5) [FAILED] (var test_name) lili.5.5 was (at (access_ptr lili.5 5)) for part B.)
-(assert (= (at (access_ptr lili.4 3)) 3) [FAILED] (var test_name) lili.4.3 was (at (access_ptr lili.4 3)) for part B.)
-(assert (= (at (access_ptr lili.3 2)) 2) [FAILED] (var test_name) lili.3.2 was (at (access_ptr lili.3 2)) for part B.)
-(assert (= (at (access_ptr lili.2 1)) 1) [FAILED] (var test_name) lili.2.1 was (at (access_ptr lili.2 1)) for part B.)
-(assert (= (at (access_ptr lili.1 0)) 0) [FAILED] (var test_name) lili.1.0 was (at (access_ptr lili.1 0)) for part B.)
-(assert (= (at (access_ptr lili.0 0)) 0) [FAILED] (var test_name) lili.0.0 was (at (access_ptr lili.0 0)) for part B.)
+(assert
+ (= (at (access_ptr 0 (at (access_ptr 10 lili)))) 0)
+ [FAILED] (var test_name) lili.10.0 was
+ (at (access_ptr 0 (at (access_ptr 10 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 1 (at (access_ptr 9 lili)))) 1)
+ [FAILED] (var test_name) lili.9.1 was
+ (at (access_ptr 1 (at (access_ptr 9 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 2 (at (access_ptr 8 lili)))) 2)
+ [FAILED] (var test_name) lili.8.2 was
+ (at (access_ptr 2 (at (access_ptr 8 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 3 (at (access_ptr 7 lili)))) 3)
+ [FAILED] (var test_name) lili.7.3 was
+ (at (access_ptr 3 (at (access_ptr 7 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 4 (at (access_ptr 6 lili)))) 4)
+ [FAILED] (var test_name) lili.6.4 was
+ (at (access_ptr 4 (at (access_ptr 6 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 5 (at (access_ptr 5 lili)))) 5)
+ [FAILED] (var test_name) lili.5.5 was
+ (at (access_ptr 5 (at (access_ptr 5 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 3 (at (access_ptr 4 lili)))) 3)
+ [FAILED] (var test_name) lili.4.3 was
+ (at (access_ptr 3 (at (access_ptr 4 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 2 (at (access_ptr 3 lili)))) 2)
+ [FAILED] (var test_name) lili.3.2 was
+ (at (access_ptr 2 (at (access_ptr 3 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 1 (at (access_ptr 2 lili)))) 1)
+ [FAILED] (var test_name) lili.2.1 was
+ (at (access_ptr 1 (at (access_ptr 2 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 0 (at (access_ptr 1 lili)))) 0)
+ [FAILED] (var test_name) lili.1.0 was
+ (at (access_ptr 0 (at (access_ptr 1 lili)))) for part A.
+)
+(assert
+ (= (at (access_ptr 0 (at (access_ptr 0 lili)))) 0)
+ [FAILED] (var test_name) lili.0.0 was
+ (at (access_ptr 0 (at (access_ptr 0 lili)))) for part A.
+)
+
+(assert (= (at (access_ptr 0 lili.10)) 0) [FAILED] (var test_name) lili.10.0 was (at (access_ptr 0 lili.10)) for part B.)
+(assert (= (at (access_ptr 1 lili.9)) 1) [FAILED] (var test_name) lili.9.1 was (at (access_ptr 1 lili.9)) for part B.)
+(assert (= (at (access_ptr 2 lili.8)) 2) [FAILED] (var test_name) lili.8.2 was (at (access_ptr 2 lili.8)) for part B.)
+(assert (= (at (access_ptr 3 lili.7)) 3) [FAILED] (var test_name) lili.7.3 was (at (access_ptr 3 lili.7)) for part B.)
+(assert (= (at (access_ptr 4 lili.6)) 4) [FAILED] (var test_name) lili.6.4 was (at (access_ptr 4 lili.6)) for part B.)
+(assert (= (at (access_ptr 5 lili.5)) 5) [FAILED] (var test_name) lili.5.5 was (at (access_ptr 5 lili.5)) for part B.)
+(assert (= (at (access_ptr 3 lili.4)) 3) [FAILED] (var test_name) lili.4.3 was (at (access_ptr 3 lili.4)) for part B.)
+(assert (= (at (access_ptr 2 lili.3)) 2) [FAILED] (var test_name) lili.3.2 was (at (access_ptr 2 lili.3)) for part B.)
+(assert (= (at (access_ptr 1 lili.2)) 1) [FAILED] (var test_name) lili.2.1 was (at (access_ptr 1 lili.2)) for part B.)
+(assert (= (at (access_ptr 0 lili.1)) 0) [FAILED] (var test_name) lili.1.0 was (at (access_ptr 0 lili.1)) for part B.)
+(assert (= (at (access_ptr 0 lili.0)) 0) [FAILED] (var test_name) lili.0.0 was (at (access_ptr 0 lili.0)) for part B.)
[COMPLETED] ACCESS POINTER
diff --git a/data/unit-testing/field_access.fate b/data/unit-testing/field_access.fate
index dbc2c18..715e706 100644
--- a/data/unit-testing/field_access.fate
+++ b/data/unit-testing/field_access.fate
@@ -68,7 +68,7 @@
)
(assert
- (= (get_field ts0_0 i) (var ts0_0.i) (get_field ts0_1 k) (var ts0_1.k) 42)
+ (= (get_field i ts0_0) (var ts0_0.i) (get_field k ts0_1) (var ts0_1.k) 42)
[FAILED] (var test_name) Test 0.
(newline)
ts0_0.i = (var ts0_0.i)
@@ -77,7 +77,7 @@
)
(assert
- (= (get_field ts0_1 i) (var ts0_1.i) (get_field ts0_0 k) (var ts0_0.k) 420)
+ (= (get_field i ts0_1) (var ts0_1.i) (get_field k ts0_0) (var ts0_0.k) 420)
[FAILED] (var test_name) Test 1.
(newline)
ts0_0.k = (var ts0_0.k)
@@ -87,9 +87,9 @@
(assert
(=
- (field ts0_1 i)
- (get_field (set_fields ts1_0 (i 420)) i)
- (get_field (field (field ts2_0 ts1) ts0) i)
+ (field i ts0_1)
+ (get_field i (set_fields ts1_0 (i 420)))
+ (get_field i (field ts0 (field ts1 ts2_0)))
420
)
[FAILED] (var test_name) Test 2.
diff --git a/data/unit-testing/map.fate b/data/unit-testing/map.fate
index bf8517f..bea1ada 100644
--- a/data/unit-testing/map.fate
+++ b/data/unit-testing/map.fate
@@ -136,11 +136,11 @@
(for (set i 0) (=< i 10) (set i (+ i 1))
(assert
(=
- (access li1 i) (access li0 i) (access li2 i) (access li3 i)
+ (access i li1) (access i li0) (access i li2) (access i li3)
(+ (* i (+ 10 i)) 1000)
)
[FAILED] (var test_name) Indexed map at (var i):
- (access li1 i), (access li0 i), (access li2 i), (access li3 i)
+ (access i li1), (access i li0), (access i li2), (access i li3)
)
)
diff --git a/data/unit-testing/merge.fate b/data/unit-testing/merge.fate
index 88bc732..ba40724 100644
--- a/data/unit-testing/merge.fate
+++ b/data/unit-testing/merge.fate
@@ -26,10 +26,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- (range 10 40 1)
(range 0 60 2)
+ (range 10 40 1)
)
)
@@ -40,10 +40,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- (range 10 70 1)
(range 0 60 2)
+ (range 10 70 1)
)
)
@@ -54,10 +54,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- (range 10 40 1)
(range 0 80 2)
+ (range 10 40 1)
)
)
@@ -71,10 +71,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- li1
(range 0 60 2)
+ li1
)
(merge!
@@ -83,10 +83,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- li1oa
(range 0 60 2)
+ li1oa
)
(merge!
@@ -95,10 +95,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- li1ob
(range 0 160 2)
+ li1ob
)
(assert
@@ -110,21 +110,21 @@
(assert
(=
(- (+ 10 i) (* 2 i))
- (access li0 i)
- (access li0oa i)
- (access li0ob i)
- (access li1 i)
- (access li1oa i)
- (access li1ob i)
+ (access i li0)
+ (access i li0oa)
+ (access i li0ob)
+ (access i li1)
+ (access i li1oa)
+ (access i li1ob)
)
[FAILED] (var test_name) Basic test 0, index (var i), values:
Expected: (- (+ 10 i) (* 2 i));
- li0: (access li0 i);
- li0oa: (access li0oa i);
- li0ob: (access li0ob i);
- li1: (access li1 i);
- li1oa: (access li1oa i);
- li1ob: (access li1ob i)
+ li0: (access i li0);
+ li0oa: (access i li0oa);
+ li0ob: (access i li0ob);
+ li1: (access i li1);
+ li1oa: (access i li1oa);
+ li1ob: (access i li1ob)
)
)
@@ -145,10 +145,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- (range 10 40 1)
(range 0 60 2)
+ (range 10 40 1)
)
)
@@ -159,10 +159,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- (range 10 70 1)
(range 0 60 2)
+ (range 10 70 1)
)
)
@@ -173,10 +173,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- (range 10 40 1)
(range 0 80 2)
+ (range 10 40 1)
)
)
@@ -190,10 +190,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- si1
(range 0 60 2)
+ si1
)
(merge!
@@ -202,10 +202,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- si1oa
(range 0 60 2)
+ si1oa
)
(merge!
@@ -214,10 +214,10 @@
(int a)
(int b)
)
- (- a b)
+ (- b a)
)
- si1ob
(range 0 80 2)
+ si1ob
)
(assert
@@ -238,21 +238,21 @@
(assert
(=
(- (+ 10 j) (* 2 j))
- (access si0 i)
- (access si0oa i)
- (access si0ob i)
- (access si1 i)
- (access si1oa i)
- (access si1ob i)
+ (access i si0)
+ (access i si0oa)
+ (access i si0ob)
+ (access i si1)
+ (access i si1oa)
+ (access i si1ob)
)
[FAILED] (var test_name) Basic test 1, index (var i), values:
Expected: (- (+ 10 j) (* 2 j));
- si0: (access si0 i);
- si0oa: (access si0oa i);
- si0ob: (access si0ob i);
- si1: (access si1 i);
- si1oa: (access si1oa i);
- si1ob: (access si1ob i);
+ si0: (access i si0);
+ si0oa: (access i si0oa);
+ si0ob: (access i si0ob);
+ si1: (access i si1);
+ si1oa: (access i si1oa);
+ si1ob: (access i si1ob);
)
)
@@ -274,10 +274,10 @@
(int b)
(int mod)
)
- (* (- a b) mod)
+ (* (- b a) mod)
)
- (range 10 40 1)
(range 0 60 2)
+ (range 10 40 1)
-1
)
)
@@ -290,10 +290,10 @@
(int b)
(int mod)
)
- (* (- a b) mod)
+ (* (- b a) mod)
)
- (range 10 80 1)
(range 0 60 2)
+ (range 10 80 1)
-1
)
)
@@ -306,10 +306,10 @@
(int b)
(int mod)
)
- (* (- a b) mod)
+ (* (- b a) mod)
)
- (range 10 40 1)
(range 0 80 2)
+ (range 10 40 1)
-1
)
)
@@ -325,10 +325,10 @@
(int b)
(int mod)
)
- (* (- a b) mod)
+ (* (- b a) mod)
)
- si3
(range 0 60 2)
+ si3
-1
)
@@ -339,10 +339,10 @@
(int b)
(int mod)
)
- (* (- a b) mod)
+ (* (- b a) mod)
)
- si3oa
(range 0 60 2)
+ si3oa
-1
)
@@ -353,10 +353,10 @@
(int b)
(int mod)
)
- (* (- a b) mod)
+ (* (- b a) mod)
)
- si3ob
(range 0 90 2)
+ si3ob
-1
)
@@ -372,21 +372,21 @@
(assert
(=
(* (- (+ 10 i) (* 2 i)) -1)
- (access si2 i)
- (access si2oa i)
- (access si2ob i)
- (access si3 i)
- (access si3oa i)
- (access si3ob i)
+ (access i si2)
+ (access i si2oa)
+ (access i si2ob)
+ (access i si3)
+ (access i si3oa)
+ (access i si3ob)
)
[FAILED] (var test_name) Basic test 2, index (var i), values:
Expected: (* (- (+ 10 i) (* 2 i)) -1);
- si2: (access si2 i);
- si2oa: (access si2oa i);
- si2ob: (access si2ob i);
- si3: (access si3 i);
- si3oa: (access si3oa i);
- si3ob: (access si3ob i)
+ si2: (access i si2);
+ si2oa: (access i si2oa);
+ si2ob: (access i si2ob);
+ si3: (access i si3);
+ si3oa: (access i si3oa);
+ si3ob: (access i si3ob)
)
)
@@ -408,10 +408,10 @@
(int a)
(int b)
)
- (* (- a b) i)
+ (* (- b a) i)
)
- (range 10 40 1)
(range 0 60 2)
+ (range 10 40 1)
)
)
@@ -423,10 +423,10 @@
(int a)
(int b)
)
- (* (- a b) i)
+ (* (- b a) i)
)
- (range 10 70 1)
(range 0 60 2)
+ (range 10 70 1)
)
)
@@ -438,10 +438,10 @@
(int a)
(int b)
)
- (* (- a b) i)
+ (* (- b a) i)
)
- (range 10 40 1)
(range 0 80 2)
+ (range 10 40 1)
)
)
@@ -456,10 +456,10 @@
(int a)
(int b)
)
- (* (- a b) i)
+ (* (- b a) i)
)
- ili1
(range 0 60 2)
+ ili1
)
(indexed_merge!
@@ -469,10 +469,10 @@
(int a)
(int b)
)
- (* (- a b) i)
+ (* (- b a) i)
)
- ili1oa
(range 0 60 2)
+ ili1oa
)
(indexed_merge!
@@ -482,10 +482,10 @@
(int a)
(int b)
)
- (* (- a b) i)
+ (* (- b a) i)
)
- ili1ob
(range 0 160 2)
+ ili1ob
)
(assert
@@ -497,21 +497,21 @@
(assert
(=
(* (- (+ 10 i) (* 2 i)) i)
- (access ili0 i)
- (access ili0oa i)
- (access ili0ob i)
- (access ili1 i)
- (access ili1oa i)
- (access ili1ob i)
+ (access i ili0)
+ (access i ili0oa)
+ (access i ili0ob)
+ (access i ili1)
+ (access i ili1oa)
+ (access i ili1ob)
)
[FAILED] (var test_name) Indexed test 0, index (var i), values:
Expected: (* (- (+ 10 i) (* 2 i)) i);
- ili0: (access ili0 i);
- ili0oa: (access ili0oa i);
- ili0ob: (access ili0ob i);
- ili1: (access ili1 i);
- ili1oa: (access ili1oa i);
- ili1ob: (access ili1ob i)
+ ili0: (access i ili0);
+ ili0oa: (access i ili0oa);
+ ili0ob: (access i ili0ob);
+ ili1: (access i ili1);
+ ili1oa: (access i ili1oa);
+ ili1ob: (access i ili1ob)
)
)
@@ -541,10 +541,10 @@ For reference, the values found in the sets are:
(int a)
(int b)
)
- (* (- a b) (+ i 1))
+ (* (- b a) (+ i 1))
)
- (range 10 40 1)
(range 0 60 2)
+ (range 10 40 1)
)
)
@@ -556,10 +556,10 @@ For reference, the values found in the sets are:
(int a)
(int b)
)
- (* (- a b) (+ i 1))
+ (* (- b a) (+ i 1))
)
- (range 10 70 1)
(range 0 60 2)
+ (range 10 70 1)
)
)
@@ -571,10 +571,10 @@ For reference, the values found in the sets are:
(int a)
(int b)
)
- (* (- a b) (+ i 1))
+ (* (- b a) (+ i 1))
)
- (range 10 40 1)
(range 0 80 2)
+ (range 10 40 1)
)
)
@@ -589,10 +589,10 @@ For reference, the values found in the sets are:
(int a)
(int b)
)
- (* (- a b) (+ i 1))
+ (* (- b a) (+ i 1))
)
- isi1
(range 0 60 2)
+ isi1
)
(indexed_merge!
@@ -602,10 +602,10 @@ For reference, the values found in the sets are:
(int a)
(int b)
)
- (* (- a b) (+ i 1))
+ (* (- b a) (+ i 1))
)
- isi1oa
(range 0 60 2)
+ isi1oa
)
(indexed_merge!
@@ -615,10 +615,10 @@ For reference, the values found in the sets are:
(int a)
(int b)
)
- (* (- a b) (+ i 1))
+ (* (- b a) (+ i 1))
)
- isi1ob
(range 0 80 2)
+ isi1ob
)
(assert
@@ -629,22 +629,22 @@ For reference, the values found in the sets are:
(for (set i (- (size oracle_set) 1)) (>= i 0) (set i (- i 1))
(assert
(=
- (access oracle_set i)
- (access isi0 i)
- (access isi0oa i)
- (access isi0ob i)
- (access isi1 i)
- (access isi1oa i)
- (access isi1ob i)
+ (access i oracle_set)
+ (access i isi0)
+ (access i isi0oa)
+ (access i isi0ob)
+ (access i isi1)
+ (access i isi1oa)
+ (access i isi1ob)
)
[FAILED] (var test_name) Indexed test 1, index (var i), values:
- Expected: (access oracle_set i);
- isi0: (access isi0 i);
- isi0oa: (access isi0oa i);
- isi0ob: (access isi0ob i);
- isi1: (access isi1 i);
- isi1oa: (access isi1oa i);
- isi1ob: (access isi1ob i);
+ Expected: (access i oracle_set);
+ isi0: (access i isi0);
+ isi0oa: (access i isi0oa);
+ isi0ob: (access i isi0ob);
+ isi1: (access i isi1);
+ isi1oa: (access i isi1oa);
+ isi1ob: (access i isi1ob);
)
)
@@ -678,10 +678,10 @@ For reference, the values found in the sets are:
(int b)
(int mod)
)
- (* (* (- a b) mod) (+ i 1))
+ (* (* (- b a) mod) (+ i 1))
)
- (range 10 40 1)
(range 0 60 2)
+ (range 10 40 1)
-1
)
)
@@ -695,10 +695,10 @@ For reference, the values found in the sets are:
(int b)
(int mod)
)
- (* (* (- a b) mod) (+ i 1))
+ (* (* (- b a) mod) (+ i 1))
)
- (range 10 80 1)
(range 0 60 2)
+ (range 10 80 1)
-1
)
)
@@ -712,10 +712,10 @@ For reference, the values found in the sets are:
(int b)
(int mod)
)
- (* (- a b) mod (+ i 1))
+ (* (- b a) mod (+ i 1))
)
- (range 10 40 1)
(range 0 80 2)
+ (range 10 40 1)
-1
)
)
@@ -732,10 +732,10 @@ For reference, the values found in the sets are:
(int b)
(int mod)
)
- (* (- a b) mod (+ i 1))
+ (* (- b a) mod (+ i 1))
)
- isi3
(range 0 60 2)
+ isi3
-1
)
@@ -747,10 +747,10 @@ For reference, the values found in the sets are:
(int b)
(int mod)
)
- (* (- a b) mod (+ i 1))
+ (* (- b a) mod (+ i 1))
)
- isi3oa
(range 0 60 2)
+ isi3oa
-1
)
@@ -762,10 +762,10 @@ For reference, the values found in the sets are:
(int b)
(int mod)
)
- (* (- a b) mod (+ i 1))
+ (* (- b a) mod (+ i 1))
)
- isi3ob
(range 0 90 2)
+ isi3ob
-1
)
@@ -777,29 +777,30 @@ For reference, the values found in the sets are:
(for (set i (- (size oracle_set) 1)) (>= i 0) (set i (- i 1))
(assert
(=
- (access oracle_set i)
- (access isi2 i)
- (access isi2oa i)
- (access isi2ob i)
- (access isi3 i)
- (access isi3oa i)
- (access isi3ob i)
+ (access i oracle_set)
+ (access i isi2)
+ (access i isi2oa)
+ (access i isi2ob)
+ (access i isi3)
+ (access i isi3oa)
+ (access i isi3ob)
)
[FAILED] (var test_name) Indexed test 2, index (var i), values:
- Expected: (access oracle_set i);
- isi2: (access isi2 i);
- isi2oa: (access isi2oa i);
- isi2ob: (access isi2ob i);
- isi3: (access isi3 i);
- isi3oa: (access isi3oa i);
- isi3ob: (access isi3ob i)
+ Expected: (access i oracle_set);
+ isi2: (access i isi2);
+ isi2oa: (access i isi2oa);
+ isi2ob: (access i isi2ob);
+ isi3: (access i isi3);
+ isi3oa: (access i isi3oa);
+ isi3ob: (access i isi3ob)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; DEFAULT_VALUES TEST 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; SAFE TEST 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; TODO
+
+(assert (false) [FAILED] TODO: safe merge tests.)
[COMPLETED] (var test_name)
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMerge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMerge.java
index 96cfefc..060438c 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMerge.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMerge.java
@@ -35,10 +35,10 @@ public class IndexedMerge extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection,
- final Computation default_a,
final Computation collection_in_b,
final Computation default_b,
+ final Reference collection,
+ final Computation default_a,
final List<Computation> extra_params
)
{
@@ -60,10 +60,10 @@ public class IndexedMerge extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection,
- final Computation default_a,
final Computation collection_in_b,
final Computation default_b,
+ final Reference collection,
+ final Computation default_a,
final List<Computation> extra_params
)
throws Throwable
@@ -123,10 +123,10 @@ public class IndexedMerge extends Instruction
(
origin,
lambda_function,
- collection,
- default_a,
collection_in_b,
default_b,
+ collection,
+ default_a,
extra_params
);
}
@@ -144,22 +144,22 @@ public class IndexedMerge extends Instruction
return lambda_function;
}
- public Computation get_default_a ()
+ public Computation get_main_default ()
{
return default_a;
}
- public Computation get_collection_in_b ()
+ public Computation get_secondary_collection ()
{
return collection_in_b;
}
- public Computation get_default_b ()
+ public Computation get_secondary_default ()
{
return default_b;
}
- public Reference get_collection ()
+ public Reference get_main_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java
index f2396a9..9a40f2f 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java
@@ -35,10 +35,10 @@ public class Merge extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection,
- final Computation default_a,
final Computation collection_in_b,
final Computation default_b,
+ final Reference collection,
+ final Computation default_a,
final List<Computation> extra_params
)
{
@@ -60,10 +60,10 @@ public class Merge extends Instruction
(
final Origin origin,
final Computation lambda_function,
- final Reference collection,
- final Computation default_a,
final Computation collection_in_b,
final Computation default_b,
+ final Reference collection,
+ final Computation default_a,
final List<Computation> extra_params
)
throws Throwable
@@ -117,10 +117,10 @@ public class Merge extends Instruction
(
origin,
lambda_function,
- collection,
- default_a,
collection_in_b,
default_b,
+ collection,
+ default_a,
extra_params
);
}
@@ -138,22 +138,22 @@ public class Merge extends Instruction
return lambda_function;
}
- public Computation get_default_a ()
+ public Computation get_main_default ()
{
return default_a;
}
- public Computation get_collection_in_b ()
+ public Computation get_secondary_collection ()
{
return collection_in_b;
}
- public Computation get_default_b ()
+ public Computation get_secondary_default ()
{
return default_b;
}
- public Reference get_collection ()
+ public Reference get_main_collection ()
{
return collection;
}
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index 10bb692..b7b64dd 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -8,6 +8,7 @@ lexer grammar FateLexer;
fragment SEP: [ \t\r\n]+;
fragment US: '_'?;
+
WS: SEP;
L_PAREN: '(';
@@ -162,6 +163,9 @@ VISIT_KW: L_PAREN ('call'|'visit')(US(('seq'('uence'?))|('proc'('edure'?))))? SE
CONTINUE_AS_KW: L_PAREN (('continue'US('as'|'to'|'with'))|('jump'(US'to')?)|('go'US'to')|'exec')(US(('seq'('uence'?))|('proc'('edure'?))))? SEP+;
WHILE_KW: L_PAREN 'while' SEP+;
-WORD: (~([ \t\r\n()])|'\\)'|'\\(')+;
+WORD: ((~([ \t\r\n()]))|'(lp)'|'(rp)')+
+ {
+ setText(getText().replaceAll("\\(lp\\)", "(").replaceAll("\\(rp\\)", ")"));
+ };
COMMENT: WS* ';' .*? '\n' -> channel(HIDDEN);
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index d16dfb2..16a9472 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -977,8 +977,8 @@ returns [Instruction result]
| IMP_MERGE_KW
fun=non_text_value WS+
- value_reference WS+
- inv1=non_text_value WS*
+ inv1=non_text_value WS+
+ value_reference WS*
R_PAREN
{
$result =
@@ -990,18 +990,18 @@ returns [Instruction result]
($IMP_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- null,
($inv1.result),
null,
+ ($value_reference.result),
+ null,
new ArrayList()
);
}
| IMP_MERGE_KW
fun=non_text_value WS+
- value_reference WS+
inv1=non_text_value WS+
+ value_reference WS+
value_list WS*
R_PAREN
{
@@ -1014,18 +1014,18 @@ returns [Instruction result]
($IMP_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- null,
($inv1.result),
null,
+ ($value_reference.result),
+ null,
($value_list.result)
);
}
| IMP_INDEXED_MERGE_KW
fun=non_text_value WS+
- value_reference WS+
- inv1=non_text_value WS*
+ inv1=non_text_value WS+
+ value_reference WS*
R_PAREN
{
$result =
@@ -1037,18 +1037,18 @@ returns [Instruction result]
($IMP_INDEXED_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- null,
($inv1.result),
null,
+ ($value_reference.result),
+ null,
new ArrayList()
);
}
| IMP_INDEXED_MERGE_KW
fun=non_text_value WS+
- value_reference WS+
inv1=non_text_value WS+
+ value_reference WS+
value_list WS*
R_PAREN
{
@@ -1061,20 +1061,20 @@ returns [Instruction result]
($IMP_INDEXED_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- null,
($inv1.result),
null,
+ ($value_reference.result),
+ null,
($value_list.result)
);
}
| SAFE_IMP_MERGE_KW
fun=non_text_value WS+
- def0=value WS+
- value_reference WS+
def1=value WS+
- inv1=non_text_value WS*
+ inv1=non_text_value WS+
+ def0=value WS+
+ value_reference WS*
R_PAREN
{
$result =
@@ -1086,20 +1086,20 @@ returns [Instruction result]
($SAFE_IMP_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- ($def0.result),
($inv1.result),
($def1.result),
+ ($value_reference.result),
+ ($def0.result),
new ArrayList()
);
}
| SAFE_IMP_MERGE_KW
fun=non_text_value WS+
- def0=value WS+
- value_reference WS+
def1=value WS+
inv1=non_text_value WS+
+ def0=value WS+
+ value_reference WS+
value_list WS*
R_PAREN
{
@@ -1112,20 +1112,20 @@ returns [Instruction result]
($SAFE_IMP_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- ($def0.result),
($inv1.result),
($def1.result),
+ ($value_reference.result),
+ ($def0.result),
($value_list.result)
);
}
| SAFE_IMP_INDEXED_MERGE_KW
fun=non_text_value WS+
- def0=value WS+
- value_reference WS+
def1=value WS+
- inv1=non_text_value WS*
+ inv1=non_text_value WS+
+ def0=value WS+
+ value_reference WS*
R_PAREN
{
$result =
@@ -1137,20 +1137,20 @@ returns [Instruction result]
($SAFE_IMP_INDEXED_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- ($def0.result),
($inv1.result),
($def1.result),
+ ($value_reference.result),
+ ($def0.result),
new ArrayList()
);
}
| SAFE_IMP_INDEXED_MERGE_KW
fun=non_text_value WS+
- def0=value WS+
- value_reference WS+
def1=value WS+
inv1=non_text_value WS+
+ def0=value WS+
+ value_reference WS+
value_list WS*
R_PAREN
{
@@ -1163,10 +1163,10 @@ returns [Instruction result]
($SAFE_IMP_INDEXED_MERGE_KW.getCharPositionInLine())
),
($fun.result),
- ($value_reference.result),
- ($def0.result),
($inv1.result),
($def1.result),
+ ($value_reference.result),
+ ($def0.result),
($value_list.result)
);
}
@@ -3743,7 +3743,7 @@ returns [Computation result]
);
}
- | ACCESS_KW collection=non_text_value WS+ index=non_text_value WS* R_PAREN
+ | ACCESS_KW index=non_text_value WS+ collection=non_text_value WS* R_PAREN
{
$result =
Access.build
@@ -3758,7 +3758,7 @@ returns [Computation result]
);
}
- | ACCESS_POINTER_KW value_reference WS+ non_text_value WS* R_PAREN
+ | ACCESS_POINTER_KW non_text_value WS+ value_reference WS* R_PAREN
{
$result =
AccessPointer.build
@@ -3773,7 +3773,7 @@ returns [Computation result]
);
}
- | FIELD_ACCESS_KW non_text_value WS+ WORD WS* R_PAREN
+ | FIELD_ACCESS_KW WORD WS+ non_text_value WS* R_PAREN
{
$result =
FieldAccess.build
@@ -5115,7 +5115,7 @@ returns [Reference result]
);
}
- | FIELD_KW value_reference WS+ WORD WS* R_PAREN
+ | FIELD_KW WORD WS+ value_reference WS* R_PAREN
{
$result =
FieldReference.build
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java
index 19baae7..5986682 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java
@@ -749,17 +749,18 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
throws Throwable
{
final Register holder;
- final ComputationCompiler lambda_cc, default_a_cc, default_b_cc;
+ final ComputationCompiler lambda_cc;
+ final ComputationCompiler main_default_cc, secondary_default_cc;
final List<Computation> params;
final List<ComputationCompiler> param_cc_list;
- final ComputationCompiler collection_cc, in_collection_b_cc;
+ final ComputationCompiler main_collection_cc, secondary_collection_cc;
params = new ArrayList<Computation>();
param_cc_list = new ArrayList<ComputationCompiler>();
lambda_cc = new ComputationCompiler(compiler);
- default_a_cc = new ComputationCompiler(compiler);
- default_b_cc = new ComputationCompiler(compiler);
+ main_default_cc = new ComputationCompiler(compiler);
+ secondary_default_cc = new ComputationCompiler(compiler);
n.get_lambda_function().get_visited_by(lambda_cc);
@@ -768,43 +769,47 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(lambda_cc.get_init());
}
- collection_cc = new ComputationCompiler(compiler);
+ main_collection_cc = new ComputationCompiler(compiler);
- n.get_collection().get_visited_by(collection_cc);
+ n.get_main_collection().get_visited_by(main_collection_cc);
- if (collection_cc.has_init())
+ if (main_collection_cc.has_init())
{
- result.add(collection_cc.get_init());
+ result.add(main_collection_cc.get_init());
}
- n.get_default_a().get_visited_by(default_a_cc);
+ n.get_main_default().get_visited_by(main_default_cc);
- default_a_cc.generate_address();
+ main_default_cc.generate_address();
- if (default_a_cc.has_init())
+ if (main_default_cc.has_init())
{
- result.add(default_a_cc.get_init());
+ result.add(main_default_cc.get_init());
}
- n.get_default_b().get_visited_by(default_b_cc);
+ n.get_secondary_default().get_visited_by(secondary_default_cc);
- default_b_cc.generate_address();
+ secondary_default_cc.generate_address();
- if (default_b_cc.has_init())
+ if (secondary_default_cc.has_init())
{
- result.add(default_b_cc.get_init());
+ result.add(secondary_default_cc.get_init());
}
holder =
compiler.registers().reserve
(
- collection_cc.get_computation().get_type(),
+ main_collection_cc.get_computation().get_type(),
result
);
result.add
(
- new SetValue(holder.get_address(), collection_cc.get_computation())
+ new SetValue
+ (
+ holder.get_address(),
+ main_collection_cc.get_computation()
+ )
);
result.add
@@ -813,17 +818,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
(
compiler.registers(),
compiler.assembler(),
- collection_cc.get_address()
+ main_collection_cc.get_address()
)
);
- in_collection_b_cc = new ComputationCompiler(compiler);
+ secondary_collection_cc = new ComputationCompiler(compiler);
- n.get_collection_in_b().get_visited_by(in_collection_b_cc);
+ n.get_secondary_collection().get_visited_by(secondary_collection_cc);
- if (in_collection_b_cc.has_init())
+ if (secondary_collection_cc.has_init())
{
- result.add(in_collection_b_cc.get_init());
+ result.add(secondary_collection_cc.get_init());
}
for
@@ -858,23 +863,23 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers(),
compiler.assembler(),
lambda_cc.get_computation(),
- default_a_cc.get_computation(),
+ secondary_default_cc.get_computation(),
+ secondary_collection_cc.get_address(),
+ main_default_cc.get_computation(),
holder.get_address(),
- default_b_cc.get_computation(),
- in_collection_b_cc.get_address(),
- collection_cc.get_address(),
+ main_collection_cc.get_address(),
(
(tonkadur.fate.v1.lang.type.CollectionType)
- n.get_collection().get_type()
+ n.get_main_collection().get_type()
).is_set(),
params
)
);
- collection_cc.release_registers(result);
- in_collection_b_cc.release_registers(result);
- default_a_cc.release_registers(result);
- default_b_cc.release_registers(result);
+ main_collection_cc.release_registers(result);
+ secondary_collection_cc.release_registers(result);
+ main_default_cc.release_registers(result);
+ secondary_default_cc.release_registers(result);
compiler.registers().release(holder, result);
for (final ComputationCompiler cc: param_cc_list)
@@ -892,7 +897,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
{
/* This is one dangerous operation to do in-place, so we don't. */
- if (n.get_default_a() != null)
+ if (n.get_main_default() != null)
{
visit_merge_with_defaults(n);
return;
@@ -902,7 +907,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
final ComputationCompiler lambda_cc;
final List<Computation> params;
final List<ComputationCompiler> param_cc_list;
- final ComputationCompiler collection_cc, in_collection_b_cc;
+ final ComputationCompiler main_collection_cc, secondary_collection_cc;
params = new ArrayList<Computation>();
param_cc_list = new ArrayList<ComputationCompiler>();
@@ -916,25 +921,29 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(lambda_cc.get_init());
}
- collection_cc = new ComputationCompiler(compiler);
+ main_collection_cc = new ComputationCompiler(compiler);
- n.get_collection().get_visited_by(collection_cc);
+ n.get_main_collection().get_visited_by(main_collection_cc);
- if (collection_cc.has_init())
+ if (main_collection_cc.has_init())
{
- result.add(collection_cc.get_init());
+ result.add(main_collection_cc.get_init());
}
holder =
compiler.registers().reserve
(
- collection_cc.get_computation().get_type(),
+ main_collection_cc.get_computation().get_type(),
result
);
result.add
(
- new SetValue(holder.get_address(), collection_cc.get_computation())
+ new SetValue
+ (
+ holder.get_address(),
+ main_collection_cc.get_computation()
+ )
);
result.add
@@ -943,18 +952,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
(
compiler.registers(),
compiler.assembler(),
- collection_cc.get_address()
+ main_collection_cc.get_address()
)
);
+ secondary_collection_cc = new ComputationCompiler(compiler);
- in_collection_b_cc = new ComputationCompiler(compiler);
-
- n.get_collection_in_b().get_visited_by(in_collection_b_cc);
+ n.get_secondary_collection().get_visited_by(secondary_collection_cc);
- if (in_collection_b_cc.has_init())
+ if (secondary_collection_cc.has_init())
{
- result.add(in_collection_b_cc.get_init());
+ result.add(secondary_collection_cc.get_init());
}
for
@@ -989,19 +997,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers(),
compiler.assembler(),
lambda_cc.get_computation(),
+ secondary_collection_cc.get_address(),
holder.get_address(),
- in_collection_b_cc.get_address(),
- collection_cc.get_address(),
+ main_collection_cc.get_address(),
(
(tonkadur.fate.v1.lang.type.CollectionType)
- n.get_collection().get_type()
+ n.get_main_collection().get_type()
).is_set(),
params
)
);
- collection_cc.release_registers(result);
- in_collection_b_cc.release_registers(result);
+ main_collection_cc.release_registers(result);
+ secondary_collection_cc.release_registers(result);
compiler.registers().release(holder, result);
for (final ComputationCompiler cc: param_cc_list)
@@ -1017,17 +1025,18 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
throws Throwable
{
final Register holder;
- final ComputationCompiler lambda_cc, default_a_cc, default_b_cc;
+ final ComputationCompiler lambda_cc;
+ final ComputationCompiler main_default_cc, secondary_default_cc;
final List<Computation> params;
final List<ComputationCompiler> param_cc_list;
- final ComputationCompiler collection_cc, in_collection_b_cc;
+ final ComputationCompiler main_collection_cc, secondary_collection_cc;
params = new ArrayList<Computation>();
param_cc_list = new ArrayList<ComputationCompiler>();
lambda_cc = new ComputationCompiler(compiler);
- default_a_cc = new ComputationCompiler(compiler);
- default_b_cc = new ComputationCompiler(compiler);
+ main_default_cc = new ComputationCompiler(compiler);
+ secondary_default_cc = new ComputationCompiler(compiler);
n.get_lambda_function().get_visited_by(lambda_cc);
@@ -1036,43 +1045,47 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(lambda_cc.get_init());
}
- collection_cc = new ComputationCompiler(compiler);
+ main_collection_cc = new ComputationCompiler(compiler);
- n.get_collection().get_visited_by(collection_cc);
+ n.get_main_collection().get_visited_by(main_collection_cc);
- if (collection_cc.has_init())
+ if (main_collection_cc.has_init())
{
- result.add(collection_cc.get_init());
+ result.add(main_collection_cc.get_init());
}
- n.get_default_a().get_visited_by(default_a_cc);
+ n.get_main_default().get_visited_by(main_default_cc);
- default_a_cc.generate_address();
+ main_default_cc.generate_address();
- if (default_a_cc.has_init())
+ if (main_default_cc.has_init())
{
- result.add(default_a_cc.get_init());
+ result.add(main_default_cc.get_init());
}
- n.get_default_b().get_visited_by(default_b_cc);
+ n.get_secondary_default().get_visited_by(secondary_default_cc);
- default_b_cc.generate_address();
+ secondary_default_cc.generate_address();
- if (default_b_cc.has_init())
+ if (secondary_default_cc.has_init())
{
- result.add(default_b_cc.get_init());
+ result.add(secondary_default_cc.get_init());
}
holder =
compiler.registers().reserve
(
- collection_cc.get_computation().get_type(),
+ main_collection_cc.get_computation().get_type(),
result
);
result.add
(
- new SetValue(holder.get_address(), collection_cc.get_computation())
+ new SetValue
+ (
+ holder.get_address(),
+ main_collection_cc.get_computation()
+ )
);
result.add
@@ -1081,17 +1094,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
(
compiler.registers(),
compiler.assembler(),
- collection_cc.get_address()
+ main_collection_cc.get_address()
)
);
- in_collection_b_cc = new ComputationCompiler(compiler);
+ secondary_collection_cc = new ComputationCompiler(compiler);
- n.get_collection_in_b().get_visited_by(in_collection_b_cc);
+ n.get_secondary_collection().get_visited_by(secondary_collection_cc);
- if (in_collection_b_cc.has_init())
+ if (secondary_collection_cc.has_init())
{
- result.add(in_collection_b_cc.get_init());
+ result.add(secondary_collection_cc.get_init());
}
for
@@ -1126,23 +1139,23 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers(),
compiler.assembler(),
lambda_cc.get_computation(),
- default_a_cc.get_computation(),
+ secondary_default_cc.get_computation(),
+ secondary_collection_cc.get_address(),
+ main_default_cc.get_computation(),
holder.get_address(),
- default_b_cc.get_computation(),
- in_collection_b_cc.get_address(),
- collection_cc.get_address(),
+ main_collection_cc.get_address(),
(
(tonkadur.fate.v1.lang.type.CollectionType)
- n.get_collection().get_type()
+ n.get_main_collection().get_type()
).is_set(),
params
)
);
- collection_cc.release_registers(result);
- in_collection_b_cc.release_registers(result);
- default_a_cc.release_registers(result);
- default_b_cc.release_registers(result);
+ main_collection_cc.release_registers(result);
+ secondary_collection_cc.release_registers(result);
+ main_default_cc.release_registers(result);
+ secondary_default_cc.release_registers(result);
compiler.registers().release(holder, result);
for (final ComputationCompiler cc: param_cc_list)
@@ -1158,7 +1171,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
)
throws Throwable
{
- if (n.get_default_a() != null)
+ if (n.get_main_default() != null)
{
visit_indexed_merge_with_defaults(n);
return;
@@ -1169,7 +1182,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
final ComputationCompiler lambda_cc;
final List<Computation> params;
final List<ComputationCompiler> param_cc_list;
- final ComputationCompiler collection_cc, in_collection_b_cc;
+ final ComputationCompiler main_collection_cc, secondary_collection_cc;
params = new ArrayList<Computation>();
param_cc_list = new ArrayList<ComputationCompiler>();
@@ -1183,25 +1196,29 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
result.add(lambda_cc.get_init());
}
- collection_cc = new ComputationCompiler(compiler);
+ main_collection_cc = new ComputationCompiler(compiler);
- n.get_collection().get_visited_by(collection_cc);
+ n.get_main_collection().get_visited_by(main_collection_cc);
- if (collection_cc.has_init())
+ if (main_collection_cc.has_init())
{
- result.add(collection_cc.get_init());
+ result.add(main_collection_cc.get_init());
}
holder =
compiler.registers().reserve
(
- collection_cc.get_computation().get_type(),
+ main_collection_cc.get_computation().get_type(),
result
);
result.add
(
- new SetValue(holder.get_address(), collection_cc.get_computation())
+ new SetValue
+ (
+ holder.get_address(),
+ main_collection_cc.get_computation()
+ )
);
result.add
@@ -1210,17 +1227,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
(
compiler.registers(),
compiler.assembler(),
- collection_cc.get_address()
+ main_collection_cc.get_address()
)
);
- in_collection_b_cc = new ComputationCompiler(compiler);
+ secondary_collection_cc = new ComputationCompiler(compiler);
- n.get_collection_in_b().get_visited_by(in_collection_b_cc);
+ n.get_secondary_collection().get_visited_by(secondary_collection_cc);
- if (in_collection_b_cc.has_init())
+ if (secondary_collection_cc.has_init())
{
- result.add(in_collection_b_cc.get_init());
+ result.add(secondary_collection_cc.get_init());
}
for
@@ -1255,19 +1272,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
compiler.registers(),
compiler.assembler(),
lambda_cc.get_computation(),
+ secondary_collection_cc.get_address(),
holder.get_address(),
- in_collection_b_cc.get_address(),
- collection_cc.get_address(),
+ main_collection_cc.get_address(),
(
(tonkadur.fate.v1.lang.type.CollectionType)
- n.get_collection().get_type()
+ n.get_main_collection().get_type()
).is_set(),
params
)
);
- collection_cc.release_registers(result);
- in_collection_b_cc.release_registers(result);
+ main_collection_cc.release_registers(result);
+ secondary_collection_cc.release_registers(result);
compiler.registers().release(holder, result);
for (final ComputationCompiler cc: param_cc_list)
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java
index e1e4e4f..818fde6 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMergeLambda.java
@@ -201,17 +201,22 @@ public class IndexedMergeLambda
final List<Computation> extra_params
)
{
- final List<Instruction> result, while_body;
- final Register iterator_a, iterator_b;
+ final List<Instruction> result, while_body, oob_a_body, oob_b_body;
+ final Register iterator_a, iterator_b, oob_a, oob_b;
final Register collection_a_size, collection_b_size;
final Register storage;
result = new ArrayList<Instruction>();
while_body = new ArrayList<Instruction>();
+ oob_a_body = new ArrayList<Instruction>();
+ oob_b_body = new ArrayList<Instruction>();
iterator_a = registers.reserve(Type.INT, result);
iterator_b = registers.reserve(Type.INT, result);
+ oob_a = registers.reserve(Type.BOOL, result);
+ oob_b = registers.reserve(Type.BOOL, result);
+
collection_a_size = registers.reserve(Type.INT, result);
collection_b_size = registers.reserve(Type.INT, result);
@@ -243,16 +248,39 @@ public class IndexedMergeLambda
)
);
- extra_params.add
+ result.add
(
- 0,
- new IfElseComputation
+ new SetValue
(
- Operation.less_than
+ oob_a.get_address(),
+ Operation.greater_equal_than
+ (
+ iterator_a.get_value(),
+ collection_a_size.get_value()
+ )
+ )
+ );
+
+ result.add
+ (
+ new SetValue
+ (
+ oob_b.get_address(),
+ Operation.greater_equal_than
(
iterator_b.get_value(),
collection_b_size.get_value()
- ),
+ )
+ )
+ );
+
+ extra_params.add
+ (
+ 0,
+ new IfElseComputation
+ (
+ oob_b.get_value(),
+ default_b,
new ValueOf
(
new RelativeAddress
@@ -263,8 +291,7 @@ public class IndexedMergeLambda
(MapType) collection_in_b.get_target_type()
).get_member_type()
)
- ),
- default_b
+ )
)
);
@@ -275,11 +302,8 @@ public class IndexedMergeLambda
0,
new IfElseComputation
(
- Operation.less_than
- (
- iterator_a.get_value(),
- collection_a_size.get_value()
- ),
+ oob_a.get_value(),
+ default_a,
new ValueOf
(
new RelativeAddress
@@ -290,8 +314,7 @@ public class IndexedMergeLambda
(MapType) collection_in_a.get_target_type()
).get_member_type()
)
- ),
- default_a
+ )
)
);
@@ -324,7 +347,7 @@ public class IndexedMergeLambda
)
);
- while_body.add
+ oob_a_body.add
(
new SetValue
(
@@ -333,7 +356,20 @@ public class IndexedMergeLambda
)
);
- while_body.add
+ oob_a_body.add
+ (
+ new SetValue
+ (
+ oob_a.get_address(),
+ Operation.greater_equal_than
+ (
+ iterator_a.get_value(),
+ collection_a_size.get_value()
+ )
+ )
+ );
+
+ oob_b_body.add
(
new SetValue
(
@@ -342,31 +378,56 @@ public class IndexedMergeLambda
)
);
+ oob_b_body.add
+ (
+ new SetValue
+ (
+ oob_b.get_address(),
+ Operation.greater_equal_than
+ (
+ iterator_b.get_value(),
+ collection_b_size.get_value()
+ )
+ )
+ );
+
+ while_body.add
+ (
+ If.generate
+ (
+ registers,
+ assembler,
+ Operation.not(oob_a.get_value()),
+ assembler.merge(oob_a_body)
+ )
+ );
+
+ while_body.add
+ (
+ If.generate
+ (
+ registers,
+ assembler,
+ Operation.not(oob_b.get_value()),
+ assembler.merge(oob_b_body)
+ )
+ );
+
result.add
(
While.generate
(
registers,
assembler,
- Operation.or
- (
- Operation.less_than
- (
- iterator_a.get_value(),
- collection_a_size.get_value()
- ),
- Operation.less_than
- (
- iterator_b.get_value(),
- collection_b_size.get_value()
- )
- ),
+ Operation.not(Operation.and(oob_a.get_value(), oob_b.get_value())),
assembler.merge(while_body)
)
);
registers.release(iterator_a, result);
registers.release(iterator_b, result);
+ registers.release(oob_a, result);
+ registers.release(oob_b, result);
registers.release(collection_a_size, result);
registers.release(collection_b_size, result);
registers.release(storage, result);