BsMonoField.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "BsMonoField.h"
  2. #include "BsMonoClass.h"
  3. #include "BsMonoManager.h"
  4. #include <mono/metadata/attrdefs.h>
  5. namespace BansheeEngine
  6. {
  7. MonoField::MonoField(MonoClassField* field)
  8. :mField(field), mFieldType(nullptr)
  9. {
  10. mName = mono_field_get_name(mField);
  11. }
  12. MonoClass* MonoField::getType()
  13. {
  14. if(mFieldType != nullptr)
  15. return mFieldType;
  16. MonoType* monoType = mono_field_get_type(mField);
  17. ::MonoClass* fieldClass = mono_class_from_mono_type(monoType);
  18. if(fieldClass == nullptr)
  19. return nullptr;
  20. mFieldType = MonoManager::instance().findClass(fieldClass);
  21. return mFieldType;
  22. }
  23. void MonoField::getValue(MonoObject* instance, void* outValue)
  24. {
  25. mono_field_get_value(instance, mField, outValue);
  26. }
  27. MonoObject* MonoField::getValueBoxed(MonoObject* instance)
  28. {
  29. return mono_field_get_value_object(MonoManager::instance().getDomain(), mField, instance);
  30. }
  31. void MonoField::setValue(MonoObject* instance, void* value)
  32. {
  33. mono_field_set_value(instance, mField, value);
  34. }
  35. bool MonoField::hasAttribute(MonoClass* monoClass)
  36. {
  37. // TODO - Consider caching custom attributes or just initializing them all at load
  38. ::MonoClass* parentClass = mono_field_get_parent(mField);
  39. MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, mField);
  40. if(attrInfo == nullptr)
  41. return false;
  42. bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->_getInternalClass()) != 0;
  43. mono_custom_attrs_free(attrInfo);
  44. return hasAttr;
  45. }
  46. MonoObject* MonoField::getAttribute(MonoClass* monoClass)
  47. {
  48. // TODO - Consider caching custom attributes or just initializing them all at load
  49. ::MonoClass* parentClass = mono_field_get_parent(mField);
  50. MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, mField);
  51. if(attrInfo == nullptr)
  52. return nullptr;
  53. MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->_getInternalClass());
  54. mono_custom_attrs_free(attrInfo);
  55. return foundAttr;
  56. }
  57. MonoFieldVisibility MonoField::getVisibility()
  58. {
  59. uint32_t flags = mono_field_get_flags(mField);
  60. if(flags == MONO_FIELD_ATTR_PRIVATE)
  61. return MonoFieldVisibility::Private;
  62. else if(flags == MONO_FIELD_ATTR_FAM_AND_ASSEM)
  63. return MonoFieldVisibility::ProtectedInternal;
  64. else if(flags == MONO_FIELD_ATTR_ASSEMBLY)
  65. return MonoFieldVisibility::Internal;
  66. else if(flags == MONO_FIELD_ATTR_FAMILY)
  67. return MonoFieldVisibility::Protected;
  68. else if(flags == MONO_FIELD_ATTR_PUBLIC)
  69. return MonoFieldVisibility::Public;
  70. assert(false);
  71. return MonoFieldVisibility::Private;
  72. }
  73. bool MonoField::isStatic()
  74. {
  75. uint32_t flags = mono_field_get_flags(mField);
  76. return (flags & MONO_FIELD_ATTR_STATIC) != 0;
  77. }
  78. }