99 lines
3.0 KiB
Plaintext
99 lines
3.0 KiB
Plaintext
(* Version 1.10, Nov 1984 *)
|
||
DEFINITION MODULE Program;
|
||
(*
|
||
Sub-program loading and execution
|
||
|
||
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.
|
||
|
||
Derived from the Lilith Modula-2 system developed by the
|
||
group of Prof. N. Wirth at ETH Zurich, Switzerland.
|
||
*)
|
||
|
||
|
||
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 Modula-2 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.
|
||
|