Some external_only/internal split, and inlining. (mono/mono#17012)
authorJay Krell <jaykrell@microsoft.com>
Wed, 2 Oct 2019 10:59:45 +0000 (03:59 -0700)
committerAlexander Köplinger <alex.koeplinger@outlook.com>
Wed, 2 Oct 2019 10:59:45 +0000 (12:59 +0200)
mono_type_get_type
 mono_type_get_signature
 mono_type_is_byref
 mono_type_get_class
 mono_type_get_array_type

Commit migrated from https://github.com/mono/mono/commit/6fb01aa269e7654db21f32c4d44df0d6e0a93e67

src/mono/mono/metadata/cominterop.c
src/mono/mono/metadata/icall.c
src/mono/mono/metadata/marshal-ilgen.c
src/mono/mono/metadata/marshal.c
src/mono/mono/metadata/metadata-internals.h
src/mono/mono/metadata/metadata.c
src/mono/mono/metadata/metadata.h
src/mono/mono/metadata/verify.c
src/mono/mono/mini/debugger-agent.c
src/mono/mono/mini/mini-generic-sharing.c

index 804f675..20f6129 100644 (file)
@@ -867,7 +867,7 @@ mono_cominterop_emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type,
                mono_mb_emit_byte (mb, CEE_LDIND_REF);
 
                if (conv == MONO_MARSHAL_CONV_OBJECT_INTERFACE) {
-                       mono_mb_emit_ptr (mb, mono_type_get_class (type));
+                       mono_mb_emit_ptr (mb, mono_type_get_class_internal (type));
                        mono_mb_emit_icall (mb, cominterop_get_interface);
 
                }
@@ -900,7 +900,7 @@ mono_cominterop_emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type,
                mono_mb_emit_byte (mb, CEE_LDIND_REF);
                
                if (conv == MONO_MARSHAL_CONV_OBJECT_INTERFACE)
-                       mono_mb_emit_ptr (mb, mono_type_get_class (type));
+                       mono_mb_emit_ptr (mb, mono_type_get_class_internal (type));
                else if (conv == MONO_MARSHAL_CONV_OBJECT_IUNKNOWN)
                        mono_mb_emit_ptr (mb, mono_class_get_iunknown_class ());
                else if (conv == MONO_MARSHAL_CONV_OBJECT_IDISPATCH)
@@ -1686,7 +1686,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_GetCCW (MonoObjectHandle object
        g_assert (!MONO_HANDLE_IS_NULL (ref_type));
        MonoType * const type = MONO_HANDLE_GETVAL (ref_type, type);
        g_assert (type);
-       MonoClass * klass = mono_type_get_class (type);
+       MonoClass * klass = mono_type_get_class_internal (type);
        g_assert (klass);
        if (!mono_class_init_checked (klass, error))
                return NULL;
@@ -1701,7 +1701,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_GetCCW (MonoObjectHandle object
                if (attr) {
                        MonoType *def_itf = attr->type->type;
                        if (def_itf->type == MONO_TYPE_CLASS)
-                               klass = mono_type_get_class (def_itf);
+                               klass = mono_type_get_class_internal (def_itf);
                }
                if (!cinfo->cached)
                        mono_custom_attrs_free (cinfo);
index 46250af..391936c 100644 (file)
@@ -5045,7 +5045,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssemblyHand
        }
 
        if (type->type == MONO_TYPE_CLASS) {
-               MonoClass *klass = mono_type_get_class (type);
+               MonoClass *klass = mono_type_get_class_internal (type);
 
                /* need to report exceptions ? */
                if (throwOnError && mono_class_has_failure (klass)) {
@@ -6107,7 +6107,7 @@ assembly_get_types (MonoReflectionAssemblyHandle assembly_handle, MonoBoolean ex
                MONO_HANDLE_ARRAY_GETREF (t, res, i);
 
                if (!MONO_HANDLE_IS_NULL (t)) {
-                       MonoClass *klass = mono_type_get_class (MONO_HANDLE_GETVAL (t, type));
+                       MonoClass *klass = mono_type_get_class_internal (MONO_HANDLE_GETVAL (t, type));
                        if ((klass != NULL) && mono_class_has_failure (klass)) {
                                /* keep the class in the list */
                                list = g_list_append (list, klass);
index 6bdeb1f..f1aaa2a 100644 (file)
@@ -6319,18 +6319,18 @@ signature_param_uses_handles (MonoMethodSignature *sig, MonoMethodSignature *gen
         * like string& since the C code for the icall has to work uniformly
         * for both valuetypes and reference types.
         */
-       if (generic_sig && mono_type_is_byref (generic_sig->params [param]) &&
+       if (generic_sig && mono_type_is_byref_internal (generic_sig->params [param]) &&
            (generic_sig->params [param]->type == MONO_TYPE_VAR || generic_sig->params [param]->type == MONO_TYPE_MVAR))
                return ICALL_HANDLES_WRAP_VALUETYPE_REF;
 
        if (MONO_TYPE_IS_REFERENCE (sig->params [param])) {
                if (mono_signature_param_is_out (sig, param))
                        return ICALL_HANDLES_WRAP_OBJ_OUT;
-               else if (mono_type_is_byref (sig->params [param]))
+               else if (mono_type_is_byref_internal (sig->params [param]))
                        return ICALL_HANDLES_WRAP_OBJ_INOUT;
                else
                        return ICALL_HANDLES_WRAP_OBJ;
-       } else if (mono_type_is_byref (sig->params [param]))
+       } else if (mono_type_is_byref_internal (sig->params [param]))
                return ICALL_HANDLES_WRAP_VALUETYPE_REF;
        else
                return ICALL_HANDLES_WRAP_NONE;
index 748bc07..b8d7803 100644 (file)
@@ -5608,7 +5608,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement
 MonoDelegateHandle
 ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal (void *ftn, MonoReflectionTypeHandle type, MonoError *error)
 {
-       MonoClass *klass = mono_type_get_class (MONO_HANDLE_GETVAL (type, type));
+       MonoClass *klass = mono_type_get_class_internal (MONO_HANDLE_GETVAL (type, type));
        if (!mono_class_init_checked (klass, error))
                return MONO_HANDLE_CAST (MonoDelegate, NULL_HANDLE);
 
@@ -5624,7 +5624,7 @@ ves_icall_System_Runtime_InteropServices_Marshal_GetFunctionPointerForDelegateIn
 int
 ves_icall_System_Runtime_InteropServices_Marshal_GetArrayElementSize (MonoReflectionTypeHandle type_h, MonoError *error)
 {
-       MonoClass *eklass = mono_type_get_class (MONO_HANDLE_GETVAL (type_h, type));
+       MonoClass *eklass = mono_type_get_class_internal (MONO_HANDLE_GETVAL (type_h, type));
 
        mono_class_init_internal (eklass);
 
index 059cf6d..b033439 100644 (file)
@@ -1222,4 +1222,71 @@ mono_assembly_get_alc (MonoAssembly *assm)
        return mono_image_get_alc (assm->image);
 }
 
+/**
+ * mono_type_get_type_internal:
+ * \param type the \c MonoType operated on
+ * \returns the IL type value for \p type. This is one of the \c MonoTypeEnum
+ * enum members like \c MONO_TYPE_I4 or \c MONO_TYPE_STRING.
+ */
+static inline int
+mono_type_get_type_internal (MonoType *type)
+{
+       return type->type;
+}
+
+/**
+ * mono_type_get_signature:
+ * \param type the \c MonoType operated on
+ * It is only valid to call this function if \p type is a \c MONO_TYPE_FNPTR .
+ * \returns the \c MonoMethodSignature pointer that describes the signature
+ * of the function pointer \p type represents.
+ */
+static inline MonoMethodSignature*
+mono_type_get_signature_internal (MonoType *type)
+{
+       g_assert (type->type == MONO_TYPE_FNPTR);
+       return type->data.method;
+}
+
+/**
+ * mono_type_is_byref_internal:
+ * \param type the \c MonoType operated on
+ * \returns TRUE if \p type represents a type passed by reference,
+ * FALSE otherwise.
+ */
+static inline mono_bool
+mono_type_is_byref_internal (MonoType *type)
+{
+       return type->byref;
+}
+
+/**
+ * mono_type_get_class_internal:
+ * \param type the \c MonoType operated on
+ * It is only valid to call this function if \p type is a \c MONO_TYPE_CLASS or a
+ * \c MONO_TYPE_VALUETYPE . For more general functionality, use \c mono_class_from_mono_type_internal,
+ * instead.
+ * \returns the \c MonoClass pointer that describes the class that \p type represents.
+ */
+static inline MonoClass*
+mono_type_get_class_internal (MonoType *type)
+{
+       /* FIXME: review the runtime users before adding the assert here */
+       return type->data.klass;
+}
+
+/**
+ * mono_type_get_array_type_internal:
+ * \param type the \c MonoType operated on
+ * It is only valid to call this function if \p type is a \c MONO_TYPE_ARRAY .
+ * \returns a \c MonoArrayType struct describing the array type that \p type
+ * represents. The info includes details such as rank, array element type
+ * and the sizes and bounds of multidimensional arrays.
+ */
+static inline MonoArrayType*
+mono_type_get_array_type_internal (MonoType *type)
+{
+       return type->data.array;
+}
+
 #endif /* __MONO_METADATA_INTERNALS_H__ */
index f064639..ecc4414 100644 (file)
@@ -7173,8 +7173,8 @@ mono_bool
 mono_type_is_byref (MonoType *type)
 {
        mono_bool result;
-       MONO_ENTER_GC_UNSAFE;
-       result = type->byref;
+       MONO_ENTER_GC_UNSAFE; // FIXME slow
+       result = mono_type_is_byref_internal (type);
        MONO_EXIT_GC_UNSAFE;
        return result;
 }
@@ -7188,7 +7188,7 @@ mono_type_is_byref (MonoType *type)
 int
 mono_type_get_type (MonoType *type)
 {
-       return type->type;
+       return mono_type_get_type_internal (type);
 }
 
 /**
@@ -7201,8 +7201,7 @@ mono_type_get_type (MonoType *type)
 MonoMethodSignature*
 mono_type_get_signature (MonoType *type)
 {
-       g_assert (type->type == MONO_TYPE_FNPTR);
-       return type->data.method;
+       return mono_type_get_signature_internal (type);
 }
 
 /**
@@ -7217,7 +7216,7 @@ MonoClass*
 mono_type_get_class (MonoType *type)
 {
        /* FIXME: review the runtime users before adding the assert here */
-       return type->data.klass;
+       return mono_type_get_class_internal (type);
 }
 
 /**
@@ -7231,7 +7230,7 @@ mono_type_get_class (MonoType *type)
 MonoArrayType*
 mono_type_get_array_type (MonoType *type)
 {
-       return type->data.array;
+       return mono_type_get_array_type_internal (type);
 }
 
 /**
index 643cf44..f6646d6 100644 (file)
@@ -337,18 +337,18 @@ typedef enum {
        MONO_PARSE_FIELD
 } MonoParseTypeMode;
 
-MONO_API mono_bool
+MONO_API MONO_RT_EXTERNAL_ONLY mono_bool
 mono_type_is_byref       (MonoType *type);
 
-MONO_API int
+MONO_API MONO_RT_EXTERNAL_ONLY int
 mono_type_get_type       (MonoType *type);
 
 /* For MONO_TYPE_FNPTR */
-MONO_API MonoMethodSignature*
+MONO_API MONO_RT_EXTERNAL_ONLY MonoMethodSignature*
 mono_type_get_signature  (MonoType *type);
 
 /* For MONO_TYPE_CLASS, VALUETYPE */
-MONO_API MonoClass*
+MONO_API MONO_RT_EXTERNAL_ONLY MonoClass*
 mono_type_get_class      (MonoType *type);
 
 MONO_API MonoArrayType*
index c000f4d..768de3d 100644 (file)
@@ -2334,8 +2334,8 @@ handle_enum:
                if (candidate->type != MONO_TYPE_FNPTR)
                        return FALSE;
 
-               left = mono_type_get_signature (target);
-               right = mono_type_get_signature (candidate);
+               left = mono_type_get_signature_internal (target);
+               right = mono_type_get_signature_internal (candidate);
                return mono_metadata_signature_equal (left, right) && left->call_convention == right->call_convention;
        }
 
@@ -2610,7 +2610,7 @@ mono_delegate_type_equal (MonoType *target, MonoType *candidate)
        case MONO_TYPE_FNPTR:
                if (candidate->type != MONO_TYPE_FNPTR)
                        return FALSE;
-               return mono_delegate_signature_equal (mono_type_get_signature (target), mono_type_get_signature (candidate), FALSE);
+               return mono_delegate_signature_equal (mono_type_get_signature_internal (target), mono_type_get_signature_internal (candidate), FALSE);
 
        case MONO_TYPE_GENERICINST: {
                MonoClass *target_klass;
index a9bd9a3..ad21fbb 100644 (file)
@@ -6778,7 +6778,7 @@ get_types (gpointer key, gpointer value, gpointer user_data)
                        t = mono_reflection_get_type_checked (ass->image, ass->image, ud->info, ud->ignore_case, TRUE, &type_resolve, probe_type_error);
                        mono_error_cleanup (probe_type_error);
                        if (t) {
-                               g_ptr_array_add (ud->res_classes, mono_type_get_class (t));
+                               g_ptr_array_add (ud->res_classes, mono_type_get_class_internal (t));
                                g_ptr_array_add (ud->res_domains, domain);
                        }
                }
index 599ade2..e97d106 100644 (file)
@@ -76,18 +76,18 @@ partial_sharing_supported (void)
 static int
 type_check_context_used (MonoType *type, gboolean recursive)
 {
-       switch (mono_type_get_type (type)) {
+       switch (mono_type_get_type_internal (type)) {
        case MONO_TYPE_VAR:
                return MONO_GENERIC_CONTEXT_USED_CLASS;
        case MONO_TYPE_MVAR:
                return MONO_GENERIC_CONTEXT_USED_METHOD;
        case MONO_TYPE_SZARRAY:
-               return mono_class_check_context_used (mono_type_get_class (type));
+               return mono_class_check_context_used (mono_type_get_class_internal (type));
        case MONO_TYPE_ARRAY:
                return mono_class_check_context_used (mono_type_get_array_type (type)->eklass);
        case MONO_TYPE_CLASS:
                if (recursive)
-                       return mono_class_check_context_used (mono_type_get_class (type));
+                       return mono_class_check_context_used (mono_type_get_class_internal (type));
                else
                        return 0;
        case MONO_TYPE_GENERICINST: