From f61ac5c89cda860082a85910f668212793a28331 Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Wed, 3 Dec 2003 23:08:14 +0000 Subject: [PATCH] 2003-12-03 Mike Kestner * generator/CallbackGen.cs : use new sig and isig classes. * generator/Ctor.cs : use new sig, isig, and body classes. * generator/ImportSignature.cs : isig code spun out from Parameters. * generator/Method.cs : use new sig, isig, and body classes. * generator/MethodBody.cs : spun Initialize, GetCallString, Finish, and Exception throwing methods from Parameters. * generator/Parameters.cs : Slayed the evilness that was CreateSignature. It is now essentially a container for Parameter classes instead of a tangled mess of code trying to do everything remotely related to parameter lists. Also completely killed the VAType/IsVarArgs stuff, as it can be done with the array and params attrs instead. * generator/Property.cs : use new sig class. * generator/Signature.cs : new method sig generator extracted from Parameters class. add "params" keyword support for tagged parameters. * gnome/Gnome.metadata : hide IconList.GetSearchPath (to be manual) * gnome/gnome-api.xml : regen * gtk/ListStore.custom : kill unneeded overload * gtk/TreeStore.custom : kill unneeded overload * gtk/Gtk.metadata : mark params/args on *store_newv * gtk/gtk-api.xml : regenerated svn path=/trunk/gtk-sharp/; revision=20755 --- ChangeLog | 27 +++- generator/CallbackGen.cs | 32 ++--- generator/Ctor.cs | 58 +++----- generator/ImportSignature.cs | 55 ++++++++ generator/Method.cs | 125 ++++++++--------- generator/MethodBody.cs | 179 ++++++++++++++++++++++++ generator/Parameters.cs | 254 ++++------------------------------- generator/Property.cs | 4 +- generator/Signature.cs | 75 +++++++++++ gnome/Gnome.metadata | 1 + gnome/gnome-api.xml | 2 +- gtk/Gtk.metadata | 6 +- gtk/ListStore.custom | 5 - gtk/TreeStore.custom | 5 - gtk/gtk-api.xml | 8 +- 15 files changed, 458 insertions(+), 378 deletions(-) create mode 100644 generator/ImportSignature.cs create mode 100644 generator/MethodBody.cs create mode 100644 generator/Signature.cs diff --git a/ChangeLog b/ChangeLog index e4d78efb8..7e58c1677 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,32 @@ +2003-12-03 Mike Kestner + + * generator/CallbackGen.cs : use new sig and isig classes. + * generator/Ctor.cs : use new sig, isig, and body classes. + * generator/ImportSignature.cs : isig code spun out from Parameters. + * generator/Method.cs : use new sig, isig, and body classes. + * generator/MethodBody.cs : spun Initialize, GetCallString, + Finish, and Exception throwing methods from Parameters. + * generator/Parameters.cs : Slayed the evilness that was CreateSignature. + It is now essentially a container for Parameter classes instead of a + tangled mess of code trying to do everything remotely related to + parameter lists. Also completely killed the VAType/IsVarArgs stuff, + as it can be done with the array and params attrs instead. + * generator/Property.cs : use new sig class. + * generator/Signature.cs : new method sig generator extracted from + Parameters class. add "params" keyword support for tagged parameters. + * gnome/Gnome.metadata : hide IconList.GetSearchPath (to be manual) + * gnome/gnome-api.xml : regen + * gtk/ListStore.custom : kill unneeded overload + * gtk/TreeStore.custom : kill unneeded overload + * gtk/Gtk.metadata : mark params/args on *store_newv + * gtk/gtk-api.xml : regenerated + 2003-12-03 Ettore Perazzoli * sample/TestDnd.cs: New. - * gtk/TargetEntry.custom: New. - * glue/dragcontext.c: New. - * glib/Object.cs: New public property TypeName in class Object. - * gdk/DragContext.custom: New. 2003-11-30 Mike Kestner diff --git a/generator/CallbackGen.cs b/generator/CallbackGen.cs index 288ac5dde..a563c95c9 100644 --- a/generator/CallbackGen.cs +++ b/generator/CallbackGen.cs @@ -13,11 +13,15 @@ namespace GtkSharp.Generation { public class CallbackGen : GenBase, IGeneratable { private Parameters parms; + private Signature sig = null; + private ImportSignature isig = null; public CallbackGen (XmlElement ns, XmlElement elem) : base (ns, elem) { - if (elem ["parameters"] != null) + if (elem ["parameters"] != null) { parms = new Parameters (elem ["parameters"], NS); + parms.HideData = true; + } } public string MarshalType { @@ -59,6 +63,8 @@ namespace GtkSharp.Generation { string wrapper = Name + "Native"; string qualname = ns + "Sharp." + wrapper; + isig = new ImportSignature (parms, NS); + StreamWriter sw = gen_info.OpenStream (qualname); sw.WriteLine ("namespace " + ns + "Sharp {"); @@ -67,15 +73,6 @@ namespace GtkSharp.Generation { sw.WriteLine (); sw.WriteLine ("#region Autogenerated code"); - string import_sig = ""; - string sig = ""; - if (parms != null) - { - parms.HideData = true; - parms.CreateSignature (false); - import_sig = parms.ImportSig; - sig = parms.Signature; - } SymbolTable table = SymbolTable.Table; @@ -85,7 +82,7 @@ namespace GtkSharp.Generation { string s_ret = table.GetCSType (rettype); ClassBase ret_wrapper = table.GetClassGen (rettype); - sw.WriteLine ("\tinternal delegate " + m_ret + " " + wrapper + "(" + import_sig + ");"); + sw.WriteLine ("\tinternal delegate " + m_ret + " " + wrapper + "(" + isig.ToString() + ");"); sw.WriteLine (); sw.WriteLine ("\tinternal class " + Name + "Wrapper : GLib.DelegateWrapper {"); @@ -100,7 +97,7 @@ namespace GtkSharp.Generation { } sw.WriteLine (); - sw.WriteLine ("\t\tpublic " + m_ret + " NativeCallback (" + import_sig + ")"); + sw.WriteLine ("\t\tpublic " + m_ret + " NativeCallback (" + isig.ToString() + ")"); sw.WriteLine ("\t\t{"); int count = (parms != null) ? parms.Count : 0; @@ -220,20 +217,15 @@ namespace GtkSharp.Generation { parms = null; } - StreamWriter sw = gen_info.OpenStream (Name); + sig = new Signature (parms); - string sig = ""; - if (parms != null) { - parms.HideData = true; - parms.CreateSignature (false); - sig = parms.Signature; - } + StreamWriter sw = gen_info.OpenStream (Name); sw.WriteLine ("namespace " + NS + " {"); sw.WriteLine (); sw.WriteLine ("\tusing System;"); sw.WriteLine (); - sw.WriteLine ("\tpublic delegate " + s_ret + " " + Name + "(" + sig + ");"); + sw.WriteLine ("\tpublic delegate " + s_ret + " " + Name + "(" + sig.ToString() + ");"); sw.WriteLine (); sw.WriteLine ("}"); diff --git a/generator/Ctor.cs b/generator/Ctor.cs index 0e7924c8d..69efe69c1 100644 --- a/generator/Ctor.cs +++ b/generator/Ctor.cs @@ -16,6 +16,9 @@ namespace GtkSharp.Generation { private string libname; private XmlElement elem; private Parameters parms; + private Signature sig = null; + private ImportSignature isig = null; + private MethodBody body = null; private bool preferred; private String clashName = null; private ClassBase container_type; @@ -54,68 +57,53 @@ namespace GtkSharp.Generation { Statistics.ThrottledCount++; return false; } - parms.CreateSignature (false); } + sig = new Signature (parms); + isig = new ImportSignature (parms, container_type.NS); + body = new MethodBody (parms, container_type.NS); return true; } public void InitClashMap (Hashtable clash_map) { - string sigtypes = (parms != null) ? parms.SignatureTypes : ""; - if (clash_map.ContainsKey (sigtypes)) { - int num = (int) clash_map[sigtypes]; - clash_map[sigtypes] = ++num; + if (clash_map.ContainsKey (sig.Types)) { + int num = (int) clash_map[sig.Types]; + clash_map[sig.Types] = ++num; } else - clash_map[sigtypes] = 0; + clash_map[sig.Types] = 0; } public void Initialize (Hashtable clash_map) { - string sig = "()"; - string sigtypes = ""; - if (parms != null) { - sig = "(" + parms.Signature + ")"; - sigtypes = parms.SignatureTypes; - } - int clashes = (int) clash_map[sigtypes]; + int clashes = (int) clash_map[sig.Types]; string cname = elem.GetAttribute("cname"); if (force_static || (clashes > 0 && !Preferred)) { - String mname = cname.Substring(cname.IndexOf("new")); + string mname = cname.Substring(cname.IndexOf("new")); mname = mname.Substring(0,1).ToUpper() + mname.Substring(1); int idx; while ((idx = mname.IndexOf("_")) > 0) { mname = mname.Substring(0, idx) + mname.Substring(idx+1, 1).ToUpper() + mname.Substring(idx+2); } - clashName = mname + sig; + clashName = mname + "(" + sig.ToString () + ")"; } } public void Generate (GenerationInfo gen_info) { StreamWriter sw = gen_info.Writer; - string sigtypes = ""; - string sig = "()"; - string call = "()"; - string isig = "();"; - if (parms != null) { - call = "(" + parms.CallString + ")"; - sig = "(" + parms.Signature + ")"; - isig = "(" + parms.ImportSig + ");"; - sigtypes = parms.SignatureTypes; - } string cname = elem.GetAttribute("cname"); string name = ((XmlElement)elem.ParentNode).GetAttribute("name"); string safety; - if (parms != null && parms.ThrowsException) + if (body.ThrowsException) safety = "unsafe "; else safety = ""; sw.WriteLine("\t\t[DllImport(\"" + libname + "\")]"); - sw.WriteLine("\t\tstatic extern " + safety + "IntPtr " + cname + isig); + sw.WriteLine("\t\tstatic extern " + safety + "IntPtr " + cname + "(" + isig.ToString () + ");"); sw.WriteLine(); if (clashName != null) { @@ -136,25 +124,21 @@ namespace GtkSharp.Generation { sw.WriteLine("\t\tpublic static " + safety + modifiers + name + " " + clashName); sw.WriteLine("\t\t{"); - if (parms != null) - parms.Initialize(gen_info, false, false, ""); + body.Initialize(gen_info, false, false, ""); sw.Write("\t\t\treturn "); if (container_type is StructBase) sw.Write ("{0}.New (", name); else sw.Write ("new {0} (", name); - sw.WriteLine (cname + call + ");"); + sw.WriteLine (cname + "(" + body.GetCallString (false) + "));"); } else { - sw.WriteLine("\t\tpublic " + safety + name + sig); + sw.WriteLine("\t\tpublic " + safety + name + "(" + sig.ToString() + ")"); sw.WriteLine("\t\t{"); - if (parms != null) - parms.Initialize(gen_info, false, false, ""); - sw.WriteLine("\t\t\t{0} = {1}{2};", container_type.AssignToName, cname, call); - if (parms != null) - parms.HandleException (sw, ""); - + body.Initialize(gen_info, false, false, ""); + sw.WriteLine("\t\t\t{0} = {1}({2});", container_type.AssignToName, cname, body.GetCallString (false)); + body.HandleException (sw, ""); } sw.WriteLine("\t\t}"); diff --git a/generator/ImportSignature.cs b/generator/ImportSignature.cs new file mode 100644 index 000000000..ff7a51f95 --- /dev/null +++ b/generator/ImportSignature.cs @@ -0,0 +1,55 @@ +// GtkSharp.Generation.ImportSignature.cs - The ImportSignature Generation Class. +// +// Author: Mike Kestner +// +// (c) 2001-2003 Mike Kestner, (c) 2003 Novell, Inc. + +namespace GtkSharp.Generation { + + using System; + using System.Collections; + + public class ImportSignature { + + Parameters parameters; + string impl_ns; + + public ImportSignature (Parameters parms, string impl_ns) + { + parameters = parms; + this.impl_ns = impl_ns; + } + + private bool UsesHandle (IGeneratable igen) + { + return igen is ManualGen || igen is ObjectGen || igen is InterfaceGen || igen is OpaqueGen; + } + + public override string ToString () + { + if (parameters == null) + return ""; + + string[] parms = new string [parameters.Count]; + for (int i = 0; i < parameters.Count; i++) { + Parameter p = parameters [i]; + string m_type = p.MarshalType; + if (p.Generatable is CallbackGen) + m_type = impl_ns + "Sharp" + p.MarshalType.Substring(p.MarshalType.IndexOf(".")); + + parms [i] = ""; + if (p.CType == "GError**") + parms [i] += "out "; + else if (p.PassAs != "" && (!m_type.EndsWith ("IntPtr") || UsesHandle (p.Generatable))) + parms [i] += p.PassAs + " "; + parms [i] += m_type + " " + p.Name; + } + + string import_sig = String.Join (", ", parms); + import_sig = import_sig.Replace ("out ref", "out"); + import_sig = import_sig.Replace ("ref ref", "ref"); + return import_sig; + } + } +} + diff --git a/generator/Method.cs b/generator/Method.cs index a245057d9..c3fdd989a 100644 --- a/generator/Method.cs +++ b/generator/Method.cs @@ -2,7 +2,7 @@ // // Author: Mike Kestner // -// (c) 2001-2002 Mike Kestner +// (c) 2001-2003 Mike Kestner, (c) 2003 Novell, Inc. namespace GtkSharp.Generation { @@ -16,10 +16,13 @@ namespace GtkSharp.Generation { private string libname; private XmlElement elem; private Parameters parms; + private Signature sig; + private ImportSignature isig; + private MethodBody body; private ClassBase container_type; private bool initialized = false; - private string sig, isig, call; + private string call; private string rettype, m_ret, s_ret; private string element_type = null; private string name, cname, safety; @@ -30,13 +33,13 @@ namespace GtkSharp.Generation { public Method (string libname, XmlElement elem, ClassBase container_type) { this.elem = elem; - if (elem["parameters"] != null) + if (elem["parameters"] != null) { parms = new Parameters (elem["parameters"], container_type.NS); + } this.container_type = container_type; this.name = elem.GetAttribute("name"); if (name == "GetType") name = "GetGType"; - // override library - used in pixbuf API fixage if (elem.HasAttribute ("library")) this.libname = elem.GetAttribute ("library"); else @@ -59,6 +62,12 @@ namespace GtkSharp.Generation { } } + private bool IsShared { + get { + return elem.HasAttribute("shared"); + } + } + public string Name { get { return name; @@ -68,12 +77,6 @@ namespace GtkSharp.Generation { } } - public Parameters Params { - get { - return parms; - } - } - public string Protection { get { return protection; @@ -89,48 +92,31 @@ namespace GtkSharp.Generation { } } + public Signature Signature { + get { + return sig; + } + } + public override bool Equals (object o) { if (!(o is Method)) return false; -/* - return (this == (Method) o); - } - - public static bool operator == (Method a, Method b) - { - if (a == null) - return (b -*/ Method a = this; Method b = (Method) o; + if (a.Name != b.Name) return false; - if (a.Params == null) - return b.Params == null; + if (a.Signature == null) + return b.Signature == null; - if (b.Params == null) + if (b.Signature == null) return false; - return (a.Params.SignatureTypes == b.Params.SignatureTypes); + return (a.Signature.Types == b.Signature.Types); } -/* - public static bool operator != (Method a, Method b) - { - return !( - if (a.Name == b.Name) - return false; - if (a.Params == null) - return b.Params != null; - - if (b.Params == null) - return true; - - return (a.Params.SignatureTypes != b.Params.SignatureTypes); - } -*/ private bool Initialize () { if (initialized) @@ -156,32 +142,27 @@ namespace GtkSharp.Generation { cname = elem.GetAttribute("cname"); if (ret_elem.HasAttribute("element_type")) element_type = ret_elem.GetAttribute("element_type"); - bool is_shared = elem.HasAttribute("shared"); if (ret_elem.HasAttribute("array")) { s_ret += "[]"; m_ret += "[]"; } - if (parms != null && parms.ThrowsException) - safety = "unsafe "; - else - safety = ""; - is_get = (((parms != null && ((parms.IsAccessor && s_ret == "void") || (parms.Count == 0 && s_ret != "void"))) || (parms == null && s_ret != "void")) && Name.Length > 3 && (Name.StartsWith ("Get") || Name.StartsWith ("Is") || Name.StartsWith ("Has"))); is_set = ((parms != null && (parms.IsAccessor || (parms.Count == 1 && s_ret == "void"))) && (Name.Length > 3 && Name.Substring(0, 3) == "Set")); - if (parms != null) { - parms.Static = is_shared; - parms.CreateSignature (is_set); - sig = "(" + parms.Signature + ")"; - isig = "(" + (is_shared ? "" : container_type.MarshalType + " raw, ") + parms.ImportSig + ");"; - call = "(" + (is_shared ? "" : container_type.CallByName () + ", ") + parms.CallString + ")"; - } else { - sig = "()"; - isig = "(" + (is_shared ? "" : container_type.MarshalType + " raw") + ");"; - call = "(" + (is_shared ? "" : container_type.CallByName ()) + ")"; - } + if (parms != null) + parms.Static = IsShared; + + sig = new Signature (parms); + isig = new ImportSignature (parms, container_type.NS); + body = new MethodBody (parms, container_type.NS); + call = "(" + (IsShared ? "" : container_type.CallByName () + (parms != null ? ", " : "")) + body.GetCallString (is_set) + ")"; + + if (body.ThrowsException) + safety = "unsafe "; + else + safety = ""; initialized = true; return true; @@ -217,16 +198,17 @@ namespace GtkSharp.Generation { sw.Write("static "); sw.Write(safety); Method dup = null; - if (Name == "ToString" && Params == null) + if (container_type != null) + dup = container_type.GetMethodRecursively (Name); + if (implementor != null) + dup = implementor.GetMethodRecursively (Name); + + if (Name == "ToString" && parms == null) sw.Write("override "); else if (Name == "GetGType" && container_type is ObjectGen) sw.Write("new "); - else if (elem.HasAttribute("new_flag") || (container_type != null && (dup = container_type.GetMethodRecursively (Name)) != null) || (implementor != null && (dup = implementor.GetMethodRecursively (Name)) != null)) { - if (dup != null && dup.parms != null) - dup.parms.CreateSignature (false); - if (elem.HasAttribute("new_flag") || (dup != null && ((dup.parms != null && dup.parms.Signature == parms.Signature) || (dup.parms == null && parms == null)))) - sw.Write("new "); - } + else if (elem.HasAttribute("new_flag") || (dup != null && dup.Initialize () && ((dup.Signature != null && sig != null && dup.Signature.ToString() == sig.ToString()) || (dup.Signature == null && sig == null)))) + sw.Write("new "); if (is_get || is_set) { if (s_ret == "void") @@ -239,7 +221,7 @@ namespace GtkSharp.Generation { sw.Write (Name); sw.WriteLine(" { "); } else { - sw.Write(s_ret + " " + Name + sig); + sw.Write(s_ret + " " + Name + "(" + (sig != null ? sig.ToString() : "") + ")"); } } @@ -282,8 +264,11 @@ namespace GtkSharp.Generation { public void GenerateImport (StreamWriter sw) { + string import_sig = IsShared ? "" : container_type.MarshalType + " raw"; + import_sig += !IsShared && parms != null ? ", " : ""; + import_sig += isig.ToString(); sw.WriteLine("\t\t[DllImport(\"" + libname + "\")]"); - sw.WriteLine("\t\tstatic extern " + safety + m_ret + " " + cname + isig); + sw.WriteLine("\t\tstatic extern " + safety + m_ret + " " + cname + "(" + import_sig + ");"); sw.WriteLine(); } @@ -308,8 +293,7 @@ namespace GtkSharp.Generation { if (comp != null && is_set && parms.AccessorReturnType != comp.s_ret) { is_set = false; - parms.CreateSignature (false); - call = "(Handle, " + parms.CallString + ")"; + call = "(Handle, " + body.GetCallString (false) + ")"; comp = null; } /* some setters take more than one arg */ @@ -358,8 +342,7 @@ namespace GtkSharp.Generation { { StreamWriter sw = gen_info.Writer; sw.WriteLine(" {"); - if (parms != null) - parms.Initialize(gen_info, is_get, is_set, indent); + body.Initialize(gen_info, is_get, is_set, indent); SymbolTable table = SymbolTable.Table; @@ -388,10 +371,8 @@ namespace GtkSharp.Generation { } } - if (parms != null) { - parms.Finish (sw, indent); - parms.HandleException (sw, indent); - } + body.Finish (sw, indent); + body.HandleException (sw, indent); if (is_get && parms != null) sw.WriteLine (indent + "\t\t\treturn " + parms.AccessorName + ";"); diff --git a/generator/MethodBody.cs b/generator/MethodBody.cs new file mode 100644 index 000000000..33505ec74 --- /dev/null +++ b/generator/MethodBody.cs @@ -0,0 +1,179 @@ +// GtkSharp.Generation.MethodBody.cs - The MethodBody Generation Class. +// +// Author: Mike Kestner +// +// (c) 2001-2003 Mike Kestner, (c) 2003 Novell, Inc. + +namespace GtkSharp.Generation { + + using System; + using System.Collections; + using System.IO; + + public class MethodBody { + + Parameters parameters; + private string impl_ns; + + public MethodBody (Parameters parms, string impl_ns) { + + parameters = parms; + this.impl_ns = impl_ns; + } + + private bool UsesHandle (IGeneratable igen) + { + return igen is ManualGen || igen is ObjectGen || igen is InterfaceGen || igen is OpaqueGen; + } + + private string CastFromInt (string type) + { + return type != "int" ? "(" + type + ") " : ""; + } + + private string CallArrayLength (Parameter array, Parameter length) + { + string result = array.NullOk ? array.Name + " != null ? " : ""; + result += CastFromInt (length.CSType) + array.Name + ".Length"; + result += array.NullOk ? ": 0" : ""; + return result; + } + + public string GetCallString (bool is_set) + { + if (parameters == null) + return ""; + + string[] result = new string [parameters.Count]; + for (int i = 0; i < parameters.Count; i++) { + Parameter p = parameters [i]; + IGeneratable igen = p.Generatable; + + if (p.IsCount) { + if (i > 0 && parameters [i - 1].IsArray) { + result[i] = CallArrayLength (parameters[i - 1], p); + continue; + } else if (i < parameters.Count - 1 && parameters [i + 1].IsArray) { + result[i] = CallArrayLength (parameters[i + 1], p); + continue; + } + } + + if (i > 0 && parameters [i - 1].IsString && p.IsLength) { + result[i] = CastFromInt (p.CSType) + parameters [i - 1].Name + ".Length"; + continue; + } + + string call_parm = p.CallByName (is_set && i == 0 ? "value" : p.Name); + + if (p.CType == "GError**") { + result [i] += "out "; + } else if (p.PassAs != "") { + if (!p.MarshalType.EndsWith ("IntPtr")) + result [i] += p.PassAs + " "; + + if (igen is EnumGen) + call_parm = p.Name + "_as_int"; + else if (UsesHandle (igen) || p.CSType == "GLib.Value") { + call_parm = p.PassAs + " " + call_parm.Replace (".Handle", "_handle"); + } + } + + if (p.CType == "GError**") { + call_parm = call_parm.Replace (p.Name, "error"); + } else if (p.IsUserData && !parameters.HideData && (i == parameters.Count - 1)) { + call_parm = "IntPtr.Zero"; + } + + result [i] += call_parm; + } + + string call_string = String.Join (", ", result); + call_string = call_string.Replace ("out ref", "out"); + call_string = call_string.Replace ("ref ref", "ref"); + return call_string; + } + + public void Initialize (GenerationInfo gen_info, bool is_get, bool is_set, string indent) + { + if (parameters == null) + return; + + StreamWriter sw = gen_info.Writer; + for (int i = 0; i < parameters.Count; i++) { + Parameter p = parameters [i]; + + IGeneratable gen = p.Generatable; + string name = p.Name; + if (is_set) + name = "value"; + + if (is_get) { + sw.WriteLine (indent + "\t\t\t" + p.CSType + " " + name + ";"); + if (gen is ObjectGen || gen is OpaqueGen || p.CSType == "GLib.Value") + sw.WriteLine(indent + "\t\t\t" + name + " = new " + p.CSType + "();"); + } + + if ((is_get || p.PassAs == "out") && (UsesHandle (gen) || p.CSType == "GLib.Value")) + sw.WriteLine(indent + "\t\t\tIntPtr " + name + "_handle;"); + + if (p.PassAs == "out" && gen is EnumGen) + sw.WriteLine(indent + "\t\t\tint " + name + "_as_int;"); + + if (gen is CallbackGen) { + CallbackGen cbgen = gen as CallbackGen; + string wrapper = cbgen.GenWrapper(impl_ns, gen_info); + sw.WriteLine (indent + "\t\t\t{0} {1}_wrapper = null;", wrapper, name); + sw.Write (indent + "\t\t\t"); + if (p.NullOk) + sw.Write ("if ({0} != null) ", name); + sw.WriteLine ("{1}_wrapper = new {0} ({1}, {2});", wrapper, p.Name, parameters.Static ? "null" : "this"); + } + } + + if (ThrowsException) + sw.WriteLine (indent + "\t\t\tIntPtr error = IntPtr.Zero;"); + } + + public void Finish (StreamWriter sw, string indent) + { + if (parameters == null) + return; + + bool ref_owned_needed = true; + for (int i = 0; i < parameters.Count; i++) { + Parameter p = parameters [i]; + + if (p.PassAs == "out" && p.Generatable is EnumGen) { + sw.WriteLine(indent + "\t\t\t" + p.Name + " = (" + p.CSType + ") " + p.Name + "_as_int;"); + } + + IGeneratable gen = p.Generatable; + if (ref_owned_needed && (gen is ObjectGen || gen is InterfaceGen) && p.PassAs == "out") { + ref_owned_needed = false; + sw.WriteLine(indent + "\t\t\tbool ref_owned = false;"); + } + + if (p.PassAs == "out" && (UsesHandle (gen) || p.CSType == "GLib.Value")) + sw.WriteLine(indent + "\t\t\t" + p.Name + " = " + gen.FromNativeReturn (p.Name + "_handle") + ";"); + } + } + + public void HandleException (StreamWriter sw, string indent) + { + if (!ThrowsException) + return; + sw.WriteLine (indent + "\t\t\tif (error != IntPtr.Zero) throw new GLib.GException (error);"); + } + + public bool ThrowsException { + get { + if (parameters == null || parameters.Count < 1) + return false; + + return parameters [parameters.Count - 1].CType == "GError**"; + } + } + } +} + diff --git a/generator/Parameters.cs b/generator/Parameters.cs index 9005f28ac..e567b7abb 100644 --- a/generator/Parameters.cs +++ b/generator/Parameters.cs @@ -35,6 +35,8 @@ namespace GtkSharp.Generation { if (cstype == "void") cstype = "System.IntPtr"; if (IsArray) { + if (IsParams) + cstype = "params " + cstype; cstype += "[]"; cstype = cstype.Replace ("ref ", ""); } @@ -100,6 +102,12 @@ namespace GtkSharp.Generation { } } + public bool IsParams { + get { + return elem.HasAttribute("params"); + } + } + public bool IsString { get { return (CSType == "string"); @@ -108,7 +116,7 @@ namespace GtkSharp.Generation { public bool IsUserData { get { - return CType == "gpointer" && (Name.EndsWith ("data") || Name.EndsWith ("data_or_owner")); + return CSType == "IntPtr" && (Name.EndsWith ("data") || Name.EndsWith ("data_or_owner")); } } @@ -155,6 +163,24 @@ namespace GtkSharp.Generation { } } + public string CallByName (string call_parm_name) + { + string call_parm; + if (Generatable is CallbackGen) + call_parm = SymbolTable.Table.CallByName (CType, call_parm_name + "_wrapper"); + else + call_parm = SymbolTable.Table.CallByName(CType, call_parm_name); + + if (NullOk && !CSType.EndsWith ("IntPtr") && !(Generatable is StructBase)) + call_parm = String.Format ("({0} != null) ? {1} : {2}", call_parm_name, call_parm, Generatable is CallbackGen ? "null" : "IntPtr.Zero"); + + if (IsArray) + call_parm = call_parm.Replace ("ref ", ""); + + return call_parm; + + } + public string StudlyName { get { string name = elem.GetAttribute("name"); @@ -177,10 +203,6 @@ namespace GtkSharp.Generation { private ArrayList param_list; private XmlElement elem; private string impl_ns; - private string import_sig = ""; - private string call_string = ""; - private string signature = ""; - private string signature_types = ""; private bool hide_data; private bool is_static; @@ -196,12 +218,6 @@ namespace GtkSharp.Generation { } } - public string CallString { - get { - return call_string; - } - } - public int Count { get { return param_list.Count; @@ -214,30 +230,13 @@ namespace GtkSharp.Generation { } } - public string ImportSig { - get { - return import_sig; - } - } - - public string Signature { - get { - return signature; - } - } - - public string SignatureTypes { - get { - return signature_types; - } - } - public bool HideData { get { return hide_data; } set { hide_data = value; } } public bool Static { + get { return is_static; } set { is_static = value; } } @@ -260,209 +259,12 @@ namespace GtkSharp.Generation { return true; } - public void CreateSignature (bool is_set) - { - import_sig = call_string = signature = signature_types = ""; - bool need_sep = false; - bool has_callback = hide_data; - - SymbolTable table = SymbolTable.Table; - - for (int i = 0; i < Count; i++) { - - string type = this [i].CType; - string cs_type = this [i].CSType; - string m_type = this [i].MarshalType; - string name = this [i].Name; - - if (i > 0 && this [i - 1].IsArray && this [i].IsCount) { - call_string += ", " + this[i-1].Name + " != null ? " + (cs_type != "int" ? "(" + cs_type + ") " : "") + this [i - 1].Name + ".Length : 0"; - import_sig += ", " + m_type + " " + name; - continue; - } - - if (i > 0 && this [i - 1].IsString && this [i].IsLength) { - call_string += ", " + (cs_type != "int" ? "(" + cs_type + ") " : "") + this [i - 1].Name + ".Length"; - import_sig += ", " + m_type + " " + name; - continue; - } - - string call_parm_name = name; - if (is_set && i == 0) - call_parm_name = "value"; - - string call_parm; - if (table.IsCallback (type)) { - has_callback = true; - call_parm = table.CallByName (type, call_parm_name + "_wrapper"); - } else - call_parm = table.CallByName(type, call_parm_name); - - if (this [i].NullOk && (this [i].IsArray || (!cs_type.EndsWith ("IntPtr") && !table.IsStruct (type)))) - call_parm = String.Format ("({0} != null) ? {1} : {2}", call_parm_name, call_parm, table.IsCallback (type) || this[i].IsArray ? "null" : "IntPtr.Zero"); - - if (this [i].IsArray) - call_parm = call_parm.Replace ("ref ", ""); - - if (IsVarArgs && i == (Count - 1) && VAType == "length_param") { - cs_type = "params " + cs_type + "[]"; - m_type += "[]"; - } - - if (need_sep) { - call_string += ", "; - import_sig += ", "; - if (type != "GError**" && !(IsVarArgs && i == (Count - 1) && VAType == "length_param")) - { - signature += ", "; - signature_types += ":"; - } - } else { - need_sep = true; - } - - if (type == "GError**") { - call_string += "out "; - import_sig += "out "; - } else if (this [i].PassAs != "" && !IsVarArgs) { - signature += this [i].PassAs + " "; - // We only need to do this for value types - if (type != "GError**" && m_type != "IntPtr" && m_type != "System.IntPtr") - { - import_sig += this [i].PassAs + " "; - call_string += this [i].PassAs + " "; - } - - if (table.IsEnum (type)) - call_parm = name + "_as_int"; - else if (table.IsObject (type) || table.IsInterface (type) || table.IsOpaque (type) || cs_type == "GLib.Value") { - call_parm = this [i].PassAs + " " + call_parm.Replace (".Handle", "_handle"); - import_sig += this [i].PassAs + " "; - } - } - - if (IsVarArgs && i == (Count - 2) && VAType == "length_param") { - call_string += this [Count - 1].Name + ".Length"; - } else { - if (!(type == "GError**" || (has_callback && (type == "gpointer" || type == "void*") && (i == Count - 1) && (name.EndsWith ("data") || name.EndsWith ("data_or_owner"))))) { - signature += (cs_type + " " + name); - signature_types += cs_type; - } else if (type == "GError**") { - call_parm = call_parm.Replace (name, "error"); - } else if ((type == "gpointer" || type == "void*") && (i == Count - 1) && (name.EndsWith ("data") || name.EndsWith ("data_or_owner"))) { - call_parm = "IntPtr.Zero"; - } - - call_string += call_parm; - } - if (table.IsCallback (type)) - m_type = impl_ns + "Sharp" + m_type.Substring(m_type.IndexOf(".")); - import_sig += (m_type + " " + name); - } - - // FIXME: lame - call_string = call_string.Replace ("out ref", "out"); - import_sig = import_sig.Replace ("out ref", "out"); - call_string = call_string.Replace ("ref ref", "ref"); - import_sig = import_sig.Replace ("ref ref", "ref"); - - // FIXME: this is also lame, I need to fix the need_sep algo - if (signature.EndsWith (", ")) - signature = signature.Remove (signature.Length - 2, 2); - } - - public void Initialize (GenerationInfo gen_info, bool is_get, bool is_set, string indent) - { - StreamWriter sw = gen_info.Writer; - foreach (Parameter p in param_list) { - - IGeneratable gen = p.Generatable; - string name = p.Name; - if (is_set) - name = "value"; - - if (is_get) { - sw.WriteLine (indent + "\t\t\t" + p.CSType + " " + name + ";"); - if (gen is ObjectGen || gen is OpaqueGen || p.CSType == "GLib.Value") - sw.WriteLine(indent + "\t\t\t" + name + " = new " + p.CSType + "();"); - } - - if ((is_get || p.PassAs == "out") && (gen is ObjectGen || gen is InterfaceGen || gen is OpaqueGen || p.CSType == "GLib.Value")) - sw.WriteLine(indent + "\t\t\tIntPtr " + name + "_handle;"); - - if (p.PassAs == "out" && gen is EnumGen) - sw.WriteLine(indent + "\t\t\tint " + name + "_as_int;"); - - if (gen is CallbackGen) { - CallbackGen cbgen = gen as CallbackGen; - string wrapper = cbgen.GenWrapper(impl_ns, gen_info); - sw.WriteLine (indent + "\t\t\t{0} {1}_wrapper = null;", wrapper, name); - sw.Write (indent + "\t\t\t"); - if (p.NullOk) - sw.Write ("if ({0} != null) ", name); - sw.WriteLine ("{1}_wrapper = new {0} ({1}, {2});", wrapper, name, is_static ? "null" : "this"); - } - } - - if (ThrowsException) - sw.WriteLine (indent + "\t\t\tIntPtr error = IntPtr.Zero;"); - } - - public void Finish (StreamWriter sw, string indent) - { - bool ref_owned_needed = true; - foreach (Parameter p in param_list) { - - if (p.PassAs == "out" && p.Generatable is EnumGen) { - sw.WriteLine(indent + "\t\t\t" + p.Name + " = (" + p.CSType + ") " + p.Name + "_as_int;"); - } - - IGeneratable gen = p.Generatable; - if (ref_owned_needed && (gen is ObjectGen || gen is InterfaceGen) && p.PassAs == "out") { - ref_owned_needed = false; - sw.WriteLine(indent + "\t\t\tbool ref_owned = false;"); - } - - if (p.PassAs == "out" && (gen is ObjectGen || gen is InterfaceGen || gen is OpaqueGen || p.CSType == "GLib.Value")) - sw.WriteLine(indent + "\t\t\t" + p.Name + " = " + gen.FromNativeReturn (p.Name + "_handle") + ";"); - } - } - - - public void HandleException (StreamWriter sw, string indent) - { - if (!ThrowsException) - return; - sw.WriteLine (indent + "\t\t\tif (error != IntPtr.Zero) throw new GLib.GException (error);"); - } - public bool IsAccessor { get { return Count == 1 && this [0].PassAs == "out"; } } - public bool ThrowsException { - get { - if (Count < 1) - return false; - - return this [Count - 1].CType == "GError**"; - } - } - - public bool IsVarArgs { - get { - return elem.HasAttribute ("va_type"); - } - } - - public string VAType { - get { - return elem.GetAttribute ("va_type"); - } - } - public string AccessorReturnType { get { if (Count > 0) diff --git a/generator/Property.cs b/generator/Property.cs index f8e8a1e55..e385749c2 100644 --- a/generator/Property.cs +++ b/generator/Property.cs @@ -103,8 +103,8 @@ namespace GtkSharp.Generation { setter.GenerateImport(sw); } - if (has_setter && setter.Params[0].CSType != cs_type) - cs_type = setter.Params[0].CSType; + if (has_setter && setter.Signature.Types != cs_type) + cs_type = setter.Signature.Types; else if (has_getter && getter.ReturnType != cs_type) cs_type = getter.ReturnType; diff --git a/generator/Signature.cs b/generator/Signature.cs new file mode 100644 index 000000000..e1e61faa8 --- /dev/null +++ b/generator/Signature.cs @@ -0,0 +1,75 @@ +// GtkSharp.Generation.Signature.cs - The Signature Generation Class. +// +// Author: Mike Kestner +// +// (c) 2003 Novell, Inc. + +namespace GtkSharp.Generation { + + using System; + using System.Collections; + using System.Xml; + + public class Signature { + + private ArrayList parms = new ArrayList (); + + public Signature (Parameters parms) + { + if (parms == null) + return; + + bool has_cb = parms.HideData; + for (int i = 0; i < parms.Count; i++) { + Parameter p = parms [i]; + + if (i > 0 && p.IsLength && parms [i - 1].IsString) + continue; + + if (p.IsCount && ((i > 0 && parms [i - 1].IsArray) || (i < parms.Count - 1 && parms [i + 1].IsArray))) + continue; + + has_cb = has_cb || p.Generatable is CallbackGen; + if (p.IsUserData && has_cb && (i == parms.Count - 1)) + continue; + + if (p.CType == "GError**") + continue; + + this.parms.Add (p); + } + } + + public override string ToString () + { + if (parms.Count == 0) + return ""; + + string[] result = new string [parms.Count]; + int i = 0; + + foreach (Parameter p in parms) { + result [i] = p.PassAs != "" ? p.PassAs + " " : ""; + result [i++] += p.CSType + " " + p.Name; + } + + return String.Join (", ", result); + } + + public string Types { + get { + if (parms.Count == 0) + return ""; + + string[] result = new string [parms.Count]; + int i = 0; + + foreach (Parameter p in parms) + result [i++] = p.CSType; + + return String.Join (":", result); + } + } + } +} + diff --git a/gnome/Gnome.metadata b/gnome/Gnome.metadata index fcfeb2b6f..a0d413e8c 100644 --- a/gnome/Gnome.metadata +++ b/gnome/Gnome.metadata @@ -66,6 +66,7 @@ IconFocused IconSelected IconUnselected + 1 const-gchar* gchar* const-gchar* diff --git a/gnome/gnome-api.xml b/gnome/gnome-api.xml index c1886f5cf..570eb1e30 100644 --- a/gnome/gnome-api.xml +++ b/gnome/gnome-api.xml @@ -3866,7 +3866,7 @@ - +