From: david <david>
Date: Thu, 6 Jan 2011 23:16:19 +0000 (+0000)
Subject: This update adds initializers, but not for arrays
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a09d0c8935cb9252fec219b3242445c7eddc32b4;p=IRC.git

This update adds initializers, but not for arrays
---

diff --git a/Robust/src/IR/FieldDescriptor.java b/Robust/src/IR/FieldDescriptor.java
index ecd6777a..4a693228 100644
--- a/Robust/src/IR/FieldDescriptor.java
+++ b/Robust/src/IR/FieldDescriptor.java
@@ -26,7 +26,10 @@ public class FieldDescriptor extends Descriptor {
     this.safename = "___" + name + "___";
     this.uniqueid=count++;
     this.isglobal=isglobal;
-    if (en!=null) throw new Error("Field initializers not implemented");
+  }
+
+  public ExpressionNode getExpressionNode(){
+      return en;
   }
 
   public boolean isStatic() {
diff --git a/Robust/src/IR/Tree/BuildIR.java b/Robust/src/IR/Tree/BuildIR.java
index aef10756..96b2537e 100644
--- a/Robust/src/IR/Tree/BuildIR.java
+++ b/Robust/src/IR/Tree/BuildIR.java
@@ -52,6 +52,7 @@ public class BuildIR {
 	  continue;
 	if (isNode(type_pn,"class_declaration")) {
 	  ClassDescriptor cn=parseTypeDecl(type_pn);
+	  parseInitializers(cn);
 	  if (toanalyze!=null)
 	    toanalyze.add(cn);
 	  state.addClass(cn);
@@ -67,7 +68,7 @@ public class BuildIR {
         while(!tovisit.isEmpty()) {
           ClassDescriptor cd = (ClassDescriptor)tovisit.iterator().next();
           tovisit.remove(cd);
-          
+	  parseInitializers(cd);
           if(toanalyze != null) {
             toanalyze.add(cd);
           }
@@ -133,7 +134,26 @@ public class BuildIR {
       }
     }
   }
-  
+
+ public void parseInitializers(ClassDescriptor cn){
+	Vector fv=cn.getFieldVec();
+	for(int i=0;i<fv.size();i++) {
+	    FieldDescriptor fd=(FieldDescriptor)fv.get(i);
+ 	    if(fd.getExpressionNode()!=null) {
+		Iterator methodit = cn.getMethods();
+		while(methodit.hasNext()){
+		    MethodDescriptor currmd=(MethodDescriptor)methodit.next();
+		    if(currmd.isConstructor()){
+			BlockNode bn=state.getMethodBody(currmd);
+			NameNode nn=new NameNode(new NameDescriptor(fd.getSymbol()));
+			AssignmentNode an=new AssignmentNode(nn,fd.getExpressionNode(),new AssignOperation(1));
+			bn.addFirstBlockStatement(new BlockExpressionNode(an));			
+		    }
+		}
+	    }
+	}
+    }  
+
   private ClassDescriptor parseEnumDecl(ClassDescriptor cn, ParseNode pn) {
     ClassDescriptor ecd=new ClassDescriptor(pn.getChild("name").getTerminal(), false);
     ecd.setAsEnum();
diff --git a/Robust/src/Tests/DoTests b/Robust/src/Tests/DoTests
index 052cac2f..3ebdab0c 100755
--- a/Robust/src/Tests/DoTests
+++ b/Robust/src/Tests/DoTests
@@ -15,4 +15,5 @@ dotest CommandLineTest CommandLineTest.java hello hi
 dotest WriteFile WriteFile.java
 dotest ReadFile ReadFile.java
 dotest FileLength FileLength.java
-dotest IntegerTest IntegerTest.java
\ No newline at end of file
+dotest IntegerTest IntegerTest.java
+dotest InitializerTest InitializerTest.java
\ No newline at end of file