From: Jürg Billeter Date: Mon, 17 Nov 2008 20:26:54 +0000 (+0000) Subject: Ensure that members are checked when accessing them, fixes bug 561018 X-Git-Tag: VALA_0_5_2~86 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cef4b11b334ae1e5f4831ea3e458eda1f99f5cea;p=thirdparty%2Fvala.git Ensure that members are checked when accessing them, fixes bug 561018 2008-11-17 Jürg Billeter * vala/valacatchclause.vala: * vala/valacreationmethod.vala: * vala/valafield.vala: * vala/valaforeachstatement.vala: * vala/valamemberaccess.vala: * vala/valamethod.vala: Ensure that members are checked when accessing them, fixes bug 561018 svn path=/trunk/; revision=2025 --- diff --git a/ChangeLog b/ChangeLog index adbd4194f..fc54782a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-11-17 Jürg Billeter + + * vala/valacatchclause.vala: + * vala/valacreationmethod.vala: + * vala/valafield.vala: + * vala/valaforeachstatement.vala: + * vala/valamemberaccess.vala: + * vala/valamethod.vala: + + Ensure that members are checked when accessing them, + fixes bug 561018 + 2008-11-17 Jürg Billeter * vapi/glib-2.0.vapi: diff --git a/vala/valacatchclause.vala b/vala/valacatchclause.vala index e1c7e4b92..cb6d2a693 100644 --- a/vala/valacatchclause.vala +++ b/vala/valacatchclause.vala @@ -109,6 +109,8 @@ public class Vala.CatchClause : CodeNode { body.scope.add (variable_name, error_variable); body.add_local_variable (error_variable); + + error_variable.checked = true; } else { error_type = new ErrorType (null, null, source_reference); } diff --git a/vala/valacreationmethod.vala b/vala/valacreationmethod.vala index 3f183cd0e..d404b2a31 100644 --- a/vala/valacreationmethod.vala +++ b/vala/valacreationmethod.vala @@ -131,10 +131,21 @@ public class Vala.CreationMethod : Method { return false; } + var old_source_file = analyzer.current_source_file; var old_symbol = analyzer.current_symbol; + var old_class = analyzer.current_class; + var old_struct = analyzer.current_struct; var old_return_type = analyzer.current_return_type; + if (source_reference != null) { + analyzer.current_source_file = source_reference.file; + } analyzer.current_symbol = this; + if (parent_symbol is Class) { + analyzer.current_class = (Class) parent_symbol; + } else if (parent_symbol is Struct) { + analyzer.current_struct = (Struct) parent_symbol; + } analyzer.current_return_type = return_type; foreach (FormalParameter param in get_parameters()) { @@ -149,7 +160,10 @@ public class Vala.CreationMethod : Method { body.check (analyzer); } + analyzer.current_source_file = old_source_file; analyzer.current_symbol = old_symbol; + analyzer.current_class = old_class; + analyzer.current_struct = old_struct; analyzer.current_return_type = old_return_type; if (analyzer.current_symbol.parent_symbol is Method) { diff --git a/vala/valafield.vala b/vala/valafield.vala index 2b9fd1fc6..92fb184dc 100644 --- a/vala/valafield.vala +++ b/vala/valafield.vala @@ -203,6 +203,12 @@ public class Vala.Field : Member, Lockable { checked = true; + var old_source_file = analyzer.current_source_file; + + if (source_reference != null) { + analyzer.current_source_file = source_reference.file; + } + field_type.check (analyzer); process_attributes (); @@ -239,6 +245,8 @@ public class Vala.Field : Member, Lockable { analyzer.current_source_file.add_type_dependency (field_type, SourceFileDependencyType.SOURCE); } + analyzer.current_source_file = old_source_file; + return !error; } } diff --git a/vala/valaforeachstatement.vala b/vala/valaforeachstatement.vala index efd2480f2..5e39ab532 100644 --- a/vala/valaforeachstatement.vala +++ b/vala/valaforeachstatement.vala @@ -223,6 +223,7 @@ public class Vala.ForeachStatement : Block { body.add_local_variable (element_variable); element_variable.active = true; + element_variable.checked = true; // analyze body owner = analyzer.current_symbol.scope; diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 01d6f13bf..573aaf5e1 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -395,6 +395,11 @@ public class Vala.MemberAccess : Expression { var access = SymbolAccessibility.PUBLIC; bool instance = false; bool klass = false; + + if (!member.check (analyzer)) { + return false; + } + if (member is Field) { var f = (Field) member; access = f.access; diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 8dd2ccd24..7f56cd802 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -649,9 +649,21 @@ public class Vala.Method : Member { Report.error (source_reference, "Non-abstract, non-extern methods must have bodies"); } + var old_source_file = analyzer.current_source_file; var old_symbol = analyzer.current_symbol; + var old_class = analyzer.current_class; + var old_struct = analyzer.current_struct; var old_return_type = analyzer.current_return_type; + + if (source_reference != null) { + analyzer.current_source_file = source_reference.file; + } analyzer.current_symbol = this; + if (parent_symbol is Class) { + analyzer.current_class = (Class) parent_symbol; + } else if (parent_symbol is Struct) { + analyzer.current_struct = (Struct) parent_symbol; + } analyzer.current_return_type = return_type; return_type.check (analyzer); @@ -698,7 +710,10 @@ public class Vala.Method : Member { body.check (analyzer); } + analyzer.current_source_file = old_source_file; analyzer.current_symbol = old_symbol; + analyzer.current_class = old_class; + analyzer.current_struct = old_struct; analyzer.current_return_type = old_return_type; if (analyzer.current_symbol.parent_symbol is Method) {