namespace com;
-// #define DISABLE_MEMMGR
+#if defined(__ANDROID__)
+ #define DISABLE_MEMMGR
+#endif
+
+#if defined(__EMSCRIPTEN__)
+ #define DISABLE_MEMMGR
+ #define _NOMUTEX
+#endif
import "BinaryTree"
import "OldList"
#undef __BLOCKS__
-#if !defined(__EMSCRIPTEN__)
-#if !defined(ECERE_BOOTSTRAP)
+#if defined(ECERE_BOOTSTRAP)
+ #define _NOMUTEX
+#endif
+
+#if !defined(_NOMUTEX)
import "Mutex"
+#else
+#if defined(MEMINFO)
+int GetCurrentThreadID() { return 0; }
#endif
#endif
#endif
#ifdef MEMINFO
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
import "Thread"
#endif
static define MAX_MEMORY_LOC = 40;
#if defined(__ANDROID__)
-default const char * AndroidInterface_GetLibLocation();
+default const char * AndroidInterface_GetLibLocation(Module m);
#include <android/log.h>
#include <android/native_activity.h>
{
#ifdef MEMINFO
MemStack stack;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
stack = (MemStack)memStacks.Find(GetCurrentThreadID());
}
if(stack.pos < MAX_STACK_FRAMES)
stack.frames[stack.pos++] = loc;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
#endif
{
#ifdef MEMINFO
MemStack stack;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
stack = (MemStack)memStacks.Find(GetCurrentThreadID());
{
stack.pos--;
}
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
#endif
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 (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN64) || defined(__LP64__) || defined(__LLP64__)
if(allocLoc[c] && allocLoc[c] != (void *)0xabababababababab)
#else
if(allocLoc[c] && allocLoc[c] != (void *)0xabababab)
static uint OUTSIDE_MEM = 0;
#endif
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
#if !defined(ECERE_BOOTSTRAP)
static Mutex memMutex { };
#endif
void * pointer;
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
printf(" %s\n", stack.frames[c]);
memoryErrorsCount++;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
return null;
}
#endif
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
#else
void * pointer;
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
if(stack.frames[c])
printf(" %s\n", stack.frames[c]);
memoryErrorsCount++;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
return null;
}
#endif
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
#else
if(!size) { _free(pointer); return null; }
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
if(stack.frames[c])
printf(" %s\n", stack.frames[c]);
memoryErrorsCount++;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
return null;
pointer = realloc(pointer, size);
#endif
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
return pointer ? ((byte *)pointer + REDZONE) : null;
#else
if(!size) { _free(pointer); return null; }
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
if(stack.frames[c])
printf(" %s\n", stack.frames[c]);
memoryErrorsCount++;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
return null;
pointer = crealloc(pointer, size);
#endif
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
return pointer ? ((byte *)pointer + REDZONE) : null;
#if defined(DISABLE_MEMMGR) && !defined(MEMINFO)
free(pointer);
#else
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
if(memMutex != pointer) memMutex.Wait();
#endif
free(pointer);
#endif
-#if !defined(ECERE_BOOTSTRAP) && !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
if(memMutex != pointer) memMutex.Release();
#endif
{
OldLink derivative;
- ComputeClassParameters(base, strchr(base.name, '<'), null);
+ ComputeClassParameters(base, strchr(base.name, '<'), null, base.templateClass != mod);
for(derivative = base.derivatives.first; derivative; derivative = derivative.next)
{
//const char * templateParams = strchr(template.name, '<');
template.base = base.base;
template._vTbl = base._vTbl;
- //ComputeClassParameters(template, templateParams, null);
+ //ComputeClassParameters(template, templateParams, null, true);
template.data = base.data;
template.offset = base.offset;
Class _class = null;
const char * dataTypeString = null;
Class enumBase = null;
- Class base = (baseName && baseName[0]) ? eSystem_FindClass(module, baseName) : null;
+ Class base = (baseName && baseName[0]) ? System_FindClass(module, baseName, true) : null;
Class prevBase = null;
if(base && !base.internalDecl && (base.type == noHeadClass || base.type == structClass || base.type == normalClass))
offsetClass = base ? base.sizeClass : (type == noHeadClass ? 0 : 0 /*sizeof(class Class)*/);
totalSizeClass = offsetClass + sizeClass;
- _class = eSystem_FindClass(module, name);
+ _class = System_FindClass(module, name, true);
if(!_class)
{
const char * colons = RSearchString(name, "::", strlen(name), true, false);
if(colons && colons)
{
- _class = eSystem_FindClass(module, colons + 2);
+ _class = System_FindClass(module, colons + 2, true);
if(_class)
{
if(_class.internalDecl)
Class templateBase;
strcpy(templateClassName, baseName);
*strchr(templateClassName, '<') = '\0';
- templateBase = eSystem_FindClass(module, templateClassName);
+ templateBase = System_FindClass(module, templateClassName, true);
if(!templateBase)
{
templateBase = eSystem_RegisterClass(0, templateClassName, null, 0,0, null, null, module, declMode, publicAccess);
templateBase.internalDecl = true;
}
- base = eSystem_FindClass(module, baseName);
+ base = System_FindClass(module, baseName, true);
}
else
{
!strcmp(name, "LineStyle") ||
!strcmp(name, "FillStyle") ||
!strcmp(name, "FontObject") ||
- !strcmp(name, "SymbolStyle"))
+ !strcmp(name, "FontObject") ||
+ !strcmp(name, "ecere::sys::Thread"))
{
_class.offset = force32Bits ? 24 : 12;
}
}
else if(type == bitClass || type == enumClass || type == unitClass)
{
- Class dataTypeClass = eSystem_FindClass(_class.module, dataTypeString);
+ Class dataTypeClass = System_FindClass(_class.module, dataTypeString, true);
if(dataTypeClass)
_class.typeSize = dataTypeClass.typeSize;
_class.structSize = 0;
public dllexport Class eSystem_FindClass(Module module, const char * name)
{
+ return System_FindClass(module, name, false);
+}
+
+Class System_FindClass(Module module, const char * name, bool registerTemplatesInternalDecl)
+{
if(name && module)
{
BTNamedLink link;
module.classes.Add(templatedClass);
- ComputeClassParameters(templatedClass, templateParams, module);
+ ComputeClassParameters(templatedClass, templateParams, module, registerTemplatesInternalDecl);
_class.templatized.Add(OldLink { data = templatedClass });
}
}
}
-static void ComputeClassParameters(Class templatedClass, const char * templateParams, Module findModule)
+static void ComputeClassParameters(Class templatedClass, const char * templateParams, Module findModule, bool registerInternalDecl)
{
char ch;
const char * nextParamStart = templateParams ? (templateParams + 1) : null;
{
case type:
argument.dataTypeString = CopyString(value);
- argument.dataTypeClass = eSystem_FindClass(findModule, value);
+ argument.dataTypeClass = System_FindClass(findModule, value, registerInternalDecl);
if(!argument.dataTypeClass)
- argument.dataTypeClass = eSystem_FindClass(_class.module, value);
+ argument.dataTypeClass = System_FindClass(_class.module, value, registerInternalDecl);
if(!argument.dataTypeClass)
- argument.dataTypeClass = eSystem_FindClass(_class.module.application, value);
+ argument.dataTypeClass = System_FindClass(_class.module.application, value, registerInternalDecl);
+ if(registerInternalDecl && !argument.dataTypeClass)
+ {
+ ClassTemplateParameter param;
+ for(param = templatedClass.templateParams.first; param; param = param.next)
+ if(!strcmp(param.name, value))
+ break;
+ if(!param)
+ {
+ argument.dataTypeClass = eSystem_RegisterClass(0, value, null, 0,0, null, null, _class.module, publicAccess, publicAccess);
+ argument.dataTypeClass.internalDecl = true;
+ }
+ }
break;
case expression:
{
- Class expClass = eSystem_FindClass(_class.module, curParam.dataTypeString);
- if(!expClass) expClass = eSystem_FindClass(_class.module.application, curParam.dataTypeString);
+ Class expClass = System_FindClass(_class.module, curParam.dataTypeString, true);
+ if(!expClass) expClass = System_FindClass(_class.module.application, curParam.dataTypeString, true);
if(expClass)
{
//if(expClass.type ==
CopyTemplateArg(param, templatedClass.templateArgs[curParamID]);
if(param.type == type && param.defaultArg.dataTypeString)
{
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(findModule, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(findModule, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString, true);
}
}
curParamID++;
FreeTemplateArg(templatedClass, param, c);
arg->dataTypeString = CopyString(templateString);
- arg->dataTypeClass = eSystem_FindClass(findModule, templateString);
+ arg->dataTypeClass = System_FindClass(findModule, templateString, true);
if(!arg->dataTypeClass)
- arg->dataTypeClass = eSystem_FindClass(templatedClass.module, templateString);
+ arg->dataTypeClass = System_FindClass(templatedClass.module, templateString, true);
if(!arg->dataTypeClass)
- arg->dataTypeClass = eSystem_FindClass(templatedClass.module.application, templateString);
+ arg->dataTypeClass = System_FindClass(templatedClass.module.application, templateString, true);
}
else
{
CopyTemplateArg(param, templatedClass.templateArgs[curParamID]);
if(param.type == type && param.defaultArg.dataTypeString)
{
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(findModule, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(findModule, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString, true);
}
}
curParamID++;
}
}
// TESTING: Added this here...
- memberClass = eSystem_FindClass(findModule, className);
+ memberClass = System_FindClass(findModule, className, true);
if(!memberClass)
- memberClass = eSystem_FindClass(templatedClass.module, className);
+ memberClass = System_FindClass(templatedClass.module, className, true);
if(!memberClass)
- memberClass = eSystem_FindClass(templatedClass.module.application, className);
+ memberClass = System_FindClass(templatedClass.module.application, className, true);
}
if(memberClass)
#ifdef MEMINFO
#undef malloc
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
//allocateClass = _class;
}
#ifdef MEMINFO
allocateClass = null;
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif
#endif
bool ownVtbl;
#ifdef MEMINFO
-#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__)
+#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN64) || defined(__LP64__) || defined(__LLP64__)
if(instance._class == (void *)0xecececececececec)
#else
if(instance._class == (void *)0xecececec)
{
const char * libLocation = null;
#if defined(__ANDROID__)
- libLocation = AndroidInterface_GetLibLocation();
+ libLocation = AndroidInterface_GetLibLocation(fromModule.application);
#endif
library = Instance_Module_Load(libLocation, name, &Load, &Unload);
}
}
incref module;
}
-#if defined(_DEBUG)
+#if defined(_DEBUG) && !defined(__ANDROID__)
InternalModuleLoadBreakpoint();
#endif
return module;
}
/*
-#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__)
+#if (defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN64) || defined(__LP64__) || defined(__LLP64__)
#define _64BIT 1
#else
#define _64BIT 0
#ifdef __ANDROID__
// Clean up global variables
+#if !defined(DISABLE_MEMMGR)
memoryInitialized = false;
pools = null;
+#endif
+
#ifdef MEMINFO
memset(&memStacks, 0, sizeof(BinaryTree));
memoryErrorsCount = 0;
type = type;
(type == identifier) ? info : CopyString(info);
};
+
+ {
+ Class c = eSystem_FindClass(_class.module, name);
+ if(c && c.internalDecl)
+ {
+ c.module.classes.Remove(c);
+ eClass_Unregister(c);
+ }
+ }
if(defaultArg != null)
{
param.defaultArg = defaultArg;
blocksByClass.Free();
sizeByClass.Free();
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Wait();
#endif
for(p = 0; pools && p < NUM_POOLS; p++)
sizeByClass[c] += block.size;
}
}
-#if !defined(__EMSCRIPTEN__)
+#if !defined(_NOMUTEX)
memMutex.Release();
#endif