[m-rev.] diff: get library compiling in ilc grade
Peter Ross
peter.ross at miscrit.be
Wed Feb 6 03:29:07 AEDT 2002
Hi,
===================================================================
Estimated hours taken: 1
Branches: main
Various changes to get the library to compile in the ilc grade.
library/deconstruct.m:
Add a missing private_builtin module_specifier to the calls to
sorry.
library/float.m:
library/int.m:
library/math.m:
library/rtti_implementation.m:
Add missing promise_pures to the foreign_procs.
library/private_builtin.m:
Add a predicate imp which is a do nothing predicate which is impure.
This is used to make calls to sorry/1 impure when needed.
library/type_desc.m:
Add calls to private_builtin__sorry/1 where needed.
Get namespace qualifiers correct for calls to
ML_call_rtti_compare_type_infos.
runtime/mercury_il.il:
Add get_ftn_ptr_heap_pointer_unify and get_ftn_ptr_heap_pointer_compare.
Index: library/deconstruct.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/deconstruct.m,v
retrieving revision 1.2
diff -u -r1.2 deconstruct.m
--- library/deconstruct.m 4 Feb 2002 05:22:48 -0000 1.2
+++ library/deconstruct.m 5 Feb 2002 16:21:21 -0000
@@ -394,11 +394,11 @@
}").
functor_dna(_Term::in, _Functor::out, _Arity::out) :-
- sorry("deconstruct__functor_dna/3").
+ private_builtin__sorry("deconstruct__functor_dna/3").
functor_can(Term::in, Functor::out, Arity::out) :-
rtti_implementation__deconstruct(Term, Functor, Arity, _Arguments).
functor_idcc(_Term::in, _Functor::out, _Arity::out) :-
- sorry("deconstruct__functor_idcc/3").
+ private_builtin__sorry("deconstruct__functor_idcc/3").
%-----------------------------------------------------------------------------%
@@ -535,19 +535,19 @@
}").
univ_arg_dna(_Term::in, _Index::in, _Arg::out) :-
- sorry("deconstruct__univ_arg_dna/3").
+ private_builtin__sorry("deconstruct__univ_arg_dna/3").
univ_arg_can(Term::in, Index::in, Arg::out) :-
rtti_implementation__deconstruct(Term, _Functor, _Arity, Arguments),
list__index0(Arguments, Index, Arg).
univ_arg_idcc(_Term::in, _Index::in, _Arg::out) :-
- sorry("deconstruct__univ_arg_idcc/3").
+ private_builtin__sorry("deconstruct__univ_arg_idcc/3").
univ_named_arg_dna(_Term::in, _Name::in, _Arg::out) :-
- sorry("deconstruct__univ_named_arg_dna/3").
+ private_builtin__sorry("deconstruct__univ_named_arg_dna/3").
univ_named_arg_can(_Term::in, _Name::in, _Arg::out) :-
- sorry("deconstruct__univ_named_arg_can/3").
+ private_builtin__sorry("deconstruct__univ_named_arg_can/3").
univ_named_arg_idcc(_Term::in, _Name::in, _Arg::out) :-
- sorry("deconstruct__univ_named_arg_idcc/3").
+ private_builtin__sorry("deconstruct__univ_named_arg_idcc/3").
%-----------------------------------------------------------------------------%
@@ -711,22 +711,22 @@
}").
deconstruct_dna(_Term::in, _Functor::out, _Arity::out, _Arguments::out) :-
- sorry("deconstuct__deconstruct_dna/4").
+ private_builtin__sorry("deconstuct__deconstruct_dna/4").
deconstruct_can(Term::in, Functor::out, Arity::out, Arguments::out) :-
rtti_implementation__deconstruct(Term, Functor, Arity, Arguments).
deconstruct_idcc(_Term::in, _Functor::out, _Arity::out, _Arguments::out) :-
- sorry("deconstuct__deconstruct_idcc/4").
+ private_builtin__sorry("deconstuct__deconstruct_idcc/4").
limited_deconstruct_dna(_Term::in, _MaxArity::in,
_Functor::out, _Arity::out, _Arguments::out) :-
- sorry("deconstuct__limited_deconstruct_dna/5").
+ private_builtin__sorry("deconstuct__limited_deconstruct_dna/5").
limited_deconstruct_can(Term::in, MaxArity::in,
Functor::out, Arity::out, Arguments::out) :-
rtti_implementation__deconstruct(Term, Functor, Arity, Arguments),
Arity =< MaxArity.
limited_deconstruct_idcc(_Term::in, _MaxArity::in,
_Functor::out, _Arity::out, _Arguments::out) :-
- sorry("deconstuct__limited_deconstruct_idcc/5").
+ private_builtin__sorry("deconstuct__limited_deconstruct_idcc/5").
%-----------------------------------------------------------------------------%
Index: library/float.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/float.m,v
retrieving revision 1.40
diff -u -r1.40 float.m
--- library/float.m 20 Jan 2002 07:32:20 -0000 1.40
+++ library/float.m 5 Feb 2002 16:21:22 -0000
@@ -238,7 +238,7 @@
").
:- pragma foreign_proc("MC++", domain_checks,
- [thread_safe], "
+ [thread_safe, promise_pure], "
#if ML_OMIT_MATH_DOMAIN_CHECKS
SUCCESS_INDICATOR = FALSE;
#else
Index: library/int.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/int.m,v
retrieving revision 1.81
diff -u -r1.81 int.m
--- library/int.m 20 Jan 2002 07:32:20 -0000 1.81
+++ library/int.m 5 Feb 2002 16:21:23 -0000
@@ -327,7 +327,7 @@
").
:- pragma foreign_proc("MC++", domain_checks,
- [thread_safe], "
+ [thread_safe, promise_pure], "
#if ML_OMIT_MATH_DOMAIN_CHECKS
SUCCESS_INDICATOR = FALSE;
#else
Index: library/math.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/math.m,v
retrieving revision 1.36
diff -u -r1.36 math.m
--- library/math.m 20 Jan 2002 07:32:22 -0000 1.36
+++ library/math.m 5 Feb 2002 16:21:26 -0000
@@ -256,7 +256,7 @@
").
:- pragma foreign_proc("MC++", domain_checks,
- [thread_safe], "
+ [thread_safe, promise_pure], "
#if ML_OMIT_MATH_DOMAIN_CHECKS
SUCCESS_INDICATOR = FALSE;
#else
@@ -363,7 +363,7 @@
SquareRoot = sqrt(X);
").
:- pragma foreign_proc("C#", math__sqrt_2(X::in) = (SquareRoot::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
SquareRoot = System.Math.Sqrt(X);
").
@@ -440,7 +440,7 @@
").
:- pragma foreign_proc("C#", math__pow_2(X::in, Y::in) = (Res::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
Res = System.Math.Pow(X, Y);
").
@@ -479,7 +479,7 @@
Log = log(X);
").
:- pragma foreign_proc("C#", math__ln_2(X::in) = (Log::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
Log = System.Math.Log(X);
").
@@ -504,7 +504,7 @@
Log10 = log10(X);
").
:- pragma foreign_proc("C#", math__log10_2(X::in) = (Log10::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
Log10 = System.Math.Log10(X);
").
@@ -529,7 +529,7 @@
Log2 = log(X) / ML_FLOAT_LN2;
").
:- pragma foreign_proc("C#", math__log2_2(X::in) = (Log2::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
Log2 = System.Math.Log(X) / ML_FLOAT_LN2;
").
@@ -562,7 +562,7 @@
Log = log(X)/log(B);
").
:- pragma foreign_proc("C#", math__log_2(B::in, X::in) = (Log::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
Log = System.Math.Log(X,B);
").
@@ -630,7 +630,7 @@
ASin = asin(X);
").
:- pragma foreign_proc("C#", math__asin_2(X::in) = (ASin::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
ASin = System.Math.Asin(X);
").
@@ -660,7 +660,7 @@
ACos = acos(X);
").
:- pragma foreign_proc("C#", math__acos_2(X::in) = (ACos::out),
- [thread_safe], "
+ [thread_safe, promise_pure], "
ACos = System.Math.Acos(X);
").
Index: library/private_builtin.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/private_builtin.m,v
retrieving revision 1.95
diff -u -r1.95 private_builtin.m
--- library/private_builtin.m 5 Feb 2002 09:23:22 -0000 1.95
+++ library/private_builtin.m 5 Feb 2002 16:21:27 -0000
@@ -915,16 +915,22 @@
% Default (Mercury) implementations.
% These should be overridden by the appropriate foreign language implementation.
store_ticket(_Ticket::out) :-
+ impure imp,
sorry("private_builtin__store_ticket/1").
reset_ticket_undo(_Ticket::in) :-
+ impure imp,
sorry("private_builtin__reset_ticket_undo/1").
reset_ticket_commit(_Ticket::in) :-
+ impure imp,
sorry("private_builtin__reset_ticket_commit/1").
reset_ticket_solve(_Ticket::in) :-
+ impure imp,
sorry("private_builtin__reset_ticket_solve/1").
mark_ticket_stack(_TicketCounter::out) :-
+ impure imp,
sorry("private_builtin__mark_ticket_stack/1").
prune_tickets_to(_TicketCounter::in) :-
+ impure imp,
sorry("private_builtin__prune_tickets_to/1").
/****
% XXX we can't give default Mercury implementations for these,
@@ -1167,6 +1173,7 @@
% default (Mercury) implementation for gc_trace/1
% This should be overridden by the appropriate foreign language implementation.
gc_trace(_::in) :-
+ impure imp,
sorry("private_builtin__gc_trace/1").
:- pragma foreign_proc("C", gc_trace(Pointer::in),
@@ -1187,6 +1194,7 @@
% default (Mercury) implementation for free_heap/1
% This should be overridden by the appropriate foreign language implementation.
free_heap(_::di) :-
+ impure imp,
sorry("private_builtin__free_heap/1").
:- pragma foreign_proc("C", free_heap(Val::di),
@@ -1196,8 +1204,10 @@
% default (Mercury) implementations for mark_hp/1 and restore_hp/1.
% This should be overridden by the appropriate foreign language implementation.
mark_hp(_::out) :-
+ impure imp,
sorry("private_builtin__mark_hp/1").
restore_hp(_::in) :-
+ impure imp,
sorry("private_builtin__restore_hp/1").
:- pragma foreign_proc("C", mark_hp(SavedHeapPointer::out),
@@ -1395,7 +1405,7 @@
{
mercury::runtime::Errors::fatal_error(
""called compare/3 for type `private_builtin:heap_pointer'"");
- return 0;
+ return;
}
").
@@ -1458,6 +1468,9 @@
:- pred sorry(string::in) is erroneous.
+% imp/0 is used to make pure predicates impure.
+:- impure pred imp is det.
+
%-----------------------------------------------------------------------------%
:- implementation.
@@ -1473,6 +1486,10 @@
sorry(PredName) :-
error("sorry, `" ++ PredName ++ "' not implemented\n" ++
"for this target language (or compiler back-end).").
+
+:- pragma foreign_proc(c, imp, [will_not_call_mercury, thread_safe], "").
+:- pragma foreign_proc(il, imp,
+ [will_not_call_mercury, thread_safe, max_stack_size(0)], "").
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%
Index: library/rtti_implementation.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/rtti_implementation.m,v
retrieving revision 1.13
diff -u -r1.13 rtti_implementation.m
--- library/rtti_implementation.m 30 Jan 2002 05:08:53 -0000 1.13
+++ library/rtti_implementation.m 5 Feb 2002 16:21:29 -0000
@@ -873,7 +873,8 @@
det_unimplemented("new_type_info").
:- pragma foreign_proc("C#",
- new_type_info(OldTypeInfo::in, Arity::in) = (NewTypeInfo::uo), [], "
+ new_type_info(OldTypeInfo::in, Arity::in) = (NewTypeInfo::uo),
+ [promise_pure], "
NewTypeInfo = new object[Arity + 1];
System.Array.Copy(OldTypeInfo, NewTypeInfo, OldTypeInfo.Length);
").
@@ -888,7 +889,7 @@
:- pragma foreign_proc("C#",
get_pti_from_arg_types(ArgTypes::in, Index::in) =
- (ArgTypeInfo::out), [], "
+ (ArgTypeInfo::out), [promise_pure], "
ArgTypeInfo = ArgTypes[Index];
").
@@ -901,7 +902,8 @@
det_unimplemented("get_pti_from_type_info").
:- pragma foreign_proc("C#",
- get_pti_from_type_info(TypeInfo::in, Index::in) = (PTI::out), [], "
+ get_pti_from_type_info(TypeInfo::in, Index::in) = (PTI::out),
+ [promise_pure], "
PTI = TypeInfo[Index];
").
@@ -959,7 +961,7 @@
:- pragma foreign_proc("C#",
get_subterm(TypeInfo::in, Term::in, Index::in,
- TagOffset::in) = (Arg::out), [], "
+ TagOffset::in) = (Arg::out), [promise_pure], "
Arg = ((object[]) Term)[Index + TagOffset];
TypeInfo_for_T = TypeInfo;
").
@@ -973,7 +975,7 @@
semidet_unimplemented("typeinfo_is_variable").
:- pragma foreign_proc("MC++",
- typeinfo_is_variable(TypeInfo::in, VarNum::out), [], "
+ typeinfo_is_variable(TypeInfo::in, VarNum::out), [promise_pure], "
SUCCESS_INDICATOR = (dynamic_cast<MR_Word>(TypeInfo) == NULL);
if (SUCCESS_INDICATOR) {
VarNum = System::Convert::ToInt32(TypeInfo);
@@ -1108,14 +1110,14 @@
det_unimplemented("get_remote_secondary_tag").
:- pragma foreign_proc("C#",
- get_primary_tag(X::in) = (Tag::out), [], "
+ get_primary_tag(X::in) = (Tag::out), [promise_pure], "
// We don't look at X to find the tag, for .NET low-level data
// there is no primary tag, so we always return zero.
Tag = 0;
").
:- pragma foreign_proc("C#",
- get_remote_secondary_tag(X::in) = (Tag::out), [], "
+ get_remote_secondary_tag(X::in) = (Tag::out), [promise_pure], "
object[] data = (object[]) X;
Tag = (int) data[0];
").
@@ -1145,7 +1147,7 @@
det_unimplemented("ptag_index").
:- pragma foreign_proc("C#",
- ptag_index(X::in, TypeLayout::in) = (PtagEntry::out), [], "
+ ptag_index(X::in, TypeLayout::in) = (PtagEntry::out), [promise_pure], "
PtagEntry = (object[]) TypeLayout[X];
").
@@ -1155,7 +1157,7 @@
det_unimplemented("sectag_locn").
:- pragma foreign_proc("C#",
- sectag_locn(PTagEntry::in) = (SectagLocn::out), [], "
+ sectag_locn(PTagEntry::in) = (SectagLocn::out), [promise_pure], "
SectagLocn = mercury.runtime.LowLevelData.make_enum((int)
PTagEntry[(int) ptag_layout_field_nums.sectag_locn]);
").
@@ -1167,7 +1169,7 @@
:- pragma foreign_proc("C#",
du_sectag_alternatives(X::in, PTagEntry::in) =
- (FunctorDescriptor::out), [], "
+ (FunctorDescriptor::out), [promise_pure], "
object[] sectag_alternatives;
sectag_alternatives = (object [])
PTagEntry[(int) ptag_layout_field_nums.sectag_alternatives];
@@ -1180,7 +1182,7 @@
det_unimplemented("functor_name").
:- pragma foreign_proc("C#",
- functor_name(FunctorDescriptor::in) = (Name::out), [], "
+ functor_name(FunctorDescriptor::in) = (Name::out), [promise_pure], "
Name = (string)
FunctorDescriptor[(int) du_functor_field_nums.du_functor_name];
").
@@ -1191,7 +1193,7 @@
det_unimplemented("functor_arity").
:- pragma foreign_proc("C#",
- functor_arity(FunctorDescriptor::in) = (Name::out), [], "
+ functor_arity(FunctorDescriptor::in) = (Name::out), [promise_pure], "
Name = (int)
FunctorDescriptor[(int)
du_functor_field_nums.du_functor_orig_arity];
@@ -1204,7 +1206,8 @@
det_unimplemented("functor_arg_types").
:- pragma foreign_proc("C#",
- functor_arg_types(FunctorDescriptor::in) = (ArgTypes::out), [], "
+ functor_arg_types(FunctorDescriptor::in) = (ArgTypes::out),
+ [promise_pure], "
ArgTypes = (object[])
FunctorDescriptor[(int)
du_functor_field_nums.du_functor_arg_types];
@@ -1217,7 +1220,8 @@
det_unimplemented("functor_exist_info").
:- pragma foreign_proc("C#",
- functor_exist_info(FunctorDescriptor::in) = (ExistInfo::out), [], "
+ functor_exist_info(FunctorDescriptor::in) = (ExistInfo::out),
+ [promise_pure], "
ExistInfo = (object[])
FunctorDescriptor[(int)
du_functor_field_nums.du_functor_exist_info];
@@ -1231,7 +1235,8 @@
det_unimplemented("typeinfo_locns_index").
:- pragma foreign_proc("C#",
- typeinfo_locns_index(X::in, ExistInfo::in) = (TypeInfoLocn::out), [], "
+ typeinfo_locns_index(X::in, ExistInfo::in) = (TypeInfoLocn::out),
+ [promise_pure], "
TypeInfoLocn = (object[]) ((object[]) ExistInfo[(int)
exist_info_field_nums.typeinfo_locns])[X];
@@ -1245,7 +1250,8 @@
det_unimplemented("exist_info_typeinfos_plain").
:- pragma foreign_proc("C#",
- exist_info_typeinfos_plain(ExistInfo::in) = (TypeInfosPlain::out), [], "
+ exist_info_typeinfos_plain(ExistInfo::in) = (TypeInfosPlain::out),
+ [promise_pure], "
TypeInfosPlain = (int)
ExistInfo[(int)
exist_info_field_nums.typeinfos_plain];
@@ -1257,7 +1263,7 @@
det_unimplemented("exist_info_tcis").
:- pragma foreign_proc("C#",
- exist_info_tcis(ExistInfo::in) = (TCIs::out), [], "
+ exist_info_tcis(ExistInfo::in) = (TCIs::out), [promise_pure], "
TCIs = (int) ExistInfo[(int)
exist_info_field_nums.tcis];
").
@@ -1272,7 +1278,7 @@
det_unimplemented("exist_arg_num").
:- pragma foreign_proc("C#",
- exist_arg_num(TypeInfoLocn::in) = (ArgNum::out), [], "
+ exist_arg_num(TypeInfoLocn::in) = (ArgNum::out), [promise_pure], "
ArgNum = (int) TypeInfoLocn[(int) exist_locn_field_nums.exist_arg_num];
").
@@ -1283,7 +1289,7 @@
det_unimplemented("exist_arg_num").
:- pragma foreign_proc("C#",
- exist_offset_in_tci(TypeInfoLocn::in) = (ArgNum::out), [], "
+ exist_offset_in_tci(TypeInfoLocn::in) = (ArgNum::out), [promise_pure], "
ArgNum = (int)
TypeInfoLocn[(int) exist_locn_field_nums.exist_offset_in_tci];
@@ -1295,7 +1301,8 @@
det_unimplemented("get_typeinfo_from_term").
:- pragma foreign_proc("C#",
- get_typeinfo_from_term(Term::in, Index::in) = (TypeInfo::out), [], "
+ get_typeinfo_from_term(Term::in, Index::in) = (TypeInfo::out),
+ [promise_pure], "
TypeInfo = (object[]) ((object[]) Term)[Index];
").
Index: library/type_desc.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/type_desc.m,v
retrieving revision 1.1
diff -u -r1.1 type_desc.m
--- library/type_desc.m 30 Jan 2002 05:08:56 -0000 1.1
+++ library/type_desc.m 5 Feb 2002 16:21:34 -0000
@@ -302,7 +302,7 @@
static int MR_compare_type_info(MR_Word t1, MR_Word t2) {
MR_Word res;
- mercury::types::mercury_code::ML_call_rtti_compare_type_infos(
+ mercury::type_desc::mercury_code::ML_call_rtti_compare_type_infos(
&res, t1, t2);
return System::Convert::ToInt32(res[0]);
}
@@ -311,7 +311,7 @@
__Compare____type_desc_0_0(
MR_Word_Ref result, MR_Word x, MR_Word y)
{
- mercury::types::mercury_code::ML_call_rtti_compare_type_infos(
+ mercury::type_desc::mercury_code::ML_call_rtti_compare_type_infos(
result, x, y);
}
@@ -325,7 +325,7 @@
special___Compare___type_desc_0_0(
MR_Word_Ref result, MR_Word x, MR_Word y)
{
- mercury::types::mercury_code::ML_call_rtti_compare_type_infos(
+ mercury::type_desc::mercury_code::ML_call_rtti_compare_type_infos(
result, x, y);
}
@@ -591,14 +591,9 @@
}
}").
-:- pragma foreign_proc("C#",
- make_type(_TypeCtorDesc::in, _ArgTypes::in) = (_TypeDesc::out),
- [will_not_call_mercury, thread_safe, promise_pure],
-"{
- mercury.runtime.Errors.SORRY(""make_type"");
- // XXX this is required to keep the C# compiler quiet
- SUCCESS_INDICATOR = false;
-}").
+:- pragma promise_pure(make_type/2).
+make_type(_TypeCtorDesc::in, _ArgTypes::in) = (_TypeDesc::out) :-
+ private_builtin__sorry("make_type/2 forward mode.").
/*
** This is the reverse mode of make_type: given a type,
@@ -622,6 +617,9 @@
MR_restore_transient_registers();
}").
+make_type(_TypeCtorDesc::out, _ArgTypes::out) = (_TypeDesc::in) :-
+ private_builtin__sorry("make_type/2 reverse mode").
+
:- pragma foreign_proc("C",
type_ctor_name_and_arity(TypeCtorDesc::in, TypeCtorModuleName::out,
TypeCtorName::out, TypeCtorArity::out),
@@ -655,6 +653,10 @@
TypeCtorArity = type_ctor_info->MR_type_ctor_arity;
}
}").
+
+type_ctor_name_and_arity(_TypeCtorDesc::in, _ModuleName::out,
+ _TypeCtorName::out, _TypeCtorArity::out) :-
+ private_builtin__sorry("type_ctor_name_and_arity/4").
%-----------------------------------------------------------------------------%
Index: runtime/mercury_il.il
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_il.il,v
retrieving revision 1.11
diff -u -r1.11 mercury_il.il
--- runtime/mercury_il.il 16 Aug 2001 15:04:13 -0000 1.11
+++ runtime/mercury_il.il 5 Feb 2002 16:21:35 -0000
@@ -45,6 +45,24 @@
.class public TempHack {
.method public static default int32
+get_ftn_ptr_heap_pointer_compare() {
+ ldftn void ['mercury'] 'mercury'.'private_builtin__cpp_code'.'mercury_code'::
+ do_compare__heap_pointer_1_0(
+ class [mscorlib]System.Object[], class [mscorlib]System.Object[]&,
+ class [mscorlib]System.Object, class [mscorlib]System.Object)
+ ret
+}
+
+.method public static default int32
+get_ftn_ptr_heap_pointer_unify() {
+ ldftn int32 ['mercury'] 'mercury'.'private_builtin__cpp_code'.'mercury_code'::
+ do_unify__heap_pointer_1_0(
+ class [mscorlib]System.Object[], class [mscorlib]System.Object,
+ class [mscorlib]System.Object)
+ ret
+}
+
+.method public static default int32
get_ftn_ptr_typeclass_info_compare() {
ldftn void ['mercury'] 'mercury'.'private_builtin__cpp_code'.'mercury_code'::
do_compare__typeclass_info_1_0(
--------------------------------------------------------------------------
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