SYNOPSIS
void replace_program()
void replace_program(string program)
DESCRIPTION
Substitutes a program with the inherited program <program>. If
the object inherits only one program, the argument may be omitted
and the efun will automatically select the one inherited program.
This efun is useful if you consider the performance and memory
consumption of the driver. A program which doesn't need any additional
variables and functions (except during creation) can call
replace_program() to increase the function-cache hit-rate of the
driver which decreases with the number of programs in the system.
Rooms are a good example for the application of this function, as many
rooms just consist of an inherit statement and the configure function.
Any object can call replace_program() but looses all extra variables
and functions which are not defined by the inherited program.
When replace_program() takes effect, shadowing is stopped on
the object since 3.2@166.
It is not possible to replace the program of an object after (lambda)
closures have been bound to it. It is of course possible to first
replace the program and then bind lambda closures to it.
The program replacement does not take place with the call to the efun,
but is merely scheduled to be carried out at the end of the backend
cycle. This may cause closures to have references to then vanished
lfuns of the object. This poses no problem as long as these references
are never executed after they became invalid.
BUGS
If the replacement program contains virtually inherited variables,
it must be the first inherited program. Without this restriction,
the wrong variables would survive the replacement process.
HISTORY
LDMud 3.2.9 allowed to omit the argument if only one inherit
exists.
|