xamarin-macios/runtime/delegates.t4

327 строки
10 KiB
Plaintext

<# // vim: set filetype=cs :
#>
<#@ template language="C#" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#
var delegates = new XDelegates {
new XDelegate ("void", "void", "xamarin_register_nsobject",
"MonoObject *", "IntPtr", "managed_obj",
"id", "IntPtr", "native_obj"
) { WrappedManagedFunction = "RegisterNSObject" },
new XDelegate ("void", "void", "xamarin_register_assembly",
"MonoReflectionAssembly *", "IntPtr", "assembly"
) { WrappedManagedFunction = "RegisterAssembly" },
new XDelegate ("void", "void", "xamarin_throw_ns_exception",
"NSException *", "IntPtr", "exc"
) {
WrappedManagedFunction = "ThrowNSException",
ExceptionHandling = false,
},
new XDelegate ("void", "void", "xamarin_rethrow_managed_exception",
"guint32", "uint", "original_exception_gchandle"
) { WrappedManagedFunction = "RethrowManagedException" },
new XDelegate ("int", "int", "xamarin_create_ns_exception",
"NSException *", "IntPtr", "exc"
) { WrappedManagedFunction = "CreateNSException" },
new XDelegate ("NSException *", "IntPtr", "xamarin_unwrap_ns_exception",
"int", "int", "exc_handle"
) { WrappedManagedFunction = "UnwrapNSException" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_block_wrapper_creator",
"MonoObject *", "IntPtr", "method",
"int", "int", "parameter"
) { WrappedManagedFunction = "GetBlockWrapperCreator" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_create_block_proxy",
"MonoObject *", "IntPtr", "method",
"void *", "IntPtr", "block"
) { WrappedManagedFunction = "CreateBlockProxy" },
new XDelegate ("id", "IntPtr", "xamarin_create_delegate_proxy",
"MonoObject *", "IntPtr", "method",
"MonoObject *", "IntPtr", "block"
) { WrappedManagedFunction = "CreateDelegateProxy" },
new XDelegate ("void", "void", "xamarin_register_entry_assembly",
"MonoReflectionAssembly *", "IntPtr", "assembly"
) { WrappedManagedFunction = "RegisterEntryAssembly" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_class",
"Class", "IntPtr", "ptr"
) { WrappedManagedFunction = "GetClass" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_selector",
"SEL", "IntPtr", "ptr"
) { WrappedManagedFunction = "GetSelector" },
new XDelegate ("Class", "IntPtr", "xamarin_get_class_handle",
"MonoObject *", "IntPtr", "obj"
) { WrappedManagedFunction = "GetClassHandle" },
new XDelegate ("SEL", "IntPtr", "xamarin_get_selector_handle",
"MonoObject *", "IntPtr", "obj"
) { WrappedManagedFunction = "GetSelectorHandle" },
new XDelegate ("MethodDescription", "UnmanagedMethodDescription", "xamarin_get_method_for_selector",
"Class", "IntPtr", "cls",
"SEL", "IntPtr", "sel"
) { WrappedManagedFunction = "GetMethodForSelector" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_nsobject",
"id", "IntPtr", "obj"
) { WrappedManagedFunction = "GetNSObjectWrapped" },
new XDelegate ("bool", "bool", "xamarin_has_nsobject",
"id", "IntPtr", "obj"
) { WrappedManagedFunction = "HasNSObject" },
new XDelegate ("id", "IntPtr", "xamarin_get_handle_for_inativeobject",
"MonoObject *", "IntPtr", "obj"
) { WrappedManagedFunction = "GetHandleForINativeObject" },
new XDelegate ("void", "void", "xamarin_unregister_nsobject",
"id", "IntPtr", "native_obj",
"MonoObject *", "IntPtr", "managed_obj"
) { WrappedManagedFunction = "UnregisterNSObject" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_try_get_or_construct_nsobject",
"id", "IntPtr", "obj"
) { WrappedManagedFunction = "TryGetOrConstructNSObjectWrapped" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_inative_object_dynamic",
"id", "IntPtr", "obj",
"bool", "bool", "owns",
"void *", "IntPtr", "type"
) { WrappedManagedFunction = "GetINativeObject_Dynamic" },
new XDelegate ("MonoReflectionMethod *", "IntPtr", "xamarin_get_method_from_token",
"unsigned int", "uint", "token_ref"
) { WrappedManagedFunction = "GetMethodFromToken" },
new XDelegate ("MonoReflectionMethod *", "IntPtr", "xamarin_get_generic_method_from_token",
"MonoObject *", "IntPtr", "obj",
"unsigned int", "uint", "token_ref"
) { WrappedManagedFunction = "GetGenericMethodFromToken" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_inative_object_static",
"id", "IntPtr", "obj",
"bool", "bool", "owns",
"const char *", "string", "type_name",
"const char *", "string", "iface_name"
) { WrappedManagedFunction = "GetINativeObject_Static" },
new XDelegate ("MonoObject *", "IntPtr", "xamarin_get_nsobject_with_type",
"id", "IntPtr", "obj",
"void *", "IntPtr", "type",
"int32_t *", "out bool", "created"
) { WrappedManagedFunction = "GetNSObjectWithType" },
new XDelegate ("void", "void", "xamarin_dispose",
"MonoObject *", "IntPtr", "mobj"
) { WrappedManagedFunction = "Dispose" },
new XDelegate ("bool", "bool", "xamarin_is_parameter_transient",
"MonoReflectionMethod *", "IntPtr", "method",
"int", "int", "parameter"
) { WrappedManagedFunction = "IsParameterTransient" },
new XDelegate ("bool", "bool", "xamarin_is_parameter_out",
"MonoReflectionMethod *", "IntPtr", "method",
"int", "int", "parameter"
) { WrappedManagedFunction = "IsParameterOut" },
new XDelegate ("MethodDescription", "UnmanagedMethodDescription", "xamarin_get_method_and_object_for_selector",
"Class", "IntPtr", "cls",
"SEL", "IntPtr", "sel",
"id", "IntPtr", "obj",
"MonoObject **", "ref IntPtr", "mthis"
) { WrappedManagedFunction = "GetMethodAndObjectForSelector" },
new XDelegate ("guint32", "int", "xamarin_create_product_exception_for_error",
"int", "int", "code",
"const char *", "string", "message"
) { WrappedManagedFunction = "CreateProductException" },
new XDelegate ("char *", "IntPtr", "xamarin_reflection_type_get_full_name",
"MonoReflectionType *", "IntPtr", "type"
) { WrappedManagedFunction = "TypeGetFullName" },
new XDelegate ("char *", "IntPtr", "xamarin_lookup_managed_type_name",
"Class", "IntPtr", "klass"
) { WrappedManagedFunction = "LookupManagedTypeName" },
new XDelegate ("MarshalManagedExceptionMode", "MarshalManagedExceptionMode", "xamarin_on_marshal_managed_exception",
"int", "int", "exception"
) { WrappedManagedFunction = "OnMarshalManagedException" },
new XDelegate ("MarshalObjectiveCExceptionMode", "MarshalObjectiveCExceptionMode", "xamarin_on_marshal_objectivec_exception",
"id", "IntPtr", "exception",
"bool", "bool", "throwManagedAsDefault"
) { WrappedManagedFunction = "OnMarshalObjectiveCException" },
};
delegates.CalculateLengths ();
#><#+
class Arg
{
public string CType;
public string MType;
public string Name;
}
class XDelegates : List<XDelegate>
{
public void CalculateLengths ()
{
foreach (var x in this) {
MaxEntryPointLength = Math.Max (MaxEntryPointLength, x.EntryPoint.Length);
MaxCReturnTypeLength = Math.Max (MaxCReturnTypeLength, x.CReturnType.Length);
x.Delegates = this;
}
}
public int MaxEntryPointLength;
public int MaxCReturnTypeLength;
}
class XDelegate
{
public string CReturnType;
public string MReturnType;
public string EntryPoint;
public List<Arg> Arguments;
public string WrappedManagedFunction;
public bool ExceptionHandling = true;
public XDelegates Delegates;
public XDelegate (string cReturnType, string mReturnType, string entryPoint, params string [] arguments)
{
CReturnType = cReturnType;
MReturnType = mReturnType;
EntryPoint = entryPoint;
if (arguments == null || arguments.Length == 0)
return;
if (arguments.Length % 3 != 0)
throw new Exception (string.Format ("Export arguments params must be a multiple of 3 to form a set of (c type, managed name, name) triples for {0}", entryPoint));
if (!entryPoint.StartsWith ("xamarin_"))
throw new Exception ("All entry points must start with 'xamarin_'");
Arguments = new List<Arg> ();
for (var i = 0; i < arguments.Length; i += 3)
Arguments.Add (new Arg {
CType = arguments [i],
MType = arguments [i + 1],
Name = arguments [i + 2]
});
}
public string SimpleEntryPoint {
get {
return EntryPoint.Substring ("xamarin_".Length);
}
}
public string AlignEntryPoint {
get {
return new string (' ', Delegates.MaxEntryPointLength - EntryPoint.Length);
}
}
public string AlignCReturnType {
get {
return new string (' ', Delegates.MaxCReturnTypeLength - CReturnType.Length);
}
}
string CFormatArgs (string empty, bool nameOnly)
{
if (Arguments == null || Arguments.Count == 0)
return empty;
var builder = new StringBuilder ();
foreach (var arg in Arguments) {
if (!nameOnly) {
builder.Append (arg.CType);
builder.Append (' ');
}
builder.Append (arg.Name);
builder.Append (", ");
}
builder.Length -= 2;
if (ExceptionHandling) {
if (nameOnly) {
builder.Append (", exception_gchandle");
} else {
builder.Append (", guint32 *exception_gchandle");
}
}
return builder.ToString ();
}
string MFormatArgs (string empty, bool nameOnly)
{
if (Arguments == null || Arguments.Count == 0)
return empty;
var builder = new StringBuilder ();
foreach (var arg in Arguments) {
if (!nameOnly) {
builder.Append (arg.MType);
builder.Append (' ');
} else if (arg.MType.StartsWith ("out ")) {
builder.Append ("out ");
} else if (arg.MType.StartsWith ("ref ")) {
builder.Append ("ref ");
}
builder.Append (arg.Name);
builder.Append (", ");
}
builder.Length -= 2;
if (ExceptionHandling) {
if (nameOnly) {
// nothing to do
} else {
builder.Append (", out int exception_gchandle");
}
}
return builder.ToString ();
}
public string CArgumentSignature {
get { return CFormatArgs ("void", nameOnly: false); }
}
public string CArgumentNames {
get { return CFormatArgs (String.Empty, nameOnly: true); }
}
public string MArgumentSignature {
get { return MFormatArgs ("", nameOnly: false); }
}
public string MArgumentNames {
get { return MFormatArgs (String.Empty, nameOnly: true); }
}
}
#>