56 readonly
object wrapperLock =
new object();
57 internal readonly Dictionary<Type, RuntimeJavaType> globalTypeToTypeWrapper =
new Dictionary<Type, RuntimeJavaType>();
58 internal readonly Dictionary<Type, string> remappedTypes =
new Dictionary<Type, string>();
59 readonly List<RuntimeGenericClassLoader> genericClassLoaders =
new List<RuntimeGenericClassLoader>();
61#if IMPORTER || EXPORTER
64 internal RuntimeAssemblyClassLoader bootstrapClassLoader;
72 this.context = context;
86#if IMPORTER || EXPORTER
92 Debug.Assert(this.bootstrapClassLoader ==
null);
94 this.bootstrapClassLoader = bootstrapClassLoader;
99 internal void LoadRemappedTypes()
102 var baseAssembly = context.Resolver.ResolveBaseAssembly().AsReflection();
103 if (baseAssembly !=
null && remappedTypes.Count == 0)
105 var remapped = context.AttributeHelper.GetRemappedClasses(baseAssembly);
106 if (remapped.Length > 0)
108 foreach (var r
in remapped)
109 remappedTypes.Add(r.RemappedType, r.Name);
116 throw new InternalException(
"Failed to find core classes in core library.");
122 internal bool IsRemappedType(
Type type)
124 return remappedTypes.ContainsKey(type);
127#if IMPORTER || EXPORTER
128 internal RuntimeClassLoader GetBootstrapClassLoader()
130 internal RuntimeAssemblyClassLoader GetBootstrapClassLoader()
134 return bootstrapClassLoader ??=
new BootstrapClassLoader(context);
137#if !IMPORTER && !EXPORTER
139 internal RuntimeClassLoader GetClassLoaderWrapper(
java.
lang.ClassLoader javaClassLoader)
141 if (javaClassLoader ==
null)
142 return GetBootstrapClassLoader();
147 RuntimeClassLoader wrapper =
null;
149 RuntimeClassLoader wrapper = javaClassLoader.wrapper;
158 if (!AppDomain.CurrentDomain.IsFullyTrusted)
161 wrapper =
new RuntimeClassLoader(context, opt, javaClassLoader);
174 internal RuntimeJavaType GetJavaTypeFromType(
Type type)
177 if (type.__ContainsMissingType)
179 return new RuntimeUnloadableJavaType(context, type);
184 RuntimeJavaType.AssertFinished(type);
186 Debug.Assert(!type.IsPointer);
187 Debug.Assert(!type.IsByRef);
189 RuntimeJavaType wrapper;
190 lock (globalTypeToTypeWrapper)
191 globalTypeToTypeWrapper.TryGetValue(type, out wrapper);
197 if (type.__IsMissing || type.__ContainsMissingType)
199 wrapper =
new RuntimeUnloadableJavaType(context, type);
200 globalTypeToTypeWrapper.Add(type, wrapper);
205 if (remappedTypes.TryGetValue(type, out var remapped))
207 wrapper = LoadClassCritical(remapped);
209 else if (ReflectUtil.IsVector(type))
213 Type elem = type.GetElementType();
214 while (ReflectUtil.IsVector(elem))
217 elem = elem.GetElementType();
220 wrapper = GetJavaTypeFromType(elem).MakeArrayType(rank);
224 var
asm = type.Assembly;
226#if !IMPORTER && !EXPORTER
227 if (RuntimeAnonymousJavaType.IsAnonymous(context, type))
229 var typeToTypeWrapper = globalTypeToTypeWrapper;
230 var tw =
new RuntimeAnonymousJavaType(context, type);
231 lock (typeToTypeWrapper)
232 if (!typeToTypeWrapper.TryGetValue(type, out wrapper))
233 typeToTypeWrapper.Add(type, wrapper = tw);
238 if (ReflectUtil.IsReflectionOnly(type))
247 wrapper = context.AssemblyClassLoaderFactory.FromAssembly(
asm).GetJavaTypeFromAssemblyType(type);
250 lock (globalTypeToTypeWrapper)
258 globalTypeToTypeWrapper[type] = wrapper;
265 internal RuntimeClassLoader GetGenericClassLoader(RuntimeJavaType wrapper)
267 Type type = wrapper.TypeAsTBD;
268 Debug.Assert(type.IsGenericType);
269 Debug.Assert(!type.ContainsGenericParameters);
271 List<RuntimeClassLoader> list =
new List<RuntimeClassLoader>();
272 list.Add(context.AssemblyClassLoaderFactory.FromAssembly(type.Assembly));
273 foreach (
Type arg
in type.GetGenericArguments())
275 RuntimeClassLoader loader = GetJavaTypeFromType(arg).ClassLoader;
276 if (!list.Contains(loader) && loader != bootstrapClassLoader)
281 RuntimeClassLoader[] key = list.ToArray();
282 RuntimeClassLoader matchingLoader = GetGenericClassLoaderByKey(key);
283 matchingLoader.RegisterInitiatingLoader(wrapper);
284 return matchingLoader;
287 internal RuntimeJavaType LoadClassCritical(
string name)
290 var wrapper = GetBootstrapClassLoader().TryLoadClassByName(name);
298 return GetBootstrapClassLoader().LoadClassByName(name);
302 throw new InternalException(
"Loading of critical class failed.", e);
307 RuntimeClassLoader GetGenericClassLoaderByKey(RuntimeClassLoader[] key)
311 foreach (RuntimeGenericClassLoader loader
in genericClassLoaders)
312 if (loader.Matches(key))
315#if IMPORTER || EXPORTER || FIRST_PASS
316 var newLoader =
new RuntimeGenericClassLoader(context, key,
null);
318 var javaClassLoader =
new ikvm.runtime.GenericClassLoader();
319 var newLoader =
new RuntimeGenericClassLoader(context, key, javaClassLoader);
322 genericClassLoaders.Add(newLoader);
327#if !IMPORTER && !EXPORTER
332 throw new NotImplementedException();
334 javaClassLoader.wrapper = wrapper;
340#if !IMPORTER && !EXPORTER
344 Debug.Assert(name.StartsWith(
"[[") && name.EndsWith(
"]]"));
346 var stack =
new Stack<List<RuntimeClassLoader>>();
347 List<RuntimeClassLoader> list =
null;
349 for (
int i = 0; i < name.Length; i++)
353 if (name[i + 1] ==
'[')
356 list =
new List<RuntimeClassLoader>();
357 if (name[i + 2] ==
'[')
365 i = name.IndexOf(
']', i);
366 list.Add(context.ClassLoaderFactory.GetAssemblyClassLoaderByName(name.Substring(start, i - start)));
369 else if (name[i] ==
']')
371 var loader = GetGenericClassLoaderByKey(list.ToArray());
380 throw new InvalidOperationException();
384 throw new InvalidOperationException();
387 internal RuntimeClassLoader GetAssemblyClassLoaderByName(
string name)
389 if (name.StartsWith(
"[["))
390 return GetGenericClassLoaderByName(name);
393 return context.AssemblyClassLoaderFactory.FromAssembly(
Assembly.Load(name));
395 return context.AssemblyClassLoaderFactory.FromAssembly(AssemblyLoadContext.GetLoadContext(typeof(RuntimeClassLoader).
Assembly).LoadFromAssemblyName(
new AssemblyName(name)));
401 internal int GetGenericClassLoaderId(RuntimeClassLoader wrapper)
404 return genericClassLoaders.IndexOf(wrapper as RuntimeGenericClassLoader);
407 internal RuntimeClassLoader GetGenericClassLoaderById(
int id)
410 return genericClassLoaders[id];
413 internal void SetWrapperForType(
Type type, RuntimeJavaType wrapper)
416 RuntimeJavaType.AssertFinished(type);
419 lock (globalTypeToTypeWrapper)
427 globalTypeToTypeWrapper.Add(type, wrapper);