@@ -132,9 +132,29 @@ void mp_set_init(mp_set_t *set, int n) {
132132 set -> table = m_new0 (mp_obj_t , set -> alloc );
133133}
134134
135+ static void mp_set_rehash (mp_set_t * set ) {
136+ int old_alloc = set -> alloc ;
137+ mp_obj_t * old_table = set -> table ;
138+ set -> alloc = get_doubling_prime_greater_or_equal_to (set -> alloc + 1 );
139+ set -> used = 0 ;
140+ set -> table = m_new0 (mp_obj_t , set -> alloc );
141+ for (int i = 0 ; i < old_alloc ; i ++ ) {
142+ if (old_table [i ] != NULL ) {
143+ mp_set_lookup (set , old_table [i ], true);
144+ }
145+ }
146+ m_del (mp_obj_t , old_table , old_alloc );
147+ }
148+
135149mp_obj_t mp_set_lookup (mp_set_t * set , mp_obj_t index , bool add_if_not_found ) {
136150 int hash = mp_obj_hash (index );
137- assert (set -> alloc ); /* FIXME: if alloc is ever 0 when doing a lookup, this'll fail: */
151+ if (set -> alloc == 0 ) {
152+ if (add_if_not_found ) {
153+ mp_set_rehash (set );
154+ } else {
155+ return NULL ;
156+ }
157+ }
138158 int pos = hash % set -> alloc ;
139159 for (;;) {
140160 mp_obj_t elem = set -> table [pos ];
@@ -143,17 +163,7 @@ mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found) {
143163 if (add_if_not_found ) {
144164 if (set -> used + 1 >= set -> alloc ) {
145165 // not enough room in table, rehash it
146- int old_alloc = set -> alloc ;
147- mp_obj_t * old_table = set -> table ;
148- set -> alloc = get_doubling_prime_greater_or_equal_to (set -> alloc + 1 );
149- set -> used = 0 ;
150- set -> table = m_new (mp_obj_t , set -> alloc );
151- for (int i = 0 ; i < old_alloc ; i ++ ) {
152- if (old_table [i ] != NULL ) {
153- mp_set_lookup (set , old_table [i ], true);
154- }
155- }
156- m_del (mp_obj_t , old_table , old_alloc );
166+ mp_set_rehash (set );
157167 // restart the search for the new element
158168 pos = hash % set -> alloc ;
159169 } else {
@@ -173,3 +183,13 @@ mp_obj_t mp_set_lookup(mp_set_t *set, mp_obj_t index, bool add_if_not_found) {
173183 }
174184 }
175185}
186+
187+ void mp_set_clear (mp_set_t * set ) {
188+ set -> used = 0 ;
189+ machine_uint_t a = set -> alloc ;
190+ set -> alloc = 0 ;
191+ set -> table = m_renew (mp_obj_t , set -> table , a , set -> alloc );
192+ for (uint i = 0 ; i < set -> alloc ; i ++ ) {
193+ set -> table [i ] = NULL ;
194+ }
195+ }
0 commit comments