<<>> <> <> <> <> 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.