#endif
// #define MEMINFO
-/*
+
#ifdef MEMINFO
#undef REDZONE
#define REDZONE 256
#endif
-*/
+
#ifndef REDZONE
#define REDZONE 0
#endif
Class templateClass;
OldList templatized;
int numParams;
+ bool isInstanceClass;
+ bool byValueSystemClass;
property char *
{
{
unsigned int p = SIZE_POSITION(size);
if(!memoryInitialized) InitMemory();
- if(p < NUM_POOLS)
+ if(!poolingDisabled && p < NUM_POOLS)
{
block = pools[p].Add();
if(block)
{
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;
}
// 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;
}
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))
{
{
type = base.type;
}
- if(!base || base.type == systemClass)
+ if(!base || base.type == systemClass || base.isInstanceClass)
{
if(type == enumClass)
{
if((_class = eSystem_FindClass(module, name)))
{
- FreeTemplatesDerivatives(_class);
-
if(!_class.internalDecl)
{
if(declMode != baseSystemAccess)
return null;
}
+ FreeTemplatesDerivatives(_class);
+
classLink = (BTNamedLink)_class.nameSpace->classes.FindString(name + start);
_class.nameSpace->classes.Delete((BTNode)classLink);
{
}
_class.module = module;
+ prevBase = _class.base;
_class.base = base;
if(base)
{
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)
}
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"))
{
}
else // if(!strcmp(curParam.dataTypeString, "int"))
{
- argument.expression.i = strtol(value, null, 0);
+ argument.expression.i = (int)strtol(value, null, 0);
}
break;
}
{
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;
}
}
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)
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)
{
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;
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 =
{
bool ownVtbl;
#ifdef MEMINFO
- if(instance._class == (void *)0xecececec)
+ if(instance._class == (void *)0xecececececececec)
_free(instance);
#endif
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
{
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;
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)
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)
}
_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
{
}
}
base = _class.base;
- if(base && base.type == systemClass) base = null;
+ if(base && (base.type == systemClass || base.isInstanceClass)) base = null;
}
}
}
{
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;
{
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;
return activeDesigner;
}
+
+bool poolingDisabled;
+
+public dllexport void eSystem_SetPoolingDisabled(bool disabled)
+{
+ poolingDisabled = disabled;
+}
+
namespace sys;
// constants
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;