From 0881ba5489c092c6126e4585565339edb0c8f18d Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Thu, 18 Nov 2004 22:47:05 +0000 Subject: [PATCH] 2004-11-18 Mike Kestner * generator/Makefile.am : add new file. * generator/Method.cs : add Declaration property. * generator/VirtualMethod.cs : new class to generate virtual methods for Interfaces and objects. Unfinished. svn path=/trunk/gtk-sharp/; revision=36292 --- ChangeLog | 7 +++ generator/Makefile.am | 1 + generator/Method.cs | 6 ++ generator/VirtualMethod.cs | 112 +++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 generator/VirtualMethod.cs diff --git a/ChangeLog b/ChangeLog index 9d7263b1f..127e6a2ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-11-18 Mike Kestner + + * generator/Makefile.am : add new file. + * generator/Method.cs : add Declaration property. + * generator/VirtualMethod.cs : new class to generate virtual + methods for Interfaces and objects. Unfinished. + 2004-11-18 Mike Kestner * generator/ClassBase.cs : remove a "new" string in the diff --git a/generator/Makefile.am b/generator/Makefile.am index 3a6f72f0d..b99f5261a 100644 --- a/generator/Makefile.am +++ b/generator/Makefile.am @@ -47,6 +47,7 @@ sources = \ StructGen.cs \ SymbolTable.cs \ TimeTGen.cs \ + VirtualMethod.cs \ VMSignature.cs build_sources = $(addprefix $(srcdir)/, $(sources)) diff --git a/generator/Method.cs b/generator/Method.cs index 29b80c2fa..5ecc2ee2b 100644 --- a/generator/Method.cs +++ b/generator/Method.cs @@ -203,6 +203,12 @@ namespace GtkSharp.Generation { return container_type.GetMethod (complement + elem.GetAttribute("name").Substring (1)); } + public string Declaration { + get { + return retval.CSType + " " + Name + " (" + (sig != null ? sig.ToString() : "") + ");"; + } + } + private void GenerateDeclCommon (StreamWriter sw, ClassBase implementor) { if (elem.GetAttribute ("shared") == "true") diff --git a/generator/VirtualMethod.cs b/generator/VirtualMethod.cs new file mode 100644 index 000000000..b24167692 --- /dev/null +++ b/generator/VirtualMethod.cs @@ -0,0 +1,112 @@ +// GtkSharp.Generation.VirtualMethod.cs - The VirtualMethod Generatable. +// +// Author: Mike Kestner +// +// Copyright (c) 2003-2004 Novell, Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of version 2 of the GNU General Public +// License as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. + + +namespace GtkSharp.Generation { + + using System; + using System.Collections; + using System.IO; + using System.Xml; + + public class VirtualMethod { + + private XmlElement elem; + private ReturnValue retval; + private Parameters parms; + ImportSignature isig; + + public VirtualMethod (XmlElement elem, ClassBase container_type) + { + this.elem = elem; + retval = new ReturnValue (elem ["return-type"]); + parms = new Parameters (elem["parameters"], container_type.NS); + isig = new ImportSignature (parms, container_type.NS); + } + + public string CName { + get { + return elem.GetAttribute("cname"); + } + } + + public string Declaration { + get { + VMSignature vmsig = new VMSignature (parms); + return retval.CSType + " " + Name + " (" + vmsig + ");"; + } + } + + public string MarshalReturnType { + get { + return SymbolTable.Table.GetToNativeReturnType (elem["return-type"].GetAttribute("type")); + } + } + + public string Name { + get { + return elem.GetAttribute("name"); + } + } + + public string NativeDelegate { + get { + return "delegate " + MarshalReturnType + " " + Name + "Delegate (" + isig + ");"; + } + } + + public void GenerateCallback (StreamWriter sw) + { + ManagedCallString call = new ManagedCallString (parms); + string type = parms [0].CSType; + string name = parms [0].Name; + string call_string = "__obj." + Name + " (" + call + ")"; + sw.WriteLine ("\t\tstatic " + MarshalReturnType + " " + Name + "Callback (" + isig + ")"); + sw.WriteLine ("\t\t{"); + sw.WriteLine ("\t\t\t" + type + " __obj = GLib.Object.GetObject (" + name + ", false) as " + type + ";"); + if (retval.CSType == "void") + sw.WriteLine ("\t\t\t" + call_string + ";"); + else { + sw.WriteLine ("\t\t\treturn " + SymbolTable.Table.ToNativeReturn (retval.CType, call_string) + ";"); + } + sw.WriteLine ("\t\t}"); + } + + public bool Validate () + { + if (!parms.Validate () || !retval.Validate ()) { + Console.Write ("in virtual method " + Name + " "); + return false; + } + + for (int i = 0; i < parms.Count; i++) { + Parameter p = parms [i]; + if (p.Generatable is CallbackGen) { + Console.Write("Callback: " + p.CSType + " in virtual method " + Name + " "); + Statistics.ThrottledCount++; + return false; + } + } + + return true; + } + } +} +