-- file Symbols.Mesa
-- last modified by Satterthwaite, October 30, 1979 3:20 PM
DIRECTORY
AltoDefs: FROM "altodefs" USING [VMLimit, wordlength],
BcdDefs: FROM "bcddefs" USING [VersionStamp],
Table: FROM "table" USING [Base, Selector, Limit];
Symbols: DEFINITIONS =
BEGIN
-- hash table declarations
HVLength: PRIVATE CARDINAL = 71;
HVIndex: TYPE = CARDINAL [0..HVLength);
HTRecord: TYPE = RECORD [
anyInternal, anyPublic: BOOLEAN,
link: HTIndex,
ssIndex: CARDINAL];
HTIndex: TYPE = CARDINAL [0..Table.Limit/2);
HTNull: HTIndex = FIRST[HTIndex];
-- semantic entry table declarations
TypeClass: TYPE = {
mode,
basic,
enumerated,
record,
pointer,
array,
arraydesc,
transfer,
definition,
union,
relative,
subrange,
long,
real,
unique,
nil
};
TransferMode: TYPE = {procedure, port, signal, error, process, program, none};
SERecord: TYPE = RECORD [
mark3, mark4: BOOLEAN,
body: SELECT seTag: * FROM
id => [
extended: BOOLEAN,
public: BOOLEAN,
idCtx: CTXIndex,
immutable, constant: BOOLEAN,
idType: SEIndex,
idInfo: UNSPECIFIED,
idValue: UNSPECIFIED,
hash: HTIndex,
linkSpace: BOOLEAN,
ctxLink: SELECT linkTag: * FROM
terminal => NULL,
sequential => NULL,
linked => [link: ISEIndex],
ENDCASE],
cons => [
typeInfo: SELECT typeTag: TypeClass FROM
mode => NULL,
basic => [
ordered: BOOLEAN,
code: [0..16),
length: CARDINAL],
enumerated => [
ordered: BOOLEAN,
valueCtx: CTXIndex,
nValues: CARDINAL],
record => [
machineDep: BOOLEAN,
monitored: BOOLEAN,
argument: BOOLEAN,
hints: RECORD [
variant: BOOLEAN,
unifield: BOOLEAN,
comparable: BOOLEAN,
privateFields: BOOLEAN],
lengthUsed: BOOLEAN,
length: CARDINAL,
fieldCtx: CTXIndex,
linkPart: SELECT linkTag: * FROM
notLinked => NULL,
linked => [linkType: SEIndex],
ENDCASE],
pointer => [
ordered, readOnly, basing: BOOLEAN,
dereferenced: BOOLEAN,
refType: SEIndex],
array => [
oldPacked: BOOLEAN,
comparable: BOOLEAN,
lengthUsed: BOOLEAN,
indexType: SEIndex,
componentType: SEIndex],
arraydesc => [
readOnly: BOOLEAN,
describedType: SEIndex],
transfer => [
mode: TransferMode,
inRecord, outRecord: RecordSEIndex],
definition => [
nGfi: [1 .. 4],
named: BOOLEAN,
defCtx: CTXIndex],
union => [
equalLengths: BOOLEAN,
caseCtx: CTXIndex,
overlayed, controlled: BOOLEAN,
tagSei: ISEIndex],
relative => [
baseType: SEIndex,
offsetType: SEIndex,
resultType: SEIndex],
subrange => [
filled, empty, flexible: BOOLEAN,
rangeType: SEIndex,
origin: INTEGER,
range: CARDINAL],
long, real => [rangeType: SEIndex],
unique => [
virtual, opaque: BOOLEAN,
lengthKnown, lengthUsed: BOOLEAN,
link: SEIndex,
length: CARDINAL],
nil => NULL,
ENDCASE],
ENDCASE];
SEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO SERecord;
ISEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO id SERecord;
CSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO cons SERecord;
RecordSEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO record cons SERecord;
ArraySEIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO array cons SERecord;
SENull: SEIndex = FIRST[SEIndex];
ISENull: ISEIndex = LOOPHOLE[SENull];
CSENull: CSEIndex = LOOPHOLE[SENull];
RecordSENull: RecordSEIndex = LOOPHOLE[SENull];
ArraySENull: ArraySEIndex = LOOPHOLE[SENull];
-- the following two values are guaranteed by the compiler
typeTYPE: CSEIndex = FIRST[CSEIndex] + SIZE[nil cons SERecord];
typeANY: CSEIndex = typeTYPE + SIZE[mode cons SERecord];
-- codes identifying the basic types (extensible)
codeANY: CARDINAL = 0;
codeINTEGER: CARDINAL = 1;
codeCHARACTER: CARDINAL = 2;
BitAddress: TYPE = RECORD[
wd: [0..AltoDefs.VMLimit/AltoDefs.wordlength], -- word displacement
bd: [0..AltoDefs.wordlength)]; -- bit displacement
ExtensionType: TYPE = {value, form, default, none};
Linkage: TYPE = {val, ref, manifest, none}; -- for import/export
-- context table declarations
ContextLevel: TYPE = [0..7];
lZ: ContextLevel = 0; -- context level of non-frame records
lG: ContextLevel = 1; -- context level of global frame
lL: ContextLevel = lG+1; -- context level of outer procedures
CTXRecord: TYPE = RECORD [
mark, varUpdated: BOOLEAN,
seList: ISEIndex,
level: ContextLevel,
extension: SELECT ctxType: * FROM
simple => [ctxNew: CTXIndex], -- for DeSoto
included => [
chain: IncludedCTXIndex,
module: MDIndex,
map: CTXIndex,
closed, complete, restricted: BOOLEAN,
reset: BOOLEAN],
imported => [includeLink: IncludedCTXIndex],
nil => NULL,
ENDCASE];
CTXIndex: TYPE = Table.Base RELATIVE ORDERED POINTER [0..3777B] TO CTXRecord;
IncludedCTXIndex: TYPE = Table.Base RELATIVE ORDERED POINTER [0..3777B] TO included CTXRecord;
CTXNull: CTXIndex = FIRST[CTXIndex];
IncludedCTXNull: IncludedCTXIndex = LOOPHOLE[CTXNull];
StandardContext: TYPE = CTXIndex[CTXNull..CTXNull+5*SIZE[simple CTXRecord]];
-- module table declarations
FileIndex: TYPE = [0..77777B]; -- internal file handle
NullFileIndex: FileIndex = LAST[FileIndex];
MDRecord: TYPE = RECORD [
stamp: BcdDefs.VersionStamp,
moduleId: HTIndex, -- hash entry for module name
fileId: HTIndex, -- hash entry for file name
shared: BOOLEAN, -- overrides PRIVATE, etc.
exported: BOOLEAN,
ctx: IncludedCTXIndex, -- context of copied entries
defaultImport: CTXIndex, -- unnamed imported instance
file: FileIndex]; -- associated file
MDIndex: TYPE = Table.Base RELATIVE ORDERED POINTER [0..Table.Limit) TO MDRecord;
MDNull: MDIndex = LAST[MDIndex];
OwnMdi: MDIndex = FIRST[MDIndex];
-- body table declarations
BodyLink: TYPE = RECORD [which: {sibling, parent}, index: BTIndex];
BodyRecord: TYPE = RECORD [
link: BodyLink,
firstSon: BTIndex,
localCtx: CTXIndex,
level: ContextLevel,
info: BodyInfo,
extension: SELECT kind: * FROM
Callable => [
inline: BOOLEAN,
id: ISEIndex,
ioType: CSEIndex,
monitored, stopping, resident: BOOLEAN,
entry, internal: BOOLEAN,
entryIndex: [0..128),
hints: RECORD [safe, argUpdated, nameSafe, attr4, attr5: BOOLEAN],
closure: SELECT nesting: * FROM
Outer => NULL,
Inner => [frameOffset: [0..AltoDefs.VMLimit]],
ENDCASE],
Other => NULL,
ENDCASE];
BodyInfo: TYPE = RECORD [
SELECT mark: * FROM
Internal => [
bodyTree: Table.Base RELATIVE POINTER [0..Table.Limit),
--Tree.Index--
sourceIndex: CARDINAL,
thread: Table.Base RELATIVE POINTER [0..Table.Limit),
--Tree.Index / LitDefs.STIndex--
frameSize: [0..4096)],
External => [
origin: [0..AltoDefs.VMLimit/2],
bytes: CARDINAL,
startIndex, indexLength: CARDINAL],
ENDCASE];
BTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO BodyRecord;
CBTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Callable BodyRecord;
ICBTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Inner Callable BodyRecord;
OCBTIndex: TYPE = Table.Base RELATIVE POINTER [0..Table.Limit) TO Outer Callable BodyRecord;
BTNull: BTIndex = LAST[BTIndex];
CBTNull: CBTIndex = LOOPHOLE[BTNull];
-- allocation codes for table components
seType: Table.Selector = 1;
htType: Table.Selector = 2;
ssType: Table.Selector = 3;
ctxType: Table.Selector = 4;
mdType: Table.Selector = 5;
bodyType: Table.Selector = 6;
END.