Skip to content

Commit 88e2f5a

Browse files
committed
Prevent deepcopy in subscript in for loops
1 parent 332b771 commit 88e2f5a

File tree

1 file changed

+27
-24
lines changed

1 file changed

+27
-24
lines changed

src/lpython/semantics/python_ast_to_asr.cpp

+27-24
Original file line numberDiff line numberDiff line change
@@ -5871,6 +5871,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
58715871
std::string loop_src_var_name = "";
58725872
ASR::expr_t *loop_end = nullptr, *loop_start = nullptr, *inc = nullptr;
58735873
ASR::expr_t *for_iter_type = nullptr;
5874+
ASR::expr_t *loop_src_var = nullptr;
58745875
if (AST::is_a<AST::Call_t>(*x.m_iter)) {
58755876
AST::Call_t *c = AST::down_cast<AST::Call_t>(x.m_iter);
58765877
std::string call_name;
@@ -5915,6 +5916,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
59155916

59165917
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
59175918
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5919+
loop_src_var = ASRUtils::EXPR(
5920+
ASR::make_Var_t(al, x.base.base.loc, current_scope->resolve_symbol(loop_src_var_name)));
59185921
is_explicit_iterator_required = false;
59195922
for_each = true;
59205923
} else {
@@ -5930,34 +5933,35 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
59305933
visit_Subscript(*sbt);
59315934
ASR::expr_t *target = ASRUtils::EXPR(tmp);
59325935
ASR::ttype_t *loop_src_var_ttype = ASRUtils::expr_type(target);
5933-
// Create a temporary variable that will contain the evaluated value of Subscript
5934-
std::string tmp_assign_name = current_scope->get_unique_name("__tmp_assign_for_loop", false);
5935-
SetChar variable_dependencies_vec;
5936-
variable_dependencies_vec.reserve(al, 1);
5937-
ASRUtils::collect_variable_dependencies(al, variable_dependencies_vec, loop_src_var_ttype);
5938-
ASR::asr_t* tmp_assign_variable = ASR::make_Variable_t(al, sbt->base.base.loc, current_scope,
5939-
s2c(al, tmp_assign_name), variable_dependencies_vec.p, variable_dependencies_vec.size(),
5940-
ASR::intentType::Local, nullptr, nullptr, ASR::storage_typeType::Default,
5941-
loop_src_var_ttype, nullptr, ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5942-
);
5943-
ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t>(tmp_assign_variable);
5944-
current_scope->add_symbol(tmp_assign_name, tmp_assign_variable_sym);
5945-
5946-
// Assign the Subscript expr to temporary variable
5947-
ASR::asr_t* assign = ASR::make_Assignment_t(al, x.base.base.loc,
5948-
ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, tmp_assign_variable_sym)),
5949-
target, nullptr);
5950-
if (current_body != nullptr) {
5951-
current_body->push_back(al, ASRUtils::STMT(assign));
5952-
} else {
5953-
global_init.push_back(al, assign);
5954-
}
5955-
loop_src_var_name = tmp_assign_name;
59565936
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
59575937
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5938+
loop_src_var = target;
59585939
is_explicit_iterator_required = false;
59595940
for_each = true;
59605941
} else {
5942+
// Create a temporary variable that will contain the evaluated value of Subscript
5943+
std::string tmp_assign_name = current_scope->get_unique_name("__tmp_assign_for_loop", false);
5944+
SetChar variable_dependencies_vec;
5945+
variable_dependencies_vec.reserve(al, 1);
5946+
ASRUtils::collect_variable_dependencies(al, variable_dependencies_vec, loop_src_var_ttype);
5947+
ASR::asr_t* tmp_assign_variable = ASR::make_Variable_t(al, sbt->base.base.loc, current_scope,
5948+
s2c(al, tmp_assign_name), variable_dependencies_vec.p, variable_dependencies_vec.size(),
5949+
ASR::intentType::Local, nullptr, nullptr, ASR::storage_typeType::Default,
5950+
loop_src_var_ttype, nullptr, ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5951+
);
5952+
ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t>(tmp_assign_variable);
5953+
current_scope->add_symbol(tmp_assign_name, tmp_assign_variable_sym);
5954+
5955+
// Assign the Subscript expr to temporary variable
5956+
ASR::asr_t* assign = ASR::make_Assignment_t(al, x.base.base.loc,
5957+
ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, tmp_assign_variable_sym)),
5958+
target, nullptr);
5959+
if (current_body != nullptr) {
5960+
current_body->push_back(al, ASRUtils::STMT(assign));
5961+
} else {
5962+
global_init.push_back(al, assign);
5963+
}
5964+
loop_src_var_name = tmp_assign_name;
59615965
loop_end = for_iterable_helper(loop_src_var_name, x.base.base.loc, explicit_iter_name);
59625966
for_iter_type = loop_end;
59635967
LCOMPILERS_ASSERT(loop_end);
@@ -6070,7 +6074,6 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
60706074

60716075
if (for_each) {
60726076
current_scope = parent_scope;
6073-
ASR::expr_t* loop_src_var = ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, current_scope->resolve_symbol(loop_src_var_name)));
60746077
tmp = ASR::make_ForEach_t(al, x.base.base.loc, target, loop_src_var, body.p, body.size());
60756078
for_each = false;
60766079
return;

0 commit comments

Comments
 (0)