compiler/libec/pass16: Bracket instantiations fixes
authorJerome St-Louis <jerome@ecere.com>
Wed, 2 Jul 2014 14:50:09 +0000 (10:50 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 2 Jul 2014 14:50:09 +0000 (10:50 -0400)
- Zeroing brackets fixes for arrays, struct class, struct type
  (Warnings found in CornerBlocksServer, CrossWordsServer, eCom)

compiler/bootstrap/libec/bootstrap/pass16.c
compiler/libec/src/pass16.ec

index 6d80908..d22c442 100644 (file)
@@ -2766,7 +2766,30 @@ FreeInstance(inst);
 ListAdd(list, MkInitializerList(subList));
 }
 else if(dataMember->dataType->kind == 12)
-ListAdd(list, MkInitializerList(MkListOne(MkInitializerAssignment(MkExpConstant("0")))));
+{
+struct Type * t = dataMember->dataType->__anon1.type;
+struct Initializer * inner = MkInitializerAssignment((((void *)0))), * i = inner;
+
+while(t && t->kind == 12)
+{
+i = MkInitializerList(MkListOne(i));
+t = t->__anon1.type;
+}
+if(t && t->kind == 8 && t->__anon1._class && t->__anon1._class->__anon1.registered && t->__anon1._class->__anon1.registered->type == 1)
+{
+struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
+struct Specifier * spec = _MkSpecifierName(t->__anon1._class->__anon1.registered->name, classSym, (((void *)0)));
+struct Instantiation * inst = MkInstantiation(spec, (((void *)0)), (((void *)0)));
+
+ProcessBracketInst(inst, subList);
+FreeInstance(inst);
+inner->type = 1;
+inner->__anon1.list = subList;
+}
+else
+inner->__anon1.exp = MkExpConstant("0");
+ListAdd(list, MkInitializerList(MkListOne(i)));
+}
 else
 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
 }
@@ -3667,15 +3690,18 @@ FreeInstance(inst);
 init->type = 1;
 init->__anon1.list = subList;
 }
-else if(dataMember->dataType && dataMember->dataType->kind == 12)
+else if(dataMember->dataType && (dataMember->dataType->kind == 12 || dataMember->dataType->kind == 9))
 {
-struct Type * t = dataMember->dataType->__anon1.type;
+struct Type * t = dataMember->dataType->kind == 12 ? dataMember->dataType->__anon1.type : dataMember->dataType->__anon1.__anon1.members.first;
 struct Initializer * i = MkInitializerAssignment(MkExpConstant("0"));
 
-while(t && t->kind == 12)
+while(t && (t->kind == 12 || t->kind == 9))
 {
 i = MkInitializerList(MkListOne(i));
+if(t->kind == 12)
 t = t->__anon1.type;
+else if(t->kind == 9)
+t = t->__anon1.__anon1.members.first;
 }
 init->type = 1;
 init->__anon1.list = MkListOne(i);
index 506acb7..ff48f8e 100644 (file)
@@ -1891,14 +1891,17 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
          init.type = listInitializer;
          init.list = subList;
       }
-      else if(dataMember.dataType && dataMember.dataType.kind == arrayType)
+      else if(dataMember.dataType && (dataMember.dataType.kind == arrayType || dataMember.dataType.kind == structType))
       {
-         Type t = dataMember.dataType.type;
+         Type t = dataMember.dataType.kind == arrayType ? dataMember.dataType.type : dataMember.dataType.members.first;
          Initializer i = MkInitializerAssignment(MkExpConstant("0"));
-         while(t && t.kind == arrayType)
+         while(t && (t.kind == arrayType || t.kind == structType))
          {
             i = MkInitializerList(MkListOne(i));
-            t = t.type;
+            if(t.kind == arrayType)
+               t = t.type;
+            else if(t.kind == structType)
+               t = t.members.first;
          }
          init.type = listInitializer;
          init.list = MkListOne(i);
@@ -2123,14 +2126,35 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
                if(classSym && classSym.registered && classSym.registered.type == structClass)
                {
                   OldList * subList = MkList();
-                  Specifier spec = _MkSpecifierName/*MkClassName*/(dataMember.dataTypeString, classSym, null);
+                  Specifier spec = _MkSpecifierName(dataMember.dataTypeString, classSym, null);
                   Instantiation inst = MkInstantiation(spec, null, null);
                   ProcessBracketInst(inst, subList);
                   FreeInstance(inst);
                   ListAdd(list, MkInitializerList(subList));
                }
                else if(dataMember.dataType.kind == arrayType)
-                  ListAdd(list, MkInitializerList(MkListOne(MkInitializerAssignment(MkExpConstant("0")))));
+               {
+                  Type t = dataMember.dataType.type;
+                  Initializer inner = MkInitializerAssignment(null), i = inner;
+                  while(t && t.kind == arrayType)
+                  {
+                     i = MkInitializerList(MkListOne(i));
+                     t = t.type;
+                  }
+                  if(t && t.kind == classType && t._class && t._class.registered && t._class.registered.type == structClass)
+                  {
+                     OldList * subList = MkList();
+                     Specifier spec = _MkSpecifierName(t._class.registered.name, classSym, null);
+                     Instantiation inst = MkInstantiation(spec, null, null);
+                     ProcessBracketInst(inst, subList);
+                     FreeInstance(inst);
+                     inner.type = listInitializer;
+                     inner.list = subList;
+                  }
+                  else
+                     inner.exp = MkExpConstant("0");
+                  ListAdd(list,  MkInitializerList(MkListOne(i)));
+               }
                else
                   ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
             }