call kh_get before kh_put to avoid potential key lost; reported by @mirichi

parent ef9daf7e
...@@ -313,7 +313,10 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RPro ...@@ -313,7 +313,10 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RPro
khiter_t k; khiter_t k;
if (!h) h = c->mt = kh_init(mt, mrb); if (!h) h = c->mt = kh_init(mt, mrb);
k = kh_get(mt, mrb, h, mid);
if (k == kh_end(h)) {
k = kh_put(mt, mrb, h, mid); k = kh_put(mt, mrb, h, mid);
}
kh_value(h, k) = p; kh_value(h, k) = p;
if (p) { if (p) {
mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
...@@ -346,7 +349,10 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b ...@@ -346,7 +349,10 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b
struct RProc *p; struct RProc *p;
if (!h) h = c->mt = kh_init(mt, mrb); if (!h) h = c->mt = kh_init(mt, mrb);
k = kh_get(mt, mrb, h, name);
if (k == kh_end(h)) {
k = kh_put(mt, mrb, h, name); k = kh_put(mt, mrb, h, name);
}
p = mrb_proc_ptr(body); p = mrb_proc_ptr(body);
kh_value(h, k) = p; kh_value(h, k) = p;
if (p) { if (p) {
......
...@@ -308,7 +308,10 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val) ...@@ -308,7 +308,10 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
khash_t(iv) *h = &t->h; khash_t(iv) *h = &t->h;
khiter_t k; khiter_t k;
k = kh_put(iv, mrb, h, sym); k = kh_get(mt, mrb, h, sym);
if (k == kh_end(h)) {
k = kh_put(mt, mrb, h, sym);
}
kh_value(h, k) = val; kh_value(h, k) = val;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment