Skip to content

Commit eb59248

Browse files
committed
Prevent deepcopy in subscript in for loops
1 parent 42f385f commit eb59248

File tree

1 file changed

+27
-24
lines changed

1 file changed

+27
-24
lines changed

src/lpython/semantics/python_ast_to_asr.cpp

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5808,6 +5808,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
58085808
std::string loop_src_var_name = "";
58095809
ASR::expr_t *loop_end = nullptr, *loop_start = nullptr, *inc = nullptr;
58105810
ASR::expr_t *for_iter_type = nullptr;
5811+
ASR::expr_t *loop_src_var = nullptr;
58115812
if (AST::is_a<AST::Call_t>(*x.m_iter)) {
58125813
AST::Call_t *c = AST::down_cast<AST::Call_t>(x.m_iter);
58135814
std::string call_name;
@@ -5852,6 +5853,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
58525853

58535854
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
58545855
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5856+
loop_src_var = ASRUtils::EXPR(
5857+
ASR::make_Var_t(al, x.base.base.loc, current_scope->resolve_symbol(loop_src_var_name)));
58555858
is_explicit_iterator_required = false;
58565859
for_each = true;
58575860
} else {
@@ -5867,34 +5870,35 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
58675870
visit_Subscript(*sbt);
58685871
ASR::expr_t *target = ASRUtils::EXPR(tmp);
58695872
ASR::ttype_t *loop_src_var_ttype = ASRUtils::expr_type(target);
5870-
// Create a temporary variable that will contain the evaluated value of Subscript
5871-
std::string tmp_assign_name = current_scope->get_unique_name("__tmp_assign_for_loop", false);
5872-
SetChar variable_dependencies_vec;
5873-
variable_dependencies_vec.reserve(al, 1);
5874-
ASRUtils::collect_variable_dependencies(al, variable_dependencies_vec, loop_src_var_ttype);
5875-
ASR::asr_t* tmp_assign_variable = ASR::make_Variable_t(al, sbt->base.base.loc, current_scope,
5876-
s2c(al, tmp_assign_name), variable_dependencies_vec.p, variable_dependencies_vec.size(),
5877-
ASR::intentType::Local, nullptr, nullptr, ASR::storage_typeType::Default,
5878-
loop_src_var_ttype, nullptr, ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5879-
);
5880-
ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t>(tmp_assign_variable);
5881-
current_scope->add_symbol(tmp_assign_name, tmp_assign_variable_sym);
5882-
5883-
// Assign the Subscript expr to temporary variable
5884-
ASR::asr_t* assign = ASR::make_Assignment_t(al, x.base.base.loc,
5885-
ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, tmp_assign_variable_sym)),
5886-
target, nullptr);
5887-
if (current_body != nullptr) {
5888-
current_body->push_back(al, ASRUtils::STMT(assign));
5889-
} else {
5890-
global_init.push_back(al, assign);
5891-
}
5892-
loop_src_var_name = tmp_assign_name;
58935873
if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) ||
58945874
ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) {
5875+
loop_src_var = target;
58955876
is_explicit_iterator_required = false;
58965877
for_each = true;
58975878
} else {
5879+
// Create a temporary variable that will contain the evaluated value of Subscript
5880+
std::string tmp_assign_name = current_scope->get_unique_name("__tmp_assign_for_loop", false);
5881+
SetChar variable_dependencies_vec;
5882+
variable_dependencies_vec.reserve(al, 1);
5883+
ASRUtils::collect_variable_dependencies(al, variable_dependencies_vec, loop_src_var_ttype);
5884+
ASR::asr_t* tmp_assign_variable = ASR::make_Variable_t(al, sbt->base.base.loc, current_scope,
5885+
s2c(al, tmp_assign_name), variable_dependencies_vec.p, variable_dependencies_vec.size(),
5886+
ASR::intentType::Local, nullptr, nullptr, ASR::storage_typeType::Default,
5887+
loop_src_var_ttype, nullptr, ASR::abiType::Source, ASR::accessType::Public, ASR::presenceType::Required, false
5888+
);
5889+
ASR::symbol_t *tmp_assign_variable_sym = ASR::down_cast<ASR::symbol_t>(tmp_assign_variable);
5890+
current_scope->add_symbol(tmp_assign_name, tmp_assign_variable_sym);
5891+
5892+
// Assign the Subscript expr to temporary variable
5893+
ASR::asr_t* assign = ASR::make_Assignment_t(al, x.base.base.loc,
5894+
ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, tmp_assign_variable_sym)),
5895+
target, nullptr);
5896+
if (current_body != nullptr) {
5897+
current_body->push_back(al, ASRUtils::STMT(assign));
5898+
} else {
5899+
global_init.push_back(al, assign);
5900+
}
5901+
loop_src_var_name = tmp_assign_name;
58985902
loop_end = for_iterable_helper(loop_src_var_name, x.base.base.loc, explicit_iter_name);
58995903
for_iter_type = loop_end;
59005904
LCOMPILERS_ASSERT(loop_end);
@@ -6007,7 +6011,6 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> {
60076011

60086012
if (for_each) {
60096013
current_scope = parent_scope;
6010-
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)));
60116014
tmp = ASR::make_ForEach_t(al, x.base.base.loc, target, loop_src_var, body.p, body.size());
60126015
for_each = false;
60136016
return;

0 commit comments

Comments
 (0)