Skip to content

Commit d378bb3

Browse files
committed
Fix list/bytearray.reverse with native storage
1 parent a2bd695 commit d378bb3

File tree

14 files changed

+114
-34
lines changed

14 files changed

+114
-34
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@
3636
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
39-
import sys
4039

4140
from array import array
4241

42+
from tests.util import storage_to_native
43+
4344

4445
def assert_raises(err, fn, *args, **kwargs):
4546
raised = False
@@ -102,9 +103,7 @@ def test_add_int_to_long_array():
102103

103104
def test_array_native_storage():
104105
a = array('l', [1, 2, 3])
105-
if sys.implementation.name == 'graalpy':
106-
assert hasattr(__graalpython__, 'storage_to_native'), "Needs to be run with --python.EnableDebuggingBuiltins"
107-
__graalpython__.storage_to_native(a)
106+
storage_to_native(a)
108107
assert a[1] == 2
109108
a[1] = 3
110109
assert a == array('l', [1, 3, 3])

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
3939

40-
import unittest
4140
import sys
41+
import unittest
42+
43+
from tests.util import storage_to_native
44+
4245

4346
def assert_raises(err, fn, *args, **kwargs):
4447
raised = False
@@ -107,6 +110,10 @@ def test_reverse():
107110
assert not b
108111
b.reverse()
109112
assert not b
113+
b = bytearray(b'hello')
114+
storage_to_native(b)
115+
b.reverse()
116+
assert b == b'olleh'
110117

111118

112119
def test_clear():

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
#
44
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
55

6-
import seq_tests
76
import sys
87
import unittest
8+
9+
from tests.util import storage_to_native
10+
911
# import pickle
1012

1113
LONG_NUMBER = 6227020800;
@@ -840,6 +842,14 @@ def test_generalize_store(self):
840842
l += [0x100000000, 'a']
841843
self.assertEqual([1, 0x100000000, 'a'], l)
842844

845+
def test_reverse(self):
846+
l = [1, 2, 3]
847+
self.assertEqual(None, l.reverse())
848+
self.assertEqual([3, 2, 1], l)
849+
storage_to_native(l)
850+
l.reverse()
851+
self.assertEqual([1, 2, 3], l)
852+
843853

844854
if __name__ == '__main__':
845855
unittest.main()

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
3939
import socket
40-
import sys
4140
import threading
4241
import unittest
4342

43+
from tests.util import storage_to_native
44+
4445

