This commit is contained in:
jfrijters 2003-05-10 11:43:12 +00:00
Родитель 4912bd1f33
Коммит a02d6c1f8d
6 изменённых файлов: 37 добавлений и 14 удалений

Просмотреть файл

@ -49,6 +49,7 @@ class ClassLoaderWrapper
// HACK moduleBuilder is static, because multiple dynamic assemblies is broken (TypeResolve doesn't fire)
// so for the time being, we share one dynamic assembly among all classloaders
private static ModuleBuilder moduleBuilder;
private static bool saveDebugImage;
// HACK this is used by the ahead-of-time compiler to overrule the bootstrap classloader
internal static void SetBootstrapClassLoader(ClassLoaderWrapper bootstrapClassLoader)
@ -478,6 +479,12 @@ class ClassLoaderWrapper
return (this == GetBootstrapClassLoader()) ? null : javaClassLoader;
}
internal static void PrepareForSaveDebugImage()
{
Debug.Assert(moduleBuilder == null);
saveDebugImage = true;
}
internal static void SaveDebugImage(object mainClass)
{
// HACK we iterate 3 times, in the hopes that that will be enough. We really should let FinishAll return a boolean whether
@ -567,7 +574,7 @@ class ClassLoaderWrapper
{
AssemblyName name = new AssemblyName();
name.Name = "ikvm_dynamic_assembly__" + (this == GetBootstrapClassLoader() ? "bootstrap" : javaClassLoader);
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave);
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(name, saveDebugImage ? AssemblyBuilderAccess.RunAndSave : AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name.Name, JVM.Debug);
if(JVM.Debug)
{

Просмотреть файл

@ -4121,6 +4121,7 @@ sealed class FieldWrapper
private IntPtr cookie;
internal CodeEmitter EmitGet;
internal CodeEmitter EmitSet;
private FieldInfo field;
internal FieldWrapper(TypeWrapper declaringType, string name, string sig, Modifiers modifiers)
{
@ -4385,9 +4386,8 @@ sealed class FieldWrapper
return field;
}
internal void SetValue(object obj, object val)
private void LookupField()
{
// TODO this is a broken implementation (for one thing, it needs to support redirection)
BindingFlags bindings = BindingFlags.Public | BindingFlags.NonPublic;
if(IsStatic)
{
@ -4397,21 +4397,26 @@ sealed class FieldWrapper
{
bindings |= BindingFlags.Instance;
}
DeclaringType.Type.GetField(name, bindings).SetValue(obj, val);
field = DeclaringType.Type.GetField(name, bindings);
}
internal void SetValue(object obj, object val)
{
// TODO this is a broken implementation (for one thing, it needs to support redirection)
if(field == null)
{
LookupField();
}
field.SetValue(obj, val);
}
internal object GetValue(object obj)
{
// TODO this is a broken implementation (for one thing, it needs to support redirection)
BindingFlags bindings = BindingFlags.Public | BindingFlags.NonPublic;
if(IsStatic)
if(field == null)
{
bindings |= BindingFlags.Static;
LookupField();
}
else
{
bindings |= BindingFlags.Instance;
}
return DeclaringType.Type.GetField(name, bindings).GetValue(obj);
return field.GetValue(obj);
}
}

Просмотреть файл

@ -456,6 +456,11 @@ namespace NativeCode.java
public static string nativeGetLibname(string pathname, string libname)
{
if(Environment.OSVersion.ToString().IndexOf("Unix") >= 0)
{
return "lib" + libname + ".so";
}
// HACK this seems like a lame way of doing things, but in order to get Eclipse to work,
// we have append .dll to the libname here
if(!libname.ToUpper().EndsWith(".DLL"))

Просмотреть файл

@ -293,6 +293,11 @@ public class JVM
loader.AddResources(resources);
loader.Save();
}
public static void PrepareForSaveDebugImage()
{
ClassLoaderWrapper.PrepareForSaveDebugImage();
}
public static void SaveDebugImage(object mainClass)
{

Просмотреть файл

@ -1,8 +1,8 @@
<?xml version="1.0"?>
<project name="ikvm" default="all">
<target name="all">
<nant buildfile="ik.vm.net/ik.vm.net.build" />
<nant buildfile="ik.vm.jni/ik.vm.jni.build" />
<nant buildfile="IK.VM.NET/ik.vm.net.build" />
<nant buildfile="IK.VM.JNI/ik.vm.jni.build" />
<nant buildfile="netexp/netexp.build" />
<nant buildfile="ikvmc/ikvmc.build" />
<nant buildfile="classpath/classpath.build" />

Просмотреть файл

@ -153,6 +153,7 @@ public class Starter
else if(args[i] == "-Xsave")
{
saveAssembly = true;
JVM.PrepareForSaveDebugImage();
}
else if(args[i] == "-Xtime")
{