[reflection] Divide reflection.c into multiple files. NFC
[mono-project.git] / mono / metadata / reflection-cache.h
blob86ba603fd2a598a7b3be7ac3071803f2be427ea4
1 #ifndef __MONO_METADATA_REFLECTION_CACHE_H__
2 #define __MONO_METADATA_REFLECTION_CACHE_H__
4 #include <glib.h>
5 #include <mono/metadata/domain-internals.h>
6 #include <mono/metadata/mono-hash.h>
7 #include <mono/metadata/mempool.h>
9 /*
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.
15 typedef struct {
16 gpointer item;
17 MonoClass *refclass;
18 } ReflectedEntry;
20 gboolean
21 reflected_equal (gconstpointer a, gconstpointer b);
23 guint
24 reflected_hash (gconstpointer a);
26 #ifdef HAVE_BOEHM_GC
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
31 #else
32 #define ALLOC_REFENTRY (ReflectedEntry *)mono_mempool_alloc (domain->mp, sizeof (ReflectedEntry))
33 /* FIXME: */
34 #define FREE_REFENTRY(entry)
35 #endif
38 #define CACHE_OBJECT(t,p,o,k) \
39 do { \
40 t _obj; \
41 ReflectedEntry pe; \
42 pe.item = (p); \
43 pe.refclass = (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); \
48 if (!_obj) { \
49 ReflectedEntry *e = ALLOC_REFENTRY; \
50 e->item = (p); \
51 e->refclass = (k); \
52 mono_g_hash_table_insert (domain->refobject_hash, e,o); \
53 _obj = o; \
54 } \
55 mono_domain_unlock (domain); \
56 return _obj; \
57 } while (0)
59 #define CHECK_OBJECT(t,p,k) \
60 do { \
61 t _obj; \
62 ReflectedEntry e; \
63 e.item = (p); \
64 e.refclass = (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); \
70 return _obj; \
71 } \
72 mono_domain_unlock (domain); \
73 } while (0)
76 #endif /*__MONO_METADATA_REFLECTION_CACHE_H__*/