Skip to content

Commit e0460c1

Browse files
committed
hash refactored
1 parent c9a51c4 commit e0460c1

7 files changed

Lines changed: 72 additions & 60 deletions

File tree

include/mruby.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,6 @@ void mrb_gc_mark(mrb_state*,struct RBasic*);
372372
#define mrb_gc_mark_value(mrb,val) do {\
373373
if ((val).tt >= MRB_TT_OBJECT) mrb_gc_mark((mrb), mrb_object(val));\
374374
} while (0);
375-
void mrb_gc_mark_gv(mrb_state*);
376-
void mrb_gc_free_gv(mrb_state*);
377-
void mrb_gc_mark_iv(mrb_state*, struct RObject*);
378-
size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*);
379-
void mrb_gc_free_iv(mrb_state*, struct RObject*);
380-
void mrb_gc_mark_mt(mrb_state*, struct RClass*);
381-
size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*);
382-
void mrb_gc_free_mt(mrb_state*, struct RClass*);
383-
void mrb_gc_mark_ht(mrb_state*, struct RClass*);
384-
size_t mrb_gc_mark_ht_size(mrb_state*, struct RClass*);
385-
void mrb_gc_free_ht(mrb_state*, struct RClass*);
386375
void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*);
387376
#define mrb_field_write_barrier_value(mrb, obj, val) do{\
388377
if ((val.tt >= MRB_TT_OBJECT)) mrb_field_write_barrier((mrb), (obj), mrb_object(val));\

include/mruby/data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *
3838
#define RDATA(obj) ((struct RData *)((obj).value.p))
3939
#define DATA_PTR(d) (RDATA(d)->data)
4040
#define DATA_TYPE(d) (RDATA(d)->type)
41+
void *mrb_get_datatype(mrb_state *mrb, mrb_value, const struct mrb_data_type*);
4142
void *mrb_check_datatype(mrb_state *mrb, mrb_value, const struct mrb_data_type*);
4243
#define Data_Get_Struct(mrb,obj,type,sval) do {\
4344
sval = mrb_check_datatype(mrb, obj, type); \

include/mruby/hash.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
struct RHash {
1111
MRUBY_OBJECT_HEADER;
12+
struct kh_iv *iv;
1213
struct kh_ht *ht;
13-
mrb_value ifnone;
1414
};
1515

1616
#define N 624
@@ -47,12 +47,11 @@ void ruby_setenv(mrb_state *mrb, const char *name, const char *value);
4747

4848
/* RHASH_TBL allocates st_table if not available. */
4949
#define RHASH(obj) ((struct RHash*)((obj).value.p))
50-
#define RHASH_TBL(h) mrb_hash_tbl(h)
51-
#define RHASH_H_TBL(h) (RHASH(h)->ht)
52-
#define RHASH_SIZE(h) (RHASH_H_TBL(h)->size)
50+
#define RHASH_TBL(h) (RHASH(h)->ht)
51+
#define RHASH_SIZE(h) (RHASH_TBL(h)->size)
5352
#define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0)
54-
#define RHASH_IFNONE(h) (RHASH(h)->ifnone)
55-
#define RHASH_PROCDEFAULT(h) (RHASH(h)->ifnone)
53+
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern(mrb, "ifnone"))
54+
#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
5655
struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
5756

5857
#define MRB_HASH_PROC_DEFAULT 256

src/etc.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@ mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const str
3030
return data;
3131
}
3232

33+
void *
34+
mrb_get_datatype(mrb_state *mrb, mrb_value obj, const struct mrb_data_type *type)
35+
{
36+
if (SPECIAL_CONST_P(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
37+
return NULL;
38+
}
39+
if (DATA_TYPE(obj) != type) {
40+
return NULL;
41+
}
42+
return DATA_PTR(obj);
43+
}
44+
3345
void *
3446
mrb_check_datatype(mrb_state *mrb, mrb_value obj, const struct mrb_data_type *type)
3547
{

src/gc.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,8 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
345345
break;
346346

347347
case MRB_TT_HASH:
348-
mrb_gc_mark_ht(mrb, (struct RClass*)obj);
348+
mrb_gc_mark_iv(mrb, (struct RObject*)obj);
349+
mrb_gc_mark_ht(mrb, (struct RHash*)obj);
349350
break;
350351

351352
case MRB_TT_STRING:
@@ -422,6 +423,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
422423
break;
423424

424425
case MRB_TT_HASH:
426+
mrb_gc_free_iv(mrb, (struct RObject*)obj);
425427
mrb_gc_free_ht(mrb, (struct RClass*)obj);
426428
break;
427429

@@ -530,7 +532,8 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
530532
break;
531533

532534
case MRB_TT_HASH:
533-
children += mrb_gc_mark_ht_size(mrb, (struct RClass*)obj);
535+
children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
536+
children += mrb_gc_mark_ht_size(mrb, (struct RHash*)obj);
534537
break;
535538

536539
case MRB_TT_PROC:

src/gc.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,16 @@ typedef struct {
2929
} as;
3030
} RVALUE;
3131

32+
void mrb_gc_mark_gv(mrb_state*);
33+
void mrb_gc_free_gv(mrb_state*);
34+
void mrb_gc_mark_iv(mrb_state*, struct RObject*);
35+
size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*);
36+
void mrb_gc_free_iv(mrb_state*, struct RObject*);
37+
void mrb_gc_mark_mt(mrb_state*, struct RClass*);
38+
size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*);
39+
void mrb_gc_free_mt(mrb_state*, struct RClass*);
40+
void mrb_gc_mark_ht(mrb_state*, struct RHash*);
41+
size_t mrb_gc_mark_ht_size(mrb_state*, struct RHash*);
42+
void mrb_gc_free_ht(mrb_state*, struct RHash*);
43+
3244
#endif /* MRUBY_GC_H */

0 commit comments

Comments
 (0)