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