sdk: const correctness
[sdk] / ecere / src / com / instance.ec
index d3113e9..5dd172c 100644 (file)
@@ -19,8 +19,12 @@ import "Mutex"
 #endif
 
 // #define MEMINFO
-
-// #define REDZONE   256
+/*
+#ifdef MEMINFO
+ #undef REDZONE
+ #define REDZONE   256
+#endif
+*/
 #ifndef REDZONE
 #define REDZONE 0
 #endif
@@ -31,7 +35,7 @@ static define MAX_MEMORY_LOC = 40;
 
 static class MemStack : BTNode
 {
-   char * frames[1000];
+   const char * frames[1000];
    int pos;
    bool recurse;
 };
@@ -43,10 +47,6 @@ static uint memoryErrorsCount = 0;
 
 default:
 #define property _property
-#define bool _bool
-#define uint _uint
-#define true _true
-#define false _false
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -54,22 +54,22 @@ default:
 private:
 
 #if defined(__ANDROID__)
+
+default const char * AndroidInterface_GetLibLocation();
+
 #include <android/log.h>
+#include <android/native_activity.h>
 
 #define printf(...)  ((void)__android_log_print(ANDROID_LOG_VERBOSE, "ecere-app", __VA_ARGS__))
 #endif
 
 #undef property
-#undef bool
-#undef uint
-#undef true
-#undef false
 
 #undef CompareString
 
 public define null = ((void *)0);
 
-dllexport Class eSystem_FindClass(Module module, char * name);
+dllexport Class eSystem_FindClass(Module module, const char * name);
 dllexport void * eSystem_Renew(void * memory, unsigned int size);
 dllexport void * eSystem_Renew0(void * memory, unsigned int size);
 dllexport void * eSystem_New(unsigned int size);
@@ -81,23 +81,28 @@ default:
 extern int __ecereVMethodID_class_OnGetDataFromString;
 
 // IMPLEMENTATION FOR THESE IN _instance.c:
-bool Instance_LocateModule(char * name, char * fileName);
-void Instance_COM_Initialize(int argc, char ** argv, char ** parsedCommand, int * argcPtr, char *** argvPtr);
-void * Instance_Module_Load(char * name, void ** Load, void ** Unload);
+bool Instance_LocateModule(const char * name, const char * fileName);
+void Instance_COM_Initialize(int argc, char ** argv, char ** parsedCommand, int * argcPtr, const char *** argvPtr);
+void * Instance_Module_Load(const char * libLocation, const char * name, void ** Load, void ** Unload);
 void Instance_Module_Free(void * library);
+#if defined(_DEBUG)
+void InternalModuleLoadBreakpoint();
+#endif
 
 private:
 
+public class Angle : double;
+
 public class unichar : uint32
 {
 
-   char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+   const char * OnGetString(char * tempString, void * fieldData, bool * needClass)
    {
       UTF32toUTF8Len(&this, 1, tempString, 5);
       return tempString;
    }
 
-   bool OnGetDataFromString(char * string)
+   bool OnGetDataFromString(const char * string)
    {
       int nb;
       this = UTF8GetChar(string, &nb);
@@ -112,31 +117,31 @@ public:
    class_fixed
    class_no_expansion
    Property prev, next;
-   char * name;
+   const char * name;
    bool isProperty;
    AccessMode memberAccess;
    int id;
    Class _class;
-   char * dataTypeString;
+   const char * dataTypeString;
    Class dataTypeClass;
    Type dataType;
 
-   void (*Set)();
-   int (*Get)();
-   bool (*IsSet)();
+   void (*Set)(void *, int);
+   int (*Get)(void *);
+   bool (*IsSet)(void *);
    void * data;
    void * symbol;
    int vid;
    bool conversion;
    uint watcherOffset;
-   char * category;
+   const char * category;
    bool compiled;
    bool selfWatchable, isWatchable;
 };
 
 dllexport void eInstance_FireWatchers(Instance instance, Property _property);
 
-public dllexport void MemoryGuard_PushLoc(char * loc)
+public dllexport void MemoryGuard_PushLoc(const char * loc)
 {
 #ifdef MEMINFO
    MemStack stack;
@@ -209,7 +214,7 @@ public class BTNamedLink : struct
 {
    class_fixed
 public:
-   char * name;
+   const char * name;
    BTNamedLink parent, left, right;
    int depth;
    void * data;
@@ -224,7 +229,7 @@ class SelfWatcher : struct
 };
 
 public enum AccessMode
-{ 
+{
    defaultAccess,
    publicAccess,
    privateAccess,
@@ -237,7 +242,7 @@ public class SubModule : struct
 public:
    SubModule prev, next;
    Module module;
-   AccessMode importMode;      
+   AccessMode importMode;
 };
 
 public enum DataMemberType { normalMember, unionMember, structMember };
@@ -260,7 +265,7 @@ public:
    class_fixed
    class_no_expansion
    Class prev, next;
-   char * name;
+   const char * name;
    int offset, structSize;
    int (** _vTbl)();
    int vTblSize;
@@ -279,21 +284,21 @@ public:
    ClassType type;
    Module module;
    NameSpace * nameSpace;
-   char * dataTypeString;
+   const char * dataTypeString;
    Type dataType;
    int typeSize;
    int defaultAlignment;
    void (*Initialize)();
-   int memberOffset;
+   int memberOffset;       // For structs, this includes all base classes structSize. Otherwise it restarts at for each class hierarchy level.
    OldList selfWatchers;
-   char * designerClass;
+   const char * designerClass;
    bool noExpansion;
-   char * defaultProperty;
+   const char * defaultProperty;
    bool comRedefinition;
 
    int count;     // DEBUGGING
 
-   bool isRemote;
+   int isRemote;  // TODO: Convert to an enum, can have values 0..3
    bool internalDecl;
    void * data;
    bool computeSize;
@@ -302,7 +307,7 @@ public:
    bool fixed;
    OldList delayedCPValues;
    AccessMode inheritanceAccess;
-   char * fullName;
+   const char * fullName;
    void * symbol;
    OldList conversions;
 
@@ -311,12 +316,14 @@ public:
    Class templateClass;
    OldList templatized;
    int numParams;
+   bool isInstanceClass;
+   bool byValueSystemClass;
 
-   property char *
+   property const char *
    {
       get { return name; }
       set
-      {  
+      {
          Class theClass = eSystem_FindClass(__thisModule, value);
          /*
          if(!theClass)
@@ -326,12 +333,12 @@ public:
       }
    };
 
-   char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+   const char * OnGetString(char * tempString, void * fieldData, bool * needClass)
    {
       return name;
    }
 
-   bool OnGetDataFromString(char * string)
+   bool OnGetDataFromString(const char * string)
    {
       Class theClass;
       theClass = eSystem_FindClass(__thisModule, string);
@@ -376,7 +383,7 @@ public:
       // For type
       struct
       {
-         char * dataTypeString;
+         const char * dataTypeString;
          Class dataTypeClass;
          // Type dataType;
       };
@@ -386,7 +393,7 @@ public:
       // For identifier
       struct
       {
-         char * memberString;
+         const char * memberString;
          union
          {
             DataMember member;
@@ -402,23 +409,22 @@ public class ClassTemplateParameter : struct
 class_fixed
 public:
    ClassTemplateParameter prev, next;
-   char * name;
+   const char * name;
    TemplateParameterType type;
    union
    {
       // Class baseClass;                 // For type
-      char * dataTypeString;           // For expression
+      const char * dataTypeString;           // For expression
       TemplateMemberType memberType;   // For identifier
    };
    ClassTemplateArgument defaultArg;
    void * param;  // To attach to Compiler TemplateParameter
 }
 
-/*
-public class Module : struct
+/*    // Module inherits off the Instance class (_vTbl, _class, _refCount)
+public class Module
 {
    class_no_expansion
-   Instance inst;
 
    Application app;
 
@@ -429,7 +435,7 @@ public class Module : struct
    OldList modules;
 
    Module prev, next;
-   char * name;
+   const char * name;
    void * library;
    void (stdcall * Unload)(Module module);
    ImportType importType;
@@ -442,14 +448,12 @@ public class Module : struct
 
 public class Application : Module
 {
-   Module module;
-
    int argc;
-   char ** argv;
+   const char ** argv;
    int exitCode;
    bool isGUIApp;
    OldList allModules;
-   char * parsedCommand;
+   const char * parsedCommand;
    NameSpace systemNameSpace;
 };
 */
@@ -459,7 +463,7 @@ public class Method : struct
 {
 public:
    class_fixed
-   char * name;
+   const char * name;
    Method parent, left, right;
    int depth;
    int (*function)();
@@ -467,7 +471,7 @@ public:
    MethodType type;
    Class _class;
    void * symbol;
-   char * dataTypeString;
+   const char * dataTypeString;
    Type dataType;
    AccessMode memberAccess;
 };
@@ -485,7 +489,7 @@ public enum ImportType
 
 public struct NameSpace
 {
-   char * name;
+   const char * name;
    NameSpace * btParent, * left, * right;
    int depth;
 
@@ -516,12 +520,12 @@ public class DataMember : struct
 public:
    class_fixed
    DataMember prev, next;
-   char * name;
+   const char * name;
    bool isProperty;
    AccessMode memberAccess;
    int id;
    Class _class;
-   char * dataTypeString;
+   const char * dataTypeString;
    Class dataTypeClass;
    Type dataType;
 
@@ -539,12 +543,12 @@ public class BitMember : struct
 public:
    class_fixed
    BitMember prev, next;
-   char * name;
+   const char * name;
    bool isProperty;
    AccessMode memberAccess;
    int id;
    Class _class;
-   char * dataTypeString;
+   const char * dataTypeString;
    Class dataTypeClass;
    Type dataType;
 
@@ -558,12 +562,12 @@ public class ClassProperty : struct
 {
 public:
    class_fixed
-   char * name;
+   const char * name;
    ClassProperty parent, left, right;
    int depth;
    void (*Set)(Class, int64);
    int64 (*Get)(Class);
-   char * dataTypeString;
+   const char * dataTypeString;
    Type dataType;
    bool constant;
 };
@@ -573,8 +577,8 @@ public class DefinedExpression : struct
 public:
    class_fixed
    DefinedExpression prev, next;
-   char * name;
-   char * value;
+   const char * name;
+   const char * value;
    NameSpace * nameSpace;
 };
 
@@ -583,16 +587,16 @@ public class GlobalFunction : struct
 public:
    class_fixed
    GlobalFunction prev, next;
-   char * name;
+   const char * name;
    int (*function)();
    Module module;
    NameSpace * nameSpace;
-   char * dataTypeString;
+   const char * dataTypeString;
    Type dataType;
    void * symbol;
 };
 
-public class EnumClassData : struct 
+public class EnumClassData : struct
 {
 public:
    class_fixed
@@ -622,10 +626,10 @@ static class MemInfo : BTNode //struct
    byte * oldmem;
    uint size;
    bool freed;
-   char * _class;
+   const char * _class;
    uint id;
-   char * allocLoc[MAX_MEMORY_LOC];
-   char * freeLoc[MAX_MEMORY_LOC];
+   const char * allocLoc[MAX_MEMORY_LOC];
+   const char * freeLoc[MAX_MEMORY_LOC];
    bool internal;
 
    void OutputStacks(bool showFree)
@@ -636,7 +640,11 @@ static class MemInfo : BTNode //struct
          printf("Object of class %s\n", _class);
       printf("   Allocation Stack:\n");
       for(c = 0; c<MAX_MEMORY_LOC; c++)
+#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__)
+         if(allocLoc[c] && allocLoc[c] != (void *)0xabababababababab)
+#else
          if(allocLoc[c] && allocLoc[c] != (void *)0xabababab)
+#endif
             printf("      %s\n", allocLoc[c]);
 
       if(showFree)
@@ -655,7 +663,7 @@ static BinaryTree memBlocks;
 bool recurse = false;
 static int blockID;
 //Class allocateClass;
-char * allocateClass;
+const char * allocateClass;
 bool allocateInternal;
 
 #endif
@@ -770,6 +778,7 @@ static uint initNumBlocks[NUM_POOLS] =
 #define SIZE_POSITION(s)   log1_5i(s)
 #define NTH_SIZE(p)        pow1_5(p)
 
+#if 0
 static int power15[] =
 {
 /*
@@ -842,6 +851,7 @@ static int power15[] =
 466624,
 699920
 };
+#endif
 
 private struct BlockPool
 {
@@ -868,8 +878,8 @@ private struct BlockPool
       {
          int c;
 #ifdef _DEBUG
-         uint totalAvailable = 0, totalAllocated = 0, totalBlocks = 0, totalUsed = 0;
-         uint totalParts = 0;
+         /*uint totalAvailable = 0, totalAllocated = 0, totalBlocks = 0, totalUsed = 0;
+         uint totalParts = 0;*/
 #endif
          MemBlock block = (MemBlock)memory;
          MemPart part = calloc(1, sizeof(class MemPart));
@@ -913,7 +923,7 @@ private struct BlockPool
             {
                BlockPool * pool = &pools[c];
                printf("[%d %s (%d)]: available: %d, allocated: %d, free: %d, used: %d k, wasted: %d k, free: %d k\n", c, (&pools[c] == this) ? "*" : " ",
-                  pools[c].blockSize, pools[c].totalSize, pools[c].numBlocks, 
+                  pools[c].blockSize, pools[c].totalSize, pools[c].numBlocks,
                   pools[c].totalSize - pools[c].numBlocks, pools[c].usedSpace / 1024, ((pools[c].numBlocks * pools[c].blockSize) - pools[c].usedSpace) / 1024,
                   (pools[c].totalSize - pools[c].numBlocks) * pools[c].blockSize / 1024);
                totalAvailable += pools[c].totalSize * pools[c].blockSize;
@@ -956,8 +966,8 @@ private struct BlockPool
          last = block;
          free = block.next;
          /*if(blockSize == 28)
-            printf("Free: %x, free.part: %x, free.part.size: %d, free.part.pool: %x (this = %x), next = %x (part = %x)\n", free, free ? free.part : null, 
-               (free && free.part) ? free.part.size : 0, (free && free.part) ? free.part.pool : 0, this, 
+            printf("Free: %x, free.part: %x, free.part.size: %d, free.part.pool: %x (this = %x), next = %x (part = %x)\n", free, free ? free.part : null,
+               (free && free.part) ? free.part.size : 0, (free && free.part) ? free.part.pool : 0, this,
                (free ? free.next : 0), (free && free.next) ? free.next.part : 0);
          if(free && free.part && (free.part.size < 0 || free.part.pool == (void *)-1))
             printf("WARNING! Bad next free block!\n");*/
@@ -987,7 +997,7 @@ private struct BlockPool
          first = block.next;
       if(last == block)
          last = block.prev;
-      
+
       // block.prev = null;
       block.next = free;
       free = block;
@@ -1023,7 +1033,7 @@ private struct BlockPool
          };
          if(prev)
             prev.next = null;
-         
+
          TOTAL_MEM -= part.size * blockSpace;
          TOTAL_MEM -= sizeof(class MemPart);
          numParts--;
@@ -1038,12 +1048,12 @@ private struct BlockPool
 
 static BlockPool * pools; //[NUM_POOLS];
 
-static uint PosFibonacci(uint number)
+/*static uint PosFibonacci(uint number)
 {
    uint pos;
    uint last = 1, prev = 0;
    uint current = 1;
-   
+
    for(pos=0; ; pos++)
    {
       current += prev;
@@ -1060,7 +1070,7 @@ static uint NthFibonacci(uint number)
    uint pos;
    uint last = 1, prev = 0;
    uint current = 1;
-   
+
    for(pos=0; pos <= number; pos++)
    {
       current += prev;
@@ -1075,7 +1085,7 @@ static uint NextFibonacci(uint number)
    uint pos;
    uint last = 1, prev = 0;
    uint current = 1;
-   
+
    for(pos=0; ; pos++)
    {
       current += prev;
@@ -1085,12 +1095,12 @@ static uint NextFibonacci(uint number)
          return current;
    }
 }
-
+*/
 static uint log1_5i(uint number)
 {
    uint pos;
    uint64 current = sizeof(void *);
-   
+
    for(pos=0; pos < NUM_POOLS; pos++)
    {
       if(current >= number)
@@ -1117,7 +1127,7 @@ static uint pow1_5i(uint number)
 {
    uint pos;
    uint64 current = sizeof(void *);
-   
+
    for(pos=0; pos < NUM_POOLS; pos++)
    {
       if(current >= number)
@@ -1126,7 +1136,7 @@ static uint pow1_5i(uint number)
       if(current == 1) current = 2;
    }
    return (uint)current;
-} 
+}
 
 // -- Math Helpers ---
 public uint log2i(uint number)
@@ -1153,14 +1163,14 @@ static void InitMemory()
    for(c = 0; c<NUM_POOLS; c++)
    {
       int expansion;
-      
+
       pools[c].blockSize = NTH_SIZE(c);
       if(pools[c].blockSize % sizeof(void *))
          pools[c].blockSize += sizeof(void *) - (pools[c].blockSize % sizeof(void *));
       pools[c].blockSpace = pools[c].blockSize;
-      pools[c].blockSpace += sizeof(class MemBlock);      
+      pools[c].blockSpace += sizeof(class MemBlock);
       // pools[c].Expand(initNumBlocks[c]);
-      
+
       expansion = (pools[c].blockSize < 128) ? 1024 : (131072 / pools[c].blockSize);
 
       if(c < 12)
@@ -1175,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)
@@ -1192,6 +1202,7 @@ static void * _mymalloc(unsigned int size)
             TOTAL_MEM += sizeof(class MemBlock) + size;
             OUTSIDE_MEM += sizeof(class MemBlock) + size;
             block.part = null;
+            block.size = size;
          }
       }
    }
@@ -1200,9 +1211,9 @@ static void * _mymalloc(unsigned int size)
 
 static void * _mycalloc(int n, unsigned int size)
 {
-   void * pointer = _mymalloc(size);
+   void * pointer = _mymalloc(n*size);
    if(pointer)
-      memset(pointer, 0, size);
+      memset(pointer, 0, n*size);
    return pointer;
 }
 
@@ -1358,8 +1369,9 @@ static void * _malloc(unsigned int size)
    memMutex.Wait();
 #endif
 
-   pointer = malloc(size + 2 * REDZONE);
+   pointer = size ? malloc(size + 2 * REDZONE) : null;
 #ifdef MEMINFO
+   if(pointer)
    {
       MemInfo block;
       MemStack stack = (MemStack)memStacks.Find(GetCurrentThreadID());
@@ -1400,11 +1412,14 @@ static void * _malloc(unsigned int size)
 #endif
 
 #if REDZONE
-   memset(pointer, 0xEC, REDZONE);
-   memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
-   // ((byte *)pointer)[0] = 0x00;
+   if(pointer)
+   {
+      memset(pointer, 0xAB, REDZONE);
+      memset((byte *)pointer + REDZONE + size, 0xAB, REDZONE);
+      // ((byte *)pointer)[0] = 0x00;
+   }
 #endif
-   return (byte*)pointer + REDZONE;
+   return pointer ? ((byte*)pointer + REDZONE) : null;
 }
 
 static void * _calloc(int n, unsigned int size)
@@ -1414,41 +1429,42 @@ static void * _calloc(int n, unsigned int size)
    memMutex.Wait();
 #endif
 
-   pointer = calloc(n, size + 2 * REDZONE);
+   pointer = (n*size) ? calloc(1, n*size + 2 * REDZONE) : null;
 #ifdef MEMINFO
-{
-   MemStack stack;
-   stack = (MemStack)memStacks.Find(GetCurrentThreadID());
-   if(!stack)
-   {
-      stack = (MemStack)calloc(1, sizeof(class MemStack));
-      stack.key = GetCurrentThreadID();
-      memStacks.Add(stack);
-   }
-   if(!pointer)
+   if(pointer)
    {
-      int c;
-      printf("Memory allocation of %d bytes failed\n", size);
-      printf("Current Stack:\n");
-      for(c = 0; c<stack.pos; c++)
-         if(stack.frames[c])
-            printf("      %s\n", stack.frames[c]);
-      memoryErrorsCount++;
-      memMutex.Release();
-      return null;
-   }
+      MemStack stack;
+      stack = (MemStack)memStacks.Find(GetCurrentThreadID());
+      if(!stack)
+      {
+         stack = (MemStack)calloc(1, sizeof(class MemStack));
+         stack.key = GetCurrentThreadID();
+         memStacks.Add(stack);
+      }
+      if(!pointer)
+      {
+         int c;
+         printf("Memory allocation of %d bytes failed\n", size);
+         printf("Current Stack:\n");
+         for(c = 0; c<stack.pos; c++)
+            if(stack.frames[c])
+               printf("      %s\n", stack.frames[c]);
+         memoryErrorsCount++;
+         memMutex.Release();
+         return null;
+      }
 
-   if(!recurse && !stack.recurse)
-   {
-      MemInfo block;
-      
-      stack.recurse = true;
-      block = MemInfo { size = size, key = (uintptr)((byte *)pointer + REDZONE), _class = allocateClass, internal = allocateInternal, id = blockID++ };
-      memcpy(block.allocLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
-      memBlocks.Add(block);
-      stack.recurse = false;
+      if(!recurse && !stack.recurse)
+      {
+         MemInfo block;
+
+         stack.recurse = true;
+         block = MemInfo { size = (unsigned int)n*size, key = (uintptr)((byte *)pointer + REDZONE), _class = allocateClass, internal = allocateInternal, id = blockID++ };
+         memcpy(block.allocLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
+         memBlocks.Add(block);
+         stack.recurse = false;
+      }
    }
-}
 #endif
 
 #if !defined(ECERE_BOOTSTRAP)
@@ -1456,10 +1472,13 @@ static void * _calloc(int n, unsigned int size)
 #endif
 
 #if REDZONE
-   memset(pointer, 0xEC, REDZONE);
-   memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
+   if(pointer)
+   {
+      memset(pointer, 0xAB, REDZONE);
+      memset((byte *)pointer + REDZONE + (unsigned int)n*size, 0xAB, REDZONE);
+   }
 #endif
-   return (byte*)pointer + REDZONE;
+   return pointer ? ((byte*)pointer + REDZONE) : null;
 }
 
 static void * _realloc(void * pointer, unsigned int size)
@@ -1496,7 +1515,7 @@ static void * _realloc(void * pointer, unsigned int size)
          block.OutputStacks(true);
       }
    }
-   
+
    pointer = malloc(size + REDZONE * 2);
    if(!pointer)
    {
@@ -1510,8 +1529,8 @@ static void * _realloc(void * pointer, unsigned int size)
       memMutex.Release();
       return null;
    }
-   memset(pointer, 0xEC, REDZONE);
-   memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
+   memset(pointer, 0xAB, REDZONE);
+   memset((byte *)pointer + REDZONE + size, 0xAB, REDZONE);
 
    if(block)
    {
@@ -1523,8 +1542,12 @@ static void * _realloc(void * pointer, unsigned int size)
       {
          memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
          memcpy((byte *)pointer + REDZONE, (byte *)block.key, Min(block.size, size));
-         block.oldmem = (byte *)malloc(block.size + REDZONE * 2) + REDZONE;
-         memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+         block.oldmem = (byte *)malloc(block.size + REDZONE * 2);
+         if(block.oldmem)
+         {
+            block.oldmem += REDZONE;
+            memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+         }
          memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
          block.freed = true;
       }
@@ -1547,7 +1570,7 @@ static void * _realloc(void * pointer, unsigned int size)
 #if !defined(ECERE_BOOTSTRAP)
    memMutex.Release();
 #endif
-   return (byte *)pointer + REDZONE;
+   return pointer ? ((byte *)pointer + REDZONE) : null;
 }
 
 static void * _crealloc(void * pointer, unsigned int size)
@@ -1584,7 +1607,7 @@ static void * _crealloc(void * pointer, unsigned int size)
          block.OutputStacks(true);
       }
    }
-   
+
    pointer = calloc(1, size + REDZONE * 2);
    if(!pointer)
    {
@@ -1598,8 +1621,8 @@ static void * _crealloc(void * pointer, unsigned int size)
       memMutex.Release();
       return null;
    }
-   memset(pointer, 0xEC, REDZONE);
-   memset((byte *)pointer + REDZONE + size, 0xEC, REDZONE);
+   memset(pointer, 0xAB, REDZONE);
+   memset((byte *)pointer + REDZONE + size, 0xAB, REDZONE);
 
    if(block)
    {
@@ -1611,8 +1634,12 @@ static void * _crealloc(void * pointer, unsigned int size)
       {
          memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
          memcpy((byte *)pointer + REDZONE, (byte *)block.key, Min(block.size, size));
-         block.oldmem = (byte *)malloc(block.size + REDZONE * 2) + REDZONE;
-         memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+         block.oldmem = (byte *)malloc(block.size + REDZONE * 2);
+         if(block.oldmem)
+         {
+            block.oldmem += REDZONE;
+            memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + 2 * REDZONE);
+         }
          memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
          block.freed = true;
       }
@@ -1635,7 +1662,7 @@ static void * _crealloc(void * pointer, unsigned int size)
 #if !defined(ECERE_BOOTSTRAP)
    memMutex.Release();
 #endif
-   return (byte *)pointer + REDZONE;
+   return pointer ? ((byte *)pointer + REDZONE) : null;
 }
 
 static void _free(void * pointer)
@@ -1713,13 +1740,13 @@ static void _free(void * pointer)
                address = (byte *)block.key;
                for(c = 0; c<REDZONE; c++)
                {
-                  if(address[-c-1] != 0xEC)
+                  if(address[-c-1] != 0xAB)
                   {
                      printf("Buffer Underrun\n");
                      memoryErrorsCount++;
                      block.OutputStacks(block.freed);
                   }
-                  if(address[c + size] != 0xEC)
+                  if(address[c + size] != 0xAB)
                   {
                      printf("Buffer Overrun\n");
                      memoryErrorsCount++;
@@ -1729,8 +1756,12 @@ static void _free(void * pointer)
             }
 
             block.freed = true;
-            block.oldmem = (byte *)malloc(block.size + REDZONE * 2) + REDZONE;
-            memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + REDZONE * 2);
+            block.oldmem = (byte *)malloc(block.size + REDZONE * 2);
+            if(block.oldmem)
+            {
+               block.oldmem += REDZONE;
+               memcpy(block.oldmem - REDZONE, (byte *)block.key - REDZONE, block.size + REDZONE * 2);
+            }
             memset((byte *)block.key - REDZONE, 0xEC, block.size + REDZONE * 2);
 
             memcpy(block.freeLoc, stack.frames + stack.pos - Min(stack.pos, MAX_MEMORY_LOC), Min(stack.pos, MAX_MEMORY_LOC) * sizeof(char *));
@@ -1847,24 +1878,24 @@ public void CheckMemory()
             block.OutputStacks(true);
          }
       }
