wip II
[sdk] / ecere / src / com / instance.ec
index 4a77e2a..332df66 100644 (file)
@@ -19,12 +19,12 @@ import "Mutex"
 #endif
 
 // #define MEMINFO
-/*
+
 #ifdef MEMINFO
  #undef REDZONE
  #define REDZONE   256
 #endif
-*/
+
 #ifndef REDZONE
 #define REDZONE 0
 #endif
@@ -322,6 +322,8 @@ public:
    Class templateClass;
    OldList templatized;
    int numParams;
+   bool isInstanceClass;
+   bool byValueSystemClass;
 
    property char *
    {
@@ -1183,7 +1185,7 @@ static void * _mymalloc(unsigned int size)
    {
       unsigned int p = SIZE_POSITION(size);
       if(!memoryInitialized) InitMemory();
-      if(p < NUM_POOLS)
+      if(!poolingDisabled && p < NUM_POOLS)
       {
          block = pools[p].Add();
          if(block)
@@ -1920,6 +1922,7 @@ static void FixDerivativesBase(Class base, Class mod)
    {
       Class _class = derivative.data;
       ClassType type = _class.type;
+      ClassType oldType = type;
       int size = _class.structSize - _class.offset;
       int oldSizeClass = _class.sizeClass;
       int sizeClass = _class.sizeClass - _class.offsetClass;
@@ -2129,13 +2132,27 @@ static void FixDerivativesBase(Class base, Class mod)
          }
          // if(mod.base.memberID)
          {
-            for(member = _class.membersAndProperties.first; member; member = member.next)
+            DataMember next;
+            for(member = _class.membersAndProperties.first; member; member = next)
             {
                int offsetDiff = _class.offset - offsetBefore;
-               if(!member.isProperty && offsetDiff > 0)
+               next = member.next;
+               if(!member.isProperty)
                {
-                  member.offset += offsetDiff;
-                  member.memberOffset += offsetDiff;
+                  if(oldType == bitClass && type != bitClass)
+                  {
+                     DataMember prev = member.prev;
+                     // Correcting a bitClass to be a non-bit class (This should really never be required)
+                     _class.membersAndProperties.Remove(member);
+                     member = (DataMember)renew0 member byte[sizeof (class DataMember)];
+                     _class.membersAndProperties.Insert(prev, member);
+                  }
+
+                  if(offsetDiff > 0)
+                  {
+                     member.offset += offsetDiff;
+                     member.memberOffset += offsetDiff;
+                  }
                }
                member.id += mod.base.memberID;
             }
@@ -2251,6 +2268,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
       Class enumBase = null;
       Class base = (baseName && baseName[0]) ? eSystem_FindClass(module, baseName) : null;
       bool refine = false;
+      Class prevBase = null;
 
       if(base && !base.internalDecl && (base.type == noHeadClass || base.type == structClass || base.type == normalClass)) 
       {
@@ -2265,7 +2283,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
       {
          type = base.type;
       }
-      if(!base || base.type == systemClass)
+      if(!base || base.type == systemClass || base.isInstanceClass)
       {
          if(type == enumClass)
          {
@@ -2366,8 +2384,6 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
    
       if((_class = eSystem_FindClass(module, name)))
       {
-         FreeTemplatesDerivatives(_class);
-
          if(!_class.internalDecl)
          {
             if(declMode != baseSystemAccess)
@@ -2381,6 +2397,8 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
             return null;
          }
 
+         FreeTemplatesDerivatives(_class);
+
          classLink = (BTNamedLink)_class.nameSpace->classes.FindString(name + start);
          _class.nameSpace->classes.Delete((BTNode)classLink);
          {
@@ -2548,6 +2566,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
          }
 
          _class.module = module;
+         prevBase = _class.base;
          _class.base = base;
          if(base)
          {
@@ -2682,13 +2701,31 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
                   data.largest = ((EnumClassData)(base.data)).largest;
             }
          }
-         if(base && base.vTblSize)
+         if(base)
          {
-            _class.vTblSize = base.vTblSize;
-            // OK to scrap existing virtual table?
-            delete _class._vTbl;
-            _class._vTbl = _malloc(sizeof(int(*)()) * _class.vTblSize);
-            memcpy(_class._vTbl, base._vTbl, sizeof(int(*)()) * _class.vTblSize);
+            int i;
+            uint oldSize = _class.vTblSize;
+            if(base.vTblSize && _class.vTblSize < base.vTblSize)
+            {
+               _class.vTblSize = base.vTblSize;
+               // OK to scrap existing virtual table?
+               //delete _class._vTbl;
+               //_class._vTbl = _malloc(sizeof(int(*)()) * _class.vTblSize);
+               // memcpy(_class._vTbl, base._vTbl, sizeof(int(*)()) * _class.vTblSize);
+               _class._vTbl = _realloc(_class._vTbl, sizeof(int(*)()) * _class.vTblSize);
+            }
+            if(!prevBase)
+            {
+               if(_class.type == normalClass && strcmp(_class.name, "ecere::com::Instance") && strcmp(_class.name, "enum") && strcmp(_class.name, "struct"))
+                  prevBase = eSystem_FindClass(module, "ecere::com::Instance");
+               else
+                  prevBase = eSystem_FindClass(module, "class");
+            }
+            for(i = 0; i < base.vTblSize; i++)
+            {
+               if(i >= oldSize || _class._vTbl[i] == prevBase._vTbl[i])
+                  _class._vTbl[i] = base._vTbl[i];
+            }
          }
 
          if(_class.base)
@@ -3466,7 +3503,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                   }
                   else if(!strcmp(curParam.dataTypeString, "uint"))
                   {
-                     argument.expression.ui = strtoul(value, null, 0);
+                     argument.expression.ui = (uint)strtoul(value, null, 0);
                   }
                   else if(!strcmp(curParam.dataTypeString, "char"))
                   {
@@ -3502,7 +3539,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                   }
                   else // if(!strcmp(curParam.dataTypeString, "int"))
                   {
-                     argument.expression.i = strtol(value, null, 0);
+                     argument.expression.i = (int)strtol(value, null, 0);
                   }
                   break;
                } 
@@ -3911,7 +3948,7 @@ public dllexport bool eClass_IsDerived(Class _class, Class from)
    {
       for(; _class && from; _class = _class.base)
       {
-         if(_class == from || _class.templateClass == from || (_class.type == systemClass && from.name && !strcmp(_class.name, from.name)))
+         if(_class == from || _class.templateClass == from || ((_class.type == systemClass || (_class.type == normalClass && _class.isInstanceClass)) && from.name && !strcmp(_class.name, from.name)))
             return true;
       }
    }
@@ -3982,7 +4019,7 @@ static void FixDerivativeVirtualMethod(Class base, char * name, int vid, void *
 
 public dllexport Method eClass_AddMethod(Class _class, char * name, char * type, void * function, AccessMode declMode)
 {
-   if(_class && name)
+   if(_class && !_class.comRedefinition && name)
    {
       Class base;
       for(base = _class; base; base = base.base)
@@ -4053,7 +4090,7 @@ public dllexport Method eClass_AddMethod(Class _class, char * name, char * type,
 
 public dllexport Method eClass_AddVirtualMethod(Class _class, char * name, char * type, void * function, AccessMode declMode)
 {
-   if(_class && name)
+   if(_class && !_class.comRedefinition && name)
    {
       Class base;
       for(base = _class; base; base = base.base)
@@ -4107,8 +4144,7 @@ static void FixDerivativeProperty(Class base, Property _property)
    {
       Class _class = derivative.data;
       Property prop;
-      BTNamedLink link;
-      link = (BTNamedLink)_class.prop.FindString(_property.name);
+      BTNamedLink link = (BTNamedLink)_class.prop.FindString(_property.name);
       if(link)
       {
          prop = link.data;
@@ -4143,7 +4179,10 @@ public dllexport Property eClass_AddProperty(Class _class, char * name, char * d
    Property _property = null;
    if(_class)
    {
-      if(!_class.prop.FindString((name ? name : dataType))) 
+      BTNamedLink link = (BTNamedLink)_class.prop.FindString(name ? name : dataType);
+      if(link)
+         _property = link.data;
+      if(!_property)
       {
          _property =
          {
@@ -4529,7 +4568,7 @@ public dllexport void eInstance_Delete(Instance instance)
       bool ownVtbl;
 
 #ifdef MEMINFO
-      if(instance._class == (void *)0xecececec)
+      if(instance._class == (void *)0xecececececececec)
          _free(instance);
 #endif
 
@@ -4572,7 +4611,7 @@ public dllexport void eInstance_Delete(Instance instance)
          
 
          base = _class.base;
-         if(base && base.type == systemClass) base = null;
+         if(base && (base.type == systemClass || base.isInstanceClass)) base = null;
          if(_class.Destructor)
             _class.Destructor(instance);
 #ifdef MEMINFO
@@ -4888,7 +4927,7 @@ public dllexport void eClass_FindNextMember(Class _class, Class * curClass, Data
             {
                DataMember dataMember = eClass_FindDataMember(_class, curMember->name, null, null, null);
                if(!dataMember) dataMember = (DataMember)eClass_FindProperty(_class, curMember->name, null);
-               if(dataMember && dataMember.memberAccess != privateAccess)
+               if(dataMember && dataMember.memberAccess != privateAccess && dataMember.id >= 0) // Skip _vTbl, _refCount and _class in Instance
                {
                   *curMember = dataMember;
                   break;
@@ -5073,7 +5112,12 @@ static void SetMemberClass(DataMember member, Class _class)
 
 public dllexport bool eMember_AddMember(DataMember addTo, DataMember dataMember)
 {
-   if(dataMember.name && addTo.membersAlpha.FindString(dataMember.name)) return false;
+   if(dataMember.name && addTo.membersAlpha.FindString(dataMember.name))
+   {
+      DataMember_Free(dataMember);
+      delete dataMember;
+      return false;
+   }
    addTo.members.Add(dataMember);
 
    if(dataMember.name)
@@ -5104,7 +5148,11 @@ public dllexport bool eMember_AddMember(DataMember addTo, DataMember dataMember)
 public dllexport bool eClass_AddMember(Class _class, DataMember dataMember)
 {
    if(!_class || _class.comRedefinition || (dataMember.name && _class.members.FindString(dataMember.name)))
+   {
+      DataMember_Free(dataMember);
+      delete dataMember;
       return false;
+   }
    _class.membersAndProperties.Add(dataMember);
 
    if(dataMember.name)
@@ -5487,7 +5535,7 @@ static void Module_Destructor(Module module)
       }
       _class.module = null;
       module.classes.Remove(_class);
-      if(!_class.count || _class.type != normalClass)
+      if(_class.count <= 0 || _class.type != normalClass || _class.isInstanceClass)
          eClass_Unregister(_class);
       else
       {
@@ -5906,7 +5954,7 @@ public dllexport void eInstance_StopWatching(Instance instance, Property _proper
                }
             }
             base = _class.base;
-            if(base && base.type == systemClass) base = null;
+            if(base && (base.type == systemClass || base.isInstanceClass)) base = null;
          }
       }
    }
@@ -5955,8 +6003,8 @@ static void LoadCOM(Module module)
 
    {
       Class instanceClass = eSystem_RegisterClass(normalClass, "ecere::com::Instance", null, 0, 0, null, null, module, baseSystemAccess, publicAccess);
-      // Instance should really be a Normal class, but inheritance checks for systemClass to see if something has a non system ancestor
-      instanceClass.type = systemClass;
+      instanceClass.type = normalClass;
+      instanceClass.isInstanceClass = true;
       instanceClass.fixed = true;
       instanceClass.memberOffset = 0;
       instanceClass.offset = 0;
@@ -6214,11 +6262,13 @@ public dllexport void eClass_DoneAddingTemplateParameters(Class base)
       {
          void * first = base.templateParams.first;
          int count = base.templateParams.count;
-         base.templateParams.first = null;
-         base.templateParams.count = 0;
 
          FreeTemplateArgs(base);
          delete base.templateArgs;
+
+         base.templateParams.first = null;
+         base.templateParams.count = 0;
+
          FreeTemplatesDerivatives(base);
 
          base.templateParams.first = first;
@@ -6454,6 +6504,14 @@ public DesignerBase GetActiveDesigner()
    return activeDesigner;
 }
 
+
+bool poolingDisabled;
+
+public dllexport void eSystem_SetPoolingDisabled(bool disabled)
+{
+   poolingDisabled = disabled;
+}
+
 namespace sys;
 
 // constants
@@ -6524,6 +6582,10 @@ public int ISO8859_1toUTF8(char * source, char * dest, int max)
    for(c = 0; source[c]; c++)
    {
       unichar ch = ((byte *)source)[c];
+      switch(ch)
+      {
+         case 150: ch = (unichar)0x2012; break;
+      }
       if(ch < 0x80)
       {
          if(d + 1 >= max) break;