Skip to content

Commit

Permalink
Merge pull request #268 from b3b/empty_bytearray
Browse files Browse the repository at this point in the history
bytearray: fix #267 operations on empty arrays
  • Loading branch information
tito committed Aug 22, 2017
2 parents efe610b + d36d3b6 commit 406dd20
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
17 changes: 10 additions & 7 deletions jnius/jnius_nativetypes.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ cdef python_op(int op, object a, object b):
return a != b



cdef class ByteArray:
cdef LocalRef _jobject
cdef long _size
Expand Down Expand Up @@ -43,7 +42,8 @@ cdef class ByteArray:
self._jobject.create(env, obj)
self._size = size
self._buf = <unsigned char *><signed char *>buf
self._arr = <unsigned char[:size]>self._buf
if size:
self._arr = <unsigned char[:size]>self._buf

def __str__(self):
return '<ByteArray size={} at 0x{}>'.format(
Expand All @@ -56,17 +56,20 @@ cdef class ByteArray:
cdef long xx
if isinstance(index, slice):
val = []
(start, stop, step) = index.indices(len(self._arr))
for x in range(start, stop, step):
xx = x
val.append(self._arr[xx])
if self._size:
(start, stop, step) = index.indices(len(self._arr))
for x in range(start, stop, step):
xx = x
val.append(self._arr[xx])
return val
else:
xx = index
return self._arr[xx]

def __getslice__(self, long i, long j):
return self._arr[i:j]
if self._size:
return self._arr[i:j]
return []

def __richcmp__(self, other, op):
cdef ByteArray b_other
Expand Down
12 changes: 7 additions & 5 deletions jnius/jnius_nativetypes3.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ cdef class ByteArray:
self._jobject.create(env, obj)
self._size = size
self._buf = <unsigned char *><signed char *>buf
self._arr = <unsigned char[:size]>self._buf
if size:
self._arr = <unsigned char[:size]>self._buf

def __str__(self):
return '<ByteArray size={} at 0x{}>'.format(
Expand All @@ -53,10 +54,11 @@ cdef class ByteArray:
cdef long xx
if isinstance(index, slice):
val = []
(start, stop, step) = index.indices(len(self._arr))
for x in range(start, stop, step):
xx = x
val.append(self._arr[xx])
if self._size:
(start, stop, step) = index.indices(len(self._arr))
for x in range(start, stop, step):
xx = x
val.append(self._arr[xx])
return val
else:
xx = index
Expand Down
4 changes: 4 additions & 0 deletions tests/java-src/org/jnius/BasicsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,10 @@ public void fillByteArray(byte[] x) {
x[2] = -127;
}

public byte[] methodReturnEmptyByteArray() {
return new byte[0];
}

public boolean testFieldSetZ() {
return (fieldSetZ == true);
}
Expand Down
9 changes: 9 additions & 0 deletions tests/test_bytearray.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,12 @@ def test_bytearray_ascii(self):
self.assertEquals(nis.read(barr, 0, 256), 256)
self.assertEquals(barr[:256], s[:256])

def test_empty_bytearray(self):
Test = autoclass('org.jnius.BasicsTest')()
arr = Test.methodReturnEmptyByteArray()
self.assertEquals(len(arr), 0)
with self.assertRaises(IndexError):
arr[0]
self.assertEquals(arr, [])
self.assertEquals(arr[:1], [])
self.assertEquals(arr.tostring(), b'')

0 comments on commit 406dd20

Please sign in to comment.