-      
+
       address = (byte *)block.key;
       for(c = 0; c<REDZONE; c++)
       {
-         if(address[-c-1] != 0xEC)
+         if(address[-c-1] != 0xAB)
          {
             printf("Buffer Underrun\n");
             memoryErrorsCount++;
             block.OutputStacks(block.freed);
          }
-         if(address[c + size] != 0xEC)
+         if(address[c + size] != 0xAB)
          {
             printf("Buffer Overrun\n");
             memoryErrorsCount++;
             block.OutputStacks(block.freed);
          }
       }
-            
+
       memBlocks.Delete(block);
    }
    if(leaksCount)
@@ -1883,7 +1914,6 @@ public void CheckMemory()
 static void FixDerivativesBase(Class base, Class mod)
 {
    OldLink derivative;
-   OldLink templateLink;
 
    ComputeClassParameters(base, strchr(base.name, '<'), null);
 
@@ -1891,11 +1921,12 @@ 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;
       Class enumBase = null;
-      char * dataTypeString = null;
+      const char * dataTypeString = null;
       // NOTE: baseClass is class(class)
       Class baseClass;
       uint offsetBefore = _class.offset;
@@ -1930,7 +1961,7 @@ static void FixDerivativesBase(Class base, Class mod)
       dataTypeString = enumBase ? enumBase.dataTypeString : base.dataTypeString;
 
       /////////////////////
-      
+
       offsetClass = base ? (base.templateClass ? base.templateClass.sizeClass : base.sizeClass) : (type == noHeadClass ? 0 : 0 /*sizeof(class Class)*/);
       totalSizeClass = offsetClass + sizeClass;
 
@@ -1948,7 +1979,7 @@ static void FixDerivativesBase(Class base, Class mod)
          _class.typeSize = _class.structSize = _class.memberOffset + size;
       }
       else if(type == bitClass || type == enumClass || type == unitClass)
-      {  
+      {
          Class dataTypeClass = eSystem_FindClass(_class.module, dataTypeString);
          if(dataTypeClass)
             _class.typeSize = dataTypeClass.typeSize;
@@ -1964,7 +1995,7 @@ static void FixDerivativesBase(Class base, Class mod)
 
       if(_class.type != systemClass)
          _class.type = type;
-      delete _class.dataTypeString;
+      delete (void *)_class.dataTypeString;
       _class.dataTypeString = CopyString(dataTypeString);
 
       if(totalSizeClass != oldSizeClass)
@@ -1990,7 +2021,7 @@ static void FixDerivativesBase(Class base, Class mod)
       {
          Method method, next;
          Class b;
-         bool needUpdate = (mod != (base.templateClass ? base.templateClass : base) || _class.vTblSize != mod.vTblSize;
+         bool needUpdate = (mod != (base.templateClass ? base.templateClass : base) || _class.vTblSize != mod.vTblSize);
          int updateStart = -1, updateEnd = -1;
 
          if(mod.base && mod.base.base && mod.base.vTblSize > baseClass.vTblSize && needUpdate)
@@ -2024,13 +2055,13 @@ static void FixDerivativesBase(Class base, Class mod)
                         if(method.function) _class._vTbl[vMethod.vid] = method.function;
                         if(!method.symbol)
                         {
-                           delete method.name;
-                           delete method.dataTypeString;
+                           delete (void *)method.name;
+                           delete (void *)method.dataTypeString;
                            _class.methods.Delete((BTNode)method);
                         }
                         else
                         {
-                           delete method.dataTypeString;
+                           delete (void *)method.dataTypeString;
                            method.type = vMethod.type;
                            method.dataTypeString = CopyString(vMethod.dataTypeString);
                            method._class = vMethod._class;
@@ -2063,7 +2094,7 @@ static void FixDerivativesBase(Class base, Class mod)
       }
 
       // _class.defaultAlignment = base ? base.defaultAlignment : 0;
-   
+
       if(type == normalClass || type == noHeadClass || type == structClass)
       {
          Property prop;
@@ -2090,8 +2121,8 @@ static void FixDerivativesBase(Class base, Class mod)
                         }
                         _property.selfWatchable = true;
                         _class.prop.Delete((BTNode)link);
-                        delete prop.name;
-                        delete prop.dataTypeString;
+                        delete (void *)prop.name;
+                        delete (void *)prop.dataTypeString;
                         _class.membersAndProperties.Delete(prop);    // Remove only was done before?
                      }
                   }
@@ -2100,13 +2131,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;
             }
@@ -2129,13 +2174,13 @@ static void FixDerivativesBase(Class base, Class mod)
          }
       }
    }
