diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-08-12 14:51:53 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-08-12 14:51:53 -0700 |
commit | 1625e908ba6c415570008ef6767031a80be60aa3 (patch) | |
tree | 5c637b4f8120f9bd035b18e9572ee8f173026f44 | |
parent | 9e4f18449b1dce5448f97cd10c721d5085dae6cb (diff) | |
download | mu-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.cc | 8 | ||||
-rw-r--r-- | 091run_sandboxed.cc (renamed from 091run_interactive.cc) | 54 | ||||
-rw-r--r-- | edit/005-sandbox.mu | 2 | ||||
-rw-r--r-- | edit/010-sandbox-trace.mu | 2 | ||||
-rw-r--r-- | edit/011-errors.mu | 2 | ||||
-rw-r--r-- | sandbox/005-sandbox.mu | 2 | ||||
-rw-r--r-- | sandbox/010-sandbox-trace.mu | 2 | ||||
-rw-r--r-- | sandbox/011-errors.mu | 2 |
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 |