BsMonoProperty.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsMonoProperty.h"
  4. #include "BsMonoMethod.h"
  5. #include "BsMonoManager.h"
  6. #include <mono/jit/jit.h>
  7. namespace BansheeEngine
  8. {
  9. MonoProperty::MonoProperty(::MonoProperty* monoProp)
  10. :mProperty(monoProp), mGetReturnType(nullptr), mIsIndexed(false), mIsFullyInitialized(false)
  11. {
  12. mGetMethod = mono_property_get_get_method(mProperty);
  13. mSetMethod = mono_property_get_set_method(mProperty);
  14. }
  15. MonoObject* MonoProperty::get(MonoObject* instance) const
  16. {
  17. if (mGetMethod == nullptr)
  18. return nullptr;
  19. return mono_runtime_invoke(mGetMethod, instance, nullptr, nullptr);
  20. }
  21. void MonoProperty::set(MonoObject* instance, void* value) const
  22. {
  23. if (mSetMethod == nullptr)
  24. return;
  25. void* args[1];
  26. args[0] = value;
  27. mono_runtime_invoke(mSetMethod, instance, args, nullptr);
  28. }
  29. MonoObject* MonoProperty::getIndexed(MonoObject* instance, UINT32 index) const
  30. {
  31. void* args[1];
  32. args[0] = &index;
  33. return mono_runtime_invoke(mGetMethod, instance, args, nullptr);
  34. }
  35. void MonoProperty::setIndexed(MonoObject* instance, UINT32 index, void* value) const
  36. {
  37. void* args[2];
  38. args[0] = &index;
  39. args[1] = value;
  40. mono_runtime_invoke(mSetMethod, instance, args, nullptr);
  41. }
  42. bool MonoProperty::isIndexed() const
  43. {
  44. if (!mIsFullyInitialized)
  45. initializeDeferred();
  46. return mIsIndexed;
  47. }
  48. MonoClass* MonoProperty::getReturnType() const
  49. {
  50. if (!mIsFullyInitialized)
  51. initializeDeferred();
  52. return mGetReturnType;
  53. }
  54. void MonoProperty::initializeDeferred() const
  55. {
  56. if (mGetMethod != nullptr)
  57. {
  58. MonoMethodSignature* signature = mono_method_signature(mGetMethod);
  59. MonoType* returnType = mono_signature_get_return_type(signature);
  60. if (returnType != nullptr)
  61. {
  62. ::MonoClass* returnClass = mono_class_from_mono_type(returnType);
  63. if (returnClass != nullptr)
  64. mGetReturnType = MonoManager::instance().findClass(returnClass);
  65. }
  66. UINT32 numParams = mono_signature_get_param_count(signature);
  67. mIsIndexed = numParams == 1;
  68. }
  69. else if(mSetMethod != nullptr)
  70. {
  71. MonoMethodSignature* signature = mono_method_signature(mSetMethod);
  72. UINT32 numParams = mono_signature_get_param_count(signature);
  73. mIsIndexed = numParams == 2;
  74. }
  75. mIsFullyInitialized = true;
  76. }
  77. }