ecere/src/com; gfx; gui: Temporary patches for alignment issues
authorJerome St-Louis <jerome@ecere.com>
Sun, 15 Feb 2015 19:59:47 +0000 (14:59 -0500)
committerJerome St-Louis <jerome@ecere.com>
Thu, 15 Oct 2015 00:19:27 +0000 (20:19 -0400)
- Fixes alignment issues with Emscripten
- Had to make public double members changing the alignment of structs
- Adjusting struct offset when derived class has a larger alignment than base class
- Bootstrap updated

compiler/bootstrap/ecere/bootstrap/Array.c
compiler/bootstrap/ecere/bootstrap/i18n.c
compiler/bootstrap/ecere/bootstrap/instance.c
ecere/src/com/instance.ec
ecere/src/gfx/3D/Camera.ec
ecere/src/gfx/3D/Object.ec
ecere/src/gfx/drivers/OpenGLDisplayDriver.ec
ecere/src/gui/Timer.ec
ecere/src/gui/controls/ListBox.ec

index bac66a2..53bfcde 100644 (file)
@@ -558,7 +558,9 @@ if(__ecerePointer___ecereNameSpace__ecere__com__Array->count != value)
 if(value > __ecerePointer___ecereNameSpace__ecere__com__Array->minAllocSize)
 __ecerePointer___ecereNameSpace__ecere__com__Array->array = __ecereNameSpace__ecere__com__eSystem_Renew0(__ecerePointer___ecereNameSpace__ecere__com__Array->array, ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize * (value));
 else if(value > __ecerePointer___ecereNameSpace__ecere__com__Array->count)
-memset(((unsigned char *)__ecerePointer___ecereNameSpace__ecere__com__Array->array) + (__ecerePointer___ecereNameSpace__ecere__com__Array->count * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize), 0, (value - __ecerePointer___ecereNameSpace__ecere__com__Array->count) * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize);
+{
+memset((unsigned char *)__ecerePointer___ecereNameSpace__ecere__com__Array->array + __ecerePointer___ecereNameSpace__ecere__com__Array->count * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize, 0, (value - __ecerePointer___ecereNameSpace__ecere__com__Array->count) * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize);
+}
 __ecerePointer___ecereNameSpace__ecere__com__Array->count = value;
 }
 __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(this, __ecereProp___ecereNameSpace__ecere__com__Array_size), __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(this, __ecerePropM___ecereNameSpace__ecere__com__Array_size);
index 8051058..b83974d 100644 (file)
@@ -546,7 +546,7 @@ sprintf(fileName, "/usr/share/locale/%s/LC_MESSAGES/%s.mo", genericLocale, name)
 f = __ecereNameSpace__ecere__sys__FileOpen(fileName, 1);
 }
 }
-if(f)
+if(0)
 {
 unsigned int magic = 0;
 
index da09af0..abd54ba 100644 (file)
@@ -582,6 +582,10 @@ byteDest[d] = 0;
 return d;
 }
 
+void __ecereNameSpace__ecere__com__queryMemInfo(char * string)
+{
+}
+
 struct __ecereNameSpace__ecere__sys__OldList
 {
 void *  first;
@@ -2017,9 +2021,11 @@ if(alignment)
 {
 short __simpleStruct0;
 unsigned int pointerAlignment = alignment == 0xF000F000;
+unsigned int force64Bits = 0;
+unsigned int force32Bits = 0;
 
 if(pointerAlignment)
-alignment = sizeof(void *);
+alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
 if(pointerAlignment && member->structAlignment <= 4)
 member->pointerAlignment = 1;
 else if(!pointerAlignment && alignment >= 8)
@@ -3238,12 +3244,14 @@ size = 16;
 }
 }
 if(pointerAlignment)
-alignment = sizeof(void *);
+alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
 if(pointerAlignment && _class->structAlignment <= 4)
 _class->pointerAlignment = 1;
 else if(!pointerAlignment && alignment >= 8)
 _class->pointerAlignment = 0;
 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
