sdk: const correctness
[sdk] / compiler / libec / src / pass16.ec
index d179cc6..d32569f 100644 (file)
@@ -614,7 +614,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
                      thisMember = curMember;
                   }
 
-                  if(thisMember || method)
+                  if(instExp && (thisMember || method))
                   {
                      Expression instExpCopy = CopyExpression(instExp);
                      Expression setExp = null;
@@ -689,7 +689,7 @@ static bool ProcessInstMembers(Instantiation inst, Expression instExp, OldList l
    return fullSet || convert;
 }
 
-public void DeclareClass(Symbol classSym, char * className)
+public void DeclareClass(Symbol classSym, const char * className)
 {
    /*if(classSym.registered.templateClass)
    {
@@ -717,7 +717,7 @@ public void DeclareClass(Symbol classSym, char * className)
          if(!classSym.module) return;
          classSym._import = ClassImport
          {
-            isRemote = classSym.registered ? classSym.registered.isRemote : false;
+            isRemote = classSym.registered ? classSym.registered.isRemote : 0;
             name = CopyString(classSym.string);
          };
          classSym.module.classes.Add(classSym._import);
@@ -748,7 +748,7 @@ public void DeclareClass(Symbol classSym, char * className)
          classSym.idCode = classSym.id;
       }
    }
-   else if(classSym && curExternal.symbol.idCode < classSym.id)
+   else if(classSym && curExternal && curExternal.symbol.idCode < classSym.id)
    //else if(curExternal.symbol.id <= classSym.id)
    {
       // DANGER: (Moved here)
@@ -863,7 +863,7 @@ static void ProcessExpression(Expression exp)
                   inst.exp = null;
 
                   list.Remove(list.first);
-                  while(e = list.first)
+                  while((e = list.first))
                   {
                      list.Remove(e);
                      FreeExpression(e);
@@ -887,7 +887,7 @@ static void ProcessExpression(Expression exp)
                      exp.expType = expType;
                      exp.prev = prev;
                      exp.next = next;
-                     while(e = list.first)
+                     while((e = list.first))
                      {
                         list.Remove(e);
                         FreeExpression(e);
@@ -914,11 +914,12 @@ static void ProcessExpression(Expression exp)
 
                   if(!exp.list->count)
                   {
-                     exp.type = (ExpressionType)1000; // remove expression
+                     exp.type = dummyExp; // remove expression
+                     delete exp.list;
                   }
 
-                  // Take expression out...
-                  inst.exp = null;
+                  // Take expression out... -- It seems ProcessInstMembers() makes copies of it and it needs to be freed now
+                  // inst.exp = null;
                }
                else
                {
@@ -1180,7 +1181,7 @@ static void ProcessExpression(Expression exp)
          break;
       case opExp:
       {
-         bool assign = false;
+         //bool assign = false;
 
          switch(exp.op.op)
          {
@@ -1190,7 +1191,7 @@ static void ProcessExpression(Expression exp)
                   exp.op.exp2.usage.usageGet = true;
                if(exp.op.exp1)
                   exp.op.exp1.usage.usageSet = true;
-               assign = true;
+               //assign = true;
                break;
             case MUL_ASSIGN:
             case DIV_ASSIGN:
@@ -1204,7 +1205,7 @@ static void ProcessExpression(Expression exp)
             case OR_ASSIGN:
                if(exp.op.exp2)
                   exp.op.exp2.usage.usageGet = true;
-               assign = true;
+               //assign = true;
                if(exp.op.exp1)
                   exp.op.exp1.usage.usageSet = true;
                break;
@@ -1355,7 +1356,7 @@ static void ProcessExpression(Expression exp)
       case callExp:
       {
          Expression e;
-         Method method = null;
+         //Method method = null;
 
          ProcessExpression(exp.call.exp);
 
@@ -1592,7 +1593,7 @@ static void ProcessSpecifier(Specifier spec)
    }
 }
 
-static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list)
+static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation inst, OldList list, DataMember namedParentMember, bool parentMemberSet)
 {
    Symbol classSym = inst._class.symbol; // FindClass(inst._class.name);
    DataMember dataMember = null;
@@ -1606,8 +1607,26 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
 
       if(!dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
       {
-         if(!ProcessBracketInst_DataMember(dataMember, inst, list))
+         OldList * subList = 0; //(dataMember.type == structMember) ? MkList() : null;
+
+         if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember.name ? dataMember : namedParentMember, someMemberSet || parentMemberSet))
+         {
+            if(subList)
+               FreeList(subList, FreeInitializer);
+
             return false;
+         }
+         if(subList && subList->count)
+         {
+            ListAdd(list, MkInitializerList(subList));
+            someMemberSet = true;
+         }
+         else
+         {
+            if(list.count)
+               someMemberSet = true;
+            delete subList;
+         }
       }
       else
       {
@@ -1753,21 +1772,37 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
 
          if(member && member.initializer && member.initializer.type == expInitializer)
          {
-            Expression memberExp = null;
+            Initializer init { loc = yylloc };
+            if(namedParentMember.type == unionMember && dataMember.name)
+               init.id = MkIdentifier(dataMember.name);
+
             if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
                member.initializer.exp.expType._class.registered.type == structClass)
             {
                OldList * subList = MkList();
                ProcessBracketInst(member.initializer.exp.instance, subList);
                FreeExpression(member.initializer.exp);
-               ListAdd(list, MkInitializerList(subList));
+               if(subList->count)
+               {
+                  init.type = listInitializer;
+                  init.list = subList;
+               }
+               else
+               {
+                  FreeInitializer(init);
+                  init = null;
+               }
             }
             else
             {
                member.initializer.exp.usage.usageGet = true;
                ProcessExpression(member.initializer.exp);
-               ListAdd(list, MkInitializerAssignment(member.initializer.exp));
+               init.type = expInitializer;
+               init.exp = member.initializer.exp;
             }
+            if(init)
+               ListAdd(list, init);
+
             member.initializer.exp = null;
             FreeInitializer(member.initializer);
             member.initializer = null;
@@ -1775,13 +1810,20 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
          }
          else if(member && member.initializer && member.initializer.type == listInitializer)
          {
+            if(namedParentMember.type == unionMember && dataMember.name)
+               member.initializer.id = MkIdentifier(dataMember.name);
+
             ListAdd(list, member.initializer);
             member.initializer = null;
             someMemberSet = true;
          }
-         else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember)
+         else if(dataMember && dataMember.dataTypeString/* && !inst.fullSet*/ && parentMember.type != unionMember && namedParentMember.type != unionMember)
          {
             Symbol classSym;
+            Initializer init { loc = yylloc };
+            if(namedParentMember.type == unionMember && dataMember.name)
+               init.id = MkIdentifier(dataMember.name);
+
             if(!dataMember.dataType)
                dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
             classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
@@ -1793,10 +1835,25 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
                ProcessBracketInst(inst, subList);
                FreeInstance(inst);
 
-               ListAdd(list, MkInitializerList(subList));
+               if(subList->count)
+               {
+                  init.type = listInitializer;
+                  init.list = subList;
+               }
+               else
+               {
+                  FreeInitializer(init);
+                  init = null;
+               }
             }
             else
-               ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
+            {
+               init.type = expInitializer;
+               init.exp = MkExpConstant("0");
+            }
+            someMemberSet = true;
+            if(init)
+               ListAdd(list, init);
          }
       }
       /*
@@ -1805,10 +1862,15 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
       */
    }
    // TESTING THIS NEW CODE FOR ANCHORS...
