| Eloquence B.08.20 introduces automatic code management. Program code that 
is not loaded explicitly may be loaded on demand and is discarded when no 
longer referenced. 
This functionality may either be used with Eloquence subroutines and functions
(described below) or Eloquence classes (documented in a  
separate document).
 
 IntroductionEloquence automatic code management allows simplifying applications.
Where previously the developer had to ensure all referenced code is defined 
in memory and that code no longer needed is eventually removed from memory, 
Eloquence can now take over that task. 
As applications became more modular and capable, explicit code
management also got more complex.
Depending on the application one is likely to find a number of 
LOAD SUB and DEL SUB calls in programs to ensure all referenced code 
is defined.
Some applications have utility procedures to ensure external code is loaded.
 
Eloquence can now load referenced subroutines and functions on demand and delete 
the code when no longer in use or provide developers with the hooks to implement 
their own code management.
 
When enabled and an undefined subroutine or function is referenced, Eloquence will 
attempt to locate a matching program file in the path and load all segments (other 
than the main segment, same as a LOAD SUB).
Each loaded segment is internally marked as "autoloaded" to distinguish it
from segments defined in the program or explicitly loaded segments.
 
The Eloquence code management assumes external subroutines and functions 
reside in a separate program file, named as the subroutine or function.
For example, a SUB Test is assumed to be defined in a file Test.PROG and a
FNTest$ is assumed to be defined in a program file FNTest$.PROG.  
 
When a call to an autoloaded subroutine or function ends it is hidden and 
eventually is removed from memory.  Unused code segments are cached in
memory (to avoid the effort of loading it again) until the amount of 
autoloaded code exceeds an internal limit (currently 1 MB).
Once the cache reaches its maximum size segments are deleted in LRU order
(Least Recent Use).
 
 On demand loading of functions and subroutinesA call to a function or subroutine results in an ERROR 7 if it is not defined 
in memory.  When using automatic code management the function may be loaded 
on demand. 
On-demand loading of code is enabled by default. It may be configured in
the Eloquence config file with the OPTION AUTOLOAD.
 
OPTION AUTOLOAD 1
If the option value is zero autoloading is disabled, otherwise enabled. 
The language runtime will use the program PATH (if defined) or the default
volume label (MSI) to load a subroutine or function currently not present. 
Each subroutine or function must be defined in a separate PROG file with a 
matching name. The following conventions are used:
 
If a matching PROG file could not be found an ERROR 7 is returned. SUB Test -> Test.PROG
 FNTest -> FNTest.PROG
 FNTest$ -> FNTest$.PROG
 
Code autoload makes use of the NLN mode. Any code segment loaded automatically 
is not renumbered but retains the original program line numbers.
 
 ON UNDEFINED CALLThe ON UNDEFINED CALL statement allows customizing the 
automatic loading of functions and subroutines by specifying a procedure 
that is called if a missing subroutine or function is encountered.
This procedure is passed the name and type of the missing subroutine
or function as the argument. If the "undefined" handler procedure can't
be called a runtime ERROR 49 is returned.
The "undefined" handler procedure is expected to load the missing function. 
Upon return from the procedure the failed call is retried (once). 
Any code loaded by the UNDEFINED procedure is considered autoloaded,
its program lines are not renumbered and it will be discarded once the
cache size is exceeded. Please refer to the 
NLN mode documentation for details.
 
The syntax is:  
ON UNDEFINED CALL Procedure
OFF UNDEFINED
SUB Procedure(Name$)
For example: 
! Ignore any program error, just print an error message
ON ERROR GOSUB E
! Attempts an implicit LOAD SUB "Test1" if on-demand
! loading is enabled
CALL Test1
! Specify own undefined handler procedure 
ON UNDEFINED CALL Undefined
CALL Test2
X=FNTest2
OFF UNDEFINED
STOP
! Error handler
E: PRINT ERRM$
RETURN 
! Procedure that is called on an undefined segment
SUB Undefined(N$)
  PRINT "Undefined: "&N$
SUBEND
This program output is as below: 
ERROR 7 IN LINE ..
Undefined: Test2
ERROR 7 IN LINE ..
Undefined: FNTest2
ERROR 7 IN LINE ..
 
 |