4546
def test_inet_aton():
4647
assert socket.inet_aton('127.255.1.2') == bytes([127, 255, 1, 2])
@@ -90,9 +91,7 @@ def server():
9091
buffer = memoryview(b)[1:]
9192
sock.recv_into(buffer, 1)
9293
assert b == b'12a'
93-
if sys.implementation.name == 'graalpy':
94-
assert hasattr(__graalpython__, 'storage_to_native'), "Needs to be run with --python.EnableDebuggingBuiltins"
95-
__graalpython__.storage_to_native(b)
94+
storage_to_native(b)
9695
# Native buffer, no internal array
9796
buffer = memoryview(buffer)[1:]
9897
sock.recv_into(buffer, 1)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import sys
2+
3+
4+
def storage_to_native(s):
5+
if sys.implementation.name == 'graalpy':
6+
assert hasattr(__graalpython__, 'storage_to_native'), "Needs to be run with --python.EnableDebuggingBuiltins"
7+
__graalpython__.storage_to_native(s)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,8 +686,10 @@ static PByteArray copy(PByteArray byteArray,
686686
public abstract static class ReverseNode extends PythonBuiltinNode {
687687

688688
@Specialization
689-
static PNone reverse(PByteArray byteArray) {
690-
byteArray.reverse();
689+
static PNone reverse(PByteArray byteArray,
690+
@Bind("this") Node inliningTarget,
691+
@Cached SequenceStorageNodes.ReverseNode reverseNode) {
692+
reverseNode.execute(inliningTarget, byteArray.getSequenceStorage());
691693
return PNone.NONE;
692694
}
693695
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PByteArray.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,6 @@ public String formatByteArray(String typeName) {
8484
}
8585
}
8686

87-
public final void reverse() {
88-
store.reverse();
89-
}
90-
9187
public long getExports() {
9288
return exports;
9389
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,6 +1235,77 @@ protected static boolean isBasicSequenceStorage(Object o) {
12351235
}
12361236
}
12371237

1238+
@GenerateUncached
1239+
@GenerateInline
1240+
@GenerateCached(false)
1241+
@ImportStatic(SequenceStorageBaseNode.class)
1242+
public abstract static class ReverseNode extends Node {
1243+
1244+
public abstract void execute(Node inliningTarget, SequenceStorage storage);
1245+
1246+
@Specialization
1247+
static void doEmpty(@SuppressWarnings("unused") EmptySequenceStorage storage) {
1248+
}
1249+
1250+
@Specialization(limit = "MAX_ARRAY_STORAGES", guards = "storage.getClass() == cachedClass")
1251+
static void doBasic(BasicSequenceStorage storage,
1252+
@Cached("storage.getClass()") Class<? extends BasicSequenceStorage> cachedClass) {
1253+
cachedClass.cast(storage).reverse();
1254+
}
1255+
1256+
@Specialization
1257+
@InliningCutoff
1258+
static void doNative(NativeSequenceStorage storage,
1259+
@Cached(inline = false) ReverseNativeNode reverseNativeNode) {
1260+
reverseNativeNode.execute(storage);
1261+
}
1262+
1263+
@GenerateUncached
1264+
@GenerateInline(false)
1265+
abstract static class ReverseNativeNode extends Node {
1266+
1267+
abstract void execute(NativeSequenceStorage storage);
1268+
1269+
@Specialization
1270+
static void doNativeByte(NativeByteSequenceStorage storage,
1271+
@Cached CStructAccess.ReadByteNode readByteNode,
1272+
@Cached CStructAccess.WriteByteNode writeByteNode) {
1273+
int length = storage.length();
1274+
if (length > 0) {
1275+
int head = 0;
1276+
int tail = length - 1;
1277+
int middle = (length - 1) / 2;
1278+
Object ptr = storage.getPtr();
1279+
1280+
for (; head <= middle; head++, tail--) {
1281+
byte temp = readByteNode.readArrayElement(ptr, head);
1282+
writeByteNode.writeArrayElement(ptr, head, readByteNode.readArrayElement(ptr, tail));
1283+
writeByteNode.writeArrayElement(ptr, tail, temp);
1284+
}
1285+
}
1286+
}
1287+
1288+
@Specialization
1289+
static void doNativeObject(NativeObjectSequenceStorage storage,
1290+
@Cached CStructAccess.ReadPointerNode readPointerNode,
1291+
@Cached CStructAccess.WritePointerNode writePointerNode) {
1292+
int length = storage.length();
1293+
if (length > 0) {
1294+
int head = 0;
1295+
int tail = length - 1;
1296+
int middle = (length - 1) / 2;
1297+
Object ptr = storage.getPtr();
1298+
1299+
for (; head <= middle; head++, tail--) {
1300+
Object temp = readPointerNode.readArrayElement(ptr, head);
1301+
writePointerNode.writeArrayElement(ptr, head, readPointerNode.readArrayElement(ptr, tail));
1302+
writePointerNode.writeArrayElement(ptr, tail, temp);
1303+
}
1304+
}
1305+
}
1306+
}
1307+
}
1308+
12381309
@GenerateUncached
12391310
@ImportStatic(SequenceStorageBaseNode.class)
12401311
@SuppressWarnings("truffle-inlining") // footprint reduction 92 -> 75

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -805,9 +805,11 @@ static PNone clear(PList list) {
805805
public abstract static class ListReverseNode extends PythonUnaryBuiltinNode {
806806

807807
@Specialization
808-
static PList reverse(PList list) {
809-
list.reverse();
810-
return list;
808+
static PNone reverse(PList list,
809+
@Bind("this") Node inliningTarget,
810+
@Cached SequenceStorageNodes.ReverseNode reverseNode) {
811+
reverseNode.execute(inliningTarget, list.getSequenceStorage());
812+
return PNone.NONE;
811813
}
812814

813815
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ public final String toString() {
8585
return store.toString();
8686
}
8787

88-
public final void reverse() {
89-
store.reverse();
90-
}
91-
9288
@Ignore
9389
@Override
9490
public final boolean equals(Object other) {

0 commit comments

Comments
 (0)