if(src && src.kind == classType && src._class)
{
Class sc = src._class.registered;
+ if(src.thisClassFrom)
+ sc = src.thisClassFrom;
+
if(sc && (sc.type == structClass || sc.type == noHeadClass))
{
Type dest = e.destType;
+
if(dest && (dest.kind == templateType || dest.kind == classType))
{
if(dest) dest.refCount++;
if(!dest.passAsTemplate && dest.kind == classType && dest._class && dest._class.registered)
{
Class dc = dest._class.registered;
+
if(sc.templateClass) sc = sc.templateClass;
if(dc.templateClass) dc = dc.templateClass;
if(dc.base && sc != dc)
FreeType(src);
}
}
+ else if(src && src.kind == intPtrType && e.destType && e.destType.classObjectType)
+ {
+ Expression nbExp = GetNonBracketsExp(e);
+ if(nbExp.type != castExp || !IsVoidPtrCast(nbExp.cast.typeName))
+ {
+ e.cast.exp = MkExpBrackets(MkListOne(MoveExpContents(e)));
+ e.type = castExp;
+ e.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), QMkPtrDecl(null));
+ }
+ }
}
static void InstDeclPassExpression(Expression exp)
{
for(e = exp.call.arguments->first; e; e = e.next)
{
+ bool addCast = false;
InstDeclPassExpression(e);
AddPointerCast(e);
if(e.expType && e.expType.kind == pointerType && e.expType.type && (e.expType.type.kind == classType || (e.expType.type.kind == pointerType && e.expType.type.type && e.expType.type.type.kind != voidType)) &&
- e.destType && e.destType.kind == pointerType && e.destType.type && e.destType.type.kind == pointerType && e.destType.type.type && e.destType.type.type.kind == voidType &&
- (e.type != castExp || !IsVoidPtrCast(e.cast.typeName)))
+ e.destType && e.destType.kind == pointerType && e.destType.type && e.destType.type.kind == pointerType && e.destType.type.type && e.destType.type.type.kind == voidType)
+ addCast = true;
+ // Fix for adding a cast to Unserialize with a struct passed as a parameter:
+ else if(e.expType && e.expType.kind == classType && e.expType._class && e.expType._class.registered && e.expType._class.registered.type == structClass && e.byReference &&
+ e.destType && e.destType.kind == classType && e.destType.classObjectType && e.destType.byReference)
+ addCast = true;
+
+ if(addCast && (e.type != castExp || !IsVoidPtrCast(e.cast.typeName)))
{
e.cast.exp = MkExpBrackets(MkListOne(MoveExpContents(e)));
e.type = castExp;