14
14
*/
15
15
MRB_BEGIN_DECL
16
16
17
+ /* offset of `iv` must be 3 words */
17
18
struct RHash {
18
19
MRB_OBJECT_HEADER ;
20
+ #ifdef MRB_64BIT
21
+ uint32_t size ;
19
22
struct iv_tbl * iv ;
20
- struct htable * ht ;
23
+ uint32_t ea_capa ;
24
+ uint32_t ea_n_used ;
25
+ #else
26
+ struct iv_tbl * iv ;
27
+ uint32_t size ;
28
+ #endif
29
+ union {
30
+ struct hash_entry * ea ;
31
+ struct hash_table * ht ;
32
+ };
21
33
};
22
34
23
35
#define mrb_hash_ptr (v ) ((struct RHash*)(mrb_ptr(v)))
@@ -179,8 +191,9 @@ MRB_API mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
179
191
MRB_API mrb_int mrb_hash_size (mrb_state * mrb , mrb_value hash );
180
192
181
193
/*
182
- * Copies the hash.
183
- *
194
+ * Copies the hash. This function does NOT copy the instance variables
195
+ * (except for the default value). Use mrb_obj_dup() to copy the instance
196
+ * variables as well.
184
197
*
185
198
* @param mrb The mruby state reference.
186
199
* @param hash The target hash.
@@ -198,16 +211,24 @@ MRB_API mrb_value mrb_hash_dup(mrb_state *mrb, mrb_value hash);
198
211
*/
199
212
MRB_API void mrb_hash_merge (mrb_state * mrb , mrb_value hash1 , mrb_value hash2 );
200
213
201
- /* RHASH_TBL allocates st_table if not available. */
202
- #define RHASH (obj ) ((struct RHash*)(mrb_ptr(obj)))
203
- #define RHASH_TBL (h ) (RHASH(h)->ht)
204
- #define RHASH_IFNONE (h ) mrb_iv_get(mrb, (h), MRB_SYM(ifnone))
205
- #define RHASH_PROCDEFAULT (h ) RHASH_IFNONE(h)
206
-
207
- #define MRB_HASH_DEFAULT 1
208
- #define MRB_HASH_PROC_DEFAULT 2
209
- #define MRB_RHASH_DEFAULT_P (h ) (RHASH(h)->flags & MRB_HASH_DEFAULT)
210
- #define MRB_RHASH_PROCDEFAULT_P (h ) (RHASH(h)->flags & MRB_HASH_PROC_DEFAULT)
214
+ #define RHASH (hash ) ((struct RHash*)(mrb_ptr(hash)))
215
+ #define RHASH_IFNONE (hash ) mrb_iv_get(mrb, (hash), MRB_SYM(ifnone))
216
+ #define RHASH_PROCDEFAULT (hash ) RHASH_IFNONE(hash)
217
+
218
+ #define MRB_HASH_IB_BIT_BIT 5
219
+ #define MRB_HASH_AR_EA_CAPA_BIT 5
220
+ #define MRB_HASH_IB_BIT_SHIFT 0
221
+ #define MRB_HASH_AR_EA_CAPA_SHIFT 0
222
+ #define MRB_HASH_AR_EA_N_USED_SHIFT MRB_HASH_AR_EA_CAPA_BIT
223
+ #define MRB_HASH_SIZE_FLAGS_SHIFT (MRB_HASH_AR_EA_CAPA_BIT * 2)
224
+ #define MRB_HASH_IB_BIT_MASK ((1 << MRB_HASH_IB_BIT_BIT) - 1)
225
+ #define MRB_HASH_AR_EA_CAPA_MASK ((1 << MRB_HASH_AR_EA_CAPA_BIT) - 1)
226
+ #define MRB_HASH_AR_EA_N_USED_MASK (MRB_HASH_AR_EA_CAPA_MASK << MRB_HASH_AR_EA_N_USED_SHIFT)
227
+ #define MRB_HASH_DEFAULT (1 << (MRB_HASH_SIZE_FLAGS_SHIFT + 0))
228
+ #define MRB_HASH_PROC_DEFAULT (1 << (MRB_HASH_SIZE_FLAGS_SHIFT + 1))
229
+ #define MRB_HASH_HT (1 << (MRB_HASH_SIZE_FLAGS_SHIFT + 2))
230
+ #define MRB_RHASH_DEFAULT_P (hash ) (RHASH(hash)->flags & MRB_HASH_DEFAULT)
231
+ #define MRB_RHASH_PROCDEFAULT_P (hash ) (RHASH(hash)->flags & MRB_HASH_PROC_DEFAULT)
211
232
212
233
/* GC functions */
213
234
void mrb_gc_mark_hash (mrb_state * , struct RHash * );
0 commit comments