340 строки
10 KiB
Plaintext
340 строки
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 ("void", "void", "xamarin_get_method_for_selector",
|
|
"Class", "IntPtr", "cls",
|
|
"SEL", "IntPtr", "sel",
|
|
"bool", "bool", "is_static",
|
|
"MethodDescription *", "IntPtr", "desc"
|
|
) { 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 ("void", "void", "xamarin_get_method_and_object_for_selector",
|
|
"Class", "IntPtr", "cls",
|
|
"SEL", "IntPtr", "sel",
|
|
"bool", "bool", "is_static",
|
|
"id", "IntPtr", "obj",
|
|
"MonoObject **", "ref IntPtr", "mthis",
|
|
"MethodDescription *", "IntPtr", "desc"
|
|
) { 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" },
|
|
|
|
new XDelegate ("NSString *", "IntPtr", "xamarin_convert_smart_enum_to_nsstring",
|
|
"void *", "IntPtr", "value"
|
|
) { WrappedManagedFunction = "ConvertSmartEnumToNSString" },
|
|
|
|
new XDelegate ("void *", "IntPtr", "xamarin_convert_nsstring_to_smart_enum",
|
|
"NSString *", "IntPtr", "value",
|
|
"MonoReflectionType *", "IntPtr", "type"
|
|
) { WrappedManagedFunction = "ConvertNSStringToSmartEnum" },
|
|
};
|
|
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); }
|
|
}
|
|
}
|
|
#>
|