Estimated hours taken: 70 (plus whatever pets spent when he wrote the
original version of this)
This change adds a new extras directory, "references". This directory
contains two impure reference type modules and a module that allows scoped
non-backtrackable update, along with examples of using them and tests.
These modules are intended to be useful when HAL is retargetted to Mercury,
for implementing global variables (backtracking and non-backtracking), and
may also be useful for the debugger.
In order to implement these features, a new memory zone "global heap" was
added to the runtime system, for a heap which is not reclaimed on failure,
along with a pair of functions for copying terms to this heap.
runtime/mercury_deep_copy.c:
runtime/mercury_deep_copy.h:
Added two functions, MR_make_permanent() and
MR_make_partially_permanent(), which essentially do a deep copy of a
term to the global heap.
(In conservative GC grades, these functions actually do nothing).
runtime/mercury_engine.c:
runtime/mercury_engine.h:
Added fields global_heap_zone and e_global_hp (for the global heap
and its heap pointer) to the MR_mercury_engine_struct, along with
appropriate initialisation, etc.
Defined MR_heap_zone, MR_solutions_heap_zone, and
MR_global_heap_zone for convenient access to the corresponding field
of the relevant Mercury engine.
runtime/mercury_memory.c:
Added code for handling the size and zone size of the global heap.
runtime/mercury_regorder.h:
runtime/mercury_regs.h:
Defined MR_global_hp (the global heap pointer for general use),
along with corresponding other changes.
runtime/mercury_wrapper.c:
runtime/mercury_wrapper.h:
Added declarations and initialisation of the size and zone_size of
the global_heap.
Added an entry for MR_GLOBAL_HP_RN to print_register_usage_counts()
(plus missing entries for MR_SOL_HP_RN, MR_MIN_HP_REC and
MR_MIN_SOL_HP_REC).
New files:
extras/references/Mmakefile:
Mmakefile for building and testing these modules.
extras/references/README:
Description of contents of this directory.
extras/references/global.m:
A wrapper module for building a library containing the nb_reference,
reference and scoped_update modules.
extras/references/nb_reference.m:
Implements references which are not backtracked on failure.
extras/references/reference.m:
Implements references which *are* backtracked on failure.
extras/references/scoped_update.m:
Allows nested scoping of non-backtracking references.
extras/references/samples/Mmakefile:
extras/references/samples/max_of.m:
extras/references/samples/max_test.exp:
extras/references/samples/max_test.m:
An example of using a non-backtracking reference (to find the
maximum of the solutions generated by a predicate), with tests.
extras/references/tests/Mmakefile:
extras/references/tests/ref_test.exp:
extras/references/tests/ref_test.m:
Some tests of references (backtracking and non-backtracking) and
scoping.