BsMonoField.cpp 2.8 KB

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