diff options
author | Simon <simon.werbeck@gmail.com> | 2014-03-13 22:48:40 +0100 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2014-03-30 12:04:37 +0200 |
commit | 5938a38bff40e311885c1ebed37991f2e0c9c600 (patch) | |
tree | a1df8c955aef3d70fa3ef5f7da89d599b64cbae2 /ccode | |
parent | d9dff687875a2ae033719799d8a77487917bd159 (diff) | |
download | vala-5938a38bff40e311885c1ebed37991f2e0c9c600.tar.gz |
Support non-literal length in fixed-size arrays
Now any constant integer expression can be used as length
for fixed-size arrays.
Fixes bug 638993
Diffstat (limited to 'ccode')
-rw-r--r-- | ccode/valaccodestruct.vala | 2 | ||||
-rw-r--r-- | ccode/valaccodevariabledeclarator.vala | 37 |
2 files changed, 33 insertions, 6 deletions
diff --git a/ccode/valaccodestruct.vala b/ccode/valaccodestruct.vala index 76f7679f2..96836ed5d 100644 --- a/ccode/valaccodestruct.vala +++ b/ccode/valaccodestruct.vala @@ -59,7 +59,7 @@ public class Vala.CCodeStruct : CCodeNode { * @param type_name field type * @param name member name */ - public void add_field (string type_name, string name, string? declarator_suffix = null) { + public void add_field (string type_name, string name, CCodeDeclaratorSuffix? declarator_suffix = null) { var decl = new CCodeDeclaration (type_name); decl.add_declarator (new CCodeVariableDeclarator (name, null, declarator_suffix)); add_declaration (decl); diff --git a/ccode/valaccodevariabledeclarator.vala b/ccode/valaccodevariabledeclarator.vala index 863ec83a3..c8dd87495 100644 --- a/ccode/valaccodevariabledeclarator.vala +++ b/ccode/valaccodevariabledeclarator.vala @@ -39,7 +39,7 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { /** * The optional declarator suffix. */ - public string? declarator_suffix { get; set; } + public CCodeDeclaratorSuffix? declarator_suffix { get; set; } /** * Initializer only used to zero memory, safe to initialize as part @@ -47,13 +47,13 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { */ public bool init0 { get; set; } - public CCodeVariableDeclarator (string name, CCodeExpression? initializer = null, string? declarator_suffix = null) { + public CCodeVariableDeclarator (string name, CCodeExpression? initializer = null, CCodeDeclaratorSuffix? declarator_suffix = null) { this.name = name; this.initializer = initializer; this.declarator_suffix = declarator_suffix; } - public CCodeVariableDeclarator.zero (string name, CCodeExpression? initializer, string? declarator_suffix = null) { + public CCodeVariableDeclarator.zero (string name, CCodeExpression? initializer, CCodeDeclaratorSuffix? declarator_suffix = null) { this.name = name; this.initializer = initializer; this.declarator_suffix = declarator_suffix; @@ -62,8 +62,9 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { public override void write (CCodeWriter writer) { writer.write_string (name); + if (declarator_suffix != null) { - writer.write_string (declarator_suffix); + declarator_suffix.write (writer); } if (initializer != null) { @@ -74,8 +75,9 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { public override void write_declaration (CCodeWriter writer) { writer.write_string (name); + if (declarator_suffix != null) { - writer.write_string (declarator_suffix); + declarator_suffix.write (writer); } if (initializer != null && init0) { @@ -97,3 +99,28 @@ public class Vala.CCodeVariableDeclarator : CCodeDeclarator { } } } + +public class Vala.CCodeDeclaratorSuffix { + public bool array; + public CCodeExpression? array_length; + public bool deprecated; + + public CCodeDeclaratorSuffix.with_array (CCodeExpression? array_length = null) { + this.array_length = array_length; + array = true; + } + + public void write (CCodeWriter writer) { + if (array) { + writer.write_string ("["); + if (array_length != null) { + array_length.write (writer); + } + writer.write_string ("]"); + } + + if (deprecated) { + writer.write_string (" G_GNUC_DEPRECATED"); + } + } +} |