-   
+
    {
       OldLink templateLink;
       for(templateLink = base.templatized.first; templateLink; templateLink = templateLink.next)
       {
          Class template = templateLink.data;
-         char * templateParams = strchr(template.name, '<');
+         //const char * templateParams = strchr(template.name, '<');
          template.base = base.base;
          template._vTbl = base._vTbl;
          //ComputeClassParameters(template, templateParams, null);
@@ -2146,19 +2191,31 @@ static void FixDerivativesBase(Class base, Class mod)
          template.sizeClass = base.sizeClass;
          template.structSize = base.structSize;
          template.vTblSize = base.vTblSize;
-         
+
          FixDerivativesBase(template, mod);
       }
    }
 }
 
-public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char * baseName, int size, int sizeClass,
+public dllexport Class eSystem_RegisterClass(ClassType type, const char * name, const char * baseName, int size, int sizeClass,
                              bool (* Constructor)(void *),void (* Destructor)(void *),
                              Module module, AccessMode declMode, AccessMode inheritanceAccess)
 {
    int start = 0, c;
    NameSpace * nameSpace = null;
    bool force64Bits = (module.application.isGUIApp & 2) ? true : false;
+   bool force32Bits = (module.application.isGUIApp & 4) ? true : false;
+   bool inCompiler = (module.application.isGUIApp & 8) ? true : false;
+   bool crossBits = force32Bits || force64Bits;
+   bool fixed = false;
+   if(inCompiler && crossBits)
+   {
+      Class c = eSystem_FindClass(__thisModule.application, name);
+      if(c && c.fixed)
+         fixed = true;
+      else if(__thisModule.name && !strcmp(__thisModule.name, "ecereCOM"))
+         fixed = true;
+   }
 
    {
       nameSpace = (declMode == publicAccess) ? &module.publicNameSpace : &module.privateNameSpace;
@@ -2202,16 +2259,16 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
 
    if(c - start)
    {
-      int offsetClass; 
+      int offsetClass;
       int totalSizeClass;
       BTNamedLink classLink = null;
       Class _class = null;
-      char * dataTypeString = null;
+      const char * dataTypeString = null;
       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)) 
+      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)
@@ -2219,28 +2276,28 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
          else
             type = base.type;
       }
-      if(base && (type == normalClass || type == noHeadClass || type == structClass) && 
+      if(base && (type == normalClass || type == noHeadClass || type == structClass) &&
          (base.type == unitClass || base.type == bitClass || base.type == enumClass))
       {
          type = base.type;
       }
-      if(!base || base.type == systemClass)
+      if(!base || base.type == systemClass || base.isInstanceClass)
       {
          if(type == enumClass)
          {
             // TO IMPROVE:
             if(base || !baseName || !baseName[0] ||
-               !strcmp(baseName, "unsigned int") || 
-               !strcmp(baseName, "uint") || 
-               !strcmp(baseName, "unsigned int64") || 
-               !strcmp(baseName, "uint64") || 
-               !strcmp(baseName, "int64") || 
-               !strcmp(baseName, "unsigned short") || 
-               !strcmp(baseName, "short") || 
-               !strcmp(baseName, "unsigned char") || 
-               !strcmp(baseName, "byte") || 
-               !strcmp(baseName, "char") || 
-               !strcmp(baseName, "uint32") || 
+               !strcmp(baseName, "unsigned int") ||
+               !strcmp(baseName, "uint") ||
+               !strcmp(baseName, "unsigned int64") ||
+               !strcmp(baseName, "uint64") ||
+               !strcmp(baseName, "int64") ||
+               !strcmp(baseName, "unsigned short") ||
+               !strcmp(baseName, "short") ||
+               !strcmp(baseName, "unsigned char") ||
+               !strcmp(baseName, "byte") ||
+               !strcmp(baseName, "char") ||
+               !strcmp(baseName, "uint32") ||
                !strcmp(baseName, "uint16"))
             {
                base = eSystem_FindClass(module, "enum");
@@ -2262,7 +2319,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
             base = eSystem_FindClass(module, "struct");
             dataTypeString = name + start;
          }
-         else 
+         else
          {
             if(type == normalClass)
                // dataTypeString = "struct Instance";
@@ -2282,17 +2339,17 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
                // DANGEROUSLY TESTING THIS... PUT IT BACK
                //if(!base)
                if(base || !baseName || !baseName[0] ||
-                  !strcmp(baseName, "unsigned int") || 
-                  !strcmp(baseName, "uint") || 
-                  !strcmp(baseName, "unsigned int64") || 
-                  !strcmp(baseName, "uint64") || 
-                  !strcmp(baseName, "int64") || 
-                  !strcmp(baseName, "unsigned short") || 
-                  !strcmp(baseName, "short") || 
-                  !strcmp(baseName, "unsigned char") || 
-                  !strcmp(baseName, "byte") || 
-                  !strcmp(baseName, "char") || 
-                  !strcmp(baseName, "uint32") || 
+                  !strcmp(baseName, "unsigned int") ||
+                  !strcmp(baseName, "uint") ||
+                  !strcmp(baseName, "unsigned int64") ||
+                  !strcmp(baseName, "uint64") ||
+                  !strcmp(baseName, "int64") ||
+                  !strcmp(baseName, "unsigned short") ||
+                  !strcmp(baseName, "short") ||
+                  !strcmp(baseName, "unsigned char") ||
+                  !strcmp(baseName, "byte") ||
+                  !strcmp(baseName, "char") ||
+                  !strcmp(baseName, "uint32") ||
                   !strcmp(baseName, "uint16"))
                {
                   if(type == normalClass && strcmp(name, "ecere::com::Instance") && strcmp(name, "enum") && strcmp(name, "struct"))
@@ -2322,11 +2379,28 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
 
       offsetClass = base ? base.sizeClass : (type == noHeadClass ? 0 : 0 /*sizeof(class Class)*/);
       totalSizeClass = offsetClass + sizeClass;
-   
-      if((_class = eSystem_FindClass(module, name)))
-      {
-         FreeTemplatesDerivatives(_class);
 
+      _class = eSystem_FindClass(module, name);
+      if(!_class)
+      {
+         const char * colons = RSearchString(name, "::", strlen(name), true, false);
+         if(colons && colons)
+         {
+            _class = eSystem_FindClass(module, colons + 2);
+            if(_class)
+            {
+               if(_class.internalDecl)
+               {
+                  delete (void *)_class.fullName;
+                  _class.fullName = CopyString(name);
+               }
+               else
+                  _class = null;
+            }
+         }
+      }
+      if(_class)
+      {
          if(!_class.internalDecl)
          {
             if(declMode != baseSystemAccess)
@@ -2340,6 +2414,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);
          {
@@ -2354,8 +2430,8 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
          }
          {
             NameSpace * ns = _class.nameSpace;
-            while(ns->parent && 
-               !ns->classes.first && 
+            while(ns->parent &&
+               !ns->classes.first &&
                !ns->functions.first &&
                !ns->defines.first &&
                !ns->nameSpaces.first)
@@ -2366,7 +2442,6 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
                ns = parent;
             }
          }
-         refine = true;
       }
       else
       {
@@ -2397,8 +2472,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
                }
             }
 
-            refine = true;
-            delete _class.fullName;
+            delete (void *)_class.fullName;
             _class.fullName = CopyString(name);
          }
          else
@@ -2415,13 +2489,13 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
       }
       if(nameSpace)
       {
-         nameSpace->classes.Add((BTNode)BTNamedLink { name = _class.name, data = _class });
+         nameSpace->classes.Add((BTNode)BTNamedLink { name = (char *)_class.name, data = _class });
          {
             OldLink t;
             for(t = _class.templatized.first; t; t = t.next)
             {
                Class template = t.data;
-               nameSpace->classes.Add((BTNode)BTNamedLink { name = template.name, data = template });
+               nameSpace->classes.Add((BTNode)BTNamedLink { name = (char *)template.name, data = template });
             }
          }
 
@@ -2472,7 +2546,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
             memset((byte *)_class.data + offsetClass, 0, sizeClass);
          }
 
-         delete _class.dataTypeString;
+         delete (void *)_class.dataTypeString;
          _class.dataTypeString = CopyString(dataTypeString);
          _class.defaultAlignment = base ? base.defaultAlignment : 0;
 
@@ -2507,6 +2581,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
          }
 
          _class.module = module;
+         prevBase = _class.base;
          _class.base = base;
          if(base)
          {
@@ -2553,7 +2628,58 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
          }
          _class.memberID = _class.startMemberID = (base && (type == normalClass || type == noHeadClass || type == structClass)) ? base.memberID : 0;
          if(type == normalClass || type == noHeadClass)
-            _class.offset = (base && base.structSize && base.type != systemClass) ? base.structSize : ((type == noHeadClass) ? 0 : (force64Bits ? 24 : sizeof(class Instance)));
+            _class.offset = (base && base.structSize && base.type != systemClass) ? base.structSize : ((type == noHeadClass) ? 0 : ((force64Bits && inCompiler && fixed) ? 24 : (force32Bits && inCompiler && fixed) ? 12 : sizeof(class Instance)));
+
+         // For cross-bitness-compiling
+         if(crossBits)
+         {
+            // The GNOSIS runtime will use 'offset' to point to the object during compile executation
+            // Need to rethink through our cross-bitness compiling to have a distinct 'offset' (e.g. runtimeOffset)
+            // used by the runtime library vs. 'offset' used by the compiler to hardcode compilation results (or avoid those altogether)
+            if(!strcmp(name, "GNOSISSystem") ||
+               !strcmp(name, "LineStyle") ||
+               !strcmp(name, "FillStyle") ||
+               !strcmp(name, "FontObject") ||
+               !strcmp(name, "SymbolStyle"))
+            {
+               _class.offset = force32Bits ? 24 : 12;
+            }
+            // Ideally, the running library should be aware of the struct size of both 32 and 64 bit, since the compiler has no knowledge whatsoever of private members
+            else if(strstr(name, "ecere::sys::EARHeader") ||
+               strstr(name, "AnchorValue") ||
+               !strcmp(name, "ecere::com::CustomAVLTree") ||
+               !strcmp(name, "ecere::com::Array") ||
+               !strcmp(name, "ecere::gui::Window") ||
+               !strcmp(name, "ecere::sys::Mutex"));   // Never recompute these, they're always problematic (errors, crashes)
+            else
+            {
+               if(!strcmp(name, "ecere::sys::FileListing"))
+               {
+                  size = 3*(force32Bits ? 4 : 8);
+                  _class.structAlignment = force32Bits ? 4 : 8;   // FileListing is problematic because it is a struct with private data that the user allocates
+               }
+               // These we want to recompute inside the IDE to help the debugger
+               else if(!strcmp(name, "ecere::com::Class"))           size = 0; // 616
+               else if(!strcmp(name, "ecere::com::ClassProperty"))   size = 0; // 80
+               else if(!strcmp(name, "ecere::com::NameSpace"))       size = 0; // 176
+               else if(!strcmp(name, "ecere::sys::BufferedFile"))    size = 0;
+               else if(!strcmp(name, "ecere::sys::BTNode"))          size = 0;
+               else if(!strcmp(name, "ecere::sys::StringBTNode"))    size = 0;
+               else if(!strcmp(name, "ecere::sys::OldList"))         size = 0; // 32
+               else if(!strcmp(name, "ecere::sys::Item"))            size = 0;
+               else if(!strcmp(name, "ecere::sys::NamedLink"))       size = 0;
+               else if(!strcmp(name, "ecere::sys::OldLink"))         size = 0;
+               else if(!strcmp(name, "ecere::sys::NamedItem"))       size = 0;
+               else if(!strcmp(name, "ecere::sys::NamedItem64"))     size = 0;
+               else if(!strcmp(name, "ecere::sys::BinaryTree"))      size = 0;
+               else if(module != module.application && inCompiler)
+               {
+                  // These we only want to recompute inside the compiler
+                  if(fixed || type == structClass)
+                     size = 0;
+               }
+            }
+         }
          if(type == structClass)
          {
             _class.memberOffset = (base && base.structSize && base.type != systemClass) ? base.structSize : 0;
@@ -2561,7 +2687,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
             _class.typeSize = _class.structSize = _class.memberOffset + size;
          }
          else if(type == bitClass || type == enumClass || type == unitClass)
-         {  
+         {
             Class dataTypeClass = eSystem_FindClass(_class.module, dataTypeString);
             if(dataTypeClass)
                _class.typeSize = dataTypeClass.typeSize;
@@ -2601,13 +2727,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)
@@ -2617,6 +2761,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
          }
 
          FixDerivativesBase(_class, _class);
+
          return _class;
       }
    }
