[runtime] Use coop handles for the remaining System.Reflection.Assembly icalls (...
authorAleksey Kliger (λgeek) <akliger@gmail.com>
Mon, 5 Dec 2016 15:24:10 +0000 (10:24 -0500)
committerGitHub <noreply@github.com>
Mon, 5 Dec 2016 15:24:10 +0000 (10:24 -0500)
* [reflection] Use handles for System.Reflection.Assembly.GetFilesInternal

* [reflection] Use handles for System.Reflection.Assembly.InternalGetType

* [reflection] Use handles for System.Reflection.Assembly.GetManifestResourceNames

* [reflection] Use handles for System.Reflection.Assembly.LoadPermissions

* [reflection] Add mono_method_get_object_handle

  Reimplement mono_method_get_object_checked in terms of the handles one.

* [reflection] Use handles for System.Reflection.Assembly.get_EntryPoint

* [reflection] Use handles for four more icalls in System.Refleciton.Assembly

  That's the lot of them.

    * get_ReflecitonOnly
    * get_code_base
    * get_fullname

* get_global_assembly_cache

* [security] Use handles for System.Security.Policy.Evidence.IsAuthenticodePresent

* [runtime] Use handles for System.Web.Util.Icalls.GetUnmanagedResourcesPtr

* [runtime] Use MONO_HANDLE_GETVAL instead of MONO_HANDLE_RAW in a few places

* [runtime] Use handles for System.AppDomain.ExecuteAssembly

mono/metadata/appdomain-icalls.h
mono/metadata/appdomain.c
mono/metadata/icall-def.h
mono/metadata/icall.c
mono/metadata/mono-security.c
mono/metadata/object-internals.h
mono/metadata/reflection-internals.h
mono/metadata/reflection.c
mono/metadata/security.h

index fc1494d7cb625c3b408dba884c2f4b8ed7af6d3b..a0687a43c0c1f1931bcbfd0e4fcf53809efe6707 100644 (file)
@@ -71,9 +71,10 @@ void
 ves_icall_System_AppDomain_DoUnhandledException (MonoException *exc);
 
 gint32
-ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomain *ad, 
-                                                   MonoReflectionAssembly *refass,
-                                                   MonoArray     *args);
+ves_icall_System_AppDomain_ExecuteAssembly         (MonoAppDomainHandle ad,
+                                                   MonoReflectionAssemblyHandle refass,
+                                                   MonoArrayHandle args,
+                                                   MonoError *error);
 
 MonoAppDomain * 
 ves_icall_System_AppDomain_InternalSetDomain      (MonoAppDomain *ad);
index d877782ae864be9488e9d8984b368ad5365eedbc..6c4b09fb6e0984177ac4a419261d73ce7b855634 100644 (file)
@@ -2157,29 +2157,31 @@ ves_icall_System_AppDomain_DoUnhandledException (MonoException *exc)
 }
 
 gint32
-ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomain *ad, 
-                                                                                       MonoReflectionAssembly *refass, MonoArray *args)
+ves_icall_System_AppDomain_ExecuteAssembly (MonoAppDomainHandle ad,
+                                           MonoReflectionAssemblyHandle refass, MonoArrayHandle args,
+                                           MonoError *error)
 {
-       MonoError error;
+       mono_error_init (error);
        MonoImage *image;
        MonoMethod *method;
 
-       g_assert (refass);
-       image = refass->assembly->image;
+       g_assert (!MONO_HANDLE_IS_NULL (refass));
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (refass, assembly);
+       image = assembly->image;
        g_assert (image);
 
-       method = mono_get_method_checked (image, mono_image_get_entry_point (image), NULL, NULL, &error);
+       method = mono_get_method_checked (image, mono_image_get_entry_point (image), NULL, NULL, error);
 
        if (!method)
-               g_error ("No entry point method found in %s due to %s", image->name, mono_error_get_message (&error));
+               g_error ("No entry point method found in %s due to %s", image->name, mono_error_get_message (error));
 
-       if (!args) {
-               args = (MonoArray *) mono_array_new_checked (ad->data, mono_defaults.string_class, 0, &error);
-               mono_error_assert_ok (&error);
+       if (MONO_HANDLE_IS_NULL (args)) {
+               MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
+               MONO_HANDLE_ASSIGN (args , mono_array_new_handle (domain, mono_defaults.string_class, 0, error));
+               mono_error_assert_ok (error);
        }
 
-       int res = mono_runtime_exec_main_checked (method, (MonoArray *)args, &error);
-       mono_error_set_pending_exception (&error);
+       int res = mono_runtime_exec_main_checked (method, MONO_HANDLE_RAW (args), error);
        return res;
 }
 
index 9a197f7cf1c9112affb6418feb06b2ed62019c4c..5daf20fdf6e2f22d18e20ac3ac826861e9172b2b 100644 (file)
@@ -115,7 +115,7 @@ ICALL(KPAIR_5, "_ProtectUser", ves_icall_Mono_Security_Cryptography_KeyPairPersi
 
 ICALL_TYPE(APPDOM, "System.AppDomain", APPDOM_23)
 ICALL(APPDOM_23, "DoUnhandledException", ves_icall_System_AppDomain_DoUnhandledException)
-ICALL(APPDOM_1, "ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly)
+HANDLES(ICALL(APPDOM_1, "ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly))
 HANDLES(ICALL(APPDOM_2, "GetAssemblies", ves_icall_System_AppDomain_GetAssemblies))
 ICALL(APPDOM_3, "GetData", ves_icall_System_AppDomain_GetData)
 ICALL(APPDOM_4, "InternalGetContext", ves_icall_System_AppDomain_InternalGetContext)
@@ -502,27 +502,27 @@ HANDLES(ICALL(ASSEM_1a, "GetAotId", ves_icall_System_Reflection_Assembly_GetAotI
 HANDLES(ICALL(ASSEM_2, "GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly))
 HANDLES(ICALL(ASSEM_3, "GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly))
 HANDLES(ICALL(ASSEM_4, "GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly))
-ICALL(ASSEM_5, "GetFilesInternal", ves_icall_System_Reflection_Assembly_GetFilesInternal)
+HANDLES(ICALL(ASSEM_5, "GetFilesInternal", ves_icall_System_Reflection_Assembly_GetFilesInternal))
 HANDLES(ICALL(ASSEM_6, "GetManifestModuleInternal", ves_icall_System_Reflection_Assembly_GetManifestModuleInternal))
 HANDLES(ICALL(ASSEM_7, "GetManifestResourceInfoInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal))
 HANDLES(ICALL(ASSEM_8, "GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal))
-ICALL(ASSEM_9, "GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames)
+HANDLES(ICALL(ASSEM_9, "GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames))
 HANDLES(ICALL(ASSEM_10, "GetModulesInternal", ves_icall_System_Reflection_Assembly_GetModulesInternal))
 //ICALL(ASSEM_11, "GetNamespaces", ves_icall_System_Reflection_Assembly_GetNamespaces)
 HANDLES(ICALL(ASSEM_13, "GetTypes", ves_icall_System_Reflection_Assembly_GetTypes))
 HANDLES(ICALL(ASSEM_14, "InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName))
 HANDLES(ICALL(ASSEM_12, "InternalGetReferencedAssemblies", ves_icall_System_Reflection_Assembly_InternalGetReferencedAssemblies))
-ICALL(ASSEM_15, "InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType)
+HANDLES(ICALL(ASSEM_15, "InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType))
 HANDLES(ICALL(ASSEM_16, "InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion))
 HANDLES(ICALL(ASSEM_17, "LoadFrom", ves_icall_System_Reflection_Assembly_LoadFrom))
-ICALL(ASSEM_18, "LoadPermissions", ves_icall_System_Reflection_Assembly_LoadPermissions)
+HANDLES(ICALL(ASSEM_18, "LoadPermissions", ves_icall_System_Reflection_Assembly_LoadPermissions))
 
        /* normal icalls again */
-ICALL(ASSEM_20, "get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint)
-ICALL(ASSEM_21, "get_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly)
-ICALL(ASSEM_22, "get_code_base", ves_icall_System_Reflection_Assembly_get_code_base)
-ICALL(ASSEM_23, "get_fullname", ves_icall_System_Reflection_Assembly_get_fullName)
-ICALL(ASSEM_24, "get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache)
+HANDLES(ICALL(ASSEM_20, "get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint))
+HANDLES(ICALL(ASSEM_21, "get_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly))
+HANDLES(ICALL(ASSEM_22, "get_code_base", ves_icall_System_Reflection_Assembly_get_code_base))
+HANDLES(ICALL(ASSEM_23, "get_fullname", ves_icall_System_Reflection_Assembly_get_fullName))
+HANDLES(ICALL(ASSEM_24, "get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache))
 HANDLES(ICALL(ASSEM_25, "get_location", ves_icall_System_Reflection_Assembly_get_location))
 HANDLES(ICALL(ASSEM_26, "load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name))
 
@@ -826,7 +826,7 @@ ICALL(RNG_4, "RngOpen", ves_icall_System_Security_Cryptography_RNGCryptoServiceP
 
 #ifndef DISABLE_POLICY_EVIDENCE
 ICALL_TYPE(EVID, "System.Security.Policy.Evidence", EVID_1)
-ICALL(EVID_1, "IsAuthenticodePresent", ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent)
+HANDLES(ICALL(EVID_1, "IsAuthenticodePresent", ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent))
 
 ICALL_TYPE(WINID, "System.Security.Principal.WindowsIdentity", WINID_1)
 ICALL(WINID_1, "GetCurrentToken", ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken)
@@ -1051,7 +1051,7 @@ ICALL(VALUET_2, "InternalGetHashCode", ves_icall_System_ValueType_InternalGetHas
 ICALL_TYPE(WEBIC, "System.Web.Util.ICalls", WEBIC_1)
 ICALL(WEBIC_1, "GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path)
 ICALL(WEBIC_2, "GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir)
-ICALL(WEBIC_3, "GetUnmanagedResourcesPtr", ves_icall_get_resources_ptr)
+HANDLES(ICALL(WEBIC_3, "GetUnmanagedResourcesPtr", ves_icall_get_resources_ptr))
 
 #ifndef DISABLE_COM
 ICALL_TYPE(COMOBJ, "System.__ComObject", COMOBJ_1)
index dd11e425badaaad13480b98e1605a7fd948272ca..946803d692d27868a74f4d6c1b9ea07d2145cc25 100644 (file)
@@ -4330,31 +4330,56 @@ ves_icall_RuntimeType_GetNestedTypes_native (MonoReflectionType *type, char *str
        return res_array;
 }
 
-ICALL_EXPORT MonoReflectionType*
-ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
+static MonoType*
+get_type_from_module_builder_module (MonoArrayHandle modules, int i, MonoTypeNameParse *info, MonoBoolean ignoreCase, gboolean *type_resolve, MonoError *error)
 {
-       MonoError error;
-       MonoReflectionType *ret;
-       gchar *str;
+       HANDLE_FUNCTION_ENTER ();
+       mono_error_init (error);
+       MonoType *type = NULL;
+       MonoReflectionModuleBuilderHandle mb = MONO_HANDLE_NEW (MonoReflectionModuleBuilder, NULL);
+       MONO_HANDLE_ARRAY_GETREF (mb, modules, i);
+       MonoDynamicImage *dynamic_image = MONO_HANDLE_GETVAL (mb, dynamic_image);
+       type = mono_reflection_get_type_checked (&dynamic_image->image, &dynamic_image->image, info, ignoreCase, type_resolve, error);
+       HANDLE_FUNCTION_RETURN_VAL (type);
+}
+
+static MonoType*
+get_type_from_module_builder_loaded_modules (MonoArrayHandle loaded_modules, int i, MonoTypeNameParse *info, MonoBoolean ignoreCase, gboolean *type_resolve, MonoError *error)
+{
+       HANDLE_FUNCTION_ENTER ();
+       mono_error_init (error);
        MonoType *type = NULL;
+       MonoReflectionModuleHandle mod = MONO_HANDLE_NEW (MonoReflectionModule, NULL);
+       MONO_HANDLE_ARRAY_GETREF (mod, loaded_modules, i);
+       MonoImage *image = MONO_HANDLE_GETVAL (mod, image);
+       type = mono_reflection_get_type_checked (image, image, info, ignoreCase, type_resolve, error);
+       HANDLE_FUNCTION_RETURN_VAL (type);
+}
+
+ICALL_EXPORT MonoReflectionTypeHandle
+ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssemblyHandle assembly_h, MonoReflectionModuleHandle module, MonoStringHandle name, MonoBoolean throwOnError, MonoBoolean ignoreCase, MonoError *error)
+{
+       mono_error_init (error);
+
        MonoTypeNameParse info;
        gboolean type_resolve;
 
        /* On MS.NET, this does not fire a TypeResolve event */
        type_resolve = TRUE;
-       str = mono_string_to_utf8_checked (name, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
+       char *str = mono_string_handle_to_utf8 (name, error);
+       if (!is_ok (error))
+               goto fail;
+
        /*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
        if (!mono_reflection_parse_type (str, &info)) {
                g_free (str);
                mono_reflection_free_type_info (&info);
                if (throwOnError) {
-                       mono_set_pending_exception (mono_get_exception_argument("name", "failed parse"));
-                       return NULL;
+                       mono_error_set_argument (error, "name", "failed to parse the type");
+                       goto fail;
                }
                /*g_print ("failed parse\n");*/
-               return NULL;
+               return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
        }
 
        if (info.assembly.name) {
@@ -4363,57 +4388,61 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
                if (throwOnError) {
                        /* 1.0 and 2.0 throw different exceptions */
                        if (mono_defaults.generic_ilist_class)
-                               mono_set_pending_exception (mono_get_exception_argument (NULL, "Type names passed to Assembly.GetType() must not specify an assembly."));
+                               mono_error_set_argument (error, NULL, "Type names passed to Assembly.GetType() must not specify an assembly.");
                        else
-                               mono_set_pending_exception (mono_get_exception_type_load (name, NULL));
-                       return NULL;
+                               mono_error_set_type_load_name (error, g_strdup (""), g_strdup (""), "Type names passed to Assembly.GetType() must not specify an assembly.");
+                       goto fail;
                }
-               return NULL;
+               return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
        }
 
-       if (module != NULL) {
-               if (module->image) {
-                       type = mono_reflection_get_type_checked (module->image, module->image, &info, ignoreCase, &type_resolve, &error);
-                       if (!is_ok (&error)) {
+       MonoType *type = NULL;
+       if (!MONO_HANDLE_IS_NULL (module)) {
+               MonoImage *image = MONO_HANDLE_GETVAL (module, image);
+               if (image) {
+                       type = mono_reflection_get_type_checked (image, image, &info, ignoreCase, &type_resolve, error);
+                       if (!is_ok (error)) {
                                g_free (str);
                                mono_reflection_free_type_info (&info);
-                               mono_error_set_pending_exception (&error);
-                               return NULL;
+                               goto fail;
                        }
-               } else
-                       type = NULL;
+               }
        }
-       else
-               if (assembly_is_dynamic (assembly->assembly)) {
+       else {
+               MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+               if (assembly_is_dynamic (assembly)) {
                        /* Enumerate all modules */
-                       MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
+                       MonoReflectionAssemblyBuilderHandle abuilder = MONO_HANDLE_NEW (MonoReflectionAssemblyBuilder, NULL);
+                       MONO_HANDLE_ASSIGN (abuilder, assembly_h);
                        int i;
 
-                       type = NULL;
-                       if (abuilder->modules) {
-                               for (i = 0; i < mono_array_length (abuilder->modules); ++i) {
-                                       MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
-                                       type = mono_reflection_get_type_checked (&mb->dynamic_image->image, &mb->dynamic_image->image, &info, ignoreCase, &type_resolve, &error);
-                                       if (!is_ok (&error)) {
+                       MonoArrayHandle modules = MONO_HANDLE_NEW (MonoArray, NULL);
+                       MONO_HANDLE_GET (modules, abuilder, modules);
+                       if (!MONO_HANDLE_IS_NULL (modules)) {
+                               int n = mono_array_handle_length (modules);
+                               for (i = 0; i < n; ++i) {
+                                       type = get_type_from_module_builder_module (modules, i, &info, ignoreCase, &type_resolve, error);
+                                       if (!is_ok (error)) {
                                                g_free (str);
                                                mono_reflection_free_type_info (&info);
-                                               mono_error_set_pending_exception (&error);
-                                               return NULL;
+                                               goto fail;
                                        }
                                        if (type)
                                                break;
                                }
                        }
 
-                       if (!type && abuilder->loaded_modules) {
-                               for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {
-                                       MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
-                                       type = mono_reflection_get_type_checked (mod->image, mod->image, &info, ignoreCase, &type_resolve, &error);
-                                       if (!is_ok (&error)) {
+                       MonoArrayHandle loaded_modules = MONO_HANDLE_NEW (MonoArray, NULL);
+                       MONO_HANDLE_GET (loaded_modules, abuilder, loaded_modules);
+                       if (!type && !MONO_HANDLE_IS_NULL (loaded_modules)) {
+                               int n = mono_array_handle_length (loaded_modules);
+                               for (i = 0; i < n; ++i) {
+                                       type = get_type_from_module_builder_loaded_modules (loaded_modules, i, &info, ignoreCase, &type_resolve, error);
+
+                                       if (!is_ok (error)) {
                                                g_free (str);
                                                mono_reflection_free_type_info (&info);
-                                               mono_error_set_pending_exception (&error);
-                                               return NULL;
+                                               goto fail;
                                        }
                                        if (type)
                                                break;
@@ -4421,25 +4450,29 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
                        }
                }
                else {
-                       type = mono_reflection_get_type_checked (assembly->assembly->image, assembly->assembly->image, &info, ignoreCase, &type_resolve, &error);
-                       if (!is_ok (&error)) {
+                       type = mono_reflection_get_type_checked (assembly->image, assembly->image, &info, ignoreCase, &type_resolve, error);
+                       if (!is_ok (error)) {
                                g_free (str);
                                mono_reflection_free_type_info (&info);
-                               mono_error_set_pending_exception (&error);
-                               return NULL;
+                               goto fail;
                        }
                }
+       }
        g_free (str);
        mono_reflection_free_type_info (&info);
+
        if (!type) {
-               MonoException *e = NULL;
-               
-               if (throwOnError)
-                       e = mono_get_exception_type_load (name, NULL);
+               if (throwOnError) {
+                       MonoError inner_error;
+                       char *typename = mono_string_handle_to_utf8 (name, &inner_error);
+                       mono_error_assert_ok (&inner_error);
+                       MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+                       char *assmname = mono_stringify_assembly_name (&assembly->aname);
+                       mono_error_set_type_load_name (error, typename, assmname, "%s", "");
+                       goto fail;
+               }
 
-               if (e != NULL)
-                       mono_set_pending_exception (e);
-               return NULL;
+               return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
        }
 
        if (type->type == MONO_TYPE_CLASS) {
@@ -4448,17 +4481,16 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
                /* need to report exceptions ? */
                if (throwOnError && mono_class_has_failure (klass)) {
                        /* report SecurityException (or others) that occured when loading the assembly */
-                       mono_error_set_for_class_failure (&error, klass);
-                       mono_error_set_pending_exception (&error);
-                       return NULL;
+                       mono_error_set_for_class_failure (error, klass);
+                       goto fail;
                }
        }
 
        /* g_print ("got it\n"); */
-       ret = mono_type_get_object_checked (mono_object_domain (assembly), type, &error);
-       mono_error_set_pending_exception (&error);
-
-       return ret;
+       return mono_type_get_object_handle (MONO_HANDLE_DOMAIN (assembly_h), type, error);
+fail:
+       g_assert (!is_ok (error));
+       return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
 }
 
 static gboolean
@@ -4490,13 +4522,12 @@ replace_shadow_path (MonoDomain *domain, gchar *dirname, gchar **filename)
        return FALSE;
 }
 
-ICALL_EXPORT MonoString *
-ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssemblyHandle assembly, MonoBoolean escaped, MonoError *error)
 {
-       MonoDomain *domain = mono_object_domain (assembly); 
-       MonoAssembly *mass = assembly->assembly;
-       MonoString *res = NULL;
-       gchar *uri;
+       mono_error_init (error);
+       MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
+       MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly, assembly);
        gchar *absolute;
        gchar *dirname;
        
@@ -4513,6 +4544,7 @@ ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *asse
 
        mono_icall_make_platform_path (absolute);
 
+       gchar *uri;
        if (escaped) {
                uri = g_filename_to_uri (absolute, NULL, NULL);
        } else {
@@ -4520,18 +4552,23 @@ ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *asse
                uri = g_strconcat (prepend, absolute, NULL);
        }
 
+       g_free (absolute);
+
+       MonoStringHandle res;
        if (uri) {
-               res = mono_string_new (domain, uri);
+               res = mono_string_new_handle (domain, uri, error);
                g_free (uri);
+       } else {
+               res = MONO_HANDLE_NEW (MonoString, NULL);
        }
-       g_free (absolute);
        return res;
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)
+ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssemblyHandle assembly, MonoError *error)
 {
-       MonoAssembly *mass = assembly->assembly;
+       mono_error_init (error);
+       MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly,assembly);
 
        return mass->in_gac;
 }
@@ -4561,45 +4598,46 @@ ICALL_EXPORT MonoStringHandle
 ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssemblyHandle refassembly, MonoError *error)
 {
        MonoDomain *domain = MONO_HANDLE_DOMAIN (refassembly);
-       MonoAssembly *assembly = MONO_HANDLE_RAW (refassembly)->assembly;
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (refassembly, assembly);
        return mono_string_new_handle (domain, mono_image_get_filename (assembly->image), error);
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)
+ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssemblyHandle assembly_h, MonoError *error)
 {
-       return assembly->assembly->ref_only;
+       mono_error_init (error);
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+       return assembly->ref_only;
 }
 
 ICALL_EXPORT MonoStringHandle
 ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssemblyHandle refassembly, MonoError *error)
 {
        MonoDomain *domain = MONO_HANDLE_DOMAIN (refassembly);
-       MonoAssembly *assembly = MONO_HANDLE_RAW (refassembly)->assembly;
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (refassembly, assembly);
 
        return mono_string_new_handle (domain, assembly->image->version, error);
 }
 
-ICALL_EXPORT MonoReflectionMethod*
-ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly
+ICALL_EXPORT MonoReflectionMethodHandle
+ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssemblyHandle assembly_h, MonoError *error
 {
-       MonoError error;
-       MonoReflectionMethod *res = NULL;
+       mono_error_init (error);
+       MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
        MonoMethod *method;
 
-       guint32 token = mono_image_get_entry_point (assembly->assembly->image);
+       MonoReflectionMethodHandle res = MONO_HANDLE_NEW (MonoReflectionMethod, NULL);
+       guint32 token = mono_image_get_entry_point (assembly->image);
 
        if (!token)
-               return NULL;
-       method = mono_get_method_checked (assembly->assembly->image, token, NULL, NULL, &error);
-       if (!mono_error_ok (&error))
+               goto leave;
+       method = mono_get_method_checked (assembly->image, token, NULL, NULL, error);
+       if (!is_ok (error))
                goto leave;
 
-       res = mono_method_get_object_checked (mono_object_domain (assembly), method, NULL, &error);
-
+       MONO_HANDLE_ASSIGN (res, mono_method_get_object_handle (domain, method, NULL, error));
 leave:
-       if (!mono_error_ok (&error))
-               mono_error_set_pending_exception (&error);
        return res;
 }
 
@@ -4612,22 +4650,39 @@ ves_icall_System_Reflection_Assembly_GetManifestModuleInternal (MonoReflectionAs
        return mono_module_get_object_handle (domain, a->image, error);
 }
 
-ICALL_EXPORT MonoArray*
-ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) 
+static gboolean
+add_manifest_resource_name_to_array (MonoDomain *domain, MonoImage *image, MonoTableInfo *table, int i, MonoArrayHandle dest, MonoError *error)
 {
-       MonoError error;
-       MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
-       MonoArray *result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, table->rows, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
+       HANDLE_FUNCTION_ENTER ();
+       mono_error_init (error);
+       const char *val = mono_metadata_string_heap (image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
+       MonoStringHandle str = mono_string_new_handle (domain, val, error);
+       if (!is_ok (error))
+               goto leave;
+       MONO_HANDLE_ARRAY_SETREF (dest, i, str);
+leave:
+       HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
+ICALL_EXPORT MonoArrayHandle
+ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssemblyHandle assembly_h, MonoError *error) 
+{
+       mono_error_init (error);
+       MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+       MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
+       MonoArrayHandle result = mono_array_new_handle (domain, mono_defaults.string_class, table->rows, error);
+       if (!is_ok (error))
+               goto fail;
        int i;
-       const char *val;
 
        for (i = 0; i < table->rows; ++i) {
-               val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
-               mono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));
+               if (!add_manifest_resource_name_to_array (domain, assembly->image, table, i, result, error))
+                       goto fail;
        }
        return result;
+fail:
+       return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE);
 }
 
 ICALL_EXPORT MonoStringHandle
@@ -4852,35 +4907,51 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec
        return get_manifest_resource_info_internal (assembly_h, name, info_h, error);
 }
 
-ICALL_EXPORT MonoObject*
-ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules) 
+static gboolean
+add_filename_to_files_array (MonoDomain *domain, MonoAssembly * assembly, MonoTableInfo *table, int i, MonoArrayHandle dest, int dest_idx, MonoError *error)
 {
-       MonoError error;
-       MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
-       MonoArray *result = NULL;
+       HANDLE_FUNCTION_ENTER();
+       mono_error_init (error);
+       const char *val = mono_metadata_string_heap (assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
+       char *n = g_concat_dir_and_file (assembly->basedir, val);
+       MonoStringHandle str = mono_string_new_handle (domain, n, error);
+       g_free (n);
+       if (!is_ok (error))
+               goto leave;
+       MONO_HANDLE_ARRAY_SETREF (dest, dest_idx, str);
+leave:
+       HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
+ICALL_EXPORT MonoObjectHandle
+ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssemblyHandle assembly_h, MonoStringHandle name, MonoBoolean resource_modules, MonoError *error) 
+{
+       mono_error_init (error);
+       MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly_h);
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
+       MonoTableInfo *table = &assembly->image->tables [MONO_TABLE_FILE];
        int i, count;
-       const char *val;
-       char *n;
 
        /* check hash if needed */
-       if (name) {
-               n = mono_string_to_utf8_checked (name, &error);
-               if (mono_error_set_pending_exception (&error))
-                       return NULL;
+       if (!MONO_HANDLE_IS_NULL(name)) {
+               char *n = mono_string_handle_to_utf8 (name, error);
+               if (!is_ok (error))
+                       goto fail;
 
                for (i = 0; i < table->rows; ++i) {
-                       val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
+                       const char *val = mono_metadata_string_heap (assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
                        if (strcmp (val, n) == 0) {
-                               MonoString *fn;
                                g_free (n);
-                               n = g_concat_dir_and_file (assembly->assembly->basedir, val);
-                               fn = mono_string_new (mono_object_domain (assembly), n);
+                               n = g_concat_dir_and_file (assembly->basedir, val);
+                               MonoStringHandle fn = mono_string_new_handle (domain, n, error);
                                g_free (n);
-                               return (MonoObject*)fn;
+                               if (!is_ok (error))
+                                       goto fail;
+                               return MONO_HANDLE_CAST (MonoObject, fn);
                        }
                }
                g_free (n);
-               return NULL;
+               return NULL_HANDLE;
        }
 
        count = 0;
@@ -4889,22 +4960,21 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a
                        count ++;
        }
 
-       result = mono_array_new_checked (mono_object_domain (assembly), mono_defaults.string_class, count, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
-
+       MonoArrayHandle result = mono_array_new_handle (domain, mono_defaults.string_class, count, error);
+       if (!is_ok (error))
+               goto fail;
 
        count = 0;
        for (i = 0; i < table->rows; ++i) {
                if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
-                       val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
-                       n = g_concat_dir_and_file (assembly->assembly->basedir, val);
-                       mono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));
-                       g_free (n);
-                       count ++;
+                       if (!add_filename_to_files_array (domain, assembly, table, i, result, count, error))
+                               goto fail;
+                       count++;
                }
        }
-       return (MonoObject*)result;
+       return MONO_HANDLE_CAST (MonoObject, result);
+fail:
+       return NULL_HANDLE;
 }
 
 static gboolean
@@ -5206,18 +5276,17 @@ ves_icall_MonoMethod_get_core_clr_security_level (MonoReflectionMethod *rfield)
        return mono_security_core_clr_method_level (method, TRUE);
 }
 
-ICALL_EXPORT MonoString *
-ves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssembly *assembly)
+ICALL_EXPORT MonoStringHandle
+ves_icall_System_Reflection_Assembly_get_fullName (MonoReflectionAssemblyHandle assembly, MonoError *error)
 {
-       MonoDomain *domain = mono_object_domain (assembly); 
-       MonoAssembly *mass = assembly->assembly;
-       MonoString *res;
+       mono_error_init (error);
+       MonoDomain *domain = MONO_HANDLE_DOMAIN (assembly);
+       MonoAssembly *mass = MONO_HANDLE_GETVAL (assembly, assembly);
        gchar *name;
 
        name = mono_stringify_assembly_name (&mass->aname);
-       res = mono_string_new (domain, name);
+       MonoStringHandle res = mono_string_new_handle (domain, name, error);
        g_free (name);
-
        return res;
 }
 
@@ -5286,26 +5355,28 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoStringHandle f
 }
 
 ICALL_EXPORT MonoBoolean
-ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,
-       char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)
+ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssemblyHandle assembly_h,
+                                                     char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength, MonoError *error)
 {
+       mono_error_init (error);
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (assembly_h, assembly);
        MonoBoolean result = FALSE;
        MonoDeclSecurityEntry entry;
 
        /* SecurityAction.RequestMinimum */
-       if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {
+       if (mono_declsec_get_assembly_action (assembly, SECURITY_ACTION_REQMIN, &entry)) {
                *minimum = entry.blob;
                *minLength = entry.size;
                result = TRUE;
        }
        /* SecurityAction.RequestOptional */
-       if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {
+       if (mono_declsec_get_assembly_action (assembly, SECURITY_ACTION_REQOPT, &entry)) {
                *optional = entry.blob;
                *optLength = entry.size;
                result = TRUE;
        }
        /* SecurityAction.RequestRefuse */
-       if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
+       if (mono_declsec_get_assembly_action (assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
                *refused = entry.blob;
                *refLength = entry.size;
                result = TRUE;
@@ -7105,8 +7176,9 @@ ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)
 }
 
 ICALL_EXPORT gboolean
-ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result, gint32 *size)
+ves_icall_get_resources_ptr (MonoReflectionAssemblyHandle assembly, gpointer *result, gint32 *size, MonoError *error)
 {
+       mono_error_init (error);
        MonoPEResourceDataEntry *entry;
        MonoImage *image;
 
@@ -7115,7 +7187,8 @@ ves_icall_get_resources_ptr (MonoReflectionAssembly *assembly, gpointer *result,
 
        *result = NULL;
        *size = 0;
-       image = assembly->assembly->image;
+       MonoAssembly *assm = MONO_HANDLE_GETVAL (assembly, assembly);
+       image = assm->image;
        entry = (MonoPEResourceDataEntry *)mono_image_lookup_resource (image, MONO_PE_RESOURCE_ID_ASPNET_STRING, 0, NULL);
        if (!entry)
                return FALSE;
index 4d39be15a265a934d97a9a75af69f6ec30e42c47..cd1a9ad0aecf2c980b244c5a1058838a536cc1ef 100644 (file)
@@ -550,10 +550,14 @@ ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser (MonoString
  * Note: Neither the structure nor the signature is verified by this function.
  */
 MonoBoolean
-ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionAssembly *refass)
+ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionAssemblyHandle refass, MonoError *error)
 {
-       if (refass && refass->assembly && refass->assembly->image) {
-               return (MonoBoolean)mono_image_has_authenticode_entry (refass->assembly->image);
+       mono_error_init (error);
+       if (MONO_HANDLE_IS_NULL (refass))
+               return FALSE;
+       MonoAssembly *assembly = MONO_HANDLE_GETVAL (refass, assembly);
+       if (assembly && assembly->image) {
+               return (MonoBoolean)mono_image_has_authenticode_entry (assembly->image);
        }
        return FALSE;
 }
index b19e86b696e678b471a61c4101c1c19c98e7e243..bc76b0460c8b69f7195e4ecf18e27626e5c3de27 100644 (file)
@@ -729,6 +729,9 @@ struct _MonoReflectionMethod {
        MonoReflectionType *reftype;
 };
 
+/* Safely access System.Reflection.MonoMethod from native code */
+TYPED_HANDLE_DECL (MonoReflectionMethod);
+
 typedef struct _MonoReflectionGenericMethod MonoReflectionGenericMethod;
 struct _MonoReflectionGenericMethod {
        MonoReflectionMethod method;
index 0763923e0f57e0899245bc8ea4eeb1b9cc570aa1..0f2af6bd9dafd276ba68f2e3bef5341aa61157f9 100644 (file)
@@ -79,6 +79,9 @@ mono_field_get_object_checked (MonoDomain *domain, MonoClass *klass, MonoClassFi
 MonoReflectionMethod*
 mono_method_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error);
 
+MonoReflectionMethodHandle
+mono_method_get_object_handle (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error);
+
 MonoReflectionProperty*
 mono_property_get_object_checked (MonoDomain *domain, MonoClass *klass, MonoProperty *property, MonoError *error);
 
index ce272572e74d74398485e9f8e957692f40461d1e..45b5a54274bf8791c97c327ad79630dee20c6ea5 100644 (file)
@@ -549,14 +549,14 @@ mono_type_get_object_handle (MonoDomain *domain, MonoType *type, MonoError *erro
 MonoReflectionMethod*
 mono_method_get_object (MonoDomain *domain, MonoMethod *method, MonoClass *refclass)
 {
+       HANDLE_FUNCTION_ENTER ();
        MonoError error;
-       MonoReflectionMethod *ret = NULL;
-       ret = mono_method_get_object_checked (domain, method, refclass, &error);
+       MonoReflectionMethodHandle ret = mono_method_get_object_handle (domain, method, refclass, &error);
        mono_error_cleanup (&error);
-       return ret;
+       HANDLE_FUNCTION_RETURN_OBJ (ret);
 }
 
-static MonoReflectionMethod*
+static MonoReflectionMethodHandle
 method_object_construct (MonoDomain *domain, MonoClass *refclass, MonoMethod *method, gpointer user_data, MonoError *error)
 {
        mono_error_init (error);
@@ -565,9 +565,7 @@ method_object_construct (MonoDomain *domain, MonoClass *refclass, MonoMethod *me
         * We use the same C representation for methods and constructors, but the type 
         * name in C# is different.
         */
-       MonoReflectionType *rt;
        MonoClass *klass;
-       MonoReflectionMethod *ret;
 
        mono_error_init (error);
 
@@ -577,26 +575,23 @@ method_object_construct (MonoDomain *domain, MonoClass *refclass, MonoMethod *me
        else {
                klass = mono_class_get_mono_method_class ();
        }
-       ret = (MonoReflectionMethod*)mono_object_new_checked (domain, klass, error);
+       MonoReflectionMethodHandle ret = MONO_HANDLE_NEW (MonoReflectionMethod, mono_object_new_checked (domain, klass, error));
        if (!mono_error_ok (error))
                goto leave;
-       ret->method = method;
+       MONO_HANDLE_SETVAL (ret, method, MonoMethod*, method);
 
-       rt = mono_type_get_object_checked (domain, &refclass->byval_arg, error);
+       MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, &refclass->byval_arg, error);
        if (!mono_error_ok (error))
                goto leave;
 
-       MONO_OBJECT_SETREF (ret, reftype, rt);
-
-       return ret;
+       MONO_HANDLE_SET (ret, reftype, rt);
 
 leave:
-       g_assert (!mono_error_ok (error));
-       return NULL;
+       return ret;
 }
 
 /*
- * mono_method_get_object_checked:
+ * mono_method_get_object_handle:
  * @domain: an app domain
  * @method: a method
  * @refclass: the reflected type (can be NULL)
@@ -605,14 +600,32 @@ leave:
  * Return an System.Reflection.MonoMethod object representing the method @method.
  * Returns NULL and sets @error on error.
  */
-MonoReflectionMethod*
-mono_method_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error)
+MonoReflectionMethodHandle
+mono_method_get_object_handle (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error)
 {
        mono_error_init (error);
        if (!refclass)
                refclass = method->klass;
 
-       return CHECK_OR_CONSTRUCT (MonoReflectionMethod*, method, refclass, method_object_construct, NULL);
+       return CHECK_OR_CONSTRUCT_HANDLE (MonoReflectionMethodHandle, method, refclass, method_object_construct, NULL);
+}
+/*
+ * mono_method_get_object_checked:
+ * @domain: an app domain
+ * @method: a method
+ * @refclass: the reflected type (can be NULL)
+ * @error: set on error.
+ *
+ * Return an System.Reflection.MonoMethod object representing the method @method.
+ * Returns NULL and sets @error on error.
+ */
+MonoReflectionMethod*
+mono_method_get_object_checked (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error)
+{
+       HANDLE_FUNCTION_ENTER ();
+       mono_error_init (error);
+       MonoReflectionMethodHandle result = mono_method_get_object_handle (domain, method, refclass, error);
+       HANDLE_FUNCTION_RETURN_OBJ (result);
 }
 
 /*
index 4497e168141a51d3fbe2d84cce5de4ad7f044ce1..3d61904d593383aee1d042cf80e64ab5e6b830b0 100644 (file)
@@ -13,7 +13,9 @@
 
 #include <glib.h>
 #include <mono/metadata/object.h>
+#include <mono/metadata/object-internals.h>
 #include <mono/utils/mono-compiler.h>
+#include <mono/utils/mono-error.h>
 #include <mono/utils/mono-publib.h>
 
 G_BEGIN_DECLS
@@ -50,7 +52,7 @@ extern MonoBoolean ves_icall_Mono_Security_Cryptography_KeyPairPersistence_Prote
 
 
 /* System.Security.Policy.Evidence */
-MonoBoolean ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionAssembly *refass);
+MonoBoolean ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent (MonoReflectionAssemblyHandle refass, MonoError *error);
 
 /* System.Security.SecureString */
 extern void ves_icall_System_Security_SecureString_DecryptInternal (MonoArray *data, MonoObject *scope);