Changeset 15481


Ignore:
Timestamp:
11/04/20 20:05:11 (2 years ago)
Author:
Mark Evenson
Message:

arrays: fix fail to reset position after relative access

The position of all buffers should always be zero. TODO how to
unintrusively make this assertion?

We fix new types specializing (or (unsigned-byte 8) (unsigned-byte
32)) in BasicVector_ByteBuffer, ComplexArray_ByteBuffer,
ComplexVector_ByteBuffer, and ComplexVector_IntBuffer for relative
accesses which always advance the position of the
underlying java.nio.Buffer subclass.

Fixes <https://github.com/armedbear/abcl/issues/345>.

Location:
trunk/abcl/src/org/armedbear/lisp
Files:
4 edited

Legend:

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

    r15359 r15481  
    8181    for (int i = array.length; i-- > 0;) {
    8282      // Faster please!
    83       elements.put((byte)coerceToJavaByte(array[i]));
     83      elements.put(i, (byte)coerceToJavaByte(array[i]));
    8484    }
    8585  }
     
    199199    try {
    200200      v.elements.put(view);
     201      v.elements.position(0);
    201202      return v;
    202203    } catch (BufferOverflowException e) {
  • trunk/abcl/src/org/armedbear/lisp/ComplexArray_ByteBuffer.java

    r15359 r15481  
    280280  public static void fill(ByteBuffer buffer, byte value) {
    281281    for (int i = 0; i < ((java.nio.Buffer)buffer).limit(); i++) {
    282       buffer.put(value);
     282      buffer.put(i, value);
    283283    }
    284284  }
  • trunk/abcl/src/org/armedbear/lisp/ComplexVector_ByteBuffer.java

    r15478 r15481  
    375375          newBuffer = ByteBuffer.allocate(minCapacity);
    376376        }
    377         newBuffer.put(elements);
     377        elements.position(0);
     378        newBuffer.put(elements);
     379        newBuffer.position(0);
    378380        elements = newBuffer;
    379381        capacity = minCapacity;
     
    460462        byte b = coerceToJavaByte(initialElement);
    461463        for (int i = capacity; i < newCapacity; i++) {
    462           elements.put(b);
     464          elements.put(i, b);
    463465        }
    464466      }
  • trunk/abcl/src/org/armedbear/lisp/ComplexVector_IntBuffer.java

    r15359 r15481  
    355355          newBuffer = IntBuffer.allocate(minCapacity);
    356356        }
     357        elements.position(0);
    357358        newBuffer.put(elements);
     359        newBuffer.position(0);
    358360        elements = newBuffer;
    359361        capacity = minCapacity;
     
    437439        newElements.put(elements.array(),
    438440                        0, Math.min(capacity, newCapacity));
     441        newElements.position(0);
    439442        elements = newElements;
    440443      }
Note: See TracChangeset for help on using the changeset viewer.