[m-rev.] for review: reducing the size of type ctor info structures, part 1

Zoltan Somogyi zs at cs.mu.OZ.AU
Mon Dec 31 14:23:51 AEDT 2001


For review by Fergus or Tyson.

Zoltan.

This is the first half of a change that reduces the size of type_ctor_info
structures, and moves the version number to the start (immediately after the
arity) to make future changes easier.

The second half can be committed only when the first half has been installed
on all our machines.

Note that when this change is installed on a machine, you will need to do a cvs
update in every workspace that uses that machine's installed compiler before
being able to continue working with that workspace. This is because the
compiler will generate the new MR_TypeCtorInfo structure, and you will get C
compiler errors if your runtime still contains a declaration only for the old
one.

Doing a cvs update after this change is checked but before it is installed
should be OK.

runtime/mercury_type_info.h:
	Define the new version of the type_ctor_info structure while keeping
	the old one temporarily; the presence of a macro definition, which
	is emitted only by new compiler versions, selects the new version.

	Increment the maximum supported rtti version number.

	Remove some obsolete stuff, and move some macro definitions to their
	proper place in the file.

	Define a macro to allow access to the type_ctor_rep field regardless
	of version.

	Define a macros to allow the declaration of type_ctor_info structures
	regardless of version.

runtime/mercury_ho_call.h:
	With the new type_ctor_info structures, take the address of the
	unify procedure from the new unify field, since the old one has
	been reused for other purposes.

compiler/type_ctor_info.m:
	Increment the rtti version number.

compiler/rtti_out.m:
compiler/rtti_to_mlds.m:
	Generate the new type_info structure.

compiler/llds_out.m:
compiler/mlds_to_c.m:
	Generate a macro definition that selects the new type_ctor_info
	for use, since that is what we are generating.

library/rtti_implementation.m:
library/std_util.m:
runtime/mercury.c:
runtime/mercury_deep_copy_body.h:
runtime/mercury_make_type_info_body.h:
runtime/mercury_ml_expand_body.h:
runtime/mercury_tabling.c:
runtime/mercury_type_info.c:
runtime/mercury_unify_compare_body.h:
runtime/mercury_wrapper.c:
	Use the version-independent macro to access the type_ctor_rep field.

library/table_builtin.m:
	Use the version-independent macro to declare type_ctor_infos.

cvs diff: Diffing .
cvs diff: Diffing bindist
cvs diff: Diffing boehm_gc
cvs diff: Diffing boehm_gc/Mac_files
cvs diff: Diffing boehm_gc/cord
cvs diff: Diffing boehm_gc/cord/private
cvs diff: Diffing boehm_gc/doc
cvs diff: Diffing boehm_gc/include
cvs diff: Diffing boehm_gc/include/private
cvs diff: Diffing boehm_gc/tests
cvs diff: Diffing browser
cvs diff: Diffing bytecode
cvs diff: Diffing compiler
Index: compiler/llds_out.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/llds_out.m,v
retrieving revision 1.182
diff -u -b -r1.182 llds_out.m
--- compiler/llds_out.m	2001/11/06 15:20:47	1.182
+++ compiler/llds_out.m	2001/12/29 06:02:54
@@ -452,7 +452,9 @@
 		"** UNBOXED_FLOAT=", UnboxedFloatStr, "\n",
 		"**\n",
 		"** END_OF_C_GRADE_INFO\n",
-		"*/\n"
+		"*/\n",
+		"\n",
+		"\n#define MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO\n"
 	]).
 
 :- pred convert_bool_to_string(bool, string).
Index: compiler/mlds_to_c.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/mlds_to_c.m,v
retrieving revision 1.110
diff -u -b -r1.110 mlds_to_c.m
--- compiler/mlds_to_c.m	2001/12/10 04:16:30	1.110
+++ compiler/mlds_to_c.m	2001/12/29 07:01:43
@@ -123,6 +123,9 @@
 :- mode mlds_output_hdr_file(in, in, di, uo) is det.
 
 mlds_output_hdr_file(Indent, MLDS) -->
+	% XXX for bootstrapping the new type_ctor_info structure.
+	io__write_string("#define MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO\n"),
+
 	{ MLDS = mlds(ModuleName, AllForeignCode, Imports, Defns) },
 	mlds_output_hdr_start(Indent, ModuleName), io__nl,
 	mlds_output_hdr_imports(Indent, Imports), io__nl,
Index: compiler/rtti_out.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/rtti_out.m,v
retrieving revision 1.22
diff -u -b -r1.22 rtti_out.m
--- compiler/rtti_out.m	2001/10/24 07:43:12	1.22
+++ compiler/rtti_out.m	2001/12/29 06:03:09
@@ -393,13 +393,17 @@
 	{ RttiTypeId = rtti_type_id(Module, Type, TypeArity) },
 	io__write_int(TypeArity),
 	io__write_string(",\n\t"),
-	output_maybe_static_code_addr(UnifyCA),
+	io__write_int(Version),
+	io__write_string(",\n\t"),
+	{ rtti__type_ctor_rep_to_string(CtorRep, CtorRepStr) },
+	io__write_string(CtorRepStr),
 	io__write_string(",\n\t"),
+	io__write_int(NumPtags),
+	io__write_string(",\n\t"),
 	output_maybe_static_code_addr(UnifyCA),
 	io__write_string(",\n\t"),
 	output_maybe_static_code_addr(CompareCA),
 	io__write_string(",\n\t"),
-	{ rtti__type_ctor_rep_to_string(CtorRep, CtorRepStr) },
 	io__write_string(CtorRepStr),
 	io__write_string(",\n\t"),
 	output_maybe_static_code_addr(SolverCA),
