diff options
author | Paolo Molaro <lupus@oddwiz.org> | 2003-07-18 17:25:22 +0400 |
---|---|---|
committer | Paolo Molaro <lupus@oddwiz.org> | 2003-07-18 17:25:22 +0400 |
commit | 0e80b16392eee6efb99499fa2d31eb3b91d25da0 (patch) | |
tree | 89a00f87494f03b9c8cf953887361e02110fd4fb | |
parent | a14e075557db01c2260646003379d3c246444e50 (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/ChangeLog | 6 | ||||
-rw-r--r-- | mono/interpreter/interp.c | 30 |
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 (); |