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++;
}