-- AMModel.mesa -- Last Modified On October 25, 1982 11:00 am By Paul Rovner -- HOLES: nested procedures. nested configs. multiple sections of the same source. DIRECTORY Rope USING [ROPE], RTBasic USING [Type], TimeStamp USING [Stamp], WorldVM USING [World]; AMModel: DEFINITIONS = { OPEN Rope, RTBasic, 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: TimeStamp.Stamp, 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: Context--class = interface--, 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 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[TimeStamp.Stamp] = 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[TimeStamp.Stamp]; 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 PartialInterfaceInstances 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œ Ÿœžœ2œ+žœ žœžœ žœœœ7œŸœžœžœœŸ œžœžœœœœœœŸœžœžœ žœžœ žœœœ5œœ5œ.œŸœžœžœžœžœ$0œŸœžœžœžœžœ$0œ˜”<—…—!Ρ