compiler/libec: Improvements to struct and class:struct casts
authorJerome St-Louis <jerome@ecere.com>
Thu, 5 Jun 2014 18:07:21 +0000 (14:07 -0400)
committerJerome St-Louis <jerome@ecere.com>
Thu, 5 Jun 2014 18:14:29 +0000 (14:14 -0400)
- Improvements to 09957697964db4ebc39fd1363f2e8dffa47dcf38
- Was missing a cast in ast.ec
- Avoiding unneeded casts

compiler/bootstrap/ecere/bootstrap/i18n.c
compiler/bootstrap/ecs/bootstrap/ecs.c
compiler/bootstrap/libec/bootstrap/ast.c
compiler/bootstrap/libec/bootstrap/loadSymbols.c
compiler/bootstrap/libec/bootstrap/pass15.c
compiler/bootstrap/libec/bootstrap/pass3.c
compiler/libec/src/ecdefs.ec
compiler/libec/src/pass15.ec
compiler/libec/src/pass3.ec

index d5f5d84..cc7d4f4 100644 (file)
@@ -516,7 +516,7 @@ hashingOffset = ((((hashingOffset) & 0x000000ff) << 24) | (((hashingOffset) & 0x
 if(!__ecereNameSpace__ecere__moduleMaps)
 __ecereNameSpace__ecere__moduleMaps = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__Map_TPL_String__ecere__com__Map_TPL_String__const_String___);
 {
-struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map((void *)&it, __ecereNameSpace__ecere__moduleMaps), it);
+struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&it, __ecereNameSpace__ecere__moduleMaps), it);
 
 if(__ecereMethod___ecereNameSpace__ecere__com__Iterator_Index((void *)&it, (uint64)(name), 0x0))
 (__ecereNameSpace__ecere__com__eInstance_DecRef(((void * )(__ecereProp___ecereNameSpace__ecere__com__Iterator_Get_data((void *)&it)))), __ecereProp___ecereNameSpace__ecere__com__Iterator_Set_data((void *)&it, 0));
@@ -597,7 +597,7 @@ __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpa
 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, translated, 1, len + 1);
 if(len)
 {
-struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map((void *)&it, textMap), it);
+struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&it, textMap), it);
 
 if(__ecereMethod___ecereNameSpace__ecere__com__Iterator_Index((void *)&it, (uint64)(original), 0x0))
 (__ecereNameSpace__ecere__com__eSystem_Delete(translated), translated = 0);
@@ -633,7 +633,7 @@ int __ecereVMethodID___ecereNameSpace__ecere__com__Container_Delete;
 
 void __ecereNameSpace__ecere__UnloadTranslatedStrings(const char * name)
 {
-struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map((void *)&it, __ecereNameSpace__ecere__moduleMaps), it);
+struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&it, __ecereNameSpace__ecere__moduleMaps), it);
 
 if(__ecereMethod___ecereNameSpace__ecere__com__Iterator_Index((void *)&it, (uint64)(name), 0x0))
 {
index 808151d..a7da8bc 100644 (file)
@@ -2679,7 +2679,7 @@ SetMainModule(mainModule);
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_imports, mainModule);
 {
 struct __ecereNameSpace__ecere__com__Instance * intlStrings = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__Map_TPL_ContextStringPair__ecere__com__List_TPL_String___);
-struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map((void *)&it, intlStrings), it);
+struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&it, intlStrings), it);
 
 for(c = 1; c < ((struct __ecereNameSpace__ecere__com__Application *)(((char *)this + structSize_Module)))->argc; c++)
 {
@@ -2999,11 +2999,11 @@ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = potFile;
 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Puts])(potFile, "\n");
 {
-struct __ecereNameSpace__ecere__com__MapIterator i = (i.container = (void *)0, i.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map((void *)&i, (intlStrings)), i);
+struct __ecereNameSpace__ecere__com__MapIterator i = (i.container = (void *)0, i.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&i, (intlStrings)), i);
 
 while(__ecereMethod___ecereNameSpace__ecere__com__Iterator_Next((void *)&i))
 {
-struct ContextStringPair pair = (*(struct ContextStringPair *)__ecereProp___ecereNameSpace__ecere__com__MapIterator_Get_key((void *)&i));
+struct ContextStringPair pair = (*(struct ContextStringPair *)__ecereProp___ecereNameSpace__ecere__com__MapIterator_Get_key(&i));
 struct __ecereNameSpace__ecere__com__Instance * comments = ((struct __ecereNameSpace__ecere__com__Instance *)__ecereProp___ecereNameSpace__ecere__com__Iterator_Get_data((void *)&i));
 
 {
index a19127c..89a9c6b 100644 (file)
@@ -3571,7 +3571,7 @@ if(baseClass && baseClass->ctx)
 {
 struct TemplatedType * copy;
 
-for(copy = (struct TemplatedType *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&baseClass->ctx->templateTypes); copy; copy = (struct TemplatedType *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(copy))
+for(copy = (struct TemplatedType *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&baseClass->ctx->templateTypes); copy; copy = (struct TemplatedType *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next((void *)copy))
 {
 struct TemplatedType * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), type->key = copy->key, type->param = copy->param, type);
 
@@ -4914,11 +4914,11 @@ if(!(srcFile[0] && (srcFile[1] == ':' || srcFile[0] == '/')))
 filePrefix = "./";
 __ecereNameSpace__ecere__sys__GetSlashPathBuffer(srcFileFixed, srcFile);
 {
-struct __ecereNameSpace__ecere__com__MapIterator s = (s.container = (void *)0, s.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map((void *)&s, (intlStrings)), s);
+struct __ecereNameSpace__ecere__com__MapIterator s = (s.container = (void *)0, s.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&s, (intlStrings)), s);
 
 while(__ecereMethod___ecereNameSpace__ecere__com__Iterator_Next((void *)&s))
 {
-struct ContextStringPair pair = (*(struct ContextStringPair *)__ecereProp___ecereNameSpace__ecere__com__MapIterator_Get_key((void *)&s));
+struct ContextStringPair pair = (*(struct ContextStringPair *)__ecereProp___ecereNameSpace__ecere__com__MapIterator_Get_key(&s));
 
 {
 struct __ecereNameSpace__ecere__com__Iterator l =
index 25f64b3..bdb16d3 100644 (file)
@@ -1787,7 +1787,7 @@ if(!inCompiler && !inPreCompiler && !inSymbolGen)
 {
 struct __ecereNameSpace__ecere__com__MapIterator it = (it.container = (void *)0, it.pointer = (void *)0, __ecereProp___ecereNameSpace__ecere__com__MapIterator_Set_map(&it, loadedModules), it);
 
-if(!__ecereMethod___ecereNameSpace__ecere__com__Iterator_Index(&it, (uint64)(name), 0x0))
+if(!__ecereMethod___ecereNameSpace__ecere__com__Iterator_Index((void *)&it, (uint64)(name), 0x0))
 {
 struct __ecereNameSpace__ecere__com__Instance * firstModule = __ecereNameSpace__ecere__com__eModule_LoadStrict(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application, name, importAccess);
 
@@ -1813,7 +1813,7 @@ else
 skipLoad = 0x1;
 }
 else
-list = ((struct __ecereNameSpace__ecere__com__Instance *)__ecereProp___ecereNameSpace__ecere__com__Iterator_Get_data(&it));
+list = ((struct __ecereNameSpace__ecere__com__Instance *)__ecereProp___ecereNameSpace__ecere__com__Iterator_Get_data((void *)&it));
 }
 if(!skipLoad)
 {
@@ -2005,7 +2005,7 @@ __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalDataList->n
 }
 for(; (data = (struct GlobalData *)globalDataList->functions.root); )
 {
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalDataList->functions, data);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalDataList->functions, (void *)data);
 if(data->symbol)
 FreeSymbol(data->symbol);
 FreeType(data->dataType);
index 8323fda..f2de856 100644 (file)
@@ -4585,6 +4585,8 @@ return __ecereNameSpace__ecere__sys__CopyString(_class->fullName);
 
 struct Type * ReplaceThisClassType(struct __ecereNameSpace__ecere__com__Class * _class)
 {
+struct Type * type;
+
 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
 {
 unsigned int first = 0x1;
@@ -4621,12 +4623,13 @@ className[len++] = ' ';
 className[len++] = '>';
 className[len++] = '\0';
 }
-return MkClassType(className);
+type = MkClassType(className);
 }
 else
 {
-return MkClassType(_class->fullName);
+type = MkClassType(_class->fullName);
 }
+return type;
 }
 
 void ReplaceThisClassSpecifiers(struct __ecereNameSpace__ecere__sys__OldList * specs, struct __ecereNameSpace__ecere__com__Class * _class)
@@ -16228,10 +16231,12 @@ revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _cl
 }
 if(!exp->__anon1.member.exp->destType)
 {
+if(method && !method->_class->symbol)
+method->_class->symbol = FindClass(method->_class->fullName);
 exp->__anon1.member.exp->destType = __extension__ ({
 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
 
-__ecereInstance1->refCount = 1, __ecereInstance1->kind = 8, __ecereInstance1->__anon1._class = _class->symbol, __ecereInstance1;
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 8, __ecereInstance1->__anon1._class = prop ? prop->_class->symbol : method ? method->_class->symbol : _class->symbol, __ecereInstance1;
 });
 }
 if(prop)
index ae73fbc..ea91f8d 100644 (file)
@@ -1634,7 +1634,7 @@ if(sc->templateClass)
 sc = sc->templateClass;
 if(dc->templateClass)
 dc = dc->templateClass;
-if(dc->base && (sc != dc || sc->base->type == 1))
+if(dc->base && sc != dc)
 {
 e->__anon1.cast.exp = CopyExpContents(e);
 e->type = 11;
index 5e6fa1f..2041214 100644 (file)
@@ -1313,6 +1313,7 @@ public:
    bool declaredWithStruct:1;
    bool typedByReference:1;      // Originally typed by reference, regardless of class type
    bool casted:1;
+   // bool wasThisClass:1;
    // TODO: Add _Complex & _Imaginary support
    // bool complex:1, imaginary:1;
 
index 05c7cc0..cc83ef0 100644 (file)
@@ -2729,6 +2729,7 @@ char * ReplaceThisClass(Class _class)
 
 Type ReplaceThisClassType(Class _class)
 {
+   Type type;
    if(thisClassParams && _class.templateParams.count && !_class.templateClass)
    {
       bool first = true;
@@ -2762,14 +2763,16 @@ Type ReplaceThisClassType(Class _class)
          className[len++] = '>';
          className[len++] = '\0';
       }
-      return MkClassType(className);
-      //return ProcessTypeString(className, false);
+      type = MkClassType(className);
+      //type = ProcessTypeString(className, false);
    }
    else
    {
-      return MkClassType(_class.fullName);
-      //return ProcessTypeString(_class.fullName, false);
+      type = MkClassType(_class.fullName);
+      //type = ProcessTypeString(_class.fullName, false);
    }
+   //type.wasThisClass = true;
+   return type;
 }
 
 void ReplaceThisClassSpecifiers(OldList specs, Class _class)
@@ -9492,6 +9495,13 @@ void ProcessExpressionType(Expression exp)
                      functionType = ProcessType(specs, decl);
                      functionType.refCount = 0;
                      FinishTemplatesContext(context);
+
+                     // Mark parameters that were 'thisclass'
+                     /*{
+                        Type p, op;
+                        for(p = functionType.params.first, op = methodType.method.dataType.params.first; p && op; p = p.next, op = op.next)
+                           p.wasThisClass = op.kind == thisClassType;
+                     }*/
                   }
 
                   FreeList(specs, FreeSpecifier);
@@ -10171,11 +10181,15 @@ void ProcessExpressionType(Expression exp)
 
                if(!exp.member.exp.destType)
                {
+                  if(method && !method._class.symbol)
+                     method._class.symbol = FindClass(method._class.fullName);
+
                   exp.member.exp.destType = Type
                   {
                      refCount = 1;
                      kind = classType;
-                     _class = _class.symbol;
+                     _class = prop ? prop._class.symbol : method ? method._class.symbol : _class.symbol;
+                     // wasThisClass = type ? type.wasThisClass : false;
                   };
                }
 
index 96fd4aa..9113722 100644 (file)
@@ -540,7 +540,7 @@ static void InstDeclPassExpression(Expression exp)
                                  Class dc = dest._class.registered;
                                  if(sc.templateClass) sc = sc.templateClass;
                                  if(dc.templateClass) dc = dc.templateClass;
-                                 if(dc.base && (sc != dc || sc.base.type == structClass))
+                                 if(dc.base && sc != dc)
                                  {
                                     e.cast.exp = CopyExpContents(e);
                                     e.type = castExp;