C2CStartTheMessImpl.mesa
Copyright Ó 1990, 1991, 1992 by Xerox Corporation. All rights reserved.
Christian Jacobi, October 4, 1990 4:39:20 pm PDT
Christian Jacobi, October 5, 1990 2:34:34 pm PDT
DIRECTORY
C2CAccess,
C2CAccessInternal,
C2CBasics,
C2CDefs,
C2CEmit,
C2CMain,
C2CNames,
C2CSourcePositions,
IntCodeDefs,
IntCodeUtils,
IO,
Rope,
RuntimeError,
SymTab;
C2CStartTheMessImpl: CEDAR PROGRAM
IMPORTS C2CAccess, C2CAccessInternal, C2CBasics, C2CEmit, C2CMain, C2CNames, C2CSourcePositions, IntCodeUtils, IO, RuntimeError =
BEGIN
DestroyNode: PROC [node: IntCodeDefs.Node] = {
--just in case node would have circularities
DestroyLabels: IntCodeUtils.Visitor = {
next: IntCodeDefs.Node ¬ NIL;
WITH node SELECT FROM
label: IntCodeDefs.LabelNode =>
IF label.label#NIL THEN {
next ¬ label.label.node; label.label.node¬NIL; label.label¬NIL;
};
ENDCASE => {};
IntCodeUtils.MapNode[node, DestroyLabels];
IF next#NIL THEN IntCodeUtils.MapNode[next, DestroyLabels];
RETURN [node];
};
VisitLambdas: IntCodeUtils.Visitor = {
--for each lambda call DestroyLabels
WITH node SELECT FROM
lambda: IntCodeDefs.LambdaNode => {
IntCodeUtils.MapNode[node, DestroyLabels];
lambda.parent ¬ NIL;
lambda.body ¬ NIL;
RETURN [NIL]; --dont recurse on lambdas
};
ENDCASE => {};
IntCodeUtils.MapNode[node, VisitLambdas];
RETURN [node];
};
[] ¬ VisitLambdas[node];
[] ¬ DestroyLabels[node];
};
MaybeDestroy: PROC [] = {
IF C2CAccess.params.destroyRoot THEN
DestroyNode[C2CAccess.params.root];
};
StartC2C: PROC = {
innerFailed: BOOL ¬ FALSE;
resultCode: C2CEmit.Code;
externProcs: SymTab.Ref ¬ NIL;
Inner: PROC [] = {
ENABLE {
C2CBasics.FatalError => {
err: IO.STREAM ¬ C2CBasics.ErrorStream[];
errMsg: Rope.ROPE ¬ IO.PutFR["--fatal error at %g \n %g \n", IO.rope[C2CSourcePositions.CurrentPosAsRope[]], IO.rope[what]];
IO.PutRope[err, errMsg];
innerFailed ¬ TRUE;
IF ~C2CAccess.params.debuggingMode THEN GOTO Oops;
};
RuntimeError.UNCAUGHT => {
err: IO.STREAM ¬ C2CBasics.ErrorStream[];
errMsg: Rope.ROPE ¬ IO.PutFR1[" --uncaught error at %g ", IO.rope[C2CSourcePositions.CurrentPosAsRope[]]];
IO.PutRope[err, errMsg];
innerFailed ¬ TRUE;
IF ~C2CAccess.params.debuggingMode THEN GOTO Oops;
};
ABORTED => MaybeDestroy[];
};
IF C2CAccess.params.namesStream#NIL THEN {
externProcs ¬ C2CNames.ScanExterns[C2CAccess.params.namesStream];
};
C2CNames.AssociateNames[C2CAccess.params.names, C2CAccess.params.labels, externProcs];
resultCode ¬ C2CMain.C2CRoot[];
IF innerFailed THEN
resultCode ¬ C2CEmit.Cat["COMPILE TIME ERROR(S)\n", resultCode];
C2CEmit.ProcessAndOutputCode[C2CAccess.params.outputStream, C2CAccess.params.lineNumberStream, resultCode, C2CAccess.params.lineTerminationChar];
EXITS Oops => {innerFailed ¬ TRUE};
};
Inner[];
MaybeDestroy[];
};
C2CAccessInternal.RegisterThisToBeC2C[StartC2C];
END.