[m-rev.] for review: debugging typeclass_infos

Zoltan Somogyi zs at cs.mu.OZ.AU
Mon Jan 19 11:30:37 AEDT 2004


For review by Fergus and/or Sam.

Zoltan.

Make it easier to debug code that handles typeclass_infos, by

- renaming the macros that access the fields of typeclass_infos and
  base_typeclass_infos to better reflect their purpose,

- adding a new macro when one macro was being used for two different purposes,
  and

- providing versions of those macros that perform sanity checks on each access.

runtime/mercury_type_info.h:
	Make the changes described above.

runtime/mercury_conf_param.h:
	Document the macros, MR_CHECK_TYPECLASS_REFS, whose definition
	enables the runtime checks.

library/private_builtin.m:
	Use the updated names of the macros, and standardize indentation.

runtime/mercury_deep_copy_body.h:
runtime/mercury_ho_call.c:
runtime/mercury_layout_util.c:
runtime/mercury_tabling.c:
runtime/mercury_type_info.c:
runtime/mercury_unify_compare_body.h:
	Use the updated names of the macros.

runtime/mercury_type_info.c:
	Add a function for reporting violations of the sanity checks.

cvs diff: Diffing .
cvs diff: Diffing analysis
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
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/error
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/lex/tests
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 java/library
cvs diff: Diffing java/runtime
cvs diff: Diffing library
Index: library/private_builtin.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/library/private_builtin.m,v
retrieving revision 1.132
diff -u -r1.132 private_builtin.m
--- library/private_builtin.m	1 Dec 2003 13:17:10 -0000	1.132
+++ library/private_builtin.m	13 Jan 2004 10:46:07 -0000
@@ -345,7 +345,8 @@
 
 :- pragma foreign_code("C#", "
 
-public static object[] MR_typeclass_info_type_info(object[] tcinfo, int index)
+public static object[] MR_typeclass_info_param_type_info(object[] tcinfo,
+	int index)
 {
 	object[] tmp;
 	int t1;
@@ -354,7 +355,7 @@
 	t1 = System.Convert.ToInt32(tmp[0]) + index;
 	return (object[]) tcinfo[t1];
 }
-public static object[] MR_typeclass_info_unconstrained_type_info(
+public static object[] MR_typeclass_info_instance_tvar_type_info(
 	object[] tcinfo, int index) 
 {
 	return (object[]) tcinfo[index];
@@ -506,22 +507,22 @@
 		TypeInfo::out),
 			[will_not_call_mercury, promise_pure, thread_safe],
 "
-	TypeInfo = MR_typeclass_info_type_info(TypeClassInfo, Index);
+	TypeInfo = MR_typeclass_info_param_type_info(TypeClassInfo, Index);
 ").
 
 :- pragma foreign_proc("C",
 	unconstrained_type_info_from_typeclass_info(TypeClassInfo::in,
 		Index::in, TypeInfo::out),
-			[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
-	TypeInfo = MR_typeclass_info_unconstrained_type_info(TypeClassInfo,
+	TypeInfo = MR_typeclass_info_instance_tvar_type_info(TypeClassInfo,
 			Index);
 ").
 
 :- pragma foreign_proc("C",
 	superclass_from_typeclass_info(TypeClassInfo0::in, Index::in,
 		TypeClassInfo::out),
-			[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
 	TypeClassInfo =
 		MR_typeclass_info_superclass_info(TypeClassInfo0, Index);
@@ -530,7 +531,7 @@
 :- pragma foreign_proc("C",
 	instance_constraint_from_typeclass_info(TypeClassInfo0::in,
 		Index::in, TypeClassInfo::out),
-		[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
 	TypeClassInfo =
 		MR_typeclass_info_arg_typeclass_info(TypeClassInfo0, Index);
@@ -539,24 +540,24 @@
 :- pragma foreign_proc("C#",
 	type_info_from_typeclass_info(TypeClassInfo::in, Index::in,
 		TypeInfo::out),
-		[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
-	TypeInfo = MR_typeclass_info_type_info(TypeClassInfo, Index);
+	TypeInfo = MR_typeclass_info_param_type_info(TypeClassInfo, Index);
 ").
 
 :- pragma foreign_proc("C#",
 	unconstrained_type_info_from_typeclass_info(TypeClassInfo::in,
 		Index::in, TypeInfo::out),
-		[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
-	TypeInfo = MR_typeclass_info_unconstrained_type_info(TypeClassInfo,
+	TypeInfo = MR_typeclass_info_instance_tvar_type_info(TypeClassInfo,
 			Index);
 ").
 
 :- pragma foreign_proc("C#",
 	superclass_from_typeclass_info(TypeClassInfo0::in, Index::in,
 		TypeClassInfo::out),
-		[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
 	TypeClassInfo =
 		MR_typeclass_info_superclass_info(TypeClassInfo0, Index);
@@ -565,7 +566,7 @@
 :- pragma foreign_proc("C#",
 	instance_constraint_from_typeclass_info(TypeClassInfo0::in,
 		Index::in, TypeClassInfo::out),
-		[will_not_call_mercury, promise_pure, thread_safe],
+	[will_not_call_mercury, promise_pure, thread_safe],
 "
 	TypeClassInfo =
 		MR_typeclass_info_arg_typeclass_info(TypeClassInfo0, Index);
cvs diff: Diffing profiler
cvs diff: Diffing robdd
cvs diff: Diffing runtime
Index: runtime/mercury_conf_param.h
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_conf_param.h,v
retrieving revision 1.74
diff -u -r1.74 mercury_conf_param.h
--- runtime/mercury_conf_param.h	5 Nov 2003 08:51:20 -0000	1.74
+++ runtime/mercury_conf_param.h	13 Jan 2004 09:57:38 -0000
@@ -131,6 +131,9 @@
 **
 **	Normally MR_CHECK_FOR_OVERFLOW is not set, since
 **	we trap overflows using mprotect().
+**
+** MR_CHECK_TYPECLASS_REFS
+** 	Check for improper use of typeclass_infos and base_typeclass_infos.
 */
 
 /*
Index: runtime/mercury_deep_copy_body.h
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_deep_copy_body.h,v
retrieving revision 1.65
diff -u -r1.65 mercury_deep_copy_body.h
--- runtime/mercury_deep_copy_body.h	18 Dec 2003 10:41:16 -0000	1.65
+++ runtime/mercury_deep_copy_body.h	13 Jan 2004 09:57:38 -0000
@@ -827,7 +827,7 @@
             MR_typeclass_info_num_extra_instance_args(typeclass_info)
                 - num_instance_constraints;
         num_super = MR_typeclass_info_num_superclasses(typeclass_info);
-        num_arg_typeinfos = MR_typeclass_info_num_type_infos(typeclass_info);
+        num_arg_typeinfos = MR_typeclass_info_num_params(typeclass_info);
         MR_offset_incr_saved_hp(MR_LVALUE_CAST(MR_Word, new_typeclass_info),
             forwarding_pointer_size,
             forwarding_pointer_size + 1 /* for basetypeclass_info */
Index: runtime/mercury_ho_call.c
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_ho_call.c,v
retrieving revision 1.68
diff -u -r1.68 mercury_ho_call.c
--- runtime/mercury_ho_call.c	5 Jan 2004 09:04:33 -0000	1.68
+++ runtime/mercury_ho_call.c	13 Jan 2004 11:53:22 -0000
@@ -595,7 +595,7 @@
 
 	for (i = num_extra_instance_args; i > 0; i--) {
 		MR_virtual_reg(i) = 
-			MR_typeclass_info_arg_typeclass_info(MR_virtual_reg(1),
+			MR_typeclass_info_extra_instance_arg(MR_virtual_reg(1),
 				i);
 	}
 
@@ -668,7 +668,7 @@
 
 	for (i = num_extra_instance_args; i > 0; i--) {
 		MR_virtual_reg(i) = 
-			MR_typeclass_info_arg_typeclass_info(MR_virtual_reg(1),
+			MR_typeclass_info_extra_instance_arg(MR_virtual_reg(1),
 				i);
 	}
 
Index: runtime/mercury_layout_util.c
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_layout_util.c,v
retrieving revision 1.32
diff -u -r1.32 mercury_layout_util.c
--- runtime/mercury_layout_util.c	25 Sep 2003 07:56:47 -0000	1.32
+++ runtime/mercury_layout_util.c	13 Jan 2004 09:57:38 -0000
@@ -348,7 +348,8 @@
 			if (! *succeeded) {
 				break;
 			}
-			value = MR_typeclass_info_type_info(baseaddr, offset);
+			value = MR_typeclass_info_param_type_info(baseaddr,
+				offset);
 			*succeeded = MR_TRUE;
 			break;
 
@@ -456,7 +457,8 @@
 			if (! *succeeded) {
 				break;
 			}
-			value = MR_typeclass_info_type_info(baseaddr, offset);
+			value = MR_typeclass_info_param_type_info(baseaddr,
+				offset);
 			*succeeded = MR_TRUE;
 			break;
 
@@ -560,7 +562,8 @@
 			if (! *succeeded) {
 				break;
 			}
-			value = MR_typeclass_info_type_info(baseaddr, offset);
+			value = MR_typeclass_info_param_type_info(baseaddr,
+				offset);
 			*succeeded = MR_TRUE;
 			break;
 
@@ -669,7 +672,7 @@
 			if (! *succeeded) {
 				break;
 			}
-			value = MR_typeclass_info_type_info(baseaddr,
+			value = MR_typeclass_info_param_type_info(baseaddr,
 				offset);
 			*succeeded = MR_TRUE;
 			break;
Index: runtime/mercury_tabling.c
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_tabling.c,v
retrieving revision 1.59
diff -u -r1.59 mercury_tabling.c
--- runtime/mercury_tabling.c	13 May 2003 08:52:08 -0000	1.59
+++ runtime/mercury_tabling.c	13 Jan 2004 09:57:38 -0000
@@ -988,7 +988,7 @@
                                 arg_vector[locns[i].MR_exist_arg_num]);
                         } else {
                             MR_DEBUG_TABLE_TYPEINFO(table, (MR_TypeInfo)
-                                MR_typeclass_info_type_info(
+                                MR_typeclass_info_param_type_info(
                                     arg_vector[locns[i].MR_exist_arg_num],
                                     locns[i].MR_exist_offset_in_tci));
                         }
Index: runtime/mercury_type_info.c
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_type_info.c,v
retrieving revision 1.58
diff -u -r1.58 mercury_type_info.c
--- runtime/mercury_type_info.c	23 Oct 2003 02:02:31 -0000	1.58
+++ runtime/mercury_type_info.c	13 Jan 2004 09:57:38 -0000
@@ -124,7 +124,7 @@
 	if (offset < 0) {
 		return (MR_TypeInfo) data_value[slot];
 	} else {
-		return (MR_TypeInfo) MR_typeclass_info_type_info(
+		return (MR_TypeInfo) MR_typeclass_info_param_type_info(
 			data_value[slot], offset);
 	}
 }
@@ -487,4 +487,24 @@
 
 	MR_save_transient_registers();
 	return type_info_list;
+}
+
+MR_Word
+MR_typeclass_ref_error(MR_Word tci, int n, const char *msg)
+{
+	fprintf(stderr, "n1: # of extra instance args:   %d\n",
+		MR_typeclass_info_num_extra_instance_args(tci));
+	fprintf(stderr, "n1-n2: # of instance type vars: %d\n",
+		MR_typeclass_info_num_instance_type_vars(tci));
+	fprintf(stderr, "n2: # of instance constraints:  %d\n",
+		MR_typeclass_info_num_instance_constraints(tci));
+	fprintf(stderr, "n3: # of superclasses:          %d\n",
+		MR_typeclass_info_num_superclasses(tci));
+	fprintf(stderr, "n4: # of parameters:            %d\n",
+		MR_typeclass_info_num_params(tci));
+	fprintf(stderr, "access parameters: %s, %d\n", msg, n);
+	MR_fatal_error("typeclass_info reference error");
+
+	/* not reached */
+	return 0;
 }
Index: runtime/mercury_type_info.h
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_type_info.h,v
retrieving revision 1.108
diff -u -r1.108 mercury_type_info.h
--- runtime/mercury_type_info.h	23 Oct 2003 02:02:31 -0000	1.108
+++ runtime/mercury_type_info.h	13 Jan 2004 11:52:44 -0000
@@ -408,44 +408,97 @@
 /*---------------------------------------------------------------------------*/
 
 /*
-** Definitions for accessing the representation of the
-** Mercury typeclass_info.
+** Definitions for accessing typeclass_infos and base_typeclass_infos.
+** Their structure is described type_class_transformation.html in
+** compiler/notes.
 */
 
+#define MR_typeclass_info_base(tci)                                 \
+    (*(MR_Word **)(tci))
+
 #define MR_typeclass_info_num_extra_instance_args(tci)              \
-    ((MR_Integer)(*(MR_Word **)(tci))[0])
+    ((MR_Integer) MR_typeclass_info_base(tci)[0])
 #define MR_typeclass_info_num_instance_constraints(tci)             \
-    ((MR_Integer)(*(MR_Word **)(tci))[1])
+    ((MR_Integer) MR_typeclass_info_base(tci)[1])
 #define MR_typeclass_info_num_superclasses(tci)                     \
-    ((MR_Integer)(*(MR_Word **)(tci))[2])
-#define MR_typeclass_info_num_type_infos(tci)                       \
-    ((MR_Integer)(*(MR_Word **)(tci))[3])
+    ((MR_Integer) MR_typeclass_info_base(tci)[2])
+#define MR_typeclass_info_num_params(tci)                           \
+    ((MR_Integer) MR_typeclass_info_base(tci)[3])
 #define MR_typeclass_info_num_methods(tci)                          \
-    ((MR_Integer)(*(MR_Word **)(tci))[4])
+    ((MR_Integer) MR_typeclass_info_base(tci)[4])
 #define MR_typeclass_info_class_method(tci, n)                      \
-    ((MR_Code *)(*(MR_Word **)tci)[(n+4)])
+    ((MR_Code *) MR_typeclass_info_base(tci)[(n+4)])
+
+#define MR_typeclass_info_num_instance_type_vars(tci)               \
+    ( MR_typeclass_info_num_extra_instance_args(tci)                \
+    - MR_typeclass_info_num_instance_constraints(tci))
+
+/*
+** Report an attempt to access a typeclass_info with incorrect parameters,
+** and abort. MR_typeclass_ref_error doesn't return; the return value is there
+** only to appease the C typechecker.
+*/
+
+extern  MR_Word MR_typeclass_ref_error(MR_Word tci, int n, const char *msg);
 
 /*
-** The following have the same definitions. This is because
-** the call to MR_typeclass_info_arg_typeclass_info must already
-** have the number of unconstrained type variables for the instance
-** added to it.
+** Except for the sanity checks, the following macros have the same
+** definitions. This is because calls to MR_typeclass_info_arg_typeclass_info
+** must already have the number of type variables in the head of the instance
+** declaration added to it.
 */
-#define MR_typeclass_info_arg_typeclass_info(tci, n)                \
+
+#ifdef  MR_CHECK_TYPECLASS_REFS
+  #define MR_typeclass_info_extra_instance_arg(tci, n)              \
+    ((0 < (n) && (n) <= MR_typeclass_info_num_extra_instance_args(tci)) \
+    ? (((MR_Word *)(tci))[(n)])                                     \
+    : MR_typeclass_ref_error((tci), (n),                            \
+        "MR_typeclass_info_extra_instance_arg"))
+  #define MR_typeclass_info_instance_tvar_type_info(tci, n)         \
+    ((0 < (n) && (n) <= MR_typeclass_info_num_instance_type_vars(tci)) \
+    ? (((MR_Word *)(tci))[(n)])                                     \
+    : MR_typeclass_ref_error((tci), (n),                            \
+        "MR_typeclass_info_instance_tvar_type_info"))
+  #define MR_typeclass_info_arg_typeclass_info(tci, n)              \
+    ((MR_typeclass_info_num_instance_type_vars(tci) < (n)           \
+      && (n) <= MR_typeclass_info_num_extra_instance_args(tci))     \
+    ? (((MR_Word *)(tci))[(n)])                                     \
+    : MR_typeclass_ref_error((tci), (n),                            \
+        "MR_typeclass_info_arg_typeclass_info"))
+#else
+  #define MR_typeclass_info_extra_instance_arg(tci, n)              \
+    (((MR_Word *)(tci))[(n)])
+  #define MR_typeclass_info_instance_tvar_type_info(tci, n)         \
     (((MR_Word *)(tci))[(n)])
-#define MR_typeclass_info_unconstrained_type_info(tci, n)           \
+  #define MR_typeclass_info_arg_typeclass_info(tci, n)              \
     (((MR_Word *)(tci))[(n)])
+#endif
 
 /*
-** The following have the same definitions. This is because
-** the call to MR_typeclass_info_type_info must already have the
-** number of superclass_infos for the class added to it.
+** Except for the sanity checks, the following macros have the same
+** definitions. This is because calls to MR_typeclass_info_param_type_info
+** must already have the number of superclasses for the class added to it.
 */
 
-#define MR_typeclass_info_superclass_info(tci, n)                   \
+#ifdef  MR_CHECK_TYPECLASS_REFS
+  #define MR_typeclass_info_superclass_info(tci, n)                 \
+    ((0 < (n) && (n) <= MR_typeclass_info_num_superclasses(tci))    \
+    ? (((MR_Word *)(tci))[                                          \
+        MR_typeclass_info_num_extra_instance_args(tci) + (n)])      \
+    : MR_typeclass_ref_error((tci), (n), "MR_typeclass_info_superclass_info"))
+  #define MR_typeclass_info_param_type_info(tci, n)                 \
+    ((MR_typeclass_info_num_superclasses(tci) < (n)                 \
+      && ((n) - MR_typeclass_info_num_superclasses(tci))            \
+        <= MR_typeclass_info_num_params(tci))                       \
+    ? (((MR_Word *)(tci))[                                          \
+        MR_typeclass_info_num_extra_instance_args(tci) + (n)])      \
+    : MR_typeclass_ref_error((tci), (n), "MR_typeclass_info_param_type_info"))
+#else
+  #define MR_typeclass_info_superclass_info(tci, n)                 \
     (((MR_Word *)(tci))[MR_typeclass_info_num_extra_instance_args(tci) + (n)])
-#define MR_typeclass_info_type_info(tci, n)                         \
+  #define MR_typeclass_info_param_type_info(tci, n)                 \
     (((MR_Word *)(tci))[MR_typeclass_info_num_extra_instance_args(tci) + (n)])
+#endif
 
 /*---------------------------------------------------------------------------*/
 
Index: runtime/mercury_unify_compare_body.h
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_unify_compare_body.h,v
retrieving revision 1.33
diff -u -r1.33 mercury_unify_compare_body.h
--- runtime/mercury_unify_compare_body.h	1 Oct 2003 08:34:53 -0000	1.33
+++ runtime/mercury_unify_compare_body.h	13 Jan 2004 09:57:38 -0000
@@ -306,12 +306,14 @@
                             y_ti = (MR_TypeInfo)
                                 y_data_value[locns[i].MR_exist_arg_num];
                         } else {
-                            x_ti = (MR_TypeInfo) MR_typeclass_info_type_info(
-                                x_data_value[locns[i].MR_exist_arg_num],
-                                locns[i].MR_exist_offset_in_tci);
-                            y_ti = (MR_TypeInfo) MR_typeclass_info_type_info(
-                                y_data_value[locns[i].MR_exist_arg_num],
-                                locns[i].MR_exist_offset_in_tci);
+                            x_ti = (MR_TypeInfo)
+                                MR_typeclass_info_param_type_info(
+                                    x_data_value[locns[i].MR_exist_arg_num],
+                                    locns[i].MR_exist_offset_in_tci);
+                            y_ti = (MR_TypeInfo)
+                                MR_typeclass_info_param_type_info(
+                                    y_data_value[locns[i].MR_exist_arg_num],
+                                    locns[i].MR_exist_offset_in_tci);
                         }
                         MR_save_transient_registers();
                         result = MR_compare_type_info(x_ti, y_ti);
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/string_format
cvs diff: Diffing tests/general/structure_reuse
cvs diff: Diffing tests/grade_subdirs
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/mmc_make
cvs diff: Diffing tests/mmc_make/lib
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
cvs diff: Diffing vim
cvs diff: Diffing vim/after
cvs diff: Diffing vim/ftplugin
cvs diff: Diffing vim/syntax
--------------------------------------------------------------------------
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