- Changed ikvmc to fail with a Link Error when it detects a loader constraints violation (instead of emitting code that throws a LinkageError at runtime).

This commit is contained in:
jfrijters 2007-02-01 07:13:02 +00:00
Родитель 9be5755a09
Коммит 0b9b0ee2d3
3 изменённых файлов: 41 добавлений и 0 удалений

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

@ -2672,5 +2672,31 @@ namespace IKVM.Internal
Console.Error.Write("{0} IKVMC{1:D4}: ", msgId < Message.StartWarnings ? "Note" : "Warning", (int)msgId);
Console.Error.WriteLine(msg, values);
}
internal static void LinkageError(string msg, TypeWrapper actualType, TypeWrapper expectedType, params object[] values)
{
object[] args = new object[values.Length + 2];
values.CopyTo(args, 2);
args[0] = AssemblyQualifiedName(actualType);
args[1] = AssemblyQualifiedName(expectedType);
Console.Error.WriteLine("Link Error: " + msg, args);
Environment.Exit(1);
}
private static string AssemblyQualifiedName(TypeWrapper tw)
{
ClassLoaderWrapper loader = tw.GetClassLoader();
AssemblyClassLoader acl = loader as AssemblyClassLoader;
if(acl != null)
{
return tw.Name + ", " + acl.Assembly.FullName;
}
CompilerClassLoader ccl = loader as CompilerClassLoader;
if(ccl != null)
{
return tw.Name + ", " + ccl.GetTypeWrapperFactory().ModuleBuilder.Assembly.FullName;
}
return tw.Name + " (unknown assembly)";
}
}
}

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

@ -4172,6 +4172,9 @@ namespace IKVM.Internal
}
else
{
#if STATIC_COMPILER
StaticCompiler.LinkageError("Method \"{2}.{3}{4}\" has a return type \"{0}\" and tries to override method \"{5}.{3}{4}\" that has a return type \"{1}\"", mw.ReturnType, baseMethod.ReturnType, mw.DeclaringType.Name, mw.Name, mw.Signature, baseMethod.DeclaringType.Name);
#endif
throw new LinkageError("Loader constraints violated");
}
}
@ -4190,6 +4193,9 @@ namespace IKVM.Internal
}
else
{
#if STATIC_COMPILER
StaticCompiler.LinkageError("Method \"{2}.{3}{4}\" has an argument type \"{0}\" and tries to override method \"{5}.{3}{4}\" that has an argument type \"{1}\"", here[i], there[i], mw.DeclaringType.Name, mw.Name, mw.Signature, baseMethod.DeclaringType.Name);
#endif
throw new LinkageError("Loader constraints violated");
}
}

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

@ -3243,6 +3243,9 @@ class MethodAnalyzer
}
if(cpi.GetFieldType() != field.FieldTypeWrapper && !field.FieldTypeWrapper.IsUnloadable)
{
#if STATIC_COMPILER
StaticCompiler.LinkageError("Field \"{2}.{3}\" is of type \"{0}\" instead of type \"{1}\" as expected by \"{4}\"", field.FieldTypeWrapper, cpi.GetFieldType(), cpi.GetClassType().Name, cpi.Name, wrapper.Name);
#endif
instr.SetHardError(HardError.LinkageError, AllocErrorMessage("Loader constraints violated: " + field.DeclaringType.Name + "." + field.Name));
return;
}
@ -3305,6 +3308,9 @@ class MethodAnalyzer
{
if(cpi.GetRetType() != mw.ReturnType && !mw.ReturnType.IsUnloadable)
{
#if STATIC_COMPILER
StaticCompiler.LinkageError("Method \"{2}.{3}{4}\" has a return type \"{0}\" instead of type \"{1}\" as expected by \"{5}\"", mw.ReturnType, cpi.GetRetType(), cpi.GetClassType().Name, cpi.Name, cpi.Signature, classFile.Name);
#endif
return "Loader constraints violated (return type): " + mw.DeclaringType.Name + "." + mw.Name + mw.Signature;
}
TypeWrapper[] here = cpi.GetArgTypes();
@ -3313,6 +3319,9 @@ class MethodAnalyzer
{
if(here[i] != there[i] && !there[i].IsUnloadable)
{
#if STATIC_COMPILER
StaticCompiler.LinkageError("Method \"{2}.{3}{4}\" has a argument type \"{0}\" instead of type \"{1}\" as expected by \"{5}\"", there[i], here[i], cpi.GetClassType().Name, cpi.Name, cpi.Signature, classFile.Name);
#endif
return "Loader constraints violated (arg " + i + "): " + mw.DeclaringType.Name + "." + mw.Name + mw.Signature;
}
}