Changeset 14136


Ignore:
Timestamp:
08/26/12 17:37:30 (8 years ago)
Author:
rschlatte
Message:

Refine #14135: now with less misleading error message

  • The upper bound of the INTEGER type is inclusive - ask for an integer between 0 and n-1
  • If the object has no slots at all, raise a program-error instead of a type-error
  • If the location argument has the wrong type, ask for an integer, not a more fancy type
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/StandardObject.java

    r14135 r14136  
    430430      final StandardObject instance = checkStandardObject(first);
    431431      final int index;
    432       if (second instanceof Fixnum)
    433         {
    434           index = ((Fixnum)second).value;
    435         }
    436       else
    437         {
     432      if (second instanceof Fixnum) {
     433        index = ((Fixnum)second).value;
     434      } else {
     435        return type_error(second, Symbol.INTEGER);
     436      }
     437
     438      LispObject value;
     439      try {
     440        value = instance.slots[index];
     441      } catch (ArrayIndexOutOfBoundsException e) {
     442        if (instance.slots.length > 0)
    438443          return type_error(second,
    439444                            list(Symbol.INTEGER, Fixnum.ZERO,
    440                                  Fixnum.getInstance(instance.slots.length)));
    441         }
    442       LispObject value;
    443       try
    444         {
    445           value = instance.slots[index];
    446         }
    447       catch (ArrayIndexOutOfBoundsException e)
    448         {
    449           return type_error(second,
    450                             list(Symbol.INTEGER, Fixnum.ZERO,
    451                                  Fixnum.getInstance(instance.slots.length)));
    452         }
     445                                 Fixnum.getInstance(instance.slots.length - 1)));
     446        else
     447          return error(new ProgramError("The object "
     448                                        + instance.princToString() +
     449                                        " has no slots."));
     450
     451      }
    453452      // We let UNBOUND_VALUE escape here, since invoking
    454453      // standard-instance-access on an unbound slot has undefined
     
    479478        index = ((Fixnum)second).value;
    480479      } else {
    481         return type_error(second,
    482                           list(Symbol.INTEGER, Fixnum.ZERO,
    483                                Fixnum.getInstance(instance.slots.length)));
    484       }
    485 
     480        return type_error(second, Symbol.INTEGER);
     481      }
    486482      try {
    487483        instance.slots[index] = third;
    488484      } catch (ArrayIndexOutOfBoundsException e) {
    489         return type_error(second,
    490                           list(Symbol.INTEGER, Fixnum.ZERO,
    491                                Fixnum.getInstance(instance.slots.length)));
     485        if (instance.slots.length > 0)
     486          return type_error(second,
     487                            list(Symbol.INTEGER, Fixnum.ZERO,
     488                                 Fixnum.getInstance(instance.slots.length - 1)));
     489        else
     490          return error(new ProgramError("The object "
     491                                        + instance.princToString() +
     492                                        " has no slots."));
     493
    492494      }
    493495      return third;
Note: See TracChangeset for help on using the changeset viewer.