Skip to content

Commit 92e08f1

Browse files
committed
MMap: fix readline
1 parent de8a4b1 commit 92e08f1

File tree

2 files changed

+21
-8
lines changed
  • graalpython

2 files changed

+21
-8
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_mmap.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,21 @@ def test_getitem():
206206
assert m[slice(-10, 100)] == b'\x02\x03\x04\x05\x06\x07\x08\t\n\x0b'
207207

208208

209+
def test_readline():
210+
m = mmap.mmap(-1, 9)
211+
for i in range(0, 9):
212+
m[i] = i
213+
m[4] = b'\n'[0]
214+
assert m.readline() == b'\x00\x01\x02\x03\n'
215+
assert m.readline() == b'\x05\x06\x07\x08'
216+
217+
m = mmap.mmap(-1, 1024 + 3)
218+
m[1024] = b'\n'[0]
219+
m[1025] = b'a'[0]
220+
m[1026] = b'b'[0]
221+
assert m.readline() == (b'\x00' * 1024) + b'\n'
222+
assert m.readline() == b'ab'
223+
209224

210225
def test_main():
211226
#run_unittest(MmapTests, LargeMmapTests)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mmap/MMapBuiltins.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -457,24 +457,22 @@ Object readline(VirtualFrame frame, PMMap self,
457457
// small buffer
458458
ByteSequenceStorage res = new ByteSequenceStorage(16);
459459
byte[] buffer = new byte[BUFFER_SIZE];
460-
long pos = self.getPos();
461460
int nread;
462-
outer: while (pos < self.getLength()) {
461+
outer: while (self.getPos() < self.getLength()) {
463462
try {
464-
nread = posixLib.mmapReadBytes(getPosixSupport(), self.getPosixSupportHandle(), pos, buffer, buffer.length);
463+
nread = posixLib.mmapReadBytes(getPosixSupport(), self.getPosixSupportHandle(), self.getPos(), buffer, (int) Math.min(self.getRemaining(), buffer.length));
465464
} catch (PosixException e) {
466465
throw raiseOSErrorFromPosixException(frame, e);
467466
}
468467
for (int i = 0; i < nread; i++) {
469468
byte b = buffer[i];
470-
if (b != '\n') {
471-
appendNode.execute(res, b, BytesLikeNoGeneralizationNode.SUPPLIER);
472-
} else {
473-
self.setPos(pos + i - 1);
469+
appendNode.execute(res, b, BytesLikeNoGeneralizationNode.SUPPLIER);
470+
if (b == '\n') {
471+
self.setPos(self.getPos() + i + 1);
474472
break outer;
475473
}
476474
}
477-
pos += nread;
475+
self.setPos(self.getPos() + nread);
478476
}
479477
return factory().createBytes(res);
480478
}

0 commit comments

Comments
 (0)