{
(*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));
{
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)
{
{
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)
}
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);
}
}
}
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);
}
case 8:
{
+if(exp->member.exp)
InstDeclPassExpression(exp->member.exp);
break;
}
case 9:
{
+if(exp->member.exp)
InstDeclPassExpression(exp->member.exp);
break;
}
{
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...
{
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;
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
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;
}
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:
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;