}
static gint32
-ves_array_calculate_index (MonoArray *ao, stackval *sp, MonoInvocation *frame)
+ves_array_calculate_index (MonoArray *ao, stackval *sp, MonoInvocation *frame, gboolean safe)
{
g_assert (!frame->ex);
MonoClass *ac = ((MonoObject *) ao)->vtable->klass;
guint32 idx = sp [i].data.i;
guint32 lower = ao->bounds [i].lower_bound;
guint32 len = ao->bounds [i].length;
- if (idx < lower || (idx - lower) >= len) {
+ if (safe && (idx < lower || (idx - lower) >= len)) {
frame->ex = mono_get_exception_index_out_of_range ();
FILL_IN_TRACE (frame->ex, frame);
return -1;
}
} else {
pos = sp [0].data.i;
- if (pos >= ao->max_length) {
+ if (safe && pos >= ao->max_length) {
frame->ex = mono_get_exception_index_out_of_range ();
FILL_IN_TRACE (frame->ex, frame);
return -1;
g_assert (ac->rank >= 1);
- gint32 pos = ves_array_calculate_index (ao, sp, frame);
+ gint32 pos = ves_array_calculate_index (ao, sp, frame, TRUE);
if (frame->ex)
return;
}
static void
-ves_array_get (MonoInvocation *frame)
+ves_array_get (MonoInvocation *frame, gboolean safe)
{
stackval *sp = frame->stack_args + 1;
g_assert (ac->rank >= 1);
- gint32 pos = ves_array_calculate_index (ao, sp, frame);
+ gint32 pos = ves_array_calculate_index (ao, sp, frame, safe);
if (frame->ex)
return;
g_assert (ac->rank >= 1);
- gint32 pos = ves_array_calculate_index (ao, sp, frame);
+ gint32 pos = ves_array_calculate_index (ao, sp, frame, TRUE);
if (frame->ex)
return NULL;
stackval_from_data (mt, frame->retval, (char *) frame->stack_args, FALSE);
return;
}
+ if (!strcmp (method->name, "UnsafeLoad")) {
+ ves_array_get (frame, FALSE);
+ return;
+ }
}
isinst_obj = mono_object_isinst_checked (obj, mono_defaults.array_class, &error);
return;
}
if (*name == 'G' && (strcmp (name, "Get") == 0)) {
- ves_array_get (frame);
+ ves_array_get (frame, TRUE);
return;
}
}
header = mono_method_get_header (nm);
mono_os_mutex_unlock(&calc_section);
} else if (method->klass == mono_defaults.array_class) {
- if (!strcmp (method->name, "UnsafeMov")) {
+ if (!strcmp (method->name, "UnsafeMov") || !strcmp (method->name, "UnsafeLoad")) {
mono_os_mutex_lock (&calc_section);
if (!runtime_method->transformed) {
runtime_method->code = g_malloc (sizeof (short));
mono_os_mutex_unlock(&calc_section);
mono_profiler_method_end_jit (method, NULL, MONO_PROFILE_OK);
return NULL;
- } else if (!strcmp (method->name, "UnsafeStore)")) {
- g_error ("TODO");
- } else if (!strcmp (method->name, "UnsafeLoad)")) {
+ } else if (!strcmp (method->name, "UnsafeStore")) {
g_error ("TODO");
}
}