Bug fix in array initialization: handle the special case like {{null,null}}
authorjzhou <jzhou>
Fri, 18 Feb 2011 18:53:13 +0000 (18:53 +0000)
committerjzhou <jzhou>
Fri, 18 Feb 2011 18:53:13 +0000 (18:53 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/IR/TypeDescriptor.java

index 26290be75b3c607543469f84b0e2ba6e12503d93..d5f00a295f48889e41f6ae742f7d13f10814c8b5 100644 (file)
@@ -664,22 +664,22 @@ public class BuildCode {
 
     outstructs.println("#define STRINGARRAYTYPE "+
                        (state.getArrayNumber(
-                          (new TypeDescriptor(typeutil.getClass(TypeUtil.StringClass))).makeArray(state, true))+state.numClasses()));
+                          (new TypeDescriptor(typeutil.getClass(TypeUtil.StringClass))).makeArray(state))+state.numClasses()));
 
     outstructs.println("#define OBJECTARRAYTYPE "+
                        (state.getArrayNumber(
-                          (new TypeDescriptor(typeutil.getClass(TypeUtil.ObjectClass))).makeArray(state, true))+state.numClasses()));
+                          (new TypeDescriptor(typeutil.getClass(TypeUtil.ObjectClass))).makeArray(state))+state.numClasses()));
 
 
     outstructs.println("#define STRINGTYPE "+typeutil.getClass(TypeUtil.StringClass).getId());
     outstructs.println("#define CHARARRAYTYPE "+
-                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state, true))+state.numClasses()));
+                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state))+state.numClasses()));
 
     outstructs.println("#define BYTEARRAYTYPE "+
-                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state, true))+state.numClasses()));
+                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state))+state.numClasses()));
 
     outstructs.println("#define BYTEARRAYARRAYTYPE "+
-                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state, true).makeArray(state, true))+state.numClasses()));
+                       (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state).makeArray(state))+state.numClasses()));
 
     outstructs.println("#define NUMCLASSES "+state.numClasses());
     int totalClassSize = state.numClasses() + state.numArrays();
@@ -688,7 +688,7 @@ public class BuildCode {
       outstructs.println("#define STARTUPTYPE "+typeutil.getClass(TypeUtil.StartupClass).getId());
       outstructs.println("#define TAGTYPE "+typeutil.getClass(TypeUtil.TagClass).getId());
       outstructs.println("#define TAGARRAYTYPE "+
-                         (state.getArrayNumber(new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass)).makeArray(state, true))+state.numClasses()));
+                         (state.getArrayNumber(new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass)).makeArray(state))+state.numClasses()));
     }
   }
 
