Fix Platform initialisation, move common Arg handling code from Platfrom to Modules.

This commit is contained in:
David Brown 2016-12-01 18:08:08 +00:00
parent aed9134e99
commit 299b0636ad
9 changed files with 99 additions and 162 deletions

View file

@ -4,7 +4,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
31.1.2007 jt synchronized with BlackBox version, in particular PromoteIntConstToLInt added 31.1.2007 jt synchronized with BlackBox version, in particular PromoteIntConstToLInt added
*) *)
IMPORT SYSTEM, Texts, Files, Platform, Out, Configuration, VT100, Strings; IMPORT SYSTEM, Texts, Files, Platform, Modules, Out, Configuration, VT100, Strings;
CONST CONST
OptionChar* = "-"; OptionChar* = "-";
@ -233,7 +233,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
PROCEDURE OpenPar*(): BOOLEAN; (* prepare for a sequence of translations *) PROCEDURE OpenPar*(): BOOLEAN; (* prepare for a sequence of translations *)
VAR s: ARRAY 256 OF CHAR; VAR s: ARRAY 256 OF CHAR;
BEGIN BEGIN
IF Platform.ArgCount = 1 THEN IF Modules.ArgCount = 1 THEN
LogWLn; LogWLn;
LogWStr("Oberon-2 compiler v"); LogWStr(Configuration.versionLong); LogW("."); LogWLn; LogWStr("Oberon-2 compiler v"); LogWStr(Configuration.versionLong); LogW("."); LogWLn;
LogWStr("Based on Ofront by J. Templ and Software Templ OEG."); LogWLn; LogWStr("Based on Ofront by J. Templ and Software Templ OEG."); LogWLn;
@ -290,10 +290,10 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
Options := {inxchk, typchk, ptrinit, assert}; (* Default options *) Options := {inxchk, typchk, ptrinit, assert}; (* Default options *)
(* Pick up global option changes from start of command line *) (* Pick up global option changes from start of command line *)
S:=1; s:=""; Platform.GetArg(S, s); S:=1; s:=""; Modules.GetArg(S, s);
WHILE s[0] = OptionChar DO WHILE s[0] = OptionChar DO
ScanOptions(s); ScanOptions(s);
INC(S); s:=""; Platform.GetArg(S, s) INC(S); s:=""; Modules.GetArg(S, s)
END; END;
(* Record global option settings for this command line *) (* Record global option settings for this command line *)
@ -328,10 +328,10 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
BEGIN BEGIN
Options := GlobalOptions; Model:=GlobalModel; Alignment := GlobalAlignment; AddressSize := GlobalAddressSize; Options := GlobalOptions; Model:=GlobalModel; Alignment := GlobalAlignment; AddressSize := GlobalAddressSize;
s:=""; Platform.GetArg(S, s); s:=""; Modules.GetArg(S, s);
WHILE s[0] = OptionChar DO WHILE s[0] = OptionChar DO
ScanOptions(s); ScanOptions(s);
INC(S); s:=""; Platform.GetArg(S, s) INC(S); s:=""; Modules.GetArg(S, s)
END; END;
IF mainlinkstat IN Options THEN INCL(Options, mainprog) END; IF mainlinkstat IN Options THEN INCL(Options, mainprog) END;
@ -369,9 +369,9 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *)
BEGIN BEGIN
done := FALSE; done := FALSE;
curpos := 0; curpos := 0;
IF S >= Platform.ArgCount THEN RETURN END ; IF S >= Modules.ArgCount THEN RETURN END ;
s:=""; Platform.GetArg(S, s); s:=""; Modules.GetArg(S, s);
NEW(T); Texts.Open(T, s); NEW(T); Texts.Open(T, s);
LogWStr(s); LogWStr(" "); LogWStr(s); LogWStr(" ");

View file

