const Vector<GDMonoProperty *> &GDMonoClass::get_all_properties() { if (properties_fetched) return properties_list; void *iter = NULL; MonoProperty *raw_property = NULL; while ((raw_property = mono_class_get_properties(mono_class, &iter)) != NULL) { StringName name = mono_property_get_name(raw_property); Map<StringName, GDMonoProperty *>::Element *match = properties.find(name); if (match) { properties_list.push_back(match->get()); } else { GDMonoProperty *property = memnew(GDMonoProperty(raw_property, this)); properties.insert(name, property); properties_list.push_back(property); } } properties_fetched = true; return properties_list; }
void mioClass::eachProperties(const std::function<void(mioProperty&)> &f) { MonoProperty *prop; gpointer iter = nullptr; while ((prop = mono_class_get_properties(mclass, &iter))) { mioProperty mp = prop; f(mp); } }
static void handle_type (MonoClass *klass, guint32 flags) { int i; guint32 missing; MonoCustomAttrInfo* cattrs; gpointer val = NULL, oldkey = NULL; MonoProperty* prop; MonoEvent* event; MonoMethod* method; MonoClassField* field; gpointer iter; if (g_hash_table_lookup_extended (type_table, klass, &oldkey, &val)) { missing = flags & ~(GPOINTER_TO_UINT (val)); } else { missing = flags; } if (!missing) return; g_hash_table_insert (type_table, klass, GUINT_TO_POINTER (missing)); if (verbose) g_print ("#processing klass: %s.%s\n", klass->name_space, klass->name); mono_class_init (klass); if (klass->parent) add_type (klass->parent); if (klass->nested_in) add_type (klass->nested_in); iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { if ((missing & TYPE_METHODS) || strcmp (method->name, ".cctor") == 0) add_types_from_method (method); } if (klass->enumtype) { add_field (mono_class_get_field_from_name (klass, "value__")); } if (force_enums || (missing & TYPE_FIELDS)) { iter = NULL; while ((field = mono_class_get_fields (klass, &iter))) add_field (field); } iter = NULL; while ((prop = mono_class_get_properties (klass, &iter))) { cattrs = mono_custom_attrs_from_property (klass, prop); handle_cattrs (cattrs); } iter = NULL; while ((event = mono_class_get_events (klass, &iter))) { cattrs = mono_custom_attrs_from_event (klass, event); handle_cattrs (cattrs); } for (i = 0; i < klass->interface_count; ++i) add_type (klass->interfaces [i]); cattrs = mono_custom_attrs_from_class (klass); handle_cattrs (cattrs); }
void mioClass::eachPropertiesUpwards(const std::function<void(mioProperty&, mioClass&)> &f) { mioClass c = mclass; do { MonoProperty *prop; gpointer iter = nullptr; while (prop = mono_class_get_properties(c, &iter)) { mioProperty m = prop; f(m, c); } c = c.getParent(); } while (c); }
MonoProperty *CScriptClass::GetMonoProperty(const char *name, bool requireSetter, bool requireGetter) { MonoClass *pClass = (MonoClass *)m_pObject; MonoProperty *pCurProperty = nullptr; void *pIterator = 0; while (pClass != nullptr) { pCurProperty = mono_class_get_properties(pClass, &pIterator); if(pCurProperty == nullptr) { pClass = mono_class_get_parent(pClass); if(pClass == mono_get_object_class()) break; pIterator = 0; continue; } if(!strcmp(mono_property_get_name(pCurProperty), name)) { if(requireSetter && mono_property_get_set_method(pCurProperty) == nullptr) continue; if(requireGetter && mono_property_get_get_method(pCurProperty) == nullptr) continue; return pCurProperty; } } return nullptr; }