BsMonoMethod.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "BsMonoMethod.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoUtil.h"
  4. namespace BansheeEngine
  5. {
  6. MonoMethod::MonoMethod(::MonoMethod* method)
  7. :mMethod(method), mReturnType(nullptr)
  8. {
  9. mThunk = mono_method_get_unmanaged_thunk(mMethod);
  10. }
  11. MonoObject* MonoMethod::invoke(MonoObject* instance, void** params)
  12. {
  13. MonoObject* exception = nullptr;
  14. MonoObject* retVal = mono_runtime_invoke(mMethod, instance, params, &exception);
  15. MonoUtil::throwIfException(exception);
  16. return retVal;
  17. }
  18. MonoObject* MonoMethod::invokeVirtual(MonoObject* instance, void** params)
  19. {
  20. ::MonoMethod* virtualMethod = mono_object_get_virtual_method(instance, mMethod);
  21. MonoObject* exception = nullptr;
  22. MonoObject* retVal = mono_runtime_invoke(virtualMethod, instance, params, &exception);
  23. MonoUtil::throwIfException(exception);
  24. return retVal;
  25. }
  26. void* MonoMethod::getThunk() const
  27. {
  28. return mThunk;
  29. }
  30. String MonoMethod::getName() const
  31. {
  32. return String(mono_method_get_name(mMethod));
  33. }
  34. MonoClass* MonoMethod::getReturnType()
  35. {
  36. if(mReturnType != nullptr)
  37. return mReturnType;
  38. MonoType* returnType = mono_signature_get_return_type(mono_method_signature(mMethod));
  39. if(returnType == nullptr)
  40. return nullptr;
  41. ::MonoClass* returnClass = mono_class_from_mono_type(returnType);
  42. if(returnClass == nullptr)
  43. return nullptr;
  44. mReturnType = MonoManager::instance().findClass(returnClass);
  45. return mReturnType;
  46. }
  47. }