Skip to content

Commit db817d3

Browse files
committed
Generate Threshold{Class,Type} properties for all classes
If a class derives from `Java.Lang.Object` it should have the two properties mentioned above generated, so that it is possible to find methods in the correct instance of Java class instance that is wrapped by our managed class. Generator used to decide whether or not to generate these properties based on the presence of class members (fields, constructors, methods and properties) or whether the class is an annotation in the API description file. However there exist a number of classes (for instance `Inet4Address`) which don't have any of the members present and yet they should have the Threshold* properties generated for the reasons described above. The `HasClassHandle` property which was used to determine whether the class should get these properties (among a handful of other members) doesn't serve its purpose correctly leading to corner cases when the `Threshold*` properties are missing and causing runtime bugs (e.g. calling `GetAddress()` on an instance of `Inet4Address` returns `null` even though the underlying Java class has the information - the call never reaches `Inet4Address` instance and thus returns nothing). Replacing `HasClassHandle` with a simple check for whether the class in question derives from `Java.Lang.Object` is the correct fix that ensures the missing properties are generated. Fixe https://bugzilla.xamarin.com/show_bug.cgi?id=56537
1 parent 343fcb5 commit db817d3

File tree

80 files changed

+422
-115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+422
-115
lines changed

tools/generator/ClassGen.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,6 @@ public override string NativeType {
160160
get { return "IntPtr"; }
161161
}
162162

163-
public bool HasClassHandle {
164-
get { return ctors.Count > 0 || Fields.Count > 0 || Methods.Count > 0 || Properties.Count > 0 || IsAnnotation; }
165-
}
166-
167163
public IList<Ctor> Ctors {
168164
get { return ctors; }
169165
}
@@ -450,17 +446,16 @@ public override void Generate (StreamWriter sw, string indent, CodeGenerationOpt
450446
sw.WriteLine ();
451447
}
452448

453-
if (HasClassHandle) {
454-
bool requireNew = false;
449+
bool requireNew = InheritsObject;
450+
if (!requireNew) {
455451
for (var bg = BaseGen; bg != null && bg is XmlClassGen; bg = bg.BaseGen) {
456-
if (bg.HasClassHandle) {
452+
if (bg.InheritsObject) {
457453
requireNew = true;
458454
break;
459455
}
460456
}
461-
462-
opt.CodeGenerator.WriteClassHandle (this, sw, indent, opt, requireNew);
463457
}
458+
opt.CodeGenerator.WriteClassHandle (this, sw, indent, opt, requireNew);
464459

465460
GenConstructors (sw, indent + "\t", opt);
466461

tools/generator/Tests/expected.ji/Adapters/Java.Lang.Object.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,12 @@ namespace Java.Lang {
99
[global::Android.Runtime.Register ("java/lang/Object", DoNotGenerateAcw=true)]
1010
public partial class Object {
1111

12+
internal static readonly JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (Object));
13+
internal static IntPtr class_ref {
14+
get {
15+
return _members.JniPeerType.PeerReference.Handle;
16+
}
17+
}
18+
1219
}
1320
}

tools/generator/Tests/expected.ji/Adapters/Xamarin.Test.AdapterView.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ namespace Xamarin.Test {
1010
[global::Java.Interop.JavaTypeParameters (new string [] {"T extends xamarin.test.Adapter"})]
1111
public abstract partial class AdapterView : global::Java.Lang.Object {
1212

13-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/AdapterView", typeof (AdapterView));
14-
internal static IntPtr class_ref {
13+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/AdapterView", typeof (AdapterView));
14+
internal static new IntPtr class_ref {
1515
get {
1616
return _members.JniPeerType.PeerReference.Handle;
1717
}

tools/generator/Tests/expected.ji/Adapters/Xamarin.Test.GenericReturnObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace Xamarin.Test {
99
[global::Android.Runtime.Register ("xamarin/test/GenericReturnObject", DoNotGenerateAcw=true)]
1010
public partial class GenericReturnObject : global::Java.Lang.Object {
1111

12-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/GenericReturnObject", typeof (GenericReturnObject));
13-
internal static IntPtr class_ref {
12+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/GenericReturnObject", typeof (GenericReturnObject));
13+
internal static new IntPtr class_ref {
1414
get {
1515
return _members.JniPeerType.PeerReference.Handle;
1616
}

tools/generator/Tests/expected.ji/Android.Graphics.Color/Java.Lang.Object.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,12 @@ namespace Java.Lang {
99
[global::Android.Runtime.Register ("java/lang/Object", DoNotGenerateAcw=true)]
1010
public partial class Object {
1111

12+
internal static readonly JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (Object));
13+
internal static IntPtr class_ref {
14+
get {
15+
return _members.JniPeerType.PeerReference.Handle;
16+
}
17+
}
18+
1219
}
1320
}

tools/generator/Tests/expected.ji/Android.Graphics.Color/Xamarin.Test.SomeObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ public abstract partial class SomeObject : global::Java.Lang.Object {
2929
}
3030
}
3131
}
32-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/SomeObject", typeof (SomeObject));
33-
internal static IntPtr class_ref {
32+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/SomeObject", typeof (SomeObject));
33+
internal static new IntPtr class_ref {
3434
get {
3535
return _members.JniPeerType.PeerReference.Handle;
3636
}

tools/generator/Tests/expected.ji/Arrays/Java.Lang.Object.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,12 @@ namespace Java.Lang {
99
[global::Android.Runtime.Register ("java/lang/Object", DoNotGenerateAcw=true)]
1010
public partial class Object {
1111

12+
internal static readonly JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (Object));
13+
internal static IntPtr class_ref {
14+
get {
15+
return _members.JniPeerType.PeerReference.Handle;
16+
}
17+
}
18+
1219
}
1320
}

tools/generator/Tests/expected.ji/Arrays/Xamarin.Test.SomeObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ public IList<long> Mylongs {
163163
}
164164
}
165165
}
166-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/SomeObject", typeof (SomeObject));
167-
internal static IntPtr class_ref {
166+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/SomeObject", typeof (SomeObject));
167+
internal static new IntPtr class_ref {
168168
get {
169169
return _members.JniPeerType.PeerReference.Handle;
170170
}

tools/generator/Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace Xamarin.Test {
99
[global::Android.Runtime.Register ("xamarin/test/CSharpKeywords", DoNotGenerateAcw=true)]
1010
public partial class CSharpKeywords : global::Java.Lang.Object {
1111

12-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/CSharpKeywords", typeof (CSharpKeywords));
13-
internal static IntPtr class_ref {
12+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/CSharpKeywords", typeof (CSharpKeywords));
13+
internal static new IntPtr class_ref {
1414
get {
1515
return _members.JniPeerType.PeerReference.Handle;
1616
}

tools/generator/Tests/expected.ji/Constructors/Java.Lang.Object.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,12 @@ namespace Java.Lang {
99
[global::Android.Runtime.Register ("java/lang/Object", DoNotGenerateAcw=true)]
1010
public partial class Object {
1111

12+
internal static readonly JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (Object));
13+
internal static IntPtr class_ref {
14+
get {
15+
return _members.JniPeerType.PeerReference.Handle;
16+
}
17+
}
18+
1219
}
1320
}

0 commit comments

Comments
 (0)