Skip to content

Commit

Permalink
* issue #127: order of calling CLOSE sections, step 3.
Browse files Browse the repository at this point in the history
  • Loading branch information
Oleg-N-Cher committed Dec 28, 2024
1 parent eed22bd commit a6c5e21
Show file tree
Hide file tree
Showing 9 changed files with 27 additions and 28 deletions.
46 changes: 24 additions & 22 deletions Mod/OfrontOPC.cp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@

VAR
indentLevel: INTEGER;
ptrinit, mainprog, ansi, oldc, dynlib, windows: BOOLEAN;
ptrinit, mainprog, ansi, oldc, dynlib, windows, retmain*: BOOLEAN;
hashtab: ARRAY 169 OF SHORTINT;
keytab: ARRAY 37, 9 OF SHORTCHAR;
GlbPtrs: BOOLEAN;
Expand All @@ -118,6 +118,7 @@
oldc := OPM.oldc IN OPM.opt;
dynlib := OPM.dynlib IN OPM.opt;
windows := FALSE;
retmain := FALSE;
IF ansi THEN
BodyNameExt := "__init (void)"; CloseNameExt := "__close (void)"
ELSE
Expand Down Expand Up @@ -1283,13 +1284,13 @@
IF dynlib THEN OPM.WriteString(EXTERN) ELSE OPM.WriteString(Extern) END;
OPM.WriteString("void *");
OPM.WriteString(OPM.modName); OPM.WriteString(BodyNameExt);
EndStat
END;
IF OPM.close IN OPM.opt THEN
IF dynlib THEN OPM.WriteString(EXTERN) ELSE OPM.WriteString(Extern) END;
OPM.WriteString("void ");
OPM.WriteString(OPM.modName); OPM.WriteString(CloseNameExt);
EndStat
EndStat;
IF OPM.close IN OPM.opt THEN
IF dynlib THEN OPM.WriteString(EXTERN) ELSE OPM.WriteString(Extern) END;
OPM.WriteString("void ");
OPM.WriteString(OPM.modName); OPM.WriteString(CloseNameExt);
EndStat
END
END;
OPM.WriteLn;
CProcDefs(OPT.topScope^.right, 1); OPM.WriteLn
Expand Down Expand Up @@ -1346,7 +1347,7 @@
GenDynTypes(n, internal); OPM.WriteLn;
ProcPredefs(OPT.topScope^.right, 0); OPM.WriteLn;
CProcDefs(OPT.topScope^.right, 0); OPM.WriteLn;
IF mainprog & ~dynlib & (OPM.close IN OPM.opt) THEN
IF mainprog & ~dynlib & (OPM.close IN OPM.opt) & ~(OPM.noinit IN OPM.opt) THEN
OPM.WriteString("static void ");
OPM.WriteString(OPM.modName); OPM.WriteString(CloseNameExt);
EndStat; OPM.WriteLn
Expand All @@ -1369,14 +1370,14 @@
END
END RegCmds;

