MethodUtils.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435
  1. #if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR)
  2. using System;
  3. using System.Reflection;
  4. namespace SingularityGroup.HotReload {
  5. static class MethodUtils {
  6. #if ENABLE_MONO
  7. public static unsafe void DisableVisibilityChecks(MethodBase method) {
  8. if(IntPtr.Size == sizeof(long)) {
  9. var ptr = (Interop.MonoMethod64*)method.MethodHandle.Value.ToPointer();
  10. ptr->monoMethodFlags |= Interop.MonoMethodFlags.skip_visibility;
  11. } else {
  12. var ptr = (Interop.MonoMethod32*)method.MethodHandle.Value.ToPointer();
  13. ptr->monoMethodFlags |= Interop.MonoMethodFlags.skip_visibility;
  14. }
  15. }
  16. public static unsafe bool IsMethodInlined(MethodBase method) {
  17. if(IntPtr.Size == sizeof(long)) {
  18. var ptr = (Interop.MonoMethod64*)method.MethodHandle.Value.ToPointer();
  19. return (ptr -> monoMethodFlags & Interop.MonoMethodFlags.inline_info) == Interop.MonoMethodFlags.inline_info;
  20. } else {
  21. var ptr = (Interop.MonoMethod32*)method.MethodHandle.Value.ToPointer();
  22. return (ptr -> monoMethodFlags & Interop.MonoMethodFlags.inline_info) == Interop.MonoMethodFlags.inline_info;
  23. }
  24. }
  25. #else
  26. public static void DisableVisibilityChecks(MethodBase method) { }
  27. public static bool IsMethodInlined(MethodBase method) {
  28. return false;
  29. }
  30. #endif
  31. }
  32. }
  33. #endif