using System;
using System.Reflection;

namespace SingularityGroup.HotReload {
    static class MethodUtils {
#if ENABLE_MONO
        public static unsafe void DisableVisibilityChecks(MethodBase method) {
            if(IntPtr.Size == sizeof(long)) {
                var ptr = (Interop.MonoMethod64*)method.MethodHandle.Value.ToPointer();
                ptr->monoMethodFlags |= Interop.MonoMethodFlags.skip_visibility;
            } else {
                var ptr = (Interop.MonoMethod32*)method.MethodHandle.Value.ToPointer();
                ptr->monoMethodFlags |= Interop.MonoMethodFlags.skip_visibility;
            }
        }

        public static unsafe bool IsMethodInlined(MethodBase method) {
            if(IntPtr.Size == sizeof(long)) {
                var ptr = (Interop.MonoMethod64*)method.MethodHandle.Value.ToPointer();
                return (ptr -> monoMethodFlags & Interop.MonoMethodFlags.inline_info) == Interop.MonoMethodFlags.inline_info;
            } else {
                var ptr = (Interop.MonoMethod32*)method.MethodHandle.Value.ToPointer();
                return (ptr -> monoMethodFlags & Interop.MonoMethodFlags.inline_info) == Interop.MonoMethodFlags.inline_info;
            }
        }
#else
        public static void DisableVisibilityChecks(MethodBase method) { }
        public static bool IsMethodInlined(MethodBase method) {
             return false; 
        }
#endif
    }
}
