[m-rev.] diff: .NET backend runtime and library fixes

Tyson Dowd trd at cs.mu.OZ.AU
Wed May 2 23:36:43 AEST 2001


Hi,

Here are a bunch of changes for the .NET backend.  Most of my outstanding
runtime and library patches are in this change.  This breaks
compatibility with Beta 1.

Pete is waiting on these changes, so perhaps he can review them too.

===================================================================


Estimated hours taken: 5
Branches: main

Updates to the runtime and library for .NET backend.

These changes mean the runtime and library will no longer work for Beta 1.
If you want to use Beta 1, you will have to use mercury 0.10.x.

library/.cvsignore:
	Add .cpp .dll and .il files.

runtime/.cvsignore:
	Add .dll files.

library/Mmakefile:
	Add an assembly search patch to the MS_CLFLAGS
	Work around bugs in the assembly cache installer by generating one
	big .il file for the library.
	Generate a strong name file and use it.
	
library/array.m:
	Update the code to work correctly -- the MC++ compiler is now a bit
	stricter about type casts.

library/exception.m:
	Stop using an enum and use #defines -- the enum has stopped working.
	(I don't have time to figure out why just now).

library/float.m:
library/math.m:
	Some of the mathematical functions have changed names.

library/io.m:
	Use an ascii encoder to generate ASCII output by default.
	Without this we get Unicode UTF output, and it seems to like to
	insert a BOM (byte-order-mark) which means Hello World doesn't work
	anymore.

runtime/mercury_il.il:
	Insert .publickeytoken to identify the mercury assembly and mscorlib.
	Add ['mscorlib'] assembly refs to System.Object and ['mercury'] for
	mercury code.
	Use box and unbox instructions instead of our hand-hacked boxing
	classes.  Remove the old conversion classes.
	Add a missing return to mercury.Init::init_runtime()

runtime/mercury_mcpp.cpp:
	Minor fix: s/Exception/System.Exception/

runtime/mercury_mcpp.h:
	Fix the definition of MR_Array.
	Use array syntax for macros that manipulate arrays.


Index: library/.cvsignore
===================================================================
RCS file: /home/mercury1/repository/mercury/library/.cvsignore,v
retrieving revision 1.16
diff -u -r1.16 .cvsignore
--- library/.cvsignore	2000/06/27 14:25:23	1.16
+++ library/.cvsignore	2001/05/02 13:28:15
@@ -24,4 +24,7 @@
 Mercury
 *.ilk
 *.pdb
+*.cpp
+*.dll
+*.il
 libmer_std.lib
Index: library/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/mercury/library/Mmakefile,v
retrieving revision 1.60
diff -u -r1.60 Mmakefile
--- library/Mmakefile	2001/04/20 06:43:20	1.60
+++ library/Mmakefile	2001/05/02 13:28:17
@@ -86,7 +86,7 @@
 			$(INTERMODULE_OPTS) $(CHECK_TERM_OPTS)
 MGNUC	=	$(M_ENV) $(SCRIPTS_DIR)/mgnuc
 MGNUCFLAGS =	$(DLL_CFLAGS)
-MS_CLFLAGS  =	-I$(RUNTIME_DIR) 
+MS_CLFLAGS  =	-AI$(RUNTIME_DIR) -I$(RUNTIME_DIR)
 MS_CL_NOASM=:noAssembly
 LDFLAGS	=	-L$(BOEHM_GC_DIR) -L$(RUNTIME_DIR)
 ALL_LDFLAGS =	$(LDFLAGS) $(EXTRA_LDFLAGS)
@@ -238,23 +238,43 @@
 
 CPP_DLLS=$(MODULES_CONTAINING_C_CODE:%=%__c_code.dll)
 
-ALL_DLLS=$(library.dlls) $(CPP_DLLS) $(RUNTIME_DLLS) 
+ALL_DLLS=$(CPP_DLLS) $(library.dlls) $(RUNTIME_DLLS) 
 
 ALL_DLLS_BASE  = $(ALL_DLLS:%.dll=%)
 EMBED_ALL_DLLS = $(foreach dll_name,$(ALL_DLLS_BASE),$(EMBED_ONE_DLL))
-EMBED_ONE_DLL  = /embed:$(dll_name).dll,$(dll_name),Y
+EMBED_ONE_DLL  = /embed:$(dll_name).dll,$(dll_name)
 
+HACK_ALL_DLLS=$(CPP_DLLS) mercury_all.dll $(RUNTIME_DLLS)
+
+HACK_ALL_DLLS_BASE  = $(HACK_ALL_DLLS:%.dll=%)
+HACK_EMBED_ALL_DLLS = $(foreach dll_name,$(HACK_ALL_DLLS_BASE),$(EMBED_ONE_DLL))
+
+
+# Turn this on if you wish to enable .NET debugging.
+#MS_ILASMFLAGS = /debug
+
+
+# If you do generate a new strong name, you had better update the compiler
+# to generate references to it.  This is sub-optimal -- the compiler should
+# automatically find out what the strong name is.
+library_strong_name.sn:
+	sn -k library_strong_name.sn
+
+mercury_all.il: $(library.ils)
+	cat $(library.ils) > mercury_all.il	
+
+# For the moment we do this using one big DLL, as there are bugs in the
+# assembly cache installer (gacutil) that prevent us from installing large
+# numbers of assemblies.
+mercury.dll: $(HACK_ALL_DLLS) mercury_all.dll library_strong_name.sn
+	$(MS_AL) -v:0.0.0.0 -keyf:library_strong_name.sn -out:mercury.dll $(HACK_ALL_DLLS)
+
+
 # al is the assembly linker, it will create an assembly that references
 # all the modules (.dll files) in the library and runtime.
-mercury.dll: $(ALL_DLLS)
-	$(MS_AL) -out:mercury.dll $(ALL_DLLS)
+#mercury.dll: $(ALL_DLLS) library_strong_name.sn
+#	$(MS_AL) -v:0.0.0.0 -keyf:library_strong_name.sn -out:mercury.dll $(ALL_DLLS) $(EMBED_ALL_DLLS) 
 
-# This al command line will create a signed assembly that can be
-# installed into the assembly cache, but then you need to create a key
-# and actually start using the cache.  I haven't quite figured out how
-# this all works just yet.
-# al -v:1.0.0.0 -keyf:mercury.key -out:mercury.dll $(ALLDLLS)
-
 else
 
 # the following dependency is just there to improve compilation speed;
@@ -355,12 +375,24 @@
 	rm -f $(INSTALL_MODULE_DIR)/library.init \
 		$(INSTALL_MODULE_DIR)/libmercury.init
 
+
+ifneq (,$(findstring il,$(GRADE)))
+
 .PHONY: install_library
+install_library: $(library.dlls) $(CPP_DLLS) install_grade_dirs
+	cp `vpath_find $(library.dlls) $(CPP_DLLS) mercury.dll` \
+		$(INSTALL_MERC_LIB_DIR)
+	
+else
+
+.PHONY: install_library
 install_library: lib$(STD_LIB_NAME).$A \
 		lib$(STD_LIB_NAME).$(EXT_FOR_SHARED_LIB) install_grade_dirs
 	cp `vpath_find lib$(STD_LIB_NAME).$A \
 		lib$(STD_LIB_NAME).$(EXT_FOR_SHARED_LIB)` \
 		$(INSTALL_MERC_LIB_DIR)
+
+endif	# non IL grades
 
 # library.split.$A is a version of lib$(STD_LIB_NAME).$A that has been compiled
 # with `--split-c-files'.
Index: library/array.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/array.m,v
retrieving revision 1.88
diff -u -r1.88 array.m
--- library/array.m	2001/03/15 07:42:20	1.88
+++ library/array.m	2001/05/02 13:28:18
@@ -802,13 +802,13 @@
 		array__lookup(Array::array_ui, Index::in, Item::out),
 		[will_not_call_mercury, thread_safe], "{
         mercury::runtime::Errors::SORRY(""foreign code for this predicate"");
-	Item = Array->GetValue(Index);
+	Item = dynamic_cast<MR_Word>(Array->GetValue(Index));
 }").
 :- pragma foreign_proc("MC++",
 		array__lookup(Array::in, Index::in, Item::out),
 		[will_not_call_mercury, thread_safe], "{
         mercury::runtime::Errors::SORRY(""foreign code for this predicate"");
-	Item = Array->GetValue(Index);
+	Item = dynamic_cast<MR_Word>(Array->GetValue(Index));
 }").
 
 
