FakeCompiler.mesa
Last edited by Bruce; 13-Jan-81 16:56:24
Last edited by Lewis on 13-Jan-81 17:12:26
Last edited by Sweet on 13-Feb-81 15:07:17
Last edited by Satterthwaite on 5-May-82 15:50:32
Last Edited by: Maxwell, August 4, 1983 1:06 pm
DIRECTORY
Alloc: TYPE USING [Base, Index, Handle, Notifier, OrderedIndex, Selector],
CBinary: TYPE USING [DebugTab],
CompilerUtil: TYPE USING [StreamId, TableId],
ConvertUnsafe: TYPE USING [String],
IO: TYPE USING [STREAM],
ListerDefs: TYPE USING [AddNotify, Bounds, DropNotify],
OutputDefs: TYPE USING [GetOutputStream],
Runtime: TYPE USING [GetTableBase, GlobalFrame],
Tree: TYPE USING [Base, Index, Link, Node, Scan, Null, NullIndex, treeType],
TreeOps: TYPE USING [];
FakeCompiler:
PROGRAM
IMPORTS CBinary, ListerDefs, OutputDefs, Runtime
EXPORTS CompilerUtil, Alloc, TreeOps = {
TreeOps
EndIndex: Tree.Index = LAST[Tree.Index];
EndMark: Tree.Link = [subtree[index: EndIndex]];
tb: PRIVATE Tree.Base; -- tree base
UpdateBase: PRIVATE Alloc.Notifier = {tb ← base[Tree.treeType]};
Initialize:
PUBLIC
PROC [Alloc.Handle,
UNCOUNTED
ZONE] = {
AddNotify[NIL, UpdateBase]};
Finalize: PUBLIC PROC = {DropNotify[NIL, UpdateBase]};
ScanSons:
PUBLIC
PROC [root: Tree.Link, action: Tree.Scan] = {
IF root # Tree.Null
THEN
WITH root
SELECT
FROM
subtree => {
node: Tree.Index = index;
FOR i:
CARDINAL
IN [1 .. SonCount[node]]
DO
action[tb[node].son[i]] ENDLOOP};
ENDCASE;
RETURN};
SonCount:
PRIVATE
PROC [node: Tree.Index]
RETURNS [
CARDINAL] = {
RETURN [
SELECT node
FROM
Tree.NullIndex, EndIndex => 0,
ENDCASE =>
IF tb[node].name = list
AND tb[node].nSons = 0
THEN ListLength[[subtree[index: node]]] + 1
ELSE tb[node].nSons]};
ListLength:
PUBLIC
PROC [t: Tree.Link]
RETURNS [
CARDINAL] = {
IF t = Tree.Null THEN RETURN [0];
WITH t
SELECT
FROM
subtree => {
node: Tree.Index = index;
n: CARDINAL;
IF tb[node].name # list THEN RETURN [1];
n ← tb[node].nSons;
IF n # 0 THEN RETURN [n];
FOR i:
CARDINAL ← 1, i+1
UNTIL tb[node].son[i] = EndMark
DO
n ← n+1 ENDLOOP;
RETURN [n]};
ENDCASE => RETURN [1]};
GetNode:
PUBLIC
PROC [t: Tree.Link]
RETURNS [Tree.Index] = {
RETURN [WITH t SELECT FROM subtree => index, ENDCASE => ERROR]};
Alloc
Failure: PUBLIC ERROR [h: Alloc.Handle, table: Alloc.Selector] = CODE;
GetChunk:
PUBLIC
PROC [h: Alloc.Handle, size:
CARDINAL, table: Alloc.Selector]
RETURNS [Alloc.Index] = {
IF table # Tree.treeType OR size # SIZE[Tree.Node] THEN ERROR; -- called to reserve empty
RETURN [FIRST[Alloc.Index]]};
FreeChunk:
PUBLIC
PROC [
h: Alloc.Handle, index: Alloc.Index, size: CARDINAL, table: Alloc.Selector] = {};
Words:
PUBLIC
PROC [h: Alloc.Handle, table: Alloc.Selector, size:
CARDINAL]
RETURNS [Alloc.OrderedIndex] = {ERROR};
AddNotify:
PUBLIC
PROC [h: Alloc.Handle, proc: Alloc.Notifier] = {
ListerDefs.AddNotify[proc]};
DropNotify:
PUBLIC
PROC [h: Alloc.Handle, proc: Alloc.Notifier] = {
ListerDefs.DropNotify[proc]};
Bounds:
PUBLIC
PROC [h: Alloc.Handle, table: Alloc.Selector]
RETURNS [base: Alloc.Base, size: CARDINAL] = {
[base, size] ← ListerDefs.Bounds[table]};
CompilerUtil
AcquireTable:
PUBLIC
PROC [id: CompilerUtil.TableId]
RETURNS [
LONG
POINTER] = {
RETURN[
IF id # debug THEN NIL
ELSE Runtime.GetTableBase[Runtime.GlobalFrame[CBinary.DebugTab]]]};
ReleaseTable: PUBLIC PROC [CompilerUtil.TableId] = {};
AcquireStream:
PUBLIC
PROC [id: CompilerUtil.StreamId]
RETURNS [
IO.
STREAM] = {
RETURN[IF id = log THEN OutputDefs.GetOutputStream[] ELSE NIL]};
ReleaseStream: PUBLIC PROC [CompilerUtil.StreamId] = {};
}.