generator: Add support for fixed length arrays as method parameters

Fixed length arrays are available in gobject introspection and are
already converted by the bindinator tool. The array_len attribute was
only used in structs.

This adds support for them as method parameters, generating the correct
code for them. Fixes issue #98.

Signed-off-by: Bertrand Lorentz <bertrand.lorentz@gmail.com>
This commit is contained in:
Stephan Sundermann 2014-03-17 22:39:14 +01:00 committed by Bertrand Lorentz
parent 87275786b7
commit 06b966beef
2 changed files with 13 additions and 1 deletions

View file

@ -296,6 +296,7 @@
<xs:attribute name="type" type="xs:string"/> <xs:attribute name="type" type="xs:string"/>
<xs:attribute name="name" type="xs:string"/> <xs:attribute name="name" type="xs:string"/>
<xs:attribute name="array" type="xs:boolean" use="optional"/> <xs:attribute name="array" type="xs:boolean" use="optional"/>
<xs:attribute name="array_len" type="xs:positiveInteger" use="optional"/>
<xs:attribute name="null_term_array" type="xs:boolean" use="optional"/> <xs:attribute name="null_term_array" type="xs:boolean" use="optional"/>
<xs:attribute name="ellipsis" type="xs:boolean" use="optional"/> <xs:attribute name="ellipsis" type="xs:boolean" use="optional"/>
<xs:attribute name="owned" type="xs:boolean" use="optional"/> <xs:attribute name="owned" type="xs:boolean" use="optional"/>

View file

@ -33,6 +33,8 @@ namespace GtkSharp.Generation {
public ArrayParameter (XmlElement elem) : base (elem) public ArrayParameter (XmlElement elem) : base (elem)
{ {
null_terminated = elem.GetAttributeAsBoolean ("null_term_array"); null_terminated = elem.GetAttributeAsBoolean ("null_term_array");
if (elem.HasAttribute ("array_len"))
FixedArrayLength = Int32.Parse (elem.GetAttribute ("array_len"));
} }
public override string MarshalType { public override string MarshalType {
@ -50,12 +52,19 @@ namespace GtkSharp.Generation {
} }
} }
public int? FixedArrayLength { get; private set; }
public override string[] Prepare { public override string[] Prepare {
get { get {
if (CSType == MarshalType) if (CSType == MarshalType && !FixedArrayLength.HasValue)
return new string [0]; return new string [0];
var result = new List<string> (); var result = new List<string> ();
if (FixedArrayLength.HasValue) {
result.Add (String.Format ("{0} = new {1}[{2}];", Name, MarshalType.TrimEnd ('[', ']'), FixedArrayLength));
return result.ToArray ();
}
result.Add (String.Format ("int cnt_{0} = {0} == null ? 0 : {0}.Length;", CallName)); result.Add (String.Format ("int cnt_{0} = {0} == null ? 0 : {0}.Length;", CallName));
result.Add (String.Format ("{0}[] native_{1} = new {0} [cnt_{1}" + (NullTerminated ? " + 1" : "") + "];", MarshalType.TrimEnd('[', ']'), CallName)); result.Add (String.Format ("{0}[] native_{1} = new {0} [cnt_{1}" + (NullTerminated ? " + 1" : "") + "];", MarshalType.TrimEnd('[', ']'), CallName));
result.Add (String.Format ("for (int i = 0; i < cnt_{0}; i++)", CallName)); result.Add (String.Format ("for (int i = 0; i < cnt_{0}; i++)", CallName));
@ -75,6 +84,8 @@ namespace GtkSharp.Generation {
get { get {
if (CSType != MarshalType) if (CSType != MarshalType)
return "native_" + CallName; return "native_" + CallName;
else if (FixedArrayLength.HasValue)
return base.CallString;
else else
return CallName; return CallName;
} }