Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Molaro <lupus@oddwiz.org>2003-07-18 17:25:22 +0400
committerPaolo Molaro <lupus@oddwiz.org>2003-07-18 17:25:22 +0400
commit0e80b16392eee6efb99499fa2d31eb3b91d25da0 (patch)
tree89a00f87494f03b9c8cf953887361e02110fd4fb
parenta14e075557db01c2260646003379d3c246444e50 (diff)
Fri Jul 18 15:11:44 CEST 2003 Paolo Molaro <lupus@ximian.com>
* interp.c: 64 bit fixes from Laurent Morichetti <l_m@pacbell.net>. Install cleanup function. svn path=/trunk/mono/; revision=16403
-rw-r--r--mono/interpreter/ChangeLog6
-rw-r--r--mono/interpreter/interp.c30
2 files changed, 26 insertions, 10 deletions
diff --git a/mono/interpreter/ChangeLog b/mono/interpreter/ChangeLog
index b2952bc998e..3e1b007fd46 100644
--- a/mono/interpreter/ChangeLog
+++ b/mono/interpreter/ChangeLog
@@ -1,3 +1,9 @@
+
+Fri Jul 18 15:11:44 CEST 2003 Paolo Molaro <lupus@ximian.com>
+
+ * interp.c: 64 bit fixes from Laurent Morichetti <l_m@pacbell.net>.
+ Install cleanup function.
+
2003-07-13 Zoltan Varga <vargaz@freemail.hu>
* interp.c: Keep alloca()-d data on a free list to prevent stack
diff --git a/mono/interpreter/interp.c b/mono/interpreter/interp.c
index 5cfbfabb86d..278ce6faeb0 100644
--- a/mono/interpreter/interp.c
+++ b/mono/interpreter/interp.c
@@ -233,7 +233,7 @@ get_virtual_method (MonoDomain *domain, MonoMethod *m, stackval *objs)
vtable = (MonoMethod **)klass->vtable;
if (m->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
- res = *(MonoMethod**)((char*)obj->vtable->interface_offsets [m->klass->interface_id] + (m->slot<<2));
+ res = ((MonoMethod **)obj->vtable->interface_offsets [m->klass->interface_id]) [m->slot];
} else {
res = vtable [m->slot];
}
@@ -3176,6 +3176,7 @@ array_constructed:
CASE (CEE_LDELEMA) {
MonoArray *o;
guint32 esize, token;
+ mono_u aindex;
++ip;
token = read32 (ip);
@@ -3187,14 +3188,15 @@ array_constructed:
g_assert (MONO_CLASS_IS_ARRAY (o->obj.vtable->klass));
- if (sp [1].data.nati >= mono_array_length (o))
+ aindex = sp [1].type == VAL_I32? sp [1].data.i: sp [1].data.nati;
+ if (aindex >= mono_array_length (o))
THROW_EX (mono_get_exception_index_out_of_range (), ip - 5);
/* check the array element corresponds to token */
esize = mono_array_element_size (o->obj.vtable->klass);
sp->type = VAL_MP;
- sp->data.p = mono_array_addr_with_size (o, esize, sp [1].data.i);
+ sp->data.p = mono_array_addr_with_size (o, esize, aindex);
sp->data.vt.klass = o->obj.vtable->klass->element_class;
++sp;
@@ -3223,7 +3225,7 @@ array_constructed:
g_assert (MONO_CLASS_IS_ARRAY (o->obj.vtable->klass));
- aindex = sp [1].data.nati;
+ aindex = sp [1].type == VAL_I32? sp [1].data.i: sp [1].data.nati;
if (aindex >= mono_array_length (o))
THROW_EX (mono_get_exception_index_out_of_range (), ip);
@@ -3306,7 +3308,7 @@ array_constructed:
ac = o->obj.vtable->klass;
g_assert (MONO_CLASS_IS_ARRAY (ac));
- aindex = sp [1].data.nati;
+ aindex = sp [1].type == VAL_I32? sp [1].data.i: sp [1].data.nati;
if (aindex >= mono_array_length (o))
THROW_EX (mono_get_exception_index_out_of_range (), ip);
@@ -4494,6 +4496,16 @@ mono_runtime_install_handlers (void)
/* FIXME: anything to do here? */
}
+static void
+quit_function (MonoDomain *domain, gpointer user_data)
+{
+ mono_profiler_shutdown ();
+
+ mono_runtime_cleanup (domain);
+ mono_domain_unload (domain, TRUE);
+
+}
+
int
main (int argc, char *argv [])
{
@@ -4568,6 +4580,7 @@ main (int argc, char *argv [])
mono_install_handler (interp_ex_handler);
mono_install_stack_walk (interp_walk_stack);
+ mono_runtime_install_cleanup (quit_function);
InitializeCriticalSection (&metadata_lock);
domain = mono_init (file);
@@ -4581,11 +4594,8 @@ main (int argc, char *argv [])
mono_runtime_exec_managed_code (domain, main_thread_handler,
&main_args);
-
- mono_profiler_shutdown ();
-
- mono_runtime_cleanup (domain);
- mono_domain_unload (domain, TRUE);
+
+ quit_function (domain, NULL);
/* Get the return value from System.Environment.ExitCode */
retval=mono_environment_exitcode_get ();