-   if(parentMember.type == unionMember && !someMemberSet)
+   if(parentMember.type == unionMember && !someMemberSet && !parentMemberSet)
    {
       Symbol classSym;
+      Initializer init { loc = yylloc };
+
       dataMember = parentMember.members.first;
+      if(namedParentMember.type == unionMember && dataMember.name)
+         init.id = MkIdentifier(dataMember.name);
+
       if(!dataMember.dataType && dataMember.dataTypeString)
          dataMember.dataType = ProcessTypeString(dataMember.dataTypeString, false);
       classSym = (dataMember.dataType && dataMember.dataType.kind == classType) ? dataMember.dataType._class : null; // FindClass(dataMember.dataTypeString);
@@ -1820,10 +1882,15 @@ static bool ProcessBracketInst_DataMember(DataMember parentMember, Instantiation
          ProcessBracketInst(inst, subList);
          FreeInstance(inst);
 
-         ListAdd(list, MkInitializerList(subList));
+         init.type = listInitializer;
+         init.list = subList;
       }
       else
-         ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
+      {
+         init.type = expInitializer;
+         init.exp = MkExpConstant("0");
+      }
+      ListAdd(list, init);
    }
    return true;
 }
@@ -1848,11 +1915,19 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
       {
          if(!dataMember.isProperty && !dataMember.name && (dataMember.type == unionMember || dataMember.type == structMember))
          {
-            if(!ProcessBracketInst_DataMember(dataMember, inst, list))
+            OldList * subList = 0 /*(dataMember.type == structMember ? MkList() : null)*/;
+
+            if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember, false))
             {
+               if(subList)
+                  FreeList(subList, FreeInitializer);
                recursionCount--;
                return false;
             }
