diff options
Diffstat (limited to 'cpp/023call_reply')
-rw-r--r-- | cpp/023call_reply | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/cpp/023call_reply b/cpp/023call_reply new file mode 100644 index 00000000..17f2c463 --- /dev/null +++ b/cpp/023call_reply @@ -0,0 +1,39 @@ +//: Calls can also generate results, using 'reply'. +:(scenario "reply") +recipe main [ + 3:integer, 4:integer <- f 2:literal +] +recipe f [ + 12:integer <- next-ingredient + 13:integer <- add 1:literal, 12:integer + reply 12:integer, 13:integer +] ++run: instruction main/0 ++run: result 0 is 1[2...] ++mem: storing in location 3 ++run: result 1 is 1[3...] ++mem: storing in location 4 + +:(before "End Globals") +const int REPLY = 23; +:(before "End Primitive Recipe Numbers") +Recipe_number["reply"] = REPLY; +assert(Next_recipe_number == REPLY); +Next_recipe_number++; +:(before "End Primitive Recipe Implementations") +case REPLY: { + vector<vector<int> > callee_results; + for (size_t i = 0; i < instructions[pc].ingredients.size(); ++i) { + callee_results.push_back(read_memory(instructions[pc].ingredients[i])); + } + rr.calls.pop(); + size_t& caller_pc = rr.calls.top().pc; + instruction& caller_instruction = Recipe[rr.calls.top().running_recipe].steps[caller_pc]; + assert(caller_instruction.products.size() <= callee_results.size()); + for (size_t i = 0; i < caller_instruction.products.size(); ++i) { + trace("run") << "result " << i << " is " << callee_results[i].size() << "[" << callee_results[i][0] << "...]"; + write_memory(caller_instruction.products[i], callee_results[i]); + } + ++caller_pc; + break; +} |