about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-08-12 14:51:53 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-08-12 14:51:53 -0700
commit1625e908ba6c415570008ef6767031a80be60aa3 (patch)
tree5c637b4f8120f9bd035b18e9572ee8f173026f44
parent9e4f18449b1dce5448f97cd10c721d5085dae6cb (diff)
downloadmu-1625e908ba6c415570008ef6767031a80be60aa3.tar.gz
3168 - skip loading recipe 'main' in edit/
This is part of efforts to allow students to transition gradually from
the sandbox to running programs directly on the commandline, writing
real scenarios, etc. Running on the commandline requires 'main', but
overriding 'main' would mess up edit/ which is itself a Mu program.
-rw-r--r--011load.cc8
-rw-r--r--091run_sandboxed.cc (renamed from 091run_interactive.cc)54
-rw-r--r--edit/005-sandbox.mu2
-rw-r--r--edit/010-sandbox-trace.mu2
-rw-r--r--edit/011-errors.mu2
-rw-r--r--sandbox/005-sandbox.mu2
-rw-r--r--sandbox/010-sandbox-trace.mu2
-rw-r--r--sandbox/011-errors.mu2
8 files changed, 46 insertions, 28 deletions
diff --git a/011load.cc b/011load.cc
index 5988a7ba..ca66a8f4 100644
--- a/011load.cc
+++ b/011load.cc
@@ -25,11 +25,13 @@ vector<recipe_ordinal> load(istream& in) {
     string command = next_word(in);
     // Command Handlers
     if (command == "recipe" || command == "def") {
-      result.push_back(slurp_recipe(in));
+      recipe_ordinal r = slurp_recipe(in);
+      if (r > 0) result.push_back(r);
     }
     else if (command == "recipe!" || command == "def!") {
       Disable_redefine_checks = true;
-      result.push_back(slurp_recipe(in));
+      recipe_ordinal r = slurp_recipe(in);
+      if (r > 0) result.push_back(r);
       Disable_redefine_checks = false;
     }
     // End Command Handlers
@@ -40,6 +42,8 @@ vector<recipe_ordinal> load(istream& in) {
   return result;
 }
 
+// return the recipe ordinal slurped, or -1 if it failed
+// (later layers will cause failures)
 int slurp_recipe(istream& in) {
   recipe result;
   result.name = next_word(in);
diff --git a/091run_interactive.cc b/091run_sandboxed.cc
index 86f20894..1103cf97 100644
--- a/091run_interactive.cc
+++ b/091run_sandboxed.cc
@@ -5,7 +5,7 @@
 def main [
   1:number/raw <- copy 0
   2:address:array:character <- new [1:number/raw <- copy 34]
-  run-interactive 2:address:array:character
+  run-sandboxed 2:address:array:character
   3:number/raw <- copy 1:number/raw
 ]
 +mem: storing 34 in location 3
@@ -13,34 +13,45 @@ def main [
 :(scenario run_interactive_empty)
 def main [
   1:address:array:character <- copy 0/unsafe
-  2:address:array:character <- run-interactive 1:address:array:character
+  2:address:array:character <- run-sandboxed 1:address:array:character
 ]
 # result is null
 +mem: storing 0 in location 2
 
+//: As the name suggests, 'run-sandboxed' will prevent certain operations that
+//: regular Mu code can perform.
+:(before "End Globals")
+bool Sandbox_mode = false;
+//: for starters, users can't override 'main' when the environment is running
+:(before "End Load Recipe Name")
+if (Sandbox_mode && result.name == "main") {
+  slurp_balanced_bracket(in);
+  return -1;
+}
+
 //: run code in 'interactive mode', i.e. with errors off and return:
 //:   stringified output in case we want to print it to screen
 //:   any errors encountered
 //:   simulated screen any prints went to
 //:   any 'app' layer traces generated
 :(before "End Primitive Recipe Declarations")
-RUN_INTERACTIVE,
+RUN_SANDBOXED,
 :(before "End Primitive Recipe Numbers")
-put(Recipe_ordinal, "run-interactive", RUN_INTERACTIVE);
+put(Recipe_ordinal, "run-sandboxed", RUN_SANDBOXED);
 :(before "End Primitive Recipe Checks")
-case RUN_INTERACTIVE: {
+case RUN_SANDBOXED: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'run-interactive' requires exactly one ingredient, but got '" << inst.original_string << "'\n" << end();
+    raise << maybe(get(Recipe, r).name) << "'run-sandboxed' requires exactly one ingredient, but got '" << inst.original_string << "'\n" << end();
     break;
   }
   if (!is_mu_string(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'run-interactive' should be a string, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'run-sandboxed' should be a string, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
     break;
   }
   break;
 }
 :(before "End Primitive Recipe Implementations")
-case RUN_INTERACTIVE: {
+case RUN_SANDBOXED: {
   bool new_code_pushed_to_stack = run_interactive(ingredients.at(0).at(0));
   if (!new_code_pushed_to_stack) {
     products.resize(5);
@@ -99,7 +110,7 @@ bool run_interactive(int address) {
   // and wait for it
   if (Save_trace_stream) {
     ++Save_trace_stream->callstack_depth;
-    trace(9999, "trace") << "run-interactive: incrementing callstack depth to " << Save_trace_stream->callstack_depth << end();
+    trace(9999, "trace") << "run-sandboxed: incrementing callstack depth to " << Save_trace_stream->callstack_depth << end();
     assert(Save_trace_stream->callstack_depth < 9000);  // 9998-101 plus cushion
   }
   Current_routine->calls.push_front(call(get(Recipe_ordinal, "sandbox")));
@@ -115,6 +126,7 @@ map<string, type_ordinal> Type_ordinal_snapshot_stash;
 map<type_ordinal, type_info> Type_snapshot_stash;
 map<recipe_ordinal, map<string, int> > Name_snapshot_stash;
 map<string, vector<recipe_ordinal> > Recipe_variants_snapshot_stash;
+
 :(code)
 void run_code_begin(bool should_stash_snapshots) {
   // stuff to undo later, in run_code_end()
@@ -182,7 +194,7 @@ load(string(
   "output:address:array:character <- $most-recent-products\n" +
   "errors:address:array:character <- save-errors\n" +
   "stashes:address:array:character <- save-app-trace\n" +
-  "$cleanup-run-interactive\n" +
+  "$cleanup-run-sandboxed\n" +
   "return output, errors, screen, stashes, completed?\n" +
 "]\n");
 
@@ -194,7 +206,7 @@ load(string(
 def main [
   1:address:array:character <- new [# ab
 add 2, 2]
-  2:address:array:character <- run-interactive 1:address:array:character
+  2:address:array:character <- run-sandboxed 1:address:array:character
   3:array:character <- copy *2:address:array:character
 ]
 +mem: storing 52 in location 4
@@ -273,15 +285,15 @@ case SAVE_APP_TRACE: {
 }
 
 :(before "End Primitive Recipe Declarations")
-_CLEANUP_RUN_INTERACTIVE,
+_CLEANUP_RUN_SANDBOXED,
 :(before "End Primitive Recipe Numbers")
-put(Recipe_ordinal, "$cleanup-run-interactive", _CLEANUP_RUN_INTERACTIVE);
+put(Recipe_ordinal, "$cleanup-run-sandboxed", _CLEANUP_RUN_SANDBOXED);
 :(before "End Primitive Recipe Checks")
-case _CLEANUP_RUN_INTERACTIVE: {
+case _CLEANUP_RUN_SANDBOXED: {
   break;
 }
 :(before "End Primitive Recipe Implementations")
-case _CLEANUP_RUN_INTERACTIVE: {
+case _CLEANUP_RUN_SANDBOXED: {
   run_code_end();
   break;
 }
@@ -290,7 +302,7 @@ case _CLEANUP_RUN_INTERACTIVE: {
 def main [
   # try to interactively add 2 and 2
   1:address:array:character <- new [add 2, 2]
-  2:address:array:character <- run-interactive 1:address:array:character
+  2:address:array:character <- run-sandboxed 1:address:array:character
   10:array:character <- copy 2:address:array:character/lookup
 ]
 # first letter in the output should be '4' in unicode
@@ -304,7 +316,7 @@ def main [
     y:address:array:character <- new [b]
     z:address:array:character <- append x:address:array:character, y:address:array:character
   ]
-  2:address:array:character <- run-interactive 1:address:array:character
+  2:address:array:character <- run-sandboxed 1:address:array:character
   10:array:character <- copy 2:address:array:character/lookup
 ]
 # output contains "ab"
@@ -316,7 +328,7 @@ def main [
   # run a command that generates an error
   1:address:array:character <- new [x:number <- copy 34
 get x:number, foo:offset]
-  2:address:array:character, 3:address:array:character <- run-interactive 1:address:array:character
+  2:address:array:character, 3:address:array:character <- run-sandboxed 1:address:array:character
   10:array:character <- copy 3:address:array:character/lookup
 ]
 # error should be "unknown element foo in container number"
@@ -332,7 +344,7 @@ def main [
   1:address:array:number <- new [a:number <- copy 0  # abc
 b:number <- copy 0
 ]
-  2:address:array:character, 3:address:array:character <- run-interactive 1:address:array:character
+  2:address:array:character, 3:address:array:character <- run-sandboxed 1:address:array:character
 ]
 # no errors
 +mem: storing 0 in location 3
@@ -424,7 +436,7 @@ void truncate(string& x) {
   }
 }
 
-//: simpler version of run-interactive: doesn't do any running, just loads
+//: simpler version of run-sandboxed: doesn't do any running, just loads
 //: recipes and reports errors.
 
 :(before "End Primitive Recipe Declarations")
@@ -460,9 +472,11 @@ case RELOAD: {
   run_code_begin(/*should_stash_snapshots*/false);
   routine* save_current_routine = Current_routine;
   Current_routine = NULL;
+  Sandbox_mode = true;
   vector<recipe_ordinal> recipes_reloaded = load(code);
   transform_all();
   Trace_stream->newline();  // flush trace
+  Sandbox_mode = false;
   Current_routine = save_current_routine;
   products.resize(1);
   products.at(0).push_back(trace_error_contents());
diff --git a/edit/005-sandbox.mu b/edit/005-sandbox.mu
index 347e7cbe..1e203718 100644
--- a/edit/005-sandbox.mu
+++ b/edit/005-sandbox.mu
@@ -202,7 +202,7 @@ def! update-sandbox sandbox:address:sandbox-data, env:address:programming-enviro
   local-scope
   load-ingredients
   data:address:array:character <- get *sandbox, data:offset
-  response:address:array:character, _, fake-screen:address:screen <- run-interactive data
+  response:address:array:character, _, fake-screen:address:screen <- run-sandboxed data
   *sandbox <- put *sandbox, response:offset, response
   *sandbox <- put *sandbox, screen:offset, fake-screen
 ]
diff --git a/edit/010-sandbox-trace.mu b/edit/010-sandbox-trace.mu
index fd256732..38cf80af 100644
--- a/edit/010-sandbox-trace.mu
+++ b/edit/010-sandbox-trace.mu
@@ -178,7 +178,7 @@ def! update-sandbox sandbox:address:sandbox-data, env:address:programming-enviro
   local-scope
   load-ingredients
   data:address:array:character <- get *sandbox, data:offset
-  response:address:array:character, _, fake-screen:address:screen, trace:address:array:character <- run-interactive data
+  response:address:array:character, _, fake-screen:address:screen, trace:address:array:character <- run-sandboxed data
   *sandbox <- put *sandbox, response:offset, response
   *sandbox <- put *sandbox, screen:offset, fake-screen
   *sandbox <- put *sandbox, trace:offset, trace
diff --git a/edit/011-errors.mu b/edit/011-errors.mu
index 8e239e5d..080d5d37 100644
--- a/edit/011-errors.mu
+++ b/edit/011-errors.mu
@@ -81,7 +81,7 @@ def! update-sandbox sandbox:address:sandbox-data, env:address:programming-enviro
   local-scope
   load-ingredients
   data:address:array:character <- get *sandbox, data:offset
-  response:address:array:character, errors:address:array:character, fake-screen:address:screen, trace:address:array:character, completed?:boolean <- run-interactive data
+  response:address:array:character, errors:address:array:character, fake-screen:address:screen, trace:address:array:character, completed?:boolean <- run-sandboxed data
   *sandbox <- put *sandbox, response:offset, response
   *sandbox <- put *sandbox, errors:offset, errors
   *sandbox <- put *sandbox, screen:offset, fake-screen
diff --git a/sandbox/005-sandbox.mu b/sandbox/005-sandbox.mu
index 4f1429b5..54013373 100644
--- a/sandbox/005-sandbox.mu
+++ b/sandbox/005-sandbox.mu
@@ -186,7 +186,7 @@ def! update-sandbox sandbox:address:sandbox-data, env:address:programming-enviro
   local-scope
   load-ingredients
   data:address:array:character <- get *sandbox, data:offset
-  response:address:array:character, _, fake-screen:address:screen <- run-interactive data
+  response:address:array:character, _, fake-screen:address:screen <- run-sandboxed data
   *sandbox <- put *sandbox, response:offset, response
   *sandbox <- put *sandbox, screen:offset, fake-screen
 ]
diff --git a/sandbox/010-sandbox-trace.mu b/sandbox/010-sandbox-trace.mu
index a544d9ca..51ec5531 100644
--- a/sandbox/010-sandbox-trace.mu
+++ b/sandbox/010-sandbox-trace.mu
@@ -164,7 +164,7 @@ def! update-sandbox sandbox:address:sandbox-data, env:address:programming-enviro
   local-scope
   load-ingredients
   data:address:array:character <- get *sandbox, data:offset
-  response:address:array:character, _, fake-screen:address:screen, trace:address:array:character <- run-interactive data
+  response:address:array:character, _, fake-screen:address:screen, trace:address:array:character <- run-sandboxed data
   *sandbox <- put *sandbox, response:offset, response
   *sandbox <- put *sandbox, screen:offset, fake-screen
   *sandbox <- put *sandbox, trace:offset, trace
diff --git a/sandbox/011-errors.mu b/sandbox/011-errors.mu
index 8b0180be..e326e446 100644
--- a/sandbox/011-errors.mu
+++ b/sandbox/011-errors.mu
@@ -86,7 +86,7 @@ def! update-sandbox sandbox:address:sandbox-data, env:address:programming-enviro
     return
   }
   data:address:array:character <- get *sandbox, data:offset
-  response:address:array:character, errors:address:array:character, fake-screen:address:screen, trace:address:array:character, completed?:boolean <- run-interactive data
+  response:address:array:character, errors:address:array:character, fake-screen:address:screen, trace:address:array:character, completed?:boolean <- run-sandboxed data
   *sandbox <- put *sandbox, response:offset, response
   *sandbox <- put *sandbox, errors:offset, errors
   *sandbox <- put *sandbox, screen:offset, fake-screen