- We're using the stack to manage temporaries.
- The Stack layout is [RETURN | SELF | CONTROL_LINK | ARGS | LOCALS ] where locals are introduced by either the let or the case statements. We have to store the SELF object on the stack since it can change on dispatch.
- All the arguments are passed via stack in order, they're available just below the called function's frame pointer. The called function copies these arguments onto its own frame.
- Object layout is [TAG | SIZE | DISPATCH POINTER | ATTRIBUTES ]. The init recursively initializes all the attributes of an object, and all attributes within them, in an ancestor-first order
- Object attributes are stored in ancestor-first order to make dispatch easier
- We produce an enumerated table of which type is a subtype of another for runtime type checking with case