ecere/com/instance: Fixed _strto(u)i64() - *endPtr wasn't always set
[sdk] / ecere / src / com / instance.ec
index 1168cd8..6e9ad66 100644 (file)
@@ -355,7 +355,7 @@ public:
    ClassTemplateArgument * templateArgs;
    Class templateClass;
    OldList templatized;
-   int numParams;
+   int numParams;       // TOTAL number of params including all base classes; use templateParams.count for this level
    bool isInstanceClass;
    bool byValueSystemClass;
 
@@ -1031,6 +1031,7 @@ private struct BlockPool
 
    void Remove(MemBlock block)
    {
+      MemPart part = block.part;
       /*if(blockSize == 28)
          printf("BlockPool::Remove (%d)\n", blockSize);*/
       if(block.prev)
@@ -1052,14 +1053,13 @@ private struct BlockPool
          printf("Setting new free block: part = %x\n", block.part);
       }*/
 
-      block.part.blocksUsed--;
+      part.blocksUsed--;
       numBlocks--;
-      block.part.pool->usedSpace -= block.size;
+      part.pool->usedSpace -= block.size;
 
-      if(!block.part.blocksUsed && numBlocks && totalSize > numBlocks + numBlocks / 2)
+      if(!part.blocksUsed && numBlocks && totalSize > numBlocks + numBlocks / 2)
       {
          MemBlock next = free, prev = null;
-         MemPart part = block.part;
          free = null;
          totalSize -= part.size;
          /*if(blockSize == 28)
@@ -2561,7 +2561,8 @@ public dllexport Class eSystem_RegisterClass(ClassType type, const char * name,
          }
          {
             NameSpace * ns = _class.nameSpace;
-            while(ns->parent &&
+            while(ns != nameSpace &&
+               ns->parent &&
                !ns->classes.first &&
                !ns->functions.first &&
                !ns->defines.first &&
@@ -2935,6 +2936,7 @@ static void FreeTemplateArg(Class template, ClassTemplateParameter param, int id
    {
       case type:
          delete (void *)template.templateArgs[id].dataTypeString;
+         template.templateArgs[id].dataTypeClass = null;
          break;
       case identifier:
          delete (void *)template.templateArgs[id].memberString;
@@ -2969,6 +2971,7 @@ static void FreeTemplateArgs(Class template)
                {
                   case type:
                      delete (void *)template.templateArgs[id].dataTypeString;
+                     template.templateArgs[id].dataTypeClass = null;
                      break;
                   case identifier:
                      delete (void *)template.templateArgs[id].memberString;
@@ -2994,12 +2997,9 @@ static void FreeTemplate(Class template)
       if(link)
          template.nameSpace->classes.Delete((BTNode)link);
    }
-   FreeTemplateArgs(template);
 
-   delete (void *)template.fullName;
-   delete (void *)template.name;
-   delete (void *)template.templateArgs;
-   delete (void *)template.dataTypeString;
+   FreeTemplatesDerivatives(template);
+   FreeTemplateArgs(template);
 
    while((deriv = template.derivatives.first))
    {
@@ -3007,6 +3007,11 @@ static void FreeTemplate(Class template)
       template.derivatives.Delete(deriv);
    }
 
+   delete (void *)template.fullName;
+   delete (void *)template.name;
+   delete template.templateArgs;
+   delete (void *)template.dataTypeString;
+
    if(template.module)
       template.module.classes.Delete(template);
    else
@@ -3023,8 +3028,6 @@ static void FreeTemplates(Class _class)
    }
 
    FreeTemplateArgs(_class);
-   //if(_class.templateArgs)
-      //printf("Deleting  Template args for %s\n", _class.name);
    delete _class.templateArgs;
    delete (void *)_class.dataTypeString;
 
@@ -3065,9 +3068,6 @@ public dllexport void eClass_Unregister(Class _class)
 
    FreeTemplates(_class);
 
-   FreeTemplateArgs(_class);
-   delete _class.templateArgs;
-
    while((template = _class.templatized.first))
    {
       FreeTemplate(template.data);
@@ -3289,25 +3289,20 @@ public int64 _strtoi64(const char * string, const char ** endString, int base)
       else if(ch >= 'A' && ch <= 'Z')
          ch -= ('A'- 10);
       else
-      {
-         if(endString)
-            *endString = string + c;
          // Invalid character
          break;
-      }
       if(ch < base)
       {
          value *= base;
          value += ch;
       }
       else
-      {
-         if(endString)
-            *endString = string + c;
          // Invalid character
          break;
-      }
    }
+   if(endString)
+      *endString = string + c;
+
    return sign*value;
 }
 
@@ -3344,25 +3339,19 @@ public uint64 _strtoui64(const char * string, const char ** endString, int base)
       else if(ch >= 'A' && ch <= 'Z')
          ch -= ('A' - 10);
       else
-      {
-         if(endString)
-            *endString = string + c;
          // Invalid character
          break;
-      }
       if(ch < base)
       {
          value *= base;
          value += ch;
       }
       else
-      {
-         if(endString)
-            *endString = string + c;
          // Invalid character
          break;
-      }
    }
+   if(endString)
+      *endString = string + c;
    return sign*value;
 }
 
@@ -3813,6 +3802,7 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
                         {
                            int id = p;
                            Class sClass;
+                           // NOTE: This struct 'arg' here is only to build up templateString
                            ClassTemplateArgument arg;
                            for(sClass = expClass.base; sClass; sClass = sClass.base) id += sClass.templateParams.count;
                            arg = expClass.templateArgs[id];
@@ -3824,8 +3814,7 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
                               {
                                  if(cParam.type == type && arg.dataTypeString && !strcmp(cParam.name, arg.dataTypeString))
                                  {
-                                    arg.dataTypeString = templatedClass.templateArgs[p].dataTypeString;
-                                    arg.dataTypeClass = templatedClass.templateArgs[p].dataTypeClass;
+                                    arg = templatedClass.templateArgs[p];
                                     break;
                                  }
                               }
@@ -3912,6 +3901,7 @@ static void ComputeClassParameters(Class templatedClass, const char * templatePa
                         {
                            FreeTemplateArg(templatedClass, param, c);
 
+                           // TRICKY: This copies from equivalent parameters
                            arg->dataTypeString = templatedClass.templateArgs[p].dataTypeString;
                            arg->dataTypeClass = templatedClass.templateArgs[p].dataTypeClass;
                            CopyTemplateArg(cParam, arg);
@@ -4625,6 +4615,10 @@ public dllexport void * eInstance_New(Class _class)
                size *= 3;
          }
          instance = _calloc(1, size);
+         if(!instance && size)
+            printf("Failed to allocate memory instantiating %s object!\n", _class.name);
+         else if(!size)
+            printf("Warning: 0 size instantiating %s object!\n", _class.name);
       }
 #ifdef MEMINFO
       allocateClass = null;
@@ -4638,13 +4632,13 @@ public dllexport void * eInstance_New(Class _class)
       }
 #endif
 
-      if(_class.type == normalClass)
+      if(instance && _class.type == normalClass)
       {
          instance._class = _class;
          // Copy the virtual table initially
          instance._vTbl = _class._vTbl;
       }
-      if(!ConstructInstance(instance, _class, null))
+      if(instance && !ConstructInstance(instance, _class, null))
       {
          _free(instance);
          instance = null;
@@ -5288,7 +5282,10 @@ public dllexport DataMember eClass_AddDataMember(Class _class, const char * name
             _class.structAlignment = Max(_class.structAlignment, alignment);
 
             if(_class.offset % alignment)
+            {
+               _class.structSize += alignment - (_class.offset % alignment);
                _class.offset += alignment - (_class.offset % alignment);
+            }
             if(_class.memberOffset % alignment)
                _class.memberOffset += alignment - (_class.memberOffset % alignment);
          }