Merge pull request #313 from dcurrie/master

Better error reporting for uninitialized global.
This commit is contained in:
Yuichi Nishiwaki 2015-12-28 01:09:45 +09:00
commit 75246336e8
3 changed files with 19 additions and 2 deletions

View File

@ -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_set(pic_state *, struct pic_reg *, void *, pic_value);
void pic_reg_del(pic_state *, struct pic_reg *, void *); void pic_reg_del(pic_state *, struct pic_reg *, void *);
bool pic_reg_has(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) #if defined(__cplusplus)
} }

View File

@ -31,6 +31,22 @@ pic_reg_ref(pic_state *pic, struct pic_reg *reg, void *key)
return kh_val(h, it); return kh_val(h, it);
} }
void *
pic_reg_rev_ref(pic_state *pic, struct pic_reg *reg, pic_value val)
{
khash_t(reg) *h = &reg->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 void
pic_reg_set(pic_state PIC_UNUSED(*pic), struct pic_reg *reg, void *key, pic_value val) pic_reg_set(pic_state PIC_UNUSED(*pic), struct pic_reg *reg, void *key, pic_value val)
{ {

View File

@ -198,9 +198,9 @@ vm_gref(pic_state *pic, struct pic_box *slot, pic_sym *uid)
{ {
if (pic_invalid_p(slot->value)) { if (pic_invalid_p(slot->value)) {
if (uid == NULL) { 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; return slot->value;
} }