+if(_class->offset % alignment)
+_class->offset += alignment - (_class->offset % alignment);
 if(_class->memberOffset % alignment)
 _class->memberOffset += alignment - (_class->memberOffset % alignment);
 }
@@ -4004,6 +4012,7 @@ if(template->nameSpace)
 {
 struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
 
+if(link)
 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
 }
 __ecereNameSpace__ecere__com__FreeTemplateArgs(template);
@@ -4733,7 +4742,11 @@ dataTypeString = enumBase ? enumBase->dataTypeString : base->dataTypeString;
 offsetClass = base ? (base->templateClass ? base->templateClass->sizeClass : base->sizeClass) : (type == 5 ? 0 : 0);
 totalSizeClass = offsetClass + sizeClass;
 if(type == 0 || type == 5)
+{
 _class->offset = (base && (base->templateClass ? (type == 0 ? base->templateClass->structSize : base->templateClass->memberOffset) : (type == 0 ? base->structSize : base->memberOffset)) && base->type != 1000) ? (base->templateClass ? base->templateClass->structSize : base->structSize) : ((type == 5) ? 0 : sizeof(struct __ecereNameSpace__ecere__com__Instance));
+if(_class->structAlignment && (_class->offset % _class->structAlignment))
+_class->offset += _class->structAlignment - _class->offset % _class->structAlignment;
+}
 else
 _class->offset = 0;
 if(type == 1)
@@ -5016,6 +5029,21 @@ struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
 struct __ecereNameSpace__ecere__com__ClassProperty * classProp;
 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
+if(_class->templateClass)
+{
+struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
+
+for(templateLink = _class->templateClass->templatized.first; templateLink; templateLink = templateLink->next)
+{
+if(templateLink->data == _class)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateClass->templatized, templateLink);
+break;
+}
+}
+__ecereNameSpace__ecere__com__FreeTemplate(_class);
+return ;
+}
 (__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0);
 __ecereNameSpace__ecere__com__FreeTemplates(_class);
 __ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
@@ -6828,5 +6856,6 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8GetChar"
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8toUTF16Buffer", "int ecere::sys::UTF8toUTF16Buffer(const char * source, uint16 * dest, int max)", __ecereNameSpace__ecere__sys__UTF8toUTF16Buffer, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF32toUTF8Len", "int ecere::sys::UTF32toUTF8Len(const unichar * source, int count, char * dest, int max)", __ecereNameSpace__ecere__sys__UTF32toUTF8Len, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8toUTF16", "uint16 * ecere::sys::UTF8toUTF16(const char * source, int * wordCount)", __ecereNameSpace__ecere__sys__UTF8toUTF16, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::queryMemInfo", "void ecere::com::queryMemInfo(char * string)", __ecereNameSpace__ecere__com__queryMemInfo, module, 4);
 }
 
index 28aa627..df63f0f 100644 (file)
@@ -2078,8 +2078,12 @@ static void FixDerivativesBase(Class base, Class mod)
       // _class.memberID = _class.startMemberID = (base && (type == normalClass || type == noHeadClass || type == structClass)) ? base.memberID : 0;
 
       if(type == normalClass || type == noHeadClass)
+      {
          // Use 'memberOffset' for nohead class as the members get added without padding
          _class.offset = (base && (base.templateClass ? (type == normalClass ? base.templateClass.structSize : base.templateClass.memberOffset) : (type == normalClass ? base.structSize : base.memberOffset)) && base.type != systemClass) ? (base.templateClass ? base.templateClass.structSize : base.structSize) : ((type == noHeadClass) ? 0 : sizeof(class Instance));
+         if(_class.structAlignment && (_class.offset % _class.structAlignment))
+            _class.offset += _class.structAlignment - _class.offset % _class.structAlignment;
+      }
       else
          _class.offset = 0; // Force set to 0
 
@@ -5241,7 +5245,7 @@ public dllexport DataMember eClass_AddDataMember(Class _class, const char * name
                }
             }
 
