diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic.csproj b/src/Java.Interop.Dynamic/Java.Interop.Dynamic.csproj index df7c6b40d..ec234cb81 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic.csproj +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic.csproj @@ -2,7 +2,9 @@ netstandard2.0 + 8.0 {AD4468F8-8883-434B-9D4C-E1801BB3B52A} + enable true true ..\..\product.snk diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaClass.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaClass.cs index cd20c7c03..26bc7c27a 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaClass.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaClass.cs @@ -42,7 +42,7 @@ protected virtual void Dispose (bool disposing) return; info.Dispose (); - info = null; + info = null!; disposed = true; } diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaInstance.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaInstance.cs index 96b1eff5f..d79be95cb 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaInstance.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/DynamicJavaInstance.cs @@ -23,7 +23,8 @@ public DynamicJavaInstance (IJavaPeerable value) Value = value; - var type = JniEnvironment.Types.GetJniTypeNameFromInstance (value.PeerReference); + var type = JniEnvironment.Types.GetJniTypeNameFromInstance (value.PeerReference) ?? + throw new InvalidOperationException ($"Could not get JniType from value `{value}`."); klass = JavaClassInfo.GetClassInfo (type); } @@ -53,8 +54,8 @@ protected virtual void Dispose (bool disposing) } disposed = true; - Value = null; - klass = null; + Value = null!; + klass = null!; } DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject (Expression parameter) diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs index e5b669e7e..666c2265d 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs @@ -68,7 +68,7 @@ static JavaClassInfo () public static JavaClassInfo GetClassInfo (string jniClassName) { lock (Classes) { - JavaClassInfo info = _GetClassInfo (jniClassName); + JavaClassInfo? info = _GetClassInfo (jniClassName); if (info != null) { Interlocked.Increment (ref info.RefCount); return info; @@ -80,7 +80,7 @@ public static JavaClassInfo GetClassInfo (string jniClassName) } } - static JavaClassInfo _GetClassInfo (string jniClassName) + static JavaClassInfo? _GetClassInfo (string jniClassName) { lock (Classes) { WeakReference value; @@ -114,19 +114,19 @@ public static int GetClassInfoCount (string jniClassName) int RefCount = 1; - List constructors; - Dictionary> fields; - Dictionary> methods; + List? constructors; + Dictionary>? fields; + Dictionary>? methods; - public List Constructors { + public List? Constructors { get {return LookupConstructors ();} } - public Dictionary> Fields { + public Dictionary>? Fields { get {return LookupFields ();} } - public Dictionary> Methods { + public Dictionary>? Methods { get {return LookupMethods ();} } @@ -152,7 +152,7 @@ public void Dispose () foreach (var name in methods.Keys.ToList ()) { foreach (var info in methods [name]) info.Dispose (); - methods [name] = null; + methods.Remove (name); } } @@ -171,7 +171,7 @@ internal static JniObjectReference GetConstructorParameters (JniObjectReference return JniEnvironment.InstanceMethods.CallObjectMethod (method, Constructor_getParameterTypes); } - List LookupConstructors () + List? LookupConstructors () { if (Members == null) return null; @@ -199,7 +199,7 @@ List LookupConstructors () } } - Dictionary> LookupFields () + Dictionary>? LookupFields () { if (Members == null) return null; @@ -216,17 +216,18 @@ Dictionary> LookupFields () for (int i = 0; i < len; ++i) { var field = JniEnvironment.Arrays.GetObjectArrayElement (fields, i); var n_name = JniEnvironment.InstanceMethods.CallObjectMethod (field, Field_getName); - var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.CopyAndDispose); var isStatic = IsStatic (field); + var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.CopyAndDispose) ?? + throw new InvalidOperationException ($"Could not determine field name at index {i}!"); - List overloads; - if (!Fields.TryGetValue (name, out overloads)) - Fields.Add (name, overloads = new List ()); + List? overloads = null; + if (!Fields?.TryGetValue (name, out overloads) ?? false) + Fields!.Add (name, overloads = new List ()); var n_type = JniEnvironment.InstanceMethods.CallObjectMethod (field, Field_getType); using (var type = new JniType (ref n_type, JniObjectReferenceOptions.CopyAndDispose)) { var sig = JniTypeSignature.Parse (type.Name); - overloads.Add (new JavaFieldInfo (Members, name + "." + sig.QualifiedReference, isStatic)); + overloads?.Add (new JavaFieldInfo (Members, name + "." + sig.QualifiedReference, isStatic)); } JniObjectReference.Dispose (ref field); @@ -239,7 +240,7 @@ Dictionary> LookupFields () } } - Dictionary> LookupMethods () + Dictionary>? LookupMethods () { if (Members == null) return null; @@ -256,19 +257,20 @@ Dictionary> LookupMethods () for (int i = 0; i < len; ++i) { var method = JniEnvironment.Arrays.GetObjectArrayElement (methods, i); var n_name = JniEnvironment.InstanceMethods.CallObjectMethod (method, Method_getName); - var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.CopyAndDispose); var isStatic = IsStatic (method); + var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.CopyAndDispose) ?? + throw new InvalidOperationException ($"Could not determine method name at index {i}!"); - List overloads; - if (!Methods.TryGetValue (name, out overloads)) - Methods.Add (name, overloads = new List ()); + List? overloads = null; + if (!Methods?.TryGetValue (name, out overloads) ?? false) + Methods!.Add (name, overloads = new List ()); var nrt = JniEnvironment.InstanceMethods.CallObjectMethod (method, Method_getReturnType); var rt = new JniType (ref nrt, JniObjectReferenceOptions.CopyAndDispose); var m = new JavaMethodInfo (Members, method, name, isStatic) { ReturnType = rt, }; - overloads.Add (m); + overloads?.Add (m); JniObjectReference.Dispose (ref method); } } finally { @@ -286,11 +288,11 @@ static bool IsStatic (JniObjectReference member) return (s & JavaModifiers.Static) == JavaModifiers.Static; } - internal unsafe bool TryInvokeMember (IJavaPeerable self, JavaMethodBase[] overloads, DynamicMetaObject[] args, out object value) + internal unsafe bool TryInvokeMember (IJavaPeerable self, JavaMethodBase[] overloads, DynamicMetaObject[] args, out object? value) { value = null; - var vms = (List) null; - var states = (JniValueMarshalerState[]) null; + var vms = (List?) null; + var states = (JniValueMarshalerState[]?) null; var jtypes = GetJniTypes (args); try { @@ -313,18 +315,20 @@ internal unsafe bool TryInvokeMember (IJavaPeerable self, JavaMethodBase[] overl } finally { for (int i = 0; vms != null && i < vms.Count; ++i) { + if (states == null) { + continue; + } vms [i].DestroyArgumentState (args [i].Value, ref states [i]); } for (int i = 0; i < jtypes.Count; ++i) { - if (jtypes [i] != null) - jtypes [i].Dispose (); + jtypes [i]?.Dispose (); } } } - static List GetJniTypes (DynamicMetaObject[] args) + static List GetJniTypes (DynamicMetaObject[] args) { - var r = new List (args.Length); + var r = new List (args.Length); var vm = JniEnvironment.Runtime; foreach (var a in args) { try { diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs index 658311d23..07424fff9 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs @@ -36,13 +36,17 @@ protected override string JniReturnType { get {return "V";} } - public override unsafe object Invoke (IJavaPeerable self, JniArgumentValue* arguments) + public override unsafe object? Invoke (IJavaPeerable? self, JniArgumentValue* arguments) { + var signature = JniSignature ?? throw new InvalidOperationException ("No JniSignature!"); if (self == null) { - var h = members.InstanceMethods.StartCreateInstance (JniSignature, typeof (JavaInstanceProxy), arguments); + var h = members.InstanceMethods.StartCreateInstance (signature, typeof (JavaInstanceProxy), arguments); self = JniEnvironment.Runtime.ValueManager.GetValue (ref h, JniObjectReferenceOptions.CopyAndDispose); + if (self == null) { + throw new InvalidOperationException ($"Could not create instance of {members.ManagedPeerType}!"); + } } - members.InstanceMethods.FinishCreateInstance (JniSignature, self, arguments); + members.InstanceMethods.FinishCreateInstance (signature, self, arguments); return new DynamicJavaInstance (self); } } diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaFieldInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaFieldInfo.cs index ff81d0080..33e7a5c0e 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaFieldInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaFieldInfo.cs @@ -38,7 +38,7 @@ public override string Name { } } - public object GetValue (IJavaPeerable self) + public object? GetValue (IJavaPeerable self) { AssertSelf (self); @@ -59,7 +59,7 @@ void AssertSelf (IJavaPeerable self) "self"); } - object GetStaticValue () + object? GetStaticValue () { var n = GetSignatureStartIndex (); switch (JniSignature [n + 1]) { @@ -80,7 +80,7 @@ object GetStaticValue () } } - object GetInstanceValue (IJavaPeerable self) + object? GetInstanceValue (IJavaPeerable self) { var n = GetSignatureStartIndex (); switch (JniSignature [n + 1]) { @@ -110,7 +110,7 @@ int GetSignatureStartIndex () return n; } - public void SetValue (IJavaPeerable self, object value) + public void SetValue (IJavaPeerable self, object? value) { AssertSelf (self); @@ -121,18 +121,18 @@ public void SetValue (IJavaPeerable self, object value) } } - void SetStaticValue (object value) + void SetStaticValue (object? value) { var n = GetSignatureStartIndex (); switch (JniSignature [n + 1]) { - case 'Z': members.StaticFields.SetValue (JniSignature, (bool) value); break; - case 'B': members.StaticFields.SetValue (JniSignature, (byte) value); break; - case 'C': members.StaticFields.SetValue (JniSignature, (char) value); break; - case 'S': members.StaticFields.SetValue (JniSignature, (short) value); break; - case 'I': members.StaticFields.SetValue (JniSignature, (int) value); break; - case 'J': members.StaticFields.SetValue (JniSignature, (long) value); break; - case 'F': members.StaticFields.SetValue (JniSignature, (float) value); break; - case 'D': members.StaticFields.SetValue (JniSignature, (double) value); break; + case 'Z': members.StaticFields.SetValue (JniSignature, (bool) value!); break; + case 'B': members.StaticFields.SetValue (JniSignature, (byte) value!); break; + case 'C': members.StaticFields.SetValue (JniSignature, (char) value!); break; + case 'S': members.StaticFields.SetValue (JniSignature, (short) value!); break; + case 'I': members.StaticFields.SetValue (JniSignature, (int) value!); break; + case 'J': members.StaticFields.SetValue (JniSignature, (long) value!); break; + case 'F': members.StaticFields.SetValue (JniSignature, (float) value!); break; + case 'D': members.StaticFields.SetValue (JniSignature, (double) value!); break; case 'L': case '[': if (value == null) { @@ -152,18 +152,18 @@ void SetStaticValue (object value) } } - void SetInstanceValue (IJavaPeerable self, object value) + void SetInstanceValue (IJavaPeerable self, object? value) { var n = GetSignatureStartIndex (); switch (JniSignature [n + 1]) { - case 'Z': members.InstanceFields.SetValue (JniSignature, self, (bool) value); break; - case 'B': members.InstanceFields.SetValue (JniSignature, self, (byte) value); break; - case 'C': members.InstanceFields.SetValue (JniSignature, self, (char) value); break; - case 'S': members.InstanceFields.SetValue (JniSignature, self, (short) value); break; - case 'I': members.InstanceFields.SetValue (JniSignature, self, (int) value); break; - case 'J': members.InstanceFields.SetValue (JniSignature, self, (long) value); break; - case 'F': members.InstanceFields.SetValue (JniSignature, self, (float) value); break; - case 'D': members.InstanceFields.SetValue (JniSignature, self, (double) value); break; + case 'Z': members.InstanceFields.SetValue (JniSignature, self, (bool) value!); break; + case 'B': members.InstanceFields.SetValue (JniSignature, self, (byte) value!); break; + case 'C': members.InstanceFields.SetValue (JniSignature, self, (char) value!); break; + case 'S': members.InstanceFields.SetValue (JniSignature, self, (short) value!); break; + case 'I': members.InstanceFields.SetValue (JniSignature, self, (int) value!); break; + case 'J': members.InstanceFields.SetValue (JniSignature, self, (long) value!); break; + case 'F': members.InstanceFields.SetValue (JniSignature, self, (float) value!); break; + case 'D': members.InstanceFields.SetValue (JniSignature, self, (double) value!); break; case 'L': case '[': if (value == null) { diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs index 51e56adcd..c3508e16d 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs @@ -20,9 +20,12 @@ protected virtual void Dispose (bool disposing) { } - protected static object ToReturnValue (ref JniObjectReference handle, string signature, int n) + protected static object? ToReturnValue (ref JniObjectReference handle, string signature, int n) { var instance = JniEnvironment.Runtime.ValueManager.GetValue (ref handle, JniObjectReferenceOptions.CopyAndDispose); + if (instance == null) { + return null; + } switch (signature [n]) { case 'L': return new DynamicJavaInstance (instance); diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodBase.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodBase.cs index d738864f4..c556d8a2b 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodBase.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodBase.cs @@ -17,20 +17,20 @@ abstract class JavaMethodBase : JavaMemberInfo { public abstract bool IsConstructor {get;} - public abstract unsafe object Invoke (IJavaPeerable self, JniArgumentValue* arguments); + public abstract unsafe object? Invoke (IJavaPeerable? self, JniArgumentValue* arguments); protected abstract string JniReturnType {get;} public JniObjectReference PeerReference {get; private set;} - public string JniSignature {get; private set;} + public string? JniSignature {get; private set;} protected JniPeerMembers members; - List arguments; + List? arguments; public List ArgumentTypes { get { LookupArguments (); - return arguments; + return arguments!; } } @@ -53,7 +53,7 @@ protected override void Dispose (bool disposing) JniObjectReference.Dispose (ref pr); PeerReference = pr; - members = null; + members = null!; if (arguments == null) return; @@ -90,7 +90,9 @@ public void LookupArguments () for (int i = 0; i < len; ++i) { var p = JniEnvironment.Arrays.GetObjectArrayElement (parameters, i); try { - var sig = JniTypeSignature.Parse (JniEnvironment.Types.GetJniTypeNameFromClass (p)); + var typeName = JniEnvironment.Types.GetJniTypeNameFromClass (p) ?? + throw new NotSupportedException ($"Could not determine class for {p}."); + var sig = JniTypeSignature.Parse (typeName); sb.Append (sig.QualifiedReference); arguments.Add (p.NewGlobalRef ()); } finally { @@ -104,22 +106,22 @@ public void LookupArguments () JniSignature = sb.ToString (); } - public bool CompatibleWith (List args, DynamicMetaObject[] dargs) + public bool CompatibleWith (List argumentTypes, DynamicMetaObject[] argumentValues) { LookupArguments (); - if (args.Count != arguments.Count) + if (argumentTypes.Count != arguments?.Count) return false; var vm = JniEnvironment.Runtime; for (int i = 0; i < arguments.Count; ++i) { - if (args [i] == null) { + if (argumentTypes [i] == null) { // Builtin type -- JNIEnv.FindClass("I") throws! - if (JniEnvironment.Types.GetJniTypeNameFromClass (arguments [i]) != vm.TypeManager.GetTypeSignature (dargs [i].LimitType).Name) + if (JniEnvironment.Types.GetJniTypeNameFromClass (arguments [i]) != vm.TypeManager.GetTypeSignature (argumentValues [i].LimitType).Name) return false; } - else if (!JniEnvironment.Types.IsAssignableFrom (arguments [i], args [i].PeerReference)) + else if (!JniEnvironment.Types.IsAssignableFrom (arguments [i], argumentTypes [i]?.PeerReference ?? default)) return false; } return true; diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodInfo.cs index eb9e19d1b..abb2d9cac 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMethodInfo.cs @@ -15,7 +15,7 @@ namespace Java.Interop.Dynamic { class JavaMethodInfo : JavaMethodBase { - public JniType ReturnType; + public JniType? ReturnType; string name; bool isStatic; @@ -56,16 +56,16 @@ protected override string JniReturnType { } } - public override unsafe object Invoke (IJavaPeerable self, JniArgumentValue* arguments) + public override unsafe object? Invoke (IJavaPeerable? self, JniArgumentValue* arguments) { AssertSelf (self); if (IsStatic) return InvokeStaticMethod (arguments); - return InvokeInstanceMethod (self, arguments); + return InvokeInstanceMethod (self!, arguments); } - void AssertSelf (IJavaPeerable self) + void AssertSelf (IJavaPeerable? self) { if (IsStatic && self != null) throw new ArgumentException ( @@ -77,10 +77,10 @@ void AssertSelf (IJavaPeerable self) "self"); } - unsafe object InvokeInstanceMethod (IJavaPeerable self, JniArgumentValue* arguments) + unsafe object? InvokeInstanceMethod (IJavaPeerable self, JniArgumentValue* arguments) { var e = GetSignatureReturnTypeStartIndex (); - switch (JniSignature [e + 1]) { + switch (JniSignature?[e + 1]) { case 'Z': return members.InstanceMethods.InvokeVirtualBooleanMethod (JniSignature, self, arguments); case 'B': return members.InstanceMethods.InvokeVirtualSByteMethod (JniSignature, self, arguments); case 'C': return members.InstanceMethods.InvokeVirtualCharMethod (JniSignature, self, arguments); @@ -97,14 +97,14 @@ unsafe object InvokeInstanceMethod (IJavaPeerable self, JniArgumentValue* argume members.InstanceMethods.InvokeVirtualVoidMethod (JniSignature, self, arguments); return null; default: - throw new NotSupportedException ("Unsupported argument type: " + JniSignature.Substring (e + 1)); + throw new NotSupportedException ("Unsupported argument type: " + JniSignature?.Substring (e + 1)); } } - unsafe object InvokeStaticMethod (JniArgumentValue* arguments) + unsafe object? InvokeStaticMethod (JniArgumentValue* arguments) { var e = GetSignatureReturnTypeStartIndex (); - switch (JniSignature [e + 1]) { + switch (JniSignature?[e + 1]) { case 'Z': return members.StaticMethods.InvokeBooleanMethod (JniSignature, arguments); case 'B': return members.StaticMethods.InvokeSByteMethod (JniSignature, arguments); case 'C': return members.StaticMethods.InvokeCharMethod (JniSignature, arguments); @@ -121,14 +121,14 @@ unsafe object InvokeStaticMethod (JniArgumentValue* arguments) members.StaticMethods.InvokeVoidMethod (JniSignature, arguments); return null; default: - throw new NotSupportedException ("Unsupported argument type: " + JniSignature.Substring (e + 1)); + throw new NotSupportedException ("Unsupported argument type: " + JniSignature?.Substring (e + 1)); } } protected int GetSignatureReturnTypeStartIndex () { - int n = JniSignature.IndexOf (')'); - if (n == JniSignature.Length - 1) + int n = JniSignature?.IndexOf (')') ?? -1; + if (n == JniSignature?.Length - 1 || n < 0) throw new NotSupportedException ( string.Format ("Could not determine method return type from signature '{0}'.", JniSignature)); return n; diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs index 2eb3b396f..f2f354c32 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs @@ -15,11 +15,11 @@ namespace Java.Interop.Dynamic { abstract class JniMetaObject : DynamicMetaObject { - protected delegate bool TryInvokeMember (IJavaPeerable self, JavaMethodBase[] overloads, DynamicMetaObject[] args, out object value); + protected delegate bool TryInvokeMember (IJavaPeerable self, JavaMethodBase[] overloads, DynamicMetaObject[] args, out object? value); - JavaClassInfo info; + JavaClassInfo? info; - public JniMetaObject (Expression parameter, object value, JavaClassInfo info) + public JniMetaObject (Expression parameter, object? value, JavaClassInfo info) : base (parameter, BindingRestrictions.GetInstanceRestriction (parameter, value), value) { this.info = info; @@ -35,13 +35,16 @@ public override IEnumerable GetDynamicMemberNames () { if (info == null || info.Disposed) return new string[0]; - return info.Fields.Keys.Concat ( - info.Methods.Keys + return (((IEnumerable?) info.Fields?.Keys) ?? Array.Empty ()).Concat ( + ((IEnumerable?) info.Methods?.Keys) ?? Array.Empty () ); } public override DynamicMetaObject BindConvert (ConvertBinder binder) { + if (info == null || info.Disposed) + throw new ObjectDisposedException (GetType ().FullName); + var vm = JniEnvironment.Runtime; if (binder.Type == typeof (Type)) { var sig = JniTypeSignature.Parse (info.JniClassName); @@ -50,7 +53,7 @@ public override DynamicMetaObject BindConvert (ConvertBinder binder) return new DynamicMetaObject (typeE, BindingRestrictions.GetTypeRestriction (typeE, binder.Type), type); } - object value; + object? value; try { var r = ConversionTarget; value = vm.ValueManager.GetValue (ref r, JniObjectReferenceOptions.Copy, binder.Type); @@ -64,7 +67,10 @@ public override DynamicMetaObject BindConvert (ConvertBinder binder) public override DynamicMetaObject BindGetMember (GetMemberBinder binder) { - List overloads = GetFields (binder.Name); + if (info == null || info.Disposed) + throw new ObjectDisposedException (GetType ().FullName); + + List? overloads = GetFields (binder.Name); if (overloads == null) return binder.FallbackGetMember (this); @@ -74,18 +80,18 @@ public override DynamicMetaObject BindGetMember (GetMemberBinder binder) var field = overloads.FirstOrDefault (f => f.IsStatic == true); - Func getValue = field.GetValue; + Func getValue = field.GetValue; var e = Expression.Call (Expression.Constant (field), getValue.GetMethodInfo (), GetSelf ()); return new DynamicMetaObject (e, BindingRestrictions.GetInstanceRestriction (Expression, Value)); } - protected static Expression ThrowObjectDisposedException (Type type = null) + protected static Expression ThrowObjectDisposedException (Type? type = null) { return Expression.Throw (Expression.Constant (new ObjectDisposedException (nameof (DynamicJavaClass))), type); } - List GetFields (string name) + List? GetFields (string name) { if (info == null || info.Fields == null) return null; @@ -111,7 +117,7 @@ public override DynamicMetaObject BindInvokeMember (InvokeMemberBinder binder, D if (applicable.Length == 0) return binder.FallbackInvokeMember (this, args); - TryInvokeMember invoke = info.TryInvokeMember; + TryInvokeMember invoke = info!.TryInvokeMember; var value = Expression.Parameter (typeof (object), "value"); var fallback = binder.FallbackInvokeMember (this, args); var call = Expression.Block ( @@ -124,7 +130,7 @@ public override DynamicMetaObject BindInvokeMember (InvokeMemberBinder binder, D return new DynamicMetaObject (call, BindingRestrictions.GetInstanceRestriction (Expression, Value)); } - protected List GetMethods (string name) + protected List? GetMethods (string name) { if (info == null || info.Methods == null) return null; @@ -138,7 +144,7 @@ protected List GetMethods (string name) public override DynamicMetaObject BindSetMember (SetMemberBinder binder, DynamicMetaObject value) { - List overloads = GetFields (binder.Name); + List? overloads = GetFields (binder.Name); if (overloads == null) return binder.FallbackSetMember (this, value); diff --git a/src/Java.Interop.Export/Java.Interop.Export.csproj b/src/Java.Interop.Export/Java.Interop.Export.csproj index 50ded2320..2e06bae67 100644 --- a/src/Java.Interop.Export/Java.Interop.Export.csproj +++ b/src/Java.Interop.Export/Java.Interop.Export.csproj @@ -4,6 +4,7 @@ netstandard2.0;net6.0 8.0 {B501D075-6183-4E1D-92C9-F7B5002475B1} + enable true ..\..\product.snk Java.Interop.Export diff --git a/src/Java.Interop.Export/Java.Interop/JavaCallableAttribute.cs b/src/Java.Interop.Export/Java.Interop/JavaCallableAttribute.cs index 7b43fa537..ed3f44a2e 100644 --- a/src/Java.Interop.Export/Java.Interop/JavaCallableAttribute.cs +++ b/src/Java.Interop.Export/Java.Interop/JavaCallableAttribute.cs @@ -9,12 +9,12 @@ public JavaCallableAttribute () { } - public JavaCallableAttribute (string name) + public JavaCallableAttribute (string? name) { Name = name; } - public string Name {get; private set;} - public string Signature {get; set;} + public string? Name {get; private set;} + public string? Signature {get; set;} } } diff --git a/src/Java.Interop.Export/Java.Interop/MarshalMemberBuilder.cs b/src/Java.Interop.Export/Java.Interop/MarshalMemberBuilder.cs index 03c419bbc..4cb7d6724 100644 --- a/src/Java.Interop.Export/Java.Interop/MarshalMemberBuilder.cs +++ b/src/Java.Interop.Export/Java.Interop/MarshalMemberBuilder.cs @@ -51,7 +51,7 @@ IEnumerable CreateExportedMemberRegistrationIterato } } - public JniNativeMethodRegistration CreateMarshalToManagedMethodRegistration (JavaCallableAttribute export, MethodInfo method, Type type = null) + public JniNativeMethodRegistration CreateMarshalToManagedMethodRegistration (JavaCallableAttribute export, MethodInfo method, Type? type = null) { if (export == null) throw new ArgumentNullException ("export"); @@ -98,13 +98,13 @@ string GetTypeSignature (ParameterInfo p) throw new NotSupportedException ("Don't know how to determine JNI signature for parameter type: " + p.ParameterType.FullName + "."); } - Delegate CreateJniMethodMarshaler (MethodInfo method, JavaCallableAttribute export, Type type) + Delegate CreateJniMethodMarshaler (MethodInfo method, JavaCallableAttribute? export, Type? type) { var e = CreateMarshalToManagedExpression (method, export, type); return e.Compile (); } - public LambdaExpression CreateMarshalToManagedExpression (MethodInfo method, JavaCallableAttribute callable, Type type = null) + public LambdaExpression CreateMarshalToManagedExpression (MethodInfo method, JavaCallableAttribute? callable, Type? type = null) { if (method == null) throw new ArgumentNullException ("method"); @@ -144,7 +144,9 @@ public LambdaExpression CreateMarshalToManagedExpression (MethodInfo method, Jav }; var waitForGCBridge = typeof(JniRuntime.JniValueManager) - .GetRuntimeMethod (nameof (JniRuntime.JniValueManager.WaitForGCBridgeProcessing), new Type [0]); + .GetRuntimeMethod (nameof (JniRuntime.JniValueManager.WaitForGCBridgeProcessing), new Type [0]) ?? + throw new NotSupportedException ("Could not find JniRuntime.JniValueManager.WaitForGCBridgeProcessing()"); + var marshalBody = new List () { Expression.Assign (jvm, GetRuntime ()), }; @@ -155,10 +157,10 @@ public LambdaExpression CreateMarshalToManagedExpression (MethodInfo method, Jav } else marshalBody.Add (Expression.Call (Expression.Property (jvm, "ValueManager"), waitForGCBridge)); - Expression self = null; + Expression? self = null; var marshalerContext = new JniValueMarshalerContext (jvm, useVmVariable ? vm : null); if (!method.IsStatic) { - var selfMarshaler = Runtime.ValueManager.GetValueMarshaler (type); + var selfMarshaler = Runtime.ValueManager.GetValueMarshaler (type!); self = selfMarshaler.CreateParameterToManagedExpression (marshalerContext, context, 0, type); } @@ -187,7 +189,7 @@ public LambdaExpression CreateMarshalToManagedExpression (MethodInfo method, Jav Expression invoke = method.IsStatic ? Expression.Call (method, invokeParameters) : Expression.Call (self, method, invokeParameters); - Expression ret = null; + Expression? ret = null; if (method.ReturnType == typeof (void)) { envpVars.AddRange (marshalerContext.LocalVariables); @@ -240,7 +242,7 @@ public LambdaExpression CreateMarshalToManagedExpression (MethodInfo method, Jav : Expression.Lambda (marshalerType, body, bodyParams); } - static Type GetMarshalerType (Type returnType, List funcTypeParams, Type declaringType) + static Type? GetMarshalerType (Type? returnType, List funcTypeParams, Type? declaringType) { // Too many parameters; does a `_JniMarshal_*` type exist in the type's declaring assembly? funcTypeParams.RemoveRange (0, 2); @@ -256,7 +258,7 @@ static Type GetMarshalerType (Type returnType, List funcTypeParams, Type d marshalDelegateName.Append (GetJniMarshalDelegateParameterIdentifier (returnType)); } - Type marshalDelegateType = declaringType.Assembly.GetType (marshalDelegateName.ToString (), throwOnError: false); + Type? marshalDelegateType = declaringType?.Assembly.GetType (marshalDelegateName.ToString (), throwOnError: false); if (marshalDelegateType != null) { return marshalDelegateType; } @@ -272,11 +274,11 @@ static Type GetMarshalerType (Type returnType, List funcTypeParams, Type d #if NET static object ab_lock = new object (); - static AssemblyBuilder assemblyBuilder; - static ModuleBuilder moduleBuilder; - static Type[] DelegateCtorSignature; + static AssemblyBuilder? assemblyBuilder; + static ModuleBuilder? moduleBuilder; + static Type[]? DelegateCtorSignature; - static Type CreateMarshalDelegateType (string name, Type returnType, List funcTypeParams) + static Type? CreateMarshalDelegateType (string name, Type? returnType, List funcTypeParams) { lock (ab_lock) { if (assemblyBuilder == null) { @@ -291,7 +293,7 @@ static Type CreateMarshalDelegateType (string name, Type returnType, List } funcTypeParams.Insert (0, typeof (IntPtr)); funcTypeParams.Insert (0, typeof (IntPtr)); - var typeBuilder = moduleBuilder.DefineType ( + var typeBuilder = moduleBuilder!.DefineType ( name, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeof (MulticastDelegate) @@ -328,7 +330,7 @@ static char GetJniMarshalDelegateParameterIdentifier (Type type) return 'L'; } - void CheckMarshalTypesMatch (MethodInfo method, string signature, ParameterInfo[] methodParameters) + void CheckMarshalTypesMatch (MethodInfo method, string? signature, ParameterInfo[] methodParameters) { if (signature == null) return; @@ -379,16 +381,17 @@ static Expression CreateJniTransition (ParameterExpression jnienv) jnienv); } - static readonly MethodInfo JniRuntime_ExceptionShouldTransitionToJni = typeof(JniRuntime).GetRuntimeMethod ("ExceptionShouldTransitionToJni", new[] { - typeof (Exception), - }); + static readonly MethodInfo JniRuntime_ExceptionShouldTransitionToJni = + typeof(JniRuntime).GetRuntimeMethod ("ExceptionShouldTransitionToJni", new[] { typeof (Exception) }) ?? + throw new NotSupportedException ("Could not find `JniRuntime.ExceptionShouldTransitionToJni()`"); + static readonly MethodInfo JniTransition_SetPendingException = + ((Action) (new JniTransition ().SetPendingException)).Method; - static CatchBlock CreateMarshalException (ParameterExpression envp, ParameterExpression jvm, LabelTarget exit) + static CatchBlock CreateMarshalException (ParameterExpression envp, ParameterExpression jvm, LabelTarget? exit) { - var spe = typeof (JniTransition).GetTypeInfo ().GetDeclaredMethod ("SetPendingException"); var ex = Expression.Variable (typeof (Exception), "__e"); var body = new List () { - Expression.Call (envp, spe, ex), + Expression.Call (envp, JniTransition_SetPendingException, ex), }; if (exit != null) { body.Add (Expression.Return (exit, Expression.Default (exit.Type))); @@ -397,9 +400,11 @@ static CatchBlock CreateMarshalException (ParameterExpression envp, ParameterEx return Expression.Catch (ex, Expression.Block (body), filter); } + static readonly MethodInfo JniTransition_Dispose = ((Action) (new JniTransition ().Dispose)).Method; + static Expression CreateDisposeJniEnvironment (ParameterExpression envp, IList cleanup) { - var disposeTransition = Expression.Call (envp, typeof(JniTransition).GetTypeInfo ().GetDeclaredMethod ("Dispose")); + var disposeTransition = Expression.Call (envp, JniTransition_Dispose); return Expression.Block ( cleanup.Reverse ().Concat (new[]{ disposeTransition }));; } @@ -411,19 +416,21 @@ static Expression GetRuntime () static MethodInfo FormatterServices_GetUninitializedObject = #if NETCOREAPP - typeof (System.Runtime.CompilerServices.RuntimeHelpers) + ((Func) System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject) #else // !NETCOREAPP - typeof (System.Runtime.Serialization.FormatterServices) + ((Func) System.Runtime.Serialization.FormatterServices.GetUninitializedObject) #endif // NETCOREAPP - .GetRuntimeMethod ("GetUninitializedObject", new[]{typeof (Type)}); - static MethodInfo IJavaPeerable_SetPeerReference = typeof (IJavaPeerable).GetRuntimeMethod ("SetPeerReference", new[]{typeof (JniObjectReference)}); + .Method; + static MethodInfo IJavaPeerable_SetPeerReference = + typeof (IJavaPeerable).GetRuntimeMethod ("SetPeerReference", new[]{typeof (JniObjectReference)}) ?? + throw new NotSupportedException ("Could not find IJavaPeerable.SetPeerReference()!"); - public override Expression> CreateConstructActivationPeerExpression (ConstructorInfo constructor) + public override Expression> CreateConstructActivationPeerExpression (ConstructorInfo constructor) { if (constructor == null) throw new ArgumentNullException (nameof (constructor)); - Func mbi = constructor.Invoke; + Func mbi = constructor.Invoke; var c = Expression.Parameter (typeof (ConstructorInfo), "constructor"); var r = Expression.Parameter (typeof (JniObjectReference), "reference"); @@ -438,7 +445,7 @@ public override Expression> (b, new []{c, r, p}); + return Expression.Lambda> (b, new []{c, r, p}); } public static string GetMarshalMethodName (string name, string signature) @@ -462,7 +469,7 @@ public static string GetMarshalMethodName (string name, string signature) static class JniSignature { - public static Type GetMarshalReturnType (string signature) + public static Type? GetMarshalReturnType (string signature) { int idx = signature.LastIndexOf (')') + 1; return ExtractMarshalTypeFromSignature (signature, ref idx); @@ -475,13 +482,13 @@ public static IEnumerable GetMarshalParameterTypes (string signature) signature = signature.Substring (1, e >= 0 ? e-1 : signature.Length-1); } int i = 0; - Type t; + Type? t; while ((t = ExtractMarshalTypeFromSignature (signature, ref i)) != null) yield return t; } // as per: http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/types.html - static Type ExtractMarshalTypeFromSignature (string signature, ref int index) + static Type? ExtractMarshalTypeFromSignature (string signature, ref int index) { #if false if (index >= signature.Length)