add support for volatile fields, fixes bug #499960
authorJuerg Billeter <j@bitron.ch>
Wed, 28 Nov 2007 15:32:01 +0000 (15:32 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Wed, 28 Nov 2007 15:32:01 +0000 (15:32 +0000)
2007-11-28  Juerg Billeter  <j@bitron.ch>

* vala/parser.y, vala/scanner.l, vala/valafield.vala,
  gobject/valaccodegenerator.vala: add support for volatile fields,
  fixes bug #499960

svn path=/trunk/; revision=732

ChangeLog
gobject/valaccodegenerator.vala
vala/parser.y
vala/scanner.l
vala/valafield.vala

index ab528dd..4433fa1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-28  Jürg Billeter  <j@bitron.ch>
+
+       * vala/parser.y, vala/scanner.l, vala/valafield.vala,
+         gobject/valaccodegenerator.vala: add support for volatile fields,
+         fixes bug #499960
+
 2007-11-27  Jürg Billeter  <j@bitron.ch>
 
        * gen-project/valaprojectgenerator.vala: search for INSTALL and COPYING
index a6585fc..5e65a6c 100644 (file)
@@ -417,12 +417,17 @@ public class Vala.CCodeGenerator : CodeGenerator {
                CCodeExpression lhs = null;
                CCodeStruct st = null;
                
+               string field_ctype = f.type_reference.get_cname ();
+               if (f.is_volatile) {
+                       field_ctype = "volatile " + field_ctype;
+               }
+
                if (f.access != SymbolAccessibility.PRIVATE) {
                        st = instance_struct;
                        if (f.instance) {
                                lhs = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), f.get_cname ());
                        } else {
-                               var cdecl = new CCodeDeclaration (f.type_reference.get_cname ());
+                               var cdecl = new CCodeDeclaration (field_ctype);
                                cdecl.add_declarator (new CCodeVariableDeclarator (f.get_cname ()));
                                header_type_member_declaration.append (cdecl);
 
@@ -438,7 +443,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                        lhs = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), f.get_cname ());
                                }
                        } else {
-                               var cdecl = new CCodeDeclaration (f.type_reference.get_cname ());
+                               var cdecl = new CCodeDeclaration (field_ctype);
                                var var_decl = new CCodeVariableDeclarator (f.get_cname ());
                                if (f.initializer != null) {
                                        var init = (CCodeExpression) f.initializer.ccodenode;
@@ -455,7 +460,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                }
 
                if (f.instance)  {
-                       st.add_field (f.type_reference.get_cname (), f.get_cname ());
+                       st.add_field (field_ctype, f.get_cname ());
                        if (f.type_reference.data_type is Array && !f.no_array_length) {
                                // create fields to store array dimensions
                                var arr = (Array) f.type_reference.data_type;
index e164545..1db5cab 100644 (file)
@@ -45,7 +45,8 @@ typedef enum {
        VALA_MODIFIER_ABSTRACT = 1 << 0,
        VALA_MODIFIER_OVERRIDE = 1 << 1,
        VALA_MODIFIER_STATIC = 1 << 2,
-       VALA_MODIFIER_VIRTUAL = 1 << 3
+       VALA_MODIFIER_VIRTUAL = 1 << 3,
+       VALA_MODIFIER_VOLATILE = 1 << 4
 } ValaModifier;
 
 int yylex (YYSTYPE *yylval_param, YYLTYPE *yylloc_param, ValaParser *parser);
@@ -200,6 +201,7 @@ static gboolean check_is_struct (ValaSymbol *symbol, ValaSourceReference *src);
 %token USING "using"
 %token VAR "var"
 %token VIRTUAL "virtual"
+%token VOLATILE "volatile"
 %token WEAK "weak"
 %token WHILE "while"
 
@@ -2635,6 +2637,10 @@ modifier
          {
                $$ = VALA_MODIFIER_VIRTUAL;
          }
+       | VOLATILE
+         {
+               $$ = VALA_MODIFIER_VOLATILE;
+         }
        ;
 
 opt_class_base
@@ -2774,6 +2780,9 @@ field_declaration
                if (($4 & VALA_MODIFIER_STATIC) == VALA_MODIFIER_STATIC) {
                        vala_field_set_instance ($$, FALSE);
                }
+               if (($4 & VALA_MODIFIER_VOLATILE) == VALA_MODIFIER_VOLATILE) {
+                       vala_field_set_is_volatile ($$, TRUE);
+               }
                VALA_CODE_NODE($$)->attributes = $2;
                g_object_unref ($5);
                g_object_unref ($6);
index 9c26878..90febb1 100644 (file)
@@ -179,6 +179,7 @@ literal                             ({integer_literal}|{real_literal}|{character_literal}|{string_literal
 "using"                { uploc; return USING; }
 "var"          { uploc; return VAR; }
 "virtual"      { uploc; return VIRTUAL; }
+"volatile"     { uploc; return VOLATILE; }
 "weak"         { uploc; return WEAK; }
 "while"                { uploc; return WHILE; }
 
index 91e8e3b..a89c2ba 100644 (file)
@@ -45,7 +45,13 @@ public class Vala.Field : Member, Invokable, Lockable {
                get { return _instance; }
                set { _instance = value; }
        }
-       
+
+       /**
+        * Specifies whether the field is volatile. Volatile fields are
+        * necessary to allow multi-threaded access.
+        */
+       public bool is_volatile { get; set; }
+
        /**
         * Specifies whether an array length field should implicitly be created
         * if the field type is an array.