diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2014-11-07 12:33:12 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2014-11-07 12:33:12 -0800 |
commit | c8965db98b38660a911eccb2fd92a51a1ffc95d3 (patch) | |
tree | 3b217a11be1dfb30754b4012d776d0eb145177c5 /mu.arc.t | |
parent | dd2c77440794c4deb595997a32bc06f4f35bef9a (diff) | |
download | mu-c8965db98b38660a911eccb2fd92a51a1ffc95d3.tar.gz |
256 - channel pointers can now wrap
Diffstat (limited to 'mu.arc.t')
-rw-r--r-- | mu.arc.t | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/mu.arc.t b/mu.arc.t index 0931ffdd..756b8bab 100644 --- a/mu.arc.t +++ b/mu.arc.t @@ -1851,11 +1851,13 @@ ((5 integer) <- get (1 channel-address deref) (first-free offset))))) ;? (set dump-trace*) ;? (= dump-trace* (obj blacklist '("sz" "m" "setm" "addr" "array-len" "cvt0" "cvt1"))) +;? (= dump-trace* (obj whitelist '("jump"))) (run 'main) -;? (prn memory*) +;? (prn canon.memory*) (if (or (~is 0 memory*.4) (~is 1 memory*.5)) (prn "F - 'write' enqueues item to channel")) +;? (quit) (reset) (new-trace "channel-read") @@ -1913,4 +1915,58 @@ (~is t memory*.5)) (prn "F - 'read' sets channel watch")) +(reset) +(new-trace "channel-write-wrap") +(add-fns + '((main + ; channel with 2 slots (capacity 1 since we waste a slot) + ((1 channel-address) <- new-channel (2 literal)) + ; write a value + ((2 integer-address) <- new (integer literal)) + ((2 integer-address deref) <- copy (34 literal)) + ((3 tagged-value-address) <- new-tagged-value (integer-address literal) (2 integer-address)) + ((1 channel-address deref) <- write (1 channel-address deref) (3 tagged-value-address deref)) + ; first-free will now be 1 + ((4 integer) <- get (1 channel-address deref) (first-free offset)) + ; read one value + (_ (1 channel-address deref) <- read (1 channel-address deref)) + ; write a second value; verify that first-free wraps around to 0. + ((1 channel-address deref) <- write (1 channel-address deref) (3 tagged-value-address deref)) + ((5 integer) <- get (1 channel-address deref) (first-free offset))))) +;? (set dump-trace*) +;? (= dump-trace* (obj blacklist '("sz" "m" "setm" "addr" "array-len" "cvt0" "cvt1"))) +(run 'main) +;? (prn canon.memory*) +(if (or (~is 1 memory*.4) + (~is 0 memory*.5)) + (prn "F - 'write' can wrap pointer back to start")) + +(reset) +(new-trace "channel-read-wrap") +(add-fns + '((main + ; channel with 2 slots (capacity 1 since we waste a slot) + ((1 channel-address) <- new-channel (2 literal)) + ; write a value + ((2 integer-address) <- new (integer literal)) + ((2 integer-address deref) <- copy (34 literal)) + ((3 tagged-value-address) <- new-tagged-value (integer-address literal) (2 integer-address)) + ((1 channel-address deref) <- write (1 channel-address deref) (3 tagged-value-address deref)) + ; read one value + (_ (1 channel-address deref) <- read (1 channel-address deref)) + ; first-full will now be 1 + ((4 integer) <- get (1 channel-address deref) (first-full offset)) + ; write a second value + ((1 channel-address deref) <- write (1 channel-address deref) (3 tagged-value-address deref)) + ; read second value; verify that first-full wraps around to 0. + (_ (1 channel-address deref) <- read (1 channel-address deref)) + ((5 integer) <- get (1 channel-address deref) (first-full offset))))) +;? (set dump-trace*) +;? (= dump-trace* (obj blacklist '("sz" "m" "setm" "addr" "array-len" "cvt0" "cvt1"))) +(run 'main) +;? (prn canon.memory*) +(if (or (~is 1 memory*.4) + (~is 0 memory*.5)) + (prn "F - 'read' can wrap pointer back to start")) + (reset) ; end file with this to persist the trace for the final test |