BsMonoField.cpp 3.1 KB

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