const Vector<GDMonoClass *> &GDMonoClass::get_all_delegates() { if (delegates_fetched) return delegates_list; void *iter = NULL; MonoClass *raw_class = NULL; while ((raw_class = mono_class_get_nested_types(mono_class, &iter)) != NULL) { if (mono_class_is_delegate(raw_class)) { StringName name = mono_class_get_name(raw_class); Map<StringName, GDMonoClass *>::Element *match = delegates.find(name); if (match) { delegates_list.push_back(match->get()); } else { GDMonoClass *delegate = memnew(GDMonoClass(mono_class_get_namespace(raw_class), mono_class_get_name(raw_class), raw_class, assembly)); delegates.insert(name, delegate); delegates_list.push_back(delegate); } } } delegates_fetched = true; return delegates_list; }
GDMonoClass *GDMonoAssembly::get_class(MonoClass *p_mono_class) { ERR_FAIL_COND_V(!loaded, NULL); Map<MonoClass *, GDMonoClass *>::Element *match = cached_raw.find(p_mono_class); if (match) return match->value(); StringName namespace_name = mono_class_get_namespace(p_mono_class); StringName class_name = mono_class_get_name(p_mono_class); GDMonoClass *wrapped_class = memnew(GDMonoClass(namespace_name, class_name, p_mono_class, this)); cached_classes[ClassKey(namespace_name, class_name)] = wrapped_class; cached_raw[p_mono_class] = wrapped_class; return wrapped_class; }
GDMonoClass *GDMonoAssembly::get_class(const StringName &p_namespace, const StringName &p_name) { ERR_FAIL_COND_V(!loaded, NULL); ClassKey key(p_namespace, p_name); GDMonoClass **match = cached_classes.getptr(key); if (match) return *match; MonoClass *mono_class = mono_class_from_name(image, String(p_namespace).utf8(), String(p_name).utf8()); if (!mono_class) return NULL; GDMonoClass *wrapped_class = memnew(GDMonoClass(p_namespace, p_name, mono_class, this)); cached_classes[key] = wrapped_class; cached_raw[mono_class] = wrapped_class; return wrapped_class; }