blob: e28faa78caa0c0772709bd510e533481069944d5 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
//: 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 Setup")
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 - unused
//: 1-100 - app-level trace statements in Mu
//: 101-9989 - call-stack statements (mostly label run)
assert(Initial_callstack_depth == 101);
assert(Max_callstack_depth == 9989);
//: 9990-9999 - intra-instruction lines (mostly label mem)
//:: 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
|