Skip to content

Commit bdad4a1

Browse files
authored
[generator] Generate Threshold{Class,Type} properties for all classes (#154) (#160)
Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=56537 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.
1 parent 2d72f1e commit bdad4a1

File tree

78 files changed

+418
-111
lines changed

Some content is hidden

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

78 files changed

+418
-111
lines changed

tools/generator/ClassGen.cs

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

165-
public bool HasClassHandle {
166-
get { return ctors.Count > 0 || Fields.Count > 0 || Methods.Count > 0 || Properties.Count > 0 || IsAnnotation; }
167-
}
168-
169165
public IList<Ctor> Ctors {
170166
get { return ctors; }
171167
}
@@ -451,17 +447,16 @@ public override void Generate (StreamWriter sw, string indent, CodeGenerationOpt
451447
sw.WriteLine ();
452448
}
453449

454-
if (HasClassHandle) {
455-
bool requireNew = false;
450+
bool requireNew = InheritsObject;
451+
if (!requireNew) {
456452
for (var bg = BaseGen; bg != null && bg is XmlClassGen; bg = bg.BaseGen) {
457-
if (bg.HasClassHandle) {
453+
if (bg.InheritsObject) {
458454
requireNew = true;
459455
break;
460456
}
461457
}
462-
463-
opt.CodeGenerator.WriteClassHandle (this, sw, indent, opt, requireNew);
464458
}
459+
opt.CodeGenerator.WriteClassHandle (this, sw, indent, opt, requireNew);
465460

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

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
}

tools/generator/Tests/expected.ji/Constructors/Xamarin.Test.SomeObject.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/SomeObject", DoNotGenerateAcw=true)]
1010
public partial class SomeObject : global::Java.Lang.Object {
1111

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

tools/generator/Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.FrameworkMediaDrm.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace Com.Google.Android.Exoplayer.Drm {
99
[global::Android.Runtime.Register ("com/google/android/exoplayer/drm/FrameworkMediaDrm", DoNotGenerateAcw=true)]
1010
public sealed partial class FrameworkMediaDrm : global::Java.Lang.Object, global::Com.Google.Android.Exoplayer.Drm.IExoMediaDrm {
1111

12-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("com/google/android/exoplayer/drm/FrameworkMediaDrm", typeof (FrameworkMediaDrm));
13-
internal static IntPtr class_ref {
12+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("com/google/android/exoplayer/drm/FrameworkMediaDrm", typeof (FrameworkMediaDrm));
13+
internal static new IntPtr class_ref {
1414
get {
1515
return _members.JniPeerType.PeerReference.Handle;
1616
}

tools/generator/Tests/expected.ji/GenericArguments/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/NestedTypes/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/NestedTypes/Xamarin.Test.NotificationCompatBase.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,25 @@ static IntPtr n_Build_I (IntPtr jnienv, IntPtr native__this, int p0)
103103
}
104104

105105

106+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/NotificationCompatBase$Action", typeof (Action));
107+
internal static new IntPtr class_ref {
108+
get {
109+
return _members.JniPeerType.PeerReference.Handle;
110+
}
111+
}
112+
113+
public override global::Java.Interop.JniPeerMembers JniPeerMembers {
114+
get { return _members; }
115+
}
116+
117+
protected override IntPtr ThresholdClass {
118+
get { return _members.JniPeerType.PeerReference.Handle; }
119+
}
120+
121+
protected override global::System.Type ThresholdType {
122+
get { return _members.ManagedPeerType; }
123+
}
124+
106125
protected Action (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
107126

108127
}
@@ -129,8 +148,8 @@ public ActionInvoker (IntPtr handle, JniHandleOwnership transfer) : base (handle
129148
[global::Android.Runtime.Register ("xamarin/test/NotificationCompatBase$InstanceInner", DoNotGenerateAcw=true)]
130149
public abstract partial class InstanceInner : global::Java.Lang.Object {
131150

132-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/NotificationCompatBase$InstanceInner", typeof (InstanceInner));
133-
internal static IntPtr class_ref {
151+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/NotificationCompatBase$InstanceInner", typeof (InstanceInner));
152+
internal static new IntPtr class_ref {
134153
get {
135154
return _members.JniPeerType.PeerReference.Handle;
136155
}
@@ -190,6 +209,25 @@ public InstanceInnerInvoker (IntPtr handle, JniHandleOwnership transfer) : base
190209
}
191210

192211

212+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/NotificationCompatBase", typeof (NotificationCompatBase));
213+
internal static new IntPtr class_ref {
214+
get {
215+
return _members.JniPeerType.PeerReference.Handle;
216+
}
217+
}
218+
219+
public override global::Java.Interop.JniPeerMembers JniPeerMembers {
220+
get { return _members; }
221+
}
222+
223+
protected override IntPtr ThresholdClass {
224+
get { return _members.JniPeerType.PeerReference.Handle; }
225+
}
226+
227+
protected override global::System.Type ThresholdType {
228+
get { return _members.ManagedPeerType; }
229+
}
230+
193231
protected NotificationCompatBase (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
194232

195233
}

tools/generator/Tests/expected.ji/NonStaticFields/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/NonStaticFields/Xamarin.Test.SomeObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ public int Value {
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/NormalMethods/Java.Lang.Class.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,25 @@ namespace Java.Lang {
1010
[global::Java.Interop.JavaTypeParameters (new string [] {"T"})]
1111
public partial class Class : global::Java.Lang.Object {
1212

13+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("java/lang/Class", typeof (Class));
14+
internal static new IntPtr class_ref {
15+
get {
16+
return _members.JniPeerType.PeerReference.Handle;
17+
}
18+
}
19+
20+
public override global::Java.Interop.JniPeerMembers JniPeerMembers {
21+
get { return _members; }
22+
}
23+
24+
protected override IntPtr ThresholdClass {
25+
get { return _members.JniPeerType.PeerReference.Handle; }
26+
}
27+
28+
protected override global::System.Type ThresholdType {
29+
get { return _members.ManagedPeerType; }
30+
}
31+
1332
protected Class (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
1433

1534
}

tools/generator/Tests/expected.ji/NormalMethods/Java.Lang.Integer.cs

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

12+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("java/lang/Integer", typeof (Integer));
13+
internal static new IntPtr class_ref {
14+
get {
15+
return _members.JniPeerType.PeerReference.Handle;
16+
}
17+
}
18+
19+
public override global::Java.Interop.JniPeerMembers JniPeerMembers {
20+
get { return _members; }
21+
}
22+
23+
protected override IntPtr ThresholdClass {
24+
get { return _members.JniPeerType.PeerReference.Handle; }
25+
}
26+
27+
protected override global::System.Type ThresholdType {
28+
get { return _members.ManagedPeerType; }
29+
}
30+
1231
protected Integer (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer) {}
1332

1433
}

tools/generator/Tests/expected.ji/NormalMethods/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/NormalMethods/Java.Lang.Throwable.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/Throwable", DoNotGenerateAcw=true)]
1010
public partial class Throwable {
1111

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

tools/generator/Tests/expected.ji/NormalMethods/Xamarin.Test.A.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ public partial class A : global::Java.Lang.Object {
1414
[global::Java.Interop.JavaTypeParameters (new string [] {"T extends xamarin.test.A.B"})]
1515
public partial class B : global::Java.Lang.Object {
1616

17-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/A$B", typeof (B));
18-
internal static IntPtr class_ref {
17+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/A$B", typeof (B));
18+
internal static new IntPtr class_ref {
1919
get {
2020
return _members.JniPeerType.PeerReference.Handle;
2121
}
@@ -67,8 +67,8 @@ static IntPtr n_SetCustomDimension_I (IntPtr jnienv, IntPtr native__this, int in
6767

6868
}
6969

70-
internal static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/A", typeof (A));
71-
internal static IntPtr class_ref {
70+
internal new static readonly JniPeerMembers _members = new JniPeerMembers ("xamarin/test/A", typeof (A));
71+
internal static new IntPtr class_ref {
7272
get {
7373
return _members.JniPeerType.PeerReference.Handle;
7474
}

tools/generator/Tests/expected.ji/NormalMethods/Xamarin.Test.C.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.C"})]
1111
public partial class C : global::Java.Lang.Object {
1212

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

tools/generator/Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.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/SomeObject", DoNotGenerateAcw=true)]
1010
public partial class SomeObject : global::Java.Lang.Object {
1111

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

0 commit comments

Comments
 (0)