From: Jürg Billeter Date: Tue, 4 Jul 2006 06:43:15 +0000 (+0000) Subject: generate assignment with appropriate operator use implicit namespace X-Git-Tag: VALA_0_0_1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3a558fda588229f42f57f9d5b49ec34d330619d2;p=thirdparty%2Fvala.git generate assignment with appropriate operator use implicit namespace 2006-07-04 Jürg Billeter * vala/valacodegenerator.vala: generate assignment with appropriate operator * vala/valaassignment.vala: use implicit namespace specification * ccode/valaccodeassignment.vala: support assignment operators , add interface documentation, use implicit namespace specification * tests/test-010.vala: test assignments svn path=/trunk/; revision=61 --- diff --git a/vala/ChangeLog b/vala/ChangeLog index 2810b0439..8fde26a25 100644 --- a/vala/ChangeLog +++ b/vala/ChangeLog @@ -1,3 +1,12 @@ +2006-07-04 Jürg Billeter + + * vala/valacodegenerator.vala: generate assignment with appropriate + operator + * vala/valaassignment.vala: use implicit namespace specification + * ccode/valaccodeassignment.vala: support assignment operators , add + interface documentation, use implicit namespace specification + * tests/test-010.vala: test assignments + 2006-07-03 Jürg Billeter * vala/parser.y: support implicit namespace specification in struct, diff --git a/vala/ccode/valaccodeassignment.vala b/vala/ccode/valaccodeassignment.vala index 7a2ba20d5..702c3cd20 100644 --- a/vala/ccode/valaccodeassignment.vala +++ b/vala/ccode/valaccodeassignment.vala @@ -22,19 +22,70 @@ using GLib; -namespace Vala { - public class CCodeAssignment : CCodeExpression { - public CCodeExpression left { get; construct; } - public CCodeExpression right { get; construct; } +/** + * Represents an assignment expression in the C code. + */ +public class Vala.CCodeAssignment : CCodeExpression { + /** + * Left hand side of the assignment. + */ + public CCodeExpression left { get; construct; } + + /** + * Assignment operator. + */ + public CCodeAssignmentOperator operator { get; set; } + + /** + * Right hand side of the assignment. + */ + public CCodeExpression right { get; construct; } + + public override void write (CCodeWriter writer) { + if (left != null) { + left.write (writer); + } + writer.write_string (" "); - public override void write (CCodeWriter writer) { - if (left != null) { - left.write (writer); - } - writer.write_string (" = "); - if (right != null) { - right.write (writer); - } + if (operator == CCodeAssignmentOperator.BITWISE_OR) { + writer.write_string ("|"); + } else if (operator == CCodeAssignmentOperator.BITWISE_AND) { + writer.write_string ("&"); + } else if (operator == CCodeAssignmentOperator.BITWISE_XOR) { + writer.write_string ("^"); + } else if (operator == CCodeAssignmentOperator.ADD) { + writer.write_string ("+"); + } else if (operator == CCodeAssignmentOperator.SUB) { + writer.write_string ("-"); + } else if (operator == CCodeAssignmentOperator.MUL) { + writer.write_string ("*"); + } else if (operator == CCodeAssignmentOperator.DIV) { + writer.write_string ("/"); + } else if (operator == CCodeAssignmentOperator.PERCENT) { + writer.write_string ("%"); + } else if (operator == CCodeAssignmentOperator.SHIFT_LEFT) { + writer.write_string ("<<"); + } else if (operator == CCodeAssignmentOperator.SHIFT_RIGHT) { + writer.write_string (">>"); + } + + writer.write_string ("= "); + if (right != null) { + right.write (writer); } } } + +public enum Vala.CCodeAssignmentOperator { + SIMPLE, + BITWISE_OR, + BITWISE_AND, + BITWISE_XOR, + ADD, + SUB, + MUL, + DIV, + PERCENT, + SHIFT_LEFT, + SHIFT_RIGHT +} diff --git a/vala/tests/test-010.vala b/vala/tests/test-010.vala new file mode 100644 index 000000000..e3b1eb67b --- /dev/null +++ b/vala/tests/test-010.vala @@ -0,0 +1,52 @@ +using GLib; + +class Maman.Bar { + static int main (int argc, string[] argv) { + stdout.printf ("Assignment Test: 1"); + + int i; + + i = 2; + stdout.printf (" %d", i); + + i |= 1; + stdout.printf (" %d", i); + + i = 5; + i &= 6; + stdout.printf (" %d", i); + + i ^= 1; + stdout.printf (" %d", i); + + i += 1; + stdout.printf (" %d", i); + + i -= -1; + stdout.printf (" %d", i); + + i = 2; + i *= 4; + stdout.printf (" %d", i); + + i = 18; + i /= 2; + stdout.printf (" %d", i); + + i = 21; + i %= 11; + stdout.printf (" %d", i); + + i = 6; + i <<= 1; + stdout.printf (" %d", i - 1); + + i = 25; + i >>= 1; + stdout.printf (" %d", i); + + stdout.printf (" 13\n"); + + return 0; + } +} diff --git a/vala/vala/valaassignment.vala b/vala/vala/valaassignment.vala index b09f38d57..4bb58f6dd 100644 --- a/vala/vala/valaassignment.vala +++ b/vala/vala/valaassignment.vala @@ -34,7 +34,7 @@ public class Vala.Assignment : Expression { /** * Assignment operator. */ - public AssignmentOperator operator { get; set construct; } + public AssignmentOperator operator { get; set; } /** * Right hand side of the assignment. @@ -61,18 +61,16 @@ public class Vala.Assignment : Expression { } } -namespace Vala { - public enum AssignmentOperator { - SIMPLE, - BITWISE_OR, - BITWISE_AND, - BITWISE_XOR, - ADD, - SUB, - MUL, - DIV, - PERCENT, - SHIFT_LEFT, - SHIFT_RIGHT - } +public enum Vala.AssignmentOperator { + SIMPLE, + BITWISE_OR, + BITWISE_AND, + BITWISE_XOR, + ADD, + SUB, + MUL, + DIV, + PERCENT, + SHIFT_LEFT, + SHIFT_RIGHT } diff --git a/vala/vala/valacodegenerator.vala b/vala/vala/valacodegenerator.vala index 275fb3aa7..426b22297 100644 --- a/vala/vala/valacodegenerator.vala +++ b/vala/vala/valacodegenerator.vala @@ -1911,7 +1911,30 @@ namespace Vala { rhs = ccomma; } - a.ccodenode = new CCodeAssignment (left = (CCodeExpression) a.left.ccodenode, right = rhs); + var cop = CCodeAssignmentOperator.SIMPLE; + if (a.operator == AssignmentOperator.BITWISE_OR) { + cop = CCodeAssignmentOperator.BITWISE_OR; + } else if (a.operator == AssignmentOperator.BITWISE_AND) { + cop = CCodeAssignmentOperator.BITWISE_AND; + } else if (a.operator == AssignmentOperator.BITWISE_XOR) { + cop = CCodeAssignmentOperator.BITWISE_XOR; + } else if (a.operator == AssignmentOperator.ADD) { + cop = CCodeAssignmentOperator.ADD; + } else if (a.operator == AssignmentOperator.SUB) { + cop = CCodeAssignmentOperator.SUB; + } else if (a.operator == AssignmentOperator.MUL) { + cop = CCodeAssignmentOperator.MUL; + } else if (a.operator == AssignmentOperator.DIV) { + cop = CCodeAssignmentOperator.DIV; + } else if (a.operator == AssignmentOperator.PERCENT) { + cop = CCodeAssignmentOperator.PERCENT; + } else if (a.operator == AssignmentOperator.SHIFT_LEFT) { + cop = CCodeAssignmentOperator.SHIFT_LEFT; + } else if (a.operator == AssignmentOperator.SHIFT_RIGHT) { + cop = CCodeAssignmentOperator.SHIFT_RIGHT; + } + + a.ccodenode = new CCodeAssignment (left = (CCodeExpression) a.left.ccodenode, right = rhs, operator = cop); } } }