_class = eSystem_FindClass(privateModule, "String");
if(!_class) _class = eSystem_FindClass(privateModule, "int");
- if(!strcmp(_class.name, "class"))
+ if(_class.type == normalClass && destType.byReference == false && strcmp(_class.dataTypeString, "char *"))
{
- // Already inside a typed_object function, pass the class through
- strcpy(className, "class");
+ exp.call.arguments->Insert(e.prev, MkExpPointer(CopyExpression(e), MkIdentifier("_class")));
}
else
{
- strcpy(className, "__ecereClass_");
- FullClassNameCat(className, _class.fullName, true);
- MangleClassName(className);
+ if(!strcmp(_class.name, "class"))
+ {
+ // Already inside a typed_object function, pass the class through
+ strcpy(className, "class");
+ }
+ else
+ {
+ strcpy(className, "__ecereClass_");
+ FullClassNameCat(className, _class.fullName, true);
+ MangleClassName(className);
- if(!_class.symbol)
- _class.symbol = FindClass(_class.fullName);
+ if(!_class.symbol)
+ _class.symbol = FindClass(_class.fullName);
- DeclareClass(_class.symbol, className);
+ DeclareClass(_class.symbol, className);
+ }
+ exp.call.arguments->Insert(e.prev, MkExpIdentifier(MkIdentifier(className)));
}
- exp.call.arguments->Insert(e.prev, MkExpIdentifier(MkIdentifier(className)));
}
}
}
{
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;
{
char className[1024];
char * string = StringFromSpecDecl(exp._classExp.specifiers, exp._classExp.decl);
+ Symbol classSym = FindClass(string);
strcpy(className, "__ecereClass_");
FullClassNameCat(className, string, true); // TODO: Verify this
MangleClassName(className);
- DeclareClass(FindClass(string), className);
+ DeclareClass(classSym, className);
delete string;
FreeList(exp._classExp.specifiers, FreeSpecifier);