diff options
author | jfrijters <jfrijters> | 2014-11-11 18:37:09 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2014-11-11 18:37:09 +0300 |
commit | 938815d13e29867709af72e0e6b59d0c29c642cc (patch) | |
tree | 15728169ab1084751752bb44b8cca14f8edac62d | |
parent | c6069dafbd77094c0663c3a46371c92313351216 (diff) |
Bug fix. Conflicting default interface methods should throw IncompatibleClassChangeError instead of AbstractMethodError.
-rw-r--r-- | runtime/DynamicTypeWrapper.cs | 7 | ||||
-rw-r--r-- | runtime/MemberWrapper.cs | 5 |
2 files changed, 10 insertions, 2 deletions
diff --git a/runtime/DynamicTypeWrapper.cs b/runtime/DynamicTypeWrapper.cs index feba4995..cb6704d4 100644 --- a/runtime/DynamicTypeWrapper.cs +++ b/runtime/DynamicTypeWrapper.cs @@ -2927,9 +2927,9 @@ namespace IKVM.Internal { string message = mmw.Error ?? (wrapper.Name + "." + methods[index].Name + methods[index].Signature); CodeEmitter ilgen = CodeEmitter.Create(mb); - ilgen.EmitThrow("java.lang.AbstractMethodError", message); + ilgen.EmitThrow(mmw.IsConflictError ? "java.lang.IncompatibleClassChangeError" : "java.lang.AbstractMethodError", message); ilgen.DoEmit(); - wrapper.EmitLevel4Warning(HardError.AbstractMethodError, message); + wrapper.EmitLevel4Warning(mmw.IsConflictError ? HardError.IncompatibleClassChangeError : HardError.AbstractMethodError, message); } #if STATIC_COMPILER if (wrapper.IsInterface && !mmw.IsAbstract) @@ -7162,6 +7162,9 @@ namespace IKVM.Internal case HardError.AbstractMethodError: GetClassLoader().IssueMessage(Message.EmittedAbstractMethodError, this.Name, message); break; + case HardError.IncompatibleClassChangeError: + GetClassLoader().IssueMessage(Message.EmittedIncompatibleClassChangeError, this.Name, message); + break; default: throw new InvalidOperationException(); } diff --git a/runtime/MemberWrapper.cs b/runtime/MemberWrapper.cs index d20bb84e..420a2dcc 100644 --- a/runtime/MemberWrapper.cs +++ b/runtime/MemberWrapper.cs @@ -1084,6 +1084,11 @@ namespace IKVM.Internal .AddConflictError(mw); } + internal bool IsConflictError + { + get { return Error != null && Error.StartsWith("Conflicting default methods:"); } + } + internal MethodWrapper BaseMethod { get { return ifmethod; } |