diff options
-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 |