+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
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);
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;
}
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;
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);
%token USING "using"
%token VAR "var"
%token VIRTUAL "virtual"
+%token VOLATILE "volatile"
%token WEAK "weak"
%token WHILE "while"
{
$$ = VALA_MODIFIER_VIRTUAL;
}
+ | VOLATILE
+ {
+ $$ = VALA_MODIFIER_VOLATILE;
+ }
;
opt_class_base
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);
"using" { uploc; return USING; }
"var" { uploc; return VAR; }
"virtual" { uploc; return VIRTUAL; }
+"volatile" { uploc; return VOLATILE; }
"weak" { uploc; return WEAK; }
"while" { uploc; return WHILE; }
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.