{
}
+static inline void
+dynamic_image_lock (MonoDynamicImage *image)
+{
+ mono_image_lock ((MonoImage*)image);
+}
+
+static inline void
+dynamic_image_unlock (MonoDynamicImage *image)
+{
+ mono_image_unlock ((MonoImage*)image);
+}
+
+static void
+register_dyn_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj)
+{
+ dynamic_image_lock (assembly);
+ mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
+ dynamic_image_unlock (assembly);
+}
+
+static MonoObject*
+lookup_dyn_token (MonoDynamicImage *assembly, guint32 token)
+{
+ MonoObject *obj;
+
+ dynamic_image_lock (assembly);
+ obj = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+ dynamic_image_unlock (assembly);
+
+ return obj;
+}
+
static void
sigbuffer_init (SigBuffer *buf, int size)
{
encode_constant (MonoDynamicImage *assembly, MonoObject *val, guint32 *ret_type) {
char blob_size [64];
char *b = blob_size;
- char *p, *box_val;
+ char *box_val;
char* buf;
guint32 idx = 0, len = 0, dummy = 0;
- p = buf = g_malloc (64);
+ buf = g_malloc (64);
if (!val) {
*ret_type = MONO_TYPE_CLASS;
len = 4;
(type->type != MONO_TYPE_MVAR)) {
MonoReflectionTypeBuilder *tb = mono_class_get_ref_info (klass);
token = MONO_TYPEDEFORREF_TYPEDEF | (tb->table_idx << MONO_TYPEDEFORREF_BITS);
- mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), mono_class_get_ref_info (klass));
+ register_dyn_token (assembly, token, mono_class_get_ref_info (klass));
return token;
}
token = MONO_TYPEDEFORREF_TYPEREF | (table->next_idx << MONO_TYPEDEFORREF_BITS); /* typeref */
g_hash_table_insert (assembly->typeref, type, GUINT_TO_POINTER(token));
table->next_idx ++;
- mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), mono_class_get_ref_info (klass));
+ register_dyn_token (assembly, token, mono_class_get_ref_info (klass));
return token;
}
guint32 token;
MonoClass *klass;
MonoGenericClass *gclass;
- MonoDynamicGenericClass *dgclass;
MonoType *type;
char *name;
klass = mono_class_from_mono_type (type);
gclass = type->data.generic_class;
g_assert (gclass->is_dynamic);
- dgclass = (MonoDynamicGenericClass *) gclass;
name = mono_string_to_utf8 (fb->name);
token = mono_image_get_memberref_token (assembly, &klass->byval_arg, name,
if (is_sre_ctor_builder (mono_object_class (c->cb))) {
MonoReflectionCtorBuilder *cb = (MonoReflectionCtorBuilder *)c->cb;
- MonoDynamicGenericClass *dgclass;
ReflectionMethodBuilder rmb;
char *name;
gclass = type->data.generic_class;
g_assert (gclass->is_dynamic);
- dgclass = (MonoDynamicGenericClass *) gclass;
reflection_methodbuilder_from_ctor_builder (&rmb, cb);
mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb)
{
MonoDynamicTable *table;
- MonoClass *klass;
MonoType *custom = NULL, *type;
guint32 *values;
guint32 token, pclass, parent, sig;
if (token)
return token;
- klass = mono_class_from_mono_type (mono_reflection_type_get_handle (fb->typeb));
+ /* FIXME: is this call necessary? */
+ mono_class_from_mono_type (mono_reflection_type_get_handle (fb->typeb));
name = mono_string_to_utf8 (fb->name);
/*FIXME this is one more layer of ugliness due how types are created.*/
{
SigBuffer buf;
guint32 nargs;
- guint32 size;
guint32 i, idx;
if (!assembly->save)
else
nargs = 0;
- size = 10 + (nargs * 10);
-
sigbuffer_init (&buf, 32);
/* Encode calling convention */
char buf [16];
char *b = buf;
- MONO_ARCH_SAVE_REGS;
-
if (!module->dynamic_image)
mono_image_module_basic_init (module);
idx = assembly->us.index ++;
}
- mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (MONO_TOKEN_STRING | idx), str);
+ register_dyn_token (assembly, MONO_TOKEN_STRING | idx, (MonoObject*)str);
return MONO_TOKEN_STRING | idx;
}
}
g_hash_table_insert (assembly->vararg_aux_hash, GUINT_TO_POINTER (token), sig);
- mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
+ register_dyn_token (assembly, token, obj);
return token;
}
void
mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj)
{
- MonoObject *prev = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
+ MonoObject *prev;
+
+ dynamic_image_lock (assembly);
+ prev = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
if (prev) {
/* There could be multiple MethodInfo objects with the same token */
//g_assert (prev == obj);
} else {
mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), obj);
}
+ dynamic_image_unlock (assembly);
}
static MonoDynamicImage*
MonoDynamicImage *image;
MonoDomain *domain = mono_object_domain (assemblyb);
- MONO_ARCH_SAVE_REGS;
-
if (assemblyb->dynamic_assembly)
return;
for (i = 0; i < inst->type_argc; ++i)
if (!verify_safe_for_managed_space (inst->type_argv [i]))
return FALSE;
- break;
+ return TRUE;
}
#endif
case MONO_TYPE_VAR:
case MONO_TYPE_MVAR:
return TRUE;
+ default:
+ return TRUE;
}
- return TRUE;
}
static MonoType*
if (!image)
image = mono_defaults.corlib;
+ if (!rootimage)
+ rootimage = mono_defaults.corlib;
+
if (ignorecase) {
MonoError error;
klass = mono_class_from_name_case_checked (image, info->name_space, info->name, &error);
memset (params, 0, sizeof (void*) * sig->param_count);
} else {
/* Allocate using GC so it gets GC tracking */
- params = mono_gc_alloc_fixed (sig->param_count * sizeof (void*), NULL);
+ params = mono_gc_alloc_fixed (sig->param_count * sizeof (void*), MONO_GC_DESCRIPTOR_NULL);
}
/* skip prolog */
MonoCustomAttrInfo *ainfo;
GList *tmp, *list = NULL;
const char *data;
+ MonoCustomAttrEntry* attr;
ca = &image->tables [MONO_TABLE_CUSTOMATTRIBUTE];
ainfo = g_malloc0 (MONO_SIZEOF_CUSTOM_ATTR_INFO + sizeof (MonoCustomAttrEntry) * len);
ainfo->num_attrs = len;
ainfo->image = image;
- for (i = 0, tmp = list; i < len; ++i, tmp = tmp->next) {
+ for (i = len, tmp = list; i != 0; --i, tmp = tmp->next) {
mono_metadata_decode_row (ca, GPOINTER_TO_UINT (tmp->data), cols, MONO_CUSTOM_ATTR_SIZE);
mtoken = cols [MONO_CUSTOM_ATTR_TYPE] >> MONO_CUSTOM_ATTR_TYPE_BITS;
switch (cols [MONO_CUSTOM_ATTR_TYPE] & MONO_CUSTOM_ATTR_TYPE_MASK) {
g_error ("Unknown table for custom attr type %08x", cols [MONO_CUSTOM_ATTR_TYPE]);
break;
}
- ainfo->attrs [i].ctor = mono_get_method (image, mtoken, NULL);
- if (!ainfo->attrs [i].ctor) {
+ attr = &ainfo->attrs [i - 1];
+ attr->ctor = mono_get_method (image, mtoken, NULL);
+ if (!attr->ctor) {
g_warning ("Can't find custom attr constructor image: %s mtoken: 0x%08x", image->name, mtoken);
g_list_free (list);
g_free (ainfo);
return NULL;
}
data = mono_metadata_blob_heap (image, cols [MONO_CUSTOM_ATTR_VALUE]);
- ainfo->attrs [i].data_size = mono_metadata_decode_value (data, &data);
- ainfo->attrs [i].data = (guchar*)data;
+ attr->data_size = mono_metadata_decode_value (data, &data);
+ attr->data = (guchar*)data;
}
g_list_free (list);
char *buffer, *p;
guint32 buflen, i;
- MONO_ARCH_SAVE_REGS;
-
if (strcmp (ctor->vtable->klass->name, "MonoCMethod")) {
/* sig is freed later so allocate it in the heap */
sig = ctor_builder_to_signature (NULL, (MonoReflectionCtorBuilder*)ctor);
MonoError error;
MonoClass *klass, *parent;
- MONO_ARCH_SAVE_REGS;
-
RESOLVE_TYPE (tb->parent);
mono_loader_lock ();
g_assert (mono_class_get_ref_info (klass) == tb);
}
- mono_g_hash_table_insert (tb->module->dynamic_image->tokens,
- GUINT_TO_POINTER (MONO_TOKEN_TYPE_DEF | tb->table_idx), tb);
+ register_dyn_token (tb->module->dynamic_image, MONO_TOKEN_TYPE_DEF | tb->table_idx, (MonoObject*)tb);
if (parent != NULL) {
mono_class_setup_parent (klass, parent);
MonoClass *klass;
int count, i;
- MONO_ARCH_SAVE_REGS;
-
klass = mono_class_from_mono_type (tb->type.type);
count = tb->generic_params ? mono_array_length (tb->generic_params) : 0;
{
MonoClass *klass;
- MONO_ARCH_SAVE_REGS;
-
klass = mono_class_from_mono_type (tb->type.type);
mono_loader_lock ();
MonoClass *klass;
MonoReflectionTypeBuilder *tb = NULL;
gboolean is_dynamic = FALSE;
- MonoDomain *domain;
MonoClass *geninst;
mono_loader_lock ();
- domain = mono_object_domain (type);
-
if (is_sre_type_builder (mono_object_class (type))) {
tb = (MonoReflectionTypeBuilder *) type;
MonoType **type_argv;
int count, i;
- MONO_ARCH_SAVE_REGS;
-
/*FIXME but this no longer should happen*/
if (!strcmp (rmethod->object.vtable->klass->name, "MethodBuilder")) {
#ifndef DISABLE_REFLECTION_EMIT
MonoType *gtype;
int i;
- MONO_ARCH_SAVE_REGS;
-
gtype = mono_reflection_type_get_handle ((MonoReflectionType*)type);
klass = mono_class_from_mono_type (gtype);
g_assert (gtype->type == MONO_TYPE_GENERICINST);
MonoReflectionType* res;
int i, j;
- MONO_ARCH_SAVE_REGS;
-
domain = mono_object_domain (tb);
klass = mono_class_from_mono_type (tb->type.type);
MonoClass *pklass;
MonoError error;
- MONO_ARCH_SAVE_REGS;
-
image = &gparam->tbuilder->module->dynamic_image->image;
param = mono_image_new0 (image, MonoGenericParamFull, 1);
gboolean
mono_reflection_is_valid_dynamic_token (MonoDynamicImage *image, guint32 token)
{
- return mono_g_hash_table_lookup (image->tokens, GUINT_TO_POINTER (token)) != NULL;
+ return lookup_dyn_token (image, token) != NULL;
}
MonoMethodSignature *
MonoObject *obj;
MonoClass *klass;
- mono_loader_lock ();
- obj = mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token));
- mono_loader_unlock ();
+ obj = lookup_dyn_token (assembly, token);
if (!obj) {
if (valid_token)
g_error ("Could not find required dynamic token 0x%08x", token);