@@ -2627,8 +2772,8 @@ static void DataMember_Free(DataMember parentMember)
 {
    DataMember member;
    BTNamedLink namedLink;
-   delete parentMember.name;
-   delete parentMember.dataTypeString;
+   delete (void *)parentMember.name;
+   delete (void *)parentMember.dataTypeString;
 
    while((member = parentMember.members.first))
    {
@@ -2652,13 +2797,13 @@ static void FreeTemplateArg(Class template, ClassTemplateParameter param, int id
    switch(param.type)
    {
       case type:
-         delete template.templateArgs[id].dataTypeString;
+         delete (void *)template.templateArgs[id].dataTypeString;
          break;
       case identifier:
-         delete template.templateArgs[id].memberString;
+         delete (void *)template.templateArgs[id].memberString;
          break;
       case expression:
-         
+
          break;
    }
 }
@@ -2674,7 +2819,7 @@ static void FreeTemplateArgs(Class template)
          ClassTemplateParameter param;
          int id = 0;
          if(_class.templateClass) _class = _class.templateClass;
-         for(prevClass = _class.base; prevClass; prevClass = prevClass.base) 
+         for(prevClass = _class.base; prevClass; prevClass = prevClass.base)
          {
             if(prevClass.templateClass) prevClass = prevClass.templateClass;
             id += prevClass.templateParams.count;
@@ -2686,10 +2831,10 @@ static void FreeTemplateArgs(Class template)
                switch(param.type)
                {
                   case type:
-                     delete template.templateArgs[id].dataTypeString;
+                     delete (void *)template.templateArgs[id].dataTypeString;
                      break;
                   case identifier:
-                     delete template.templateArgs[id].memberString;
+                     delete (void *)template.templateArgs[id].memberString;
                      break;
                   case expression:
                      // delete template.templateArgs[id].dataTypeString;
@@ -2713,9 +2858,10 @@ static void FreeTemplate(Class template)
    }
    FreeTemplateArgs(template);
 
-   delete template.fullName;
-   delete template.name;
-   delete template.templateArgs;
+   delete (void *)template.fullName;
+   delete (void *)template.name;
+   delete (void *)template.templateArgs;
+   delete (void *)template.dataTypeString;
 
    while((deriv = template.derivatives.first))
    {
@@ -2739,6 +2885,7 @@ static void FreeTemplates(Class _class)
    //if(_class.templateArgs)
       //printf("Deleting  Template args for %s\n", _class.name);
    delete _class.templateArgs;
+   delete (void *)_class.dataTypeString;
 
    while((template = _class.templatized.first))
    {
@@ -2760,7 +2907,7 @@ public dllexport void eClass_Unregister(Class _class)
    delete _class._vTbl;
 
    FreeTemplates(_class);
-   
+
    FreeTemplateArgs(_class);
    delete _class.templateArgs;
 
@@ -2774,15 +2921,15 @@ public dllexport void eClass_Unregister(Class _class)
    {
       if(!member.isProperty && (member.type == unionMember || member.type == structMember))
          DataMember_Free(member);
-      delete member.name;
-      delete member.dataTypeString;
+      delete (void *)member.name;
+      delete (void *)member.dataTypeString;
       _class.membersAndProperties.Delete(member);
    }
 
    while((member = _class.conversions.first))
    {
-      delete member.name;
-      delete member.dataTypeString;
+      delete (void *)member.name;
+      delete (void *)member.dataTypeString;
       _class.conversions.Delete(member);
    }
 
@@ -2798,15 +2945,15 @@ public dllexport void eClass_Unregister(Class _class)
 
    while((classProp = (ClassProperty)_class.classProperties.first))
    {
-      delete classProp.name;
-      delete classProp.dataTypeString;
+      delete (void *)classProp.name;
+      delete (void *)classProp.dataTypeString;
       _class.classProperties.Delete((BTNode)classProp);
    }
 
    while((method = (Method)_class.methods.first))
    {
-      delete method.name;
-      delete method.dataTypeString;
+      delete (void *)method.name;
+      delete (void *)method.dataTypeString;
       _class.methods.Delete((BTNode)method);
    }
 
@@ -2819,7 +2966,7 @@ public dllexport void eClass_Unregister(Class _class)
    _class.delayedCPValues.Free(null);
 
    _class.selfWatchers.Free(null);
-   
+
    if(_class.base)
    {
       // Class base = _class.base.templateClass ? _class.base.templateClass : _class.base;
@@ -2844,10 +2991,10 @@ public dllexport void eClass_Unregister(Class _class)
       _class.nameSpace->classes.Delete((BTNode)link);
    }
 
-   delete _class.name;
-   delete _class.fullName;
-   
-   delete _class.dataTypeString;
+   delete (void *)_class.name;
+   delete (void *)_class.fullName;
+
+   delete (void *)_class.dataTypeString;
 
    delete _class.data;
 
@@ -2856,17 +3003,17 @@ public dllexport void eClass_Unregister(Class _class)
       switch(param.type)
       {
          case type:
-            delete param.defaultArg.dataTypeString;
+            delete (void *)param.defaultArg.dataTypeString;
             break;
          case identifier:
-            delete param.defaultArg.memberString;
+            delete (void *)param.defaultArg.memberString;
             break;
          case expression:
-            
+
             break;
       }
-      if(param.type != identifier) delete param.dataTypeString;
-      delete param.name;
+      if(param.type != identifier) delete (void *)param.dataTypeString;
+      delete (void *)param.name;
 
       _class.templateParams.Delete(param);
    }
@@ -2875,9 +3022,9 @@ public dllexport void eClass_Unregister(Class _class)
    _free(_class);
 }
 
-static BTNamedLink ScanNameSpace(NameSpace nameSpace, char * name, void * listOffset)
+static BTNamedLink ScanNameSpace(NameSpace nameSpace, const char * name, void * listOffset)
 {
-   BinaryTree * tree = (BinaryTree *)((byte *)nameSpace + (uint)listOffset);
+   BinaryTree * tree = (BinaryTree *)((byte *)nameSpace + (uintptr)listOffset);
    BTNamedLink link = (BTNamedLink)tree->Find((uintptr)name);
    NameSpace * child;
    if(!link)
@@ -2892,7 +3039,7 @@ static BTNamedLink ScanNameSpace(NameSpace nameSpace, char * name, void * listOf
    return link;
 }
 
-static BTNamedLink SearchNameSpace(NameSpace nameSpace, char * name, void * listOffset)
+static BTNamedLink SearchNameSpace(NameSpace nameSpace, const char * name, void * listOffset)
 {
    int start = 0, c;
    char ch;
@@ -2923,7 +3070,7 @@ static BTNamedLink SearchNameSpace(NameSpace nameSpace, char * name, void * list
    return null;
 }
 
-static BTNamedLink SearchModule(Module module, char * name, void * listOffset, bool searchPrivate)
+static BTNamedLink SearchModule(Module module, const char * name, void * listOffset, bool searchPrivate)
 {
    SubModule subModule;
    BTNamedLink link;
@@ -2952,7 +3099,7 @@ static BTNamedLink SearchModule(Module module, char * name, void * listOffset, b
    return null;
 }
 
-public int64 _strtoi64(char * string, char ** endString, int base)
+public int64 _strtoi64(const char * string, const char ** endString, int base)
 {
    int64 value = 0;
    int sign = 1;
@@ -2963,7 +3110,7 @@ public int64 _strtoi64(char * string, char ** endString, int base)
    else if(ch == '-') { sign = -1; c++; };
    if(!base)
    {
-      if(ch == 0 && string[c+1] == 'x')
+      if(ch == '0' && string[c+1] == 'x')
       {
          base = 16;
          c+=2;
@@ -2978,17 +3125,16 @@ public int64 _strtoi64(char * string, char ** endString, int base)
    }
    for( ;(ch = string[c]); c++)
    {
-      if(ch == '0')
-         ch = 0;
-      else if(ch >= '1' && ch <= '9')
-         ch -= '1';
-      else if(ch >= 'a' && ch <= 'z') 
-         ch -= 'a'; 
-      else if(ch >= 'A' && ch <= 'Z') 
-         ch -= 'A';
+      if(ch >= '0' && ch <= '9')
+         ch -= '0';
+      else if(ch >= 'a' && ch <= 'z')
+         ch -= ('a' - 10);
+      else if(ch >= 'A' && ch <= 'Z')
+         ch -= ('A'- 10);
       else
       {
-         *endString = string + c;
+         if(endString)
+            *endString = string + c;
          // Invalid character
          break;
       }
@@ -2999,7 +3145,8 @@ public int64 _strtoi64(char * string, char ** endString, int base)
       }
       else
       {
-         *endString = string + c;
+         if(endString)
+            *endString = string + c;
          // Invalid character
          break;
       }
@@ -3007,7 +3154,7 @@ public int64 _strtoi64(char * string, char ** endString, int base)
    return sign*value;
 }
 
-public uint64 _strtoui64(char * string, char ** endString, int base)
+public uint64 _strtoui64(const char * string, const char ** endString, int base)
 {
    uint64 value = 0;
    int sign = 1;
@@ -3018,7 +3165,7 @@ public uint64 _strtoui64(char * string, char ** endString, int base)
    else if(ch == '-') { sign = -1; c++; };
    if(!base)
    {
-      if(ch == 0 && string[c+1] == 'x')
+      if(ch == '0' && string[c+1] == 'x')
       {
          base = 16;
          c+=2;
@@ -3033,17 +3180,16 @@ public uint64 _strtoui64(char * string, char ** endString, int base)
    }
    for( ;(ch = string[c]); c++)
    {
-      if(ch == '0')
-         ch = 0;
-      else if(ch >= '1' && ch <= '9')
-         ch -= '1';
-      else if(ch >= 'a' && ch <= 'z') 
-         ch -= 'a'; 
-      else if(ch >= 'A' && ch <= 'Z') 
-         ch -= 'A';
+      if(ch >= '0' && ch <= '9')
+         ch -= '0';
+      else if(ch >= 'a' && ch <= 'z')
+         ch -= ('a' - 10);
+      else if(ch >= 'A' && ch <= 'Z')
+         ch -= ('A' - 10);
       else
       {
-         *endString = string + c;
+         if(endString)
+            *endString = string + c;
          // Invalid character
          break;
       }
@@ -3054,7 +3200,8 @@ public uint64 _strtoui64(char * string, char ** endString, int base)
       }
       else
       {
-         *endString = string + c;
+         if(endString)
+            *endString = string + c;
          // Invalid character
          break;
       }
@@ -3062,17 +3209,18 @@ public uint64 _strtoui64(char * string, char ** endString, int base)
    return sign*value;
 }
 
-public dllexport Class eSystem_FindClass(Module module, char * name)
+public dllexport Class eSystem_FindClass(Module module, const char * name)
 {
    if(name && module)
    {
       BTNamedLink link;
+      if(!strncmp(name, "const ", 6)) name += 6;
       link = SearchNameSpace(&module.application.systemNameSpace, name, &((NameSpace *)0)->classes);
       if(link) return link.data;
 
       link = SearchModule(module, name, &((NameSpace *)0)->classes, true);
       if(link) return link.data;
-      
+
       {
          char noTemplateName[1024];
          char * templateParams = strchr(name, '<');
@@ -3113,8 +3261,9 @@ public dllexport Class eSystem_FindClass(Module module, char * name)
                templatedClass.templateClass = _class;
                //templatedClass.fullName = CopyString(name);
                templatedClass.fullName = CopyString(className);
+               templatedClass.dataTypeString = CopyString(_class.dataTypeString);
                templatedClass.name = CopyString(templatedClass.fullName + strlen(_class.fullName) - strlen(_class.name));
-               templatedClass.nameSpace->classes.Add((BTNode)BTNamedLink { name = templatedClass.name, data = templatedClass });
+               templatedClass.nameSpace->classes.Add((BTNode)BTNamedLink { name = (char *)templatedClass.name, data = templatedClass });
                templatedClass.templateArgs = null;
                templatedClass.numParams = 0;
                templatedClass.derivatives = { };
@@ -3139,7 +3288,7 @@ static void CopyTemplateArg(ClassTemplateParameter param, ClassTemplateArgument
          arg.dataTypeString = CopyString(arg.dataTypeString);
          break;
       case expression:
-         
+
          break;
       case identifier:
          arg.memberString = CopyString(arg.memberString);
@@ -3147,10 +3296,10 @@ static void CopyTemplateArg(ClassTemplateParameter param, ClassTemplateArgument
    }
 }
 
-static void ComputeClassParameters(Class templatedClass, char * templateParams, Module findModule)
+static void ComputeClassParameters(Class templatedClass, const char * templateParams, Module findModule)
 {
    char ch;
-   char * nextParamStart = templateParams ? (templateParams + 1) : null;
+   const char * nextParamStart = templateParams ? (templateParams + 1) : null;
    ClassTemplateParameter curParam = null;
    Class lastClass = null, sClass;
    int curParamID = 0;
@@ -3162,7 +3311,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
       if(sClass.templateClass) sClass = sClass.templateClass;
       numParams += sClass.templateParams.count;
    }
-   
+
    if(templatedClass.templateArgs)
       FreeTemplateArgs(templatedClass);
    delete templatedClass.templateArgs;
@@ -3189,11 +3338,11 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
            CopyTemplateArg(param, templatedClass.templateArgs[id++]);
       }*/
    }
-   
+
    if(templatedClass.base && templatedClass.base.templateArgs && _class == templatedClass)
    {
       Class sClass;
-      memcpy(templatedClass.templateArgs, templatedClass.base.templateArgs, 
+      memcpy(templatedClass.templateArgs, templatedClass.base.templateArgs,
          sizeof(ClassTemplateArgument) * (numParams - templatedClass.templateParams.count));
       for(sClass = templatedClass.base; sClass; sClass = sClass.base)
       {
@@ -3211,15 +3360,15 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
             CopyTemplateArg(param, templatedClass.templateArgs[id++]);
       }
    }
-   
+
    while(nextParamStart)
    {
-      char * paramStart = nextParamStart;
-      char * paramEnd;
+      const char * paramStart = nextParamStart;
+      const char * paramEnd;
       int level = 0;
       while(*paramStart == ' ') paramStart++;
       paramEnd = paramStart;
-      while((ch = *paramEnd, ch && (level > 0 || (ch != '>' && ch != ',')))) 
+      while((ch = *paramEnd, ch && (level > 0 || (ch != '>' && ch != ','))))
       {
          if(ch == '<') level++;
          if(ch == '>') level--;
@@ -3230,7 +3379,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
       while(*paramEnd == ' ') paramEnd--;
       if(paramEnd > paramStart)
       {
-         char * ptr, * equal = null;
+         const char * ptr, * equal = null;
          for(ptr = paramStart; ptr <= paramEnd; ptr++)
          {
             if(*ptr == '=')
@@ -3241,13 +3390,13 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
          }
          if(equal)
          {
-            char * end = equal - 1;
+            const char * end = equal - 1;
             char ident[1024];
-            
+
             while(*end == ' ') end--;
             strncpy(ident, paramStart, end + 1 - paramStart);
             ident[end + 1 - paramStart] = 0;
-            
+
             for(sClass = _class; sClass; sClass = sClass.base)
             {
                if(sClass.templateClass) sClass = sClass.templateClass;
@@ -3292,7 +3441,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                      curParam = param;
                      break;
                   }
-                  if(curParam) 
+                  if(curParam)
                   {
                      Class nextClass;
                      for(nextClass = sClass.base; nextClass; nextClass = nextClass.base)
@@ -3323,7 +3472,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                         {
                            curParamID += nextClass.templateParams.count;
                            break;
-                        } 
+                        }
                      break;
                   }
                }
@@ -3335,7 +3484,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
          {
             ClassTemplateArgument argument { };
             char value[1024];
-            if(equal) 
+            if(equal)
             {
                equal++;
                while(*equal == ' ') equal++;
@@ -3363,8 +3512,8 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                   if(!expClass) expClass = eSystem_FindClass(_class.module.application, curParam.dataTypeString);
                   if(expClass)
                   {
-                     //if(expClass.type == 
-                     expClass._vTbl[__ecereVMethodID_class_OnGetDataFromString](expClass, &argument.expression, value);
+                     //if(expClass.type ==
+                     ((bool (*)(void *, void *, const char *))(void *)expClass._vTbl[__ecereVMethodID_class_OnGetDataFromString])(expClass, &argument.expression, value);
                   }
                   // Expression should be pre simplified here
                   else if(value[0] == '\"')
@@ -3382,7 +3531,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"))
                   {
@@ -3418,10 +3567,10 @@ 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;
-               } 
+               }
                case identifier:
                   argument.memberString = CopyString(value);
                   break;
@@ -3454,9 +3603,9 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
             if(param.type == type && param.defaultArg.dataTypeString)
             {
                templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module, param.defaultArg.dataTypeString);
-               if(!templatedClass.templateArgs[curParamID].dataTypeClass) 
+               if(!templatedClass.templateArgs[curParamID].dataTypeClass)
                   templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString);
-               if(!templatedClass.templateArgs[curParamID].dataTypeClass) 
+               if(!templatedClass.templateArgs[curParamID].dataTypeClass)
                   templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(findModule, param.defaultArg.dataTypeString);
             }
          }
@@ -3488,7 +3637,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                      Class cClass = null;
                      int paramCount = 0;
                      int lastParam = -1;
-                     
+
                      char templateString[1024];
                      sprintf(templateString, "%s<", expClass.templateClass.fullName);
                      for(cClass = expClass; cClass; cClass = cClass.base)
@@ -3572,7 +3721,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                         }
                      }
                      {
-                        int len = strlen(templateString);
+                        int len = (int)strlen(templateString);
                         if(templateString[len-1] == '>') templateString[len++] = ' ';
                         templateString[len++] = '>';
                         templateString[len++] = '\0';
@@ -3605,7 +3754,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                   }
                }
             }
-            c--;                        
+            c--;
          }
       }
    }
@@ -3618,8 +3767,8 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
          Class nextClass;
          ClassTemplateParameter param;
          if(sClass.templateClass) sClass = sClass.templateClass;
-         
-         for(nextClass = sClass.base; nextClass; nextClass = nextClass.base) 
+
+         for(nextClass = sClass.base; nextClass; nextClass = nextClass.base)
          {
             if(nextClass.templateClass) nextClass = nextClass.templateClass;
             curParamID += nextClass.templateParams.count;
@@ -3660,7 +3809,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                Class dClass;
                int p = numParams - 1;
                for(dClass = _class; dClass; dClass = dClass.base)
-               {                              
+               {
                   if(dClass.templateClass) dClass = dClass.templateClass;
                   for(cParam = dClass.templateParams.last; cParam; cParam = cParam.prev, p--)
                   {
@@ -3696,9 +3845,9 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
             if(param.type == identifier && arg->memberString)
             {
                Class memberClass = templatedClass;
-               char * memberString = arg->memberString;
-               char * colon = strstr(memberString, "::");
-               char * memberName = memberString;
+               const char * memberString = arg->memberString;
+               const char * colon = strstr(memberString, "::");
+               const char * memberName = memberString;
                if(colon) memberName = colon + 2;
                if(!colon)
                {
@@ -3713,7 +3862,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
 
                   memcpy(className, memberString, colon - memberString);
                   className[colon - memberString] = '\0';
-                  
+
                   for(sClass = _class; sClass; sClass = sClass.base)
                   {
                      ClassTemplateParameter cParam;
@@ -3721,7 +3870,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                      int id = 0;
 
                      if(sClass.templateClass) sClass = sClass.templateClass;
-                     for(nextClass = sClass.base; nextClass; nextClass = nextClass.base) 
+                     for(nextClass = sClass.base; nextClass; nextClass = nextClass.base)
                      {
                         if(nextClass.templateClass) nextClass = nextClass.templateClass;
                         id += nextClass.templateParams.count;
@@ -3733,7 +3882,7 @@ static void ComputeClassParameters(Class templatedClass, char * templateParams,
                            strcpy(className, templatedClass.templateArgs[id].dataTypeString);
                         }
                         id++;
-                     }                  
+                     }
                   }
                   memberClass = eSystem_FindClass(templatedClass.module, className);
                   // TESTING: Added this here...
@@ -3793,7 +3942,7 @@ public dllexport bool eClass_IsDerived(Class _class, Class from)
                   ClassTemplateParameter param;
                   Class nextClass;
                   int p = 0;
-                  for(nextClass = sClass.base; nextClass; nextClass = nextClass.base) p += nextClass.templateParams.count;               
+                  for(nextClass = sClass.base; nextClass; nextClass = nextClass.base) p += nextClass.templateParams.count;
                   for(param = sClass.templateParams.first; param; param = param.next, p++)
                   {
                      ClassTemplateArgument * arg = &_class.templateArgs[p];
@@ -3827,14 +3976,14 @@ 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;
       }
    }
    return false;
 }
 
-static void FixDerivativeVirtualMethod(Class base, char * name, int vid, void * origFunction, char * type)
+static void FixDerivativeVirtualMethod(Class base, const char * name, int vid, void * origFunction, const char * type)
 {
    OldLink derivative;
    for(derivative = base.derivatives.first; derivative; derivative = derivative.next)
@@ -3854,13 +4003,13 @@ static void FixDerivativeVirtualMethod(Class base, char * name, int vid, void *
 
          if(!method.symbol)
          {
-            delete method.name;
-            delete method.dataTypeString;
+            delete (void *)method.name;
+            delete (void *)method.dataTypeString;
             _class.methods.Delete((BTNode)method);
          }
          else
          {
-            delete method.dataTypeString;
+            delete (void *)method.dataTypeString;
             method.type = virtualMethod;
             method.dataTypeString = CopyString(type);
             method._class = base;
@@ -3896,23 +4045,25 @@ 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)
+public dllexport Method eClass_AddMethod(Class _class, const char * name, const char * type, void * function, AccessMode declMode)
 {
-   if(_class && name)
+   if(_class && !_class.comRedefinition && name)
    {
       Class base;
       for(base = _class; base; base = base.base)
       {
-         Method method = (Method)base.methods.FindString(name);
+         Method method;
+         if(base.templateClass) base = base.templateClass;
+         method = (Method)base.methods.FindString(name);
          if(method)
          {
-            // If this overides a virtual method
+            // If this overrides a virtual method
             if(method.type == virtualMethod)
             {
                OldLink deriv;
                void * oldFunction = _class._vTbl[method.vid];
-               if(method.vid > _class.vTblSize)
-                  printf("error");
+               if(method.vid >= _class.vTblSize)
+                  printf("error: virtual methods overriding failure\n");
                else
                   _class._vTbl[method.vid] = function ? function : DefaultFunction;
                for(deriv = _class.derivatives.first; deriv; deriv = deriv.next)
@@ -3967,9 +4118,9 @@ public dllexport Method eClass_AddMethod(Class _class, char * name, char * type,
    return null;
 }
 
-public dllexport Method eClass_AddVirtualMethod(Class _class, char * name, char * type, void * function, AccessMode declMode)
+public dllexport Method eClass_AddVirtualMethod(Class _class, const char * name, const char * type, void * function, AccessMode declMode)
 {
-   if(_class && name)
+   if(_class && !_class.comRedefinition && name)
    {
       Class base;
       for(base = _class; base; base = base.base)
@@ -3979,7 +4130,12 @@ public dllexport Method eClass_AddVirtualMethod(Class _class, char * name, char
          {
             // If this overides a virtual method
             if(method.type == virtualMethod)
-               _class._vTbl[method.vid] = function ? function : DefaultFunction;
+            {
+               if(method.vid >= _class.vTblSize)
+                  printf("error: virtual methods overriding failure\n");
+               else
+                  _class._vTbl[method.vid] = function ? function : DefaultFunction;
+            }
             else
                base = null;
             return method;
@@ -4018,8 +4174,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;
@@ -4033,8 +4188,8 @@ static void FixDerivativeProperty(Class base, Property _property)
             }
             _property.selfWatchable = true;
 
-            delete prop.name;
-            delete prop.dataTypeString;
+            delete (void *)prop.name;
+            delete (void *)prop.dataTypeString;
             _class.membersAndProperties.Delete(prop);
             _class.prop.Delete((BTNode)link);
          }
@@ -4049,12 +4204,21 @@ static void FixDerivativeProperty(Class base, Property _property)
    }
 }
 
-public dllexport Property eClass_AddProperty(Class _class, char * name, char * dataType, void * setStmt, void * getStmt, AccessMode declMode)
+public dllexport Property eClass_AddProperty(Class _class, const char * name, const char * dataType, void * setStmt, void * getStmt, AccessMode declMode)
 {
    Property _property = null;
    if(_class)
    {
-      if(!_class.prop.FindString((name ? name : dataType))) 
+      BTNamedLink link = (BTNamedLink)_class.prop.FindString(name ? name : dataType);
+      bool isConversion = name ? false : true;
+      if(!name && dataType && !strncmp(dataType, "const ", 6))
+      {
+         name = dataType + 6;
+         isConversion = true;
+      }
+      if(link)
+         _property = link.data;
+      if(!_property)
       {
          _property =
          {
@@ -4066,10 +4230,10 @@ public dllexport Property eClass_AddProperty(Class _class, char * name, char * d
             dataTypeString = CopyString(dataType);
             _class = _class;
             compiled = true;
-            conversion = name ? false : true;
+            conversion = isConversion;
             memberAccess = declMode;
          };
-         if(name)
+         if(!isConversion)
             _class.membersAndProperties.Add(_property);
          else
             _class.conversions.Add(_property);
@@ -4087,7 +4251,7 @@ public dllexport Property eClass_AddProperty(Class _class, char * name, char * d
 static void SetDelayedCPValues(Class _class, ClassProperty _property)
 {
    OldLink deriv;
-   NamedLink value, next;
+   NamedLink64 value, next;
 
    for(value = _class.delayedCPValues.first; value; value = next)
    {
@@ -4095,7 +4259,7 @@ static void SetDelayedCPValues(Class _class, ClassProperty _property)
       if(!strcmp(value.name, _property.name))
       {
          // eClass_SetProperty(_class, _property.name, value.data);
-         _property.Set(_class, (int64)value.data);
+         _property.Set(_class, value.data);
          _class.delayedCPValues.Delete(value);
       }
    }
@@ -4106,9 +4270,9 @@ static void SetDelayedCPValues(Class _class, ClassProperty _property)
    }
 }
 
-public dllexport ClassProperty eClass_AddClassProperty(Class _class, char * name, char * dataType, void * setStmt, void * getStmt)
+public dllexport ClassProperty eClass_AddClassProperty(Class _class, const char * name, const char * dataType, void * setStmt, void * getStmt)
 {
-   if(name && !_class.classProperties.FindString(name)) 
+   if(name && !_class.classProperties.FindString(name))
    {
       ClassProperty _property
       {
@@ -4138,7 +4302,7 @@ public dllexport Time GetClassFindTime()
    return classFindTotalTime;
 }
 */
-public dllexport ClassProperty eClass_FindClassProperty(Class _class, char * name)
+public dllexport ClassProperty eClass_FindClassProperty(Class _class, const char * name)
 {
    //Time startTime = GetTime();
    ClassProperty _property = null;
@@ -4164,10 +4328,9 @@ public dllexport ClassProperty eClass_FindClassProperty(Class _class, char * nam
    return _property;
 }
 
-public dllexport int64 eClass_GetProperty(Class _class, char * name)
+public dllexport int64 eClass_GetProperty(Class _class, const char * name)
 {
    ClassProperty _property = eClass_FindClassProperty(_class, name);
-   char * propName = _property.name;
    if(_property && _property.Get && _property.Get != (void *)1)
    {
       int64 result = _property.Get(_class);
@@ -4176,7 +4339,7 @@ public dllexport int64 eClass_GetProperty(Class _class, char * name)
    return 0;
 }
 
-public dllexport void eClass_SetProperty(Class _class, char * name, int64 value)
+public dllexport void eClass_SetProperty(Class _class, const char * name, int64 value)
 {
    ClassProperty _property = eClass_FindClassProperty(_class, name);
    if(_property)
@@ -4186,11 +4349,11 @@ public dllexport void eClass_SetProperty(Class _class, char * name, int64 value)
    }
    else
    {
-      _class.delayedCPValues.Add(NamedLink { name = name, (void *)value });
+      _class.delayedCPValues.Add(NamedLink64 { name = (char *)name, value });
    }
 }
 
-public dllexport Method eClass_FindMethod(Class _class, char * name, Module module)
+public dllexport Method eClass_FindMethod(Class _class, const char * name, Module module)
 {
    //Time startTime = GetTime();
    if(_class && name)
@@ -4265,7 +4428,7 @@ public dllexport void * eInstance_New(Class _class)
    Instance instance = null;
    if(_class)
    {
-      // instance = _malloc(_class.size);   
+      // instance = _malloc(_class.size);
 #ifdef MEMINFO
 
 #undef malloc
@@ -4279,7 +4442,23 @@ public dllexport void * eInstance_New(Class _class)
 #endif
 
 #endif
-      instance = _calloc(1, _class.structSize);   
+      {
+         int size = _class.structSize;
+         int flags = _class.module.application.isGUIApp;
+         bool inCompiler = (flags & 8) ? true : false;
+         bool force32Bits = (flags & 4) ? true : false;
+         if(force32Bits && inCompiler)
+         {
+            // Allocate 64 bit sizes for these when cross-compiling for 32 bit to allow loaded libraries to work properly
+            if(!strcmp(_class.name, "Module"))
+               size = 560;
+            else if(_class.templateClass && !strcmp(_class.templateClass.name, "Map"))
+               size = 40;
+            else
+               size *= 3;
+         }
+         instance = _calloc(1, size);
+      }
 #ifdef MEMINFO
       allocateClass = null;
    memMutex.Release();
@@ -4366,13 +4545,13 @@ public dllexport void eInstance_Evolve(Instance * instancePtr, Class _class)
          for(nameSpace = (NameSpace *)app.systemNameSpace.nameSpaces.first; nameSpace; nameSpace = (NameSpace *)((BTNode)nameSpace).next)
             nameSpace->parent = &app.systemNameSpace;
          // --------------------------------------------------
-         
+
          for(_class = app.classes.first; _class; _class = _class.next)
          {
             OldLink templateLink;
             _class.module = (Module) app;
             for(templateLink = _class.templatized.first; templateLink; templateLink = templateLink.next)
-            {  
+            {
                Class template = templateLink.data;
                template.module = _class.module;
             }
@@ -4425,7 +4604,11 @@ public dllexport void eInstance_Delete(Instance instance)
       bool ownVtbl;
 
 #ifdef MEMINFO
+#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__)
+      if(instance._class == (void *)0xecececececececec)
+#else
       if(instance._class == (void *)0xecececec)
+#endif
          _free(instance);
 #endif
 
@@ -4458,17 +4641,17 @@ public dllexport void eInstance_Delete(Instance instance)
                   OldList * watchers = (OldList *)((byte *)instance + _property.watcherOffset);
                   Watcher watcher, next;
                   for(watcher = watchers->first; watcher; watcher = next)
-                  {  
+                  {
                      next = watcher.next;
                      watchers->Delete(watcher);
                   }
                }
             }
          }*/
-         
+
 
          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
@@ -4504,11 +4687,14 @@ public dllexport void eInstance_Delete(Instance instance)
    }
 }
 
-public dllexport Property eClass_FindProperty(Class _class, char * name, Module module)
+public dllexport Property eClass_FindProperty(Class _class, const char * name, Module module)
 {
    //Time startTime = GetTime();
    if(_class && name)
    {
+      if(!strncmp(name, "const ", 6))
+         name += 6;
+
       for(; _class; _class = _class.base)
       {
          BTNamedLink link;
@@ -4546,7 +4732,7 @@ public dllexport Property eClass_FindProperty(Class _class, char * name, Module
    return null;
 }
 
-static DataMember FindDataMember(OldList list, BinaryTree alist, char * name, uint * offset, int * id, bool searchPrivate, DataMember * subMemberStack, int * subMemberStackPos)
+static DataMember FindDataMember(OldList list, BinaryTree alist, const char * name, uint * offset, int * id, bool searchPrivate, DataMember * subMemberStack, int * subMemberStackPos)
 {
    BTNamedLink link;
    DataMember dataMember;
@@ -4584,7 +4770,7 @@ static DataMember FindDataMember(OldList list, BinaryTree alist, char * name, ui
    return null;
 }
 
-public dllexport DataMember eClass_FindDataMember(Class _class, char * name, Module module, DataMember * subMemberStack, int * subMemberStackPos)
+public dllexport DataMember eClass_FindDataMember(Class _class, const char * name, Module module, DataMember * subMemberStack, int * subMemberStackPos)
 {
    //Time startTime = GetTime();
    DataMember dataMember = null;
@@ -4626,7 +4812,7 @@ public dllexport DataMember eClass_FindDataMember(Class _class, char * name, Mod
    return dataMember;
 }
 
-public dllexport DataMember eClass_FindDataMemberAndOffset(Class _class, char * name, uint * offset, Module module, DataMember * subMemberStack, int * subMemberStackPos)
+public dllexport DataMember eClass_FindDataMemberAndOffset(Class _class, const char * name, uint * offset, Module module, DataMember * subMemberStack, int * subMemberStackPos)
 {
    //Time startTime = GetTime();
    DataMember dataMember = null;
@@ -4669,7 +4855,7 @@ public dllexport DataMember eClass_FindDataMemberAndOffset(Class _class, char *
    return dataMember;
 }
 
-public dllexport DataMember eClass_FindDataMemberAndId(Class _class, char * name, int * id, Module module, DataMember * subMemberStack, int * subMemberStackPos)
+public dllexport DataMember eClass_FindDataMemberAndId(Class _class, const char * name, int * id, Module module, DataMember * subMemberStack, int * subMemberStackPos)
 {
    //Time startTime = GetTime();
    DataMember dataMember = null;
@@ -4714,7 +4900,7 @@ public dllexport DataMember eClass_FindDataMemberAndId(Class _class, char * name
 public dllexport void eClass_FindNextMember(Class _class, Class * curClass, DataMember * curMember, DataMember * subMemberStack, int * subMemberStackPos)
 {
    // THIS CODE WILL FIND NEXT MEMBER... (PUBLIC MEMBERS ONLY)
-   if(*curMember) 
+   if(*curMember)
    {
       *curMember = (*curMember).next;
 
@@ -4751,7 +4937,7 @@ public dllexport void eClass_FindNextMember(Class _class, Class * curClass, Data
 
             *curMember = (*curMember).members.first;
             while(*curMember && ((*curMember).memberAccess == privateAccess))
-               *curMember = (*curMember).next;                     
+               *curMember = (*curMember).next;
          }
       }
    }
@@ -4784,7 +4970,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;
@@ -4801,14 +4987,14 @@ public dllexport void eClass_FindNextMember(Class _class, Class * curClass, Data
 
                *curMember = (*curMember).members.first;
                while(*curMember && (*curMember).memberAccess == privateAccess)
-                  *curMember = (*curMember).next;                     
+                  *curMember = (*curMember).next;
             }
          }
       }
    }
 }
 
-public dllexport void eInstance_SetMethod(Instance instance, char * name, void * function)     // YET TO BE DECIDED:   , Module module)
+public dllexport void eInstance_SetMethod(Instance instance, const char * name, void * function)     // YET TO BE DECIDED:   , Module module)
 {
    if(instance && name)
    {
@@ -4822,7 +5008,7 @@ public dllexport void eInstance_SetMethod(Instance instance, char * name, void *
             {
                instance._vTbl = _malloc(sizeof(void *) * instance._class.vTblSize);
                memcpy(instance._vTbl, instance._class._vTbl,
-                  sizeof(int(*)()) * instance._class.vTblSize);               
+                  sizeof(int(*)()) * instance._class.vTblSize);
             }
             instance._vTbl[method.vid] = function ? function : DefaultFunction;
          }
@@ -4868,7 +5054,7 @@ static void FixOffsets(Class _class)
    OldLink deriv;
    _class.structSize += _class.base.structSize - _class.offset;
 
-   _class.offset = _class.base.structSize;   
+   _class.offset = _class.base.structSize;
 
    for(deriv = _class.derivatives.first; deriv; deriv = deriv.next)
       FixOffsets(deriv.data);
@@ -4882,11 +5068,11 @@ public dllexport void eClass_Resize(Class _class, int newSize)
       FixOffsets(deriv.data);
 }
 
-public dllexport DataMember eClass_AddDataMember(Class _class, char * name, char * type, unsigned int size, unsigned int alignment, AccessMode declMode)
+public dllexport DataMember eClass_AddDataMember(Class _class, const char * name, const char * type, unsigned int size, unsigned int alignment, AccessMode declMode)
 {
    if(_class && name)
    {
-      if(!_class.members.FindString(name)) 
+      if(!_class.members.FindString(name))
       {
          DataMember dataMember;
 
@@ -4897,7 +5083,7 @@ public dllexport DataMember eClass_AddDataMember(Class _class, char * name, char
             if(_class.memberOffset % alignment)
                _class.memberOffset += alignment - (_class.memberOffset % alignment);
          }
-         
+
          dataMember = DataMember {
             name = CopyString(name);
             dataTypeString = CopyString(type);
@@ -4918,9 +5104,9 @@ public dllexport DataMember eClass_AddDataMember(Class _class, char * name, char
    return null;
 }
 
-public dllexport DataMember eMember_AddDataMember(DataMember member, char * name, char * type, unsigned int size, unsigned int alignment, AccessMode declMode)
+public dllexport DataMember eMember_AddDataMember(DataMember member, const char * name, const char * type, unsigned int size, unsigned int alignment, AccessMode declMode)
 {
-   if(name && !member.membersAlpha.FindString(name)) 
+   if(name && !member.membersAlpha.FindString(name))
    {
       DataMember dataMember;
 
@@ -4964,12 +5150,17 @@ static void SetMemberClass(DataMember member, Class _class)
    DataMember dataMember;
    member._class = _class;
    for(dataMember = member.members.first; dataMember; dataMember = dataMember.next)
-      SetMemberClass(dataMember, _class);      
+      SetMemberClass(dataMember, _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)
@@ -4987,6 +5178,15 @@ public dllexport bool eMember_AddMember(DataMember addTo, DataMember dataMember)
 
    addTo.structAlignment = Max(addTo.structAlignment, dataMember.structAlignment);
    dataMember.offset = (addTo.type == unionMember) ? 0 : addTo.memberOffset;
+
+   if(dataMember.structAlignment)
+   {
+      addTo.structAlignment = Max(addTo.structAlignment, dataMember.structAlignment);
+
+      if(addTo.memberOffset % dataMember.structAlignment)
+         addTo.memberOffset += dataMember.structAlignment - (addTo.memberOffset % dataMember.structAlignment);
+   }
+
    if(addTo.type == unionMember)
    {
       if(dataMember.memberOffset > addTo.memberOffset)
@@ -5000,7 +5200,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)
@@ -5017,14 +5221,23 @@ public dllexport bool eClass_AddMember(Class _class, DataMember dataMember)
       _class.memberID += 1;
    else
       _class.memberID += dataMember.memberID;
+
+   if(dataMember.structAlignment)
+   {
+      _class.structAlignment = Max(_class.structAlignment, dataMember.structAlignment);
+
+      if(_class.memberOffset % dataMember.structAlignment)
+         _class.memberOffset += dataMember.structAlignment - (_class.memberOffset % dataMember.structAlignment);
+   }
+
    dataMember.offset = _class.memberOffset;
    _class.memberOffset += dataMember.memberOffset;
    return true;
 }
 
-public dllexport BitMember eClass_AddBitMember(Class _class, char * name, char * type, int bitSize, int bitPos, AccessMode declMode)
+public dllexport BitMember eClass_AddBitMember(Class _class, const char * name, const char * type, int bitSize, int bitPos, AccessMode declMode)
 {
-   if(_class && name && !_class.members.FindString(name)) 
+   if(_class && name && !_class.members.FindString(name))
    {
       uint64 mask = 0;
       int c;
@@ -5057,7 +5270,7 @@ public dllexport BitMember eClass_AddBitMember(Class _class, char * name, char *
    return null;
 }
 
-static Module Module_Load(Module fromModule, char * name, AccessMode importAccess, bool ensureCOM)
+static Module Module_Load(Module fromModule, const char * name, AccessMode importAccess, bool ensureCOM)
 {
    bool (stdcall * Load)(Module module) = null;
    bool (stdcall * Unload)(Module module) = null;
@@ -5087,16 +5300,34 @@ static Module Module_Load(Module fromModule, char * name, AccessMode importAcces
       }
       else
       {
-         library = Instance_Module_Load(name, &Load, &Unload);
+         char * libLocation = null;
+#if defined(__ANDROID__)
+         libLocation = AndroidInterface_GetLibLocation();
+#endif
+         library = Instance_Module_Load(libLocation, name, &Load, &Unload);
       }
       if(Load)
       {
          module = (Module)eInstance_New(eSystem_FindClass(fromModule, "Module"));
          module.application = fromModule.application;
          module.library = library;
-         module.name = CopyString(name);
+         {
+            char moduleName[MAX_FILENAME];
+            char ext[MAX_EXTENSION];
+            GetLastDirectory(name, moduleName);
+            GetExtension(moduleName, ext);
+            StripExtension(moduleName);
+            if((!strcmpi(ext, "dylib") || !strcmpi(ext, "so")) && strstr(moduleName, "lib") == moduleName)
+            {
+               int len = (int)strlen(moduleName) - 3;
+               memmove(moduleName, moduleName + 3, len);
+               moduleName[len] = 0;
+            }
+            module.name = CopyString(moduleName);
+         }
          module.Unload = Unload;
          module.origImportType = normalImport;
+
          if(!Load(module))
          {
             eInstance_Delete((Instance)module);
@@ -5108,7 +5339,7 @@ static Module Module_Load(Module fromModule, char * name, AccessMode importAcces
    if(ensureCOM && !strcmp(name, "ecere") && module)
    {
       name = !strcmp(module.name, "ecereCOM") ? "ecere" : "ecereCOM";
-      if((!Load && !strcmp(module.name, "ecereCOM")) || 
+      if((!Load && !strcmp(module.name, "ecereCOM")) ||
          (Load && (!__thisModule || !__thisModule.name || !strcmp(__thisModule.name, "ecereCOM")) && Load != COM_LOAD_FUNCTION))
       {
          Module module;
@@ -5127,11 +5358,13 @@ static Module Module_Load(Module fromModule, char * name, AccessMode importAcces
             module.library = null;
             module.name = CopyString(name);
             module.Unload = Unload;
+
             if(!Load(module))
             {
                eInstance_Delete((Instance)module);
                module = null;
             }
+
             fromModule.application.allModules.Add(module);
          }
          if(module)
@@ -5152,20 +5385,23 @@ static Module Module_Load(Module fromModule, char * name, AccessMode importAcces
       }
       incref module;
    }
+#if defined(_DEBUG)
+   InternalModuleLoadBreakpoint();
+#endif
    return module;
 }
 
-public dllexport Module eModule_Load(Module fromModule, char * name, AccessMode importAccess)
+public dllexport Module eModule_Load(Module fromModule, const char * name, AccessMode importAccess)
 {
    return Module_Load(fromModule, name, importAccess, true);
 }
 
-public dllexport Module eModule_LoadStrict(Module fromModule, char * name, AccessMode importAccess)
+public dllexport Module eModule_LoadStrict(Module fromModule, const char * name, AccessMode importAccess)
 {
    return Module_Load(fromModule, name, importAccess, false);
 }
 
-public dllexport Module eModule_LoadStatic(Module fromModule, char * name, AccessMode importAccess, bool (* Load)(Module module), bool (* Unload)(Module module))
+public dllexport Module eModule_LoadStatic(Module fromModule, const char * name, AccessMode importAccess, bool (* Load)(Module module), bool (* Unload)(Module module))
 {
    Module module;
    for(module = fromModule.application.allModules.first; module; module = module.next)
@@ -5216,15 +5452,15 @@ public dllexport void eModule_Unload(Module fromModule, Module module)
    }
 }
 
-public dllexport void eEnum_AddFixedValue(Class _class, char * string, int value)
+public dllexport void eEnum_AddFixedValue(Class _class, const char * string, int value)
 {
    if(_class && _class.type == enumClass)
    {
       EnumClassData data = (EnumClassData)_class.data;
       NamedLink item;
-      
+
       for(item = data.values.first; item; item = item.next)
-         if(!strcmp(item.name, string)) 
+         if(!strcmp(item.name, string))
             break;
       if(!item)
       {
@@ -5235,7 +5471,7 @@ public dllexport void eEnum_AddFixedValue(Class _class, char * string, int value
    }
 }
 
-public dllexport int eEnum_AddValue(Class _class, char * string)
+public dllexport int eEnum_AddValue(Class _class, const char * string)
 {
    if(_class && _class.type == enumClass)
    {
@@ -5243,7 +5479,7 @@ public dllexport int eEnum_AddValue(Class _class, char * string)
       int value = ((int) data.largest) + 1;
       NamedLink item;
       for(item = data.values.first; item; item = item.next)
-         if(!strcmp(item.name, string)) 
+         if(!strcmp(item.name, string))
             break;
       if(!item)
       {
@@ -5259,7 +5495,7 @@ public dllexport int eEnum_AddValue(Class _class, char * string)
 static void NameSpace_Free(NameSpace parentNameSpace)
 {
    NameSpace * nameSpace;
-   delete parentNameSpace.name;
+   delete (void *)parentNameSpace.name;
 
    while((nameSpace = (NameSpace *)parentNameSpace.nameSpaces.first))
    {
@@ -5334,7 +5570,7 @@ static void Module_Destructor(Module module)
       while((handle = module.modules.last))  // STARTING WITH LAST SO THAT ecereCOM IS UNLOADED LAST...
       {
          Module depModule = handle.module;
-         if(depModule == ourWorld) 
+         if(depModule == ourWorld)
          {
             module.modules.Remove(handle);
             ourHandle = handle;
@@ -5343,7 +5579,7 @@ static void Module_Destructor(Module module)
          {
             module.modules.Delete(handle);
             delete depModule;
-         }         
+         }
       }
       if(ourHandle)
       {
@@ -5373,7 +5609,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
       {
@@ -5396,8 +5632,8 @@ static void Module_Destructor(Module module)
                break;
             }
       }
-      delete def.name;
-      delete def.value;
+      delete (void *)def.name;
+      delete (void *)def.value;
       module.defines.Delete(def);
    }
 
@@ -5414,12 +5650,12 @@ static void Module_Destructor(Module module)
                break;
             }
       }
-      delete function.name;
-      delete function.dataTypeString;
+      delete (void *)function.name;
+      delete (void *)function.dataTypeString;
       module.functions.Delete(function);
    }
 
-   delete module.name;
+   delete (void *)module.name;
 
    NameSpace_Free(module.privateNameSpace);
    NameSpace_Free(module.publicNameSpace);
@@ -5434,7 +5670,7 @@ static void Module_Destructor(Module module)
 #endif
 }
 
-static int GetEnumSize(Class _class)
+static int64 GetEnumSize(Class _class)
 {
    EnumClassData data = (EnumClassData)_class.data;
    return data.largest+1;
@@ -5466,10 +5702,10 @@ default dllexport char * strupr(char *string)
 }
 #endif
 
-public dllexport DefinedExpression eSystem_RegisterDefine(char * name, char * value, Module module, AccessMode declMode)
+public dllexport DefinedExpression eSystem_RegisterDefine(const char * name, const char * value, Module module, AccessMode declMode)
 {
    NameSpace * nameSpace = null;
-   
+
    int start = 0, c;
 
    nameSpace = (declMode == publicAccess) ? &module.publicNameSpace : &module.privateNameSpace;
@@ -5503,12 +5739,12 @@ public dllexport DefinedExpression eSystem_RegisterDefine(char * name, char * va
                delete spaceName;
             nameSpace = newSpace;
             if(name[c] == ':') c++;
-            start = c+1;         
+            start = c+1;
          }
       }
    }
    else
-      c = strlen(name);
+      c = (int)strlen(name);
 
    if(c - start && !nameSpace->defines.FindString(name + start))
    {
@@ -5526,7 +5762,7 @@ public dllexport DefinedExpression eSystem_RegisterDefine(char * name, char * va
    return null;
 }
 
-public dllexport GlobalFunction eSystem_RegisterFunction(char * name, char * type, void * func, Module module, AccessMode declMode)
+public dllexport GlobalFunction eSystem_RegisterFunction(const char * name, const char * type, void * func, Module module, AccessMode declMode)
 {
    NameSpace * nameSpace = null;
    int start = 0, c;
@@ -5562,12 +5798,12 @@ public dllexport GlobalFunction eSystem_RegisterFunction(char * name, char * typ
                delete spaceName;
             nameSpace = newSpace;
             if(name[c] == ':') c++;
-            start = c+1;         
+            start = c+1;
          }
       }
    }
    else
-      c = strlen(name);
+      c = (int)strlen(name);
 
    if(c - start && !nameSpace->functions.FindString(name + start))
    {
@@ -5587,7 +5823,7 @@ public dllexport GlobalFunction eSystem_RegisterFunction(char * name, char * typ
    return null;
 }
 
-public dllexport DefinedExpression eSystem_FindDefine(Module module, char * name)
+public dllexport DefinedExpression eSystem_FindDefine(Module module, const char * name)
 {
    if(name && module)
    {
@@ -5601,7 +5837,7 @@ public dllexport DefinedExpression eSystem_FindDefine(Module module, char * name
    return null;
 }
 
-public dllexport GlobalFunction eSystem_FindFunction(Module module, char * name)
+public dllexport GlobalFunction eSystem_FindFunction(Module module, const char * name)
 {
    if(name && module)
    {
@@ -5670,13 +5906,21 @@ public dllexport void eInstance_FireWatchers(Instance instance, Property _proper
 {
    if(instance && _property && _property.isWatchable)
    {
-      OldList * watchers = (OldList *)((byte *)instance + _property.watcherOffset);
-      Watcher watcher, next;
-
-      for(watcher = watchers->first; watcher; watcher = next)
+      Module module = instance._class ? instance._class.module : null;
+      Application application = module ? module.application : null;
+      int flags = application ? application.isGUIApp : 0;
+      bool inCompiler = (flags & 8) ? true : false;
+      bool force32Bits = (flags & 4) ? true : false;
+      if(!force32Bits || !inCompiler)
       {
-         next = watcher.next;
-         watcher.callback(watcher.object, instance);
+         OldList * watchers = (OldList *)((byte *)instance + _property.watcherOffset);
+         Watcher watcher, next;
+
+         for(watcher = watchers->first; watcher; watcher = next)
+         {
+            next = watcher.next;
+            watcher.callback(watcher.object, instance);
+         }
       }
    }
 }
@@ -5709,12 +5953,12 @@ public dllexport void eClass_DestructionWatchable(Class _class)
    }
 }
 
-public dllexport void eProperty_SelfWatch(Class _class, char * name, void (*callback)(void *))
+public dllexport void eProperty_SelfWatch(Class _class, const char * name, void (*callback)(void *))
 {
    if(_class)
    {
       Property _property = eClass_FindProperty(_class, name, _class.module);
-      
+
       if(!_property)
          _property = eClass_AddProperty(_class, name, null, null, null, baseSystemAccess /*privateAccess*/);
       _class.selfWatchers.Add(SelfWatcher { _property = _property, callback = callback });
@@ -5784,7 +6028,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;
          }
       }
    }
@@ -5808,7 +6052,7 @@ public dllexport subclass(ClassDesignerBase) eInstance_GetDesigner(Instance inst
    return null;
 }
 
-public bool LocateModule(char * name, char * fileName)
+public bool LocateModule(const char * name, const char * fileName)
 {
    return Instance_LocateModule(name, fileName);
 }
@@ -5816,7 +6060,9 @@ public bool LocateModule(char * name, char * fileName)
 static void LoadCOM(Module module)
 {
    bool force64Bits = (module.application.isGUIApp & 2) ? true : false;
-   int pointerSize = force64Bits ? 8 : sizeof(void *);
+   bool force32Bits = (module.application.isGUIApp & 4) ? true : false;
+   bool inCompiler = (module.application.isGUIApp & 8) ? true : false;
+   int pointerSize = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
    Class applicationClass;
    Class enumClass, structClass, boolClass;
    Class moduleClass;
@@ -5831,8 +6077,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;
@@ -5848,11 +6094,11 @@ static void LoadCOM(Module module)
    InitializeDataTypes1(module);
 
    // Create Enum class
-   enumClass = eSystem_RegisterClass(normalClass, "enum", null, 0, force64Bits ? 32 : sizeof(class EnumClassData), null, null, module, baseSystemAccess, publicAccess);
+   enumClass = eSystem_RegisterClass(normalClass, "enum", null, 0, force64Bits ? 40 : sizeof(class EnumClassData), null, null, module, baseSystemAccess, publicAccess);
    eClass_AddClassProperty(enumClass, "enumSize", "int", null, GetEnumSize).constant = true;
    enumClass.type = systemClass;
-   
-   delete enumClass.dataTypeString;
+
+   delete (void *)enumClass.dataTypeString;
    enumClass.dataTypeString = CopyString(/*"unsigned int"*/"int");
 
    // Create Struct (simple) class
@@ -5875,39 +6121,46 @@ static void LoadCOM(Module module)
    eEnum_AddFixedValue(boolClass, "false", bool::false);
 
    // Create Module class
-   moduleClass = eSystem_RegisterClass(normalClass, "ecere::com::Module", null, force64Bits ? 8 + 8 + 32 + 32 + 32 + 32 + 8 + 8 + 8 + 8 + 8 + 8 + (32 + 8 + 8 + 4*32) + (32 + 8 + 8 + 4*32)
-                                                                                           : sizeof(struct Module), 0, (void *)Module_Constructor, (void *)Module_Destructor, module, baseSystemAccess, publicAccess);
+   moduleClass = eSystem_RegisterClass(normalClass, "ecere::com::Module", null, force64Bits ? 8 + 32 + 32 + 32 + 32 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + (32 + 8 + 8 + 4*32) + (32 + 8 + 8 + 4*32) :
+                                                                                sizeof(struct Module), 0, (void *)Module_Constructor, (void *)Module_Destructor, module, baseSystemAccess, publicAccess);
    eClass_AddVirtualMethod(moduleClass, "OnLoad", "bool()", null, publicAccess);
    eClass_AddVirtualMethod(moduleClass, "OnUnload", "void()", null, publicAccess);
-   eClass_AddMethod(moduleClass, "Load", "Module(char * name, AccessMode importAccess)", eModule_Load, publicAccess);
+   eClass_AddMethod(moduleClass, "Load", "Module(const char * name, AccessMode importAccess)", eModule_Load, publicAccess);
    eClass_AddMethod(moduleClass, "Unload", "void(Module module)", eModule_Unload, publicAccess);
    eClass_AddDataMember(moduleClass, "application", "Application", pointerSize, pointerSize, publicAccess);
-   eClass_AddDataMember(moduleClass, "classes", "OldList", force64Bits ? 32 : sizeof(OldList), pointerSize, publicAccess);
-   eClass_AddDataMember(moduleClass, "defines", "OldList", force64Bits ? 32 : sizeof(OldList), pointerSize, publicAccess);
-   eClass_AddDataMember(moduleClass, "functions", "OldList", force64Bits ? 32 : sizeof(OldList), pointerSize, publicAccess);
-   eClass_AddDataMember(moduleClass, "modules", "OldList", force64Bits ? 32 : sizeof(OldList), pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "classes", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(OldList), pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "defines", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(OldList), pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "functions", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(OldList), pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "modules", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(OldList), pointerSize, publicAccess);
    eClass_AddDataMember(moduleClass, "prev", "Module", pointerSize, pointerSize, publicAccess);
    eClass_AddDataMember(moduleClass, "next", "Module", pointerSize, pointerSize, publicAccess);
-   eClass_AddDataMember(moduleClass, "name", "char *", pointerSize, pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "name", "const char *", pointerSize, pointerSize, publicAccess);
    eClass_AddDataMember(moduleClass, "library", "void *", pointerSize, pointerSize, publicAccess);
    eClass_AddDataMember(moduleClass, "Unload", "void *", pointerSize, pointerSize, publicAccess);
    eClass_AddDataMember(moduleClass, "importType", "ImportType", sizeof(ImportType), 4, publicAccess);
    eClass_AddDataMember(moduleClass, "origImportType", "ImportType", sizeof(ImportType), 4, publicAccess);
-   eClass_AddDataMember(moduleClass, "privateNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4*32) : sizeof(NameSpace), pointerSize, publicAccess);
-   eClass_AddDataMember(moduleClass, "publicNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4*32) : sizeof(NameSpace), pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "privateNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4*32) : force32Bits ? (16 + 4 + 4 + 4*16) : sizeof(NameSpace), pointerSize, publicAccess);
+   eClass_AddDataMember(moduleClass, "publicNameSpace", "NameSpace",  force64Bits ? (32 + 8 + 8 + 4*32) : force32Bits ? (16 + 4 + 4 + 4*16) : sizeof(NameSpace), pointerSize, publicAccess);
    moduleClass.fixed = true;
    moduleClass.count++;
-   
+   if(inCompiler && force32Bits)
+      moduleClass.structSize = 12 + 4 + 20 + 20 + 20 + 20 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + (16 + 4 + 4 + 4*16) + (16 + 4 + 4 + 4*16);
+
    // Create Application class
-   applicationClass = eSystem_RegisterClass(normalClass, "ecere::com::Application", "Module", force64Bits ? (8+8+8+8 + 32 + 8 + 176) : sizeof(struct Application), 0, null, (void *)Application_Destructor, module, baseSystemAccess, publicAccess);
+   applicationClass = eSystem_RegisterClass(normalClass, "ecere::com::Application", "Module", force64Bits ? (8+8+4+4 + 32 + 8 + 176) : sizeof(struct Application), 0, null, (void *)Application_Destructor, module, baseSystemAccess, publicAccess);
+   if(inCompiler && force32Bits)
+   {
+      applicationClass.offset = 12 + 4 + 20 + 20 + 20 + 20 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + (16 + 4 + 4 + 4*16) + (16 + 4 + 4 + 4*16);
+      applicationClass.structSize = applicationClass.offset + (4+4+4+4 + 20 + 4 + 88);
+   }
    eClass_AddVirtualMethod(applicationClass, "Main", "void()", null, publicAccess);
    eClass_AddDataMember(applicationClass, "argc", "int", sizeof(int), 4, publicAccess);
-   eClass_AddDataMember(applicationClass, "argv", "char **", pointerSize, pointerSize, publicAccess);
+   eClass_AddDataMember(applicationClass, "argv", "const char **", pointerSize, pointerSize, publicAccess);
    eClass_AddDataMember(applicationClass, "exitCode", "int", sizeof(int), 4, publicAccess);
    eClass_AddDataMember(applicationClass, "isGUIApp", "bool", sizeof(bool), 4, publicAccess);
-   eClass_AddDataMember(applicationClass, "allModules", "OldList", force64Bits ? 32: sizeof(OldList), pointerSize, publicAccess);
+   eClass_AddDataMember(applicationClass, "allModules", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(OldList), pointerSize, publicAccess);
    eClass_AddDataMember(applicationClass, "parsedCommand", "char *", pointerSize, pointerSize, publicAccess);
-   eClass_AddDataMember(applicationClass, "systemNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4*32) : sizeof(NameSpace), pointerSize, publicAccess);
+   eClass_AddDataMember(applicationClass, "systemNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4*32) : force32Bits ? (16 + 4 + 4 + 4*16) : sizeof(NameSpace), pointerSize, publicAccess);
    applicationClass.fixed = true;
    applicationClass.count++;
 
@@ -5926,6 +6179,9 @@ static void LoadCOM(Module module)
    eSystem_RegisterFunction("asin", "Angle asin(double number)", asin, module, baseSystemAccess);
    eSystem_RegisterFunction("acos", "Angle acos(double number)", acos, module, baseSystemAccess);
    eSystem_RegisterFunction("atan", "Angle atan(double number)", atan, module, baseSystemAccess);
+   eSystem_RegisterFunction("asinh", "Angle asinh(double number)", asinh, module, baseSystemAccess);
+   eSystem_RegisterFunction("acosh", "Angle acosh(double number)", acosh, module, baseSystemAccess);
+   eSystem_RegisterFunction("atanh", "Angle atanh(double number)", atanh, module, baseSystemAccess);
    eSystem_RegisterFunction("pow", "double pow(double number, double number2)", pow, module, baseSystemAccess);
    eSystem_RegisterFunction("fmod", "double fmod(double x, double y)", fmod, module, baseSystemAccess);
    eSystem_RegisterFunction("fabs", "double fabs(double number)", fabs, module, baseSystemAccess);
@@ -5936,25 +6192,28 @@ static void LoadCOM(Module module)
    eSystem_RegisterFunction("exp", "double exp(double number)", exp, module, baseSystemAccess);
 
    // --- Stdlib ---
-   eSystem_RegisterFunction("qsort", "void qsort(void *, uint, uint, int (*)(void *, void *))", qsort, module, baseSystemAccess);
-   eSystem_RegisterFunction("strtod", "double strtod(char*, char**)", strtod, module, baseSystemAccess);
-   eSystem_RegisterFunction("strtol", "int strtol(char*, char**, int base)", strtol, module, baseSystemAccess);
+   eSystem_RegisterFunction("qsort", "void qsort(void *, uintsize, uintsize, int (*)(void *, void *))", qsort, module, baseSystemAccess);
+   eSystem_RegisterFunction("strtod", "double strtod(const char*, char**)", strtod, module, baseSystemAccess);
+   eSystem_RegisterFunction("strtol", "int strtol(const char*, char**, int base)", strtol, module, baseSystemAccess);
    eSystem_RegisterFunction("system", "int system(const char*)", system, module, baseSystemAccess);
    eSystem_RegisterFunction("atoi", "int atoi(const char*)", atoi, module, baseSystemAccess);
-   eSystem_RegisterFunction("atof", "float atof(const char*)", atof, module, baseSystemAccess);
+   eSystem_RegisterFunction("atof", "double atof(const char*)", atof, module, baseSystemAccess);
    eSystem_RegisterFunction("tolower", "int tolower(int)", tolower, module, baseSystemAccess);
    eSystem_RegisterFunction("toupper", "int toupper(int)", toupper, module, baseSystemAccess);
    eSystem_RegisterFunction("isdigit", "bool isdigit(int)", isdigit, module, baseSystemAccess);
-   eSystem_RegisterFunction("memset", "void memset(void * area, byte value, uint count)", memset, module, baseSystemAccess);
+   eSystem_RegisterFunction("memset", "void * memset(void * area, int value, uintsize count)", memset, module, baseSystemAccess);
    eSystem_RegisterFunction("getenv", "char * getenv(const char * name)", getenv, module, baseSystemAccess);
    eSystem_RegisterFunction("rename", "int rename(const char *oldpath, const char *newpath)", rename, module, baseSystemAccess);
 
    // --- String --- (These might move to the string class)
-   eSystem_RegisterFunction("strlen", "int strlen(const char *)", strlen, module, baseSystemAccess);
+   eSystem_RegisterFunction("strlen", "uintsize strlen(const char *)", strlen, module, baseSystemAccess);
    eSystem_RegisterFunction("strcat", "char * strcat(char *, const char *)", strcat, module, baseSystemAccess);
-   eSystem_RegisterFunction("strncat", "char * strncat(char *, const char *, int n)", strncat, module, baseSystemAccess);
-   eSystem_RegisterFunction("strchr", "char * strchr(char *, int)", strchr, module, baseSystemAccess);
-   eSystem_RegisterFunction("strstr", "char * strstr(char *, const char *)", strstr, module, baseSystemAccess);
+   eSystem_RegisterFunction("strncat", "char * strncat(char *, const char *, uintsize n)", strncat, module, baseSystemAccess);
+   eSystem_RegisterFunction("strchr", "char * strchr(const char *, int)", strchr, module, baseSystemAccess);
+   eSystem_RegisterFunction("strstr", "char * strstr(const char *, const char *)", strstr, module, baseSystemAccess);
+   eSystem_RegisterFunction("strspn", "uintsize strspn(const char *, const char *)", strspn, module, baseSystemAccess);
+   eSystem_RegisterFunction("strcspn", "uintsize strcspn(const char *, const char *)", strcspn, module, baseSystemAccess);
+   eSystem_RegisterFunction("strpbrk", "char * strpbrk(const char *, const char *)", strpbrk, module, baseSystemAccess);
 
    eSystem_RegisterDefine("fstrcmp", "(GetRuntimePlatform() == win32) ? strcmpi : strcmp", module, baseSystemAccess);
 
@@ -5962,7 +6221,7 @@ static void LoadCOM(Module module)
    eSystem_RegisterDefine("strcmpi", "strcasecmp", module, baseSystemAccess);
    eSystem_RegisterDefine("strnicmp", "strncasecmp", module, baseSystemAccess);
    eSystem_RegisterFunction("strcasecmp", "int strcasecmp(const char *, const char *)", strcmpi, module, baseSystemAccess);
-   eSystem_RegisterFunction("strncasecmp", "int strncasecmp(const char *, const char *, int n)", strnicmp, module, baseSystemAccess);
+   eSystem_RegisterFunction("strncasecmp", "int strncasecmp(const char *, const char *, uintsize n)", strnicmp, module, baseSystemAccess);
 /*
 #else
    eSystem_RegisterDefine("strcasecmp", "strcmpi", module, baseSystemAccess);
@@ -5973,24 +6232,23 @@ static void LoadCOM(Module module)
 */
 
    eSystem_RegisterFunction("strcmp", "int strcmp(const char *, const char *)", strcmp, module, baseSystemAccess);
-   eSystem_RegisterFunction("strncmp", "int strncmp(const char *, const char *, int n)", strncmp, module, baseSystemAccess);
+   eSystem_RegisterFunction("strncmp", "int strncmp(const char *, const char *, uintsize n)", strncmp, module, baseSystemAccess);
    eSystem_RegisterFunction("strlwr", "char * strlwr(char *)", strlwr, module, baseSystemAccess);
    eSystem_RegisterFunction("strupr", "char * strupr(char *)", strupr, module, baseSystemAccess);
    eSystem_RegisterFunction("strcpy", "char * strcpy(char *, const char *)", strcpy, module, baseSystemAccess);
-   eSystem_RegisterFunction("strncpy", "char * strncpy(char *, const char *, int n)", strncpy, module, baseSystemAccess);
-   eSystem_RegisterFunction("memcpy", "void * memcpy(void *, const void *, uint size)", memcpy, module, baseSystemAccess);
-   eSystem_RegisterFunction("memmove", "void * memmove(void *, const void *, uint size)", memmove, module, baseSystemAccess);
+   eSystem_RegisterFunction("strncpy", "char * strncpy(char *, const char *, uintsize n)", strncpy, module, baseSystemAccess);
+   eSystem_RegisterFunction("memcpy", "void * memcpy(void *, const void *, uintsize size)", memcpy, module, baseSystemAccess);
+   eSystem_RegisterFunction("memmove", "void * memmove(void *, const void *, uintsize size)", memmove, module, baseSystemAccess);
+   eSystem_RegisterFunction("memcmp", "int memcmp(const void *, const void *, uintsize size)", memcmp, module, baseSystemAccess);
 
    // --- Stdio ---
-   eSystem_RegisterFunction("sprintf", "int sprintf(char *, char *, ...)", sprintf, module, baseSystemAccess);
-   // TODO: Replace int with size_t when eC recognizes it for 64 bit port
-   eSystem_RegisterFunction("snprintf", "int sprintf(char *, int, char *, ...)", snprintf, module, baseSystemAccess);
-   eSystem_RegisterFunction("printf", "int printf(char *, ...)", printf, module, baseSystemAccess);
+   eSystem_RegisterFunction("sprintf", "int sprintf(char *, const char *, ...)", sprintf, module, baseSystemAccess);
+   eSystem_RegisterFunction("snprintf", "int sprintf(char *, uintsize, const char *, ...)", snprintf, module, baseSystemAccess);
+   eSystem_RegisterFunction("printf", "int printf(const char *, ...)", printf, module, baseSystemAccess);
    eSystem_RegisterFunction("vsprintf", "int vsprintf(char*, const char*, __builtin_va_list)", vsprintf, module, baseSystemAccess);
-   // TODO: Replace int with size_t when eC recognizes it for 64 bit port
-   eSystem_RegisterFunction("vsnprintf", "int vsnprintf(char*, int, const char*, __builtin_va_list)", vsnprintf, module, baseSystemAccess);
-   eSystem_RegisterFunction("puts", "int puts(char *)", puts, module, baseSystemAccess);
-   eSystem_RegisterFunction("fputs", "int fputs(char *, void * stream)", fputs, module, baseSystemAccess);
+   eSystem_RegisterFunction("vsnprintf", "int vsnprintf(char*, uintsize, const char*, __builtin_va_list)", vsnprintf, module, baseSystemAccess);
+   eSystem_RegisterFunction("puts", "int puts(const char *)", puts, module, baseSystemAccess);
+   eSystem_RegisterFunction("fputs", "int fputs(const char *, void * stream)", fputs, module, baseSystemAccess);
 
    // --- Ctype ---
    eSystem_RegisterFunction("isalnum", "int isalnum(int c)", isalnum, module, baseSystemAccess);
@@ -6000,6 +6258,8 @@ static void LoadCOM(Module module)
    eSystem_RegisterFunction("isupper", "int isupper(int c)", isupper, module, baseSystemAccess);
    eSystem_RegisterFunction("isprint", "int isprint(int c)", isprint, module, baseSystemAccess);
    eSystem_RegisterFunction("strtoul", "unsigned long strtoul(const char * nptr, char ** endptr, int base)", strtoul, module, baseSystemAccess);
+   eSystem_RegisterFunction("strtoll", "int64 strtoll(const char * nptr, char ** endptr, int base)", strtoul, module, baseSystemAccess);
+   eSystem_RegisterFunction("strtoull", "uint64 strtoull(const char * nptr, char ** endptr, int base)", strtoul, module, baseSystemAccess);
 
 }
 
@@ -6038,7 +6298,7 @@ public dllexport Application __ecere_COM_Initialize(bool guiApp, int argc, char
    Instance_COM_Initialize(argc, argv, &app.parsedCommand, &app.argc, &app.argv);
 
    app.application = app;
-   app.allModules.offset = sizeof(class Instance) + (uint)&((struct Module *)0)->prev;
+   app.allModules.offset = sizeof(class Instance) + (uint)(uintptr)&((struct Module *)0)->prev;
    app.isGUIApp = guiApp;
 
    LoadCOM(app);
@@ -6048,7 +6308,7 @@ public dllexport Application __ecere_COM_Initialize(bool guiApp, int argc, char
    return app;
 }
 
-public dllexport ClassTemplateParameter eClass_AddTemplateParameter(Class _class, char * name, TemplateParameterType type, void * info, ClassTemplateArgument defaultArg)
+public dllexport ClassTemplateParameter eClass_AddTemplateParameter(Class _class, const char * name, TemplateParameterType type, const void * info, ClassTemplateArgument defaultArg)
 {
    if(_class && name)
    {
@@ -6065,7 +6325,7 @@ public dllexport ClassTemplateParameter eClass_AddTemplateParameter(Class _class
          type = type;
          (type == identifier) ? info : CopyString(info);
       };
-      if(defaultArg != null) 
+      if(defaultArg != null)
       {
          param.defaultArg = defaultArg;
          CopyTemplateArg(param, param.defaultArg);
@@ -6080,16 +6340,17 @@ public dllexport void eClass_DoneAddingTemplateParameters(Class base)
 {
    if(base)
    {
-      OldLink derivative;
       ClassTemplateParameter param;
       {
          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;
@@ -6101,8 +6362,8 @@ public dllexport void eClass_DoneAddingTemplateParameters(Class base)
          if(param.type == identifier && param.defaultArg.memberString)
          {
             Class memberClass = base;
-            char * colon = strstr(param.defaultArg.memberString, "::");
-            char * memberName;
+            const char * colon = strstr(param.defaultArg.memberString, "::");
+            const char * memberName;
             if(colon)
             {
                char className[1024];
@@ -6152,7 +6413,7 @@ public dllexport void eClass_DoneAddingTemplateParameters(Class base)
                }
             }
          }
-      }      
+      }
 
       //ComputeClassParameters(base, null, null);
 
@@ -6194,11 +6455,11 @@ public enum Platform
 {
    unknown, win32, tux, apple;
 
-   property char *
+   property const char *
    {
       get { return OnGetString(null, null, null); }
       set
-      {  
+      {
          if(value)
          {
             Platform c;
@@ -6210,7 +6471,7 @@ public enum Platform
       }
    };
 
-   char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+   const char * OnGetString(char * tempString, void * fieldData, bool * needClass)
    {
       if(this >= firstPlatform && this <= lastPlatform)
       {
@@ -6222,11 +6483,11 @@ public enum Platform
          tempString[0] = '\0';
       return null;
    }
-   
-   bool OnGetDataFromString(char * string)
+
+   bool OnGetDataFromString(const char * string)
    {
       this = string;
-      return (bool)this;
+      return this != unknown;
    }
 };
 
@@ -6256,13 +6517,14 @@ public:
    OldList instances;
    ClassDefinition classDefinition;
    bool modified;
+   void * i18nStrings;
 };
 
 public class DesignerBase : Window
 {
 public:
-   virtual bool FindObject(Instance * instance, char * string);
-   virtual void RenameObject(ObjectInfo object, char * name);
+   virtual bool FindObject(Instance * instance, const char * string);
+   virtual void RenameObject(ObjectInfo object, const char * name);
    virtual void SelectObjectFromDesigner(ObjectInfo object);
    virtual void CodeAddObject(Instance instance, ObjectInfo * object);
    virtual void SheetAddObject(ObjectInfo object);
@@ -6274,27 +6536,27 @@ public:
    virtual void UpdateProperties(void);
 
    ClassDesignerBase classDesigner;
-   char * objectClass;
+   const char * objectClass;
    bool isDragging;
 
    // FIX THIS WITH PUBLIC:
    property ClassDesignerBase classDesigner
-   { 
+   {
       get { return classDesigner; }
       set { classDesigner = value; }
    };
-   property char * objectClass
-   { 
+   property const char * objectClass
+   {
       get { return objectClass; }
       set { objectClass = value; }
    };
    property bool isDragging
-   { 
+   {
       get { return isDragging; }
       set { isDragging = value; }
    };
 }
+
 public class ClassDesignerBase : Window
 {
 public:
@@ -6310,7 +6572,7 @@ public:
    virtual void ::DroppedObject(Instance instance, ObjectInfo object, bool isClass, Instance _class);
    virtual void ::DestroyObject(Instance object);
    virtual void ::FixProperty(Property prop, Instance object);
-   virtual void ::CreateNew(EditBox editBox, Size clientSize, char * name, char * inherit);
+   virtual void ::CreateNew(EditBox editBox, Size clientSize, const char * name, const char * inherit);
 }
 
 DesignerBase activeDesigner;
@@ -6325,13 +6587,21 @@ public DesignerBase GetActiveDesigner()
    return activeDesigner;
 }
 
+
+bool poolingDisabled;
+
+public dllexport void eSystem_SetPoolingDisabled(bool disabled)
+{
+   poolingDisabled = disabled;
+}
+
 namespace sys;
 
 // constants
 define LEAD_OFFSET      = 0xD800 - (0x10000 >> 10);
 define SURROGATE_OFFSET = 0x10000 - (0xD800 << 10) - 0xDC00;
 
-public bool UTF8Validate(char * source)
+public bool UTF8Validate(const char * source)
 {
    if(source)
    {
@@ -6378,9 +6648,9 @@ public bool UTF8Validate(char * source)
          }
          if(i < numBytes) return false;
 
-         if(codePoint > 0x10FFFF || (codePoint >= 0xD800 && codePoint <= 0xDFFF) || 
-           (codePoint < 0x80 && numBytes > 1) || 
-           (codePoint < 0x800 && numBytes > 2) || 
+         if(codePoint > 0x10FFFF || (codePoint >= 0xD800 && codePoint <= 0xDFFF) ||
+           (codePoint < 0x80 && numBytes > 1) ||
+           (codePoint < 0x800 && numBytes > 2) ||
            (codePoint < 0x10000 && numBytes > 3))
             return false;
       }
@@ -6388,13 +6658,17 @@ public bool UTF8Validate(char * source)
    return true;
 }
 
-public int ISO8859_1toUTF8(char * source, char * dest, int max)
+public int ISO8859_1toUTF8(const char * source, char * dest, int max)
 {
    int c;
    int d = 0;
    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;
@@ -6426,7 +6700,7 @@ public int ISO8859_1toUTF8(char * source, char * dest, int max)
    return d;
 }
 
-public char * UTF16toUTF8(uint16 * source)
+public char * UTF16toUTF8(const uint16 * source)
 {
    int c;
    int d = 0;
@@ -6446,12 +6720,12 @@ public char * UTF16toUTF8(uint16 * source)
          continue;
       }
       if(invert) { u16 = ((u16 & 0xFF00) >> 8) | ((u16 & 0x00FF) << 8); }
-      
+
       if(u16 < 0xD800 || u16 > 0xDBFF)
-         ch = (unichar)u16;         
+         ch = (unichar)u16;
       else
          ch = ((unichar)u16 << 10) + source[c++] + SURROGATE_OFFSET;
-                  
+
       if(ch < 0x80)
       {
          dest[d++] = (char)ch;
@@ -6480,7 +6754,7 @@ public char * UTF16toUTF8(uint16 * source)
    return dest;
 }
 
-public int UTF16toUTF8Buffer(uint16 * source, byte * dest, int max)
+public int UTF16toUTF8Buffer(const uint16 * source, char * dest, int max)
 {
    int c;
    int d = 0;
@@ -6489,7 +6763,7 @@ public int UTF16toUTF8Buffer(uint16 * source, byte * dest, int max)
    {
       unichar ch;
       if(u16 < 0xD800 || u16 > 0xDBFF)
-         ch = (unichar)u16;         
+         ch = (unichar)u16;
       else
          ch = ((unichar)u16 << 10) + source[c++] + SURROGATE_OFFSET;
 
@@ -6524,13 +6798,14 @@ public int UTF16toUTF8Buffer(uint16 * source, byte * dest, int max)
    return d;
 }
 
-public unichar UTF8GetChar(char * string, int * numBytes)
+// NOTE: UTF8GetChar now returns 0 into numBytes for the null-terminating character ('\0')
+public unichar UTF8GetChar(const char * string, int * numBytes)
 {
    unichar ch;
    byte b = ((byte *)string)[0];
    int i;
    byte mask = 0x7F;
-   int nb = 1;
+   int nb = b ? 1 : 0;
    ch = 0;
    if(b & 0x80)
    {
@@ -6565,10 +6840,10 @@ public unichar UTF8GetChar(char * string, int * numBytes)
       }
    }
 
-   if(i < nb || 
-      ch > 0x10FFFF || (ch >= 0xD800 && ch <= 0xDFFF) || 
-     (ch < 0x80 && nb > 1) || 
-     (ch < 0x800 && nb > 2) || 
+   if(i < nb ||
+      ch > 0x10FFFF || (ch >= 0xD800 && ch <= 0xDFFF) ||
+     (ch < 0x80 && nb > 1) ||
+     (ch < 0x800 && nb > 2) ||
      (ch < 0x10000 && nb > 3))
    {
       ch = 0;
@@ -6578,7 +6853,7 @@ public unichar UTF8GetChar(char * string, int * numBytes)
    return ch;
 }
 
-public int UTF8toUTF16Buffer(char * source, uint16 * dest, int max)
+public int UTF8toUTF16Buffer(const char * source, uint16 * dest, int max)
 {
    if(source)
    {
@@ -6630,10 +6905,10 @@ public int UTF8toUTF16Buffer(char * source, uint16 * dest, int max)
       dest[d] = 0;
       return d;
    }
-   return 0;   
+   return 0;
 }
 
-public int UTF32toUTF8Len(unichar * source, int count, byte * dest, int max)
+public int UTF32toUTF8Len(const unichar * source, int count, char * dest, int max)
 {
    int c;
    int d = 0;
@@ -6671,11 +6946,11 @@ public int UTF32toUTF8Len(unichar * source, int count, byte * dest, int max)
    return d;
 }
 
-public uint16 * UTF8toUTF16(char * source, int * wordCount)
+public uint16 * UTF8toUTF16(const char * source, int * wordCount)
 {
    if(source)
    {
-      int len = strlen(source);
+      int len = (int)strlen(source);
       uint16 * dest = new uint16[len + 1];
       int c;
       int d = 0;