Allow copy_constructers to be called with other types (i.e. var a:string = "hi" calls fun copy_construct(it:char**):void
This commit is contained in:
@@ -476,13 +476,17 @@ CCodeTriple CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
|||||||
// be sure to end value by passing oneString true
|
// be sure to end value by passing oneString true
|
||||||
return ValueTypeToCType(children[0]->getData().valueType, generate(children[0], enclosingObject, justFuncName).oneString()) + "; " + generate(children[1], enclosingObject, true).oneString(true) + "/*Init Position Call*/";
|
return ValueTypeToCType(children[0]->getData().valueType, generate(children[0], enclosingObject, justFuncName).oneString()) + "; " + generate(children[1], enclosingObject, true).oneString(true) + "/*Init Position Call*/";
|
||||||
} else {
|
} else {
|
||||||
// copy constructor if of the same type
|
// copy constructor if exists (even for non same types)
|
||||||
if (*children[0]->getDataRef()->valueType == *children[1]->getDataRef()->valueType && methodExists(children[1]->getDataRef()->valueType, "copy_construct", std::vector<Type>{children[1]->getDataRef()->valueType->withIncreasedIndirection()})) {
|
if (methodExists(children[0]->getDataRef()->valueType, "copy_construct", std::vector<Type>{children[1]->getDataRef()->valueType->withIncreasedIndirection()})) {
|
||||||
CCodeTriple toAssign = generate(children[1], enclosingObject, true);
|
CCodeTriple toAssign = generate(children[1], enclosingObject, true);
|
||||||
std::string assignedTo = generate(children[0], enclosingObject, justFuncName).oneString();
|
std::string assignedTo = generate(children[0], enclosingObject, justFuncName).oneString();
|
||||||
output.value = toAssign.preValue;
|
output.value = toAssign.preValue;
|
||||||
output.value += ValueTypeToCType(children[0]->getData().valueType, assignedTo) + ";\n";
|
output.value += ValueTypeToCType(children[0]->getData().valueType, assignedTo) + ";\n";
|
||||||
output.value += generateMethodIfExists(children[0]->getDataRef()->valueType, "copy_construct", "&" + assignedTo + ", &" + toAssign.value, std::vector<Type>{children[0]->getDataRef()->valueType->withIncreasedIndirection()}) + ";\n" + output.postValue;
|
// we put the thing about to be copy constructed in a variable so we can for sure take its address
|
||||||
|
std::string toAssignTemp = "copy_construct_param" + getID();
|
||||||
|
output.value += ValueTypeToCType(children[1]->getData().valueType, toAssignTemp) + " = " + toAssign.value + ";\n";
|
||||||
|
|
||||||
|
output.value += generateMethodIfExists(children[0]->getDataRef()->valueType, "copy_construct", "&" + assignedTo + ", &" + toAssignTemp, std::vector<Type>{children[1]->getDataRef()->valueType->withIncreasedIndirection()}) + ";\n" + output.postValue;
|
||||||
output.value += toAssign.postValue;
|
output.value += toAssign.postValue;
|
||||||
return output;
|
return output;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ obj string (Object) {
|
|||||||
data.copy_construct(&old->data)
|
data.copy_construct(&old->data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun copy_construct(old: char**): void {
|
||||||
|
construct(*old)
|
||||||
|
}
|
||||||
|
|
||||||
fun destruct():void {
|
fun destruct():void {
|
||||||
data.destruct()
|
data.destruct()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,3 +2,5 @@ hello strings
|
|||||||
assignment overload
|
assignment overload
|
||||||
assignment overload2
|
assignment overload2
|
||||||
assignment overload with additional
|
assignment overload with additional
|
||||||
|
hope
|
||||||
|
hope3
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ fun main(): int {
|
|||||||
io::println(str + "2");
|
io::println(str + "2");
|
||||||
str += " with additional"
|
str += " with additional"
|
||||||
io::println(str);
|
io::println(str);
|
||||||
//var initilized:string::string = "hope"
|
var initilized:string::string = "hope"
|
||||||
//io::println(initilized)
|
io::println(initilized)
|
||||||
//io::println(initilized+ "3")
|
io::println(initilized+ "3")
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user