1 #ifndef __MONO_METADATA_REFLECTION_CACHE_H__
2 #define __MONO_METADATA_REFLECTION_CACHE_H__
5 #include <mono/metadata/domain-internals.h>
6 #include <mono/metadata/mono-hash.h>
7 #include <mono/metadata/mempool.h>
10 * We need to return always the same object for MethodInfo, FieldInfo etc..
11 * but we need to consider the reflected type.
12 * type uses a different hash, since it uses custom hash/equal functions.
21 reflected_equal (gconstpointer a
, gconstpointer b
);
24 reflected_hash (gconstpointer a
);
27 /* ReflectedEntry doesn't need to be GC tracked */
28 #define ALLOC_REFENTRY g_new0 (ReflectedEntry, 1)
29 #define FREE_REFENTRY(entry) g_free ((entry))
30 #define REFENTRY_REQUIRES_CLEANUP
32 #define ALLOC_REFENTRY (ReflectedEntry *)mono_mempool_alloc (domain->mp, sizeof (ReflectedEntry))
34 #define FREE_REFENTRY(entry)
38 #define CACHE_OBJECT(t,p,o,k) \
44 mono_domain_lock (domain); \
45 if (!domain->refobject_hash) \
46 domain->refobject_hash = mono_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table"); \
47 _obj = (t)mono_g_hash_table_lookup (domain->refobject_hash, &pe); \
49 ReflectedEntry *e = ALLOC_REFENTRY; \
52 mono_g_hash_table_insert (domain->refobject_hash, e,o); \
55 mono_domain_unlock (domain); \
59 #define CHECK_OBJECT(t,p,k) \
65 mono_domain_lock (domain); \
66 if (!domain->refobject_hash) \
67 domain->refobject_hash = mono_g_hash_table_new_type (reflected_hash, reflected_equal, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, "domain reflection objects table"); \
68 if ((_obj = (t)mono_g_hash_table_lookup (domain->refobject_hash, &e))) { \
69 mono_domain_unlock (domain); \
72 mono_domain_unlock (domain); \
76 #endif /*__MONO_METADATA_REFLECTION_CACHE_H__*/