Skip to content

Commit 33b62da

Browse files
committed
Implement tuple deepcopy
1 parent b4b0ced commit 33b62da

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

src/libasr/codegen/c_utils.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ class CCPPDSUtils {
179179
std::string list_type_code = ASRUtils::get_type_code(list_type->m_type, true);
180180
std::string func = typecodeToDSfuncs[list_type_code]["list_deepcopy"];
181181
return func + "(&" + value + ", &" + target + ");";
182+
} else if (ASR::is_a<ASR::Tuple_t>(*t)) {
183+
ASR::Tuple_t* tup_type = ASR::down_cast<ASR::Tuple_t>(t);
184+
std::string tup_type_code = CUtils::get_tuple_type_code(tup_type);
185+
std::string func = typecodeToDSfuncs[tup_type_code]["tuple_deepcopy"];
186+
return func + "(" + value + ", &" + target + ");";
182187
} else if (ASR::is_a<ASR::Character_t>(*t)) {
183188
return "strcpy(" + target + ", " + value + ");";
184189
}
@@ -567,6 +572,12 @@ class CCPPDSUtils {
567572
generated_code += indent + "}\n\n";
568573
}
569574

575+
std::string get_tuple_deepcopy_func(ASR::Tuple_t* tup_type) {
576+
std::string tuple_type_code = CUtils::get_tuple_type_code(tup_type);
577+
return typecodeToDSfuncs[tuple_type_code]["tuple_deepcopy"];
578+
}
579+
580+
570581
std::string get_tuple_type(ASR::Tuple_t* tuple_type) {
571582
std::string tuple_type_code = CUtils::get_tuple_type_code(tuple_type);
572583
if (typecodeToDStype.find(tuple_type_code) != typecodeToDStype.end()) {
@@ -590,9 +601,35 @@ class CCPPDSUtils {
590601
tmp_gen += indent + "};\n\n";
591602
func_decls += tmp_gen;
592603
generate_compare_funcs((ASR::ttype_t *)tuple_type);
604+
tuple_deepcopy(tuple_type, tuple_type_code);
593605
return tuple_struct_type;
594606
}
595607

608+
void tuple_deepcopy(ASR::Tuple_t *t, std::string tuple_type_code) {
609+
std::string indent(indentation_level * indentation_spaces, ' ');
610+
std::string tab(indentation_spaces, ' ');
611+
std::string tup_dc_func = global_scope->get_unique_name("tuple_deepcopy_" + tuple_type_code);
612+
typecodeToDSfuncs[tuple_type_code]["tuple_deepcopy"] = tup_dc_func;
613+
std::string tuple_struct_type = typecodeToDStype[tuple_type_code];
614+
std::string signature = "void " + tup_dc_func + "("
615+
+ tuple_struct_type + " src, "
616+
+ tuple_struct_type + "* dest)";
617+
std::string tmp_def = "", tmp_gen = "";
618+
tmp_def += "inline " + signature + ";\n";
619+
tmp_gen += indent + signature + " {\n";
620+
for (size_t i=0; i<t->n_type; i++) {
621+
std::string n = std::to_string(i);
622+
if (ASR::is_a<ASR::Character_t>(*t->m_type[i])) {
623+
tmp_gen += indent + tab + "data->element_" + n + " = " + \
624+
"(char *) malloc(40*sizeof(char));\n";
625+
}
626+
tmp_gen += indent + tab + get_deepcopy(t->m_type[i], "src.element_" + n,
627+
"data->element_" + n) + "\n";
628+
}
629+
tmp_gen += indent + "}\n\n";
630+
func_decls += tmp_def;
631+
generated_code += tmp_gen;
632+
}
596633

597634
~CCPPDSUtils() {
598635
typecodeToDStype.clear();

0 commit comments

Comments
 (0)