* icall.c (ves_icall_MonoMethod_GetGenericMethodDefinition):
[mono.git] / mono / metadata / appdomain.c
index f1955cc528ac09d46f475316ed170ca440ceee9f..e817ca710e1288ba0126c148aa104ad139c50f98 100644 (file)
@@ -19,8 +19,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
-#include <mono/os/gc_wrapper.h>
-
+#include <mono/metadata/gc-internal.h>
 #include <mono/metadata/object.h>
 #include <mono/metadata/domain-internals.h>
 #include "mono/metadata/metadata-internals.h"
 #include <mono/utils/mono-logger.h>
 #include <mono/utils/mono-path.h>
 #include <mono/utils/mono-stdlib.h>
+#include <mono/utils/mono-io-portability.h>
 #ifdef PLATFORM_WIN32
 #include <direct.h>
 #endif
 
-#define MONO_CORLIB_VERSION 58
+/*
+ * This is the version number of the corlib-runtime interface. When
+ * making changes to this interface (by changing the layout
+ * of classes the runtime knows about, changing icall signature or
+ * semantics etc), increment this variable. Also increment the
+ * pair of this variable in mscorlib in:
+ *       mcs/class/mscorlib/System/Environment.cs
+ *
+ * Changes which are already detected at runtime, like the addition
+ * of icalls, do not require an increment.
+ */
+#define MONO_CORLIB_VERSION 65
 
 typedef struct
 {
@@ -101,8 +112,10 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
        MonoAppDomain *ad;
        MonoClass *class;
        MonoString *arg;
+
+       mono_portability_helpers_init ();
        
-       MONO_GC_PRE_INIT ();
+       mono_gc_base_init ();
        mono_monitor_init ();
        mono_thread_pool_init ();
        mono_marshal_init ();
@@ -111,6 +124,8 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
        mono_install_assembly_refonly_preload_hook (mono_domain_assembly_preload, GUINT_TO_POINTER (TRUE));
        mono_install_assembly_search_hook (mono_domain_assembly_search, GUINT_TO_POINTER (FALSE));
        mono_install_assembly_refonly_search_hook (mono_domain_assembly_search, GUINT_TO_POINTER (TRUE));
+       mono_install_assembly_postload_search_hook (mono_domain_assembly_postload_search, GUINT_TO_POINTER (FALSE));
+       mono_install_assembly_postload_refonly_search_hook (mono_domain_assembly_postload_search, GUINT_TO_POINTER (TRUE));
        mono_install_assembly_load_hook (mono_domain_fire_assembly_load, NULL);
        mono_install_lookup_dynamic_token (mono_reflection_lookup_dynamic_token);
 
@@ -156,7 +171,7 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
 
        /* mscorlib is loaded before we install the load hook */
        mono_domain_fire_assembly_load (mono_defaults.corlib->assembly, NULL);
-
+       
        return;
 }
 
@@ -613,6 +628,8 @@ ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomai
        data->domain = ad;
        data->setup = setup;
        data->friendly_name = mono_string_to_utf8 (friendly_name);
+       // FIXME: The ctor runs in the current domain
+       // FIXME: Initialize null_reference_ex and stack_overflow_ex
        data->out_of_memory_ex = mono_exception_from_name_domain (data, mono_defaults.corlib, "System", "OutOfMemoryException");
 
        if (!setup->application_base) {
@@ -1378,13 +1395,20 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef,
                mono_raise_exception (exc);
        }
 
-       ass = mono_assembly_load_full (&aname, NULL, &status, refOnly);
+       ass = mono_assembly_load_full_nosearch (&aname, NULL, &status, refOnly);
        mono_assembly_name_free (&aname);
 
-       if (!ass && (refass = mono_try_assembly_resolve (domain, assRef, refOnly)) == NULL){
-               /* FIXME: it doesn't make much sense since we really don't have a filename ... */
-               MonoException *exc = mono_get_exception_file_not_found2 (NULL, assRef);
-               mono_raise_exception (exc);
+       if (!ass) {
+               /* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */
+               if (!refOnly)
+                       refass = mono_try_assembly_resolve (domain, assRef, refOnly);
+               else
+                       refass = NULL;
+               if (!refass) {
+                       /* FIXME: it doesn't make much sense since we really don't have a filename ... */
+                       MonoException *exc = mono_get_exception_file_not_found2 (NULL, assRef);
+                       mono_raise_exception (exc);
+               }
        }
 
        if (refass == NULL)
@@ -1433,26 +1457,17 @@ ves_icall_System_AppDomain_InternalIsFinalizingForUnload (gint32 domain_id)
 }
 
 gint32
-ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, MonoString *file, 
-                                           MonoObject *evidence, MonoArray *args)
+ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, 
+                                                                                       MonoReflectionAssembly *refass, MonoArray *args)
 {
-       MonoAssembly *assembly;
        MonoImage *image;
        MonoMethod *method;
-       char *filename;
-       gint32 res;
-       MonoReflectionAssembly *refass;
 
        MONO_ARCH_SAVE_REGS;
 
-       filename = mono_string_to_utf8 (file);
-       assembly = mono_assembly_open (filename, NULL);
-       g_free (filename);
-
-       if (!assembly)
-               mono_raise_exception (mono_get_exception_file_not_found2 (NULL, file));
-
-       image = assembly->image;
+       g_assert (refass);
+       image = refass->assembly->image;
+       g_assert (image);
 
        method = mono_get_method (image, mono_image_get_entry_point (image), NULL);
 
@@ -1462,12 +1477,7 @@ ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, MonoString *file,
        if (!args)
                args = (MonoArray *) mono_array_new (ad->data, mono_defaults.string_class, 0);
 
-       refass = mono_assembly_get_object (ad->data, assembly);
-       MONO_OBJECT_SETREF (refass, evidence, evidence);
-
-       res = mono_runtime_exec_main (method, (MonoArray *)args, NULL);
-
-       return res;
+       return mono_runtime_exec_main (method, (MonoArray *)args, NULL);
 }
 
 gint32