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

Reply via email to