* generator/Parameters.cs (AllowComplexRefs): new property for

whether or not to allow "complex" ref/out args.
	(Validate): update for that

	* generator/Signal.cs: set AllowComplexRefs false on the params.
	(Validate): fix the messages
	(GenCallback, GenEventHandler): properly handle ref/out args, by
	manually pointerifying them (except for boxed args, which are
	already pointers).

	* glib/Marshaller.cs (StructureToPtrAlloc): Rename from
	PtrToStructureAlloc, since it wraps Marshal.StructureToPtr.

svn path=/trunk/gtk-sharp/; revision=46773
This commit is contained in:
Dan Winship 2005-06-30 17:09:39 +00:00
parent a0912263e2
commit 635ed16db4
5 changed files with 73 additions and 26 deletions

View File

@ -1,3 +1,18 @@
2005-06-30 Dan Winship <danw@novell.com>
* generator/Parameters.cs (AllowComplexRefs): new property for
whether or not to allow "complex" ref/out args.
(Validate): update for that
* generator/Signal.cs: set AllowComplexRefs false on the params.
(Validate): fix the messages
(GenCallback, GenEventHandler): properly handle ref/out args, by
manually pointerifying them (except for boxed args, which are
already pointers).
* glib/Marshaller.cs (StructureToPtrAlloc): Rename from
PtrToStructureAlloc, since it wraps Marshal.StructureToPtr.
2005-06-28 Mike Kestner <mkestner@novell.com>
* gtk/ComboBox.custom : add ctor (string[]).

View File

@ -223,8 +223,8 @@
<since version="Gtk# 2.4" />
</Docs>
</Member>
<Member MemberName="PtrToStructureAlloc">
<MemberSignature Language="C#" Value="public static IntPtr PtrToStructureAlloc (object o);" />
<Member MemberName="StructureToPtrAlloc">
<MemberSignature Language="C#" Value="public static IntPtr StructureToPtrAlloc (object o);" />
<MemberType>Method</MemberType>
<ReturnValue>
<ReturnType>System.IntPtr</ReturnType>
@ -233,10 +233,10 @@
<Parameter Name="o" Type="System.Object" />
</Parameters>
<Docs>
<summary>To be added</summary>
<param name="o">a <see cref="T:System.Object" /></param>
<returns>a <see cref="T:System.IntPtr" /></returns>
<remarks>To be added</remarks>
<param name="o">the structure to marshal</param>
<summary>Marshals a structure to newly-allocated memory.</summary>
<returns>a pointer to the newly-allocated memory</returns>
<remarks>This is like <see cref="M:System.Runtime.InteropServices.Marshal.StructureToPtr" /> except that it allocates the memory for the unmanaged copy itself. You should free the memory with <see cref="M:System.Runtime.InteropServices.Marshal.FreeHGlobal" /> when you are done with it.</remarks>
<since version="Gtk# 2.4" />
</Docs>
</Member>

View File

