about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-07-31 17:06:38 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-07-31 17:08:30 -0700
commit18e626dfe83c21822debc6f5a56eaea2b3102220 (patch)
treebf09bff528d2fefb72bd2349cb05cfa362d7156a
parent37a173b8a9c09ba96f6f8b75b89ae4e9521d5273 (diff)
downloadmu-18e626dfe83c21822debc6f5a56eaea2b3102220.tar.gz
1909 - clean up all null pointers of that ilk
-rw-r--r--030container.cc20
-rw-r--r--032array.cc22
-rw-r--r--033exclusive_container.cc4
-rw-r--r--042name.cc3
-rw-r--r--065duplex_list.mu72
-rw-r--r--edit.mu9
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