mono-tools/mono-tools-3.10-upstream-create-native-map.patch

460 lines
13 KiB
Diff
Raw Permalink Normal View History

From 9de0fe06a99003462df3c77dda93718ab85da487 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Steffen=20Kie=C3=9F?= <s-kiess@web.de>
Date: Thu, 10 Sep 2015 14:36:12 +0200
Subject: [PATCH] Changes to create-native-map
- Use CompareOptions.OrdinalIgnoreCase instead of
CompareOptions.Ordinal | CompareOptions.IgnoreCase (which is no longer
supported by newer mono versions)
- Make sure enum hex values are lowercase on newer mono versions
- Do not create conversion calls for inherited fields
- Allow [Map] for internal enums
---
create-native-map/man/create-native-map.1 | 3 ++
create-native-map/src/TestMap.cs | 26 +++++++--
create-native-map/src/create-native-map.cs | 27 ++++++----
create-native-map/src/test.c.ref | 86 ++++++++++++++++++++++++++++++
create-native-map/src/test.cs.ref | 64 ++++++++++++++++++++++
create-native-map/src/test.h.ref | 32 +++++++++++
6 files changed, 224 insertions(+), 14 deletions(-)
diff --git a/create-native-map/man/create-native-map.1 b/create-native-map/man/create-native-map.1
index 20092a0..f0edf30 100644
--- a/create-native-map/man/create-native-map.1
+++ b/create-native-map/man/create-native-map.1
@@ -435,6 +435,9 @@ becomes
}
.fi
+For classes, the conversion functions will only copy fields declared in the class itself. Fields declared in parent classes will not be copied. (This is because
+.I create-native-map
+does not know how the inheritance is implemented in C. Therefore copying fields from parent classes is left to the caller of the conversion functions.)
.TP
Fields
If a field (1) has the
diff --git a/create-native-map/src/TestMap.cs b/create-native-map/src/TestMap.cs
index fc25795..7d489ff 100644
--- a/create-native-map/src/TestMap.cs
+++ b/create-native-map/src/TestMap.cs
@@ -16,7 +16,7 @@ struct ForDelegate {int i;}
HandleRef h, ForDelegate fd);
[Map]
- enum TestEnum : long {
+ public enum TestEnum : long {
Foo,
Bar,
Baz,
@@ -24,7 +24,7 @@ enum TestEnum : long {
}
[Map, Flags]
- enum SimpleFlagsEnum {
+ public enum SimpleFlagsEnum {
None = 0,
A = 1,
B = 2,
@@ -33,7 +33,7 @@ enum SimpleFlagsEnum {
}
[Map, Flags]
- enum FlagsEnum {
+ public enum FlagsEnum {
None = 0,
A = 1,
B = 2,
@@ -110,6 +110,23 @@ class NativeMethods {
[DllImport ("NativeLib")]
private static extern void exclude_native_symbol ();
}
+
+ [Map]
+ enum InternalEnum : long {
+ Foo,
+ }
+
+ [Map ("struct parent")]
+ [StructLayout (LayoutKind.Sequential)]
+ public class Parent {
+ public int i;
+ }
+
+ [Map ("struct child")]
+ [StructLayout (LayoutKind.Sequential)]
+ public class Child : Parent {
+ public int j;
+ }
}
// Testing namespace renaming; this should be NSTo within test.h
@@ -121,8 +138,7 @@ class Stat {
}
[Map]
- enum Colors {
+ public enum Colors {
Red, Blue, Green
}
}
-
diff --git a/create-native-map/src/create-native-map.cs b/create-native-map/src/create-native-map.cs
index a237d46..26d8c6e 100644
--- a/create-native-map/src/create-native-map.cs
+++ b/create-native-map/src/create-native-map.cs
@@ -551,7 +551,7 @@ public int Compare (string s1, string s2)
if (s2 == null)
return -1;
return CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s2,
- CompareOptions.Ordinal | CompareOptions.IgnoreCase);
+ CompareOptions.OrdinalIgnoreCase);
}
}
@@ -742,8 +742,8 @@ static void WriteLiteralValues (StreamWriter sh, Type t, string n)
if (!fi.IsLiteral)
continue;
string e = n + "_" + fi.Name;
- sh.WriteLine ("\t{0,-" + max_field_length + "} = 0x{1:x},",
- e, fi.GetValue (inst));
+ sh.WriteLine ("\t{0,-" + max_field_length + "} = 0x{1},",
+ e, string.Format ("{0:x}", fi.GetValue (inst)).ToLower ());
sh.WriteLine ("\t#define {0,-" + max_field_length + "} {0}", e);
}
sh.WriteLine ("};");
@@ -1407,7 +1407,8 @@ private void WriteToManagedClass (Type t, string ns, string fn, string etype)
private static FieldInfo[] GetFieldsToCopy (Type t)
{
FieldInfo[] fields = t.GetFields (BindingFlags.Instance |
- BindingFlags.Public | BindingFlags.NonPublic);
+ BindingFlags.Public | BindingFlags.NonPublic |
+ BindingFlags.DeclaredOnly);
int count = 0;
for (int i = 0; i < fields.Length; ++i)
if (MapUtils.GetCustomAttribute <NonSerializedAttribute> (fields [i]) == null)
@@ -1472,6 +1473,7 @@ private void WriteEnum (Type t, string ns, string fn)
{
string mtype = Enum.GetUnderlyingType(t).Name;
ObsoleteAttribute oa = MapUtils.GetCustomAttribute <ObsoleteAttribute> (t);
+ string visibility = (t.Attributes & TypeAttributes.Public) != 0 ? "public" : "internal";
string obsolete = "";
if (oa != null) {
obsolete = string.Format ("[Obsolete (\"{0}\", {1})]\n\t\t",
@@ -1481,12 +1483,12 @@ private void WriteEnum (Type t, string ns, string fn)
"\t\t{0}[DllImport (LIB, EntryPoint=\"{1}_From{2}\")]\n" +
"\t\tprivate static extern int From{2} ({2} value, out {3} rval);\n" +
"\n" +
- "\t\t{0}public static bool TryFrom{2} ({2} value, out {3} rval)\n" +
+ "\t\t{0}{4} static bool TryFrom{2} ({2} value, out {3} rval)\n" +
"\t\t{{\n" +
"\t\t\treturn From{2} (value, out rval) == 0;\n" +
"\t\t}}\n" +
"\n" +
- "\t\t{0}public static {3} From{2} ({2} value)\n" +
+ "\t\t{0}{4} static {3} From{2} ({2} value)\n" +
"\t\t{{\n" +
"\t\t\t{3} rval;\n" +
"\t\t\tif (From{2} (value, out rval) == -1)\n" +
@@ -1497,19 +1499,19 @@ private void WriteEnum (Type t, string ns, string fn)
"\t\t{0}[DllImport (LIB, EntryPoint=\"{1}_To{2}\")]\n" +
"\t\tprivate static extern int To{2} ({3} value, out {2} rval);\n" +
"\n" +
- "\t\t{0}public static bool TryTo{2} ({3} value, out {2} rval)\n" +
+ "\t\t{0}{4} static bool TryTo{2} ({3} value, out {2} rval)\n" +
"\t\t{{\n" +
"\t\t\treturn To{2} (value, out rval) == 0;\n" +
"\t\t}}\n" +
"\n" +
- "\t\t{0}public static {2} To{2} ({3} value)\n" +
+ "\t\t{0}{4} static {2} To{2} ({3} value)\n" +
"\t\t{{\n" +
"\t\t\t{2} rval;\n" +
"\t\t\tif (To{2} (value, out rval) == -1)\n" +
"\t\t\t\tThrowArgumentException (value);\n" +
"\t\t\treturn rval;\n" +
"\t\t}}\n",
- obsolete, ns, t.Name, mtype
+ obsolete, ns, t.Name, mtype, visibility
);
}
@@ -1571,6 +1573,8 @@ public override void WriteType (Type t, string ns, string fn)
{
if (!CanMapType (t) || !t.IsEnum)
return;
+ if ((t.Attributes & TypeAttributes.Public) == 0)
+ return;
bool bits = IsFlagsEnum (t);
@@ -1745,3 +1749,8 @@ public override void CloseFile (string file_prefix)
}
// vim: noexpandtab
+// Local Variables:
+// tab-width: 4
+// c-basic-offset: 4
+// indent-tabs-mode: t
+// End:
diff --git a/create-native-map/src/test.c.ref b/create-native-map/src/test.c.ref
index a494340..412a3fb 100644
--- a/create-native-map/src/test.c.ref
+++ b/create-native-map/src/test.c.ref
@@ -194,6 +194,36 @@
} G_STMT_END
#endif /* def DEBUG */
+#ifdef HAVE_STRUCT_CHILD
+int
+MakeMap_Test_FromChild (struct MakeMap_Test_Child *from, struct child *to)
+{
+ _cnm_return_val_if_overflow (int, from->j, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->j = from->j;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_CHILD */
+
+
+#ifdef HAVE_STRUCT_CHILD
+int
+MakeMap_Test_ToChild (struct child *from, struct MakeMap_Test_Child *to)
+{
+ _cnm_return_val_if_overflow (int, from->j, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->j = from->j;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_CHILD */
+
+
int MakeMap_Test_FromFlagsEnum (int x, int *r)
{
*r = 0;
@@ -432,6 +462,62 @@ MakeMap_Test_ToFooHolder (struct foo_holder *from, struct MakeMap_Test_FooHolder
#endif /* ndef HAVE_STRUCT_FOO_HOLDER */
+int MakeMap_Test_FromInternalEnum (gint64 x, gint64 *r)
+{
+ *r = 0;
+ if (x == MakeMap_Test_InternalEnum_Foo)
+#ifdef Foo
+ {*r = Foo; return 0;}
+#else /* def Foo */
+ {errno = EINVAL; return -1;}
+#endif /* ndef Foo */
+ if (x == 0)
+ return 0;
+ errno = EINVAL; return -1;
+}
+
+int MakeMap_Test_ToInternalEnum (gint64 x, gint64 *r)
+{
+ *r = 0;
+ if (x == 0)
+ return 0;
+#ifdef Foo
+ if (x == Foo)
+ {*r = MakeMap_Test_InternalEnum_Foo; return 0;}
+#endif /* ndef Foo */
+ errno = EINVAL; return -1;
+}
+
+#ifdef HAVE_STRUCT_PARENT
+int
+MakeMap_Test_FromParent (struct MakeMap_Test_Parent *from, struct parent *to)
+{
+ _cnm_return_val_if_overflow (int, from->i, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->i = from->i;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_PARENT */
+
+
+#ifdef HAVE_STRUCT_PARENT
+int
+MakeMap_Test_ToParent (struct parent *from, struct MakeMap_Test_Parent *to)
+{
+ _cnm_return_val_if_overflow (int, from->i, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->i = from->i;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_PARENT */
+
+
int MakeMap_Test_FromSimpleFlagsEnum (int x, int *r)
{
*r = 0;
diff --git a/create-native-map/src/test.cs.ref b/create-native-map/src/test.cs.ref
index 3723010..160fbe8 100644
--- a/create-native-map/src/test.cs.ref
+++ b/create-native-map/src/test.cs.ref
@@ -22,6 +22,22 @@ namespace Mono.Unix.Native {
Locale.GetText ("Current platform doesn't support this value."));
}
+ [DllImport (LIB, EntryPoint="MakeMap_Test_FromChild")]
+ private static extern int FromChild (Child source, IntPtr destination);
+
+ public static bool TryCopy (Child source, IntPtr destination)
+ {
+ return FromChild (source, destination) == 0;
+ }
+
+ [DllImport (LIB, EntryPoint="MakeMap_Test_ToChild")]
+ private static extern int ToChild (IntPtr source, Child destination);
+
+ public static bool TryCopy (IntPtr source, Child destination)
+ {
+ return ToChild (source, destination) == 0;
+ }
+
[DllImport (LIB, EntryPoint="MakeMap_Test_FromFlagsEnum")]
private static extern int FromFlagsEnum (FlagsEnum value, out Int32 rval);
@@ -86,6 +102,54 @@ namespace Mono.Unix.Native {
return ToFooHolder (source, out destination) == 0;
}
+ [DllImport (LIB, EntryPoint="MakeMap_Test_FromInternalEnum")]
+ private static extern int FromInternalEnum (InternalEnum value, out Int64 rval);
+
+ internal static bool TryFromInternalEnum (InternalEnum value, out Int64 rval)
+ {
+ return FromInternalEnum (value, out rval) == 0;
+ }
+
+ internal static Int64 FromInternalEnum (InternalEnum value)
+ {
+ Int64 rval;
+ if (FromInternalEnum (value, out rval) == -1)
+ ThrowArgumentException (value);
+ return rval;
+ }
+
+ [DllImport (LIB, EntryPoint="MakeMap_Test_ToInternalEnum")]
+ private static extern int ToInternalEnum (Int64 value, out InternalEnum rval);
+
+ internal static bool TryToInternalEnum (Int64 value, out InternalEnum rval)
+ {
+ return ToInternalEnum (value, out rval) == 0;
+ }
+
+ internal static InternalEnum ToInternalEnum (Int64 value)
+ {
+ InternalEnum rval;
+ if (ToInternalEnum (value, out rval) == -1)
+ ThrowArgumentException (value);
+ return rval;
+ }
+
+ [DllImport (LIB, EntryPoint="MakeMap_Test_FromParent")]
+ private static extern int FromParent (Parent source, IntPtr destination);
+
+ public static bool TryCopy (Parent source, IntPtr destination)
+ {
+ return FromParent (source, destination) == 0;
+ }
+
+ [DllImport (LIB, EntryPoint="MakeMap_Test_ToParent")]
+ private static extern int ToParent (IntPtr source, Parent destination);
+
+ public static bool TryCopy (IntPtr source, Parent destination)
+ {
+ return ToParent (source, destination) == 0;
+ }
+
[DllImport (LIB, EntryPoint="MakeMap_Test_FromSimpleFlagsEnum")]
private static extern int FromSimpleFlagsEnum (SimpleFlagsEnum value, out Int32 rval);
diff --git a/create-native-map/src/test.h.ref b/create-native-map/src/test.h.ref
index f45e838..34d2ef1 100644
--- a/create-native-map/src/test.h.ref
+++ b/create-native-map/src/test.h.ref
@@ -60,6 +60,13 @@ enum MakeMap_Test_FlagsEnum {
int MakeMap_Test_FromFlagsEnum (int x, int *r);
int MakeMap_Test_ToFlagsEnum (int x, int *r);
+enum MakeMap_Test_InternalEnum {
+ MakeMap_Test_InternalEnum_Foo = 0x0000000000000000,
+ #define MakeMap_Test_InternalEnum_Foo MakeMap_Test_InternalEnum_Foo
+};
+int MakeMap_Test_FromInternalEnum (gint64 x, gint64 *r);
+int MakeMap_Test_ToInternalEnum (gint64 x, gint64 *r);
+
enum MakeMap_Test_SimpleFlagsEnum {
MakeMap_Test_SimpleFlagsEnum_A = 0x00000001,
#define MakeMap_Test_SimpleFlagsEnum_A MakeMap_Test_SimpleFlagsEnum_A
@@ -105,9 +112,11 @@ int MakeMap_Rename_ToColors (int x, int *r);
*/
struct MakeMap_Test_Baz;
+struct MakeMap_Test_Child;
struct MakeMap_Test_Foo;
struct MakeMap_Test_FooHolder;
struct MakeMap_Test_ForDelegate;
+struct MakeMap_Test_Parent;
struct MakeMap_Test_Qux;
struct MakeMap_Rename_Stat;
@@ -115,8 +124,10 @@ struct MakeMap_Rename_Stat;
* Inferred Structure Declarations
*/
+struct child;
struct foo;
struct foo_holder;
+struct parent;
/*
* Delegate Declarations
@@ -147,6 +158,17 @@ struct MakeMap_Test_Baz {
DelRefArrayBaz b8;
};
+struct MakeMap_Test_Child {
+ int i;
+ int j;
+};
+
+int
+MakeMap_Test_FromChild (struct MakeMap_Test_Child* from, struct child *to);
+int
+MakeMap_Test_ToChild (struct child *from, struct MakeMap_Test_Child* to);
+
+
struct MakeMap_Test_Foo {
int foo;
void* p;
@@ -174,6 +196,16 @@ struct MakeMap_Test_ForDelegate {
int i;
};
+struct MakeMap_Test_Parent {
+ int i;
+};
+
+int
+MakeMap_Test_FromParent (struct MakeMap_Test_Parent* from, struct parent *to);
+int
+MakeMap_Test_ToParent (struct parent *from, struct MakeMap_Test_Parent* to);
+
+
struct MakeMap_Test_Qux {
int i;
struct MakeMap_Test_Baz* b;