Skip to content

Commit 6350234

Browse files
committed
Remove method 'SequenceStorage.extend'.
1 parent ab58716 commit 6350234

18 files changed

+82
-481
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/runtime/SequenceStorageTests.java

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -109,19 +109,6 @@ public void objectAppend() {
109109
assertEquals(7, store.length());
110110
}
111111

112-
@Test
113-
public void objectExtend() {
114-
ObjectSequenceStorage store = new ObjectSequenceStorage(getObjectValues());
115-
ObjectSequenceStorage other = new ObjectSequenceStorage(getObjectValues());
116-
store.extend(other);
117-
118-
for (int i = 6; i < 12; i++) {
119-
assertEquals(i - 5, store.getItemNormalized(i));
120-
}
121-
122-
assertEquals(12, store.length());
123-
}
124-
125112
/**
126113
* IntSequenceStorage tests.
127114
*/
@@ -147,18 +134,6 @@ public void intGetSlice() {
147134
}
148135
}
149136

150-
@Test
151-
public void intSetSlice() throws SequenceStoreException {
152-
IntSequenceStorage store = new IntSequenceStorage(getIntValues());
153-
IntSequenceStorage slice = new IntSequenceStorage(new int[]{42, 42, 42});
154-
155-
store.setSliceInBound(1, 4, 1, slice);
156-
157-
for (int i = 1; i < 4; i++) {
158-
assertEquals(42, store.getItemNormalized(i));
159-
}
160-
}
161-
162137
@Test
163138
public void intSetSliceOutOfBound() throws SequenceStoreException {
164139
IntSequenceStorage store = new IntSequenceStorage(getIntValues());
@@ -201,17 +176,4 @@ public void intAppend() throws SequenceStoreException {
201176
assertEquals(7, store.length());
202177
}
203178

204-
@Test
205-
public void intExtend() throws SequenceStoreException {
206-
IntSequenceStorage store = new IntSequenceStorage(getIntValues());
207-
IntSequenceStorage other = new IntSequenceStorage(getIntValues());
208-
store.extend(other);
209-
210-
for (int i = 6; i < 12; i++) {
211-
assertEquals(i - 5, store.getItemNormalized(i));
212-
}
213-
214-
assertEquals(12, store.length());
215-
}
216-
217179
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,28 +299,39 @@ def test_set_slice(self):
299299
a = [1, 2]
300300
a[1:2] = [7, 6, 5, 4]
301301
self.assertEqual([1, 7, 6, 5, 4], a)
302+
302303
a = [1, 2, 3, 4]
303304
a[1:8] = [33]
304305
self.assertEqual([1, 33], a)
306+
305307
a = [1, 2, 3, 4]
306308
a[1:8] = [33, 34, 35, 36, 37, 38]
307309
self.assertEqual([1, 33, 34, 35, 36, 37, 38], a)
310+
308311
a = list(range(20))
309312
a[1:19] = [55, 55]
310313
self.assertEqual([0, 55, 55, 19], a)
314+
311315
a = [1, 2, 3, 4]
312316
a[1:3] = [11]
313317
self.assertEqual([1, 11, 4], a)
318+
314319
a = [1, 2, 3, 4]
315320
a[1:3] = [11, 12, 13, 14, 15, 16]
316321
self.assertEqual([1, 11, 12, 13, 14, 15, 16, 4], a)
322+
317323
a = [1, 2]
318324
a[:] = (1, 2, 4, 5)
319325
self.assertEqual([1, 2, 4, 5], a)
326+
320327
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
321328
a[0:10:2] = [10, 30, 50, 70, 90]
322329
self.assertEqual([10, 2, 30, 4, 50, 6, 70, 8, 90, 10], a)
323330

331+
a = [1, 2, 3, 4, 5, 6]
332+
a[1:4:1] = [42, 42, 42]
333+
self.assertEqual([1, 42, 42, 42, 5, 6], a)
334+
324335
def test_set_slice_class_iter(self):
325336

326337
class MyIter():
@@ -396,6 +407,21 @@ def test_extend_spec(self):
396407
a.extend('ahoj')
397408
self.assertEqual(['a', 'h', 'o', 'j'], a)
398409

410+
def test_extend(self):
411+
a = [1, 2, 3, 4, 5, 6]
412+
b = [1, 2, 3, 4, 5, 6]
413+
a.extend(b)
414+
self.assertEqual([1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6], a)
415+
416+
a = ["a", "b", "c"]
417+
b = ["a", "b", "c"]
418+
a.extend(b)
419+
self.assertEqual(["a", "b", "c", "a", "b", "c"], a)
420+
421+
a = []
422+
a.extend([])
423+
self.assertEqual([], a)
424+
399425
def test_extend_bytes(self):
400426
l = []
401427
l.extend(b"asdf")

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

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetItemNodeGen;
8282
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetItemScalarNodeGen;
8383
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetItemSliceNodeGen;
84+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.LenNodeGen;
8485
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ListGeneralizationNodeGen;
8586
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.NoGeneralizationNodeGen;
8687
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.NormalizeIndexNodeGen;
@@ -148,6 +149,8 @@ abstract static class SequenceStorageBaseNode extends PBaseNode {
148149

149150
protected static final int DEFAULT_CAPACITY = 8;
150151

152+
protected static final int MAX_SEQUENCE_STORAGES = 12;
153+
151154
protected static boolean isByteStorage(NativeSequenceStorage store) {
152155
return store.getElementType() == ListStorageType.Byte;
153156
}
@@ -2079,6 +2082,8 @@ public static ExtendNode create(Supplier<GeneralizationNode> genNodeProvider) {
20792082
}
20802083

20812084
public abstract static class RepeatNode extends SequenceStorageBaseNode {
2085+
private static final String ERROR_MSG = "can't multiply sequence by non-int of type '%p'";
2086+
20822087
@Child private SetItemScalarNode setItemNode;
20832088
@Child private GetItemScalarNode getItemNode;
20842089
@Child private GetItemScalarNode getRightItemNode;
@@ -2090,14 +2095,19 @@ public abstract static class RepeatNode extends SequenceStorageBaseNode {
20902095

20912096
public abstract SequenceStorage execute(SequenceStorage left, int times);
20922097

2098+
@Specialization
2099+
SequenceStorage doEmpty(EmptySequenceStorage s, @SuppressWarnings("unused") int times) {
2100+
return s;
2101+
}
2102+
20932103
@Specialization(guards = "times <= 0")
2094-
SequenceStorage doGeneric(SequenceStorage s, @SuppressWarnings("unused") int times,
2104+
SequenceStorage doZeroRepeat(SequenceStorage s, @SuppressWarnings("unused") int times,
20952105
@Cached("createClassProfile()") ValueProfile storageTypeProfile) {
20962106
return storageTypeProfile.profile(s).createEmpty(0);
20972107
}
20982108

2099-
@Specialization(limit = "2", guards = {"!isNative(s)", "s.getClass() == cachedClass"})
2100-
SequenceStorage doManaged(SequenceStorage s, int times,
2109+
@Specialization(limit = "2", guards = {"times > 0", "!isNative(s)", "s.getClass() == cachedClass"})
2110+
SequenceStorage doManaged(BasicSequenceStorage s, int times,
21012111
@Cached("create()") BranchProfile outOfMemProfile,
21022112
@Cached("s.getClass()") Class<? extends SequenceStorage> cachedClass) {
21032113
try {
@@ -2115,18 +2125,20 @@ SequenceStorage doManaged(SequenceStorage s, int times,
21152125
}
21162126
}
21172127

2118-
@Specialization(replaces = "doManaged")
2128+
@Specialization(replaces = "doManaged", limit = "2", guards = {"times > 0", "s.getClass() == cachedClass"})
21192129
SequenceStorage doGeneric(SequenceStorage s, int times,
2120-
@Cached("create()") BranchProfile outOfMemProfile) {
2130+
@Cached("create()") BranchProfile outOfMemProfile,
2131+
@Cached("s.getClass()") Class<? extends SequenceStorage> cachedClass) {
21212132
try {
2122-
int len = s.length();
2133+
SequenceStorage profiled = cachedClass.cast(s);
2134+
int len = profiled.length();
21232135

21242136
ObjectSequenceStorage repeated = new ObjectSequenceStorage(Math.multiplyExact(len, times));
21252137

21262138
// TODO avoid temporary array
21272139
Object[] values = new Object[len];
21282140
for (int i = 0; i < len; i++) {
2129-
values[i] = getGetItemNode().execute(s, i);
2141+
values[i] = getGetItemNode().execute(profiled, i);
21302142
}
21312143

21322144
Object destArr = repeated.getInternalArrayObject();
@@ -2138,10 +2150,11 @@ SequenceStorage doGeneric(SequenceStorage s, int times,
21382150
}
21392151
}
21402152

2141-
@Fallback
2142-
SequenceStorage doGeneric(SequenceStorage s, Object times) {
2153+
@Specialization(guards = "!isInt(times)")
2154+
SequenceStorage doNonInt(SequenceStorage s, Object times) {
21432155
int i = toIndex(times);
21442156
if (recursive == null) {
2157+
CompilerDirectives.transferToInterpreterAndInvalidate();
21452158
recursive = insert(RepeatNodeGen.create());
21462159
}
21472160
return recursive.execute(s, i);
@@ -2162,6 +2175,10 @@ private static void repeat(Object dest, Object src, int len, int times) {
21622175
}
21632176
}
21642177

2178+
protected static boolean isInt(Object times) {
2179+
return times instanceof Integer;
2180+
}
2181+
21652182
private int toIndex(Object times) {
21662183
if (isIndexNode == null) {
21672184
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -2170,11 +2187,11 @@ private int toIndex(Object times) {
21702187
if (isIndexNode.execute(times)) {
21712188
if (castToindexNode == null) {
21722189
CompilerDirectives.transferToInterpreterAndInvalidate();
2173-
castToindexNode = insert(CastToIndexNode.create());
2190+
castToindexNode = insert(CastToIndexNode.createOverflow());
21742191
}
21752192
return castToindexNode.execute(times);
21762193
}
2177-
throw raise(TypeError, "can't multiply sequence by non-int of type '%p'", times);
2194+
throw raise(TypeError, ERROR_MSG, times);
21782195
}
21792196

21802197
public static RepeatNode create() {
@@ -2590,7 +2607,7 @@ EmptySequenceStorage doEmpty(EmptySequenceStorage s, @SuppressWarnings("unused")
25902607
return s;
25912608
}
25922609

2593-
@Specialization(limit = "9", guards = "s.getClass() == cachedClass")
2610+
@Specialization(limit = "MAX_SEQUENCE_STORAGES", guards = "s.getClass() == cachedClass")
25942611
BasicSequenceStorage doManaged(BasicSequenceStorage s, int cap,
25952612
@Cached("create()") BranchProfile overflowErrorProfile,
25962613
@Cached("s.getClass()") Class<? extends BasicSequenceStorage> cachedClass) {
@@ -2616,4 +2633,19 @@ public static EnsureCapacityNode create() {
26162633
}
26172634

26182635
}
2636+
2637+
public abstract static class LenNode extends SequenceStorageBaseNode {
2638+
2639+
public abstract int execute(SequenceStorage s);
2640+
2641+
@Specialization(limit = "MAX_SEQUENCE_STORAGES", guards = "s.getClass() == cachedClass")
2642+
int doSpecial(SequenceStorage s,
2643+
@Cached("s.getClass()") Class<? extends SequenceStorage> cachedClass) {
2644+
return cachedClass.cast(s).length();
2645+
}
2646+
2647+
public static LenNode create() {
2648+
return LenNodeGen.create();
2649+
}
2650+
}
26192651
}

0 commit comments

Comments
 (0)