Skip to content

Commit 8d19070

Browse files
committed
Following changes have been made,
Create dict iterators just before the user loop and destroy after user loop Set is_dict_present=false when entering a scope and reset when leaving
1 parent 63c9654 commit 8d19070

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,6 +1756,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
17561756
}
17571757

17581758
void visit_Program(const ASR::Program_t &x) {
1759+
bool is_dict_present_copy = dict_api->is_dict_present;
1760+
dict_api->is_dict_present = false;
17591761
llvm_goto_targets.clear();
17601762
// Generate code for nested subroutines and functions first:
17611763
for (auto &item : x.m_symtab->get_scope()) {
@@ -1784,6 +1786,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
17841786
llvm::Value *ret_val2 = llvm::ConstantInt::get(context,
17851787
llvm::APInt(32, 0));
17861788
builder->CreateRet(ret_val2);
1789+
dict_api->is_dict_present = is_dict_present_copy;
17871790
}
17881791

17891792
/*
@@ -2586,6 +2589,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
25862589
}
25872590

25882591
void visit_Function(const ASR::Function_t &x) {
2592+
bool is_dict_present_copy = dict_api->is_dict_present;
2593+
dict_api->is_dict_present = false;
25892594
llvm_goto_targets.clear();
25902595
instantiate_function(x);
25912596
if (x.m_deftype == ASR::deftypeType::Interface) {
@@ -2596,6 +2601,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
25962601
visit_procedures(x);
25972602
generate_function(x);
25982603
parent_function = nullptr;
2604+
dict_api->is_dict_present = is_dict_present_copy;
25992605
}
26002606

26012607
void instantiate_function(const ASR::Function_t &x){
@@ -3577,6 +3583,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
35773583
}
35783584

35793585
void visit_WhileLoop(const ASR::WhileLoop_t &x) {
3586+
dict_api->set_iterators();
35803587
llvm::BasicBlock *loophead = llvm::BasicBlock::Create(context, "loop.head");
35813588
llvm::BasicBlock *loopbody = llvm::BasicBlock::Create(context, "loop.body");
35823589
llvm::BasicBlock *loopend = llvm::BasicBlock::Create(context, "loop.end");
@@ -3598,6 +3605,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
35983605

35993606
// end
36003607
start_new_block(loopend);
3608+
dict_api->reset_iterators();
36013609
}
36023610

36033611
void visit_Exit(const ASR::Exit_t & /* x */) {

0 commit comments

Comments
 (0)