From 55ac50bf986c3efb942aa04ff72ef16b6a9e9ab1 Mon Sep 17 00:00:00 2001 From: jzhou Date: Thu, 10 Nov 2011 19:33:30 +0000 Subject: [PATCH] Fix inner class bug: the inner class cannot correctly refer to outer class' fields/methods and cannot refre to its super class' fields too --- Robust/src/IR/SymbolTable.java | 23 +++++++++++++++++++++++ Robust/src/IR/Tree/SemanticCheck.java | 25 +++++++++---------------- Robust/src/Tests/inner.java | 14 ++++++++++---- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/Robust/src/IR/SymbolTable.java b/Robust/src/IR/SymbolTable.java index a47c63b2..3ada4029 100644 --- a/Robust/src/IR/SymbolTable.java +++ b/Robust/src/IR/SymbolTable.java @@ -9,6 +9,7 @@ public class SymbolTable { private HashSet valueset; private Vector 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 getParentIFs() { return parentIFs; diff --git a/Robust/src/IR/Tree/SemanticCheck.java b/Robust/src/IR/Tree/SemanticCheck.java index 5d96ada5..b461accb 100644 --- a/Robust/src/IR/Tree/SemanticCheck.java +++ b/Robust/src/IR/Tree/SemanticCheck.java @@ -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; diff --git a/Robust/src/Tests/inner.java b/Robust/src/Tests/inner.java index 5e88df9e..9061598d 100644 --- a/Robust/src/Tests/inner.java +++ b/Robust/src/Tests/inner.java @@ -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(); } } -- 2.34.1