@ -3,7 +3,7 @@ MODULE Args; (* jt, 8.12.94 *)
(* command line argument handling for voc (jet backend) *) (* command line argument handling for voc (jet backend) *)
IMPORT Platform, SYSTEM; IMPORT Platform, Modules, SYSTEM;
TYPE TYPE
ArgPtr = POINTER TO ARRAY 1024 OF CHAR; ArgPtr = POINTER TO ARRAY 1024 OF CHAR;
@ -14,9 +14,9 @@ MODULE Args; (* jt, 8.12.94 *)
argv-: SYSTEM.ADDRESS; argv-: SYSTEM.ADDRESS;
PROCEDURE Get* (n: INTEGER; VAR val: ARRAY OF CHAR); BEGIN Platform.GetArg(n, val) END Get; PROCEDURE Get* (n: INTEGER; VAR val: ARRAY OF CHAR); BEGIN Modules.GetArg(n, val) END Get;
PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); BEGIN Platform.GetIntArg(n, val) END GetInt; PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); BEGIN Modules.GetIntArg(n, val) END GetInt;
PROCEDURE Pos* (s: ARRAY OF CHAR): INTEGER; BEGIN RETURN Platform.ArgPos(s) END Pos; PROCEDURE Pos* (s: ARRAY OF CHAR): INTEGER; BEGIN RETURN Modules.ArgPos(s) END Pos;
PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR); PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR);
BEGIN Platform.GetEnv(var, val) END GetEnv; BEGIN Platform.GetEnv(var, val) END GetEnv;
@ -26,6 +26,6 @@ BEGIN RETURN Platform.getEnv(var, val) END getEnv;
BEGIN BEGIN
argc := Platform.ArgCount; argc := Modules.ArgCount;
argv := Platform.ArgVector; argv := Modules.ArgVector;
END Args. END Args.

View file

@ -495,8 +495,8 @@ MODULE Heap;
END END
END FINALL; END FINALL;
PROCEDURE -ExternMainStackFrame "extern ADDRESS Platform_MainStackFrame;"; PROCEDURE -ExternMainStackFrame "extern ADDRESS Modules_MainStackFrame;";
PROCEDURE -PlatformMainStackFrame(): S.ADDRESS "Platform_MainStackFrame"; PROCEDURE -ModulesMainStackFrame(): S.ADDRESS "Modules_MainStackFrame";
PROCEDURE MarkStack(n: S.ADDRESS; VAR cand: ARRAY OF S.ADDRESS); PROCEDURE MarkStack(n: S.ADDRESS; VAR cand: ARRAY OF S.ADDRESS);
VAR VAR
@ -510,7 +510,7 @@ MODULE Heap;
END ; END ;
IF n = 0 THEN IF n = 0 THEN
nofcand := 0; sp := S.ADR(frame); nofcand := 0; sp := S.ADR(frame);
stack0 := PlatformMainStackFrame(); stack0 := ModulesMainStackFrame();
(* check for minimum alignment of pointers *) (* check for minimum alignment of pointers *)
inc := S.ADR(align.p) - S.ADR(align); inc := S.ADR(align.p) - S.ADR(align);
IF sp > stack0 THEN inc := -inc END ; IF sp > stack0 THEN inc := -inc END ;

View file

@ -3,7 +3,7 @@ MODULE Modules; (* jt 6.1.96 *)
(* access to list of modules and commands, based on ETH Oberon *) (* access to list of modules and commands, based on ETH Oberon *)
IMPORT SYSTEM, Heap, Platform; IMPORT SYSTEM, Platform, Heap; (* Note, must import Platform before Heap *)
CONST CONST
ModNameLen* = 20; ModNameLen* = 20;
@ -35,6 +35,66 @@ MODULE Modules; (* jt 6.1.96 *)
resMsg*: ARRAY 256 OF CHAR; resMsg*: ARRAY 256 OF CHAR;
imported*, importing*: ModuleName; imported*, importing*: ModuleName;
MainStackFrame-: SYSTEM.ADDRESS;
ArgCount-: INTEGER;
ArgVector-: SYSTEM.ADDRESS;
(* Program startup *)
PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();";
PROCEDURE -InitHeap "Heap_InitHeap()";
PROCEDURE -ExternInitModulesInit "extern void *Modules__init(void);";
PROCEDURE -ModulesInit() "Modules__init()";
PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS);
(* This start code is called by the __INIT macro generated by the compiler
as the C main program. *)
TYPE ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS;
VAR av: ArgVecPtr;
BEGIN
MainStackFrame := argvadr;
ArgCount := SYSTEM.VAL(INTEGER, argc);
av := SYSTEM.VAL(ArgVecPtr, argvadr);
ArgVector := av[0];
InitHeap; (* Initailse heap varaibles neded for compiler generated *__inits *)
ModulesInit(); (* Our own __init code will run the Platform and Heap __init code. *)
END Init;
PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR);
TYPE
ArgPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgVec = POINTER TO ARRAY 1024 OF ArgPtr;
VAR av: ArgVec;
BEGIN
IF n < ArgCount THEN
av := SYSTEM.VAL(ArgVec, ArgVector);
COPY(av[n]^, val)
END
END GetArg;
PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT);
VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT;
BEGIN
s := ""; GetArg(n, s); i := 0;
IF s[0] = "-" THEN i := 1 END ;
k := 0; d := ORD(s[i]) - ORD("0");
WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ;
IF s[0] = "-" THEN k := -k; DEC(i) END ;
IF i > 0 THEN val := k END
END GetIntArg;
PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER;
VAR i: INTEGER; arg: ARRAY 256 OF CHAR;
BEGIN
i := 0; GetArg(i, arg);
WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ;
RETURN i
END ArgPos;
PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR); PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR);
VAR i, j: INTEGER; VAR i, j: INTEGER;
@ -95,7 +155,7 @@ MODULE Modules; (* jt 6.1.96 *)
PROCEDURE errch(c: CHAR); (* Here we favour simplicity over efficiency, so no buffering. *) PROCEDURE errch(c: CHAR); (* Here we favour simplicity over efficiency, so no buffering. *)
VAR e: Platform.ErrorCode; VAR e: Platform.ErrorCode;
BEGIN e := Platform.Write(1, SYSTEM.ADR(c), 1) BEGIN e := Platform.Write(Platform.StdOut, SYSTEM.ADR(c), 1)
END errch; END errch;
PROCEDURE errstring(s: ARRAY OF CHAR); PROCEDURE errstring(s: ARRAY OF CHAR);

