@@ -91,6 +91,12 @@ STATIC void mp_map_rehash(mp_map_t *map) {
91
91
m_del (mp_map_elem_t , old_table , old_alloc );
92
92
}
93
93
94
+ // MP_MAP_LOOKUP behaviour:
95
+ // - returns NULL if not found, else the slot it was found in with key,value non-null
96
+ // MP_MAP_LOOKUP_ADD_IF_NOT_FOUND behaviour:
97
+ // - returns slot, with key non-null and value=MP_OBJ_NULL if it was added
98
+ // MP_MAP_LOOKUP_REMOVE_IF_FOUND behaviour:
99
+ // - returns NULL if not found, else the slot if was found in with key null and value non-null
94
100
mp_map_elem_t * mp_map_lookup (mp_map_t * map , mp_obj_t index , mp_map_lookup_kind_t lookup_kind ) {
95
101
// if the map is a fixed array then we must do a brute force linear search
96
102
if (map -> table_is_fixed_array ) {
@@ -135,7 +141,7 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t
135
141
}
136
142
return slot ;
137
143
} else {
138
- return MP_OBJ_NULL ;
144
+ return NULL ;
139
145
}
140
146
} else if (slot -> key == MP_OBJ_SENTINEL ) {
141
147
// found deleted slot, remember for later
@@ -146,10 +152,6 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t
146
152
// found index
147
153
// Note: CPython does not replace the index; try x={True:'true'};x[1]='one';x
148
154
if (lookup_kind & MP_MAP_LOOKUP_REMOVE_IF_FOUND ) {
149
- // this leaks this memory (but see dict_get_helper)
150
- mp_map_elem_t * retval = m_new (mp_map_elem_t , 1 );
151
- retval -> key = slot -> key ;
152
- retval -> value = slot -> value ;
153
155
// delete element in this slot
154
156
map -> used -- ;
155
157
if (map -> table [(pos + 1 ) % map -> alloc ].key == MP_OBJ_NULL ) {
@@ -158,7 +160,7 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t
158
160
} else {
159
161
slot -> key = MP_OBJ_SENTINEL ;
160
162
}
161
- return retval ;
163
+ // keep slot->value so that caller can access it if needed
162
164
}
163
165
return slot ;
164
166
}
@@ -185,7 +187,7 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t
185
187
start_pos = pos = hash % map -> alloc ;
186
188
}
187
189
} else {
188
- return MP_OBJ_NULL ;
190
+ return NULL ;
189
191
}
190
192
}
191
193
}
0 commit comments