Fix a bug of default constructor: the default constructor should construct the super...
authorjzhou <jzhou>
Thu, 24 Feb 2011 20:09:26 +0000 (20:09 +0000)
committerjzhou <jzhou>
Thu, 24 Feb 2011 20:09:26 +0000 (20:09 +0000)
Robust/src/IR/MethodDescriptor.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/SemanticCheck.java

index 3f58a7cefec0f645ac1fbcc3ba70bcfcb3766b83..008428974ec2a26f3cfc393b051fb110ceff6907 100644 (file)
@@ -21,6 +21,8 @@ public class MethodDescriptor extends Descriptor {
   protected boolean isglobal;
   protected boolean isstaticblock;  // flag to indicate if this is a static block
   protected boolean isinvokedbystatic;  // flag to indicate if this method is invoked by some static block
+  
+  protected boolean isdefaultconstructor; // flag to indicate if this is a default constructor
 
   public MethodDescriptor(Modifiers m, TypeDescriptor rt, String identifier) {
     super(identifier);
@@ -33,6 +35,8 @@ public class MethodDescriptor extends Descriptor {
     paramtable=new SymbolTable();
     thisvd=null;
     isstaticblock = false;
+    this.isinvokedbystatic = false;
+    this.isdefaultconstructor = false;
   }
 
   public Modifiers getModifiers() {
@@ -208,4 +212,12 @@ public class MethodDescriptor extends Descriptor {
     st+=")";
     return st;
   }
+  
+  public boolean isDefaultConstructor() {
+    return this.isdefaultconstructor;
+  }
+  
+  public void setDefaultConstructor() {
+    this.isdefaultconstructor = true;
+  }
 }
index 7d7121e5390793897b017950173bedc7f2b9b959..4e9c36e3c6835861afa49c2204040b51e850cc09 100644 (file)
@@ -448,6 +448,21 @@ public class BuildIR {
     }
     cn.setModifiers(parseModifiersList(pn.getChild("modifiers")));
     parseClassBody(cn, pn.getChild("classbody"));
+    
+    boolean hasConstructor = false;
+    for(Iterator method_it=cn.getMethods(); method_it.hasNext();) {
+      MethodDescriptor md=(MethodDescriptor)method_it.next();
+      hasConstructor |= md.isConstructor();
+    }
+    if((!hasConstructor) && (!cn.isEnum())) {
+      // add a default constructor for this class
+      MethodDescriptor md = new MethodDescriptor(new Modifiers(Modifiers.PUBLIC),
+          cn.getSymbol(), false);
+      BlockNode bn=new BlockNode();
+      state.addTreeCode(md,bn);
+      md.setDefaultConstructor();
+      cn.addMethod(md);
+    }
     return cn;
   }
 
index 7e475f725ab68e6670d770907e59b5f86511f6a6..97dec032ed97e272bbe94ef97fb2fa0174f78ea5 100644 (file)
@@ -64,20 +64,17 @@ public class SemanticCheck {
        checkField(cd,fd);
       }
       
-      boolean hasConstructor = false;
       for(Iterator method_it=cd.getMethods(); method_it.hasNext();) {
-       MethodDescriptor md=(MethodDescriptor)method_it.next();
-       checkMethod(cd,md);
-    hasConstructor |= md.isConstructor();
-      }
-      if((!hasConstructor) && (!cd.isEnum())) {
-        // add a default constructor for this class
-        MethodDescriptor md = new MethodDescriptor(new Modifiers(Modifiers.PUBLIC),
-            cd.getSymbol(), false);
-        BlockNode bn=new BlockNode();
-        state.addTreeCode(md,bn);
-        cd.addMethod(md);
+        MethodDescriptor md=(MethodDescriptor)method_it.next();
         checkMethod(cd,md);
+        if(md.isDefaultConstructor() && (cd.getSuperDesc() != null)) {
+          // add the construction of it super class, can only be super()
+          NameDescriptor nd=new NameDescriptor("super");
+          MethodInvokeNode min=new MethodInvokeNode(nd);
+          BlockExpressionNode ben=new BlockExpressionNode(min);
+          BlockNode bn = state.getMethodBody(md);
+          bn.addFirstBlockStatement(ben);
+        }
       }
     }
   }