Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions tools/generator/ArraySymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ public bool IsArray {
get { return true; }
}

public string GetObjectHandleProperty (string variable)
{
return sym.GetObjectHandleProperty (variable);
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/CharSequenceSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return $"((global::Java.Lang.Object) {variable}).Handle";
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
2 changes: 2 additions & 0 deletions tools/generator/ClassGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ void GenProperties (StreamWriter sw, string indent, CodeGenerationOptions opt)

public override void Generate (StreamWriter sw, string indent, CodeGenerationOptions opt, GenerationInfo gen_info)
{
opt.ContextTypes.Push (this);
gen_info.TypeRegistrations.Add (new KeyValuePair<string, string>(RawJniName, AssemblyQualifiedName));
bool is_enum = base_symbol != null && base_symbol.FullName == "Java.Lang.Enum";
if (is_enum)
Expand Down Expand Up @@ -497,6 +498,7 @@ public override void Generate (StreamWriter sw, string indent, CodeGenerationOpt
sw.WriteLine ();
GenerateInvoker (sw, indent, opt);
}
opt.ContextTypes.Pop ();
}

class InterfaceExtensionInfo {
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/CollectionSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return $"((global::Java.Lang.Object) {variable}).Handle";
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/EnumSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return null;
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/FormatSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return null;
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
9 changes: 9 additions & 0 deletions tools/generator/GenBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,15 @@ public string MetadataXPathReference {
}
}

public string GetObjectHandleProperty (string variable)
{
var handleType = "Java.Lang.Object";
if (FullName == "Java.Lang.Throwable" || Ancestors ().Any (a => a.FullName == "Java.Lang.Throwable"))
handleType = "Java.Lang.Throwable";

return $"((global::{handleType}) {variable}).Handle";
}

protected IEnumerable<InterfaceGen> GetAllImplementedInterfaces ()
{
var set = new HashSet<InterfaceGen> ();
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/GeneratedEnumSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ public string ElementType {
get { return enum_type; }
}

public string GetObjectHandleProperty (string variable)
{
return null;
}

public string[] PreCallback (CodeGenerationOptions opt, string var_name, bool owned)
{
throw new NotSupportedException (string.Format ("{0} does not support PreCallback", this.GetType ().Name));
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/GenericSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ public ISymbol [] TypeParams {
get { return type_params; }
}

public string GetObjectHandleProperty (string variable)
{
return gen.GetObjectHandleProperty (variable);
}

string MapTypeParams (Dictionary<string, string> mappings)
{
StringBuilder sb = new StringBuilder ();
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/GenericTypeParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return null;
}

public string FromNative (CodeGenerationOptions opt, string varname, bool owned)
{
return String.Format ("({0}) global::Java.Lang.Object.GetObject<{3}> ({1}, {2})", type, varname, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer", opt.GetOutputName (FullName));
Expand Down
2 changes: 2 additions & 0 deletions tools/generator/ISymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public interface ISymbol {
bool IsArray { get; }
string ElementType { get; }

string GetObjectHandleProperty (string variable);

string GetGenericType (Dictionary<string, string> mappings);

string FromNative (CodeGenerationOptions opt, string var_name, bool owned);
Expand Down
8 changes: 5 additions & 3 deletions tools/generator/InterfaceGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public override string ToNative (CodeGenerationOptions opt, string varname, Dict
if (String.IsNullOrEmpty (Marshaler))
return String.Format ("JNIEnv.ToLocalJniHandle ({0})", varname);
else
return String.Format ("{0}.Handle", varname);
return GetObjectHandleProperty (varname);
*/
}

Expand Down Expand Up @@ -242,7 +242,7 @@ void GenerateInvoker (StreamWriter sw, string indent, CodeGenerationOptions opt)
sw.WriteLine ();
sw.WriteLine ("{0}\tpublic {1}Invoker (IntPtr handle, JniHandleOwnership transfer) : base (Validate (handle), transfer)", indent, Name);
sw.WriteLine ("{0}\t{{", indent);
sw.WriteLine ("{0}\t\tIntPtr local_ref = JNIEnv.GetObjectClass (Handle);", indent);
sw.WriteLine ("{0}\t\tIntPtr local_ref = JNIEnv.GetObjectClass ({1});", indent, opt.ContextType.GetObjectHandleProperty ("this"));
sw.WriteLine ("{0}\t\tthis.class_ref = JNIEnv.NewGlobalRef (local_ref);", indent);
sw.WriteLine ("{0}\t\tJNIEnv.DeleteLocalRef (local_ref);", indent);
sw.WriteLine ("{0}\t}}", indent);
Expand Down Expand Up @@ -399,7 +399,7 @@ void GenerateEventHandlerImpl (StreamWriter sw, string indent, CodeGenerationOpt
sw.WriteLine ("{0}\t\t\tglobal::Android.Runtime.JNIEnv.StartCreateInstance (\"{1}\", \"()V\"),", indent, jniClass);
sw.WriteLine ("{0}\t\t\tJniHandleOwnership.TransferLocalRef)", indent);
sw.WriteLine ("{0}\t{{", indent);
sw.WriteLine ("{0}\t\tglobal::Android.Runtime.JNIEnv.FinishCreateInstance (Handle, \"()V\");", indent);
sw.WriteLine ("{0}\t\tglobal::Android.Runtime.JNIEnv.FinishCreateInstance ({1}, \"()V\");", indent, GetObjectHandleProperty ("this"));
if (needs_sender)
sw.WriteLine ("{0}\t\tthis.sender = sender;", indent);
sw.WriteLine ("{0}\t}}", indent);
Expand Down Expand Up @@ -660,6 +660,7 @@ public void GenerateExtensionsDeclaration (StreamWriter sw, string indent, CodeG

public override void Generate (StreamWriter sw, string indent, CodeGenerationOptions opt, GenerationInfo gen_info)
{
opt.ContextTypes.Push (this);
// interfaces don't nest, so generate as siblings
foreach (GenBase nest in NestedTypes) {
nest.Generate (sw, indent, opt, gen_info);
Expand Down Expand Up @@ -719,6 +720,7 @@ public override void Generate (StreamWriter sw, string indent, CodeGenerationOpt
GenerateExtensionsDeclaration (sw, indent, opt, null);
GenerateInvoker (sw, indent, opt);
GenerateEventHandler (sw, indent, opt);
opt.ContextTypes.Pop ();
}

public override void Generate (CodeGenerationOptions opt, GenerationInfo gen_info)
Expand Down
2 changes: 1 addition & 1 deletion tools/generator/JavaInteropCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ internal override void WriteConstructorBody (Ctor ctor, StreamWriter sw, string
? "(" + ctor.Parameters.JniNestedDerivedSignature + ")V"
: ctor.JniSignature);
sw.WriteLine ();
sw.WriteLine ("{0}if (Handle != IntPtr.Zero)", indent);
sw.WriteLine ("{0}if ({1} != IntPtr.Zero)", indent, opt.ContextType.GetObjectHandleProperty ("this"));
sw.WriteLine ("{0}\treturn;", indent);
sw.WriteLine ();
foreach (string prep in ctor.Parameters.GetCallPrep (opt))
Expand Down
3 changes: 2 additions & 1 deletion tools/generator/Method.cs
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,8 @@ public void GenerateInvokerBody (StreamWriter sw, string indent, CodeGenerationO
sw.WriteLine ("{0}{1}", indent, prep);
Parameters.WriteCallArgs (sw, indent, opt, invoker:true);
string env_method = "Call" + RetVal.CallMethodPrefix + "Method";
string call = "JNIEnv." + env_method + " (Handle, " + EscapedIdName + Parameters.GetCallArgs (opt, invoker:true) + ")";
string call = "JNIEnv." + env_method + " (" +
opt.ContextType.GetObjectHandleProperty ("this") + ", " + EscapedIdName + Parameters.GetCallArgs (opt, invoker:true) + ")";
if (IsVoid)
sw.WriteLine ("{0}{1};", indent, call);
else
Expand Down
3 changes: 2 additions & 1 deletion tools/generator/Parameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ public string GetCall (CodeGenerationOptions opt)
return c;
if (!NeedsPrep)
return c;
var h = sym.GetObjectHandleProperty (c);
if (sym.PreCall (opt, Name).Length == 0)
return string.Format ("({0} == null) ? IntPtr.Zero : {0}.Handle", c);
return string.Format ("({0} == null) ? IntPtr.Zero : {1}", c, h);
return c;
}

Expand Down
5 changes: 5 additions & 0 deletions tools/generator/StreamSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return $"((global::Java.Lang.Object) {variable}).Handle";
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
5 changes: 5 additions & 0 deletions tools/generator/StringSymbol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ public string ElementType {
get { return null; }
}

public string GetObjectHandleProperty (string variable)
{
return $"((global::Java.Lang.Object) {variable}).Handle";
}

public string GetGenericType (Dictionary<string, string> mappings)
{
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected override void Dispose (bool disposing)

public ISpannableInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Validate (handle), transfer)
{
IntPtr local_ref = JNIEnv.GetObjectClass (Handle);
IntPtr local_ref = JNIEnv.GetObjectClass (((global::Java.Lang.Object) this).Handle);
this.class_ref = JNIEnv.NewGlobalRef (local_ref);
JNIEnv.DeleteLocalRef (local_ref);
}
Expand Down Expand Up @@ -86,8 +86,8 @@ public unsafe Android.Text.SpanTypes GetSpanFlags (Java.Lang.Object tag)
if (id_getSpanFlags_Ljava_lang_Object_ == IntPtr.Zero)
id_getSpanFlags_Ljava_lang_Object_ = JNIEnv.GetMethodID (class_ref, "getSpanFlags", "(Ljava/lang/Object;)I");
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue ((tag == null) ? IntPtr.Zero : tag.Handle);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
__args [0] = new JValue ((tag == null) ? IntPtr.Zero : ((global::Java.Lang.Object) tag).Handle);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
return __ret;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ protected override void Dispose (bool disposing)

public ISpannedInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Validate (handle), transfer)
{
IntPtr local_ref = JNIEnv.GetObjectClass (Handle);
IntPtr local_ref = JNIEnv.GetObjectClass (((global::Java.Lang.Object) this).Handle);
this.class_ref = JNIEnv.NewGlobalRef (local_ref);
JNIEnv.DeleteLocalRef (local_ref);
}
Expand Down Expand Up @@ -91,8 +91,8 @@ public unsafe Android.Text.SpanTypes GetSpanFlags (Java.Lang.Object tag)
if (id_getSpanFlags_Ljava_lang_Object_ == IntPtr.Zero)
id_getSpanFlags_Ljava_lang_Object_ = JNIEnv.GetMethodID (class_ref, "getSpanFlags", "(Ljava/lang/Object;)I");
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue ((tag == null) ? IntPtr.Zero : tag.Handle);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
__args [0] = new JValue ((tag == null) ? IntPtr.Zero : ((global::Java.Lang.Object) tag).Handle);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
return __ret;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public unsafe SpannableString (Java.Lang.ICharSequence source)
{
const string __id = "(Ljava/lang/CharSequence;)V";

if (Handle != IntPtr.Zero)
if (((global::Java.Lang.Object) this).Handle != IntPtr.Zero)
return;

IntPtr native_source = CharSequence.ToLocalJniHandle (source);
Expand All @@ -58,7 +58,7 @@ public unsafe SpannableString (string source)
{
const string __id = "(Ljava/lang/CharSequence;)V";

if (Handle != IntPtr.Zero)
if (((global::Java.Lang.Object) this).Handle != IntPtr.Zero)
return;

IntPtr native_source = CharSequence.ToLocalJniHandle (source);
Expand Down Expand Up @@ -98,7 +98,7 @@ public override unsafe Android.Text.SpanTypes GetSpanFlags (Java.Lang.Object wha
const string __id = "getSpanFlags.(Ljava/lang/Object;)I";
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue ((what == null) ? IntPtr.Zero : what.Handle);
__args [0] = new JniArgumentValue ((what == null) ? IntPtr.Zero : ((global::Java.Lang.Object) what).Handle);
var __rm = _members.InstanceMethods.InvokeVirtualInt32Method (__id, this, __args);
return (Android.Text.SpanTypes) __rm;
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public virtual unsafe Android.Text.SpanTypes GetSpanFlags (Java.Lang.Object p0)
const string __id = "getSpanFlags.(Ljava/lang/Object;)I";
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue ((p0 == null) ? IntPtr.Zero : p0.Handle);
__args [0] = new JniArgumentValue ((p0 == null) ? IntPtr.Zero : ((global::Java.Lang.Object) p0).Handle);
var __rm = _members.InstanceMethods.InvokeVirtualInt32Method (__id, this, __args);
return (Android.Text.SpanTypes) __rm;
} finally {
Expand Down
10 changes: 5 additions & 5 deletions tools/generator/Tests-Core/expected.ji/Android.Views.View.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ protected override void Dispose (bool disposing)

public IOnClickListenerInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Validate (handle), transfer)
{
IntPtr local_ref = JNIEnv.GetObjectClass (Handle);
IntPtr local_ref = JNIEnv.GetObjectClass (((global::Java.Lang.Object) this).Handle);
this.class_ref = JNIEnv.NewGlobalRef (local_ref);
JNIEnv.DeleteLocalRef (local_ref);
}
Expand Down Expand Up @@ -93,8 +93,8 @@ public unsafe void OnClick (Android.Views.View v)
if (id_onClick_Landroid_view_View_ == IntPtr.Zero)
id_onClick_Landroid_view_View_ = JNIEnv.GetMethodID (class_ref, "onClick", "(Landroid/view/View;)V");
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue ((v == null) ? IntPtr.Zero : v.Handle);
JNIEnv.CallVoidMethod (Handle, id_onClick_Landroid_view_View_, __args);
__args [0] = new JValue ((v == null) ? IntPtr.Zero : ((global::Java.Lang.Object) v).Handle);
JNIEnv.CallVoidMethod (((global::Java.Lang.Object) this).Handle, id_onClick_Landroid_view_View_, __args);
}

}
Expand All @@ -107,7 +107,7 @@ public IOnClickListenerImplementor ()
global::Android.Runtime.JNIEnv.StartCreateInstance ("mono/android/view/View_OnClickListenerImplementor", "()V"),
JniHandleOwnership.TransferLocalRef)
{
global::Android.Runtime.JNIEnv.FinishCreateInstance (Handle, "()V");
global::Android.Runtime.JNIEnv.FinishCreateInstance (((global::Java.Lang.Object) this).Handle, "()V");
}

#pragma warning disable 0649
Expand Down Expand Up @@ -173,7 +173,7 @@ public virtual unsafe void SetOnClickListener (Android.Views.View.IOnClickListen
const string __id = "setOnClickListener.(Landroid/view/View$OnClickListener;)V";
try {
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
__args [0] = new JniArgumentValue ((l == null) ? IntPtr.Zero : l.Handle);
__args [0] = new JniArgumentValue ((l == null) ? IntPtr.Zero : ((global::Java.Lang.Object) l).Handle);
_members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args);
} finally {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ protected override void Dispose (bool disposing)

public ISpannableInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Validate (handle), transfer)
{
IntPtr local_ref = JNIEnv.GetObjectClass (Handle);
IntPtr local_ref = JNIEnv.GetObjectClass (((global::Java.Lang.Object) this).Handle);
this.class_ref = JNIEnv.NewGlobalRef (local_ref);
JNIEnv.DeleteLocalRef (local_ref);
}
Expand Down Expand Up @@ -78,7 +78,7 @@ public unsafe Android.Text.SpanTypes GetSpanFlags (Java.Lang.Object tag)
id_getSpanFlags_Ljava_lang_Object_ = JNIEnv.GetMethodID (class_ref, "getSpanFlags", "(Ljava/lang/Object;)I");
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue (tag);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
return __ret;
}

Expand Down
4 changes: 2 additions & 2 deletions tools/generator/Tests-Core/expected/Android.Text.ISpanned.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ protected override void Dispose (bool disposing)

public ISpannedInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Validate (handle), transfer)
{
IntPtr local_ref = JNIEnv.GetObjectClass (Handle);
IntPtr local_ref = JNIEnv.GetObjectClass (((global::Java.Lang.Object) this).Handle);
this.class_ref = JNIEnv.NewGlobalRef (local_ref);
JNIEnv.DeleteLocalRef (local_ref);
}
Expand Down Expand Up @@ -83,7 +83,7 @@ public unsafe Android.Text.SpanTypes GetSpanFlags (Java.Lang.Object tag)
id_getSpanFlags_Ljava_lang_Object_ = JNIEnv.GetMethodID (class_ref, "getSpanFlags", "(Ljava/lang/Object;)I");
JValue* __args = stackalloc JValue [1];
__args [0] = new JValue (tag);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
Android.Text.SpanTypes __ret = (Android.Text.SpanTypes) JNIEnv.CallIntMethod (((global::Java.Lang.Object) this).Handle, id_getSpanFlags_Ljava_lang_Object_, __args);
return __ret;
}

Expand Down
Loading