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