@@ -1212,7 +1212,7 @@ public class BuildCode {
       if (needcomma)
        outclassdefs.print(", ");
       TypeDescriptor tdelement=arraytable[i].dereference();
-      if (tdelement.isArray()||tdelement.isClass())
+      if (tdelement.isArray()||tdelement.isClass()||tdelement.isNull())
        outclassdefs.print("sizeof(void *)");
       else
        outclassdefs.print("sizeof("+tdelement.getSafeSymbol()+")");
@@ -2075,7 +2075,7 @@ public class BuildCode {
     for(int i=0; i<objecttemp.numPrimitives(); i++) {
       TempDescriptor td=objecttemp.getPrimitive(i);
       TypeDescriptor type=td.getType();
-      if (type.isNull())
+      if (type.isNull() && !type.isArray())
        output.println("   void * "+td.getSafeSymbol()+";");
       else if (state.MGC && type.isClass() && type.getClassDesc().isEnum()) {
         output.println("   int " + td.getSafeSymbol() + ";");
index a22eaaa906492b8cf56df2fa2f9491b0c29d6955..7d7121e5390793897b017950173bedc7f2b9b959 100644 (file)
@@ -583,7 +583,7 @@ public class BuildIR {
       TypeDescriptor td=parseTypeDescriptor(nn.getChild("basetype"));
       Integer numdims=(Integer)nn.getChild("dims").getLiteral();
       for(int i=0; i<numdims.intValue(); i++)
-       td=td.makeArray(state, true);
+       td=td.makeArray(state);
       return td;
     } else {
       System.out.println(pn.PPrint(2, true));
@@ -634,7 +634,7 @@ public class BuildIR {
       ParseNode tmp=vardecl;
       TypeDescriptor arrayt=t;
       while (tmp.getChild("single")==null) {
-       arrayt=arrayt.makeArray(state, true);
+       arrayt=arrayt.makeArray(state);
        tmp=tmp.getChild("array");
       }
       String identifier=tmp.getChild("single").getTerminal();
@@ -765,7 +765,7 @@ public class BuildIR {
       if (pn.getChild("dims_opt").getLiteral()!=null)
        num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
       for(int i=0; i<(args.size()+num); i++)
-       td=td.makeArray(state, true);
+       td=td.makeArray(state);
       CreateObjectNode con=new CreateObjectNode(td, isglobal, disjointId);
       for(int i=0; i<args.size(); i++) {
        con.addArgument((ExpressionNode)args.get(i));
@@ -777,7 +777,7 @@ public class BuildIR {
       if (pn.getChild("dims_opt").getLiteral()!=null)
     num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
       for(int i=0; i<num; i++)
-    td=td.makeArray(state, true);
+    td=td.makeArray(state);
       CreateObjectNode con=new CreateObjectNode(td, false, null);
       // TODO array initializers
       ParseNode ipn = pn.getChild("initializer");     
@@ -1084,7 +1084,7 @@ public class BuildIR {
        ParseNode tmp=vardecl;
        TypeDescriptor arrayt=t;
        while (tmp.getChild("single")==null) {
-         arrayt=arrayt.makeArray(state, true);
+         arrayt=arrayt.makeArray(state);
          tmp=tmp.getChild("array");
        }
        String identifier=tmp.getChild("single").getTerminal();
@@ -1278,7 +1278,7 @@ public class BuildIR {
 
        ParseNode tmp=paramn;
        while (tmp.getChild("single")==null) {
-         type=type.makeArray(state, true);
+         type=type.makeArray(state);
          tmp=tmp.getChild("array");
        }
        String paramname=tmp.getChild("single").getTerminal();
index 0607af895a59ce282e7884cbc7af6d99c0e55edf..7e475f725ab68e6670d770907e59b5f86511f6a6 100644 (file)
@@ -896,7 +896,7 @@ public class SemanticCheck {
       }
     }
     if(out_type != null) {
-      out_type = out_type.makeArray(state, false);
+      out_type = out_type.makeArray(state);
       //out_type.setStatic();
     }
     ain.setType(out_type);
index 1ca436236593d1d1769a5684938ff2978c34a493..cb67bb9308be3f332b37d19b7536910cc97f4d35 100644 (file)
@@ -82,14 +82,12 @@ public class TypeDescriptor extends Descriptor {
            name.equals("Objectwrapper"));
   }
 
-  public TypeDescriptor makeArray(State state, boolean addflag) {
+  public TypeDescriptor makeArray(State state) {
     TypeDescriptor td=new TypeDescriptor(getSymbol());
     td.arraycount=arraycount+1;
     td.type=type;
     td.class_desc=class_desc;
-    if(addflag) {
-      state.addArrayType(td);
-    }
+    state.addArrayType(td);
     return td;
   }
 
@@ -143,7 +141,8 @@ public class TypeDescriptor extends Descriptor {
       return "float";
     else if (isOffset())
       return "short";
-    else throw new Error("Error Type: "+type);
+    else 
+      throw new Error("Error Type: "+type);
   }
 
   public String getRepairSymbol() {
@@ -347,7 +346,7 @@ public class TypeDescriptor extends Descriptor {
     else if (type==VOID)
       return "void";
     else if (type==NULL)
-      return "null";
+      return "NULL";
     else if (type==TAG)
       return TypeUtil.TagClass;
     else if (type==OFFSET)