about summary refs log tree commit diff stats
path: root/030container.cc
Commit message (Expand)AuthorAgeFilesLines
* 5001 - drop the :(scenario) DSLKartik Agaram2019-03-121-237/+356
* 4987 - support `browse_trace` tool in SubXKartik Agaram2019-02-251-8/+8
* 4413Kartik Agaram2018-07-251-1/+1
* 4412Kartik Agaram2018-07-251-1/+1
* 4265Kartik Agaram2018-06-171-1/+1
* 4264Kartik Agaram2018-06-171-0/+700
* 4259Kartik Agaram2018-06-161-700/+0
* 4258 - undo 4257Kartik Agaram2018-06-151-41/+8
* 4257 - abortive attempt at safe fat pointersKartik Agaram2018-06-151-8/+41
* 4256 - get rid of container metadata entirelyKartik Agaram2018-06-091-236/+21
* 4235 - fix a build issue for Apple clang 900.0.38Kartik K. Agaram2018-04-201-1/+1
* 4104Kartik K. Agaram2017-11-031-2/+2
* 3966Kartik K. Agaram2017-07-091-1/+1
* 3906Kartik K. Agaram2017-06-101-0/+13
* 3905Kartik K. Agaram2017-06-101-2/+1
* 3887 - clean up early exits in interpreter loopKartik K. Agaram2017-05-281-1/+2
* 3877Kartik K. Agaram2017-05-261-7/+7
* 3841Kartik K. Agaram2017-04-271-4/+4
* 3723Kartik K. Agaram2016-12-271-4/+3
* 3707Kartik K. Agaram2016-12-121-5/+10
* 3675Kartik K. Agaram2016-11-151-2/+2
* 3663 - fix a refcounting bug: '(type)' != 'type'Kartik K. Agaram2016-11-101-2/+14
* 3654Kartik K. Agaram2016-11-081-15/+10
* 3653Kartik K. Agaram2016-11-081-1/+4
* 3652Kartik K. Agaram2016-11-081-4/+0
* 3645Kartik K. Agaram2016-11-071-4/+2
* 3644Kartik K. Agaram2016-11-071-71/+0
* 3643Kartik K. Agaram2016-11-071-4/+4
* 3639Kartik K. Agaram2016-11-061-8/+8
* 3637 - better 'missing type ingredient' errorsKartik K. Agaram2016-11-061-20/+20
* 3561Kartik K. Agaram2016-10-221-1/+1
* 3555Kartik K. Agaram2016-10-221-1/+1
* 3553Kartik K. Agaram2016-10-221-2/+2
* 3539Kartik K. Agaram2016-10-211-0/+10
* 3522Kartik K. Agaram2016-10-191-16/+16
* 3502Kartik K. Agaram2016-10-151-3/+8
* 3384Kartik K. Agaram2016-09-171-0/+14
* 3383Kartik K. Agaram2016-09-171-3/+3
* 3381Kartik K. Agaram2016-09-171-2/+2
* 3380Kartik K. Agaram2016-09-171-69/+70
* 3338Kartik K. Agaram2016-09-121-0/+25
* 3332Kartik K. Agaram2016-09-111-2/+2
* 3324 - completely redo type abbreviationsKartik K. Agaram2016-09-111-4/+2
* 3321Kartik K. Agaram2016-09-101-15/+19
* 3313Kartik K. Agaram2016-09-101-13/+5
* 3309Kartik K. Agaram2016-09-091-65/+234
* 3307Kartik K. Agaram2016-09-091-0/+3
* 3304Kartik K. Agaram2016-09-071-3/+3
* 3303Kartik K. Agaram2016-09-071-1/+1
* 3301Kartik K. Agaram2016-09-061-5/+5
> :(scenario copy_multiple) recipe main [ 1:number, 2:number <- copy 23:literal, 24:literal ] +mem: storing 23 in location 1 +mem: storing 24 in location 2 :(before "End Types") // Book-keeping while running a recipe. //: Later layers will change this. struct routine { recipe_ordinal running_recipe; long long int running_step_index; routine(recipe_ordinal r) :running_recipe(r), running_step_index(0) {} bool completed() const; }; :(before "End Globals") routine* Current_routine = NULL; :(code) void run(recipe_ordinal r) { routine rr(r); Current_routine = &rr; run_current_routine(); } void run_current_routine() { // curly on a separate line, because later layers will modify header //? cerr << "AAA 6\n"; //? 3 while (!Current_routine->completed()) // later layers will modify condition { //? cerr << "AAA 7: " << current_step_index() << '\n'; //? 1 // Running One Instruction if (current_instruction().is_label) { ++current_step_index(); continue; } trace(Initial_callstack_depth+Callstack_depth, "run") << current_instruction().to_string(); assert(Memory[0] == 0); // Read all ingredients from memory. // Each ingredient loads a vector of values rather than a single value; mu // permits operating on reagents spanning multiple locations. vector<vector<double> > ingredients; for (long long int i = 0; i < SIZE(current_instruction().ingredients); ++i) { ingredients.push_back(read_memory(current_instruction().ingredients.at(i))); } // Instructions below will write to 'products'. vector<vector<double> > products; //? cerr << "AAA 8: " << current_instruction().operation << " ^" << Recipe[current_instruction().operation].name << "$\n"; //? 1 //? cerr << "% " << current_recipe_name() << "/" << current_step_index() << ": " << Memory[1013] << ' ' << Memory[1014] << '\n'; //? 1 switch (current_instruction().operation) { // Primitive Recipe Implementations case COPY: { //? if (!ingredients.empty()) cerr << current_instruction().ingredients.at(0).to_string() << ' ' << ingredients.at(0).at(0) << '\n'; //? 1 copy(ingredients.begin(), ingredients.end(), inserter(products, products.begin())); break; } // End Primitive Recipe Implementations default: { cout << "not a primitive op: " << current_instruction().operation << '\n'; } } if (SIZE(products) < SIZE(current_instruction().products)) raise << "failed to write to all products! " << current_instruction().to_string(); 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(); } //? cerr << "AAA 9\n"; //? 2 stop_running_current_routine:; } //: Some helpers. //: We'll need to override these later as we change the definition of routine. //: Important that they return referrences into the routine. inline long long int& current_step_index() { return Current_routine->running_step_index; } inline const string& current_recipe_name() { return Recipe[Current_routine->running_recipe].name; } inline const instruction& current_instruction() { return Recipe[Current_routine->running_recipe].steps.at(Current_routine->running_step_index); } inline bool routine::completed() const { return running_step_index >= SIZE(Recipe[running_recipe].steps); } :(before "End Commandline Parsing") // Loading Commandline Files if (argc > 1) { for (int i = 1; i < argc; ++i) { load_permanently(argv[i]); } } :(before "End Main") if (!Run_tests) { setup(); //? Trace_file = "interactive"; //? 1 //? START_TRACING_UNTIL_END_OF_SCOPE; //? Trace_stream->dump_layer = "all"; //? 2 transform_all(); recipe_ordinal r = Recipe_ordinal[string("main")]; //? Trace_stream->dump_layer = "all"; //? 1 if (r) run(r); //? dump_memory(); //? 1 teardown(); } :(code) void load_permanently(string filename) { ifstream fin(filename.c_str()); fin.peek(); //? cerr << "AAA: " << filename << ' ' << static_cast<bool>(fin) << ' ' << fin.fail() << '\n'; //? 1 //? return; //? 1 if (!fin) { raise << "no such file " << filename << '\n'; return; } fin >> std::noskipws; load(fin); transform_all(); fin.close(); // freeze everything so it doesn't get cleared by tests recently_added_recipes.clear(); // End load_permanently. } //:: On startup, load everything in core.mu :(before "End Load Recipes") load_permanently("core.mu"); :(code) // helper for tests void run(string form) { //? cerr << "AAA 2\n"; //? 2 //? cerr << form << '\n'; //? 1 vector<recipe_ordinal> tmp = load(form); if (tmp.empty()) return; transform_all(); //? cerr << "AAA 3\n"; //? 2 run(tmp.front()); //? cerr << "YYY\n"; //? 2 } //:: Reading from memory, writing to memory. vector<double> read_memory(reagent x) { //? cout << "read_memory: " << x.to_string() << '\n'; //? 2 vector<double> result; if (is_literal(x)) { result.push_back(x.value); return result; } long long int base = x.value; long long int size = size_of(x); for (long long int offset = 0; offset < size; ++offset) { double val = Memory[base+offset]; trace(Primitive_recipe_depth, "mem") << "location " << base+offset << " is " << val; result.push_back(val); } return result; } void write_memory(reagent x, vector<double> data) { if (is_dummy(x)) return; if (is_literal(x)) return; long long int base = x.value; if (size_mismatch(x, data)) { raise << current_recipe_name() << ": size mismatch in storing to " << x.to_string() << " at " << current_instruction().to_string() << '\n' << die(); } for (long long int offset = 0; offset < SIZE(data); ++offset) { trace(Primitive_recipe_depth, "mem") << "storing " << data.at(offset) << " in location " << base+offset; Memory[base+offset] = data.at(offset); } } :(code) long long int size_of(const reagent& r) { return size_of(r.types); } long long int size_of(const vector<type_ordinal>& types) { // End size_of(types) Cases return 1; } bool size_mismatch(const reagent& x, const vector<double>& data) { //? if (size_of(x) != SIZE(data)) cerr << size_of(x) << " vs " << SIZE(data) << '\n'; //? 2 return size_of(x) != SIZE(data); } bool is_dummy(const reagent& x) { return x.name == "_"; } bool is_literal(const reagent& r) { return SIZE(r.types) == 1 && r.types.at(0) == 0; } :(scenario run_label) recipe main [ +foo 1:number <- copy 23:literal 2:number <- copy 1:number ] +run: 1:number <- copy 23:literal +run: 2:number <- copy 1:number -run: +foo :(scenario run_dummy) recipe main [ _ <- copy 0:literal ] +run: _ <- copy 0:literal :(scenario run_literal) recipe main [ 0:literal/screen <- copy 0:literal ] -mem: storing 0 in location 0