Index: library/exception.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/exception.m,v
retrieving revision 1.45
diff -u -r1.45 exception.m
--- library/exception.m	2001/03/15 07:42:21	1.45
+++ library/exception.m	2001/05/02 13:28:23
@@ -304,21 +304,15 @@
 #ifndef ML_DETERMINISM_GUARD
 #define ML_DETERMINISM_GUARD
 
-	/*
-	** The enumeration constants in this enum must be in the same
-	** order as the functors in the Mercury type `determinism'
-	** defined above.
-	*/
-	typedef enum {
-		ML_DET,
-		ML_SEMIDET,
-		ML_CC_MULTI,
-		ML_CC_NONDET,
-		ML_MULTI,
-		ML_NONDET,
-		ML_ERRONEOUS,
-		ML_FAILURE
-	} ML_Determinism;
+#define ML_DET	0
+#define	ML_SEMIDET	1
+#define	ML_CC_MULTI	2
+#define	ML_CC_NONDET	3
+#define	ML_MULTI	4
+#define	ML_NONDET	5
+#define	ML_ERRONEOUS	6
+#define	ML_FAILURE	7
+
 #endif
 ").
 
Index: library/float.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/float.m,v
retrieving revision 1.34
diff -u -r1.34 float.m
--- library/float.m	2001/03/15 07:42:22	1.34
+++ library/float.m	2001/05/02 13:28:24
@@ -384,7 +384,7 @@
 :- pragma foreign_proc("MC++", float__ceiling_to_int(X :: in) = (Ceil :: out),
 	[will_not_call_mercury, thread_safe],
 "
-	Ceil = (MR_Integer) System::Math::Ceil(X);
+	Ceil = (MR_Integer) System::Math::Ceiling(X);
 ").
 
 float__ceiling_to_int(X, float__ceiling_to_int(X)).
Index: library/io.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/io.m,v
retrieving revision 1.223
diff -u -r1.223 io.m
--- library/io.m	2001/04/08 08:59:30	1.223
+++ library/io.m	2001/05/02 13:28:27
@@ -1135,6 +1135,7 @@
 	static MR_Word		ML_io_stream_names;
 	static MR_Word		ML_io_user_globals;
 	static int next_id;
+	static System::Text::ASCIIEncoding *ascii_encoder;
 ").
 
 
@@ -2829,8 +2830,23 @@
 		io__gc_init(_StreamNamesType::in, _UserGlobalsType::in,
 		IO0::di, IO::uo), will_not_call_mercury, "
 	update_io(IO0, IO);
+	ascii_encoder =	new System::Text::ASCIIEncoding();
 ").
 
+:- pred io__stream_init(io__state, io__state).
+:- mode io__stream_init(di, uo) is det.
+
+:- pragma foreign_proc("MC++", 
+		io__stream_init(IO0::di, IO::uo), will_not_call_mercury, "
+	ascii_encoder =	new System::Text::ASCIIEncoding();
+	update_io(IO0, IO);
+").
+
+:- pragma foreign_proc("C", 
+		io__stream_init(IO0::di, IO::uo), will_not_call_mercury, "
+	update_io(IO0, IO);
+").
+
 :- pred io__insert_std_stream_names(io__state, io__state).
 :- mode io__insert_std_stream_names(di, uo) is det.
 
@@ -2956,12 +2972,13 @@
 
 :- pragma foreign_decl("MC++", "
 
-	// XXX for efficiency we should re-use the same stream writer
-	// on a stream, perhaps we should store it with a stream.
+	// XXX currently we only handle text streams.
 
 __gc struct MR_MercuryFileStruct {
 public:
 	System::IO::Stream 	*stream;
+	System::IO::TextReader 	*reader;
+	System::IO::TextWriter 	*writer;
 	int		line_number;
 	int		id;
 };
@@ -3036,20 +3053,37 @@
 		int line_number) {
 	MR_MercuryFile mf = new MR_MercuryFileStruct();
 	mf->stream = stream;
+	mf->reader = NULL;
+	mf->writer = NULL;
 	mf->line_number = line_number;
 	mf->id = next_id++;
 	return mf;
 }
 
+static MR_MercuryFile new_open_mercury_file(System::IO::Stream *stream,
+		System::IO::TextReader *reader, System::IO::TextWriter *writer,
+		int line_number) {
+	MR_MercuryFile mf = new MR_MercuryFileStruct();
+	mf->stream = stream;
+	mf->reader = reader;
+	mf->writer = writer;
+	mf->line_number = line_number;
+	mf->id = next_id++;
+	return mf;
+}
+
 	// XXX this will cause problems with GUI programs that have no
 	// consoles.
 
 static MR_MercuryFile mercury_stdin =
-	new_mercury_file(System::Console::OpenStandardInput(), 1);
+	new_open_mercury_file(System::Console::OpenStandardInput(),
+		System::Console::In, NULL, 1);
 static MR_MercuryFile mercury_stdout =
-	new_mercury_file(System::Console::OpenStandardOutput(), 1);
+	new_open_mercury_file(System::Console::OpenStandardOutput(),
+		NULL, System::Console::Out, 1);
 static MR_MercuryFile mercury_stderr =
-	new_mercury_file(System::Console::OpenStandardError(), 1);
+	new_open_mercury_file(System::Console::OpenStandardError(),
+		NULL, System::Console::Error, 1);
 
 static MR_MercuryFile mercury_stdin_binary =
 	new_mercury_file(0, 1);
@@ -3060,9 +3094,11 @@
 	// use the mercury_files above.
 
 static MR_MercuryFile mercury_current_text_input =
-	new_mercury_file(System::Console::OpenStandardInput(), 1);
+	new_open_mercury_file(System::Console::OpenStandardInput(),
+		System::Console::In, NULL, 1);
 static MR_MercuryFile mercury_current_text_output =
-	new_mercury_file(System::Console::OpenStandardOutput(), 1);
+	new_open_mercury_file(System::Console::OpenStandardOutput(),
+		NULL, System::Console::Out, 1);
 static MR_MercuryFile mercury_current_binary_input =
         new_mercury_file(0, 1);
 static MR_MercuryFile mercury_current_binary_output =
@@ -3184,10 +3220,10 @@
 static void
 mercury_print_string(MR_MercuryFile mf, MR_String s)
 {
-	// XXX we should re-use the same stream writer...
-        System::IO::StreamWriter *w = new System::IO::StreamWriter(mf->stream);
-        w->Write(s);
-        w->Flush();
+	unsigned char ByteArray __gc[] = ascii_encoder->GetBytes(s);
+	mf->stream->Write(ByteArray, 0, ByteArray->get_Length());
+	mf->stream->Flush();
+
         for (int i = 0; i < s->Length; i++) {
                 if (s->Chars[i] == '\\n') {
                         mf->line_number++;
Index: library/library_strong_name.sn
===================================================================
RCS file: library_strong_name.sn
diff -N library_strong_name.sn
Binary files /dev/null and library_strong_name.sn differ
Index: library/math.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/math.m,v
retrieving revision 1.27
diff -u -r1.27 math.m
--- library/math.m	2001/03/15 07:42:23	1.27
+++ library/math.m	2001/05/02 13:28:28
@@ -307,7 +307,7 @@
 :- pragma foreign_proc("MC++", 
 	math__ceiling(Num::in) = (Ceil::out),
 		[will_not_call_mercury, thread_safe],"
-	Ceil = System::Math::Ceil(Num);
+	Ceil = System::Math::Ceiling(Num);
 ").
 
 %
@@ -360,7 +360,7 @@
 	math__truncate(X::in) = (Trunc::out),
 		[will_not_call_mercury, thread_safe],"
 	if (X < 0.0) {
-		Trunc = System::Math::Ceil(X);
+		Trunc = System::Math::Ceiling(X);
 	} else {
 		Trunc = System::Math::Floor(X);
 	}
Index: runtime/.cvsignore
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/.cvsignore,v
retrieving revision 1.8
diff -u -r1.8 .cvsignore
--- runtime/.cvsignore	2000/06/07 15:51:16	1.8
+++ runtime/.cvsignore	2001/05/02 13:28:39
@@ -1,4 +1,5 @@
 *.pic_o
+*.dll
 mercury_conf.h
 mer_rt.init
 mercury_conf.h.date
Index: runtime/mercury_il.il
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_il.il,v
retrieving revision 1.3
diff -u -r1.3 mercury_il.il
--- runtime/mercury_il.il	2001/01/22 04:20:40	1.3
+++ runtime/mercury_il.il	2001/05/02 13:28:40
@@ -11,11 +11,16 @@
 
 // Declare the assemblies we use
 
-.assembly extern mercury { }
-
-.assembly extern 'mercury_mcpp' { }
+.assembly extern 'mercury'{
+	.ver 0:0:0:0
+	.publickeytoken = ( 22 8C 16 7D 12 AA B B ) 
+}
 
-.assembly extern 'mercury.io' { }
+.assembly extern 'mscorlib'{
+	.ver 1:0:2411:0
+	.publickeytoken = ( B7 7A 5C 56 19 34 E0 89 ) 
+	.hash = ( B0 73 F2 4C 14 39 A 35 25 EA 45 F 60 58 C3 84 E0 3B E0 95 ) 
+}
 
 // ------------------------------------------------------------------------
 
@@ -32,8 +37,8 @@
 get_ftn_ptr_typeclass_info_compare() {
 	ldftn void ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_compare__typeclass_info_1_0(
-		class System.Object[], class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -41,8 +46,8 @@
 get_ftn_ptr_typeclass_info_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_unify__typeclass_info_1_0(
-		class System.Object[], class System.Object,
-		class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object,
+		class [mscorlib]System.Object)
 	ret
 }
 
@@ -50,8 +55,8 @@
 get_ftn_ptr_base_typeclass_info_compare() {
 	ldftn void ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_compare__base_typeclass_info_1_0(
-		class System.Object[], class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -59,8 +64,8 @@
 get_ftn_ptr_base_typeclass_info_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_unify__base_typeclass_info_1_0(
-		class System.Object[], class System.Object,
-		class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object,
+		class [mscorlib]System.Object)
 	ret
 }
 
@@ -68,8 +73,8 @@
 get_ftn_ptr_type_info_compare() {
 	ldftn void ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_compare__type_info_1_0(
-		class System.Object[], class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -77,8 +82,8 @@
 get_ftn_ptr_type_info_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_unify__type_info_1_0(
-		class System.Object[], class System.Object,
-		class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object,
+		class [mscorlib]System.Object)
 	ret
 }
 
@@ -86,8 +91,8 @@
 get_ftn_ptr_type_ctor_info_compare() {
 	ldftn void ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_compare__type_ctor_info_1_0(
-		class System.Object[], class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -95,8 +100,8 @@
 get_ftn_ptr_type_ctor_info_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'private_builtin__c_code'::
 	do_unify__type_ctor_info_1_0(
-		class System.Object[], class System.Object,
-		class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object,
+		class [mscorlib]System.Object)
 	ret
 }
 
@@ -104,8 +109,8 @@
 get_ftn_ptr_pred_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__pred_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -113,7 +118,7 @@
 get_ftn_ptr_pred_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__pred_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -121,8 +126,8 @@
 get_ftn_ptr_func_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__func_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -130,7 +135,7 @@
 get_ftn_ptr_func_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__func_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -138,15 +143,15 @@
 get_ftn_ptr_float_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__float_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 .method static default int32 
 get_ftn_ptr_float_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__float_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -154,15 +159,15 @@
 get_ftn_ptr_void_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__void_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 .method static default int32 
 get_ftn_ptr_void_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__void_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -170,8 +175,8 @@
 get_ftn_ptr_c_pointer_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__c_pointer_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -179,7 +184,7 @@
 get_ftn_ptr_c_pointer_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__c_pointer_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -187,8 +192,8 @@
 get_ftn_ptr_string_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__string_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -196,7 +201,7 @@
 get_ftn_ptr_string_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__string_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -204,8 +209,8 @@
 get_ftn_ptr_character_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__character_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -213,7 +218,7 @@
 get_ftn_ptr_character_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__character_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -221,8 +226,8 @@
 get_ftn_ptr_int_compare() {
 	ldftn void ['mercury'] 'mercury'.'builtin__c_code'::
 	do_compare__int_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -230,7 +235,7 @@
 get_ftn_ptr_int_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'builtin__c_code'::
 	do_unify__int_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -238,8 +243,8 @@
 get_ftn_ptr_array_compare() {
 	ldftn void ['mercury'] 'mercury'.'array__c_code'::
 	do_compare__array_1_0(
-		class System.Object[], class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -247,8 +252,8 @@
 get_ftn_ptr_array_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'array__c_code'::
 	do_unify__array_1_0(
-		class System.Object[], class System.Object,
-		class System.Object)
+		class [mscorlib]System.Object[], class [mscorlib]System.Object,
+		class [mscorlib]System.Object)
 	ret
 }
 
@@ -256,8 +261,8 @@
 get_ftn_ptr_type_desc_compare() {
 	ldftn void ['mercury'] 'mercury'.'std_util__c_code'::
 	do_compare__type_desc_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -265,7 +270,7 @@
 get_ftn_ptr_type_desc_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'std_util__c_code'::
 	do_unify__type_desc_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -273,8 +278,8 @@
 get_ftn_ptr_univ_compare() {
 	ldftn void ['mercury'] 'mercury'.'std_util__c_code'::
 	do_compare__univ_0_0(
-		class System.Object[]&,
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -282,90 +287,46 @@
 get_ftn_ptr_univ_unify() {
 	ldftn int32 ['mercury'] 'mercury'.'std_util__c_code'::
 	do_unify__univ_0_0(
-		class System.Object, class System.Object)
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
 } // end of class TempHack
 
 // ------------------------------------------------------------------------
+// The implementation of conversion routines.  It would be good to inline
+// this code whenever possible.
 
-// Implement some classes for boxing values.  Hopefully this is just
-// temporary while the box/unbox instructions were broken, apparently
-// they work now, so it's just SMOP to get rid of this code.
-
-.class public BoxedInt {
-
-.field public int32 val
-
-.method default void .ctor(int32 'intval')
-{
-	// call the parent constructor
-	ldarg.0
-	call instance void System.Object::.ctor()
-
-	// set the value
-	ldarg.0
-	ldarg 'intval'
-	stfld int32 mercury.runtime.BoxedInt::val
-	ret
-}
-
-}
-
-.class public BoxedFloat {
-
-.field public float64 val
-
-.method default void .ctor(float64 'floatval')
-{
-	// call the parent constructor
-	ldarg.0
-	call instance void System.Object::.ctor()
-
-	// set the value
-	ldarg.0
-	ldarg 'floatval'
-	stfld float64 mercury.runtime.BoxedFloat::val
-	ret
-}
-
-}
-
-// ------------------------------------------------------------------------
-
-// The implementation of conversion routines.  Written in IL so that we can
-// just plug in an implementation using box/unbox and see if it works.
-
 .class public ConvertImpl {
+
 
-.method static default class System.Object ToObject(int32 ival)
+.method static default class [mscorlib]System.Object ToObject(int32 ival)
 {
 	ldarg ival
-	newobj instance void mercury.runtime.BoxedInt::.ctor(int32)
+	box ['mscorlib']System.Int32
 	ret
 }
 
-.method static default class System.Object ToObject(float64 fval)
+.method static default class [mscorlib]System.Object ToObject(float64 fval)
 {
 	ldarg fval
-	newobj instance void mercury.runtime.BoxedFloat::.ctor(float64)
+	box ['mscorlib']System.Float64
 	ret
 }
 
-.method static default int32 ToInt32(class System.Object obj)
+.method static default int32 ToInt32(class [mscorlib]System.Object obj)
 {
 	ldarg obj
-	isinst class mercury.runtime.BoxedInt
-	ldfld int32 mercury.runtime.BoxedInt::val
+	unbox int32
+	ldobj int32
 	ret
 }
 
-.method static default float64 ToFloat64(class System.Object obj)
+.method static default float64 ToFloat64(class [mscorlib]System.Object obj)
 {
 	ldarg obj
-	isinst class mercury.runtime.BoxedFloat
-	ldfld float64 mercury.runtime.BoxedFloat::val
+	unbox float64
+	ldobj float64
 	ret
 }
 
@@ -380,49 +341,49 @@
 
 .class public GenericCall {
 
-.method static default  int32 semidet_call_3(class System.Object 'procedure', 
-	class System.Object 'X', class System.Object 'Y') 
+.method static default  int32 semidet_call_3(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	int32 (class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	int32 (class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
 
-.method static default  int32 semidet_call_4(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'X',
-	class System.Object 'Y') 
+.method static default  int32 semidet_call_4(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'X',
+	class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'T1'
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	int32 (class System.Object, class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	int32 (class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  int32 semidet_call_5(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'T2',
-	class System.Object 'X', class System.Object 'Y')
+.method static default  int32 semidet_call_5(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'T2',
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y')
 {
 	ldarg 'T1'
 	ldarg 'T2'
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	int32 (class System.Object, class System.Object, class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	int32 (class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  int32 semidet_call_6(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'T2',
-	class System.Object 'T3', class System.Object 'X',
-	class System.Object 'Y')
+.method static default  int32 semidet_call_6(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'T2',
+	class [mscorlib]System.Object 'T3', class [mscorlib]System.Object 'X',
+	class [mscorlib]System.Object 'Y')
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -430,15 +391,15 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	int32 (class System.Object, class System.Object, class System.Object, class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	int32 (class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  int32 semidet_call_7(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'T2',
-	class System.Object 'T3', class System.Object 'T4',
-	class System.Object 'X', class System.Object 'Y')
+.method static default  int32 semidet_call_7(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'T2',
+	class [mscorlib]System.Object 'T3', class [mscorlib]System.Object 'T4',
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y')
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -447,17 +408,17 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	int32 (class System.Object, class System.Object, class System.Object, class System.Object, class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	int32 (class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
 
-.method static default  int32 semidet_call_8(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'T2',
-	class System.Object 'T3', class System.Object 'T4',
-	class System.Object 'T5', class System.Object 'X',
-	class System.Object 'Y')
+.method static default  int32 semidet_call_8(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'T2',
+	class [mscorlib]System.Object 'T3', class [mscorlib]System.Object 'T4',
+	class [mscorlib]System.Object 'T5', class [mscorlib]System.Object 'X',
+	class [mscorlib]System.Object 'Y')
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -467,8 +428,8 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	int32 (class System.Object, class System.Object, class System.Object, class System.Object, class System.Object, class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	int32 (class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -476,40 +437,40 @@
 	// procedures that have two real parameters, and a variable number of
 	// type parameters.
 
-.method static default  void result_call_4(class System.Object 'procedure', 
-	class System.Object[]& 'result', class System.Object 'X', 
-	class System.Object 'Y') 
+.method static default  void result_call_4(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object[]& 'result', class [mscorlib]System.Object 'X', 
+	class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'result'
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	void (class System.Object[]&, class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	void (class [mscorlib]System.Object[]&, class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  void result_call_5(class System.Object 'procedure', 
-	class System.Object 'T1', 
-	class System.Object[]& 'result', 
-	class System.Object 'X', class System.Object 'Y') 
+.method static default  void result_call_5(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', 
+	class [mscorlib]System.Object[]& 'result', 
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'T1'
 	ldarg 'result'
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	void (class System.Object, class System.Object[]&,
-		class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	void (class [mscorlib]System.Object, class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  void result_call_6(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'T2',
-	class System.Object[]& 'result', 
-	class System.Object 'X', 
-	class System.Object 'Y')
+.method static default  void result_call_6(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'T2',
+	class [mscorlib]System.Object[]& 'result', 
+	class [mscorlib]System.Object 'X', 
+	class [mscorlib]System.Object 'Y')
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -517,18 +478,18 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	void (class System.Object,
-		class System.Object, class System.Object[]&,
-		class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	void (class [mscorlib]System.Object,
+		class [mscorlib]System.Object, class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  void result_call_7(class System.Object 'procedure', 
-	class System.Object 'T1', 
-	class System.Object 'T2', class System.Object 'T3', 
-	class System.Object[]& 'result', 
-	class System.Object 'X', class System.Object 'Y') 
+.method static default  void result_call_7(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', 
+	class [mscorlib]System.Object 'T2', class [mscorlib]System.Object 'T3', 
+	class [mscorlib]System.Object[]& 'result', 
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -537,18 +498,18 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	void (class System.Object, class System.Object,
-		class System.Object, class System.Object[]&,
-		class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	void (class [mscorlib]System.Object, class [mscorlib]System.Object,
+		class [mscorlib]System.Object, class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  void result_call_8(class System.Object 'procedure', 
-	class System.Object 'T1', class System.Object 'T2',
-	class System.Object 'T3', class System.Object 'T4',
-	class System.Object[]& 'result', 
-	class System.Object 'X', class System.Object 'Y') 
+.method static default  void result_call_8(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', class [mscorlib]System.Object 'T2',
+	class [mscorlib]System.Object 'T3', class [mscorlib]System.Object 'T4',
+	class [mscorlib]System.Object[]& 'result', 
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -558,20 +519,20 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	void (class System.Object, class System.Object,
-		class System.Object,
-		class System.Object, class System.Object[]&,
-		class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	void (class [mscorlib]System.Object, class [mscorlib]System.Object,
+		class [mscorlib]System.Object,
+		class [mscorlib]System.Object, class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
-.method static default  void result_call_9(class System.Object 'procedure', 
-	class System.Object 'T1', 
-	class System.Object 'T2', class System.Object 'T3', 
-	class System.Object 'T4', class System.Object 'T5', 
-	class System.Object[]& 'result',
-	class System.Object 'X', class System.Object 'Y') 
+.method static default  void result_call_9(class [mscorlib]System.Object 'procedure', 
+	class [mscorlib]System.Object 'T1', 
+	class [mscorlib]System.Object 'T2', class [mscorlib]System.Object 'T3', 
+	class [mscorlib]System.Object 'T4', class [mscorlib]System.Object 'T5', 
+	class [mscorlib]System.Object[]& 'result',
+	class [mscorlib]System.Object 'X', class [mscorlib]System.Object 'Y') 
 {
 	ldarg 'T1'
 	ldarg 'T2'
@@ -582,11 +543,11 @@
 	ldarg 'X'
 	ldarg 'Y'
 	ldarg 'procedure'
-	call 	int32 mercury.runtime.ConvertImpl::ToInt32(class System.Object)
-	calli	void (class System.Object, class System.Object,
-		class System.Object, class System.Object,
-		class System.Object, class System.Object[]&,
-		class System.Object, class System.Object)
+	call 	int32 ['mercury']mercury.runtime.ConvertImpl::ToInt32(class [mscorlib]System.Object)
+	calli	void (class [mscorlib]System.Object, class [mscorlib]System.Object,
+		class [mscorlib]System.Object, class [mscorlib]System.Object,
+		class [mscorlib]System.Object, class [mscorlib]System.Object[]&,
+		class [mscorlib]System.Object, class [mscorlib]System.Object)
 	ret
 }
 
@@ -599,7 +560,8 @@
 
 .class public 'Init' {
     .method static default void init_runtime() {
-        call void mercury.io::init_state_2_p_0()
+        call void ['mercury']mercury.io::init_state_2_p_0()
+	ret
     }
 }
 
Index: runtime/mercury_mcpp.cpp
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_mcpp.cpp,v
retrieving revision 1.4
diff -u -r1.4 mercury_mcpp.cpp
--- runtime/mercury_mcpp.cpp	2001/01/22 04:20:41	1.4
+++ runtime/mercury_mcpp.cpp	2001/05/02 13:28:40
@@ -30,7 +30,7 @@
 {
 public:
 	// XXX there should be a Mercury object here.
-    Exception(MR_String Msg) : Exception(Msg)
+    Exception(MR_String Msg)
     { 
 	// XXX this should set the exception message
     }
@@ -47,7 +47,7 @@
     }
     static MR_Box ToObject(MR_Char x)
     {
-        return ConvertImpl::ToObject((MR_Integer) x);
+        return ConvertImpl::ToObject((int) x);
     }
     static MR_Box ToObject(MR_Word x)
     {
Index: runtime/mercury_mcpp.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_mcpp.h,v
retrieving revision 1.6
diff -u -r1.6 mercury_mcpp.h
--- runtime/mercury_mcpp.h	2001/01/18 04:29:11	1.6
+++ runtime/mercury_mcpp.h	2001/05/02 13:28:44
@@ -40,7 +40,7 @@
 
 typedef __gc public class System::Object * MR_Word[];
 typedef __gc public class System::Object * MR_Box;
-typedef __gc public class System::Object * MR_Array;
+typedef __gc public class System::Object * MR_Array[];
 
 #define MR_Ref(type) type __gc *
 typedef MR_Ref(MR_Box) MR_Box_Ref;
@@ -226,28 +226,24 @@
 
 #define MR_newobj(Obj, Tag, Size)					\
     do {								\
-	(Obj) = System::Array::CreateInstance(				\
-		System::Type::GetType("System.Object"), (Size) + 1);  	\
-	(Obj)->SetValue(mercury::runtime::Convert::ToObject(Tag), 0);	\
+	(Obj) = new System::Object __gc * __gc[(Size + 1)];		\
+	(Obj)[0] = MR_BOX_INT(Tag);					\
     } while (0)
 
 #define MR_untagged_newobj(Obj, Size)					\
     do {								\
-        (Obj) = System::Array::CreateInstance(				\
-		System::Type::GetType("System.Object"),   		\
-		(Size));						\
+	(Obj) = new System::Object __gc * __gc[(Size)];			\
     } while (0)
 
 #define MR_newobj_preboxed_tag(Obj, Tag, Size)				\
     do {								\
-	(Obj) = System::Array::CreateInstance(				\
-		System::Type::GetType("System.Object"), (Size) + 1);	\
-	(Obj)->SetValue((Tag), 0);					\
+	(Obj) = new System::Object __gc * __gc[(Size + 1)];		\
+	(Obj)[0] = (Tag);						\
     } while (0)
 
 #define MR_objset(Obj, Offset, Element)					\
     do {								\
-	(Obj)->SetValue((Element), (Offset));				\
+	(Obj)[(Offset)] = Element;					\
     } while (0)
 
 #define MR_c_pointer_to_word(Obj, CPointer)				\


-- 
       Tyson Dowd           # 
                            #  Surreal humour isn't everyone's cup of fur.
     trd at cs.mu.oz.au        # 
http://www.cs.mu.oz.au/~trd #
--------------------------------------------------------------------------
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