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:
Nathan Braswell
2015-06-07 19:54:08 -04:00
parent 7abab02fbf
commit 69048ebc31
4 changed files with 16 additions and 6 deletions

View File

@@ -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 {

View File

@@ -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()
} }

View File

@@ -2,3 +2,5 @@ hello strings
assignment overload assignment overload
assignment overload2 assignment overload2
assignment overload with additional assignment overload with additional
hope
hope3

View File

@@ -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;
} }