const Vector<GDMonoField *> &GDMonoClass::get_all_fields() { if (fields_fetched) return fields_list; void *iter = NULL; MonoClassField *raw_field = NULL; while ((raw_field = mono_class_get_fields(mono_class, &iter)) != NULL) { StringName name = mono_field_get_name(raw_field); Map<StringName, GDMonoField *>::Element *match = fields.find(name); if (match) { fields_list.push_back(match->get()); } else { GDMonoField *field = memnew(GDMonoField(raw_field, this)); fields.insert(name, field); fields_list.push_back(field); } } fields_fetched = true; return fields_list; }
MonoClassField *CScriptClass::GetMonoField(const char *name) { MonoClass *pClass = (MonoClass *)m_pObject; MonoClassField *pCurField = nullptr; void *pIterator = 0; while (pClass != nullptr) { pCurField = mono_class_get_fields(pClass, &pIterator); if(pCurField == nullptr) { pClass = mono_class_get_parent(pClass); if(pClass == mono_get_object_class()) break; pIterator = 0; continue; } if(!strcmp(mono_field_get_name(pCurField), name)) return pCurField; } return nullptr; }
GDMonoField::GDMonoField(MonoClassField *p_raw_field, GDMonoClass *p_owner) { owner = p_owner; mono_field = p_raw_field; name = mono_field_get_name(mono_field); MonoType *field_type = mono_field_get_type(mono_field); type.type_encoding = mono_type_get_type(field_type); MonoClass *field_type_class = mono_class_from_mono_type(field_type); type.type_class = GDMono::get_singleton()->get_class(field_type_class); attrs_fetched = false; attributes = NULL; }
void CPipeServer::EnumFieldsInClass() { void *c=(void *)ReadQword(); void *iter=NULL; void *field; do { field=mono_class_get_fields(c, &iter); WriteQword((UINT_PTR)field); if (field) { char *name; void *fieldtype=mono_field_get_type(field); WriteQword((UINT_PTR)fieldtype); WriteDword(mono_type_get_type(fieldtype)); WriteQword((UINT_PTR)mono_field_get_parent(field)); WriteDword((UINT_PTR)mono_field_get_offset(field)); WriteDword(mono_field_get_flags(field)); name=mono_field_get_name(field); WriteWord(strlen(name)); Write(name, strlen(name)); name=mono_type_get_name(fieldtype); if (name) { WriteWord(strlen(name)); Write(name, strlen(name)); g_free(name); } else WriteWord(0); } } while (field); }
MonoField::MonoField(MonoClassField* field) :mField(field), mFieldType(nullptr) { mName = mono_field_get_name(mField); }
const char* mioField::getName() const { if (!mfield) { return nullptr; } return mono_field_get_name(mfield); }