2003-03-01 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mono / metadata / appdomain.c
index b00f678f0e9b798a7a3f0c34b234491b131738e1..5b367ebcffaf78d77d8ff63df6deeb45352fce0d 100644 (file)
@@ -1,11 +1,12 @@
 /*
  * 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>
@@ -34,6 +35,9 @@ mono_domain_assembly_preload (MonoAssemblyName *aname,
 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 ()
@@ -93,14 +97,34 @@ mono_runtime_cleanup (MonoDomain *domain)
        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;
@@ -113,7 +137,10 @@ mono_domain_try_type_resolve (MonoDomain *domain, MonoObject *name_or_tb)
                }
        }
 
-       *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);
 }
 
@@ -237,7 +264,7 @@ ves_icall_System_AppDomain_getCurDomain ()
 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;
@@ -444,6 +471,12 @@ set_domain_search_path (MonoDomain *domain)
 
                tmp [i] = g_build_filename (tmp [0], pvt_split [i - 1], NULL);
        }
+       
+       if (setup->private_bin_path_probe != NULL && setup->application_base) {
+               g_free (tmp [0]);
+               tmp [0] = g_strdup ("");
+       }
+               
 
        g_strfreev (pvt_split);
 }
@@ -650,6 +683,7 @@ get_info_from_assembly_name (MonoReflectionAssemblyName *assRef, MonoAssemblyNam
                value = g_strstrip (g_strdup (value));
                len = strlen (value);
                if (len % 2) {
+                       g_free (value);
                        g_strfreev (parts);
                        return FALSE;
                }
@@ -662,6 +696,7 @@ get_info_from_assembly_name (MonoReflectionAssemblyName *assRef, MonoAssemblyNam
                        if (i % 2) {
                                l = g_ascii_xdigit_value (value [i]);
                                if (l == -1) {
+                                       g_free (value);
                                        g_strfreev (parts);
                                        return FALSE;
                                }
@@ -669,11 +704,13 @@ get_info_from_assembly_name (MonoReflectionAssemblyName *assRef, MonoAssemblyNam
                        } 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: ");
@@ -731,11 +768,19 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoReflectionAssem
 }
 
 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
@@ -767,7 +812,7 @@ ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, MonoString *file,
                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);