View file

@ -2,7 +2,7 @@ MODULE Oberon;
(* this version should not have dependency on graphics -- noch *) (* this version should not have dependency on graphics -- noch *)
IMPORT Platform, Texts, Out; IMPORT Platform, Modules, Texts, Out;
TYPE TYPE
ParList* = POINTER TO ParRec; ParList* = POINTER TO ParRec;
@ -38,8 +38,8 @@ PROCEDURE PopulateParams;
BEGIN BEGIN
Texts.OpenWriter(W); Texts.OpenWriter(W);
i := 1; (* skip program name *) i := 1; (* skip program name *)
WHILE i < Platform.ArgCount DO WHILE i < Modules.ArgCount DO
Platform.GetArg(i, str); Texts.WriteString(W, str); Texts.Write(W, " "); Modules.GetArg(i, str); Texts.WriteString(W, str); Texts.Write(W, " ");
INC(i) INC(i)
END; END;
Texts.Append(Par^.text, W.buf); Texts.Append(Par^.text, W.buf);

View file

@ -7,7 +7,6 @@ CONST
StdErr- = 2; StdErr- = 2;
TYPE TYPE
HaltProcedure = PROCEDURE(n: SYSTEM.INT32);
SignalHandler = PROCEDURE(signal: SYSTEM.INT32); SignalHandler = PROCEDURE(signal: SYSTEM.INT32);
ErrorCode* = INTEGER; ErrorCode* = INTEGER;
@ -19,21 +18,13 @@ TYPE
mtime: LONGINT; (* File modification time, value is system dependent *) mtime: LONGINT; (* File modification time, value is system dependent *)
END; END;
EnvPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgVec = POINTER TO ARRAY 1024 OF ArgPtr;
ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS;
VAR VAR
LittleEndian-: BOOLEAN; LittleEndian-: BOOLEAN;
MainStackFrame-: SYSTEM.ADDRESS;
PID-: INTEGER; (* Note: Must be updated by Fork implementation *) PID-: INTEGER; (* Note: Must be updated by Fork implementation *)
CWD-: ARRAY 256 OF CHAR; CWD-: ARRAY 256 OF CHAR;
ArgCount-: INTEGER; ArgCount-: INTEGER;
ArgVector-: SYSTEM.ADDRESS; ArgVector-: SYSTEM.ADDRESS;
HaltHandler: HaltProcedure;
TimeStart: LONGINT; TimeStart: LONGINT;
SeekSet-: INTEGER; SeekSet-: INTEGER;
@ -118,36 +109,15 @@ PROCEDURE OSFree*(address: SYSTEM.ADDRESS); BEGIN free(address) END OSFree;
(* Program startup *)
PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();";
PROCEDURE -HeapInitHeap() "Heap_InitHeap()";
PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS);
VAR av: ArgVecPtr;
BEGIN
MainStackFrame := argvadr;
ArgCount := SYSTEM.VAL(INTEGER, argc);
av := SYSTEM.VAL(ArgVecPtr, argvadr);
ArgVector := av[0];
(* This function (Platform.Init) is called at program startup BEFORE any
modules have been initalised. In turn we must initialise the heap
before module startup (xxx__init) code is run. *)
HeapInitHeap();
END Init;
(* Program arguments and environment access *) (* Program arguments and environment access *)
PROCEDURE -getenv(var: ARRAY OF CHAR): EnvPtr "(Platform_EnvPtr)getenv((char*)var)"; PROCEDURE -getenv(var: ARRAY OF CHAR): SYSTEM.ADDRESS "getenv((char*)var)";
PROCEDURE getEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN; PROCEDURE getEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN;
TYPE EnvPtr = POINTER TO ARRAY 1024 OF CHAR;
VAR p: EnvPtr; VAR p: EnvPtr;
BEGIN BEGIN
p := getenv(var); p := SYSTEM.VAL(EnvPtr, getenv(var));
IF p # NIL THEN COPY(p^, val) END; IF p # NIL THEN COPY(p^, val) END;
RETURN p # NIL; RETURN p # NIL;
END getEnv; END getEnv;
@ -157,33 +127,6 @@ BEGIN
IF ~getEnv(var, val) THEN val[0] := 0X END; IF ~getEnv(var, val) THEN val[0] := 0X END;
END GetEnv; END GetEnv;
PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR);
VAR av: ArgVec;
BEGIN
IF n < ArgCount THEN
av := SYSTEM.VAL(ArgVec,ArgVector);
COPY(av[n]^, val)
END
END GetArg;
PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT);
VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT;
BEGIN
s := ""; GetArg(n, s); i := 0;
IF s[0] = "-" THEN i := 1 END ;
k := 0; d := ORD(s[i]) - ORD("0");
WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ;
IF s[0] = "-" THEN k := -k; DEC(i) END ;
IF i > 0 THEN val := k END
END GetIntArg;
PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER;
VAR i: INTEGER; arg: ARRAY 256 OF CHAR;
BEGIN
i := 0; GetArg(i, arg);
WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ;
RETURN i
END ArgPos;

