[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