diff --git a/src/mono/mono/metadata/appdomain.c b/src/mono/mono/metadata/appdomain.c index 313b006b2c0a27..762858c430b3a4 100644 --- a/src/mono/mono/metadata/appdomain.c +++ b/src/mono/mono/metadata/appdomain.c @@ -50,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -81,14 +80,6 @@ #include "object-internals.h" #include "icall-decl.h" -typedef struct -{ - int runtime_count; - int assemblybinding_count; - MonoDomain *domain; - gchar *filename; -} RuntimeConfig; - static gboolean no_exec = FALSE; static int n_appctx_props; @@ -129,7 +120,6 @@ runtimeconfig_json_read_props (const char *ptr, const char **endp, int nprops, g static MonoLoadFunc load_function = NULL; /* Lazy class loading functions */ -static GENERATE_GET_CLASS_WITH_CACHE (assembly, "System.Reflection", "Assembly"); static GENERATE_GET_CLASS_WITH_CACHE (app_context, "System", "AppContext"); MonoClass* @@ -182,15 +172,10 @@ create_domain_objects (MonoDomain *domain) HANDLE_FUNCTION_ENTER (); ERROR_DECL (error); - MonoDomain *old_domain = mono_domain_get (); MonoStringHandle arg; MonoVTable *string_vt; MonoClassField *string_empty_fld; - if (domain != old_domain) { - mono_domain_set_internal_with_options (domain, FALSE); - } - /* * Initialize String.Empty. This enables the removal of * the static cctor of the String class. @@ -227,13 +212,10 @@ create_domain_objects (MonoDomain *domain) domain->stack_overflow_ex = MONO_HANDLE_RAW (mono_exception_from_name_two_strings_checked (mono_defaults.corlib, "System", "StackOverflowException", arg, NULL_HANDLE_STRING, error)); mono_error_assert_ok (error); - /*The ephemeron tombstone i*/ + /* The ephemeron tombstone */ domain->ephemeron_tombstone = MONO_HANDLE_RAW (mono_object_new_handle (mono_defaults.object_class, error)); mono_error_assert_ok (error); - if (domain != old_domain) - mono_domain_set_internal_with_options (old_domain, FALSE); - /* * This class is used during exception handling, so initialize it here, to prevent * stack overflows while handling stack overflows. @@ -406,16 +388,6 @@ mono_check_corlib_version_internal (void) #endif } -/** - * mono_context_init: - * \param domain The domain where the \c System.Runtime.Remoting.Context.Context is initialized - * Initializes the \p domain's default \c System.Runtime.Remoting 's Context. - */ -void -mono_context_init (MonoDomain *domain) -{ -} - /** * mono_runtime_cleanup: * \param domain unused. @@ -469,24 +441,6 @@ mono_runtime_quit_internal (void) quit_function (mono_get_root_domain (), NULL); } -/** - * mono_domain_set_config: - * \param domain \c MonoDomain initialized with the appdomain we want to change - * \param base_dir new base directory for the appdomain - * \param config_file_name path to the new configuration for the app domain - * - * Used to set the system configuration for an appdomain - * - * Without using this, embedded builds will get 'System.Configuration.ConfigurationErrorsException: - * Error Initializing the configuration system. ---> System.ArgumentException: - * The 'ExeConfigFilename' argument cannot be null.' for some managed calls. - */ -void -mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name) -{ - g_assert_not_reached (); -} - /** * mono_domain_has_type_resolve: * \param domain application domain being looked up @@ -503,46 +457,8 @@ mono_domain_has_type_resolve (MonoDomain *domain) return TRUE; } -/** - * mono_domain_try_type_resolve: - * \param domain application domain in which to resolve the type - * \param name the name of the type to resolve or NULL. - * \param typebuilder A \c System.Reflection.Emit.TypeBuilder, used if name is NULL. - * - * This routine invokes the internal \c System.AppDomain.DoTypeResolve and returns - * the assembly that matches name, or ((TypeBuilder)typebuilder).FullName. - * - * \returns A \c MonoReflectionAssembly or NULL if not found - */ -MonoReflectionAssembly * -mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *typebuilder_raw) -{ - HANDLE_FUNCTION_ENTER (); - - g_assert (domain); - g_assert (name || typebuilder_raw); - - ERROR_DECL (error); - - MonoReflectionAssemblyHandle ret = NULL_HANDLE_INIT; - - // This will not work correctly on netcore - if (name) { - MonoStringHandle name_handle = mono_string_new_handle (name, error); - goto_if_nok (error, exit); - ret = mono_domain_try_type_resolve_name (domain, NULL, name_handle, error); - } else { - // TODO: make this work on netcore when working on SRE.TypeBuilder - g_assert_not_reached (); - } - -exit: - mono_error_cleanup (error); - HANDLE_FUNCTION_RETURN_OBJ (ret); -} - MonoReflectionAssemblyHandle -mono_domain_try_type_resolve_name (MonoDomain *domain, MonoAssembly *assembly, MonoStringHandle name, MonoError *error) +mono_domain_try_type_resolve_name (MonoAssembly *assembly, MonoStringHandle name, MonoError *error) { MonoObjectHandle ret; MonoReflectionAssemblyHandle assembly_handle; @@ -567,7 +483,6 @@ mono_domain_try_type_resolve_name (MonoDomain *domain, MonoAssembly *assembly, M if (!method) goto return_null; - g_assert (domain); g_assert (MONO_HANDLE_BOOL (name)); if (mono_runtime_get_no_exec ()) @@ -602,54 +517,6 @@ mono_domain_owns_vtable_slot (MonoDomain *domain, gpointer vtable_slot) return mono_mem_manager_mp_contains_addr (mono_mem_manager_get_ambient (), vtable_slot); } -gboolean -mono_domain_set_fast (MonoDomain *domain, gboolean force) -{ - MONO_REQ_GC_UNSAFE_MODE; - - mono_domain_set_internal_with_options (domain, TRUE); - return TRUE; -} - -static gboolean -add_assembly_to_array (MonoArrayHandle dest, int dest_idx, MonoAssembly* assm, MonoError *error) -{ - HANDLE_FUNCTION_ENTER (); - error_init (error); - MonoReflectionAssemblyHandle assm_obj = mono_assembly_get_object_handle (assm, error); - goto_if_nok (error, leave); - MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, assm_obj); -leave: - HANDLE_FUNCTION_RETURN_VAL (is_ok (error)); -} - -static MonoArrayHandle -get_assembly_array_from_domain (MonoDomain *domain, MonoError *error) -{ - int i; - GPtrArray *assemblies; - - assemblies = mono_alc_get_all_loaded_assemblies (); - - MonoArrayHandle res = mono_array_new_handle (mono_class_get_assembly_class (), assemblies->len, error); - goto_if_nok (error, leave); - for (i = 0; i < assemblies->len; ++i) { - if (!add_assembly_to_array (res, i, (MonoAssembly *)g_ptr_array_index (assemblies, i), error)) - goto leave; - } - -leave: - g_ptr_array_free (assemblies, TRUE); - return res; -} - -MonoArrayHandle -ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalGetLoadedAssemblies (MonoError *error) -{ - MonoDomain *domain = mono_domain_get (); - return get_assembly_array_from_domain (domain, error); -} - MonoAssembly* mono_try_assembly_resolve (MonoAssemblyLoadContext *alc, const char *fname_raw, MonoAssembly *requesting, MonoError *error) { @@ -1019,109 +886,6 @@ ves_icall_System_Reflection_Assembly_InternalLoad (MonoStringHandle name_handle, return MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE); } -static -MonoAssembly * -mono_alc_load_file (MonoAssemblyLoadContext *alc, MonoStringHandle fname, MonoAssembly *executing_assembly, MonoAssemblyContextKind asmctx, MonoError *error) -{ - MonoAssembly *ass = NULL; - HANDLE_FUNCTION_ENTER (); - char *filename = NULL; - if (MONO_HANDLE_IS_NULL (fname)) { - mono_error_set_argument_null (error, "assemblyFile", ""); - goto leave; - } - - filename = mono_string_handle_to_utf8 (fname, error); - goto_if_nok (error, leave); - - if (!g_path_is_absolute (filename)) { - mono_error_set_argument (error, "assemblyFile", "Absolute path information is required."); - goto leave; - } - - MonoImageOpenStatus status; - MonoAssemblyOpenRequest req; - mono_assembly_request_prepare_open (&req, asmctx, alc); - req.requesting_assembly = executing_assembly; - ass = mono_assembly_request_open (filename, &req, &status); - if (!ass) { - if (status == MONO_IMAGE_IMAGE_INVALID) - mono_error_set_bad_image_by_name (error, filename, "Invalid Image: %s", filename); - else - mono_error_set_simple_file_not_found (error, filename); - } - -leave: - g_free (filename); - HANDLE_FUNCTION_RETURN_VAL (ass); -} - -MonoReflectionAssemblyHandle -ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalLoadFile (gpointer alc_ptr, MonoStringHandle fname, MonoStackCrawlMark *stack_mark, MonoError *error) -{ - MonoReflectionAssemblyHandle result = MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE); - MonoAssemblyLoadContext *alc = (MonoAssemblyLoadContext *)alc_ptr; - - MonoAssembly *executing_assembly; - executing_assembly = mono_runtime_get_caller_from_stack_mark (stack_mark); - MonoAssembly *ass = mono_alc_load_file (alc, fname, executing_assembly, mono_alc_is_default (alc) ? MONO_ASMCTX_LOADFROM : MONO_ASMCTX_INDIVIDUAL, error); - goto_if_nok (error, leave); - - result = mono_assembly_get_object_handle (ass, error); - -leave: - return result; -} - -static MonoAssembly* -mono_alc_load_raw_bytes (MonoAssemblyLoadContext *alc, guint8 *raw_assembly, guint32 raw_assembly_len, guint8 *raw_symbol_data, guint32 raw_symbol_len, MonoError *error); - -MonoReflectionAssemblyHandle -ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalLoadFromStream (gpointer native_alc, gpointer raw_assembly_ptr, gint32 raw_assembly_len, gpointer raw_symbols_ptr, gint32 raw_symbols_len, MonoError *error) -{ - MonoAssemblyLoadContext *alc = (MonoAssemblyLoadContext *)native_alc; - MonoReflectionAssemblyHandle result = MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE); - MonoAssembly *assm = NULL; - assm = mono_alc_load_raw_bytes (alc, (guint8 *)raw_assembly_ptr, raw_assembly_len, (guint8 *)raw_symbols_ptr, raw_symbols_len, error); - goto_if_nok (error, leave); - - result = mono_assembly_get_object_handle (assm, error); - -leave: - return result; -} - -static MonoAssembly* -mono_alc_load_raw_bytes (MonoAssemblyLoadContext *alc, guint8 *assembly_data, guint32 raw_assembly_len, guint8 *raw_symbol_data, guint32 raw_symbol_len, MonoError *error) -{ - MonoAssembly *ass = NULL; - MonoImageOpenStatus status; - MonoImage *image = mono_image_open_from_data_internal (alc, (char*)assembly_data, raw_assembly_len, TRUE, NULL, FALSE, NULL, NULL); - - if (!image) { - mono_error_set_bad_image_by_name (error, "In memory assembly", "0x%p", assembly_data); - return ass; - } - - if (raw_symbol_data) - mono_debug_open_image_from_memory (image, raw_symbol_data, raw_symbol_len); - - MonoAssemblyLoadRequest req; - mono_assembly_request_prepare_load (&req, MONO_ASMCTX_INDIVIDUAL, alc); - ass = mono_assembly_request_load_from (image, "", &req, &status); - - if (!ass) { - mono_image_close (image); - mono_error_set_bad_image_by_name (error, "In Memory assembly", "0x%p", assembly_data); - return ass; - } - - /* Clear the reference added by mono_image_open_from_data_internal above */ - mono_image_close (image); - - return ass; -} - /* Remember properties so they can be be installed in AppContext during runtime init */ void mono_runtime_register_appctx_properties (int nprops, const char **keys, const char **values) diff --git a/src/mono/mono/metadata/assembly-load-context.c b/src/mono/mono/metadata/assembly-load-context.c index 7de665fc3ae61d..1dbd387ab117f0 100644 --- a/src/mono/mono/metadata/assembly-load-context.c +++ b/src/mono/mono/metadata/assembly-load-context.c @@ -9,10 +9,12 @@ #include "mono/metadata/loader-internals.h" #include "mono/metadata/loaded-images-internals.h" #include "mono/metadata/mono-private-unstable.h" +#include "mono/metadata/mono-debug.h" #include "mono/utils/mono-error-internals.h" #include "mono/utils/mono-logger-internals.h" GENERATE_GET_CLASS_WITH_CACHE (assembly_load_context, "System.Runtime.Loader", "AssemblyLoadContext"); +static GENERATE_GET_CLASS_WITH_CACHE (assembly, "System.Reflection", "Assembly"); static GSList *alcs; static MonoAssemblyLoadContext *default_alc; @@ -266,6 +268,135 @@ ves_icall_System_Runtime_Loader_AssemblyLoadContext_GetLoadContextForAssembly (M return (gpointer)alc->gchandle; } +static gboolean +add_assembly_to_array (MonoArrayHandle dest, int dest_idx, MonoAssembly* assm, MonoError *error) +{ + HANDLE_FUNCTION_ENTER (); + error_init (error); + MonoReflectionAssemblyHandle assm_obj = mono_assembly_get_object_handle (assm, error); + goto_if_nok (error, leave); + MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, assm_obj); +leave: + HANDLE_FUNCTION_RETURN_VAL (is_ok (error)); +} + +MonoArrayHandle +ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalGetLoadedAssemblies (MonoError *error) +{ + GPtrArray *assemblies = mono_alc_get_all_loaded_assemblies (); + + MonoArrayHandle res = mono_array_new_handle (mono_class_get_assembly_class (), assemblies->len, error); + goto_if_nok (error, leave); + for (int i = 0; i < assemblies->len; ++i) { + if (!add_assembly_to_array (res, i, (MonoAssembly *)g_ptr_array_index (assemblies, i), error)) + goto leave; + } + +leave: + g_ptr_array_free (assemblies, TRUE); + return res; +} + +static +MonoAssembly * +mono_alc_load_file (MonoAssemblyLoadContext *alc, MonoStringHandle fname, MonoAssembly *executing_assembly, MonoAssemblyContextKind asmctx, MonoError *error) +{ + MonoAssembly *ass = NULL; + HANDLE_FUNCTION_ENTER (); + char *filename = NULL; + if (MONO_HANDLE_IS_NULL (fname)) { + mono_error_set_argument_null (error, "assemblyFile", ""); + goto leave; + } + + filename = mono_string_handle_to_utf8 (fname, error); + goto_if_nok (error, leave); + + if (!g_path_is_absolute (filename)) { + mono_error_set_argument (error, "assemblyFile", "Absolute path information is required."); + goto leave; + } + + MonoImageOpenStatus status; + MonoAssemblyOpenRequest req; + mono_assembly_request_prepare_open (&req, asmctx, alc); + req.requesting_assembly = executing_assembly; + ass = mono_assembly_request_open (filename, &req, &status); + if (!ass) { + if (status == MONO_IMAGE_IMAGE_INVALID) + mono_error_set_bad_image_by_name (error, filename, "Invalid Image: %s", filename); + else + mono_error_set_simple_file_not_found (error, filename); + } + +leave: + g_free (filename); + HANDLE_FUNCTION_RETURN_VAL (ass); +} + +MonoReflectionAssemblyHandle +ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalLoadFile (gpointer alc_ptr, MonoStringHandle fname, MonoStackCrawlMark *stack_mark, MonoError *error) +{ + MonoReflectionAssemblyHandle result = MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE); + MonoAssemblyLoadContext *alc = (MonoAssemblyLoadContext *)alc_ptr; + + MonoAssembly *executing_assembly; + executing_assembly = mono_runtime_get_caller_from_stack_mark (stack_mark); + MonoAssembly *ass = mono_alc_load_file (alc, fname, executing_assembly, mono_alc_is_default (alc) ? MONO_ASMCTX_LOADFROM : MONO_ASMCTX_INDIVIDUAL, error); + goto_if_nok (error, leave); + + result = mono_assembly_get_object_handle (ass, error); + +leave: + return result; +} + +static MonoAssembly* +mono_alc_load_raw_bytes (MonoAssemblyLoadContext *alc, guint8 *assembly_data, guint32 raw_assembly_len, guint8 *raw_symbol_data, guint32 raw_symbol_len, MonoError *error) +{ + MonoAssembly *ass = NULL; + MonoImageOpenStatus status; + MonoImage *image = mono_image_open_from_data_internal (alc, (char*)assembly_data, raw_assembly_len, TRUE, NULL, FALSE, NULL, NULL); + + if (!image) { + mono_error_set_bad_image_by_name (error, "In memory assembly", "0x%p", assembly_data); + return ass; + } + + if (raw_symbol_data) + mono_debug_open_image_from_memory (image, raw_symbol_data, raw_symbol_len); + + MonoAssemblyLoadRequest req; + mono_assembly_request_prepare_load (&req, MONO_ASMCTX_INDIVIDUAL, alc); + ass = mono_assembly_request_load_from (image, "", &req, &status); + + if (!ass) { + mono_image_close (image); + mono_error_set_bad_image_by_name (error, "In Memory assembly", "0x%p", assembly_data); + return ass; + } + + /* Clear the reference added by mono_image_open_from_data_internal above */ + mono_image_close (image); + + return ass; +} + +MonoReflectionAssemblyHandle +ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalLoadFromStream (gpointer native_alc, gpointer raw_assembly_ptr, gint32 raw_assembly_len, gpointer raw_symbols_ptr, gint32 raw_symbols_len, MonoError *error) +{ + MonoAssemblyLoadContext *alc = (MonoAssemblyLoadContext *)native_alc; + MonoReflectionAssemblyHandle result = MONO_HANDLE_CAST (MonoReflectionAssembly, NULL_HANDLE); + MonoAssembly *assm = NULL; + assm = mono_alc_load_raw_bytes (alc, (guint8 *)raw_assembly_ptr, raw_assembly_len, (guint8 *)raw_symbols_ptr, raw_symbols_len, error); + goto_if_nok (error, leave); + + result = mono_assembly_get_object_handle (assm, error); + +leave: + return result; +} + gboolean mono_alc_is_default (MonoAssemblyLoadContext *alc) { diff --git a/src/mono/mono/metadata/domain.c b/src/mono/mono/metadata/domain.c index 22a702232aaefd..bee0701de21db6 100644 --- a/src/mono/mono/metadata/domain.c +++ b/src/mono/mono/metadata/domain.c @@ -547,6 +547,15 @@ mono_domain_unset (void) SET_APPDOMAIN (NULL); } +gboolean +mono_domain_set_fast (MonoDomain *domain, gboolean force) +{ + MONO_REQ_GC_UNSAFE_MODE; + + mono_domain_set_internal_with_options (domain, TRUE); + return TRUE; +} + void mono_domain_set_internal_with_options (MonoDomain *domain, gboolean migrate_exception) { diff --git a/src/mono/mono/metadata/external-only.c b/src/mono/mono/metadata/external-only.c index 14cb0c7983c356..01a9e4ad15fb9c 100644 --- a/src/mono/mono/metadata/external-only.c +++ b/src/mono/mono/metadata/external-only.c @@ -598,3 +598,69 @@ mono_domain_foreach (MonoDomainFunc func, gpointer user_data) MONO_EXIT_GC_UNSAFE; } + +/** + * mono_context_init: + * \param domain The domain where the \c System.Runtime.Remoting.Context.Context is initialized + * Initializes the \p domain's default \c System.Runtime.Remoting 's Context. + */ +void +mono_context_init (MonoDomain *domain) +{ +} + +/** + * mono_domain_set_config: + * \param domain \c MonoDomain initialized with the appdomain we want to change + * \param base_dir new base directory for the appdomain + * \param config_file_name path to the new configuration for the app domain + * + * Used to set the system configuration for an appdomain + * + * Without using this, embedded builds will get 'System.Configuration.ConfigurationErrorsException: + * Error Initializing the configuration system. ---> System.ArgumentException: + * The 'ExeConfigFilename' argument cannot be null.' for some managed calls. + */ +void +mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name) +{ + g_assert_not_reached (); +} + +/** + * mono_domain_try_type_resolve: + * \param domain application domain in which to resolve the type + * \param name the name of the type to resolve or NULL. + * \param typebuilder A \c System.Reflection.Emit.TypeBuilder, used if name is NULL. + * + * This routine invokes the internal \c System.AppDomain.DoTypeResolve and returns + * the assembly that matches name, or ((TypeBuilder)typebuilder).FullName. + * + * \returns A \c MonoReflectionAssembly or NULL if not found + */ +MonoReflectionAssembly * +mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *typebuilder_raw) +{ + HANDLE_FUNCTION_ENTER (); + + g_assert (domain); + g_assert (name || typebuilder_raw); + + ERROR_DECL (error); + + MonoReflectionAssemblyHandle ret = NULL_HANDLE_INIT; + + // This will not work correctly on netcore + if (name) { + MonoStringHandle name_handle = mono_string_new_handle (name, error); + goto_if_nok (error, exit); + ret = mono_domain_try_type_resolve_name (NULL, name_handle, error); + } else { + // TODO: make this work on netcore when working on SRE.TypeBuilder + g_assert_not_reached (); + } + +exit: + mono_error_cleanup (error); + HANDLE_FUNCTION_RETURN_OBJ (ret); +} diff --git a/src/mono/mono/metadata/reflection-internals.h b/src/mono/mono/metadata/reflection-internals.h index 7437f5448aec62..9ea2c1cdc98165 100644 --- a/src/mono/mono/metadata/reflection-internals.h +++ b/src/mono/mono/metadata/reflection-internals.h @@ -20,7 +20,7 @@ TYPED_HANDLE_DECL (MonoReflectionAssembly) TYPED_HANDLE_DECL (MonoReflectionTypeBuilder) MonoReflectionAssemblyHandle -mono_domain_try_type_resolve_name (MonoDomain *domain, MonoAssembly *assembly, MonoStringHandle name, MonoError *error); +mono_domain_try_type_resolve_name (MonoAssembly *assembly, MonoStringHandle name, MonoError *error); MonoReflectionTypeBuilderHandle mono_class_get_ref_info (MonoClass *klass); diff --git a/src/mono/mono/metadata/reflection.c b/src/mono/mono/metadata/reflection.c index e680f9905c4065..78867108492ff3 100644 --- a/src/mono/mono/metadata/reflection.c +++ b/src/mono/mono/metadata/reflection.c @@ -2256,7 +2256,7 @@ mono_reflection_get_type_with_rootimage (MonoAssemblyLoadContext *alc, MonoImage name_handle = mono_string_new_handle (fullName->str, error); goto_if_nok (error, return_null); - reflection_assembly = mono_domain_try_type_resolve_name (domain, image->assembly, name_handle, error); + reflection_assembly = mono_domain_try_type_resolve_name (image->assembly, name_handle, error); goto_if_nok (error, return_null); if (MONO_HANDLE_BOOL (reflection_assembly)) {