/*
* appdomain.c: AppDomain functions
*
- * Author:
+ * Authors:
* Dietmar Maurer (dietmar@ximian.com)
* Patrik Torstensson
+ * Gonzalo Paniagua Javier (gonzalo@ximian.com)
*
- * (C) 2001 Ximian, Inc.
+ * (c) 2001-2003 Ximian, Inc. (http://www.ximian.com)
*/
#include <config.h>
static void
mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data);
+static MonoMethod *
+look_for_method_by_name (MonoClass *klass, const gchar *name);
+
/*
* mono_runtime_init:
* @domain: domain returned by mono_init ()
mono_network_cleanup ();
}
+gboolean
+mono_domain_has_type_resolve (MonoDomain *domain)
+{
+ static MonoClassField *field = NULL;
+ MonoObject *o;
+
+ if (field == NULL) {
+ MonoClass *klass = mono_defaults.appdomain_class;
+ int i;
+
+ for (i = 0; i < klass->field.count; ++i)
+ if (strcmp (klass->fields [i].name, "TypeResolve") == 0)
+ field = &klass->fields [i];
+ g_assert (field);
+ }
+
+ mono_field_get_value ((MonoObject*)(domain->domain), field, &o);
+ return o != NULL;
+}
+
MonoReflectionAssembly *
-mono_domain_try_type_resolve (MonoDomain *domain, MonoObject *name_or_tb)
+mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb)
{
MonoClass *klass;
void *params [1];
static MonoMethod *method = NULL;
- g_assert (domain != NULL && name_or_tb != NULL);
+ g_assert (domain != NULL && ((name != NULL) || (tb != NULL)));
if (method == NULL) {
klass = domain->domain->mbr.obj.vtable->klass;
}
}
- *params = name_or_tb;
+ if (name)
+ *params = (MonoObject*)mono_string_new (mono_domain_get (), name);
+ else
+ *params = tb;
return (MonoReflectionAssembly *) mono_runtime_invoke (method, domain->domain, params, NULL);
}
MonoAppDomain *
ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomainSetup *setup)
{
- MonoDomain *domain = mono_domain_get ();
+ /*MonoDomain *domain = mono_domain_get (); */
MonoClass *adclass;
MonoAppDomain *ad;
MonoDomain *data;
value = g_strstrip (g_strdup (value));
len = strlen (value);
if (len % 2) {
+ g_free (value);
g_strfreev (parts);
return FALSE;
}
if (i % 2) {
l = g_ascii_xdigit_value (value [i]);
if (l == -1) {
+ g_free (value);
g_strfreev (parts);
return FALSE;
}
} else {
h = g_ascii_xdigit_value (value [i]);
if (h == -1) {
+ g_free (value);
g_strfreev (parts);
return FALSE;
}
}
}
+ g_free (value);
/*
g_print ("PublicKeyToken: ");
}
void
-ves_icall_System_AppDomain_Unload (MonoAppDomain *ad)
+ves_icall_System_AppDomain_InternalUnload (gint32 domain_id)
{
+ MonoDomain * domain = mono_domain_get_by_id (domain_id);
+
MONO_ARCH_SAVE_REGS;
- mono_domain_unload (ad->data, FALSE);
+ if (NULL == domain) {
+ MonoException *exc = mono_get_exception_execution_engine ("Failed to unload domain, domain id not found");
+ mono_raise_exception (exc);
+ }
+
+
+ mono_domain_unload (domain, FALSE);
}
gint32
g_error ("No entry point method found in %s", image->name);
if (!args)
- args = (MonoObject *) mono_array_new (ad->data, mono_defaults.string_class, 0);
+ args = (MonoArray *) mono_array_new (ad->data, mono_defaults.string_class, 0);
res = mono_runtime_exec_main (method, (MonoArray *)args, NULL);