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
*)
IMPORT SYSTEM, Texts, Files, Platform, Out, Configuration, VT100, Strings;
IMPORT SYSTEM, Texts, Files, Platform, Modules, Out, Configuration, VT100, Strings;
CONST
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 *)
VAR s: ARRAY 256 OF CHAR;
BEGIN
IF Platform.ArgCount = 1 THEN
IF Modules.ArgCount = 1 THEN
LogWLn;
LogWStr("Oberon-2 compiler v"); LogWStr(Configuration.versionLong); LogW("."); 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 *)
(* 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
ScanOptions(s);
INC(S); s:=""; Platform.GetArg(S, s)
INC(S); s:=""; Modules.GetArg(S, s)
END;
(* 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
Options := GlobalOptions; Model:=GlobalModel; Alignment := GlobalAlignment; AddressSize := GlobalAddressSize;
s:=""; Platform.GetArg(S, s);
s:=""; Modules.GetArg(S, s);
WHILE s[0] = OptionChar DO
ScanOptions(s);
INC(S); s:=""; Platform.GetArg(S, s)
INC(S); s:=""; Modules.GetArg(S, s)
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
done := FALSE;
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);
LogWStr(s); LogWStr(" ");

View file

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

View file

@ -495,8 +495,8 @@ MODULE Heap;
END
END FINALL;
PROCEDURE -ExternMainStackFrame "extern ADDRESS Platform_MainStackFrame;";
PROCEDURE -PlatformMainStackFrame(): S.ADDRESS "Platform_MainStackFrame";
PROCEDURE -ExternMainStackFrame "extern ADDRESS Modules_MainStackFrame;";
PROCEDURE -ModulesMainStackFrame(): S.ADDRESS "Modules_MainStackFrame";
PROCEDURE MarkStack(n: S.ADDRESS; VAR cand: ARRAY OF S.ADDRESS);
VAR
@ -510,7 +510,7 @@ MODULE Heap;
END ;
IF n = 0 THEN
nofcand := 0; sp := S.ADR(frame);
stack0 := PlatformMainStackFrame();
stack0 := ModulesMainStackFrame();
(* check for minimum alignment of pointers *)
inc := S.ADR(align.p) - S.ADR(align);
IF sp > stack0 THEN inc := -inc END ;
@ -572,8 +572,8 @@ MODULE Heap;
END RegisterFinalizer;
PROCEDURE -ExternHeapInit "extern void *Heap__init();";
PROCEDURE -HeapModuleInit 'Heap__init()';
PROCEDURE -ExternHeapInit "extern void *Heap__init();";
PROCEDURE -HeapModuleInit 'Heap__init()';
PROCEDURE InitHeap*;
(* InitHeap is called by Platform.init before any module bodies have been
@ -596,7 +596,7 @@ PROCEDURE -HeapModuleInit 'Heap__init()';
FileCount := 0;
modules := NIL;
bigBlocks := 0;
bigBlocks := 0;
fin := NIL;
interrupted := FALSE;

View file

@ -3,7 +3,7 @@ MODULE Modules; (* jt 6.1.96 *)
(* 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
ModNameLen* = 20;
@ -35,6 +35,66 @@ MODULE Modules; (* jt 6.1.96 *)
resMsg*: ARRAY 256 OF CHAR;
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);
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. *)
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;
PROCEDURE errstring(s: ARRAY OF CHAR);

View file

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

View file

@ -7,7 +7,6 @@ CONST
StdErr- = 2;
TYPE
HaltProcedure = PROCEDURE(n: SYSTEM.INT32);
SignalHandler = PROCEDURE(signal: SYSTEM.INT32);
ErrorCode* = INTEGER;
@ -19,21 +18,13 @@ TYPE
mtime: LONGINT; (* File modification time, value is system dependent *)
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
LittleEndian-: BOOLEAN;
MainStackFrame-: SYSTEM.ADDRESS;
PID-: INTEGER; (* Note: Must be updated by Fork implementation *)
CWD-: ARRAY 256 OF CHAR;
ArgCount-: INTEGER;
ArgVector-: SYSTEM.ADDRESS;
HaltHandler: HaltProcedure;
TimeStart: LONGINT;
SeekSet-: INTEGER;
@ -118,72 +109,24 @@ 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 *)
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;
VAR p: EnvPtr;
TYPE EnvPtr = POINTER TO ARRAY 1024 OF CHAR;
VAR p: EnvPtr;
BEGIN
p := getenv(var);
p := SYSTEM.VAL(EnvPtr, getenv(var));
IF p # NIL THEN COPY(p^, val) END;
RETURN p # NIL;
END getEnv;
PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR);
BEGIN
IF ~ getEnv(var, val) THEN val[0] := 0X END;
IF ~getEnv(var, val) THEN val[0] := 0X END;
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
HaltProcedure = PROCEDURE(n: SYSTEM.INT32);
SignalHandler = PROCEDURE(signal: SYSTEM.INT32);
ErrorCode* = INTEGER;
@ -22,22 +21,10 @@ TYPE
mtimelow: LONGINT; (* File modification time, value is system dependent *)
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
LittleEndian-: BOOLEAN;
MainStackFrame-: SYSTEM.ADDRESS;
HaltCode-: LONGINT;
PID-: INTEGER; (* Note: Must be updated by Fork implementation *)
CWD-: ARRAY 4096 OF CHAR;
ArgCount-: INTEGER;
ArgVector-: SYSTEM.ADDRESS;
HaltHandler: HaltProcedure;
TimeStart: LONGINT;
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 *)
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;
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
TestLittleEndian;
HaltCode := -128;
HaltHandler := NIL;
TimeStart := 0; TimeStart := Time();
CWD := ""; getCurrentDirectory(CWD);
PID := getpid();

View file

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