Skip to content

Commit a1d3ecc

Browse files
jonpryoratsushieno
authored andcommitted
[jcw-gen] Fix InvalidCastException from Cecil upgrade (#79)
Commit dfed286 updated Cecil to Cecil 0.10.0-beta1-v2, which has multiple API incompatibilities with Cecil 0.9.6. Unfortunately, some of these incompatibilities were hidden by use of the `.Cast<T>()` extension method, which was used because older versions of Cecil didn't use generics at all, so the `.Cast<T>()` was present to provide types. Types which became wrong with Cecil 0.10.0. The result is that when [building xamarin-android with a newer Java.Interop][0], [things broke][1]: jcw-gen: System.InvalidCastException: Unable to cast object of type 'Mono.Cecil.InterfaceImplementation' to type 'Mono.Cecil.TypeReference'. at (wrapper castclass) System.Object:__castclass_with_cache (object,intptr,intptr) at System.Linq.Enumerable+<CastIterator>c__Iterator17`1[TResult].MoveNext () [0x00059] in /private/tmp/source-mono-4.4.0-c7sr1/bockbuild-mono-4.4.0-branch-c7sr1/profiles/mono-mac-xamarin/build-root/mono-x86/external/referencesource/System.Core/System/Linq/Enumerable.cs:916 at System.Linq.Enumerable+WhereSelectEnumerableIterator`2[TSource,TResult].MoveNext () [0x00078] in /private/tmp/source-mono-4.4.0-c7sr1/bockbuild-mono-4.4.0-branch-c7sr1/profiles/mono-mac-xamarin/build-root/mono-x86/external/referencesource/System.Core/System/Linq/Enumerable.cs:282 at System.Linq.Enumerable+WhereEnumerableIterator`1[TSource].MoveNext () [0x00062] in /private/tmp/source-mono-4.4.0-c7sr1/bockbuild-mono-4.4.0-branch-c7sr1/profiles/mono-mac-xamarin/build-root/mono-x86/external/referencesource/System.Core/System/Linq/Enumerable.cs:147 at System.Linq.Enumerable+<SelectManyIterator>c__Iterator2`2[TSource,TResult].MoveNext () [0x0009a] in /private/tmp/source-mono-4.4.0-c7sr1/bockbuild-mono-4.4.0-branch-c7sr1/profiles/mono-mac-xamarin/build-root/mono-x86/external/referencesource/System.Core/System/Linq/Enumerable.cs:424 at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor (Mono.Cecil.TypeDefinition type, System.String outerType, System.Action`2 log) [0x00332] in /Users/builder/jenkins/workspace/xamarin-android-pr-builder/xamarin-android/external/Java.Interop/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs:144 at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor (Mono.Cecil.TypeDefinition type, System.Action`2 log) [0x00000] in /Users/builder/jenkins/workspace/xamarin-android-pr-builder/xamarin-android/external/Java.Interop/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs:60 at Java.Interop.Tools.App.GenerateJavaCallableWrapper (Mono.Cecil.TypeDefinition type, System.String outputPath) [0x0001f] in /Users/builder/jenkins/workspace/xamarin-android-pr-builder/xamarin-android/external/Java.Interop/tools/jcw-gen/App.cs:78 at Java.Interop.Tools.App.Main (System.String[] args) [0x00265] in /Users/builder/jenkins/workspace/xamarin-android-pr-builder/xamarin-android/external/Java.Interop/tools/jcw-gen/App.cs:66 Remove use of `.Cast<T>()`: it's superfluous now that Cecil uses generics (and has for ages...), and it's use introduces bugs. [0]: https://jenkins.mono-project.com/view/Xamarin.Android/job/xamarin-android-pr-builder/164/ [1]: https://jenkins.mono-project.com/view/Xamarin.Android/job/xamarin-android-pr-builder/162/consoleText
1 parent dfed286 commit a1d3ecc

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ void AddNestedTypes (TypeDefinition type)
130130
}
131131
}
132132

133-
foreach (MethodDefinition imethod in type.Interfaces.Cast<TypeReference> ()
133+
foreach (MethodDefinition imethod in type.Interfaces.Select (ifaceInfo => ifaceInfo.InterfaceType)
134134
.Select (r => {
135135
var d = r.Resolve ();
136136
if (d == null)
@@ -141,7 +141,7 @@ void AddNestedTypes (TypeDefinition type)
141141
return d;
142142
})
143143
.Where (d => GetRegisterAttributes (d).Any ())
144-
.SelectMany (d => d.Methods.Cast<MethodDefinition>())) {
144+
.SelectMany (d => d.Methods)) {
145145
AddMethod (imethod, imethod);
146146
}
147147

@@ -538,7 +538,7 @@ void GenerateHeader (TextWriter sw)
538538
sw.WriteLine ("\textends " + extendsType);
539539
sw.WriteLine ("\timplements");
540540
sw.Write ("\t\tmono.android.IGCUserPeer");
541-
IEnumerable<TypeDefinition> ifaces = type.Interfaces.Cast<TypeReference>()
541+
IEnumerable<TypeDefinition> ifaces = type.Interfaces.Select (ifaceInfo => ifaceInfo.InterfaceType)
542542
.Select (r => r.Resolve ())
543543
.Where (d => GetRegisterAttributes (d).Any ());
544544
if (ifaces.Any ()) {

src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JniType.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -612,14 +612,14 @@ internal static bool IsNonStaticInnerClass (TypeDefinition type)
612612
return false;
613613

614614
return GetBaseConstructors (type)
615-
.Any (ctor => ctor.Parameters.Cast<ParameterDefinition> ().Any (p => p.Name == "__self"));
615+
.Any (ctor => ctor.Parameters.Any (p => p.Name == "__self"));
616616
}
617617

618618
static IEnumerable<MethodDefinition> GetBaseConstructors (TypeDefinition type)
619619
{
620620
var baseType = type.GetBaseTypes ().FirstOrDefault (t => t.GetCustomAttributes (typeof (RegisterAttribute)).Any ());
621621
if (baseType != null)
622-
return baseType.Methods.Where (m => m.IsConstructor && !m.IsStatic).Cast<MethodDefinition> ();
622+
return baseType.Methods.Where (m => m.IsConstructor && !m.IsStatic);
623623
return Enumerable.Empty<MethodDefinition> ();
624624
}
625625
#endif // HAVE_CECIL

0 commit comments

Comments
 (0)