ecere/com, compiler/libec: Changed type of base normal class (Instance) to 'normal...
authorJerome St-Louis <jerome@ecere.com>
Sun, 5 May 2013 20:14:09 +0000 (16:14 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sun, 5 May 2013 20:14:09 +0000 (16:14 -0400)
compiler/bootstrap/ecere/bootstrap/instance.c
compiler/bootstrap/libec/bootstrap/pass15.c
compiler/bootstrap/libec/bootstrap/pass2.c
compiler/bootstrap/libec/bootstrap/pass3.c
compiler/libec/src/pass15.ec
compiler/libec/src/pass2.ec
compiler/libec/src/pass3.ec
ecere/src/com/instance.ec

index aca1937..009d0bd 100644 (file)
@@ -1534,7 +1534,7 @@ if(base && (type == 0 || type == 5 || type == 1) && (base->type == 3 || base->ty
 {
 type = base->type;
 }
-if(!base || base->type == 1000)
+if(!base || base->type == 1000 || (base->type == 0 && base->base && !base->base->base))
 {
 if(type == 4)
 {
@@ -3138,7 +3138,7 @@ else
 {
 for(; _class && from; _class = _class->base)
 {
-if(_class == from || _class->templateClass == from || (_class->type == 1000 && from->name && !strcmp(_class->name, from->name)))
+if(_class == from || _class->templateClass == from || ((_class->type == 1000 || (_class->type == 0 && _class->base && !_class->base->base)) && from->name && !strcmp(_class->name, from->name)))
 return 0x1;
 }
 }
@@ -3740,7 +3740,7 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete((&*watchers), watcher
 }
 }
 base = _class->base;
-if(base && base->type == 1000)
+if(base && (base->type == 1000 || (base->type == 0 && base->base && !base->base->base)))
 base = (((void *)0));
 if(_class->Destructor)
 _class->Destructor(instance);
@@ -5067,7 +5067,7 @@ break;
 }
 }
 base = _class->base;
-if(base && base->type == 1000)
+if(base && (base->type == 1000 || (base->type == 0 && base->base && !base->base->base)))
 base = (((void *)0));
 }
 }
