ecere/com: Solved class registration ordering issues
authorJerome St-Louis <jerome@ecere.com>
Mon, 19 Nov 2012 11:58:13 +0000 (06:58 -0500)
committerJerome St-Louis <jerome@ecere.com>
Mon, 19 Nov 2012 12:03:51 +0000 (07:03 -0500)
- Resolved conditional jumps based on uninitialized values reported by Valgrind
 (Was mistakenly comparing against 'foundation' class (class) virtual table for virtual methods not found in there)
- Ultimately replaced that whole extra code by the section of code in the if block above (move it outside the if)
- Tested with EceRIS CodedLocation>LocationAbbreviation>Location>Id structure and both orders of LocationAbbreviation/CodedLocation
- Solved base type correction for enum base classes using code from RegisterClass

ecere/src/com/instance.ec

index 3e65b5c..816a683 100644 (file)
@@ -1896,14 +1896,27 @@ static void FixDerivativesBase(Class base, Class mod)
       int sizeClass = _class.sizeClass - _class.offsetClass;
       Class enumBase = null;
       char * dataTypeString = null;
+      // NOTE: baseClass is class(class)
       Class baseClass;
       uint offsetBefore = _class.offset;
 
       int offsetClass, totalSizeClass;
 
       for(baseClass = base; baseClass.base; baseClass = baseClass.base);
-      
-      if(base && !base.internalDecl && (base.type == noHeadClass || base.type == structClass || base.type == normalClass)) type = base.type;
+
+      if(base && !base.internalDecl && (base.type == noHeadClass || base.type == structClass || base.type == normalClass))
+      {
+         // Normal classes inheriting off simple classes should become no head classes
+         if(base.type == structClass && type == normalClass)
+            type = noHeadClass;
+         else
+            type = base.type;
+      }
+      if(base && (_class.type == normalClass || _class.type == noHeadClass || _class.type == structClass) &&
+         (base.type == unitClass || base.type == bitClass || base.type == enumClass))
+      {
+         type = base.type;
+      }
 
       if(type == enumClass)
       {
@@ -1992,6 +2005,7 @@ static void FixDerivativesBase(Class base, Class mod)
                if(method.type == virtualMethod)
                   method.vid += mod.base.vTblSize - baseClass.vTblSize;
             }
+         }
 
             for(b = mod.base; b && b != null; b = b.base)
             {
@@ -2023,8 +2037,10 @@ static void FixDerivativesBase(Class base, Class mod)
                   }
                }
             }
-         }
+         //}
 
+         // Trying to simply move out the above block of code outside the if to handle this
+         /*
          // Also doing this now, otherwise overridden methods of base classes from intermediate classes will not be set in higher level class
          // (e.g. OnGetString overridden in Id , Location inheriting from Id, LocationAbbreviation created later inheriting from Location would not get Id's OnGetString)
          for(b = mod.base; b && b != null; b = b.base)
@@ -2034,11 +2050,12 @@ static void FixDerivativesBase(Class base, Class mod)
             {
                if(vMethod.type == virtualMethod)
                {
-                  if(_class._vTbl[vMethod.vid] == baseClass._vTbl[vMethod.vid] && _class._vTbl[vMethod.vid] != _class.base._vTbl[vMethod.vid])
+                  if(_class._vTbl[vMethod.vid] == b._vTbl[vMethod.vid] && _class._vTbl[vMethod.vid] != _class.base._vTbl[vMethod.vid])
                      _class._vTbl[vMethod.vid] = _class.base._vTbl[vMethod.vid];
                }
             }
          }
+         */
       }
 
       // _class.defaultAlignment = base ? base.defaultAlignment : 0;