BsMonoField.cpp 3.0 KB

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