View file

@ -8,7 +8,6 @@ IMPORT SYSTEM;
TYPE TYPE
HaltProcedure = PROCEDURE(n: SYSTEM.INT32);
SignalHandler = PROCEDURE(signal: SYSTEM.INT32); SignalHandler = PROCEDURE(signal: SYSTEM.INT32);
ErrorCode* = INTEGER; ErrorCode* = INTEGER;
@ -22,22 +21,10 @@ TYPE
mtimelow: LONGINT; (* File modification time, value is system dependent *) mtimelow: LONGINT; (* File modification time, value is system dependent *)
END; END;
EnvPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgPtr = POINTER TO ARRAY 1024 OF CHAR;
ArgVec = POINTER TO ARRAY 1024 OF ArgPtr;
ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS;
VAR VAR
LittleEndian-: BOOLEAN; LittleEndian-: BOOLEAN;
MainStackFrame-: SYSTEM.ADDRESS;
HaltCode-: LONGINT;
PID-: INTEGER; (* Note: Must be updated by Fork implementation *) PID-: INTEGER; (* Note: Must be updated by Fork implementation *)
CWD-: ARRAY 4096 OF CHAR; CWD-: ARRAY 4096 OF CHAR;
ArgCount-: INTEGER;
ArgVector-: SYSTEM.ADDRESS;
HaltHandler: HaltProcedure;
TimeStart: LONGINT; TimeStart: LONGINT;
SeekSet-: INTEGER; SeekSet-: INTEGER;
@ -117,29 +104,6 @@ PROCEDURE OSFree*(address: SYSTEM.ADDRESS); BEGIN free(address) END OSFree;
(* Program startup *)
PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();";
PROCEDURE -HeapInitHeap() "Heap_InitHeap()";
PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS);
VAR av: ArgVecPtr;
BEGIN
MainStackFrame := argvadr;
ArgCount := SYSTEM.VAL(INTEGER, argc);
av := SYSTEM.VAL(ArgVecPtr, argvadr);
ArgVector := av[0];
HaltCode := -128;
(* This function (Platform.Init) is called at program startup BEFORE any
modules have been initalised. In turn we must initialise the heap
before module startup (xxx__init) code is run. *)
HeapInitHeap();
END Init;
(* Program arguments and environmet access *) (* Program arguments and environmet access *)
PROCEDURE -getenv(name: ARRAY OF CHAR; VAR buf: ARRAY OF CHAR): INTEGER PROCEDURE -getenv(name: ARRAY OF CHAR; VAR buf: ARRAY OF CHAR): INTEGER
@ -164,34 +128,6 @@ BEGIN
IF ~getEnv(var, val) THEN val[0] := 0X END; IF ~getEnv(var, val) THEN val[0] := 0X END;
END GetEnv; END GetEnv;
PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR);
VAR av: ArgVec;
BEGIN
IF n < ArgCount THEN
av := SYSTEM.VAL(ArgVec,ArgVector);
COPY(av[n]^, val)
END
END GetArg;
PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT);
VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT;
BEGIN
s := ""; GetArg(n, s); i := 0;
IF s[0] = "-" THEN i := 1 END ;
k := 0; d := ORD(s[i]) - ORD("0");
WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ;
IF s[0] = "-" THEN k := -k; DEC(i) END ;
IF i > 0 THEN val := k END
END GetIntArg;
PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER;
VAR i: INTEGER; arg: ARRAY 256 OF CHAR;
BEGIN
i := 0; GetArg(i, arg);
WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ;
RETURN i
END ArgPos;
@ -559,8 +495,6 @@ PROCEDURE -getpid(): INTEGER "(INTEGER)GetCurrentProcessId()";
BEGIN BEGIN
TestLittleEndian; TestLittleEndian;
HaltCode := -128;
HaltHandler := NIL;
TimeStart := 0; TimeStart := Time(); TimeStart := 0; TimeStart := Time();
CWD := ""; getCurrentDirectory(CWD); CWD := ""; getCurrentDirectory(CWD);
PID := getpid(); PID := getpid();