-            if(pointerAlignment) alignment = sizeof(void *);
+            if(pointerAlignment) alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
 
             if(pointerAlignment && _class.structAlignment <= 4)
                _class.pointerAlignment = 1;
@@ -5250,6 +5254,8 @@ public dllexport DataMember eClass_AddDataMember(Class _class, const char * name
 
             _class.structAlignment = Max(_class.structAlignment, alignment);
 
+            if(_class.offset % alignment)
+               _class.offset += alignment - (_class.offset % alignment);
             if(_class.memberOffset % alignment)
                _class.memberOffset += alignment - (_class.memberOffset % alignment);
          }
@@ -5283,7 +5289,9 @@ public dllexport DataMember eMember_AddDataMember(DataMember member, const char
       if(alignment)
       {
          bool pointerAlignment = alignment == 0xF000F000;
-         if(pointerAlignment) alignment = sizeof(void *);
+         bool force64Bits = false; //(member._class.module.application.isGUIApp & 2) ? true : false;
+         bool force32Bits = false; //(member._class.module.application.isGUIApp & 4) ? true : false;
+         if(pointerAlignment) alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
 
          if(pointerAlignment && member.structAlignment <= 4)
             member.pointerAlignment = 1;
index a9357b8..1aba78c 100644 (file)
@@ -598,7 +598,7 @@ private:
    FovDirection fovDirection;
    Object cameraObject;
    Object target;
-   Vector3D position;
+   public Vector3D position;
    Quaternion orientation;
    Euler eulerOrientation;
    float aspectRatio;
index 56c5103..3ab47ae 100644 (file)
@@ -1513,7 +1513,8 @@ private:
    unsigned startFrame, endFrame;
    int frame;
    Vector3Df pivot;
-   Transform transform;
+
+   public Transform transform;
    Matrix matrix;
    Matrix localMatrix;
    void * tag;
index 4c06cf0..fe7b6a6 100644 (file)
@@ -109,9 +109,10 @@ namespace gfx::drivers;
 
 #if defined(__EMSCRIPTEN__)
 #define EM_MODE
+// #define _GLES
 #endif
 
-#define EM_MODE
+//#define EM_MODE
 
 #undef pointer
 
@@ -3625,7 +3626,6 @@ class OpenGLDisplayDriver : DisplayDriver
             position[1] = direction.y;
             position[2] = direction.z;
 
-            PrintLn("position");
             glLightfv(GL_LIGHT0 + id, GL_POSITION, position);
          }
       }
@@ -3706,10 +3706,10 @@ class OpenGLDisplayDriver : DisplayDriver
          // ...
 
          glEnable(GL_DEPTH_TEST);
-#if !defined(EM_MODE)
+//#if !defined(EM_MODE)
          glEnable(GL_LIGHTING);
          glShadeModel(GL_SMOOTH);
-#endif
+//#endif
          glDepthMask((byte)bool::true);
          oglDisplay.depthWrite = true;
 
@@ -3725,9 +3725,9 @@ class OpenGLDisplayDriver : DisplayDriver
          glDisable(GL_LIGHTING);
          glDisable(GL_FOG);
          glDisable(GL_TEXTURE_2D);
-#if !defined(EM_MODE)
+//#if !defined(EM_MODE)
          glShadeModel(GL_FLAT);
-#endif
+//#endif
          glEnable(GL_BLEND);
          glDisable(GL_MULTISAMPLE_ARB);
 
index 6ddf5d3..f71264f 100644 (file)
@@ -38,7 +38,7 @@ public:
 
 private:
    Timer prev, next;
-   Seconds delay;
+   public Seconds delay;
    Time lastTime;
    Window window;
    bool dispatched;
index d9ce74a..ba0a39c 100644 (file)
@@ -4508,7 +4508,7 @@ private:
    int rowCount;
    int rowHeight;
    int fontH;
-   double typingTimeOut;
+   public double typingTimeOut;
    char * typedString;
 
    int mouseX, mouseY;