Author: mkestner
Date: 2005-03-24 17:47:50 -0500 (Thu, 24 Mar 2005)
New Revision: 42241
Modified:
trunk/gtk-sharp/ChangeLog
trunk/gtk-sharp/generator/CallbackGen.cs
trunk/gtk-sharp/generator/ObjectGen.cs
trunk/gtk-sharp/glib/Object.cs
trunk/gtk-sharp/glib/ObjectManager.cs
Log:
2005-03-24 Mike Kestner <[EMAIL PROTECTED]>
* generator/CallbackGen.cs : don't create native delegates for nulls.
* generator/ObjectGen.cs : revamp the ObjectManager code.
* glib/Object.cs : use new ObjectManager.RegisterType overload.
* glib/ObjectManager.cs : rewrite to kill the lameass LoadWithPartial
hack and keep a GType to Type mapping for quicker lookup/activation.
Modified: trunk/gtk-sharp/ChangeLog
===================================================================
--- trunk/gtk-sharp/ChangeLog 2005-03-24 20:56:47 UTC (rev 42240)
+++ trunk/gtk-sharp/ChangeLog 2005-03-24 22:47:50 UTC (rev 42241)
@@ -1,3 +1,11 @@
+2005-03-24 Mike Kestner <[EMAIL PROTECTED]>
+
+ * generator/CallbackGen.cs : don't create native delegates for nulls.
+ * generator/ObjectGen.cs : revamp the ObjectManager code.
+ * glib/Object.cs : use new ObjectManager.RegisterType overload.
+ * glib/ObjectManager.cs : rewrite to kill the lameass LoadWithPartial
+ hack and keep a GType to Type mapping for quicker lookup/activation.
+
2005-03-23 Mike Kestner <[EMAIL PROTECTED]>
* gapi-cdecl-insert : a little perl script to insert modopts
Modified: trunk/gtk-sharp/generator/CallbackGen.cs
===================================================================
--- trunk/gtk-sharp/generator/CallbackGen.cs 2005-03-24 20:56:47 UTC (rev
42240)
+++ trunk/gtk-sharp/generator/CallbackGen.cs 2005-03-24 22:47:50 UTC (rev
42241)
@@ -144,12 +144,11 @@
sw.WriteLine ("\t\tinternal " + wrapper + "
NativeDelegate;");
sw.WriteLine ("\t\t" + NS + "." + Name + " managed;");
sw.WriteLine ();
-
sw.WriteLine ("\t\tpublic " + Name + "Wrapper (" + NS +
"." + Name + " managed)");
sw.WriteLine ("\t\t{");
-
- sw.WriteLine ("\t\t\tNativeDelegate = new " + wrapper +
" (NativeCallback);");
sw.WriteLine ("\t\t\tthis.managed = managed;");
+ sw.WriteLine ("\t\t\tif (managed != null)");
+ sw.WriteLine ("\t\t\t\tNativeDelegate = new " + wrapper
+ " (NativeCallback);");
sw.WriteLine ("\t\t}");
sw.WriteLine ("\t}");
sw.WriteLine ("#endregion");
Modified: trunk/gtk-sharp/generator/ObjectGen.cs
===================================================================
--- trunk/gtk-sharp/generator/ObjectGen.cs 2005-03-24 20:56:47 UTC (rev
42240)
+++ trunk/gtk-sharp/generator/ObjectGen.cs 2005-03-24 22:47:50 UTC (rev
42241)
@@ -117,7 +117,6 @@
public override void Generate (GenerationInfo gen_info)
{
DirectoryInfo di = GetDirectoryInfo (gen_info.Dir,
gen_info.AssemblyName);
- di.objects.Add (CName, QualifiedName);
StreamWriter sw = gen_info.Writer = gen_info.OpenStream
(Name);
@@ -135,8 +134,10 @@
sw.WriteLine ("\t[Obsolete]");
sw.Write ("\tpublic {0} class " + Name, IsAbstract ?
"abstract" : "");
string cs_parent =
table.GetCSType(Elem.GetAttribute("parent"));
- if (cs_parent != "")
+ if (cs_parent != "") {
+ di.objects.Add (CName, QualifiedName);
sw.Write (" : " + cs_parent);
+ }
if (interfaces != null) {
foreach (string iface in interfaces) {
if (Parent != null && Parent.Implements
(iface))
@@ -204,7 +205,7 @@
sw.WriteLine (" {\n\t\t\t get { return \"" +
str.GetAttribute ("value") + "\"; }\n\t\t}");
}
- if (GetExpected (CName) != (QualifiedName + "," +
gen_info.AssemblyName)) {
+ if (cs_parent != String.Empty && GetExpected (CName) !=
QualifiedName) {
sw.WriteLine ();
sw.WriteLine ("\t\tstatic " + Name + " ()");
sw.WriteLine ("\t\t{");
@@ -321,32 +322,22 @@
/* Keep this in sync with the one in glib/ObjectManager.cs */
private static string GetExpected (string cname)
{
- StringBuilder expected = new StringBuilder ();
- string ns = "";
- bool needs_dot = true;
- for (int i = 0; i < cname.Length; i++)
- {
- if (needs_dot && i > 0 && Char.IsUpper
(cname[i])) {
- if (expected.Length == 1 && expected[0]
== 'G') {
- ns = "glib";
- expected = new StringBuilder
("GLib.");
- } else {
- ns = expected.ToString
().ToLower ();
- expected.Append ('.');
- }
- needs_dot = false;
+ for (int i = 1; i < cname.Length; i++) {
+ if (Char.IsUpper (cname[i])) {
+ if (i == 1 && cname[0] == 'G')
+ return "GLib." +
cname.Substring (1);
+ else
+ return cname.Substring (0, i) +
"." + cname.Substring (i);
}
- expected.Append (cname[i]);
}
- expected.AppendFormat (",{0}-sharp", ns);
- return expected.ToString ();
+ throw new ArgumentException ("cname doesn't follow the
NamespaceType capitalization style: " + cname);
}
private static bool NeedsMap (Hashtable objs, string
assembly_name)
{
foreach (string key in objs.Keys)
- if (GetExpected (key) != ((string) objs[key] +
"," + assembly_name))
+ if (GetExpected (key) != ((string) objs[key]))
return true;
return false;
@@ -396,8 +387,8 @@
sw.WriteLine ("\t\t\tinitialized = true;");
foreach (string key in dir_info.objects.Keys) {
- if (GetExpected(key) != ((string)
dir_info.objects[key] + "," + dir_info.assembly_name))
- sw.WriteLine
("\t\t\tGLib.ObjectManager.RegisterType(\"" + key + "\", \"" + dir_info.objects
[key] + "," + dir_info.assembly_name + "\");");
+ if (GetExpected(key) != ((string)
dir_info.objects[key]))
+ sw.WriteLine
("\t\t\tGLib.ObjectManager.RegisterType({0}.GType, typeof ({0}));",
dir_info.objects [key]);
}
sw.WriteLine ("\t\t}");
Modified: trunk/gtk-sharp/glib/Object.cs
===================================================================
--- trunk/gtk-sharp/glib/Object.cs 2005-03-24 20:56:47 UTC (rev 42240)
+++ trunk/gtk-sharp/glib/Object.cs 2005-03-24 22:47:50 UTC (rev 42241)
@@ -153,10 +153,10 @@
{
GType parent_gtype = LookupGType (t.BaseType);
string name = t.FullName.Replace(".", "_");
- GLib.ObjectManager.RegisterType (name, t.FullName,
t.Assembly.GetName().Name);
IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup
(name);
GType gtype = new GType (gtksharp_register_type
(native_name, parent_gtype.Val));
GLib.Marshaller.Free (native_name);
+ GLib.ObjectManager.RegisterType (gtype, t);
ConnectDefaultHandlers (gtype, t);
InvokeClassInitializers (gtype, t);
g_types[t] = gtype;
Modified: trunk/gtk-sharp/glib/ObjectManager.cs
===================================================================
--- trunk/gtk-sharp/glib/ObjectManager.cs 2005-03-24 20:56:47 UTC (rev
42240)
+++ trunk/gtk-sharp/glib/ObjectManager.cs 2005-03-24 22:47:50 UTC (rev
42241)
@@ -3,7 +3,7 @@
// Author: Mike Kestner <[EMAIL PROTECTED]>
//
// Copyright <c> 2001-2002 Mike Kestner
-// Copyright <c> 2004 Novell, Inc.
+// Copyright <c> 2004-2005 Novell, Inc.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the Lesser GNU General
@@ -32,125 +32,97 @@
private static Hashtable types = new Hashtable ();
- [DllImport("glibsharpglue-2")]
- static extern IntPtr gtksharp_get_type_name (IntPtr raw);
+ static BindingFlags flags = BindingFlags.NonPublic |
BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance;
public static GLib.Object CreateObject (IntPtr raw)
{
if (raw == IntPtr.Zero)
return null;
- string typename = Marshaller.Utf8PtrToString
(gtksharp_get_type_name (raw));
- string mangled;
- if (types.ContainsKey(typename))
- mangled = (string)types[typename];
- else
- mangled = GetExpected (typename);
- Type t = LookupType (mangled);
+ Type type = GetTypeOrParent (raw);
- // if null, try to get a parent type
- if (t == null)
- t = GetValidParentType (raw);
-
- if (t == null) {
- // should never get reached since everything
should end up at
- // GObject. Perhaps throw an exception here
instead?
- Console.WriteLine ("*** Warning: No C#
equivalent for class '" + typename +
- "' found, returning null");
+ if (type == null)
return null;
- }
GLib.Object obj;
try {
- obj = (GLib.Object) Activator.CreateInstance
(t,BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.CreateInstance, null, new object[] {raw}, null);
+ obj = Activator.CreateInstance (type, flags,
null, new object[] {raw}, null) as GLib.Object;
} catch (MissingMethodException) {
- throw new GLib.MissingIntPtrCtorException
("GLib.Object subclass " + t + " must provide a protected or public IntPtr ctor
to support wrapping of native object handles.");
+ throw new GLib.MissingIntPtrCtorException
("GLib.Object subclass " + type + " must provide a protected or public IntPtr
ctor to support wrapping of native object handles.");
}
return obj;
}
+ [Obsolete ("Use the (GType, Type) overload instead")]
public static void RegisterType (string native_name, string
managed_name, string assembly)
{
RegisterType (native_name, managed_name + "," +
assembly);
}
+ [Obsolete ("Use the (GType, Type) overload instead")]
public static void RegisterType (string native_name, string
mangled)
{
types [native_name] = mangled;
}
- static string GetExpected (string cname)
+ public static void RegisterType (GType native_type, System.Type
type)
{
- StringBuilder expected = new StringBuilder ();
- string ns = "";
- bool needs_dot = true;
- for (int i = 0; i < cname.Length; i++)
- {
- if (needs_dot && i > 0 && Char.IsUpper
(cname[i])) {
- // check for initial "G" and mangle to
"GLib" if so
- // really only necessary for GObject
- if (expected.Length == 1 && expected[0]
== 'G') {
- ns = "glib";
- expected = new StringBuilder
("GLib.");
- } else {
- ns = expected.ToString
().ToLower ();
- expected.Append ('.');
- }
- needs_dot = false;
+ types [native_type.Val] = type;
+ }
+
+ static string GetQualifiedName (string cname)
+ {
+ for (int i = 1; i < cname.Length; i++) {
+ if (Char.IsUpper (cname[i])) {
+ if (i == 1 && cname [0] == 'G')
+ return "GLib." +
cname.Substring (1);
+ else
+ return cname.Substring (0, i) +
"." + cname.Substring (i);
}
- expected.Append (cname[i]);
}
- expected.AppendFormat (",{0}-sharp", ns);
- string expected_string = expected.ToString ();
- RegisterType (cname, expected_string);
- return expected_string;
+ throw new ArgumentException ("cname is not in
NamespaceType format. RegisterType should be called directly for " + cname);
}
- [DllImport("glibsharpglue-2")]
- static extern int gtksharp_get_type_id (IntPtr raw);
-
- [DllImport("glibsharpglue-2")]
- static extern int gtksharp_get_parent_type (int typ);
-
- [DllImport("glibsharpglue-2")]
- static extern IntPtr gtksharp_get_type_name_for_id (int typ);
-
- static Type LookupType (string mangled)
+ static Type GetTypeOrParent (IntPtr obj)
{
- string[] toks = mangled.Split (',');
- if (toks.Length < 2)
- throw new ArgumentException ("mangled not
properly formatted: " + mangled);
+ IntPtr typeid = gtksharp_get_type_id (obj);
- Assembly a = Assembly.LoadWithPartialName (toks [1]);
-
- if (a == null)
- return null;
-
- return a.GetType (toks [0]);
+ Type result = LookupType (typeid);
+ while (result == null) {
+ typeid = gtksharp_get_parent_type (typeid);
+ if (typeid == IntPtr.Zero)
+ return null;
+ result = LookupType (typeid);
+ }
+ return result;
}
- static Type GetValidParentType (IntPtr raw)
+ static Type LookupType (IntPtr typeid)
{
- int type_id = gtksharp_get_type_id (raw);
- string typename;
- string mangled;
- Type t;
- // We will always end up at GObject and will break this
loop
- while (true) {
- type_id = gtksharp_get_parent_type (type_id);
- if (type_id == 0)
- return null;
- typename = Marshaller.Utf8PtrToString
(gtksharp_get_type_name_for_id (type_id));
- if (types.ContainsKey (typename))
- mangled = (string)types[typename];
- else
- mangled = GetExpected (typename);
- t = LookupType (mangled);
- if (t != null) {
- return t;
- }
+ if (types.Contains (typeid))
+ return types [typeid] as Type;
+
+ string native_name = Marshaller.Utf8PtrToString
(gtksharp_get_type_name_for_id (typeid));
+ string type_name = GetQualifiedName (native_name);
+ Type result = null;
+ foreach (Assembly asm in
AppDomain.CurrentDomain.GetAssemblies ()) {
+ result = asm.GetType (type_name);
+ if (result != null)
+ break;
}
+
+ types [typeid] = result;
+ return result;
}
+
+ [DllImport("glibsharpglue-2")]
+ static extern IntPtr gtksharp_get_type_id (IntPtr raw);
+
+ [DllImport("glibsharpglue-2")]
+ static extern IntPtr gtksharp_get_parent_type (IntPtr typ);
+
+ [DllImport("glibsharpglue-2")]
+ static extern IntPtr gtksharp_get_type_name_for_id (IntPtr typ);
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches