Branch ast-stage-c. Suite 178/178; self-hosting fixpoint OK
(3,042,040 bytes; slice 12 was 3,034,200).
| Construct | AST |
|---|---|
CLASS T; … END T; |
NkClassDecl(name, parents, fields, methods), op = 0 |
CLASS IMPLEMENTATION T; … END T; |
NkClassDecl(…, initBody, methodsWithBodies), op = 1 |
| class field/const | NkVarDecl (ty) / NkConstDecl |
| method heading | NkProcDecl, op = 0 normal / 3 virtual / 1 forward |
| method implementation | NkProcDecl with the body as child 1 |
Module-level accumulators (astCls, astClsP/F/M + tails, astMethod)
carry the class being parsed; classes are not nested inside one another,
so this is safe. ClassRest and ClassImplRest attach
child[1] = parents, child[2] = fields/init body, child[3] =
methods, and set astDecl so DeclSeq/TypeBlock record the class.
TypeBlock never collected its items. It ran TypeItem/ClassItem
in a loop but only the last one's astDecl survived to DeclSeq — a
latent slice-6 bug (my earlier test had a single type). TypeBlock now
builds an NkDeclSeq like ConstBlock/VarBlock, so all TYPE and
class declarations are recorded.AST.SetChild cannot skip an unset child. The implementation
class set child[2]/child[3] while child[1] was unset, so the
methods and init body were silently dropped; child[1] is now set to
NoNode first. Also reset astStmt before the optional class-BEGIN
so a body-less implementation does not inherit the last method's body.AST.Dump, then removed)tests/t_classmethod.mod produced an NkClassDecl (op 0) with
NkFieldDecl[x, y] and methods Set/Sum/CopyX, plus the
implementation NkClassDecl (op 1) whose methods carry their bodies.
Step 2 (imports, CLASS, nested modules) is now complete. Remaining:
the Lower walk + .ssa byte-compare, and the MaxChild cap on
CASE arms / WITH designators / call actuals.