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) // 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 // so for the time being, we share one dynamic assembly among all classloaders
private static ModuleBuilder moduleBuilder; private static ModuleBuilder moduleBuilder;
private static bool saveDebugImage;
// HACK this is used by the ahead-of-time compiler to overrule the bootstrap classloader // HACK this is used by the ahead-of-time compiler to overrule the bootstrap classloader
internal static void SetBootstrapClassLoader(ClassLoaderWrapper bootstrapClassLoader) internal static void SetBootstrapClassLoader(ClassLoaderWrapper bootstrapClassLoader)
@ -478,6 +479,12 @@ class ClassLoaderWrapper
return (this == GetBootstrapClassLoader()) ? null : javaClassLoader; return (this == GetBootstrapClassLoader()) ? null : javaClassLoader;
} }
internal static void PrepareForSaveDebugImage()
{
Debug.Assert(moduleBuilder == null);
saveDebugImage = true;
}
internal static void SaveDebugImage(object mainClass) 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 // 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(); AssemblyName name = new AssemblyName();
name.Name = "ikvm_dynamic_assembly__" + (this == GetBootstrapClassLoader() ? "bootstrap" : javaClassLoader); 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); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name.Name, JVM.Debug);
if(JVM.Debug) if(JVM.Debug)
{ {

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

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

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

@ -456,6 +456,11 @@ namespace NativeCode.java
public static string nativeGetLibname(string pathname, string libname) 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, // 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 // we have append .dll to the libname here
if(!libname.ToUpper().EndsWith(".DLL")) if(!libname.ToUpper().EndsWith(".DLL"))

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

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

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

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

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

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