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:
+7
-3
@@ -476,13 +476,17 @@ CCodeTriple CGenerator::generate(NodeTree<ASTData>* from, NodeTree<ASTData>* enc
|
||||
// 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*/";
|
||||
} else {
|
||||
// copy constructor if of the same type
|
||||
if (*children[0]->getDataRef()->valueType == *children[1]->getDataRef()->valueType && methodExists(children[1]->getDataRef()->valueType, "copy_construct", std::vector<Type>{children[1]->getDataRef()->valueType->withIncreasedIndirection()})) {
|
||||
// copy constructor if exists (even for non same types)
|
||||
if (methodExists(children[0]->getDataRef()->valueType, "copy_construct", std::vector<Type>{children[1]->getDataRef()->valueType->withIncreasedIndirection()})) {
|
||||
CCodeTriple toAssign = generate(children[1], enclosingObject, true);
|
||||
std::string assignedTo = generate(children[0], enclosingObject, justFuncName).oneString();
|
||||
output.value = toAssign.preValue;
|
||||
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;
|
||||
return output;
|
||||
} else {
|
||||
|
||||
@@ -25,6 +25,10 @@ obj string (Object) {
|
||||
data.copy_construct(&old->data)
|
||||
}
|
||||
|
||||
fun copy_construct(old: char**): void {
|
||||
construct(*old)
|
||||
}
|
||||
|
||||
fun destruct():void {
|
||||
data.destruct()
|
||||
}
|
||||
|
||||
@@ -2,3 +2,5 @@ hello strings
|
||||
assignment overload
|
||||
assignment overload2
|
||||
assignment overload with additional
|
||||
hope
|
||||
hope3
|
||||
|
||||
@@ -10,9 +10,9 @@ fun main(): int {
|
||||
io::println(str + "2");
|
||||
str += " with additional"
|
||||
io::println(str);
|
||||
//var initilized:string::string = "hope"
|
||||
//io::println(initilized)
|
||||
//io::println(initilized+ "3")
|
||||
var initilized:string::string = "hope"
|
||||
io::println(initilized)
|
||||
io::println(initilized+ "3")
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user