don't allow access to private members
authorJürg Billeter <j@bitron.ch>
Sat, 8 Jul 2006 14:33:04 +0000 (14:33 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 8 Jul 2006 14:33:04 +0000 (14:33 +0000)
2006-07-08  Jürg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala: don't allow access to private members

svn path=/trunk/; revision=74

vala/ChangeLog
vala/vala/valasemanticanalyzer.vala

index cfda68d..6a18aaf 100644 (file)
@@ -1,5 +1,9 @@
 2006-07-08  Jürg Billeter  <j@bitron.ch>
 
+       * vala/valasemanticanalyzer.vala: don't allow access to private members
+
+2006-07-08  Jürg Billeter  <j@bitron.ch>
+
        * vala/valasemanticanalyzer.vala: check method signatures of overriding
          methods
        * vala/parser.y, vala/valaclassregisterfunction.vala,
index 279b9e7..4b018bc 100644 (file)
@@ -466,6 +466,16 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                expr.static_type = expr.inner.static_type;
        }
 
+       private DataType find_parent_type (Symbol sym) {
+               while (sym != null) {
+                       if (sym.node is DataType) {
+                               return (DataType) sym.node;
+                       }
+                       sym = sym.parent_symbol;
+               }
+               return null;
+       }
+
        public override void visit_member_access (MemberAccess! expr) {
                Symbol base_symbol = null;
 
@@ -517,6 +527,25 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        return;
                }
                
+               var member = expr.symbol_reference.node;
+               MemberAccessibility access = MemberAccessibility.PUBLIC;
+               if (member is Field) {
+                       access = ((Field) member).access;
+               } else if (member is Method) {
+                       access = ((Method) member).access;
+               }
+               
+               if (access != MemberAccessibility.PUBLIC) {
+                       var target_type = (DataType) member.symbol.parent_symbol.node;
+                       var this_type = find_parent_type (current_symbol);
+                       
+                       if (target_type != this_type) {
+                               expr.error = true;
+                               Report.error (expr.source_reference, "Access to private member `%s' denied".printf (member.symbol.get_full_name ()));
+                               return;
+                       }
+               }
+               
                current_source_file.add_symbol_dependency (expr.symbol_reference, SourceFileDependencyType.SOURCE);
 
                expr.static_type = get_static_type_for_node (expr.symbol_reference.node);