-- AMModel.mesa -- Last Modified On July 6, 1983 6:44 pm By Paul Rovner -- HOLES: nested procedures. nested configs. multiple sections of the same source. DIRECTORY BcdDefs USING [VersionStamp], Rope USING [ROPE], SafeStorage USING [Type], WorldVM USING [World]; AMModel: DEFINITIONS = { OPEN Rope, SafeStorage, WorldVM; -- TYPEs Class: TYPE = {world, model, prog, interface, proc, statement}; -- objects of concern herein Source: TYPE = REF SourceObj; -- range in a source file SourceObj: TYPE = RECORD[ fileName: ROPE _ NIL, -- without path, e.g. foo.mesa class: Class, versionStamp: BcdDefs.VersionStamp, sourceRange: SELECT tag: * FROM entire => [], field => [firstCharIndex: CharIndex _ 0, lastCharIndex: CharIndex _ 0 -- lastCharIndex < firstCharIndex -- means empty range ] ENDCASE ]; CharIndex: TYPE = INT; -- into a source file. The first char has index = 0. IRIndex: TYPE = INT; -- into an interface instance. -- The first item has index = 1 (AMTypes convention). Section: TYPE = REF SectionObj; SectionObj: TYPE; -- opaque -- A Section represents one of: -- binder output bundle for a config [class = model] -- (someday modeller output bundle for a model) -- compiler output bundle for a prog module [class = prog] -- compiler output bundle for a DEFs module [class = interface] -- compiler output bundle for a proc [class = proc] -- compiler output bundle for a statement [class = statement] Context: TYPE = REF ANY; -- Context should be opaque, but convenient this way for now -- A Context represents one of: -- world [class = world] -- loadstate entry [class = model] -- global frame [class = prog] -- interface record [class = interface] -- local frame [class = proc] -- local frame and PC [class = statement] PartialInterfaceInstance: TYPE = RECORD[ir: --interface--Context, usingList: LIST OF IRIndex]; -- PROCs ... RootContext: PROC[world: World] RETURNS[Context]; -- a "rootContext" represents a "loadstate" model of an entire running Cedar world. -- Immediate children are its top-level Contexts: loadstate entries for -- individually loaded program modules and bound configs (someday models). -- Truth: ContextClass[RootContext] = world. -- ... dealing with Source FileSource: PROC[fileName: ROPE, class: --model, prog, interface--Class] RETURNS[Source]; SourceFileName: PROC[source: Source] RETURNS[ROPE] = INLINE {RETURN[source.fileName]}; SourceClass: PROC[source: Source] RETURNS[Class] = INLINE {RETURN[source.class]}; SourceVersion: PROC[source: Source] RETURNS[BcdDefs.VersionStamp] = INLINE {RETURN[source.versionStamp]}; SourceSection: PROC[source: Source, context: --worldRoot or model--Context] RETURNS[section: Section, contexts: LIST OF --prog--Context]; -- Use SourceSection to figure out (given a proc or statement source location) -- where to place a breakpoint (and in which world). -- The list of prog Contexts returned by SourceSection is meaningful for -- prog, proc and statement sources. It will be ordered "most-recently-loaded first". -- Strictly speaking, a source can have multiple sections: one for each set of "SectionParams". -- Someday we'll accommodate this, but not this week. -- ... dealing with Sections SectionClass: PROC[section: Section] RETURNS[Class]; SectionName: PROC[section: Section] RETURNS[ROPE]; -- e.g. config name, prog or interface module name, proc name; -- for statements: procName. SectionType: PROC[section: Section] RETURNS[--procedure--Type]; -- Implemented only for proc sections SectionVersion: PROC[section: Section] RETURNS[BcdDefs.VersionStamp]; SectionSource: PROC[section: Section] RETURNS[Source]; -- param to creator of section. SectionParams: PROC[section: Section] RETURNS[LIST OF --interface-- Type]; -- ditto (e.g. DIRECTORY entries) -- Will be implemented only for model, prog and interface sections. SectionChildren: PROC[section: Section, proc: PROC[Section] RETURNS[stop: BOOL]] RETURNS[ans: Section _ NIL--NIL if not stopped--]; -- an enumerator. -- children: modules of a model, procs of a module, statements of a proc ParentSection: PROC[section: Section] RETURNS[Section]; -- container: -- prog module for a proc -- proc for a statement -- ... dealing with Contexts -- Entry to this stuff: -- a tv for a global frame (TypeClass = globalFrame) has class = prog -- a tv for a local frame (TypeClass = localFrame) has class = proc ContextClass: PROC[context: Context] RETURNS[Class]; ContextWorld: PROC[context: Context] RETURNS[World]; ContextName: PROC[context: Context] RETURNS[ROPE]; -- world => worldName -- model => :ConfigIndex# -- prog => :gfh# -- interface => -- proc => :fh# -- statement => :FGT# MostRecentNamedContext: PROC[name: ROPE, context: --world or model--Context] RETURNS[Context]; -- EXAMPLE USAGE: given a module name and a world context, this returns -- a Context for the most recently loaded global frame for a program with that name. -- name must identify -- a model or prog (someday interface) if context identifies a world, or -- a prog (someday interface) if context identifies a model. -- The format of the name should be the same as that produced by ContextName, -- with elided fields meaning "don't care". -- The result will be either a model or prog (someday interface) context. NamedContexts: PROC[name: ROPE, context: --worldRoot or model--Context, proc: PROC[Context] RETURNS[stop: BOOL]] RETURNS[Context--NIL if not stopped--]; -- an enumerator. -- Like MostRecentNamedContext, but gets 'em all. ContextSection: PROC[context: Context] RETURNS[Section]; --param to creator of context ParentContext: PROC[context: Context] RETURNS[Context]; -- world => NIL -- model => world -- prog => model -- proc => prog -- statement => proc ContextChildren: PROC[context: Context, proc: PROC[Context] RETURNS[stop: BOOL]] RETURNS[Context--NIL if not stopped--]; -- an enumerator -- world -> models or progs (TVs for global frames), -- model -> progs, -- proc -> statement (proc will be called only once) -- ... dealing with interfaces InterfaceRecords: PROC[world: Context] RETURNS[LIST OF --interface--Context]; Imports: PROC[context: Context] RETURNS[LIST OF PartialInterfaceInstance]; -- Implemented only for model and prog contexts Exports: PROC[context: Context] RETURNS[LIST OF PartialInterfaceInstance]; -- Implemented only for model and prog contexts }. Κι– "Mesa" style˜IprocšΧΟc›œΟk œ žœžœžœžœžœž œžœ œ žœ6œ žœžœ œ žœžœ žœžœœ¨žœžœΑ"œBœužœ3žœžœ5œžœžœ œ6œžœžœžœ œ œ<œ0œBœGœ;œEœ žœžœžœ>œ œ œ*œ&œ/œ%œ1œžœžœ œžœžœ œΟn œžœžœTœHœKœ-œœŸ œžœ žœ œžœ ŸœžœžœžœžœžœŸ œžœžœ žœžœŸ œžœžœžœžœŸ œžœœžœžœžœœOœ5œIœ[œ`œ6œœŸ œžœžœŸ œžœžœžœ @œ&œŸ œžœžœ œ &œŸœžœžœŸ œžœžœ œŸ œžœžœžœžœ œ "œDœŸœžœžœ žœžœ žœžœœIœŸ œžœžœœ œ œœœFœDœŸ œžœžœŸ œžœžœ Ÿ œžœžœžœœœ œœœ)œœœ>œŸœžœžœ œžœIœUœœ Iœ =œƒœJœ Ÿ œžœžœ'œ+žœ žœžœ žœœœ7œŸœžœžœœŸ œžœžœœœœœœŸœžœžœ žœžœ žœœœ5œœ5œœŸœžœžœžœžœ œ Ÿœžœžœžœžœ$0œŸœžœžœžœžœ$0œ˜=—…—„"s