strcat(name, "_");
strcat(name, method.name);
- DeclareMethod(method, name);
+ DeclareMethod(curExternal, method, name);
// Cast function to its type
decl = SpecDeclFromString(method.dataTypeString, specs, MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer(null, null), null)));
// Need the class itself here...
strcpy(className, "__ecereClass_");
FullClassNameCat(className, _class.fullName, true);
- //MangleClassName(className);
if(!_class.symbol)
_class.symbol = FindClass(_class.fullName);
- DeclareClass(_class.symbol, className);
+ DeclareClass(curExternal, _class.symbol, className);
if(exp.identifier)
FreeIdentifier(exp.identifier);
exp.identifier._class = null;
exp.identifier.string = CopyString(name);
- DeclareMethod(method, name);
+ DeclareMethod(curExternal, method, name);
}
}
/*
switch(exp.type)
{
- case newExp: exp.call.exp = QMkExpId("ecere::com::eSystem_New"); break;
- case new0Exp: exp.call.exp = QMkExpId("ecere::com::eSystem_New0"); break;
- case renewExp: exp.call.exp = QMkExpId("ecere::com::eSystem_Renew"); break;
- case renew0Exp:exp.call.exp = QMkExpId("ecere::com::eSystem_Renew0"); break;
+ case newExp: exp.call.exp = QMkExpId("ecere::com::eSystem_New"); DeclareFunctionUtil(curExternal, "eSystem_New"); break;
+ case new0Exp: exp.call.exp = QMkExpId("ecere::com::eSystem_New0"); DeclareFunctionUtil(curExternal, "eSystem_New0"); break;
+ case renewExp: exp.call.exp = QMkExpId("ecere::com::eSystem_Renew"); DeclareFunctionUtil(curExternal, "eSystem_Renew"); break;
+ case renew0Exp:exp.call.exp = QMkExpId("ecere::com::eSystem_Renew0"); DeclareFunctionUtil(curExternal, "eSystem_Renew0"); break;
}
exp.call.arguments = args;
exp.type = callExp;
}
if(lastProperty && lastProperty.Get && lastProperty.Set)
{
- DeclareProperty(lastProperty, setName, getName);
+ DeclareProperty(curExternal, lastProperty, setName, getName);
// propertyClass = convertTo ? _class : ((Symbol)lastProperty.symbol)._class;
propertyClass = convertTo ? _class :
((((Symbol)lastProperty.symbol).type &&
if(value)
value.usage.usageArg = true;
- DeclareProperty(prop, setName, getName);
+ DeclareProperty(curExternal, prop, setName, getName);
if(memberExp.member.exp)
ProcessExpression(memberExp.member.exp);
strcpy(className, "__ecereClass_");
FullClassNameCat(className, exp.expType._class.string, true);
- //MangleClassName(className);
DeclareClass(exp.expType._class, className);
OldList * list = MkList();
Class _class;
+ Statement stmt;
Expression o;
+ Statement compound = MkCompoundStmt(MkListOne(MkDeclaration(MkListOne(MkSpecifier(VOID)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer(null, null), MkDeclaratorIdentifier(MkIdentifier("__ecerePtrToDelete"))),
+ MkInitializerAssignment(MkExpBrackets(args)))))), MkListOne(stmt = MkExpressionStmt(list)));
+ Expression stmtExp = MkExpExtensionCompound(compound);
for(_class = exp.expType._class.registered; _class && _class.type == noHeadClass; _class = _class.base)
{
char className[1024];
if(_class.templateClass) _class = _class.templateClass;
strcpy(className, "__ecereClass_");
FullClassNameCat(className, _class.fullName, false /*true*/);
- //MangleClassName(className);
if(!_class.symbol)
_class.symbol = FindClass(_class.fullName);
- DeclareClass(_class.symbol, className);
+ DeclareClass(curExternal, _class.symbol, className);
// Call the non virtual destructor
ListAdd(list,
QMkExpId(className),
MkIdentifier("Destructor")
),
- MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), QMkPtrDecl(null)), CopyExpression(args->first)))
+ MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), QMkPtrDecl(null)), MkExpIdentifier(MkIdentifier("__ecerePtrToDelete")) /*CopyExpression(args->first)*/))
)
),
MkExpConstant("0")
)
);
}
- ListAdd(list, MkExpCall(QMkExpId("ecere::com::eSystem_Delete"), args));
+ ListAdd(list, MkExpCall(QMkExpId("ecere::com::eSystem_Delete"), MkListOne(MkExpIdentifier(MkIdentifier("__ecerePtrToDelete"))) /*args*/));
+ DeclareFunctionUtil(curExternal, "eSystem_Delete");
o = CopyExpression(object);
ProcessExpressionType(o);
o.usage.usageGet = true;
MkExpCondition(
o,
MkListOne(
- MkExpBrackets(list)
+ //MkExpBrackets(list)
+ stmtExp
),
MkExpConstant("0")
)
ProcessExpressionType(classExp);
ProcessExpression(classExp);
args->Insert(null, CopyExpression(classExp));
- DeclareMethod(eClass_FindMethod(eSystem_FindClass(privateModule, "class"), "OnFree", privateModule), "__ecereVMethodID_class_OnFree");
+ DeclareMethod(curExternal, eClass_FindMethod(eSystem_FindClass(privateModule, "class"), "OnFree", privateModule), "__ecereVMethodID_class_OnFree");
ListAdd(exp.list, MkExpCall(
MkExpBrackets(MkListOne(MkExpCast(typeName,
MkExpIndex(MkExpPointer(classExp, MkIdentifier("_vTbl")),
}
}
else
+ {
ListAdd(exp.list, MkExpCall(QMkExpId("ecere::com::eSystem_Delete"), args));
+ DeclareFunctionUtil(curExternal, "eSystem_Delete");
+ }
//ProcessExpression(object);
derefExp.index.exp = null;
FreeExpression(derefExp);
+ // BOOSTRAP FIX
derefExp = MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer(null, null), null)), indexExp), '+',
MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(indexExpIndex), '*', MkExpBrackets(MkListOne(CopyExpression(sizeExp)))))));
}
ProcessExpressionType(args->last);
ProcessExpression(args->last);
- DeclareFunctionUtil("memcpy");
+ DeclareFunctionUtil(curExternal, "memcpy");
exp.list = MkListOne(MkExpCall(MkExpIdentifier(MkIdentifier("memcpy")), args));
exp.type = bracketsExp;
strcat(name, "_");
strcat(name, method.name);
- DeclareMethod(method, name);
+ DeclareMethod(curExternal, method, name);
back = curContext;
// THIS SpecDeclFromString HERE SHOULD WORK WITH THE METHOD TEMPLATE PARAMETERS...
funcDecl.function.parameters->Insert(null, param);
// Testing this for any_object::
if(!method.dataType.extraParam)
+ {
funcDecl.function.parameters->Insert(null, MkTypeName(MkListOne(MkStructOrUnion(structSpecifier, MkIdentifier("__ecereNameSpace__ecere__com__Class"), null)), MkDeclaratorPointer(MkPointer(null,null), null)));
+ DeclareStruct(curExternal, "ecere::com::Class", false, true);
+ }
}
else
{
// Need the class itself here...
strcpy(className, "__ecereClass_");
FullClassNameCat(className, cl.fullName, true);
- //MangleClassName(className);
if(!cl.symbol)
cl.symbol = FindClass(cl.fullName);
- DeclareClass(cl.symbol, className);
+ DeclareClass(curExternal, cl.symbol, className);
}
if(type && type.kind == subClassType && !_class && !exp.call.exp.expType.methodClass && memberExp)
if(!memberExp)
FreeExpression(exp.call.exp);
exp.call.exp = MkExpIdentifier(MkIdentifier(name));
- DeclareMethod(method, name);
+ DeclareMethod(curExternal, method, name);
if(memberExp && memberExp.expType && method.dataType)
{
exp.call.exp.expType = method.dataType;
if(typedObject && memberExp.member.exp && memberExp.member.exp.expType)
{
bool changeReference = false;
+ bool stillAddReferenceOp = false;
Expression memberExpMemberExp = CopyExpression(memberExp.member.exp);
+ Type expType = memberExp.member.exp.expType;
+ Class c = expType.kind == classType && expType._class ? expType._class.registered : null;
// Patched so that class isn't considered SYSTEM...
if(argClass && (argClass.type == enumClass || argClass.type == unitClass || argClass.type == bitClass || argClass.type == systemClass) && strcmp(argClass.fullName, "class") &&
strcmp(argClass.fullName, "uintptr") && strcmp(argClass.fullName, "intptr"))
changeReference = true;
- if(!memberExp.member.exp.expType.classObjectType &&
- (((
- (memberExp.member.exp.expType.kind != pointerType &&
- (memberExp.member.exp.expType.kind != classType || !memberExp.member.exp.expType._class ||
- !memberExp.member.exp.expType._class.registered || memberExp.member.exp.expType._class.registered.type == structClass)))) ||
- method.dataType.byReference)) // ADDED THIS FOR OnGetDataFromString
+ if(!expType.classObjectType && ( ( (expType.kind != pointerType && (!c || c.type == structClass) ) ) || method.dataType.byReference) ) // ADDED THIS FOR OnGetDataFromString
+ {
+ if(c && (c.type == normalClass || c.type == noHeadClass))
+ stillAddReferenceOp = true;
changeReference = true;
- if(typedObject && memberExp.member.exp.expType.classObjectType && memberExp.member.exp.expType.byReference != method.dataType.byReference)
+ }
+ if(typedObject && expType.classObjectType && expType.byReference != method.dataType.byReference)
changeReference = true;
if(changeReference)
{
exp.call.arguments->Insert(null, memberExp.member.exp.op.exp2);
memberExp.member.exp.op.exp2 = null;
}
- else if(!memberExp.member.exp.byReference)
+ else if(!memberExp.member.exp.byReference || stillAddReferenceOp)
{
// TESTING THIS... REUSE THIS CODE?
Expression checkedExp = memberExp.member.exp;
if(!parentExp)
nullMemberExp = true;
- newExp = (typedObject && !memberExp.member.exp.expType.classObjectType) ? checkedExp : MkExpOp(null, '&', checkedExp);
+ if(typedObject && !expType.classObjectType && !stillAddReferenceOp)
+ newExp = checkedExp;
+ else
+ {
+ newExp = MkExpOp(null, '&', checkedExp);
+ newExp.byReference = true;
+ }
if(parentExp && (parentExp.type == bracketsExp || parentExp.type == extensionExpressionExp))
{
parentExp.list->Remove(checkedExp);
if(newExp.expType && newExp.expType.classObjectType)
parentExp.cast.typeName.declarator = MkDeclaratorPointer(MkPointer(null, null), parentExp.cast.typeName.declarator);
}
- if(typedObject && !memberExp.member.exp.expType.classObjectType)
+ if(typedObject && !expType.classObjectType)
{
Type destType { refCount = 1, kind = classType, classObjectType = ClassObjectType::anyObject };
FreeType((parentExp ? parentExp : newExp).expType);
// Need the class itself here...
strcpy(className, "__ecereClass_");
FullClassNameCat(className, cl.fullName, true);
- //MangleClassName(className);
if(!cl.symbol)
cl.symbol = FindClass(cl.fullName);
- DeclareClass(cl.symbol, className);
+ DeclareClass(curExternal, cl.symbol, className);
}
if(className[0])
{
char size[100];
ComputeTypeSize(e.expType);
- sprintf(size, "%d", e.expType.size);
+ sprintf(size, "%d", e.expType.size); // BOOTSTRAP FIX
newExp = MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)),
MkDeclaratorPointer(MkPointer(null, null), null)), newExp), '+',
MkExpCall(MkExpIdentifier(MkIdentifier("__ENDIAN_PAD")), MkListOne(MkExpConstant(size))))));
else if(checkedExp.type == castExp)
checkedExp = checkedExp.cast.exp;
}
- newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer(null, null), null)), MkExpOp(null, '&', checkedExp));
- newExp.byReference = true;
+ {
+ Expression i;
+ newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer(null, null), null)), (i = MkExpOp(null, '&', checkedExp)));
+ i.byReference = true;
+ newExp.byReference = true;
+ }
if(parentExp.type == callExp)
{
exp.call.arguments->Insert(e.prev, newExp);
{
strcpy(className, "__ecereClass_");
FullClassNameCat(className, _class.fullName, true);
- //MangleClassName(className);
if(!_class.symbol)
_class.symbol = FindClass(_class.fullName);
- DeclareClass(_class.symbol, className);
+ DeclareClass(curExternal, _class.symbol, className);
}
if(_class.type == normalClass && destType.byReference == false && strcmp(_class.dataTypeString, "char *"))
ProcessExpression(exp.member.exp);
// TEST: exp.tempCount = exp.member.exp.tempCount;
- DeclareProperty(prop, setName, getName);
+ DeclareProperty(curExternal, prop, setName, getName);
//propertyClass = convertTo ? _class : ((Symbol)prop.symbol)._class;
propertyClass = convertTo ? _class :
((((Symbol)prop.symbol).type && ((Symbol)prop.symbol).type.kind == classType) ? ((Symbol)prop.symbol).type._class.registered : ((Symbol)prop.symbol)._class);
-
if(propertyClass && propertyClass.type == bitClass)
{
// Bit classes shouldn't have properties except for conversions...
className[0] = 0;
FullClassNameCat(className, propertyClass.fullName, false); //true);
+ DeclareStruct(curExternal, propertyClass.fullName, false, true);
//ListAdd(specs, MkSpecifierName(className));
ListAdd(specs, MkStructOrUnion(structSpecifier, MkIdentifier(className), null));
// Need the class itself here...
strcpy(className, "__ecereClass_");
FullClassNameCat(className, _class.fullName, true);
- //MangleClassName(className);
if(!_class.symbol)
_class.symbol = FindClass(_class.fullName);
- DeclareClass(_class.symbol, className);
+ DeclareClass(curExternal, _class.symbol, className);
FreeExpression(exp.member.exp);
exp.index.exp = MkExpPointer(MkExpIdentifier(MkIdentifier(className)), MkIdentifier("_vTbl"));
exp.index.exp = MkExpPointer(exp.member.exp, MkIdentifier("_vTbl"));
}
exp.index.index = MkListOne(QMkExpId(name));
- DeclareMethod(method, name);
+ DeclareMethod(curExternal, method, name);
}
else
{
strcat(name, "_");
strcat(name, method.name);
exp.identifier = MkIdentifier(name);
- DeclareMethod(method, name);
+ DeclareMethod(curExternal, method, name);
}
}
}
// TEST: exp.tempCount = exp.member.exp.tempCount;
if(type.kind == classType && type._class && type._class.registered)
- DeclareStruct(type._class.registered.fullName, false);
+ DeclareStruct(curExternal, type._class.registered.fullName, false, true);
// TESTING THIS NOHEAD STUFF...
if(_class.type == noHeadClass)
char className[1024];
strcpy(className, "__ecereClass_");
FullClassNameCat(className, member._class.fullName, true);
- //MangleClassName(className);
// classExp = QMkExpId(className);
if(!member._class.symbol)
member._class.symbol = FindClass(member._class.fullName);
- DeclareClass(member._class.symbol, className);
- DeclareStruct(member._class.fullName, false);
+ DeclareClass(curExternal, member._class.symbol, className);
+ DeclareStruct(curExternal, member._class.fullName, false, true);
structName[0] = 0;
FullClassNameCat(structName, member._class.fullName, false);
MkInitializerAssignment(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer(null, null), null)), QBrackets(exp.member.exp))))))), null);
if(member._class.fixed)
{
- if(member._class.templateClass ? member._class.templateClass.offset : member._class.offset)
+ Class c = member._class.templateClass ? member._class.templateClass : member._class;
+ if(c.offset)
{
- char string[256];
- sprintf(string, "%d", member._class.templateClass ? member._class.templateClass.offset : member._class.offset);
- e = QBrackets(MkExpOp(QMkExpId(ecereTemp), '+', MkExpConstant(string)));
+ Expression se;
+
+ if(c.offset == c.base.structSize)
+ {
+ se = MkExpClassSize(MkSpecifierName(c.base.fullName));
+ ProcessExpressionType(se);
+ se.isConstant = false;
+ }
+ else
+ {
+ char string[256];
+ sprintf(string, "%d", c.offset);
+ se = MkExpConstant(string);
+ }
+ e = QBrackets(MkExpOp(QMkExpId(ecereTemp), '+', se));
}
else
e = QMkExpId(ecereTemp);
// if(class.fixed)
if(member._class.fixed)
{
- if(member._class.templateClass ? member._class.templateClass.offset : member._class.offset)
+ Class c = member._class.templateClass ? member._class.templateClass : member._class;
+ if(c.offset)
{
- char string[256];
- sprintf(string, "%d", member._class.templateClass ? member._class.templateClass.offset : member._class.offset);
- e = QBrackets(QBrackets(MkExpOp(bytePtr, '+', MkExpConstant(string))));
+ Expression se;
+
+ if(c.offset == c.base.structSize)
+ {
+ se = MkExpClassSize(MkSpecifierName(c.base.fullName));
+ ProcessExpressionType(se);
+ se.isConstant = false;
+ }
+ else
+ {
+ char string[256];
+ sprintf(string, "%d", c.offset);
+ se = MkExpConstant(string);
+ }
+
+ e = QBrackets(QBrackets(MkExpOp(bytePtr, '+', se)));
}
else
e = bytePtr;
strcpy(className, "__ecereClass_");
FullClassNameCat(className, string, true); // TODO: Verify this
- //MangleClassName(className);
- DeclareClass(classSym, className);
+
+ DeclareClass(curExternal, classSym, className);
delete string;
FreeList(exp._classExp.specifiers, FreeSpecifier);
OldList * specs = MkList();
char typeString[1024];
bool castingToDest = false;
- bool pointerCastExp;
+ bool pointerCastExp = false;
typeString[0] = '\0';
if(exp.usage.usageDelete)
strcpy(typeString, "void *");
else
- PrintType(exp.expType, typeString, false, false);
+ {
+ if(exp.expType.kind == templateType && exp.expType.templateParameter && exp.expType.templateParameter.dataTypeString)
+ strcpy(typeString, exp.expType.templateParameter.dataTypeString);
+ else
+ PrintType(exp.expType, typeString, false, false);
+ }
decl = SpecDeclFromString(typeString, specs, null);
{
Specifier spec = specs ? specs->first : null;
TemplateParameter tp = (spec && spec.type == templateTypeSpecifier) ? spec.templateParameter : null;
- pointerCastExp =
- (spec.type == nameSpecifier && strcmp(spec.name, "uint64")) ||
+ Type type = castingToDest ? exp.destType : exp.expType;
+ bool specsDeclPointer = (spec.type == nameSpecifier && strcmp(spec.name, "uint64")) ||
(decl && decl.type == pointerDeclarator) ||
(tp && tp.dataType &&
( (tp.dataType.decl && tp.dataType.decl.type == pointerDeclarator) ||
- (tp.dataType.specifiers && ((Specifier)tp.dataType.specifiers->first).type == nameSpecifier && strcmp(((Specifier)tp.dataType.specifiers->first).name, "uint64")) ) ) ||
- (castingToDest ? exp.destType.isPointerType : exp.expType.isPointerType);
+ (tp.dataType.specifiers && ((Specifier)tp.dataType.specifiers->first).type == nameSpecifier && strcmp(((Specifier)tp.dataType.specifiers->first).name, "uint64")) ) );
+ pointerCastExp = type ? ((type.kind == templateType && specsDeclPointer) || type.isPointerType) : specsDeclPointer;
}
if(pointerCastExp)