+            if(dataMember.type == structMember || (subList && subList->count))
+               ListAdd(list, MkInitializerList(subList));
+            else
+               delete subList;
          }
          else
          {
@@ -1986,7 +2061,6 @@ static bool ProcessBracketInst(Instantiation inst, OldList list)
             if(dataMember.isProperty) continue;
             if(member && member.initializer && member.initializer.type == expInitializer)
             {
-               Expression memberExp = null;
                if(member.initializer.exp.type == instanceExp && member.initializer.exp.expType &&
                   member.initializer.exp.expType._class && member.initializer.exp.expType._class.registered && member.initializer.exp.expType._class.registered.type == structClass)
                {
@@ -2157,6 +2231,7 @@ static void ProcessDeclaration(Declaration decl)
 
             {
                char className[1024];
+               className[0] = 0;
 
                decl.type = initDeclaration;
                decl.specifiers = MkList();
@@ -2248,6 +2323,20 @@ static void ProcessDeclaration(Declaration decl)
                {
                   Expression newCall;
 
+                  strcpy(className, "__ecereClass_");
+
+                  if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
+                  {
+                     classSym = FindClass(classSym.registered.templateClass.fullName);
+                     FullClassNameCat(className, classSym.string, true);
+                  }
+                  else
+                     FullClassNameCat(className, inst._class.name, true);
+                  MangleClassName(className);
+
+                  if(classSym)
+                     DeclareClass(classSym, className);
+
                   if(classSym && classSym.registered && classSym.registered.type == noHeadClass &&
                      (classSym.registered.templateClass ? classSym.registered.templateClass.fixed : classSym.registered.fixed))
                   {
@@ -2257,26 +2346,11 @@ static void ProcessDeclaration(Declaration decl)
                   }
                   else
                   {
-                     strcpy(className, "__ecereClass_");
-
-                     if(classSym && classSym.registered && classSym.registered.type == noHeadClass && classSym.registered.templateClass)
-                     {
-                        classSym = FindClass(classSym.registered.templateClass.fullName);
-                        FullClassNameCat(className, classSym.string, true);
-                     }
-                     else
-                        FullClassNameCat(className, inst._class.name, true);
-                     MangleClassName(className);
-
-                     DeclareClass(classSym, className);   // THIS WAS IN C VERSION BUT NOT IN eC VERSION?
                      newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
                      ProcessExpressionType(newCall);
                      newCall.byReference = true;
                   }
 
-                  if(classSym)
-                     DeclareClass(classSym, className);
-
                   if(inst.exp)
                   {
                      Expression exp, newExp;
@@ -2635,11 +2709,12 @@ public void ProcessInstantiations()
                   //thisClass = regClass;
                   if(propertyWatch.compound)
                   {
+                     /* This was already added in pass15:ProcessClass()
                      Symbol thisSymbol
                      {
                         string = CopyString("this");
                         type = MkClassTypeSymbol(_class.symbol); //regClass.fullName);
-                     };
+                     };*/
                      propertyWatch.compound.compound.context.symbols.Add((BTNode)thisSymbol);
                      curExternal = null;
                      ProcessStatement(propertyWatch.compound);