| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 332b771 commit 88e2f5a
1 file changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5871,6 +5871,7 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> { | |||
| 5871 | 5871 | std::string loop_src_var_name = ""; | |
| 5872 | 5872 | ASR::expr_t *loop_end = nullptr, *loop_start = nullptr, *inc = nullptr; | |
| 5873 | 5873 | ASR::expr_t *for_iter_type = nullptr; | |
| 5874 | + ASR::expr_t *loop_src_var = nullptr; | ||
| 5874 | 5875 | if (AST::is_a<AST::Call_t>(*x.m_iter)) { | |
| 5875 | 5876 | AST::Call_t *c = AST::down_cast<AST::Call_t>(x.m_iter); | |
| 5876 | 5877 | std::string call_name; | |
@@ -5915,6 +5916,8 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> { | |||
| 5915 | 5916 | ||
| 5916 | 5917 | if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) || | |
| 5917 | 5918 | 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))); | ||
| 5918 | 5921 | is_explicit_iterator_required = false; | |
| 5919 | 5922 | for_each = true; | |
| 5920 | 5923 | } else { | |
@@ -5930,34 +5933,35 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> { | |||
| 5930 | 5933 | visit_Subscript(*sbt); | |
| 5931 | 5934 | ASR::expr_t *target = ASRUtils::EXPR(tmp); | |
| 5932 | 5935 | 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; | ||
| 5956 | 5936 | if (ASR::is_a<ASR::Dict_t>(*loop_src_var_ttype) || | |
| 5957 | 5937 | ASR::is_a<ASR::Set_t>(*loop_src_var_ttype)) { | |
| 5938 | + loop_src_var = target; | ||
| 5958 | 5939 | is_explicit_iterator_required = false; | |
| 5959 | 5940 | for_each = true; | |
| 5960 | 5941 | } 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; | ||
| 5961 | 5965 | loop_end = for_iterable_helper(loop_src_var_name, x.base.base.loc, explicit_iter_name); | |
| 5962 | 5966 | for_iter_type = loop_end; | |
| 5963 | 5967 | LCOMPILERS_ASSERT(loop_end); | |
@@ -6070,7 +6074,6 @@ class BodyVisitor : public CommonVisitor<BodyVisitor> { | |||
| 6070 | 6074 | ||
| 6071 | 6075 | if (for_each) { | |
| 6072 | 6076 | 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))); | ||
| 6074 | 6077 | tmp = ASR::make_ForEach_t(al, x.base.base.loc, target, loop_src_var, body.p, body.size()); | |
| 6075 | 6078 | for_each = false; | |
| 6076 | 6079 | return; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments