diff --git a/extlib/benz/include/picrin/reg.h b/extlib/benz/include/picrin/reg.h index c64c548f..73ebf069 100644 --- a/extlib/benz/include/picrin/reg.h +++ b/extlib/benz/include/picrin/reg.h @@ -26,6 +26,7 @@ pic_value pic_reg_ref(pic_state *, struct pic_reg *, void *); void pic_reg_set(pic_state *, struct pic_reg *, void *, pic_value); void pic_reg_del(pic_state *, struct pic_reg *, void *); bool pic_reg_has(pic_state *, struct pic_reg *, void *); +void *pic_reg_rev_ref(pic_state *, struct pic_reg *, pic_value); #if defined(__cplusplus) } diff --git a/extlib/benz/reg.c b/extlib/benz/reg.c index 655f3b08..a589b8ea 100644 --- a/extlib/benz/reg.c +++ b/extlib/benz/reg.c @@ -31,6 +31,22 @@ pic_reg_ref(pic_state *pic, struct pic_reg *reg, void *key) return kh_val(h, it); } +void * +pic_reg_rev_ref(pic_state *pic, struct pic_reg *reg, pic_value val) +{ + khash_t(reg) *h = ®->hash; + + if (h->n_buckets) { + khint_t i = 0; + while ((i < h->n_buckets) && (ac_iseither(h->flags, i) || !pic_eq_p(h->vals[i], val))) { + i += 1; + } + if (i < h->n_buckets) return kh_key(h, i); + } + pic_errorf(pic, "key not found for an element: ~s", val); + return NULL; +} + void pic_reg_set(pic_state PIC_UNUSED(*pic), struct pic_reg *reg, void *key, pic_value val) { diff --git a/extlib/benz/vm.c b/extlib/benz/vm.c index 3e383bef..3e73578d 100644 --- a/extlib/benz/vm.c +++ b/extlib/benz/vm.c @@ -198,9 +198,9 @@ vm_gref(pic_state *pic, struct pic_box *slot, pic_sym *uid) { if (pic_invalid_p(slot->value)) { if (uid == NULL) { - uid = pic_intern(pic, "unknown"); /* FIXME */ + uid = pic_reg_rev_ref(pic, pic->globals, pic_obj_value(slot)); } - pic_errorf(pic, "uninitialized global variable: ~a", pic_obj_value(uid)); + pic_errorf(pic, "uninitialized global variable: %s", pic_symbol_name(pic, uid)); } return slot->value; }