Two separate bugs:
1. The index checks should use && and not ||, or else they'll always be true. 2. The check in key_inc has an off-by-one error. Simon --- key.c.old Wed Jan 9 17:58:59 2002 +++ key.c Wed Jan 9 18:01:33 2002 @@ -225,7 +225,7 @@ INTVAL key_element_type(struct Parrot_Interp *interpreter, KEY* key, INTVAL idx) { if(key != NULL) { - if((idx >= 0) || (idx < key->size)) { + if((idx >= 0) && (idx < key->size)) { KEY_PAIR* pair = &key->keys[idx]; return pair->type; } @@ -248,7 +248,7 @@ KEY_PAIR* key_element_value_i(struct Parrot_Interp *interpreter, KEY* key, INTVAL idx) { if(key != NULL) { - if((idx >= 0) || (idx < key->size)) { + if((idx >= 0) && (idx < key->size)) { KEY_PAIR* pair = &key->keys[idx]; if(pair != NULL) { return pair; @@ -297,7 +297,7 @@ void key_set_element_value_i(struct Parrot_Interp *interpreter, KEY* key, INTVAL idx, KEY_PAIR* value) { if(key != NULL) { - if((idx >= 0) || (idx < key->size)) { + if((idx >= 0) && (idx < key->size)) { memcpy(&key->keys[idx],value,sizeof(KEY_PAIR)); } else { @@ -393,7 +393,7 @@ void key_inc(struct Parrot_Interp *interpreter, KEY* key, INTVAL idx) { if(key != NULL) { - if(idx > 0 && idx <= key->size) { + if((idx >= 0) && (idx < key->size)) { KEY_PAIR* pair = &key->keys[idx]; pair->type++; }