@@ -464,8 +468,6 @@
 	),
 	io__write_string(",\n\t"),
 	io__write_int(NumFunctors),
-	io__write_string(",\n\t"),
-	io__write_int(NumPtags),
 % This code is commented out while the corresponding fields of the
 % MR_TypeCtorInfo_Struct type are commented out.
 %
Index: compiler/rtti_to_mlds.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/rtti_to_mlds.m,v
retrieving revision 1.21
diff -u -b -r1.21 rtti_to_mlds.m
--- compiler/rtti_to_mlds.m	2001/10/31 17:58:58	1.21
+++ compiler/rtti_to_mlds.m	2001/12/29 06:03:09
@@ -230,7 +230,9 @@
 	prog_out__sym_name_to_string(TypeModule, TypeModuleName),
 	Init = init_struct([
 		gen_init_int(TypeArity),
-		gen_init_maybe_proc_id(ModuleInfo, UnifyProc),
+		gen_init_int(Version),
+		gen_init_type_ctor_rep(CtorRep),
+		gen_init_int(NumPtags),
 		gen_init_maybe_proc_id(ModuleInfo, UnifyProc),
 		gen_init_maybe_proc_id(ModuleInfo, CompareProc),
 		gen_init_type_ctor_rep(CtorRep),
@@ -249,8 +251,7 @@
 		init_struct([
 			gen_init_layout_info(LayoutInfo, ModuleName, RttiTypeId)
 		]),
-		gen_init_int(NumFunctors),
-		gen_init_int(NumPtags)
+		gen_init_int(NumFunctors)
 			% These two are commented out while the corresponding
 			% fields of the MR_TypeCtorInfo_Struct type are
 			% commented out.
Index: compiler/type_ctor_info.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/type_ctor_info.m,v
retrieving revision 1.17
diff -u -b -r1.17 type_ctor_info.m
--- compiler/type_ctor_info.m	2001/10/31 16:58:10	1.17
+++ compiler/type_ctor_info.m	2001/12/29 06:03:11
@@ -231,7 +231,7 @@
 
 :- func type_ctor_info_rtti_version = int.
 
-type_ctor_info_rtti_version = 4.
+type_ctor_info_rtti_version = 5.
 
 %---------------------------------------------------------------------------%
 %---------------------------------------------------------------------------%
cvs diff: Diffing compiler/notes
cvs diff: Diffing debian
cvs diff: Diffing deep_profiler
cvs diff: Diffing deep_profiler/notes
cvs diff: Diffing doc
cvs diff: Diffing extras
cvs diff: Diffing extras/aditi
cvs diff: Diffing extras/cgi
cvs diff: Diffing extras/complex_numbers
cvs diff: Diffing extras/complex_numbers/samples
cvs diff: Diffing extras/complex_numbers/tests
cvs diff: Diffing extras/concurrency
cvs diff: Diffing extras/curs
cvs diff: Diffing extras/curs/samples
cvs diff: Diffing extras/curses
cvs diff: Diffing extras/curses/sample
cvs diff: Diffing extras/dynamic_linking
cvs diff: Diffing extras/graphics
cvs diff: Diffing extras/graphics/mercury_opengl
cvs diff: Diffing extras/graphics/mercury_tcltk
cvs diff: Diffing extras/graphics/samples
cvs diff: Diffing extras/graphics/samples/calc
cvs diff: Diffing extras/graphics/samples/maze
cvs diff: Diffing extras/graphics/samples/pent
cvs diff: Diffing extras/lazy_evaluation
cvs diff: Diffing extras/lex
cvs diff: Diffing extras/lex/samples
cvs diff: Diffing extras/logged_output
cvs diff: Diffing extras/moose
cvs diff: Diffing extras/moose/samples
cvs diff: Diffing extras/morphine
cvs diff: Diffing extras/morphine/non-regression-tests
cvs diff: Diffing extras/morphine/scripts
cvs diff: Diffing extras/morphine/source
cvs diff: Diffing extras/odbc
cvs diff: Diffing extras/posix
cvs diff: Diffing extras/quickcheck
cvs diff: Diffing extras/quickcheck/tutes
cvs diff: Diffing extras/references
cvs diff: Diffing extras/references/samples
cvs diff: Diffing extras/references/tests
cvs diff: Diffing extras/stream
cvs diff: Diffing extras/trailed_update
cvs diff: Diffing extras/trailed_update/samples
cvs diff: Diffing extras/trailed_update/tests
cvs diff: Diffing extras/xml
cvs diff: Diffing extras/xml/samples
cvs diff: Diffing java
cvs diff: Diffing library
Index: library/rtti_implementation.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/rtti_implementation.m,v
retrieving revision 1.7
diff -u -b -r1.7 rtti_implementation.m
--- library/rtti_implementation.m	2001/10/24 07:43:18	1.7
+++ library/rtti_implementation.m	2001/12/29 17:20:54
@@ -1385,7 +1385,7 @@
 :- pragma foreign_proc("C",
 	type_ctor_rep(TypeCtorInfo::in) = (TypeCtorRep::out), [], "
 	MR_TypeCtorInfo tci = (MR_TypeCtorInfo) TypeCtorInfo;
-	TypeCtorRep = tci->type_ctor_rep;
+	TypeCtorRep = MR_type_ctor_rep(tci);
 ").
 
 
Index: library/std_util.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/std_util.m,v
retrieving revision 1.250
diff -u -b -r1.250 std_util.m
--- library/std_util.m	2001/12/19 06:44:48	1.250
+++ library/std_util.m	2001/12/29 06:32:28
@@ -1893,7 +1893,7 @@
 	type_ctor_desc = ML_make_type_ctor_desc(type_info, type_ctor_info);
 	*type_ctor_desc_ptr = type_ctor_desc;
 
-	if (MR_type_ctor_rep_is_variable_arity(type_ctor_info->type_ctor_rep))
+	if (MR_type_ctor_rep_is_variable_arity(MR_type_ctor_rep(type_ctor_info)))
 	{
 		arity = MR_TYPECTOR_DESC_GET_VA_ARITY(type_ctor_desc);
 		*arg_type_info_list_ptr = ML_type_params_vector_to_list(arity,
@@ -2277,11 +2277,11 @@
 
         type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
 
-        if (type_ctor_info->type_ctor_rep != construct_info.type_ctor_rep) {
+        if (MR_type_ctor_rep(type_ctor_info) != construct_info.type_ctor_rep) {
             MR_fatal_error(""std_util:construct: type_ctor_rep mismatch"");
         }
 
-        switch (type_ctor_info->type_ctor_rep) {
+        switch (MR_type_ctor_rep(type_ctor_info)) {
 
         case MR_TYPECTOR_REP_ENUM:
         case MR_TYPECTOR_REP_ENUM_USEREQ:
@@ -2591,9 +2591,9 @@
     MR_TypeCtorInfo     type_ctor_info;
 
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
-    construct_info->type_ctor_rep = type_ctor_info->type_ctor_rep;
+    construct_info->type_ctor_rep = MR_type_ctor_rep(type_ctor_info);
 
-    switch(type_ctor_info->type_ctor_rep) {
+    switch(MR_type_ctor_rep(type_ctor_info)) {
 
     case MR_TYPECTOR_REP_RESERVED_ADDR:
     case MR_TYPECTOR_REP_RESERVED_ADDR_USEREQ:
@@ -3004,7 +3004,7 @@
 
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
 
-    switch(type_ctor_info->type_ctor_rep) {
+    switch(MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_DU:
         case MR_TYPECTOR_REP_DU_USEREQ:
         case MR_TYPECTOR_REP_RESERVED_ADDR:
@@ -3379,7 +3379,7 @@
 
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
 
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_RESERVED_ADDR_USEREQ:
         case MR_TYPECTOR_REP_RESERVED_ADDR:
 	    {
@@ -3787,7 +3787,7 @@
 
     MR_unravel_univ(Univ, type_info, value);
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_NOTAG:
         case MR_TYPECTOR_REP_NOTAG_USEREQ:
             functor_desc = type_ctor_info->type_functors.functors_notag;
@@ -3837,7 +3837,7 @@
 
     MR_unravel_univ(Univ, type_info, value);
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_EQUIV:
             exp_type_info = MR_pseudo_type_info_is_ground(
                 type_ctor_info->type_layout.layout_equiv);
@@ -3880,7 +3880,7 @@
 
     MR_unravel_univ(Univ, type_info, value);
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_ENUM:
         case MR_TYPECTOR_REP_ENUM_USEREQ:
             Enum = (MR_Integer) value;
@@ -3923,7 +3923,7 @@
 
     MR_unravel_univ(Univ, type_info, value);
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_DU:
         case MR_TYPECTOR_REP_DU_USEREQ:
             SUCCESS_INDICATOR = TRUE;
Index: library/table_builtin.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/table_builtin.m,v
retrieving revision 1.10
diff -u -b -r1.10 table_builtin.m
--- library/table_builtin.m	2001/11/22 11:37:08	1.10
+++ library/table_builtin.m	2001/12/29 06:10:31
@@ -1072,13 +1072,11 @@
   #define MR_TYPE_CTOR_INFO_IO_STATE  mercury_data_io__type_ctor_info_state_0
 #endif
 
-
-extern MR_STATIC_CODE_CONST struct MR_TypeCtorInfo_Struct
-	MR_TYPE_CTOR_INFO_INT,
-	MR_TYPE_CTOR_INFO_STRING,
-	MR_TYPE_CTOR_INFO_FLOAT,
-	MR_TYPE_CTOR_INFO_CHAR,
-	MR_TYPE_CTOR_INFO_IO_STATE;
+MR_DECLARE_TYPE_CTOR_INFO_STRUCT(MR_TYPE_CTOR_INFO_INT);
+MR_DECLARE_TYPE_CTOR_INFO_STRUCT(MR_TYPE_CTOR_INFO_STRING);
+MR_DECLARE_TYPE_CTOR_INFO_STRUCT(MR_TYPE_CTOR_INFO_FLOAT);
+MR_DECLARE_TYPE_CTOR_INFO_STRUCT(MR_TYPE_CTOR_INFO_CHAR);
+MR_DECLARE_TYPE_CTOR_INFO_STRUCT(MR_TYPE_CTOR_INFO_IO_STATE);
 
 ").
 
cvs diff: Diffing profiler
cvs diff: Diffing robdd
cvs diff: Diffing runtime
Index: runtime/mercury.c
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury.c,v
retrieving revision 1.28
diff -u -b -r1.28 mercury.c
--- runtime/mercury.c	2001/12/27 13:17:12	1.28
+++ runtime/mercury.c	2001/12/29 06:03:37
@@ -172,7 +172,7 @@
 	** Tuple and higher-order types do not have a fixed arity,
 	** so they need to be special cased here.
 	*/
-	type_ctor_rep = type_ctor_info->type_ctor_rep;
+	type_ctor_rep = MR_type_ctor_rep(type_ctor_info);
 	if (type_ctor_rep == MR_TYPECTOR_REP_TUPLE) {
 		return mercury__builtin____Unify____tuple_0_0(ti,
 			(MR_Tuple) x, (MR_Tuple) y);
@@ -230,7 +230,7 @@
 	** Tuple and higher-order types do not have a fixed arity,
 	** so they need to be special cased here.
 	*/
-	type_ctor_rep = type_ctor_info->type_ctor_rep;
+	type_ctor_rep = MR_type_ctor_rep(type_ctor_info);
 	if (type_ctor_rep == MR_TYPECTOR_REP_TUPLE) {
 		mercury__builtin____Compare____tuple_0_0(ti,
 			res, (MR_Tuple) x, (MR_Tuple) y);
Index: runtime/mercury_deep_copy_body.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_deep_copy_body.h,v
retrieving revision 1.40
diff -u -b -r1.40 mercury_deep_copy_body.h
--- runtime/mercury_deep_copy_body.h	2001/10/31 17:59:03	1.40
+++ runtime/mercury_deep_copy_body.h	2001/12/29 06:11:14
@@ -44,7 +44,7 @@
 try_again:
     type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(type_info);
 
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
 
     case MR_TYPECTOR_REP_ENUM:
     case MR_TYPECTOR_REP_ENUM_USEREQ:
@@ -753,7 +753,7 @@
         }
 
         if (MR_type_ctor_rep_is_variable_arity(
-                type_ctor_info->type_ctor_rep))
+            MR_type_ctor_rep(type_ctor_info)))
         {
             arity = MR_TYPEINFO_GET_HIGHER_ORDER_ARITY(type_info);
             type_info_args =
Index: runtime/mercury_make_type_info_body.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_make_type_info_body.h,v
retrieving revision 1.6
diff -u -b -r1.6 mercury_make_type_info_body.h
--- runtime/mercury_make_type_info_body.h	2000/09/18 11:52:31	1.6
+++ runtime/mercury_make_type_info_body.h	2000/10/16 04:46:57
@@ -62,7 +62,8 @@
 		return MR_pseudo_type_info_is_ground(pseudo_type_info);
 	}
 
-	if (MR_type_ctor_rep_is_variable_arity(type_ctor_info->type_ctor_rep))
+	if (MR_type_ctor_rep_is_variable_arity(
+		MR_type_ctor_rep(type_ctor_info)))
 	{
 		arity = MR_PSEUDO_TYPEINFO_GET_HIGHER_ORDER_ARITY(
 			pseudo_type_info);
Index: runtime/mercury_ml_expand_body.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_ml_expand_body.h,v
retrieving revision 1.5
diff -u -b -r1.5 mercury_ml_expand_body.h
--- runtime/mercury_ml_expand_body.h	2001/12/19 06:57:49	1.5
+++ runtime/mercury_ml_expand_body.h	2001/12/29 17:53:36
@@ -220,7 +220,7 @@
     expand_info->limit_reached = FALSE;
 #endif  /* EXPAND_APPLY_LIMIT */
 
-    switch(type_ctor_info->type_ctor_rep) {
+    switch(MR_type_ctor_rep(type_ctor_info)) {
 
         case MR_TYPECTOR_REP_ENUM_USEREQ:
             expand_info->non_canonical_type = TRUE;
Index: runtime/mercury_tabling.c
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_tabling.c,v
retrieving revision 1.44
diff -u -b -r1.44 mercury_tabling.c
--- runtime/mercury_tabling.c	2001/12/04 00:44:35	1.44
+++ runtime/mercury_tabling.c	2001/12/29 06:03:43
@@ -578,7 +578,8 @@
 	** sense. This is OK, because in that case it will never be used.
 	*/
 
-	if (MR_type_ctor_rep_is_variable_arity(type_ctor_info->type_ctor_rep))
+	if (MR_type_ctor_rep_is_variable_arity(
+		MR_type_ctor_rep(type_ctor_info)))
 	{
 		arity = MR_TYPEINFO_GET_HIGHER_ORDER_ARITY(type_info);
 		arg_vector = MR_TYPEINFO_GET_HIGHER_ORDER_ARG_VECTOR(
@@ -625,11 +626,11 @@
 #ifdef  MR_TABLE_DEBUG
     if (MR_tabledebug) {
         printf("ENTRY %p %x, data rep: %d\n",
-            table, data, type_ctor_info->type_ctor_rep);
+            table, data, MR_type_ctor_rep(type_ctor_info));
     }
 #endif  /* MR_TABLE_DEBUG */
 
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
         case MR_TYPECTOR_REP_ENUM: 
         case MR_TYPECTOR_REP_ENUM_USEREQ: 
             MR_DEBUG_TABLE_ENUM(table,
Index: runtime/mercury_type_info.c
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_type_info.c,v
retrieving revision 1.43
diff -u -b -r1.43 mercury_type_info.c
--- runtime/mercury_type_info.c	2000/11/28 04:31:47	1.43
+++ runtime/mercury_type_info.c	2001/06/25 05:33:41
@@ -189,7 +189,7 @@
 	*/
 		/* Check for higher order or tuples */
 	if (MR_type_ctor_rep_is_variable_arity(
-			type_ctor_info_1->type_ctor_rep))
+		MR_type_ctor_rep(type_ctor_info_1)))
 	{
 		int	num_arg_types_2;
 
@@ -252,8 +252,8 @@
 	type_ctor_info = MR_TYPEINFO_GET_TYPE_CTOR_INFO(maybe_equiv_type_info);
 
 		/* Look past equivalences */
-	while (type_ctor_info->type_ctor_rep == MR_TYPECTOR_REP_EQUIV_GROUND
-		|| type_ctor_info->type_ctor_rep == MR_TYPECTOR_REP_EQUIV)
+	while (MR_type_ctor_rep(type_ctor_info) == MR_TYPECTOR_REP_EQUIV_GROUND
+		|| MR_type_ctor_rep(type_ctor_info) == MR_TYPECTOR_REP_EQUIV)
 	{
 
 		maybe_equiv_type_info = MR_create_type_info(
Index: runtime/mercury_type_info.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_type_info.h,v
retrieving revision 1.76
diff -u -b -r1.76 mercury_type_info.h
--- runtime/mercury_type_info.h	2001/10/31 17:59:03	1.76
+++ runtime/mercury_type_info.h	2001/12/29 12:10:02
@@ -68,10 +68,11 @@
 ** compiler/type_ctor_info.m.
 */
 
-#define MR_RTTI_VERSION                 MR_RTTI_VERSION__CLEAN_LAYOUT
+#define MR_RTTI_VERSION                 MR_RTTI_VERSION__VERSION_NO
 #define MR_RTTI_VERSION__INITIAL        2
 #define MR_RTTI_VERSION__USEREQ         3
 #define MR_RTTI_VERSION__CLEAN_LAYOUT   4
+#define MR_RTTI_VERSION__VERSION_NO     5
 
 /*
 ** Check that the RTTI version is in a sensible range.
@@ -82,10 +83,19 @@
 */
 
 #define MR_TYPE_CTOR_INFO_CHECK_RTTI_VERSION_RANGE(typector)    \
-    assert(typector->type_ctor_version == MR_RTTI_VERSION__CLEAN_LAYOUT)
+    assert(typector->type_ctor_old_version == MR_RTTI_VERSION__CLEAN_LAYOUT \
+	|| typector->type_ctor_old_version == MR_RTTI_VERSION__VERSION_NO)
 
 /*---------------------------------------------------------------------------*/
 
+#ifdef	MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO
+  #define	MR_TypeCtorInfo_Struct	MR_NewTypeCtorInfo_Struct
+#else
+  #define	MR_TypeCtorInfo_Struct	MR_OldTypeCtorInfo_Struct
+#endif
+
+/*---------------------------------------------------------------------------*/
+
 /* Forward declarations */
 
 typedef const struct MR_TypeCtorInfo_Struct		*MR_TypeCtorInfo;
@@ -120,8 +130,7 @@
 ** We do not use zero to represent any type variable, for two reasons.
 ** First, variable numbering starts at one inside the compiler. Second,
 ** starting at one allows us to use universally quantified type variable
-** numbers to be used directly as the offset into a (non-higher-order)
-** typeinfo.
+** numbers directly as an offset into a (non-higher-order) typeinfo.
 **
 ** This scheme relies on the bit patterns of these integers corresponding
 ** to memory that is either inaccessible (due to the first page of virtual
@@ -134,6 +143,7 @@
 ** these are used in the code that the compiler generates
 ** for static constant typeinfos and pseudotypeinfos.
 */
+
 #define MR_FIRST_ORDER_TYPEINFO_STRUCT(NAME, ARITY)			\
     struct NAME {							\
 	MR_TypeCtorInfo     MR_ti_type_ctor_info;			\
@@ -167,6 +177,7 @@
 ** which are used by the MR_TypeInfo and MR_PseudoTypeInfo
 ** typedefs above.
 */
+
 MR_HIGHER_ORDER_TYPEINFO_STRUCT(MR_TypeInfo_Almost_Struct,
 	MR_VARIABLE_SIZED);
 MR_HIGHER_ORDER_PSEUDOTYPEINFO_STRUCT(MR_PseudoTypeInfo_Almost_Struct,
@@ -178,6 +189,7 @@
 ** A MR_TypeInfoParams array serves this purpose. Because type variables
 ** start at one, MR_TypeInfoParams arrays also start at one.
 */
+
 typedef MR_TypeInfo     *MR_TypeInfoParams;
 
 /*
@@ -188,6 +200,7 @@
 ** base_type_layout__pseudo_typeinfo_max_var in base_type_layout.m,
 ** and with the default value of MR_VARIABLE_SIZED in mercury_conf_params.h.
 */
+
 #define MR_PSEUDOTYPEINFO_EXIST_VAR_BASE    512
 #define MR_PSEUDOTYPEINFO_MAX_VAR           1024
 
@@ -214,6 +227,7 @@
 ** It should only be called if the pseudo_type_info is ground,
 ** i.e. contains no type variables.
 */
+
 #define MR_pseudo_type_info_is_ground(pseudo_type_info)             \
     ( MR_CHECK_EXPR_TYPE((pseudo_type_info), MR_PseudoTypeInfo),    \
       (MR_TypeInfo) (pseudo_type_info) )			    \
@@ -291,9 +305,10 @@
 ** Used to define MR_TypeCtorInfos for the builtin types in the hlc grades.
 ** This needs to be exported for use by the array type in the library.
 */
+
 #ifdef MR_HIGHLEVEL_CODE
 
-#define MR_type_ctor_info_name(MODULE, TYPE, ARITY)			      \
+  #define MR_type_ctor_info_name(MODULE, TYPE, ARITY)			      \
 	MR_PASTE2(mercury__,						      \
 	MR_PASTE2(MODULE,						      \
 	MR_PASTE2(__,							      \
@@ -303,7 +318,7 @@
 	MR_PASTE2(_,							      \
 	          ARITY)))))))
 
-#define MR_type_ctor_info_func_name(MODULE, TYPE, ARITY, FUNC)		      \
+  #define MR_type_ctor_info_func_name(MODULE, TYPE, ARITY, FUNC)	      \
 	MR_PASTE2(mercury__,						      \
 	MR_PASTE2(MODULE,						      \
 	MR_PASTE2(__,							      \
@@ -314,17 +329,44 @@
 	MR_PASTE2(ARITY,						      \
 	          _0))))))))
 
-#define MR_special_func_type(NAME, ARITY) \
+  #define MR_special_func_type(NAME, ARITY) \
 	MR_PASTE2(MR_, MR_PASTE2(NAME, MR_PASTE2(Func_, ARITY)))
 
-#define MR_define_type_ctor_info(module, type, arity, type_rep)		      \
+  #ifdef MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO
+
+    #define MR_define_type_ctor_info(module, type, arity, type_rep)	      \
 	const struct MR_TypeCtorInfo_Struct				      \
 		MR_type_ctor_info_name(module, type, arity) =		      \
 	{								      \
 		arity,							      \
+		MR_RTTI_VERSION,					      \
+		type_rep,						      \
+		-1,							      \
 		(MR_Box) MR_type_ctor_info_func_name(module, type, arity,     \
 				do_unify),				      \
 		(MR_Box) MR_type_ctor_info_func_name(module, type, arity,     \
+				do_compare),				      \
+		type_rep,						      \
+		NULL,							      \
+		NULL,							      \
+		MR_STRINGIFY(module),					      \
+		MR_STRINGIFY(type),					      \
+		MR_RTTI_VERSION,					      \
+		{ 0 },							      \
+		{ 0 },							      \
+		-1							      \
+	}
+
+  #else	/* MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO */
+
+    #define MR_define_type_ctor_info(module, type, arity, type_rep)	      \
+	const struct MR_TypeCtorInfo_Struct				      \
+		MR_type_ctor_info_name(module, type, arity) =		      \
+	{								      \
+		arity,							      \
+		(MR_Box) MR_type_ctor_info_func_name(module, type, arity,     \
+				do_unify),				      \
+		(MR_Box) MR_type_ctor_info_func_name(module, type, arity,     \
 				do_unify),				      \
 		(MR_Box) MR_type_ctor_info_func_name(module, type, arity,     \
 				do_compare),				      \
@@ -340,6 +382,8 @@
 		-1							      \
 	}
 
+  #endif /* MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO */
+
 #endif /* MR_HIGHLEVEL_CODE */
 
 /*---------------------------------------------------------------------------*/
@@ -370,46 +414,6 @@
 /*---------------------------------------------------------------------------*/
 
 /*
-** Definitions and macros for type_ctor_layout definition.
-**
-** See compiler/base_type_layout.m for more information.
-**
-** If we don't have enough tags, we have to encode layouts
-** less densely. The make_typelayout macro does this, and
-** is intended for handwritten code. Compiler generated
-** code can (and does) just create two rvals instead of one.
-**
-** XXX This stuff is part of USEREQ type_ctor_infos and is obsolete;
-** it is needed now only for bootstrapping.
-*/
-
-/*
-** Conditionally define USE_TYPE_LAYOUT.
-**
-** All code using type_layout structures should check to see if
-** USE_TYPE_LAYOUT is defined, and give a fatal error otherwise.
-** USE_TYPE_LAYOUT can be explicitly turned off with NO_TYPE_LAYOUT.
-**
-*/
-#if !defined(NO_TYPE_LAYOUT)
-    #define USE_TYPE_LAYOUT
-#else
-    #undef USE_TYPE_LAYOUT
-#endif
-
-/*
-** Declaration for structs.
-*/
-
-#define MR_DECLARE_STRUCT(T)                                        \
-    extern const struct T##_struct T
-#define MR_DECLARE_TYPE_CTOR_INFO_STRUCT(T)                         \
-    extern const struct MR_TypeCtorInfo_Struct T
-
-/*---------------------------------------------------------------------------*/
-
-
-/*
 ** Offsets for dealing with `univ' types.
 **
 ** `univ' is represented as a two word structure.
@@ -494,7 +498,7 @@
 
 /*
 ** For each enumeration constant, we define it using two names;
-** firstly we define the unqualified name, and then we define
+** first we define the unqualified name, and then we define
 ** another enumeration constant whose name is the unqualified name
 ** prefixed with `mercury__private_builtin__' and whose value is
 ** the same as that of the unqualified name.
@@ -561,6 +565,14 @@
 } MR_TypeCtorRep;
 
 /*
+** We cannot put enums into structures as bit fields. To avoid wasting space,
+** we put MR_TypeCtorRepInts into structures instead of MR_TypeCtorReps
+** themselves.
+*/
+
+typedef	MR_int_least8_t		MR_TypeCtorRepInt;
+
+/*
 ** This macro is intended to be used for the initialization of an array
 ** that converts each MR_TypeCtorRep into a string form. Therefore it
 ** must be kept synchronized with the definition of MR_TypeCtorRep.
@@ -974,28 +986,42 @@
     ** A type_ctor_info describes the structure of a particular
     ** type constructor.  One of these is generated for every
     ** `:- type' declaration.
-    **
-    ** The unify_pred field will soon migrate to the slot now occupied by
-    ** the new_unify_pred field. In the near future, the two slots will
-    ** contain the same data.
     */
 
-struct MR_TypeCtorInfo_Struct {
+struct MR_OldTypeCtorInfo_Struct {
     MR_Integer          arity;
+    MR_ProcAddr         old_unify_pred;
     MR_ProcAddr         unify_pred;
-    MR_ProcAddr         new_unify_pred;
     MR_ProcAddr         compare_pred;
     MR_TypeCtorRep      type_ctor_rep;
     MR_ProcAddr         unused1;	/* spare */
     MR_ProcAddr         unused2;	/* spare */
     MR_ConstString      type_ctor_module_name;
     MR_ConstString      type_ctor_name;
-    MR_Integer          type_ctor_version;
+    MR_Integer          type_ctor_old_version;
     MR_TypeFunctors     type_functors;
     MR_TypeLayout       type_layout;
     MR_int_least32_t    type_ctor_num_functors;
     MR_int_least8_t     type_ctor_num_ptags;    /* if DU */
+};
 
+struct MR_NewTypeCtorInfo_Struct {
+    MR_Integer          arity;
+    MR_int_least8_t     MR_type_ctor_version;
+    MR_TypeCtorRepInt   MR_type_ctor_rep_CAST_ME;
+    MR_int_least8_t     MR_type_ctor_new_num_ptags;	/* if DU */
+    MR_ProcAddr         unify_pred;
+    MR_ProcAddr         compare_pred;
+    MR_Integer          MR_type_ctor_old_rep_CAST_ME;	/* will be unused */
+    MR_ProcAddr         MR_unused1;	/* spare */
+    MR_ProcAddr         MR_unused2;	/* spare */
+    MR_ConstString      type_ctor_module_name;
+    MR_ConstString      type_ctor_name;
+    MR_Integer          MR_type_ctor_old_version;	/* will be unused */
+    MR_TypeFunctors     type_functors;
+    MR_TypeLayout       type_layout;
+    MR_int_least32_t    type_ctor_num_functors;
+
 /*
 ** The following fields will be added later, once we can exploit them:
 **  union MR_TableNode_Union    **type_std_table;
@@ -1003,6 +1029,10 @@
 */
 };
 
+#define	MR_type_ctor_rep(type_ctor_info)			\
+		((MR_TypeCtorRep) ((const struct MR_NewTypeCtorInfo_Struct *) \
+			(type_ctor_info))->MR_type_ctor_old_rep_CAST_ME)
+
 /*---------------------------------------------------------------------------*/
 
 /*
@@ -1011,24 +1041,33 @@
 */
 
 #define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(m, cm, n, a, cr, u, c)    \
-    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_A(u, c)                       \
-    MR_PASTE6(mercury_data_, cm, __type_ctor_info_, n, _, a) = {        \
-    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_B(m, n, a, cr, u, c)
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_DECLARE_ADDRS(u, c)		\
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_TYPE				\
+    MR_PASTE6(mercury_data_, cm, __type_ctor_info_, n, _, a) =		\
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_BODY(m, n, a, cr, u, c)
 
     /* MSVC CPP doesn't like having an empty CM field. */
 #define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(m, n, a, cr, u, c)        \
-    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_A(u, c)                       \
-    MR_PASTE5(mercury_data_, __type_ctor_info_, n, _, a) = {            \
-    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_B(m, n, a, cr, u, c)
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_DECLARE_ADDRS(u, c)		\
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_TYPE				\
+    MR_PASTE5(mercury_data_, __type_ctor_info_, n, _, a) = 		\
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_BODY(m, n, a, cr, u, c)
 
-#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_A(u, c)                   \
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_DECLARE_ADDRS(u, c)		\
     MR_declare_entry(u);                                                \
-    MR_declare_entry(c);                                                \
-    MR_STATIC_CODE_CONST struct MR_TypeCtorInfo_Struct                  \
+    MR_declare_entry(c);
+
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_TYPE				\
+    MR_STATIC_CODE_CONST struct MR_TypeCtorInfo_Struct
+
+#ifdef	MR_BOOTSTRAP_TYPE_CTOR_VERSION_NO
 
-#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_B(m, n, a, cr, u, c)      \
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_BODY(m, n, a, cr, u, c)	\
+    {									\
         a,                                                              \
-        MR_MAYBE_STATIC_CODE(MR_ENTRY(u)),                              \
+	MR_RTTI_VERSION,						\
+	cr,								\
+	-1,								\
         MR_MAYBE_STATIC_CODE(MR_ENTRY(u)),                              \
         MR_MAYBE_STATIC_CODE(MR_ENTRY(c)),                              \
         cr,                                                             \
@@ -1039,10 +1078,31 @@
         MR_RTTI_VERSION,                                                \
         { 0 },                                                          \
         { 0 },                                                          \
+	-1								\
+    }
+
+#else
+
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_BODY(m, n, a, cr, u, c)	\
+    {									\
+	a,								\
+	MR_MAYBE_STATIC_CODE(MR_ENTRY(u)),				\
+	MR_MAYBE_STATIC_CODE(MR_ENTRY(u)),				\
+	MR_MAYBE_STATIC_CODE(MR_ENTRY(c)),				\
+	cr,								\
+	NULL,								\
+	NULL,								\
+	MR_string_const(MR_STRINGIFY(m), sizeof(MR_STRINGIFY(m))-1),	\
+	MR_string_const(MR_STRINGIFY(n), sizeof(MR_STRINGIFY(n))-1),	\
+	MR_RTTI_VERSION__CLEAN_LAYOUT,					\
+	{ 0 },								\
+	{ 0 },								\
         -1,                                                             \
         -1                                                              \
     }
 
+#endif
+
 #define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_PRED(m, n, a, cr, u, c)        \
     MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(m, m, n, a, cr, u, c)
 
@@ -1099,21 +1159,18 @@
 
   #define   MR_INIT_BUILTIN_TYPE_CTOR_INFO(B, T)            		\
   do {                                                      		\
-    (B).unify_pred = MR_ENTRY(mercury__builtin_unify##T##2_0);      \
     (B).new_unify_pred = MR_ENTRY(mercury__builtin_unify##T##2_0);  \
     (B).compare_pred = MR_ENTRY(mercury__builtin_compare##T##3_0);  \
   } while (0)
 
   #define   MR_INIT_TYPE_CTOR_INFO_WITH_PRED(B, P)                  \
   do {                                                              \
-    (B).unify_pred = MR_ENTRY(P);                                   \
     (B).new_unify_pred = MR_ENTRY(P);                               \
     (B).compare_pred = MR_ENTRY(P);                                 \
   } while (0)
 
   #define   MR_INIT_TYPE_CTOR_INFO(B, T)                            \
   do {                                                              \
-    (B).unify_pred = MR_ENTRY(mercury____##Unify##___##T);          \
     (B).new_unify_pred = MR_ENTRY(mercury____##Unify##___##T);      \
     (B).compare_pred = MR_ENTRY(mercury____##Compare##___##T);      \
   } while (0)
@@ -1134,6 +1191,17 @@
     do { } while (0)
 
 #endif /* MR_STATIC_CODE_ADDRESSES */
+
+/*---------------------------------------------------------------------------*/
+
+/*
+** Declaration for structs.
+*/
+
+#define MR_DECLARE_STRUCT(T)                                        \
+    extern MR_STATIC_CODE_CONST struct T##_struct T
+#define MR_DECLARE_TYPE_CTOR_INFO_STRUCT(T)                         \
+    extern MR_STATIC_CODE_CONST struct MR_TypeCtorInfo_Struct T
 
 /*---------------------------------------------------------------------------*/
 
Index: runtime/mercury_unify_compare_body.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_unify_compare_body.h,v
retrieving revision 1.12
diff -u -b -r1.12 mercury_unify_compare_body.h
--- runtime/mercury_unify_compare_body.h	2001/10/24 07:43:25	1.12
+++ runtime/mercury_unify_compare_body.h	2001/12/29 06:03:44
@@ -48,7 +48,7 @@
     MR_register_type_ctor_stat(&type_stat_struct, type_ctor_info);
 #endif
 
-    switch (type_ctor_info->type_ctor_rep) {
+    switch (MR_type_ctor_rep(type_ctor_info)) {
 
 #ifdef  MR_COMPARE_BY_RTTI
 
Index: runtime/mercury_wrapper.c
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_wrapper.c,v
retrieving revision 1.93
diff -u -b -r1.93 mercury_wrapper.c
--- runtime/mercury_wrapper.c	2001/12/27 07:25:24	1.93
+++ runtime/mercury_wrapper.c	2001/12/29 06:03:45
@@ -1234,7 +1234,7 @@
 {
 	int	i;
 
-	type_stat->type_ctor_reps[type_ctor_info->type_ctor_rep]++;
+	type_stat->type_ctor_reps[MR_type_ctor_rep(type_ctor_info)]++;
 
 	for (i = 0; i < type_stat->type_ctor_name_next; i++) {
 		/*
@@ -1264,7 +1264,7 @@
 	type_stat->type_ctor_names[i].type_stat_name =
 		type_ctor_info->type_ctor_name;
 	type_stat->type_ctor_names[i].type_stat_ctor_rep =
-		type_ctor_info->type_ctor_rep;
+		MR_type_ctor_rep(type_ctor_info);
 	type_stat->type_ctor_names[i].type_stat_count = 1;
 	type_stat->type_ctor_name_next++;
 }
cvs diff: Diffing runtime/GETOPT
cvs diff: Diffing runtime/machdeps
cvs diff: Diffing samples
cvs diff: Diffing samples/c_interface
cvs diff: Diffing samples/c_interface/c_calls_mercury
cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/c_interface/mercury_calls_c
cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/diff
cvs diff: Diffing samples/muz
cvs diff: Diffing samples/rot13
cvs diff: Diffing samples/solutions
cvs diff: Diffing samples/tests
cvs diff: Diffing samples/tests/c_interface
cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/tests/diff
cvs diff: Diffing samples/tests/muz
cvs diff: Diffing samples/tests/rot13
cvs diff: Diffing samples/tests/solutions
cvs diff: Diffing samples/tests/toplevel
cvs diff: Diffing scripts
cvs diff: Diffing tests
cvs diff: Diffing tests/benchmarks
cvs diff: Diffing tests/debugger
cvs diff: Diffing tests/debugger/declarative
cvs diff: Diffing tests/dppd
cvs diff: Diffing tests/general
cvs diff: Diffing tests/general/accumulator
cvs diff: Diffing tests/general/structure_reuse
cvs diff: Diffing tests/hard_coded
cvs diff: Diffing tests/hard_coded/exceptions
cvs diff: Diffing tests/hard_coded/purity
cvs diff: Diffing tests/hard_coded/sub-modules
cvs diff: Diffing tests/hard_coded/typeclasses
cvs diff: Diffing tests/invalid
cvs diff: Diffing tests/invalid/purity
cvs diff: Diffing tests/misc_tests
cvs diff: Diffing tests/recompilation
cvs diff: Diffing tests/tabling
cvs diff: Diffing tests/term
cvs diff: Diffing tests/valid
cvs diff: Diffing tests/warnings
cvs diff: Diffing tools
cvs diff: Diffing trace
cvs diff: Diffing util
--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list