diff options
-rw-r--r-- | 032array.cc | 83 | ||||
-rw-r--r-- | 054parse_tree.cc | 8 | ||||
-rw-r--r-- | 070text.mu | 40 | ||||
-rw-r--r-- | 072channel.mu | 3 | ||||
-rw-r--r-- | 073array.mu | 3 | ||||
-rw-r--r-- | 079table.mu | 7 | ||||
-rw-r--r-- | 081print.mu | 12 | ||||
-rwxr-xr-x | build_and_test_until | 2 | ||||
-rw-r--r-- | chessboard.mu | 19 |
9 files changed, 78 insertions, 99 deletions
diff --git a/032array.cc b/032array.cc index 35d86fa6..e54b7ea6 100644 --- a/032array.cc +++ b/032array.cc @@ -315,48 +315,50 @@ def main [ ] # just don't die -//:: To write to elements of containers, you need their address. +//:: To write to elements of arrays, use 'put'. -:(scenario index_address) +:(scenario put_index) def main [ 1:array:number:3 <- create-array 2:number <- copy 14 3:number <- copy 15 4:number <- copy 16 - 5:address:number <- index-address 1:array:number, 0 + 1:array:number <- put-index 1:array:number, 1, 34 ] -+mem: storing 2 in location 5 ++mem: storing 34 in location 3 :(before "End Primitive Recipe Declarations") -INDEX_ADDRESS, +PUT_INDEX, :(before "End Primitive Recipe Numbers") -put(Recipe_ordinal, "index-address", INDEX_ADDRESS); +put(Recipe_ordinal, "put-index", PUT_INDEX); :(before "End Primitive Recipe Checks") -case INDEX_ADDRESS: { - if (SIZE(inst.ingredients) != 2) { - raise << maybe(get(Recipe, r).name) << "'index-address' expects exactly 2 ingredients in '" << to_original_string(inst) << "'\n" << end(); +case PUT_INDEX: { + if (SIZE(inst.ingredients) != 3) { + raise << maybe(get(Recipe, r).name) << "'put-index' expects exactly 3 ingredients in '" << to_original_string(inst) << "'\n" << end(); break; } reagent base = inst.ingredients.at(0); - canonize_type(base); + if (!canonize_type(base)) break; if (!is_mu_array(base)) { - raise << maybe(get(Recipe, r).name) << "'index-address' on a non-array " << base.original_string << '\n' << end(); + raise << maybe(get(Recipe, r).name) << "'put-index' on a non-array " << base.original_string << '\n' << end(); break; } - if (inst.products.empty()) break; - reagent product = inst.products.at(0); - canonize_type(product); + if (!is_mu_number(inst.ingredients.at(1))) { + raise << maybe(get(Recipe, r).name) << "second ingredient of 'put-index' should have type 'number', but got " << inst.ingredients.at(1).original_string << '\n' << end(); + break; + } + reagent value = inst.ingredients.at(2); + canonize_type(value); reagent element; - element.type = new type_tree("address", get(Type_ordinal, "address"), - new type_tree(*array_element(base.type))); - if (!types_coercible(product, element)) { - raise << maybe(get(Recipe, r).name) << "'index' on " << base.original_string << " can't be saved in " << product.original_string << "; type should be " << names_to_string_without_quotes(element.type) << '\n' << end(); + element.type = new type_tree(*array_element(base.type)); + if (!types_coercible(element, value)) { + raise << maybe(get(Recipe, r).name) << "'put-index " << base.original_string << ", " << inst.ingredients.at(1).original_string << "' should store " << names_to_string_without_quotes(element.type) << " but " << value.name << " has type " << names_to_string_without_quotes(value.type) << '\n' << end(); break; } break; } :(before "End Primitive Recipe Implementations") -case INDEX_ADDRESS: { +case PUT_INDEX: { reagent base = current_instruction().ingredients.at(0); canonize(base); int base_address = base.value; @@ -372,13 +374,19 @@ case INDEX_ADDRESS: { raise << maybe(current_recipe_name()) << "invalid index " << no_scientific(offset_val.at(0)) << '\n' << end(); break; } - int result = base_address + 1 + offset_val.at(0)*size_of(element_type); - products.resize(1); - products.at(0).push_back(result); - break; + int address = base_address + 1 + offset_val.at(0)*size_of(element_type); + trace(9998, "run") << "address to copy to is " << address << end(); + // optimization: directly write the element rather than updating 'product' + // and writing the entire array + vector<double> value = read_memory(current_instruction().ingredients.at(2)); + for (int i = 0; i < SIZE(value); ++i) { + trace(9999, "mem") << "storing " << no_scientific(value.at(i)) << " in location " << address+i << end(); + put(Memory, address+i, value.at(i)); + } + goto finish_instruction; } -:(scenario index_address_out_of_bounds) +:(scenario put_index_out_of_bounds) % Hide_errors = true; def main [ 1:array:point:3 <- create-array @@ -388,12 +396,12 @@ def main [ 5:number <- copy 14 6:number <- copy 15 7:number <- copy 16 - 8:address:array:point <- copy 1/unsafe - index-address *8:address:array:point, 4 # less than size of array in locations, but larger than its length in elements + 8:point <- merge 34, 35 + 1:array:point <- put-index 1:array:point, 4, 8:point # '4' is less than size of array in locations, but larger than its length in elements ] +error: main: invalid index 4 -:(scenario index_address_out_of_bounds_2) +:(scenario put_index_out_of_bounds_2) % Hide_errors = true; def main [ 1:array:point:3 <- create-array @@ -403,26 +411,11 @@ def main [ 5:number <- copy 14 6:number <- copy 15 7:number <- copy 16 - 8:address:array:point <- copy 1/unsafe - index-address *8:address:array:point, -1 + 8:point <- merge 34, 35 + 1:array:point <- put-index 1:array:point, -1, 8:point ] +error: main: invalid index -1 -:(scenario index_address_product_type_mismatch) -% Hide_errors = true; -def main [ - 1:array:point:3 <- create-array - 2:number <- copy 14 - 3:number <- copy 15 - 4:number <- copy 16 - 5:number <- copy 14 - 6:number <- copy 15 - 7:number <- copy 16 - 8:address:array:point <- copy 1/unsafe - 9:address:number <- index-address *8:address:array:point, 0 -] -+error: main: 'index' on *8:address:array:point can't be saved in 9:address:number; type should be (address point) - //:: compute the length of an array :(scenario array_length) @@ -470,7 +463,7 @@ case LENGTH: { //: stop copying potentially huge arrays into it. :(before "End should_copy_ingredients Special-cases") recipe_ordinal r = current_instruction().operation; -if (r == CREATE_ARRAY || r == INDEX || r == INDEX_ADDRESS || r == LENGTH) +if (r == CREATE_ARRAY || r == INDEX || r == PUT_INDEX || r == LENGTH) return false; //: a particularly common array type is the string, or address:array:character diff --git a/054parse_tree.cc b/054parse_tree.cc index 8724b6f4..0ad8773f 100644 --- a/054parse_tree.cc +++ b/054parse_tree.cc @@ -72,10 +72,10 @@ container bar [ :(scenario dilated_reagent_in_static_array) def main [ {1: (array (address shared number) 3)} <- create-array - 5:address:address:shared:number <- index-address {1: (array (address shared number) 3)}, 0 - *5:address:address:shared:number <- new number:type - **5:address:address:shared:number <- copy 34 - 6:number <- copy **5:address:address:shared:number + 5:address:shared:number <- new number:type + {1: (array (address shared number) 3)} <- put-index {1: (array (address shared number) 3)}, 0, 5:address:shared:number + *5:address:shared:number <- copy 34 + 6:number <- copy *5:address:shared:number ] +run: creating array of size 4 +mem: storing 34 in location 6 diff --git a/070text.mu b/070text.mu index 1e1999c7..93fe3f41 100644 --- a/070text.mu +++ b/070text.mu @@ -149,8 +149,7 @@ def grow-buffer in:address:shared:buffer -> in:address:shared:buffer [ done?:boolean <- greater-or-equal i, oldlen break-if done? src:character <- index *olddata, i - dest:address:character <- index-address *newdata, i - *dest <- copy src + *newdata <- put-index *newdata, i, src i <- add i, 1 loop } @@ -203,8 +202,7 @@ def append in:address:shared:buffer, c:character -> in:address:shared:buffer [ in <- grow-buffer in } s:address:shared:array:character <- get *in, data:offset - dest:address:character <- index-address *s, len - *dest <- copy c + *s <- put-index *s, len, c len <- add len, 1 *in <- put *in, length:offset, len ] @@ -317,8 +315,7 @@ def to-text n:number -> result:address:shared:array:character [ break-if done? # result[j] = tmp[i] src:character <- index *buf, i - dest:address:character <- index-address *result, j - *dest <- copy src + *result <- put-index *result, j, src i <- subtract i, 1 j <- add j, 1 loop @@ -356,8 +353,7 @@ def buffer-to-array in:address:shared:buffer -> result:address:shared:array:char done?:boolean <- greater-or-equal i, len break-if done? src:character <- index *s, i - dest:address:character <- index-address *result, i - *dest <- copy src + *result <- put-index *result, i, src i <- add i, 1 loop } @@ -411,9 +407,8 @@ def append a:address:shared:array:character, b:address:shared:array:character -> a-done?:boolean <- greater-or-equal i, a-len break-if a-done? # result[result-idx] = a[i] - out:address:character <- index-address *result, result-idx in:character <- index *a, i - *out <- copy in + *result <- put-index *result, result-idx, in i <- add i, 1 result-idx <- add result-idx, 1 loop @@ -425,9 +420,8 @@ def append a:address:shared:array:character, b:address:shared:array:character -> b-done?:boolean <- greater-or-equal i, b-len break-if b-done? # result[result-idx] = a[i] - out:address:character <- index-address *result, result-idx in:character <- index *b, i - *out <- copy in + *result <- put-index *result, result-idx, in i <- add i, 1 result-idx <- add result-idx, 1 loop @@ -464,8 +458,7 @@ def replace s:address:shared:array:character, oldc:character, newc:character, fr i:number <- find-next s, oldc, from done?:boolean <- greater-or-equal i, len return-if done?, s/same-as-ingredient:0 - dest:address:character <- index-address *s, i - *dest <- copy newc + *s <- put-index *s, i, newc i <- add i, 1 s <- replace s, oldc, newc, i ] @@ -551,8 +544,7 @@ def interpolate template:address:shared:array:character -> result:address:shared underscore?:boolean <- equal in, 95/_ break-if underscore? # result[result-idx] = template[i] - out:address:character <- index-address *result, result-idx - *out <- copy in + *result <- put-index *result, result-idx, in i <- add i, 1 result-idx <- add result-idx, 1 loop @@ -565,8 +557,7 @@ def interpolate template:address:shared:array:character -> result:address:shared break-if arg-done? # result[result-idx] = a[j] in:character <- index *a, j - out:address:character <- index-address *result, result-idx - *out <- copy in + *result <- put-index *result, result-idx, in j <- add j, 1 result-idx <- add result-idx, 1 loop @@ -583,8 +574,7 @@ def interpolate template:address:shared:array:character -> result:address:shared break-if tem-done? # result[result-idx] = template[i] in:character <- index *template, i - out:address:character <- index-address *result, result-idx:number - *out <- copy in + *result <- put-index *result, result-idx, in i <- add i, 1 result-idx <- add result-idx, 1 loop @@ -732,8 +722,7 @@ def trim s:address:shared:array:character -> result:address:shared:array:charact break-if done? # result[j] = s[i] src:character <- index *s, i - dest:address:character <- index-address *result, j - *dest <- copy src + *result <- put-index *result, j, src i <- add i, 1 j <- add j, 1 loop @@ -1131,8 +1120,8 @@ def split s:address:shared:array:character, delim:character -> result:address:sh break-if done? end:number <- find-next s, delim, start # copy start..end into result[curr-result] - dest:address:address:shared:array:character <- index-address *result, curr-result - *dest <- copy-range s, start, end + dest:address:shared:array:character <- copy-range s, start, end + *result <- put-index *result, curr-result, dest # slide over to next slice start <- add end, 1 curr-result <- add curr-result, 1 @@ -1272,8 +1261,7 @@ def copy-range buf:address:shared:array:character, start:number, end:number -> r done?:boolean <- greater-or-equal src-idx, end break-if done? src:character <- index *buf, src-idx - dest:address:character <- index-address *result, dest-idx - *dest <- copy src + *result <- put-index *result, dest-idx, src src-idx <- add src-idx, 1 dest-idx <- add dest-idx, 1 loop diff --git a/072channel.mu b/072channel.mu index 81bc1479..0847f2ce 100644 --- a/072channel.mu +++ b/072channel.mu @@ -71,8 +71,7 @@ def write out:address:shared:sink:_elem, val:_elem -> out:address:shared:sink:_e # store val circular-buffer:address:shared:array:_elem <- get *chan, data:offset free:number <- get *chan, first-free:offset - dest:address:_elem <- index-address *circular-buffer, free - *dest <- copy val + *circular-buffer <- put-index *circular-buffer, free, val # mark its slot as filled # todo: clear the slot itself free <- add free, 1 diff --git a/073array.mu b/073array.mu index fcd1fcb7..7fa580c5 100644 --- a/073array.mu +++ b/073array.mu @@ -31,8 +31,7 @@ def new-array -> result:address:shared:array:character [ break-if done? curr-value:character, exists?:boolean <- next-ingredient assert exists?, [error in rewinding ingredients to new-array] - tmp:address:character <- index-address *result, i - *tmp <- copy curr-value + *result <- put-index *result, i, curr-value i <- add i, 1 loop } diff --git a/079table.mu b/079table.mu index 2ef03fa6..9040f6ce 100644 --- a/079table.mu +++ b/079table.mu @@ -53,11 +53,12 @@ def put table:address:shared:table:_key:_value, key:_key, value:_value -> table: _, hash <- divide-with-remainder hash, capacity hash <- abs hash # in case hash overflows into a negative integer table-data:address:shared:array:table_row:_key:_value <- get *table, data:offset - x:address:table_row:_key:_value <- index-address *table-data, hash - occupied?:boolean <- get *x, occupied?:offset + x:table_row:_key:_value <- index *table-data, hash + occupied?:boolean <- get x, occupied?:offset not-occupied?:boolean <- not occupied?:boolean assert not-occupied?, [can't handle collisions yet] - *x <- merge 1/true, key, value + new-row:table_row:_key:_value <- merge 1/true, key, value + *table-data <- put-index *table-data, hash, new-row ] def abs n:number -> result:number [ diff --git a/081print.mu b/081print.mu index bfa8ac93..21b0cfe4 100644 --- a/081print.mu +++ b/081print.mu @@ -37,8 +37,8 @@ def clear-screen screen:address:shared:screen -> screen:address:shared:screen [ { done?:boolean <- greater-or-equal i, max break-if done? - curr:address:screen-cell <- index-address *buf, i - *curr <- merge 0/empty, 7/white + curr:screen-cell <- merge 0/empty, 7/white + *buf <- put-index *buf, i, curr i <- add i, 1 loop } @@ -149,13 +149,13 @@ def print screen:address:shared:screen, c:character -> screen:address:shared:scr column <- subtract column, 1 *screen <- put *screen, cursor-column:offset, column index <- subtract index, 1 - cursor:address:screen-cell <- index-address *buf, index - *cursor <- merge 32/space, 7/white + cursor:screen-cell <- merge 32/space, 7/white + *buf <- put-index *buf, index, cursor } return } - cursor:address:screen-cell <- index-address *buf, index - *cursor <- merge c, color + cursor:screen-cell <- merge c, color + *buf <- put-index *buf, index, cursor # increment column unless it's already all the way to the right { right:number <- subtract width, 1 diff --git a/build_and_test_until b/build_and_test_until index 96eb9e43..fc0d7689 100755 --- a/build_and_test_until +++ b/build_and_test_until @@ -17,7 +17,7 @@ then # All sorts of strange bugs ensue. sleep 1 set -v # Darwin's clang and valgrind is shit. - CFLAGS=${CFLAGS:-"-g -O3"} make test + CFLAGS=${CFLAGS:-"-g -O3"} make #test else set -v CXX=${CXX:-clang++} CFLAGS=${CFLAGS:-"-O3 -fsanitize=undefined -Wno-tautological-constant-out-of-range-compare"} make ${2:-valgrind} diff --git a/chessboard.mu b/chessboard.mu index fe709f40..91e2e3fd 100644 --- a/chessboard.mu +++ b/chessboard.mu @@ -116,8 +116,8 @@ def new-board initial-position:address:shared:array:character -> board:address:s { done?:boolean <- equal col, 8 break-if done? - file:address:address:shared:array:character <- index-address *board, col - *file <- new-file initial-position, col + file:address:shared:array:character <- new-file initial-position, col + *board <- put-index *board, col, file col <- add col, 1 loop } @@ -132,8 +132,8 @@ def new-file position:address:shared:array:character, index:number -> result:add { done?:boolean <- equal row, 8 break-if done? - dest:address:character <- index-address *result, row - *dest <- index *position, index + square:character <- index *position, index + *result <- put-index *result, row, square row <- add row, 1 index <- add index, 1 loop @@ -531,12 +531,11 @@ def make-move board:address:shared:array:address:shared:array:character, m:addre from-rank:number <- get *m, from-rank:offset to-file:number <- get *m, to-file:offset to-rank:number <- get *m, to-rank:offset - f:address:shared:array:character <- index *board, from-file - src:address:character/square <- index-address *f, from-rank - f <- index *board, to-file - dest:address:character/square <- index-address *f, to-rank - *dest <- copy *src - *src <- copy 32/space + from-f:address:shared:array:character <- index *board, from-file + to-f:address:shared:array:character <- index *board, to-file + src:character/square <- index *from-f, from-rank + *to-f <- put-index *to-f, to-rank, src + *from-f <- put-index *from-f, from-rank, 32/space ] scenario making-a-move [ |