diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-06-19 18:25:31 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-06-19 18:25:31 -0700 |
commit | 6d0633ea539ac7616611c49716387ac31f5cc976 (patch) | |
tree | c91d2ec1100ca719b684d86321dbd3a86912da2d | |
parent | c56cdd63089f9487ba3380ffc41c6eb5fc3cb461 (diff) | |
download | mu-6d0633ea539ac7616611c49716387ac31f5cc976.tar.gz |
1602
I forgot to check for nulls before writing prev pointers in doubly linked lists. Tests were accidentally passing.
-rw-r--r-- | 065duplex_list.mu | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/065duplex_list.mu b/065duplex_list.mu index 287e460b..0bcda1b9 100644 --- a/065duplex_list.mu +++ b/065duplex_list.mu @@ -16,6 +16,7 @@ recipe push-duplex [ val:address:location/deref <- copy x:location next:address:address:duplex-list <- get-address result:address:duplex-list/deref, next:offset next:address:address:duplex-list/deref <- copy in:address:duplex-list + reply-unless in:address:duplex-list, result:address:duplex-list prev:address:address:duplex-list <- get-address in:address:duplex-list/deref, prev:offset prev:address:address:duplex-list/deref <- copy result:address:duplex-list reply result:address:duplex-list @@ -25,6 +26,7 @@ recipe push-duplex [ recipe first-duplex [ default-space:address:array:location <- new location:type, 30:literal in:address:duplex-list <- next-ingredient + reply-unless in:address:duplex-list, 0:literal result:location <- get in:address:duplex-list/deref, value:offset reply result:location ] @@ -33,6 +35,7 @@ recipe first-duplex [ recipe next-duplex [ default-space:address:array:location <- new location:type, 30:literal in:address:duplex-list <- next-ingredient + reply-unless in:address:duplex-list, 0:literal result:address:duplex-list <- get in:address:duplex-list/deref, next:offset reply result:address:duplex-list ] @@ -41,35 +44,42 @@ recipe next-duplex [ recipe prev-duplex [ default-space:address:array:location <- new location:type, 30:literal in:address:duplex-list <- next-ingredient + reply-unless in:address:duplex-list, 0:literal result:address:duplex-list <- get in:address:duplex-list/deref, prev:offset reply result:address:duplex-list ] scenario duplex-list-handling [ run [ - 1:address:duplex-list <- copy 0:literal - 1:address:duplex-list <- push-duplex 3:literal, 1:address:duplex-list - 1:address:duplex-list <- push-duplex 4:literal, 1:address:duplex-list - 1:address:duplex-list <- push-duplex 5:literal, 1:address:duplex-list - 2:address:duplex-list <- copy 1:address:duplex-list - 3:number <- first 2:address:duplex-list - 2:address:duplex-list <- next-duplex 2:address:duplex-list - 4:number <- first 2:address:duplex-list - 2:address:duplex-list <- next-duplex 2:address:duplex-list - 5:number <- first 2:address:duplex-list - 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 6:number <- first 2:address:duplex-list - 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 7:number <- first 2:address:duplex-list - 8:boolean <- equal 1:address:duplex-list, 2:address:duplex-list + # reserve locations 0, 1 and 2 to check for missing null check + 1:number <- copy 34:literal + 2:number <- copy 35:literal + 3:address:duplex-list <- copy 0:literal + 3:address:duplex-list <- push-duplex 3:literal, 3:address:duplex-list + 3:address:duplex-list <- push-duplex 4:literal, 3:address:duplex-list + 3:address:duplex-list <- push-duplex 5:literal, 3:address:duplex-list + 4:address:duplex-list <- copy 3:address:duplex-list + 5:number <- first 4:address:duplex-list + 4:address:duplex-list <- next-duplex 4:address:duplex-list + 6:number <- first 4:address:duplex-list + 4:address:duplex-list <- next-duplex 4:address:duplex-list + 7:number <- first 4:address:duplex-list + 4:address:duplex-list <- prev-duplex 4:address:duplex-list + 8:number <- first 4:address:duplex-list + 4:address:duplex-list <- prev-duplex 4:address:duplex-list + 9:number <- first 4:address:duplex-list + 10:boolean <- equal 3:address:duplex-list, 4:address:duplex-list +#? $dump-trace #? 1 ] memory-should-contain [ - 3 <- 5 # scanning next - 4 <- 4 - 5 <- 3 - 6 <- 4 # then prev - 7 <- 5 - 8 <- 1 # list back at start + 1 <- 34 + 2 <- 35 + 5 <- 5 # scanning next + 6 <- 4 + 7 <- 3 + 8 <- 4 # then prev + 9 <- 5 + 10 <- 1 # list back at start ] ] |