mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-23 13:23:47 +00:00
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.
65 lines
1.4 KiB
Plaintext
65 lines
1.4 KiB
Plaintext
#-----------------------------------------------------------------------------#
|
|
# Copyright (C) 1997-1998 The University of Melbourne.
|
|
# This file may only be copied under the terms of the GNU Library General
|
|
# Public License - see the file COPYING.LIB in the Mercury distribution.
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
MAIN_TARGET = all
|
|
|
|
# We need to use a grade with trailing
|
|
GRADEFLAGS += --use-trail
|
|
|
|
MGNUCFLAGS= -I..
|
|
|
|
# Link in the reference library from ..
|
|
MCFLAGS += -I.. $(EXTRA_MCFLAGS)
|
|
MLFLAGS += -R`pwd`/.. -L.. $(EXTRA_MLFLAGS)
|
|
MLLIBS = -lglobal $(EXTRA_MLLIBS)
|
|
VPATH = ..:$(MMAKE_VPATH)
|
|
C2INITFLAGS = ../global.init
|
|
%_init.c: $(C2INITFLAGS)
|
|
|
|
# We need the following to use shared libraries on Linux
|
|
#MGNUCFLAGS += -DPIC_REG
|
|
#MLFLAGS += --shared
|
|
|
|
#MLFLAGS += --static
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
PROGS = max_test
|
|
|
|
DEPENDS = $(PROGS:%=%.depend)
|
|
CS = $(PROGS:%=%.c)
|
|
RESS = $(PROGS:%=%.res)
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
$(PROGS):
|
|
|
|
%.out: %
|
|
./$< > $@ 2>&1;
|
|
|
|
%.res: %.exp %.out
|
|
diff -c $*.exp $*.out > $@
|
|
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
.PHONY: depend
|
|
depend: $(DEPENDS)
|
|
|
|
.PHONY: all
|
|
all: $(PROGS)
|
|
|
|
.PHONY: check
|
|
check: $(RESS)
|
|
|
|
.PHONY: cs
|
|
cs: $(CS)
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
rm -f *.out *.res
|
|
|
|
#-----------------------------------------------------------------------------#
|