.
contact contact

B.08.20 / Release Notes / Language / Code Management

Automatic Code Management

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


Introduction

Eloquence 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 subroutines

A 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:

  • SUB Test -> Test.PROG
  • FNTest -> FNTest.PROG
  • FNTest$ -> FNTest$.PROG
If a matching PROG file could not be found an ERROR 7 is returned.

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 CALL

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


 
 
.
 
 
  Privacy | Webmaster | Terms of use | Impressum Revision:  2022-05-12  
  Copyright © 2012 Marxmeier Software AG