Debug: module { PATH: con "/dis/lib/debug.dis"; Pos: adt { file: string; line: int; # line number: origin 1 pos: int; # character within the line: origin 0 }; Src: adt { start: Pos; # range within source files stop: Pos; }; Id: adt { src: ref Src; name: string; offset: int; # start of pc, offset in frame, etc stoppc: int; # limit pc of function t: ref Type; }; Type: adt { src: ref Src; kind: int; size: int; name: string; # for adts, modules Of: ref Type; # for lists, arrays, etc. ids: list of ref Id; # for adts, etc. locals for fns }; Sym: adt { path: string; name: string; # implements name src: array of ref Src; srcstmt: array of int; adts: array of ref Type; fns: array of ref Id; vars: list of ref Id; srctopc: fn(s: self ref Sym, src: ref Src): int; pctosrc: fn(s: self ref Sym, pc: int): ref Src; }; Module: adt { path: string; # from whence loaded code: int; # address of code start data: int; # address of data comp: int; # compiled to native assembler? sym: ref Sym; addsym: fn(m: self ref Module, sym: ref Sym); stdsym: fn(m: self ref Module); dis: fn(m: self ref Module): string; sbl: fn(m: self ref Module): string; }; StepExp, StepStmt, StepOver, StepOut: con iota; Prog: adt { id: int; heap: ref Sys->FD; # prog heap file ctl: ref Sys->FD; # prog control file dbgctl: ref Sys->FD; # debug file stk: ref Sys->FD; # stack file status: fn(p: self ref Prog): (int, string, string, string); stack: fn(p: self ref Prog): (array of ref Exp, string); step: fn(p: self ref Prog, how: int): string; cont: fn(p: self ref Prog): string; grab: fn(p: self ref Prog): string; start: fn(p: self ref Prog): string; stop: fn(p: self ref Prog): string; unstop: fn(p: self ref Prog): string; kill: fn(p: self ref Prog): string; event: fn(p: self ref Prog): string; setbpt: fn(p: self ref Prog, dis: string, pc: int): string; delbpt: fn(p: self ref Prog, dis: string, pc: int): string; }; Exp: adt { name: string; offset: int; pc: int; m: ref Module; p: ref Prog; # this is private id: ref Id; expand: fn(e: self ref Exp): array of ref Exp; val: fn(e: self ref Exp): (string, int); src: fn(e: self ref Exp): ref Src; findsym:fn(e: self ref Exp): string; srcstr: fn(e: self ref Exp): string; }; init: fn(): int; sym: fn(sbl: string): (ref Sym, string); prog: fn(pid: int): (ref Prog, string); startprog: fn(dis, dir: string, ctxt: ref Draw->Context, argv: list of string): (ref Prog, string); };