@@ -5199,7 +5199,7 @@ baseClass->typeSize = 0;
 {
 struct __ecereNameSpace__ecere__com__Class * instanceClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Instance", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
 
-instanceClass->type = 1000;
+instanceClass->type = 0;
 instanceClass->fixed = 0x1;
 instanceClass->memberOffset = 0;
 instanceClass->offset = 0;
index e33e0b7..08cfbc1 100644 (file)
@@ -12269,7 +12269,7 @@ type->byReference = backupByReference;
 thisExp->prev = (((void *)0));
 thisExp->next = (((void *)0));
 __ecereMethod_Expression_Clear(e);
-if((type->kind == 8 && type->_class && type->_class->registered && strcmp(type->_class->registered->fullName, "ecere::com::Instance") && (type->_class->registered->type == 1000 || type->_class->registered->type == 2 || type->_class->registered->type == 4 || type->_class->registered->type == 3)) || (type->kind != 13 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13)))
+if((type->kind == 8 && type->_class && type->_class->registered && (type->_class->registered->type == 1000 || type->_class->registered->type == 2 || type->_class->registered->type == 4 || type->_class->registered->type == 3)) || (type->kind != 13 && type->kind != 22 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13)))
 {
 e->type = 4;
 e->op.op = '*';
index 5cc7df4..07f4d31 100644 (file)
@@ -1159,7 +1159,7 @@ if(type->kind == 8)
 {
 struct __ecereNameSpace__ecere__com__Class * _class = type->_class ? type->_class->registered : (((void *)0));
 
-if(_class && (_class->type == 1 || _class->type == 5 || (_class->type == 1000 && _class->base && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr") && strcmp(_class->fullName, "uintsize") && strcmp(_class->fullName, "intsize") && strcmp(_class->fullName, "ecere::com::Instance") && strcmp(_class->fullName, "ecere::com::Class") && strcmp(_class->dataTypeString, "char *"))))
+if(_class && (_class->type == 1 || _class->type == 5 || (_class->type == 1000 && _class->base && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr") && strcmp(_class->fullName, "uintsize") && strcmp(_class->fullName, "intsize"))))
 {
 if(wantReference != (e->byReference || isPointer))
 {
@@ -2159,7 +2159,7 @@ exp->list = MkList();
 object->usage = (object->usage & ~0x80) | (((unsigned int)0x1) << 7);
 ProcessExpression(object);
 ListAdd(args, object);
-if(exp->expType && exp->expType->kind == 8 && exp->expType->_class && exp->expType->_class->registered && ((exp->expType->_class->registered->type == 0 && !__ecereNameSpace__ecere__com__eClass_IsDerived(exp->expType->_class->registered, __ecereNameSpace__ecere__com__eSystem_FindClass(exp->expType->_class->registered->module, "char *"))) || (exp->expType->_class->registered->type == 1000 && !strcmp(exp->expType->_class->string, "ecere::com::Instance"))))
+if(exp->expType && exp->expType->kind == 8 && exp->expType->_class && exp->expType->_class->registered && exp->expType->_class->registered->type == 0 && strcmp(exp->expType->_class->registered->dataTypeString, "char *"))
 {
 struct Expression * decRefExp = MkExpCall(QMkExpId("ecere::com::eInstance_DecRef"), args);
 
index 8ce71c2..c8fbee4 100644 (file)
@@ -1134,7 +1134,7 @@ spec->addNameSpace = 0x0;
 }
 else if(_class)
 {
-if((_class->type != 1000 || !strcmp(_class->fullName, "enum") || !strcmp(_class->fullName, "ecere::com::Instance") || (_class->dataTypeString && !strcmp(_class->dataTypeString, "char *")) || !strcmp(_class->fullName, "uint64") || !strcmp(_class->fullName, "uint32") || !strcmp(_class->fullName, "uint16") || !strcmp(_class->fullName, "uintptr") || !strcmp(_class->fullName, "intptr") || !strcmp(_class->fullName, "uintsize") || !strcmp(_class->fullName, "intsize") || !strcmp(_class->fullName, "uint") || !strcmp(_class->fullName, "byte")))
+if((_class->type != 1000 || !strcmp(_class->fullName, "enum") || (_class->dataTypeString && !strcmp(_class->dataTypeString, "char *")) || !strcmp(_class->fullName, "uint64") || !strcmp(_class->fullName, "uint32") || !strcmp(_class->fullName, "uint16") || !strcmp(_class->fullName, "uintptr") || !strcmp(_class->fullName, "intptr") || !strcmp(_class->fullName, "uintsize") || !strcmp(_class->fullName, "intsize") || !strcmp(_class->fullName, "uint") || !strcmp(_class->fullName, "byte")))
 {
 (__ecereNameSpace__ecere__com__eSystem_Delete(spec->name), spec->name = 0);
 if(_class->dataTypeString)
@@ -1182,7 +1182,7 @@ spec->addNameSpace = 0x0;
 }
 if(_class && _class->dataTypeString && !strcmp(_class->dataTypeString, "char *"))
 return 0x1;
-if(!_class || _class->type == 0 || _class->type == 5 || !strcmp(_class->fullName, "ecere::com::Instance"))
+if(!_class || _class->type == 0 || _class->type == 5)
 return 0x1;
 else if(param && _class->type == 1)
 return (unsigned int)2;
@@ -1428,7 +1428,7 @@ else
 {
 struct Symbol * classSym = (spec->type == 1) ? spec->symbol : (((void *)0));
 
-if(type->classObjectType && (!classSym || (classSym && classSym->registered && (classSym->registered->type == 4 || classSym->registered->type == 2 || classSym->registered->type == 3 || (classSym->registered->type == 1000 && strcmp(classSym->string, "ecere::com::Instance") && strcmp(classSym->string, "ecere::com::Class"))))))
+if(type->classObjectType && (!classSym || (classSym && classSym->registered && (classSym->registered->type == 4 || classSym->registered->type == 2 || classSym->registered->type == 3))))
 ReplaceByInstancePtr(spec, &type->declarator, 2);
 }
 InstDeclPassSpecifier(spec);
index 76fff00..04e4faf 100644 (file)
@@ -7170,7 +7170,7 @@ void ApplyAnyObjectLogic(Expression e)
          thisExp.next = null;
          e.Clear();
 
-         if( ( type.kind == classType && type._class && type._class.registered && strcmp(type._class.registered.fullName, "ecere::com::Instance") &&
+         if( ( type.kind == classType && type._class && type._class.registered && 
                    (type._class.registered.type == systemClass || type._class.registered.type == bitClass || 
                     type._class.registered.type == enumClass || type._class.registered.type == unitClass) ) ||
              (type.kind != pointerType && type.kind != arrayType && type.kind != classType) ||
index 03e35b6..b6064a1 100644 (file)
@@ -101,10 +101,7 @@ static Expression FixReference(Expression e, bool wantReference)
            strcmp(_class.fullName, "uintptr") && 
            strcmp(_class.fullName, "intptr") && 
            strcmp(_class.fullName, "uintsize") && 
-           strcmp(_class.fullName, "intsize") && 
-           strcmp(_class.fullName, "ecere::com::Instance") && 
-           strcmp(_class.fullName, "ecere::com::Class") && 
-           strcmp(_class.dataTypeString, "char *"))))
+           strcmp(_class.fullName, "intsize"))))
          {
             // if(wantReference != ((_class.type == systemClass) ? false : e.byReference))
             if(wantReference != (e.byReference || isPointer))
@@ -979,10 +976,8 @@ static void ProcessExpression(Expression exp)
             // TOFIX: Same time as when we fix for = 0
 
             if(exp.expType && exp.expType.kind == classType && exp.expType._class && exp.expType._class.registered && 
-               ((exp.expType._class.registered.type == normalClass && 
-                  // TODO: Improve on this, only fixed this issue here... Different String class defined in each module
-                  !eClass_IsDerived(exp.expType._class.registered, eSystem_FindClass(exp.expType._class.registered.module, "char *")) /*strcmp(exp.expType._class.string, "String")*/) ||
-                (exp.expType._class.registered.type == systemClass && !strcmp(exp.expType._class.string, "ecere::com::Instance"))))
+               exp.expType._class.registered.type == normalClass &&
+               strcmp(exp.expType._class.registered.dataTypeString, "char *"))
             {
                Expression decRefExp = MkExpCall(QMkExpId("ecere::com::eInstance_DecRef"), args);
                ProcessExpressionType(decRefExp);
index ea27472..e834794 100644 (file)
@@ -113,7 +113,6 @@ static bool ReplaceClassSpec(OldList specs, Specifier spec, bool param)
          {
             if((_class.type != systemClass ||
                !strcmp(_class.fullName, "enum") ||
-               !strcmp(_class.fullName, "ecere::com::Instance") ||
                (_class.dataTypeString && !strcmp(_class.dataTypeString, "char *")) ||
                //strcmp(_class.fullName, "bool") &&
                !strcmp(_class.fullName, "uint64") ||
@@ -182,7 +181,7 @@ static bool ReplaceClassSpec(OldList specs, Specifier spec, bool param)
 
          if(_class && _class.dataTypeString && !strcmp(_class.dataTypeString, "char *"))
             return true; //false;
-         if(!_class || _class.type == normalClass || _class.type == noHeadClass || !strcmp(_class.fullName, "ecere::com::Instance"))
+         if(!_class || _class.type == normalClass || _class.type == noHeadClass)
             return true;
          else if(param && _class.type == structClass)
             return 2;
@@ -404,8 +403,7 @@ static void InstDeclPassDeclarator(Declarator decl)
          {
             Symbol classSym = (spec.type == nameSpecifier) ? spec.symbol /*FindClass(spec.name)*/ : null;
             if(type.classObjectType && (!classSym || (classSym && classSym.registered && 
-               (classSym.registered.type == enumClass || classSym.registered.type == bitClass || classSym.registered.type == unitClass || 
-               (classSym.registered.type == systemClass && strcmp(classSym.string, "ecere::com::Instance") && strcmp(classSym.string, "ecere::com::Class"))))))
+               (classSym.registered.type == enumClass || classSym.registered.type == bitClass || classSym.registered.type == unitClass))))
                ReplaceByInstancePtr(spec, &type.declarator, 2);
          }
          InstDeclPassSpecifier(spec);
index f9ef335..fc595a9 100644 (file)
@@ -2280,7 +2280,7 @@ public dllexport Class eSystem_RegisterClass(ClassType type, char * name, char *
       {
          type = base.type;
       }
-      if(!base || base.type == systemClass)
+      if(!base || base.type == systemClass || (base.type == normalClass && base.base && !base.base.base))
       {
          if(type == enumClass)
          {
@@ -3926,7 +3926,7 @@ 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.base && !_class.base.base)) && from.name && !strcmp(_class.name, from.name)))
             return true;
       }
    }
@@ -4587,7 +4587,7 @@ public dllexport void eInstance_Delete(Instance instance)
          
 
          base = _class.base;
-         if(base && base.type == systemClass) base = null;
+         if(base && (base.type == systemClass || (base.type == normalClass && base.base && !base.base.base))) base = null;
          if(_class.Destructor)
             _class.Destructor(instance);
 #ifdef MEMINFO
@@ -5921,7 +5921,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.type == normalClass && base.base && !base.base.base))) base = null;
          }
       }
    }
@@ -5971,7 +5971,7 @@ 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.fixed = true;
       instanceClass.memberOffset = 0;
       instanceClass.offset = 0;