@ -310,6 +310,12 @@ namespace GtkSharp.Generation {
set { is_static = value; }
}
bool allow_complex_refs;
public bool AllowComplexRefs {
get { return allow_complex_refs; }
set { allow_complex_refs = value; }
}
bool cleared = false;
void Clear ()
{
@ -344,6 +350,14 @@ namespace GtkSharp.Generation {
return false;
}
if (p.PassAs != "" && !allow_complex_refs) {
if (!(p.Generatable is BoxedGen) &&
!(p.Generatable is SimpleGen)) {
Console.Write("Complex " + p.PassAs + " param " + p.Name + " ");
return false;
}
}
if (p.Generatable is CallbackGen) {
has_cb = true;
if (i == Count - 3 &&

View File

@ -41,6 +41,7 @@ namespace GtkSharp.Generation {
name = elem.GetAttribute ("name");
retval = new ReturnValue (elem ["return-type"]);
parms = new Parameters (elem["parameters"]);
parms.AllowComplexRefs = false;
this.container_type = container_type;
}
@ -56,16 +57,16 @@ namespace GtkSharp.Generation {
public bool Validate ()
{
if (Name == "") {
Console.Write ("bad signal " + Name);
Console.Write ("Nameless signal ");
Statistics.ThrottledCount++;
return false;
}
if (!parms.Validate ())
return false;
if (!retval.Validate ())
if (!parms.Validate () || !retval.Validate ()) {
Console.Write (" in signal " + Name + " ");
Statistics.ThrottledCount++;
return false;
}
return true;
}
@ -208,16 +209,18 @@ namespace GtkSharp.Generation {
for (int idx = 1; idx < parms.Count; idx++) {
Parameter p = parms [idx];
IGeneratable igen = p.Generatable;
if (p.PassAs == "out")
if (p.PassAs != "out") {
if (igen is ManualGen) {
sw.WriteLine("\t\t\tif (arg{0} == IntPtr.Zero)", idx);
sw.WriteLine("\t\t\t\targs.Args[{0}] = null;", idx - 1);
sw.WriteLine("\t\t\telse {");
sw.WriteLine("\t\t\t\targs.Args[" + (idx - 1) + "] = " + igen.FromNative ("arg" + idx) + ";");
sw.WriteLine("\t\t\t}");
} else
sw.WriteLine("\t\t\targs.Args[" + (idx - 1) + "] = " + igen.FromNative ("arg" + idx) + ";");
}
if (p.PassAs != "")
finish += "\t\t\targ" + idx + " = " + igen.ToNativeReturn ("((" + p.CSType + ")args.Args[" + (idx - 1) + "])") + ";\n";
else if (igen is ManualGen) {
sw.WriteLine("\t\t\tif (arg{0} == IntPtr.Zero)", idx);
sw.WriteLine("\t\t\t\targs.Args[{0}] = null;", idx - 1);
sw.WriteLine("\t\t\telse {");
sw.WriteLine("\t\t\t\targs.Args[" + (idx - 1) + "] = " + igen.FromNative ("arg" + idx) + ";");
sw.WriteLine("\t\t\t}");
} else
sw.WriteLine("\t\t\targs.Args[" + (idx - 1) + "] = " + igen.FromNative ("arg" + idx) + ";");
}
sw.WriteLine("\t\t\t{0} handler = ({0}) sig.Handler;", EventHandlerQualifiedName);
sw.WriteLine("\t\t\thandler (GLib.Object.GetObject (arg0), args);");
@ -299,13 +302,28 @@ namespace GtkSharp.Generation {
sw.WriteLine ("\t\t\tinst_and_params.Append (vals [0]);");
string cleanup = "";
for (int i = 1; i < parms.Count; i++) {
if (parms [i].PassAs == "out") {
sw.WriteLine ("\t\t\tvals [" + i + "] = GLib.Value.Empty;");
cleanup += "\t\t\t" + parms [i].Name + " = (" + parms [i].CSType + ") vals [" + i + "];\n";
} else if (parms [i].IsLength && parms [i - 1].IsString)
Parameter p = parms [i];
if (p.PassAs != "") {
if (SymbolTable.Table.IsBoxed (p.CType)) {
if (p.PassAs == "ref")
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + p.Name + ");");
else
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value ((GLib.GType)typeof (" + p.CSType + "));");
cleanup += "\t\t\t" + p.Name + " = (" + p.CSType + ") vals [" + i + "];\n";
} else {
if (p.PassAs == "ref")
sw.WriteLine ("\t\t\tIntPtr " + p.Name + "_ptr = GLib.Marshaller.StructureToPtrAlloc ((" + p.CSType + ") " + p.Name + ");");
else
sw.WriteLine ("\t\t\tIntPtr " + p.Name + "_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (" + p.CSType + ")));");
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + p.Name + "_ptr);");
cleanup += "\t\t\t" + p.Name + " = (" + p.CSType + ") Marshal.PtrToStructure (" + p.Name + "_ptr, typeof (" + p.CSType + "));\n";
cleanup += "\t\t\tMarshal.FreeHGlobal (" + p.Name + "_ptr);\n";
}
} else if (p.IsLength && parms [i - 1].IsString)
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + parms [i-1].Name + ".Length);");
else
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + parms [i].Name + ");");
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + p.Name + ");");
sw.WriteLine ("\t\t\tinst_and_params.Append (vals [" + i + "]);");
}

View File

@ -274,7 +274,7 @@ namespace GLib {
return glibsharp_utf16_to_unichar ((ushort) c);
}
public static IntPtr PtrToStructureAlloc (object o)
public static IntPtr StructureToPtrAlloc (object o)
{
IntPtr result = Marshal.AllocHGlobal (Marshal.SizeOf (o));
Marshal.StructureToPtr (o, result, false);