提交 f7e5285c 编写于 作者: A Alex Thibodeau

Switch compute_class_bitmap to accept a MonoError that is set on error instead...

Switch compute_class_bitmap to accept a MonoError that is set on error instead of aborting via g_error on an unexpected type. This raises a profiler event currently but does not appear to log anything.
上级 06d0d626
......@@ -1706,7 +1706,7 @@ void
mono_method_clear_object (MonoDomain *domain, MonoMethod *method);
void
mono_class_compute_gc_descriptor (MonoClass *klass);
mono_class_compute_gc_descriptor (MonoClass *klass, MonoError *error);
gsize*
mono_class_compute_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int *max_set, gboolean static_fields);
......
......@@ -740,7 +740,7 @@ mono_runtime_free_method (MonoDomain *domain, MonoMethod *method)
#define BITMAP_EL_SIZE (sizeof (gsize) * 8)
static gsize*
compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int *max_set, gboolean static_fields)
compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int *max_set, gboolean static_fields, MonoError* error)
{
MONO_REQ_GC_NEUTRAL_MODE;
......@@ -749,6 +749,8 @@ compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int
guint32 pos;
int max_size;
error_init (error);
if (static_fields)
max_size = mono_class_data_size (klass) / sizeof (gpointer);
else
......@@ -823,7 +825,7 @@ compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int
MonoClass *fclass = mono_class_from_mono_type (field->type);
if (fclass->has_references) {
/* remove the object header */
compute_class_bitmap (fclass, bitmap, size, pos - (sizeof (MonoObject) / sizeof (gpointer)), max_set, FALSE);
compute_class_bitmap (fclass, bitmap, size, pos - (sizeof (MonoObject) / sizeof (gpointer)), max_set, FALSE, error);
}
break;
}
......@@ -841,7 +843,7 @@ compute_class_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int
case MONO_TYPE_CHAR:
break;
default:
g_error ("compute_class_bitmap: Invalid type %x for field %s:%s\n", type->type, mono_type_get_full_name (field->parent), field->name);
mono_error_set_invalid_operation (error, "compute_class_bitmap: Invalid type %x for field %s:%s\n", type->type, mono_type_get_full_name (field->parent), field->name);
break;
}
}
......@@ -860,8 +862,9 @@ gsize*
mono_class_compute_bitmap (MonoClass *klass, gsize *bitmap, int size, int offset, int *max_set, gboolean static_fields)
{
MONO_REQ_GC_NEUTRAL_MODE;
return compute_class_bitmap (klass, bitmap, size, offset, max_set, static_fields);
MonoError error;
return compute_class_bitmap (klass, bitmap, size, offset, max_set, static_fields, &error);
mono_error_cleanup (&error);
}
#if 0
......@@ -1025,7 +1028,7 @@ ves_icall_string_alloc (int length)
* - gc_descr_inited
*/
void
mono_class_compute_gc_descriptor (MonoClass *klass)
mono_class_compute_gc_descriptor (MonoClass *klass, MonoError *error)
{
MONO_REQ_GC_NEUTRAL_MODE;
......@@ -1034,6 +1037,8 @@ mono_class_compute_gc_descriptor (MonoClass *klass)
gsize default_bitmap [4] = {0};
MonoGCDescriptor gc_descr;
error_init (error);
if (!klass->inited)
mono_class_init (klass);
......@@ -1044,7 +1049,7 @@ mono_class_compute_gc_descriptor (MonoClass *klass)
if (klass == mono_defaults.string_class) {
gc_descr = mono_gc_make_descr_for_string (bitmap, 2);
} else if (klass->rank) {
mono_class_compute_gc_descriptor (klass->element_class);
mono_class_compute_gc_descriptor (klass->element_class, error);
if (MONO_TYPE_IS_REFERENCE (&klass->element_class->byval_arg)) {
gsize abm = 1;
gc_descr = mono_gc_make_descr_for_array (klass->byval_arg.type == MONO_TYPE_SZARRAY, &abm, 1, sizeof (gpointer));
......@@ -1052,7 +1057,7 @@ mono_class_compute_gc_descriptor (MonoClass *klass)
class->name_space, class->name);*/
} else {
/* remove the object header */
bitmap = compute_class_bitmap (klass->element_class, default_bitmap, sizeof (default_bitmap) * 8, - (int)(sizeof (MonoObject) / sizeof (gpointer)), &max_set, FALSE);
bitmap = compute_class_bitmap (klass->element_class, default_bitmap, sizeof (default_bitmap) * 8, - (int)(sizeof (MonoObject) / sizeof (gpointer)), &max_set, FALSE, error);
gc_descr = mono_gc_make_descr_for_array (klass->byval_arg.type == MONO_TYPE_SZARRAY, bitmap, mono_array_element_size (klass) / sizeof (gpointer), mono_array_element_size (klass));
/*printf ("new vt array descriptor: 0x%x for %s.%s\n", class->gc_descr,
class->name_space, class->name);*/
......@@ -1061,7 +1066,7 @@ mono_class_compute_gc_descriptor (MonoClass *klass)
/*static int count = 0;
if (count++ > 58)
return;*/
bitmap = compute_class_bitmap (klass, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, FALSE);
bitmap = compute_class_bitmap (klass, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, FALSE, error);
/*
if (class->gc_descr == MONO_GC_DESCRIPTOR_NULL)
g_print ("disabling typed alloc (%d) for %s.%s\n", max_set, class->name_space, class->name);
......@@ -1979,7 +1984,14 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro
MONO_PROFILER_RAISE (vtable_loading, (vt));
mono_class_compute_gc_descriptor (klass);
mono_class_compute_gc_descriptor (klass, error);
if (!is_ok(error)) {
mono_domain_unlock(domain);
mono_loader_unlock();
MONO_PROFILER_RAISE(vtable_failed, (vt));
return NULL;
}
/*
* For Boehm:
* We can't use typed allocation in the non-root domains, since the
......@@ -2013,7 +2025,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro
gsize default_bitmap [4] = {0};
gsize *bitmap;
bitmap = compute_class_bitmap (klass, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, TRUE);
bitmap = compute_class_bitmap (klass, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, TRUE, error);
/*g_print ("bitmap 0x%x for %s.%s (size: %d)\n", bitmap [0], klass->name_space, klass->name, class_size);*/
statics_gc_descr = mono_gc_make_descr_from_bitmap (bitmap, max_set + 1);
vt->vtable [klass->vtable_size] = mono_gc_alloc_fixed (class_size, statics_gc_descr, MONO_ROOT_SOURCE_STATIC, vt, "Static Fields");
......@@ -2049,7 +2061,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro
bitmap = default_bitmap;
} else if (mono_type_is_struct (field->type)) {
fclass = mono_class_from_mono_type (field->type);
bitmap = compute_class_bitmap (fclass, default_bitmap, sizeof (default_bitmap) * 8, - (int)(sizeof (MonoObject) / sizeof (gpointer)), &max_set, FALSE);
bitmap = compute_class_bitmap (fclass, default_bitmap, sizeof (default_bitmap) * 8, - (int)(sizeof (MonoObject) / sizeof (gpointer)), &max_set, FALSE, error);
numbits = max_set + 1;
} else {
default_bitmap [0] = 0;
......
......@@ -406,7 +406,11 @@ mini_emit_memory_copy_internal (MonoCompile *cfg, MonoInst *dest, MonoInst *src,
} else {
iargs [2] = mini_emit_runtime_constant (cfg, MONO_PATCH_INFO_CLASS, klass);
if (!cfg->compile_aot)
mono_class_compute_gc_descriptor (klass);
{
MonoError error;
mono_class_compute_gc_descriptor (klass, &error);
mono_error_cleanup (&error);
}
}
if (size_ins)
mono_emit_jit_icall (cfg, mono_gsharedvt_value_copy, iargs);
......
......@@ -1765,7 +1765,7 @@ instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
mono_value_copy(), which requires that its GC
descriptor has been computed. */
if (oti->info_type == MONO_RGCTX_INFO_KLASS)
mono_class_compute_gc_descriptor (arg_class);
mono_class_compute_gc_descriptor (arg_class, error);
return class_type_info (domain, arg_class, oti->info_type, error);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册