PROCEDURE InitImports(obj: OPT.Object);
PROCEDURE InitImports (obj: OPT.Object);
BEGIN
IF obj # NIL THEN
InitImports(obj^.left);
IF (obj^.mode = Mod) & (obj^.mnolev # 0) & ~ODD(OPT.GlbMod[-obj^.mnolev].sysflag) THEN
BegStat; OPM.WriteString("__IMPORT(");
OPM.WriteString(OPT.GlbMod[-obj^.mnolev].name^); OPM.WriteString("__init");
OPM.Write(CloseParen); EndStat
OPM.WriteString(OPT.GlbMod[-obj^.mnolev].name^); OPM.WriteString("__init);");
OPM.WriteLn
END;
InitImports(obj^.right)
END
Expand Down Expand Up @@ -1454,16 +1455,15 @@
IF OPM.modName # "SYSTEM" THEN RegCmds(OPT.topScope) END
END EnterBody;

PROCEDURE DoClose* (obj: OPT.Object);
PROCEDURE DoClose (obj: OPT.Object);
BEGIN
IF obj # NIL THEN
DoClose(obj^.left);
IF (obj^.mode = Mod) & ODD(OPT.GlbMod[-obj^.mnolev].sysflag DIV doClose) THEN
BegStat;
OPM.WriteString("__CLOSE(");
BegStat; OPM.WriteString("__CLOSE(");
OPM.WriteString(OPT.GlbMod[-obj^.mnolev].name^); OPM.WriteString("__init, ");
OPM.WriteString(OPT.GlbMod[-obj^.mnolev].name^); OPM.WriteString("__close)");
EndStat
OPM.WriteString(OPT.GlbMod[-obj^.mnolev].name^); OPM.WriteString("__close);");
OPM.WriteLn
END;
DoClose(obj^.right)
END
Expand All @@ -1472,14 +1472,15 @@
PROCEDURE ExitBody*;
BEGIN
IF ~(mainprog & dynlib) THEN
IF retmain THEN retmain := FALSE; OPM.WriteString("return__:"); OPM.WriteLn END;
BegStat;
IF mainprog THEN
IF OPM.close IN OPM.opt THEN
BegStat;
OPM.WriteString(OPM.modName); OPM.WriteString("__close()");
EndStat
OPM.WriteString(OPM.modName); OPM.WriteString("__close();");
OPM.WriteLn; BegStat
END;
BegStat; OPM.WriteString("__FINI;")
ELSE BegStat; OPM.WriteString("__ENDMOD;")
OPM.WriteString("__FINI;")
ELSE OPM.WriteString("__ENDMOD;")
END;
OPM.WriteLn
END;
Expand All @@ -1501,6 +1502,7 @@

PROCEDURE ExitClose*;
BEGIN
IF retmain THEN retmain := FALSE; OPM.WriteString("return__: "); OPM.WriteLn END;
DoClose(OPT.topScope^.right); EndBlk
END ExitClose;

Expand Down
2 changes: 1 addition & 1 deletion Mod/OfrontOPP.cp
Original file line number Diff line number Diff line change
Expand Up @@ -2131,7 +2131,7 @@ PROCEDURE Factor(VAR x: OPT.Node);
IF OPM.noerr THEN TDinit := NIL; lastTDinit := NIL; c := OPM.errpos;
Block(procdec, statseq); OPB.Enter(procdec, statseq, NIL); prog := procdec;
prog^.conval := OPT.NewConst(); prog^.conval^.intval := c;
IF sym = close THEN
IF (sym = close) & ~(OPM.noinit IN OPM.opt) THEN
INCL(OPM.opt, OPM.close); OPS.Get(sym); StatSeq(prog.link)
END;
CheckSym(end);
Expand Down
2 changes: 1 addition & 1 deletion Mod/OfrontOPT.cp
Original file line number Diff line number Diff line change
Expand Up @@ -625,8 +625,8 @@ MODULE OfrontOPT; (* NW, RC 6.3.89 / 23.1.92 *) (* object model 24.2.94 *)
IF mn = 0 THEN mno := impCtxt.glbmno[0]
ELSE
IF mn = Ssys THEN
INCL(OPM.opt, OPM.close);
sysflag := SHORT(SHORT(SHORT(OPM.SymRInt())));
IF ODD(sysflag DIV doClose) & ~impCtxt.self THEN INCL(OPM.opt, OPM.close) END;
mn := SHORT(OPM.SymRInt())
ELSE
sysflag := 0
Expand Down
5 changes: 1 addition & 4 deletions Mod/OfrontOPV.cp
Original file line number Diff line number Diff line change
Expand Up @@ -1417,10 +1417,7 @@
OPM.WriteString("goto exit__"); OPM.WriteInt(exit.label)
END
| Nreturn:
IF OPM.level = 0 THEN
IF mainprog THEN OPC.DoClose(OPT.topScope^.right); OPM.WriteString("__FINI")
ELSE OPM.WriteString("__ENDMOD")
END
IF OPM.level = 0 THEN OPC.retmain := TRUE; OPM.WriteString("goto return__")
ELSIF OPC.NeedsRetval(outerProc) THEN
OPM.WriteString("__retval = ");
IF (n^.left^.typ^.form = Pointer) & (n^.obj^.typ # n^.left^.typ) THEN
Expand Down
Binary file modified Target/BlackBox/Mod/OPC.odc
Binary file not shown.
Binary file modified Target/BlackBox/Mod/OPP.odc
Binary file not shown.
Binary file modified Target/BlackBox/Mod/OPT.odc
Binary file not shown.
Binary file modified Target/BlackBox/Mod/OPV.odc
Binary file not shown.
Binary file modified Target/Win32/ofront+.exe
Binary file not shown.

0 comments on commit a6c5e21

Please sign in to comment.