View file

@ -258,10 +258,10 @@ extern void Heap_INCREF();
// Main module initialisation, registration and finalisation // Main module initialisation, registration and finalisation
extern void Platform_Init(INT32 argc, ADDRESS argv); extern void Modules_Init(INT32 argc, ADDRESS argv);
extern void Heap_FINALL(); extern void Heap_FINALL();
#define __INIT(argc, argv) static void *m; Platform_Init(argc, (ADDRESS)&argv); #define __INIT(argc, argv) static void *m; Modules_Init(argc, (ADDRESS)&argv);
#define __REGMAIN(name, enum) m = Heap_REGMOD((CHAR*)name,enum) #define __REGMAIN(name, enum) m = Heap_REGMOD((CHAR*)name,enum)
#define __FINI Heap_FINALL(); return 0 #define __FINI Heap_FINALL(); return 0

View file

@ -3,7 +3,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
IMPORT IMPORT
OPM, OPS, OPT, OPV, OPM, OPS, OPT, OPV,
Texts, Strings, Files, Out, Texts, Strings, Files, Out,
Oberon, Platform, SYSTEM, Configuration; Oberon, Modules, SYSTEM, Configuration;
CONST CONST
OptionChar = "-"; OptionChar = "-";
@ -265,13 +265,13 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver
PROCEDURE ShowDef*; PROCEDURE ShowDef*;
VAR S, vname, name: OPS.Name; VAR S, vname, name: OPS.Name;
BEGIN BEGIN
option := 0X; Platform.GetArg(1, S); option := 0X; Modules.GetArg(1, S);
IF Platform.ArgCount > 2 THEN IF Modules.ArgCount > 2 THEN
IF S[0] = OptionChar THEN option := S[1]; Platform.GetArg(2, S) IF S[0] = OptionChar THEN option := S[1]; Modules.GetArg(2, S)
ELSE Platform.GetArg(2, vname); option := vname[1] ELSE Modules.GetArg(2, vname); option := vname[1]
END END
END; END;
IF Platform.ArgCount >= 2 THEN IF Modules.ArgCount >= 2 THEN
Ident(S, name); Ident(S, name);
OPT.Init(name, {}); OPT.SelfName := "AvoidErr154"; OPT.Init(name, {}); OPT.SelfName := "AvoidErr154";
WModule(name, Oberon.Log); WModule(name, Oberon.Log);