@@ -1534,7 +1534,7 @@ namespace LCompilers {
1534
1534
llvm::Value* LLVMDict::resolve_collision_for_read (
1535
1535
llvm::Value* dict, llvm::Value* key_hash,
1536
1536
llvm::Value* key, llvm::Module& module ,
1537
- ASR::ttype_t * key_asr_type, ASR::ttype_t * /* value_asr_type*/ ) {
1537
+ ASR::ttype_t * key_asr_type, ASR::ttype_t * /* value_asr_type*/ , llvm::Value* /* def_value */ ) {
1538
1538
llvm::Value* key_list = get_key_list (dict);
1539
1539
llvm::Value* value_list = get_value_list (dict);
1540
1540
llvm::Value* key_mask = LLVM::CreateLoad (*builder, get_pointer_to_keymask (dict));
@@ -1548,7 +1548,7 @@ namespace LCompilers {
1548
1548
llvm::Value* LLVMDictOptimizedLinearProbing::resolve_collision_for_read (
1549
1549
llvm::Value* dict, llvm::Value* key_hash,
1550
1550
llvm::Value* key, llvm::Module& module ,
1551
- ASR::ttype_t * key_asr_type, ASR::ttype_t * /* value_asr_type*/ ) {
1551
+ ASR::ttype_t * key_asr_type, ASR::ttype_t * /* value_asr_type*/ , llvm::Value *def_value ) {
1552
1552
llvm::Value* key_list = get_key_list (dict);
1553
1553
llvm::Value* value_list = get_value_list (dict);
1554
1554
llvm::Value* key_mask = LLVM::CreateLoad (*builder, get_pointer_to_keymask (dict));
@@ -1601,6 +1601,10 @@ namespace LCompilers {
1601
1601
builder->CreateBr (mergeBB);
1602
1602
llvm_utils->start_new_block (elseBB);
1603
1603
{
1604
+ if (def_value != nullptr ) {
1605
+ llvm_utils->start_new_block (mergeBB);
1606
+ return def_value;
1607
+ }
1604
1608
this ->resolve_collision (capacity, key_hash, key, key_list, key_mask,
1605
1609
module , key_asr_type, true );
1606
1610
}
@@ -1614,7 +1618,7 @@ namespace LCompilers {
1614
1618
llvm::Value* LLVMDictSeparateChaining::resolve_collision_for_read (
1615
1619
llvm::Value* dict, llvm::Value* key_hash,
1616
1620
llvm::Value* key, llvm::Module& module ,
1617
- ASR::ttype_t * key_asr_type, ASR::ttype_t * value_asr_type) {
1621
+ ASR::ttype_t * key_asr_type, ASR::ttype_t * value_asr_type, llvm::Value *def_value ) {
1618
1622
llvm::Value* capacity = LLVM::CreateLoad (*builder, get_pointer_to_capacity (dict));
1619
1623
llvm::Value* key_value_pairs = LLVM::CreateLoad (*builder, get_pointer_to_key_value_pairs (dict));
1620
1624
llvm::Value* key_value_pair_linked_list = llvm_utils->create_ptr_gep (key_value_pairs, key_hash);
@@ -1658,6 +1662,10 @@ namespace LCompilers {
1658
1662
builder->CreateBr (mergeBB_single_match);
1659
1663
llvm_utils->start_new_block (elseBB_single_match);
1660
1664
{
1665
+ if (def_value != nullptr ) {
1666
+ llvm_utils->start_new_block (mergeBB_single_match);
1667
+ return def_value;
1668
+ }
1661
1669
std::string message = " The dict does not contain the specified key" ;
1662
1670
llvm::Value *fmt_ptr = builder->CreateGlobalStringPtr (" KeyError: %s\n " );
1663
1671
llvm::Value *fmt_ptr2 = builder->CreateGlobalStringPtr (message);
@@ -2103,24 +2111,26 @@ namespace LCompilers {
2103
2111
}
2104
2112
2105
2113
llvm::Value* LLVMDict::read_item (llvm::Value* dict, llvm::Value* key,
2106
- llvm::Module& module , ASR::Dict_t* dict_type,
2114
+ llvm::Module& module , ASR::Dict_t* dict_type, llvm::Value* def_value,
2107
2115
bool get_pointer) {
2108
2116
llvm::Value* current_capacity = LLVM::CreateLoad (*builder, get_pointer_to_capacity (dict));
2109
2117
llvm::Value* key_hash = get_key_hash (current_capacity, key, dict_type->m_key_type , module );
2110
2118
llvm::Value* value_ptr = this ->resolve_collision_for_read (dict, key_hash, key, module ,
2111
- dict_type->m_key_type , dict_type->m_value_type );
2119
+ dict_type->m_key_type , dict_type->m_value_type ,
2120
+ def_value);
2112
2121
if ( get_pointer ) {
2113
2122
return value_ptr;
2114
2123
}
2115
2124
return LLVM::CreateLoad (*builder, value_ptr);
2116
2125
}
2117
2126
2118
2127
llvm::Value* LLVMDictSeparateChaining::read_item (llvm::Value* dict, llvm::Value* key,
2119
- llvm::Module& module , ASR::Dict_t* dict_type, bool get_pointer) {
2128
+ llvm::Module& module , ASR::Dict_t* dict_type, llvm::Value* def_value, bool get_pointer) {
2120
2129
llvm::Value* current_capacity = LLVM::CreateLoad (*builder, get_pointer_to_capacity (dict));
2121
2130
llvm::Value* key_hash = get_key_hash (current_capacity, key, dict_type->m_key_type , module );
2122
2131
llvm::Value* value_ptr = this ->resolve_collision_for_read (dict, key_hash, key, module ,
2123
- dict_type->m_key_type , dict_type->m_value_type );
2132
+ dict_type->m_key_type , dict_type->m_value_type ,
2133
+ def_value);
2124
2134
std::pair<std::string, std::string> llvm_key = std::make_pair (
2125
2135
ASRUtils::get_type_code (dict_type->m_key_type ),
2126
2136
ASRUtils::get_type_code (dict_type->m_value_type )
0 commit comments