From: Juerg Billeter Date: Wed, 28 Nov 2007 15:32:01 +0000 (+0000) Subject: add support for volatile fields, fixes bug #499960 X-Git-Tag: VALA_0_1_6~135 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ca580af448e7fe1c2d69f4109fc86290ddaa0c39;p=platform%2Fupstream%2Fvala.git add support for volatile fields, fixes bug #499960 2007-11-28 Juerg Billeter * 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 --- diff --git a/ChangeLog b/ChangeLog index ab528dd..4433fa1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-11-28 Jürg Billeter + + * 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 * gen-project/valaprojectgenerator.vala: search for INSTALL and COPYING diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index a6585fc..5e65a6c 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -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; diff --git a/vala/parser.y b/vala/parser.y index e164545..1db5cab 100644 --- a/vala/parser.y +++ b/vala/parser.y @@ -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); diff --git a/vala/scanner.l b/vala/scanner.l index 9c26878..90febb1 100644 --- a/vala/scanner.l +++ b/vala/scanner.l @@ -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; } diff --git a/vala/valafield.vala b/vala/valafield.vala index 91e8e3b..a89c2ba 100644 --- a/vala/valafield.vala +++ b/vala/valafield.vala @@ -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.