compiler/libec: (#1011) Fixed wrong handling of 'this' object with cast/brackets
authorJerome St-Louis <jerome@ecere.com>
Mon, 30 Sep 2013 05:24:28 +0000 (01:24 -0400)
committerJerome St-Louis <jerome@ecere.com>
Mon, 30 Sep 2013 05:59:29 +0000 (01:59 -0400)
- Solved 1/2 MedDB sample crashes
- Extra brackets was causing different behaviors in BTNode.ec
- Updated bootstrap

compiler/bootstrap/ecere/bootstrap/BTNode.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/BTNode.ec

index e692cb7..9841ed3 100644 (file)
@@ -1055,7 +1055,7 @@ if((*this)->right)
 {
 (*this)->right->parent = *(struct __ecereNameSpace__ecere__sys__StringBTNode **)this;
 }
-(*this)->depth = __ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_depthProp(((struct __ecereNameSpace__ecere__sys__BTNode *)*(struct __ecereNameSpace__ecere__sys__StringBTNode **)(*(struct __ecereNameSpace__ecere__sys__StringBTNode **)this)));
+(*this)->depth = __ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_depthProp(((struct __ecereNameSpace__ecere__sys__BTNode *)*(struct __ecereNameSpace__ecere__sys__StringBTNode **)this));
 }
 else
 (*this) = (((void *)0));
index 72b0be0..f556515 100644 (file)
@@ -13915,8 +13915,19 @@ case 8:
 {
 struct Type * type;
 struct Location oldyylloc = yylloc;
-unsigned int thisPtr = (exp->member.exp && exp->member.exp->type == 0 && !strcmp(exp->member.exp->identifier->string, "this"));
+unsigned int thisPtr;
+struct Expression * checkExp = exp->member.exp;
 
+while(checkExp)
+{
+if(checkExp->type == 11)
+checkExp = checkExp->cast.exp;
+else if(checkExp->type == 5)
+checkExp = checkExp->list ? (*checkExp->list).first : (((void *)0));
+else
+break;
+}
+thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->identifier->string, "this"));
 exp->thisPtr = thisPtr;
 if(exp->member.member && exp->member.member->_class && exp->member.member->_class->name)
 {
index fe757e7..a05ef1c 100644 (file)
@@ -3018,7 +3018,7 @@ case 8:
 {
 unsigned int changeToPtr = 0x0;
 unsigned int noHead = 0x0;
-struct Type * type = exp->member.exp->expType;
+struct Type * type = exp->member.exp ? exp->member.exp->expType : (((void *)0));
 struct Specifier * memberClassSpecifier = exp->member.member ? exp->member.member->_class : (((void *)0));
 
 if(exp->member.member)
@@ -3345,12 +3345,13 @@ else if(_class->type == 3)
 }
 else
 {
-if(thisPtr)
+if(exp->member.exp->type == 0 && thisPtr && (!exp->member.exp->expType || !exp->member.exp->expType->typedByReference))
 {
 char pointerName[1024];
 
 strcpy(pointerName, "__ecerePointer_");
 FullClassNameCat(pointerName, type->_class->registered->fullName, 0x0);
+if(exp->member.exp->identifier)
 FreeIdentifier(exp->member.exp->identifier);
 exp->member.exp->identifier = MkIdentifier(pointerName);
 }
@@ -3441,7 +3442,7 @@ exp->type = 9;
 }
 }
 FreeSpecifier(memberClassSpecifier);
-if(exp->type == 8 || exp->type == 9)
+if(exp->member.exp && (exp->type == 8 || exp->type == 9))
 {
 exp->member.exp->usage = (exp->member.exp->usage & ~0x1) | (((unsigned int)0x1) << 0);
 exp->member.exp->usage = (exp->member.exp->usage & ~0x10) | (((unsigned int)0x1) << 4);
index 7baea4f..0b660ef 100644 (file)
@@ -1531,11 +1531,13 @@ break;
 }
 case 8:
 {
+if(exp->member.exp)
 InstDeclPassExpression(exp->member.exp);
 break;
 }
 case 9:
 {
+if(exp->member.exp)
 InstDeclPassExpression(exp->member.exp);
 break;
 }
index 86602d2..0b78330 100644 (file)
@@ -9048,7 +9048,19 @@ void ProcessExpressionType(Expression exp)
       {
          Type type;
          Location oldyylloc = yylloc;
-         bool thisPtr = (exp.member.exp && exp.member.exp.type == identifierExp && !strcmp(exp.member.exp.identifier.string, "this"));
+         bool thisPtr;
+         Expression checkExp = exp.member.exp;
+         while(checkExp)
+         {
+            if(checkExp.type == castExp)
+               checkExp = checkExp.cast.exp;
+            else if(checkExp.type == bracketsExp)
+               checkExp = checkExp.list ? checkExp.list->first : null;
+            else
+               break;
+         }
+
+         thisPtr = (checkExp && checkExp.type == identifierExp && !strcmp(checkExp.identifier.string, "this"));
          exp.thisPtr = thisPtr;
 
          // DOING THIS LATER NOW...
index cca09c2..590fde2 100644 (file)
@@ -2219,7 +2219,7 @@ static void ProcessExpression(Expression exp)
       {
          bool changeToPtr = false;
          bool noHead = false;
-         Type type = exp.member.exp.expType;
+         Type type = exp.member.exp ? exp.member.exp.expType : null;
          Specifier memberClassSpecifier = exp.member.member ? exp.member.member._class : null;
          if(exp.member.member) exp.member.member._class = null;
 
@@ -2599,13 +2599,14 @@ static void ProcessExpression(Expression exp)
                else
                {
                   // If it's a this pointer, replace by precomputed shortcut
-                  if(thisPtr)
+                  if(exp.member.exp.type == identifierExp && thisPtr && (!exp.member.exp.expType || !exp.member.exp.expType.typedByReference))
                   {
                      char pointerName[1024];
 
                      strcpy(pointerName, "__ecerePointer_");
                      FullClassNameCat(pointerName, type._class.registered.fullName, false);
-                     FreeIdentifier(exp.member.exp.identifier);
+                     if(exp.member.exp.identifier)
+                        FreeIdentifier(exp.member.exp.identifier);
                      exp.member.exp.identifier = MkIdentifier(pointerName);
                   }
                   // Otherwise, access the data the hard way
@@ -2725,7 +2726,7 @@ static void ProcessExpression(Expression exp)
          FreeSpecifier(memberClassSpecifier);
 
          // Just moved this at the end... How is it?
-         if(exp.type == memberExp || exp.type == pointerExp)
+         if(exp.member.exp && (exp.type == memberExp || exp.type == pointerExp))
          {
             exp.member.exp.usage.usageGet = true;
             exp.member.exp.usage.usageMember = true;
index e834794..0aa7a8e 100644 (file)
@@ -485,12 +485,14 @@ static void InstDeclPassExpression(Expression exp)
       }
       case memberExp:
       {
-         InstDeclPassExpression(exp.member.exp);
+         if(exp.member.exp)
+            InstDeclPassExpression(exp.member.exp);
          break;
       }
       case pointerExp:
       {
-         InstDeclPassExpression(exp.member.exp);
+         if(exp.member.exp)
+            InstDeclPassExpression(exp.member.exp);
          break;
       }
       case typeSizeExp:
index abc247a..609bded 100644 (file)
@@ -697,8 +697,7 @@ public:
          channel.Unserialize(right);
          if(right) { right.parent = this; }
 
-         // TODO: Precomp errors without extra brackets
-         depth = ((BTNode)(this)).depthProp;
+         depth = ((BTNode)this).depthProp;
       }
       else
          this = null;