about summary refs log tree commit diff stats
path: root/archive/1.vm/999spaces.cc
diff options
context:
space:
mode:
Diffstat (limited to 'archive/1.vm/999spaces.cc')
-rw-r--r--archive/1.vm/999spaces.cc86
1 files changed, 86 insertions, 0 deletions
diff --git a/archive/1.vm/999spaces.cc b/archive/1.vm/999spaces.cc
new file mode 100644
index 00000000..adbbf8a9
--- /dev/null
+++ b/archive/1.vm/999spaces.cc
@@ -0,0 +1,86 @@
+//: Since different layers all carve out different parts of various namespaces
+//: (recipes, memory, etc.) for their own use, there's no previous place where
+//: we can lay out the big picture of what uses what. So we'll do that here
+//: and just have to manually remember to update it when we move boundaries
+//: around.
+//:
+//:: Memory
+//:
+//: Location 0 - unused (since it can help uncover bugs)
+//: Locations 1-899 - reserved for tests
+//: Locations 900-999 - reserved for predefined globals in Mu scenarios, like keyboard, screen, etc.
+:(before "End Reset")
+assert(Max_variables_in_scenarios == 900);
+//: Locations 1000 ('Reserved_for_tests') onward - available to the allocator in chunks of size Initial_memory_per_routine.
+assert(Reserved_for_tests == 1000);
+
+//:: Recipes
+//:
+//: 0 - unused (IDLE; do nothing)
+//: 1-199 - primitives
+assert(MAX_PRIMITIVE_RECIPES < 200);
+//: 200-999 - defined in .mu files as sequences of primitives
+assert(Next_recipe_ordinal == 1000);
+//: 1000 onwards - reserved for tests, cleared between tests
+
+//:: Depths for tracing
+//:
+//: 0 - errors
+//: 1-99 - app-level trace statements in Mu
+//: 100-9999 - call-stack statements (mostly label run)
+assert(Initial_callstack_depth == 100);
+
+//:: Summary of transforms and their dependencies
+//: begin transforms
+//:   begin instruction inserting transforms
+//:     52 insert fragments
+//:      ↳ 52.2 check fragments
+//:   ---
+//:     53 rewrite 'stash' instructions
+//:   end instruction inserting transforms
+//:
+//:   begin instruction modifying transforms
+//:     56.2 check header ingredients
+//:      ↳ 56.4 fill in return ingredients
+//:     48 check or set types by name
+//:
+//:     begin type modifying transforms
+//:       56.3 deduce types from header
+//:     ---
+//:       30 check or set invalid containers
+//:     end type modifying transforms
+//:         ↱ 46 collect surrounding spaces
+//:      ↳ 42 transform names
+//:         ↳ 57 static dispatch
+//:   ---
+//:     13 update instruction operation
+//:     40 transform braces
+//:     41 transform labels
+//:   end instruction modifying transforms
+//:    ↳ 60 check immutable ingredients
+//:
+//:   begin checks
+//:   ---
+//:     21 check instruction
+//:     ↳ 61 check indirect calls against header
+//:     ↳ 56 check calls against header
+//:     ↳ 43 transform 'new' to 'allocate'
+//:     30 check merge calls
+//:     36 check types of return instructions
+//:     43 check default space
+//:     56 check return instructions against header
+//:   end checks
+//: end transforms
+
+//:: Summary of type-checking in different phases
+//: when dispatching instructions we accept first recipe that:
+//:   strictly matches all types
+//:   maps literal 0 or literal 1 to boolean for some ingredients
+//:   performs some other acceptable type conversion
+//:     literal 0 -> address
+//:     literal -> character
+//: when checking instructions we ensure that types match, and that literals map to some scalar
+//:   (address can only map to literal 0)
+//:   (boolean can only map to literal 0 or literal 1)
+//:     (but conditionals can take any scalar)
+//: at runtime we perform no checks