Fix inner class bug: the inner class cannot correctly refer to outer class' fields...
authorjzhou <jzhou>
Thu, 10 Nov 2011 19:33:30 +0000 (19:33 +0000)
committerjzhou <jzhou>
Thu, 10 Nov 2011 19:33:30 +0000 (19:33 +0000)
Robust/src/IR/SymbolTable.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/Tests/inner.java

index a47c63b20ddebef8540bafb5b0e9cf9714bfbbb7..3ada402962d337e5bcc5590360b9f56083643510 100644 (file)
@@ -9,6 +9,7 @@ public class SymbolTable {
   private HashSet valueset;
 
   private Vector<SymbolTable> parentIFs;
+  private SymbolTable surrounding;
 
 
   public SymbolTable() {
@@ -16,6 +17,7 @@ public class SymbolTable {
     valueset = new HashSet();
     parent = null;
     parentIFs = null;
+    this.surrounding = null;
   }
 
   public SymbolTable(SymbolTable parent) {
@@ -47,6 +49,9 @@ public class SymbolTable {
        hs.addAll(parentIFs.elementAt(i).getPSet(name));
       }
     }
+    if(this.surrounding != null) {
+       hs.addAll(this.surrounding.getPSet(name));
+    }
     if (table.containsKey(name)) {
       hs.addAll((HashSet)table.get(name));
     }
@@ -85,6 +90,13 @@ public class SymbolTable {
       }
     }
     
+    if(this.surrounding != null) {
+       d = this.surrounding.get(name);
+       if(d != null) {
+           return d;
+       }
+    }
+    
     return null;
   }
 
@@ -124,6 +136,9 @@ public class SymbolTable {
         hs.addAll(parentIFs.elementAt(i).getAllValueSet());
       }
     }
+    if(this.surrounding != null) {
+       hs.addAll(this.surrounding.getAllValueSet());
+    }
 
     hs.addAll(valueset);
     return hs;
@@ -144,6 +159,14 @@ public class SymbolTable {
   public void setParent(SymbolTable parent) {
     this.parent = parent;
   }
+  
+  public SymbolTable getSurrounding() {
+      return this.surrounding;
+  }
+  
+  public void setSurrounding(SymbolTable surrounding) {
+      this.surrounding = surrounding;
+  }
 
   public Vector<SymbolTable> getParentIFs() {
     return parentIFs;
index 5d96ada540fe3cd60cbef22df604c129548bfc5a..b461accb958d703325c4881117da9855cb24603a 100644 (file)
@@ -75,6 +75,13 @@ public class SemanticCheck {
              cd.getFieldTable().setParent(cd.getSuperDesc().getFieldTable());
              cd.getMethodTable().setParent(cd.getSuperDesc().getMethodTable());
              cd.getFlagTable().setParent(cd.getSuperDesc().getFlagTable());
+             // if this is an inner class, link together Field, Method and Flag
+             // tables from its surrounding class
+             if(cd.isInnerClass()) {
+                 cd.getFieldTable().setSurrounding(cd.getSurroundingDesc().getFieldTable());
+                 cd.getMethodTable().setSurrounding(cd.getSurroundingDesc().getMethodTable());
+                 cd.getFlagTable().setSurrounding(cd.getSurroundingDesc().getFlagTable());
+             }
            }
          }
         }
@@ -826,23 +833,9 @@ public class SemanticCheck {
       }
   }
 
-  FieldDescriptor recurseSurroundingClasses( ClassDescriptor icd, String varname ) {
-       if( null == icd || false == icd.isInnerClass() )
-               return null;
-       
-       ClassDescriptor surroundingDesc = icd.getSurroundingDesc();
-       if( null == surroundingDesc )
-               return null;
-       
-       SymbolTable fieldTable = surroundingDesc.getFieldTable();
-       FieldDescriptor fd = ( FieldDescriptor ) fieldTable.get( varname );
-       if( null != fd )
-               return fd;
-       return recurseSurroundingClasses( surroundingDesc, varname );
-  }
-
   FieldAccessNode fieldAccessExpression( ClassDescriptor icd, String varname, int linenum ) {
-       FieldDescriptor fd = recurseSurroundingClasses( icd, varname );
+        // first check if the field is belong to the icd or its parent class
+       FieldDescriptor fd = (FieldDescriptor)icd.getFieldTable().get(varname);
        if( null == fd )
                return null;
 
index 5e88df9e21a31d89e8ef649750cd265fed07e034..9061598df6fbbc4ffbd2356e05c43cba0ad045a0 100644 (file)
@@ -3,7 +3,7 @@ public class inner extends innerp {
   int f2;
 
   public inner() {
-    super.outer=31;
+    /*super.*/outer=31;
   }
 
   public static void main(String x[]) {
@@ -13,9 +13,14 @@ public class inner extends innerp {
 
   public void dotest() {
     outer=35;
+    outerprint();
     t tmp=new t();
     tmp.print();
   }
+  
+  public void outerprint() {
+      System.out.println("Outer class print: " + this.outer + "; " + this.f2);
+  }
 
   public class t extends innerpt {
     int outer;
@@ -30,14 +35,15 @@ public class inner extends innerp {
 
     public void print() {
       //should print 4 0 35
+      System.out.println("Inner class print: ");
       System.out.println(outer);
-      System.out.println(super.outer);
+      //System.out.println(super.outer);
       System.out.println(inner.this.outer);
-      System.out.println(inner.super.outer);
+      //System.out.println(inner.super.outer);
       System.out.println(f1);
       System.out.println(f2);
       System.out.println(f3);
-
+      outerprint();
     }
   }