89 lines
3.0 KiB
Plaintext
89 lines
3.0 KiB
Plaintext
DEFINITION MODULE Program;
|
||
(*
|
||
Sub-program loading and execution
|
||
|
||
|
||
Derived from the Lilith Modula-2 system developed by the
|
||
group of Prof. N. Wirth at ETH Zurich, Switzerland.
|
||
|
||
|
||
Under Modula-2/86, programs can be divided into
|
||
sub-programs (we call them 'programs') which are
|
||
loaded upon request.
|
||
|
||
These programs are executed like procedures:
|
||
- they have only one entry-point (body of
|
||
program's main module).
|
||
- after termination, their data do not exist any
|
||
longer. In the case of programs the code also
|
||
disappears and will be reloaded from disk upon
|
||
the next activation.
|
||
- programs may themselves activate other programs.
|
||
|
||
*)
|
||
|
||
|
||
FROM System IMPORT Status;
|
||
|
||
EXPORT QUALIFIED Call, GetErrorInfo;
|
||
|
||
|
||
PROCEDURE GetErrorInfo (VAR msg: ARRAY OF CHAR);
|
||
(*- Obtain more information about a load error.
|
||
out: msg a string related to the last error.
|
||
|
||
After Call (below) has returned a Status value of
|
||
'modulenotfound' and 'incompatiblemodules', GetErrorInfo
|
||
will return the name of the offending module. (length is up
|
||
to 24 characters). It returns an empty string in all other
|
||
cases.
|
||
*)
|
||
|
||
PROCEDURE Call (programName: ARRAY OF CHAR; shared: BOOLEAN;
|
||
VAR st: Status);
|
||
(*- Load and execute a (sub) program.
|
||
in: programName file specification for the program,
|
||
shared whether to share resources,
|
||
out: st terminating status of the subprogram.
|
||
|
||
The file whose name is given in 'programName' is opened
|
||
loaded, and started. There is no default device or file type:
|
||
these must be supplied by the caller. The file must contain a
|
||
linked, relocatable program.
|
||
|
||
The load address is defined by the default allocation schema,
|
||
in which programs are loaded on top of stack and a new stack is
|
||
created for execution of the new program.
|
||
|
||
If 'shared' = TRUE then all sharable resources allocated by
|
||
the called program are owned by the calling program (or
|
||
possibly the caller of the caller...). Shared resources are
|
||
not released upon termination of the new program.
|
||
|
||
Upon termination of the program, its memory is freed and the
|
||
old stack is established. All the resources used by a
|
||
terminating program are released, if they are not shared and
|
||
if they have not been released explicitly by the program
|
||
(files, heap, etc).
|
||
|
||
Any value of 'st' other than 'normal' indicates an abnormal
|
||
termination of the subprogram. In some cases GetErrorInfo (above)
|
||
will provide additional details.
|
||
|
||
- Cautions -
|
||
|
||
In case of abnormal termination, Call does NOT print any kind
|
||
of error message.
|
||
|
||
Do not assign a procedure in the current program to a procedure
|
||
variable which could still exist after the current program
|
||
terminates (for example, a variable in a shared resource or in
|
||
the calling program). When the current program terminates,
|
||
all procedures in it must be considered to cease to exist.
|
||
|
||
The loader in this module is not reentrant. This means that
|
||
interrupt processes must not load overlays!
|
||
*)
|
||
|
||
END Program.
|
||
|