diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-08-02 22:18:19 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-08-02 22:18:19 -0700 |
commit | cfb142b9601cc648f15bf5738a3df09a23835e41 (patch) | |
tree | 670f168fbbf2693b17d679939bd1c203de1c3837 | |
parent | 37900254f083364dcfbb80cf7119c230a0b603d6 (diff) | |
download | mu-cfb142b9601cc648f15bf5738a3df09a23835e41.tar.gz |
1923
Still iterating on the right way to handle incorrect number of ingredients. My first idea of creating null results doesn't really work once they're used in later instructions. Just add a warning at one place in the run loop, but otherwise only add products when there's something to save in them. Undoes some work around commit 1886.
-rw-r--r-- | 020run.cc | 9 | ||||
-rw-r--r-- | 021arithmetic.cc | 4 | ||||
-rw-r--r-- | 024compare.cc | 10 | ||||
-rw-r--r-- | 029tools.cc | 2 | ||||
-rw-r--r-- | 030container.cc | 5 | ||||
-rw-r--r-- | 032array.cc | 7 | ||||
-rw-r--r-- | 033exclusive_container.cc | 2 | ||||
-rw-r--r-- | 035call_ingredient.cc | 3 | ||||
-rw-r--r-- | 038scheduler.cc | 2 | ||||
-rw-r--r-- | 043new.cc | 2 | ||||
-rw-r--r-- | 053continuation.cc | 2 | ||||
-rw-r--r-- | 064random.cc | 2 | ||||
-rw-r--r-- | 081run_interactive.cc | 12 | ||||
-rw-r--r-- | 082persist.cc | 2 |
14 files changed, 35 insertions, 29 deletions
diff --git a/020run.cc b/020run.cc index 72fc2b7c..c981349f 100644 --- a/020run.cc +++ b/020run.cc @@ -88,10 +88,13 @@ void run_current_routine() cout << "not a primitive op: " << current_instruction().operation << '\n'; } } - if (SIZE(products) < SIZE(current_instruction().products)) + if (SIZE(products) < SIZE(current_instruction().products)) { raise << SIZE(products) << " vs " << SIZE(current_instruction().products) << ": failed to write to all products! " << current_instruction().to_string() << end(); - for (long long int i = 0; i < SIZE(current_instruction().products); ++i) { - write_memory(current_instruction().products.at(i), products.at(i)); + } + else { + for (long long int i = 0; i < SIZE(current_instruction().products); ++i) { + write_memory(current_instruction().products.at(i), products.at(i)); + } } // End of Instruction ++current_step_index(); diff --git a/021arithmetic.cc b/021arithmetic.cc index 2a21c2cf..9c1de78b 100644 --- a/021arithmetic.cc +++ b/021arithmetic.cc @@ -43,7 +43,6 @@ SUBTRACT, Recipe_ordinal["subtract"] = SUBTRACT; :(before "End Primitive Recipe Implementations") case SUBTRACT: { - products.resize(1); if (ingredients.empty()) { raise << current_recipe_name() << ": 'subtract' has no ingredients\n" << end(); break; @@ -54,6 +53,7 @@ case SUBTRACT: { assert(scalar(ingredients.at(i))); result -= ingredients.at(i).at(0); } + products.resize(1); products.at(0).push_back(result); break; } @@ -120,7 +120,6 @@ DIVIDE, Recipe_ordinal["divide"] = DIVIDE; :(before "End Primitive Recipe Implementations") case DIVIDE: { - products.resize(1); if (ingredients.empty()) { raise << current_recipe_name() << ": 'divide' has no ingredients\n" << end(); break; @@ -131,6 +130,7 @@ case DIVIDE: { assert(scalar(ingredients.at(i))); result /= ingredients.at(i).at(0); } + products.resize(1); products.at(0).push_back(result); break; } diff --git a/024compare.cc b/024compare.cc index 7fb8c2e8..fb3481fd 100644 --- a/024compare.cc +++ b/024compare.cc @@ -6,7 +6,6 @@ EQUAL, Recipe_ordinal["equal"] = EQUAL; :(before "End Primitive Recipe Implementations") case EQUAL: { - products.resize(1); if (SIZE(ingredients) <= 1) { raise << current_recipe_name() << ": 'equal' needs at least two ingredients to compare in '" << current_instruction().to_string() << "'\n" << end(); break; @@ -19,6 +18,7 @@ case EQUAL: { break; } } + products.resize(1); products.at(0).push_back(result); break; } @@ -61,7 +61,6 @@ GREATER_THAN, Recipe_ordinal["greater-than"] = GREATER_THAN; :(before "End Primitive Recipe Implementations") case GREATER_THAN: { - products.resize(1); bool result = true; if (SIZE(ingredients) <= 1) { raise << current_recipe_name() << ": 'greater-than' needs at least two ingredients to compare in '" << current_instruction().to_string() << "'\n" << end(); @@ -79,6 +78,7 @@ case GREATER_THAN: { } } finish_greater_than: + products.resize(1); products.at(0).push_back(result); break; } @@ -117,7 +117,6 @@ LESSER_THAN, Recipe_ordinal["lesser-than"] = LESSER_THAN; :(before "End Primitive Recipe Implementations") case LESSER_THAN: { - products.resize(1); bool result = true; if (SIZE(ingredients) <= 1) { raise << current_recipe_name() << ": 'lesser-than' needs at least two ingredients to compare in '" << current_instruction().to_string() << "'\n" << end(); @@ -135,6 +134,7 @@ case LESSER_THAN: { } } finish_lesser_than: + products.resize(1); products.at(0).push_back(result); break; } @@ -173,7 +173,6 @@ GREATER_OR_EQUAL, Recipe_ordinal["greater-or-equal"] = GREATER_OR_EQUAL; :(before "End Primitive Recipe Implementations") case GREATER_OR_EQUAL: { - products.resize(1); bool result = true; if (SIZE(ingredients) <= 1) { raise << current_recipe_name() << ": 'greater-or-equal' needs at least two ingredients to compare in '" << current_instruction().to_string() << "'\n" << end(); @@ -191,6 +190,7 @@ case GREATER_OR_EQUAL: { } } finish_greater_or_equal: + products.resize(1); products.at(0).push_back(result); break; } @@ -237,7 +237,6 @@ LESSER_OR_EQUAL, Recipe_ordinal["lesser-or-equal"] = LESSER_OR_EQUAL; :(before "End Primitive Recipe Implementations") case LESSER_OR_EQUAL: { - products.resize(1); bool result = true; if (SIZE(ingredients) <= 1) { raise << current_recipe_name() << ": 'lesser-or-equal' needs at least two ingredients to compare in '" << current_instruction().to_string() << "'\n" << end(); @@ -255,6 +254,7 @@ case LESSER_OR_EQUAL: { } } finish_lesser_or_equal: + products.resize(1); products.at(0).push_back(result); break; } diff --git a/029tools.cc b/029tools.cc index de4b488c..11130e5f 100644 --- a/029tools.cc +++ b/029tools.cc @@ -189,12 +189,12 @@ _SYSTEM, Recipe_ordinal["$system"] = _SYSTEM; :(before "End Primitive Recipe Implementations") case _SYSTEM: { - products.resize(1); if (current_instruction().ingredients.empty()) { raise << current_recipe_name() << ": '$system' requires exactly one ingredient, but got none\n" << end(); break; } int status = system(current_instruction().ingredients.at(0).name.c_str()); + products.resize(1); products.at(0).push_back(status); break; } diff --git a/030container.cc b/030container.cc index 55de2a2d..6159f3a0 100644 --- a/030container.cc +++ b/030container.cc @@ -107,7 +107,6 @@ 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(); break; @@ -143,7 +142,7 @@ case GET: { reagent tmp; tmp.set_value(src); tmp.types.push_back(src_type); - products.at(0) = read_memory(tmp); + products.push_back(read_memory(tmp)); break; } @@ -192,7 +191,6 @@ GET_ADDRESS, Recipe_ordinal["get-address"] = GET_ADDRESS; :(before "End Primitive Recipe Implementations") case GET_ADDRESS: { - products.resize(1); reagent base = current_instruction().ingredients.at(0); long long int base_address = base.value; if (base_address == 0) { @@ -219,6 +217,7 @@ case GET_ADDRESS: { result += size_of(Type[base_type].elements.at(i)); } trace(Primitive_recipe_depth, "run") << "address to copy is " << result << end(); + products.resize(1); products.at(0).push_back(result); break; } diff --git a/032array.cc b/032array.cc index eae33f4c..54e69e79 100644 --- a/032array.cc +++ b/032array.cc @@ -79,7 +79,6 @@ 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(); break; @@ -107,7 +106,7 @@ case INDEX: { reagent tmp; tmp.set_value(src); copy(element_type.begin(), element_type.end(), inserter(tmp.types, tmp.types.begin())); - products.at(0) = read_memory(tmp); + products.push_back(read_memory(tmp)); break; } @@ -175,7 +174,6 @@ INDEX_ADDRESS, Recipe_ordinal["index-address"] = INDEX_ADDRESS; :(before "End Primitive Recipe Implementations") case INDEX_ADDRESS: { - products.resize(1); if (SIZE(ingredients) != 2) { raise << current_recipe_name() << ": 'index-address' expects exactly 2 ingredients in '" << current_instruction().to_string() << "'\n" << end(); break; @@ -198,6 +196,7 @@ case INDEX_ADDRESS: { break; } long long int result = base_address + 1 + offset_val.at(0)*size_of(element_type); + products.resize(1); products.at(0).push_back(result); break; } @@ -250,7 +249,6 @@ LENGTH, Recipe_ordinal["length"] = LENGTH; :(before "End Primitive Recipe Implementations") case LENGTH: { - products.resize(1); if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'length' expects exactly 2 ingredients in '" << current_instruction().to_string() << "'\n" << end(); break; @@ -264,6 +262,7 @@ case LENGTH: { raise << current_recipe_name() << ": tried to access location 0 in '" << current_instruction().to_string() << "'\n" << end(); break; } + products.resize(1); products.at(0).push_back(Memory[x.value]); break; } diff --git a/033exclusive_container.cc b/033exclusive_container.cc index eb3ff6f2..e2f520f8 100644 --- a/033exclusive_container.cc +++ b/033exclusive_container.cc @@ -83,7 +83,6 @@ MAYBE_CONVERT, Recipe_ordinal["maybe-convert"] = MAYBE_CONVERT; :(before "End Primitive Recipe Implementations") case MAYBE_CONVERT: { - products.resize(1); if (SIZE(ingredients) != 2) { raise << current_recipe_name() << ": 'maybe-convert' expects exactly 2 ingredients in '" << current_instruction().to_string() << "'\n" << end(); break; @@ -111,6 +110,7 @@ case MAYBE_CONVERT: { else { result = 0; } + products.resize(1); products.at(0).push_back(result); break; } diff --git a/035call_ingredient.cc b/035call_ingredient.cc index a2dd97ad..599906da 100644 --- a/035call_ingredient.cc +++ b/035call_ingredient.cc @@ -39,7 +39,6 @@ Recipe_ordinal["next-ingredient"] = NEXT_INGREDIENT; case NEXT_INGREDIENT: { if (!ingredients.empty()) { raise << current_recipe_name() << ": 'next-ingredient' didn't expect any ingredients in '" << current_instruction().to_string() << "'\n" << end(); - products.resize(2); break; } assert(!Current_routine->calls.empty()); @@ -102,12 +101,10 @@ Recipe_ordinal["ingredient"] = INGREDIENT; case INGREDIENT: { if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'ingredient' expects exactly one ingredient, but got '" << current_instruction().to_string() << "'\n" << end(); - products.resize(2); break; } if (!is_literal(current_instruction().ingredients.at(0))) { raise << current_recipe_name() << ": 'ingredient' expects a literal ingredient, but got " << current_instruction().ingredients.at(0).original_string << '\n' << end(); - products.resize(2); break; } assert(scalar(ingredients.at(0))); diff --git a/038scheduler.cc b/038scheduler.cc index 5925abab..d32fb76a 100644 --- a/038scheduler.cc +++ b/038scheduler.cc @@ -281,7 +281,6 @@ ROUTINE_STATE, Recipe_ordinal["routine-state"] = ROUTINE_STATE; :(before "End Primitive Recipe Implementations") case ROUTINE_STATE: { - products.resize(1); if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'routine-state' requires exactly one ingredient, but got " << current_instruction().to_string() << '\n' << end(); break; @@ -298,6 +297,7 @@ case ROUTINE_STATE: { break; } } + products.resize(1); products.at(0).push_back(result); break; } diff --git a/043new.cc b/043new.cc index c324bff7..89c3cc23 100644 --- a/043new.cc +++ b/043new.cc @@ -56,7 +56,6 @@ NEW, Recipe_ordinal["new"] = NEW; :(before "End Primitive Recipe Implementations") case NEW: { - products.resize(1); if (ingredients.empty() || SIZE(ingredients) > 2) { raise << current_recipe_name() << ": 'new' requires one or two ingredients, but got " << current_instruction().to_string() << '\n' << end(); break; @@ -90,6 +89,7 @@ case NEW: { const long long int result = Current_routine->alloc; trace(Primitive_recipe_depth, "mem") << "new alloc: " << result << end(); // save result + products.resize(1); products.at(0).push_back(result); // initialize allocated space for (long long int address = result; address < result+size; ++address) { diff --git a/053continuation.cc b/053continuation.cc index 5885fd40..20cf1b05 100644 --- a/053continuation.cc +++ b/053continuation.cc @@ -193,7 +193,6 @@ REPLY_DELIMITED_CONTINUATION, Recipe_ordinal["reply-delimited-continuation"] = REPLY_DELIMITED_CONTINUATION; :(before "End Primitive Recipe Implementations") case REPLY_DELIMITED_CONTINUATION: { - products.resize(1); // first clear any existing ingredients, to isolate the creation of the // continuation from its calls Current_routine->calls.front().ingredient_atoms.clear(); @@ -211,6 +210,7 @@ case REPLY_DELIMITED_CONTINUATION: { Current_routine->calls.pop_front(); } // return it as the result of the 'reset' call + products.resize(1); products.at(0).push_back(Next_delimited_continuation_id); ++Next_delimited_continuation_id; break; // continue to process rest of 'reset' call diff --git a/064random.cc b/064random.cc index cdc519c9..bd171132 100644 --- a/064random.cc +++ b/064random.cc @@ -27,7 +27,6 @@ ROUND, Recipe_ordinal["round"] = ROUND; :(before "End Primitive Recipe Implementations") case ROUND: { - products.resize(1); if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'round' requires exactly one ingredient, but got " << current_instruction().to_string() << '\n' << end(); break; @@ -36,6 +35,7 @@ case ROUND: { raise << current_recipe_name() << ": first ingredient of 'round' should be a number, but got " << current_instruction().ingredients.at(0).original_string << '\n' << end(); break; } + products.resize(1); products.at(0).push_back(rint(ingredients.at(0).at(0))); break; } diff --git a/081run_interactive.cc b/081run_interactive.cc index 59c79432..e627b0f6 100644 --- a/081run_interactive.cc +++ b/081run_interactive.cc @@ -27,7 +27,6 @@ Recipe_ordinal["run-interactive"] = RUN_INTERACTIVE; //? cerr << "run-interactive: " << RUN_INTERACTIVE << '\n'; //? 1 :(before "End Primitive Recipe Implementations") case RUN_INTERACTIVE: { - products.resize(4); if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'run-interactive' requires exactly one ingredient, but got " << current_instruction().to_string() << '\n' << end(); break; @@ -38,6 +37,7 @@ case RUN_INTERACTIVE: { } bool new_code_pushed_to_stack = run_interactive(ingredients.at(0).at(0)); if (!new_code_pushed_to_stack) { + products.resize(4); products.at(0).push_back(0); products.at(1).push_back(trace_contents("warn")); products.at(2).push_back(0); @@ -153,6 +153,14 @@ void record_products(const instruction& instruction, const vector<vector<double> // string if (i < SIZE(instruction.products)) { if (is_mu_string(instruction.products.at(i))) { + if (!scalar(products.at(i))) { + tb_shutdown(); + cerr << read_mu_string(trace_contents("warn")) << '\n'; + cerr << SIZE(products.at(i)) << ": "; + for (long long int j = 0; j < SIZE(products.at(i)); ++j) + cerr << products.at(i).at(j) << ' '; + cerr << '\n'; + } assert(scalar(products.at(i))); out << read_mu_string(products.at(i).at(0)) << '\n'; continue; @@ -281,7 +289,6 @@ RELOAD, Recipe_ordinal["reload"] = RELOAD; :(before "End Primitive Recipe Implementations") case RELOAD: { - products.resize(1); if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'reload' requires exactly one ingredient, but got " << current_instruction().to_string() << '\n' << end(); break; @@ -302,6 +309,7 @@ case RELOAD: { Trace_stream->newline(); // flush trace Disable_redefine_warnings = false; Hide_warnings = false; + products.resize(1); products.at(0).push_back(trace_contents("warn")); // hack: assume collect_layers isn't set anywhere else if (Trace_stream->is_narrowly_collecting("warn")) { diff --git a/082persist.cc b/082persist.cc index f10b44a2..3b0bb987 100644 --- a/082persist.cc +++ b/082persist.cc @@ -8,7 +8,6 @@ RESTORE, Recipe_ordinal["restore"] = RESTORE; :(before "End Primitive Recipe Implementations") case RESTORE: { - products.resize(1); if (SIZE(ingredients) != 1) { raise << current_recipe_name() << ": 'restore' requires exactly one ingredient, but got " << current_instruction().to_string() << '\n' << end(); break; @@ -26,6 +25,7 @@ case RESTORE: { } if (Current_scenario) break; // do nothing in tests string contents = slurp("lesson/"+filename); + products.resize(1); if (contents.empty()) products.at(0).push_back(0); else |