diff options
-rw-r--r-- | 030container.cc | 20 | ||||
-rw-r--r-- | 032array.cc | 22 | ||||
-rw-r--r-- | 033exclusive_container.cc | 4 | ||||
-rw-r--r-- | 042name.cc | 3 | ||||
-rw-r--r-- | 065duplex_list.mu | 72 | ||||
-rw-r--r-- | edit.mu | 9 |
6 files changed, 69 insertions, 61 deletions
diff --git a/030container.cc b/030container.cc index 41bba748..55de2a2d 100644 --- a/030container.cc +++ b/030container.cc @@ -107,27 +107,24 @@ GET, Recipe_ordinal["get"] = GET; :(before "End Primitive Recipe Implementations") case GET: { + products.resize(1); if (SIZE(ingredients) != 2) { raise << current_recipe_name() << ": 'get' expects exactly 2 ingredients in '" << current_instruction().to_string() << "'\n" << end(); - products.resize(1); break; } reagent base = current_instruction().ingredients.at(0); long long int base_address = base.value; + if (base_address == 0) { + raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); + break; + } type_ordinal base_type = base.types.at(0); if (Type[base_type].kind != container) { raise << current_recipe_name () << ": first ingredient of 'get' should be a container, but got " << base.original_string << '\n' << end(); - products.resize(1); break; } if (!is_literal(current_instruction().ingredients.at(1))) { raise << current_recipe_name() << ": second ingredient of 'get' should have type 'offset', but got " << current_instruction().ingredients.at(1).original_string << '\n' << end(); - products.resize(1); - break; - } - if (base_address == 0) { - raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); - products.resize(1); break; } assert(scalar(ingredients.at(1))); @@ -139,7 +136,6 @@ case GET: { trace(Primitive_recipe_depth, "run") << "address to copy is " << src << end(); if (offset < 0 || offset >= SIZE(Type[base_type].elements)) { raise << current_recipe_name() << ": invalid offset " << offset << " for " << Type[base_type].name << '\n' << end(); - products.resize(1); break; } type_ordinal src_type = Type[base_type].elements.at(offset).at(0); @@ -147,7 +143,7 @@ case GET: { reagent tmp; tmp.set_value(src); tmp.types.push_back(src_type); - products.push_back(read_memory(tmp)); + products.at(0) = read_memory(tmp); break; } @@ -199,6 +195,10 @@ case GET_ADDRESS: { products.resize(1); reagent base = current_instruction().ingredients.at(0); long long int base_address = base.value; + if (base_address == 0) { + raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); + break; + } type_ordinal base_type = base.types.at(0); if (Type[base_type].kind != container) { raise << current_recipe_name () << ": first ingredient of 'get-address' should be a container, but got " << base.original_string << '\n' << end(); diff --git a/032array.cc b/032array.cc index 5911f1c3..eae33f4c 100644 --- a/032array.cc +++ b/032array.cc @@ -79,16 +79,19 @@ INDEX, Recipe_ordinal["index"] = INDEX; :(before "End Primitive Recipe Implementations") case INDEX: { + products.resize(1); if (SIZE(ingredients) != 2) { raise << current_recipe_name() << ": 'index' expects exactly 2 ingredients in '" << current_instruction().to_string() << "'\n" << end(); - products.resize(1); break; } reagent base = canonize(current_instruction().ingredients.at(0)); - long long int base_address = base.value; if (base.types.at(0) != Type_ordinal["array"]) { raise << current_recipe_name () << ": 'index' on a non-array " << base.original_string << '\n' << end(); - products.resize(1); + break; + } + long long int base_address = base.value; + if (base_address == 0) { + raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); break; } reagent offset = canonize(current_instruction().ingredients.at(1)); @@ -96,7 +99,6 @@ case INDEX: { vector<type_ordinal> element_type = array_element(base.types); if (offset_val.at(0) < 0 || offset_val.at(0) >= Memory[base_address]) { raise << current_recipe_name() << ": invalid index " << offset_val.at(0) << '\n' << end(); - products.resize(1); break; } long long int src = base_address + 1 + offset_val.at(0)*size_of(element_type); @@ -105,7 +107,7 @@ case INDEX: { reagent tmp; tmp.set_value(src); copy(element_type.begin(), element_type.end(), inserter(tmp.types, tmp.types.begin())); - products.push_back(read_memory(tmp)); + products.at(0) = read_memory(tmp); break; } @@ -179,11 +181,15 @@ case INDEX_ADDRESS: { break; } reagent base = canonize(current_instruction().ingredients.at(0)); - long long int base_address = base.value; if (base.types.at(0) != Type_ordinal["array"]) { raise << current_recipe_name () << ": 'index-address' on a non-array " << base.original_string << '\n' << end(); break; } + long long int base_address = base.value; + if (base_address == 0) { + raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); + break; + } reagent offset = canonize(current_instruction().ingredients.at(1)); vector<double> offset_val(read_memory(offset)); vector<type_ordinal> element_type = array_element(base.types); @@ -254,6 +260,10 @@ case LENGTH: { raise << "tried to calculate length of non-array " << x.original_string << '\n' << end(); break; } + if (x.value == 0) { + raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); + break; + } products.at(0).push_back(Memory[x.value]); break; } diff --git a/033exclusive_container.cc b/033exclusive_container.cc index 65995b14..eb3ff6f2 100644 --- a/033exclusive_container.cc +++ b/033exclusive_container.cc @@ -90,6 +90,10 @@ case MAYBE_CONVERT: { } reagent base = canonize(current_instruction().ingredients.at(0)); long long int base_address = base.value; + if (base_address == 0) { + raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); + break; + } type_ordinal base_type = base.types.at(0); if (Type[base_type].kind != exclusive_container) { raise << current_recipe_name () << ": first ingredient of 'maybe-convert' should be an exclusive-container, but got " << base.original_string << '\n' << end(); diff --git a/042name.cc b/042name.cc index 6ba48b8c..304d050d 100644 --- a/042name.cc +++ b/042name.cc @@ -9,6 +9,7 @@ recipe main [ +name: assign x 1 +mem: storing 0 in location 1 +:(scenarios transform) :(scenario transform_names_warns) % Hide_warnings = true; recipe main [ @@ -140,6 +141,7 @@ recipe main [ -name: assign _ 1 //: an escape hatch to suppress name conversion that we'll use later +:(scenarios run) :(scenario transform_names_passes_raw) % Hide_warnings = true; recipe main [ @@ -148,6 +150,7 @@ recipe main [ -name: assign x 1 +warn: can't write to location 0 +:(scenarios transform) :(scenario transform_names_warns_when_mixing_names_and_numeric_locations) % Hide_warnings = true; recipe main [ diff --git a/065duplex_list.mu b/065duplex_list.mu index 63ee9974..abc1949b 100644 --- a/065duplex_list.mu +++ b/065duplex_list.mu @@ -59,19 +59,19 @@ scenario duplex-list-handling [ 3:address:duplex-list <- push-duplex 4, 3:address:duplex-list 3:address:duplex-list <- push-duplex 5, 3:address:duplex-list 4:address:duplex-list <- copy 3:address:duplex-list - 5:number <- first 4:address:duplex-list + 5:number <- first-duplex 4:address:duplex-list 4:address:duplex-list <- next-duplex 4:address:duplex-list - 6:number <- first 4:address:duplex-list + 6:number <- first-duplex 4:address:duplex-list 4:address:duplex-list <- next-duplex 4:address:duplex-list - 7:number <- first 4:address:duplex-list + 7:number <- first-duplex 4:address:duplex-list 8:address:duplex-list <- next-duplex 4:address:duplex-list - 9:number <- first 8:address:duplex-list + 9:number <- first-duplex 8:address:duplex-list 10:address:duplex-list <- next-duplex 8:address:duplex-list 11:address:duplex-list <- prev-duplex 8:address:duplex-list 4:address:duplex-list <- prev-duplex 4:address:duplex-list - 12:number <- first 4:address:duplex-list + 12:number <- first-duplex 4:address:duplex-list 4:address:duplex-list <- prev-duplex 4:address:duplex-list - 13:number <- first 4:address:duplex-list + 13:number <- first-duplex 4:address:duplex-list 14:boolean <- equal 3:address:duplex-list, 4:address:duplex-list #? $dump-trace #? 1 ] @@ -129,19 +129,19 @@ scenario inserting-into-duplex-list [ 2:address:duplex-list <- insert-duplex 6, 2:address:duplex-list # check structure like before 2:address:duplex-list <- copy 1:address:duplex-list - 3:number <- first 2:address:duplex-list + 3:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 4:number <- first 2:address:duplex-list + 4:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 5:number <- first 2:address:duplex-list + 5:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 6:number <- first 2:address:duplex-list + 6:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 7:number <- first 2:address:duplex-list + 7:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 8:number <- first 2:address:duplex-list + 8:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 9:number <- first 2:address:duplex-list + 9:number <- first-duplex 2:address:duplex-list 10:boolean <- equal 1:address:duplex-list, 2:address:duplex-list ] memory-should-contain [ @@ -167,19 +167,19 @@ scenario inserting-at-end-of-duplex-list [ 2:address:duplex-list <- insert-duplex 6, 2:address:duplex-list # check structure like before 2:address:duplex-list <- copy 1:address:duplex-list - 3:number <- first 2:address:duplex-list + 3:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 4:number <- first 2:address:duplex-list + 4:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 5:number <- first 2:address:duplex-list + 5:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 6:number <- first 2:address:duplex-list + 6:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 7:number <- first 2:address:duplex-list + 7:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 8:number <- first 2:address:duplex-list + 8:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 9:number <- first 2:address:duplex-list + 9:number <- first-duplex 2:address:duplex-list 10:boolean <- equal 1:address:duplex-list, 2:address:duplex-list ] memory-should-contain [ @@ -203,19 +203,19 @@ scenario inserting-after-start-of-duplex-list [ 2:address:duplex-list <- insert-duplex 6, 1:address:duplex-list # check structure like before 2:address:duplex-list <- copy 1:address:duplex-list - 3:number <- first 2:address:duplex-list + 3:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 4:number <- first 2:address:duplex-list + 4:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 5:number <- first 2:address:duplex-list + 5:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 6:number <- first 2:address:duplex-list + 6:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 7:number <- first 2:address:duplex-list + 7:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 8:number <- first 2:address:duplex-list + 8:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 9:number <- first 2:address:duplex-list + 9:number <- first-duplex 2:address:duplex-list 10:boolean <- equal 1:address:duplex-list, 2:address:duplex-list ] memory-should-contain [ @@ -277,12 +277,12 @@ scenario removing-from-duplex-list [ 3:boolean <- equal 2:address:duplex-list, 0 # check structure like before 2:address:duplex-list <- copy 1:address:duplex-list - 4:number <- first 2:address:duplex-list + 4:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 5:number <- first 2:address:duplex-list + 5:number <- first-duplex 2:address:duplex-list 6:address:duplex-list <- next-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 7:number <- first 2:address:duplex-list + 7:number <- first-duplex 2:address:duplex-list 8:boolean <- equal 1:address:duplex-list, 2:address:duplex-list ] memory-should-contain [ @@ -305,12 +305,12 @@ scenario removing-from-start-of-duplex-list [ 1:address:duplex-list <- remove-duplex 1:address:duplex-list # check structure like before 2:address:duplex-list <- copy 1:address:duplex-list - 3:number <- first 2:address:duplex-list + 3:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 4:number <- first 2:address:duplex-list + 4:number <- first-duplex 2:address:duplex-list 5:address:duplex-list <- next-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 6:number <- first 2:address:duplex-list + 6:number <- first-duplex 2:address:duplex-list 7:boolean <- equal 1:address:duplex-list, 2:address:duplex-list ] memory-should-contain [ @@ -335,12 +335,12 @@ scenario removing-from-end-of-duplex-list [ 3:boolean <- equal 2:address:duplex-list, 0 # check structure like before 2:address:duplex-list <- copy 1:address:duplex-list - 4:number <- first 2:address:duplex-list + 4:number <- first-duplex 2:address:duplex-list 2:address:duplex-list <- next-duplex 2:address:duplex-list - 5:number <- first 2:address:duplex-list + 5:number <- first-duplex 2:address:duplex-list 6:address:duplex-list <- next-duplex 2:address:duplex-list 2:address:duplex-list <- prev-duplex 2:address:duplex-list - 7:number <- first 2:address:duplex-list + 7:number <- first-duplex 2:address:duplex-list 8:boolean <- equal 1:address:duplex-list, 2:address:duplex-list ] memory-should-contain [ diff --git a/edit.mu b/edit.mu index 9b8b0c49..54d678aa 100644 --- a/edit.mu +++ b/edit.mu @@ -2610,7 +2610,6 @@ recipe event-loop [ { t:address:touch-event <- maybe-convert e:event, touch:variant break-unless t -#? $print [touch 0], 10/newline #? 1 # ignore all but 'left-click' events for now # todo: test this touch-type:number <- get *t, type:offset @@ -2619,7 +2618,6 @@ recipe event-loop [ # later exceptions for non-editor touches will go here +global-touch # send to both editors -#? $print [sending touch to editors], 10/newline #? 1 _ <- move-cursor-in-editor screen, recipes, *t *sandbox-in-focus? <- move-cursor-in-editor screen, current-sandbox, *t render-minimal screen, env @@ -2676,8 +2674,6 @@ container sandbox-data [ data:address:array:character response:address:array:character warnings:address:array:character -#? foo:number -#? expected-response:address:array:character # coordinates to track clicks starting-row-on-screen:number response-starting-row-on-screen:number @@ -3235,7 +3231,6 @@ recipe foo [ after +global-touch [ # right side of screen and below sandbox editor? pop appropriate sandbox # contents back into sandbox editor provided it's empty -#? $print [touch 1], 10/newline #? 1 { sandbox-left-margin:number <- get *current-sandbox, left:offset click-column:number <- get *t, column:offset @@ -3244,15 +3239,11 @@ after +global-touch [ first-sandbox:address:sandbox-data <- get *env, sandbox:offset break-unless first-sandbox first-sandbox-begins:number <- get *first-sandbox, starting-row-on-screen:offset -#? $print first-sandbox-begins, 10/newline #? 1 click-row:number <- get *t, row:offset -#? $print [click row ], click-row, 10/newline #? 1 below-sandbox-editor?:boolean <- greater-or-equal click-row, first-sandbox-begins break-unless below-sandbox-editor? -#? $print [below sandbox editor], 10/newline #? 1 empty-sandbox-editor?:boolean <- empty-editor? current-sandbox break-unless empty-sandbox-editor? # make the user hit F4 before editing a new sandbox -#? $print [on sandbox], 10/newline #? 1 # identify the sandbox to edit and remove it from the sandbox list sandbox:address:sandbox-data <- extract-sandbox env, click-row text:address:array:character <- get *sandbox, data:offset |