Skip to content

Commit 8959815

Browse files
committed
Remove method 'PList.append'.
1 parent 2239f80 commit 8959815

File tree

5 files changed

+84
-43
lines changed

5 files changed

+84
-43
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
import com.oracle.graal.python.builtins.objects.function.PKeyword;
9494
import com.oracle.graal.python.builtins.objects.function.PythonCallable;
9595
import com.oracle.graal.python.builtins.objects.ints.PInt;
96+
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListAppendNode;
9697
import com.oracle.graal.python.builtins.objects.list.PList;
9798
import com.oracle.graal.python.builtins.objects.method.PMethod;
9899
import com.oracle.graal.python.builtins.objects.module.PythonModule;
@@ -366,6 +367,8 @@ public Object hash(Object object,
366367
@Builtin(name = DIR, minNumOfPositionalArgs = 0, maxNumOfPositionalArgs = 1)
367368
@GenerateNodeFactory
368369
public abstract static class DirNode extends PythonBuiltinNode {
370+
@Child private ListAppendNode appendNode;
371+
369372
@Specialization(guards = "isNoValue(object)")
370373
@SuppressWarnings("unused")
371374
public Object dir(VirtualFrame frame, Object object) {
@@ -376,13 +379,13 @@ public Object dir(VirtualFrame frame, Object object) {
376379
}
377380

378381
@TruffleBoundary
379-
private static void addIdsFromDescriptor(PList locals, FrameDescriptor frameDescriptor) {
382+
private void addIdsFromDescriptor(PList locals, FrameDescriptor frameDescriptor) {
380383
for (FrameSlot slot : frameDescriptor.getSlots()) {
381384
// XXX: remove this special case
382385
if (slot.getIdentifier().equals(RETURN_SLOT_ID)) {
383386
continue;
384387
}
385-
locals.append(slot.getIdentifier());
388+
getAppendNode().execute(locals, slot.getIdentifier());
386389
}
387390
}
388391

@@ -391,6 +394,14 @@ public Object dir(Object object,
391394
@Cached("create(__DIR__)") LookupAndCallUnaryNode dirNode) {
392395
return dirNode.executeObject(object);
393396
}
397+
398+
private ListAppendNode getAppendNode() {
399+
if (appendNode == null) {
400+
CompilerDirectives.transferToInterpreterAndInvalidate();
401+
appendNode = insert(ListAppendNode.create());
402+
}
403+
return appendNode;
404+
}
394405
}
395406

396407
// divmod(a, b)

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
import com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator;
6767
import com.oracle.graal.python.builtins.objects.iterator.PLongSequenceIterator;
6868
import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
69+
import com.oracle.graal.python.builtins.objects.list.ListBuiltinsFactory.ListAppendNodeFactory;
70+
import com.oracle.graal.python.builtins.objects.list.ListBuiltinsFactory.ListReverseNodeFactory;
6971
import com.oracle.graal.python.builtins.objects.slice.PSlice;
7072
import com.oracle.graal.python.builtins.objects.str.PString;
7173
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
@@ -369,6 +371,10 @@ public PNone appendObjectGeneric(PList list, Object arg,
369371
protected static SequenceStorageNodes.AppendNode createAppend() {
370372
return SequenceStorageNodes.AppendNode.create(() -> ListGeneralizationNode.create());
371373
}
374+
375+
public static ListAppendNode create() {
376+
return ListAppendNodeFactory.create();
377+
}
372378
}
373379

374380
// list.extend(L)
@@ -872,13 +878,17 @@ public PNone clear(PList list) {
872878
// list.reverse()
873879
@Builtin(name = "reverse", fixedNumOfPositionalArgs = 1)
874880
@GenerateNodeFactory
875-
public abstract static class ListReverseNode extends PythonBuiltinNode {
881+
public abstract static class ListReverseNode extends PythonUnaryBuiltinNode {
876882

877883
@Specialization
878-
public PList reverse(PList list) {
884+
PList reverse(PList list) {
879885
list.reverse();
880886
return list;
881887
}
888+
889+
public static ListReverseNode create() {
890+
return ListReverseNodeFactory.create();
891+
}
882892
}
883893

884894
@Builtin(name = __LEN__, fixedNumOfPositionalArgs = 1)

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

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import com.oracle.graal.python.builtins.objects.slice.PSlice;
2929
import com.oracle.graal.python.builtins.objects.type.PythonClass;
3030
import com.oracle.graal.python.runtime.sequence.PSequence;
31-
import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
3231
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
3332
import com.oracle.graal.python.runtime.sequence.storage.SequenceStoreException;
3433
import com.oracle.truffle.api.CompilerDirectives;
@@ -87,24 +86,6 @@ public final void reverse() {
8786
store.reverse();
8887
}
8988

90-
public final void append(Object value) {
91-
if (store instanceof EmptySequenceStorage) {
92-
store = store.generalizeFor(value, null);
93-
}
94-
95-
try {
96-
store.append(value);
97-
} catch (SequenceStoreException e) {
98-
store = store.generalizeFor(value, null);
99-
100-
try {
101-
store.append(value);
102-
} catch (SequenceStoreException e1) {
103-
throw new IllegalStateException();
104-
}
105-
}
106-
}
107-
10889
public final void insert(int index, Object value) {
10990
try {
11091
store.insertItem(index, value);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
import com.oracle.graal.python.builtins.objects.dict.PDict;
6969
import com.oracle.graal.python.builtins.objects.ints.PInt;
7070
import com.oracle.graal.python.builtins.objects.iterator.PStringIterator;
71+
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListAppendNode;
72+
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListReverseNode;
7173
import com.oracle.graal.python.builtins.objects.list.PList;
7274
import com.oracle.graal.python.builtins.objects.slice.PSlice;
7375
import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo;
@@ -80,6 +82,7 @@
8082
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
8183
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
8284
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
85+
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
8386
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
8487
import com.oracle.graal.python.nodes.object.GetClassNode;
8588
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
@@ -771,27 +774,51 @@ public String lower(String self) {
771774
public abstract static class RPartitionNode extends PythonBuiltinNode {
772775
@Specialization
773776
@TruffleBoundary
774-
public PList doSplit(String self, String sep) {
777+
public PList doSplit(String self, String sep,
778+
@Cached("create()") ListAppendNode appendNode) {
775779
int lastIndexOf = self.lastIndexOf(sep);
776780
PList list = factory().createList();
777781
if (lastIndexOf == -1) {
778-
list.append("");
779-
list.append("");
780-
list.append(self);
782+
appendNode.execute(list, "");
783+
appendNode.execute(list, "");
784+
appendNode.execute(list, self);
781785
} else {
782-
list.append(self.substring(0, lastIndexOf));
783-
list.append(sep);
784-
list.append(self.substring(lastIndexOf + sep.length()));
786+
appendNode.execute(list, self.substring(0, lastIndexOf));
787+
appendNode.execute(list, sep);
788+
appendNode.execute(list, self.substring(lastIndexOf + sep.length()));
785789
}
786790
return list;
787791
}
788792
}
789793

794+
protected abstract static class SplitBaseNode extends PythonTernaryBuiltinNode {
795+
796+
@Child private ListAppendNode appendNode;
797+
@Child private ListReverseNode reverseNode;
798+
799+
protected ListAppendNode getAppendNode() {
800+
if (appendNode == null) {
801+
CompilerDirectives.transferToInterpreterAndInvalidate();
802+
appendNode = insert(ListAppendNode.create());
803+
}
804+
return appendNode;
805+
}
806+
807+
protected ListReverseNode getReverseNode() {
808+
if (reverseNode == null) {
809+
CompilerDirectives.transferToInterpreterAndInvalidate();
810+
reverseNode = insert(ListReverseNode.create());
811+
}
812+
return reverseNode;
813+
}
814+
815+
}
816+
790817
// str.split
791818
@Builtin(name = "split", maxNumOfPositionalArgs = 3)
792819
@GenerateNodeFactory
793820
@TypeSystemReference(PythonArithmeticTypes.class)
794-
public abstract static class SplitNode extends PythonBuiltinNode {
821+
public abstract static class SplitNode extends SplitBaseNode {
795822

796823
@SuppressWarnings("unused")
797824
@Specialization
@@ -806,7 +833,7 @@ public PList doSplit(String self, String sep, PNone maxsplit) {
806833
PList list = factory().createList();
807834
String[] strs = self.split(Pattern.quote(sep));
808835
for (String s : strs) {
809-
list.append(s);
836+
getAppendNode().execute(list, s);
810837
}
811838
return list;
812839
}
@@ -819,7 +846,7 @@ public PList doSplit(String self, String sep, int maxsplit) {
819846
// parts
820847
String[] strs = self.split(Pattern.quote(sep), maxsplit + 1);
821848
for (String s : strs) {
822-
list.append(s);
849+
getAppendNode().execute(list, s);
823850
}
824851
return list;
825852
}
@@ -883,7 +910,7 @@ private PList splitfields(String s, int maxsplit) {
883910
}
884911

885912
// Make a piece from start up to index
886-
list.append(s.substring(start, index));
913+
getAppendNode().execute(list, s.substring(start, index));
887914
splits++;
888915

889916
// Start next segment search at that point
@@ -898,7 +925,7 @@ private PList splitfields(String s, int maxsplit) {
898925
@Builtin(name = "rsplit", maxNumOfPositionalArgs = 3)
899926
@GenerateNodeFactory
900927
@TypeSystemReference(PythonArithmeticTypes.class)
901-
public abstract static class RSplitNode extends PythonBuiltinNode {
928+
public abstract static class RSplitNode extends SplitBaseNode {
902929

903930
@SuppressWarnings("unused")
904931
@Specialization
@@ -912,8 +939,9 @@ public PList doSplit(String self, PNone sep, PNone maxsplit) {
912939
public PList doSplit(String self, String sep, PNone maxsplit) {
913940
PList list = factory().createList();
914941
String[] strs = self.split(Pattern.quote(sep));
915-
for (String s : strs)
916-
list.append(s);
942+
for (String s : strs) {
943+
getAppendNode().execute(list, s);
944+
}
917945
return list;
918946
}
919947

@@ -930,17 +958,17 @@ public PList doSplit(String self, String sep, int maxsplit) {
930958
break;
931959
}
932960

933-
list.append(self.substring(idx + 1, end));
961+
getAppendNode().execute(list, self.substring(idx + 1, end));
934962
end = idx;
935963
splits++;
936964
remainder = remainder.substring(0, end);
937965
}
938966

939967
if (!remainder.isEmpty()) {
940-
list.append(remainder);
968+
getAppendNode().execute(list, remainder);
941969
}
942970

943-
list.reverse();
971+
getReverseNode().execute(list);
944972
return list;
945973
}
946974

@@ -1003,14 +1031,14 @@ private PList rsplitfields(String s, int maxsplit) {
10031031
}
10041032

10051033
// Make a piece from start up to index
1006-
list.append(s.substring(index + 1, end + 1));
1034+
getAppendNode().execute(list, s.substring(index + 1, end + 1));
10071035
splits++;
10081036

10091037
// Start next segment search at that point
10101038
end = index;
10111039
}
10121040

1013-
list.reverse();
1041+
getReverseNode().execute(list);
10141042
return list;
10151043
}
10161044
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.oracle.graal.python.builtins.objects.PNone;
5353
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode;
5454
import com.oracle.graal.python.builtins.objects.ints.PInt;
55+
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListAppendNode;
5556
import com.oracle.graal.python.builtins.objects.list.PList;
5657
import com.oracle.graal.python.builtins.objects.slice.PSlice;
5758
import com.oracle.graal.python.builtins.objects.str.PString;
@@ -294,6 +295,8 @@ private SequenceStorage genericFallback(Object iterator, Object array, int count
294295
@ImportStatic({PGuards.class, SpecialMethodNames.class})
295296
public abstract static class ConstructListNode extends PBaseNode {
296297

298+
@Child private ListAppendNode appendNode;
299+
297300
public final PList execute(Object value, PythonClass valueClass) {
298301
return execute(lookupClass(PythonBuiltinClassType.PList), value, valueClass);
299302
}
@@ -311,7 +314,7 @@ public PList listString(PythonClass cls, String arg, @SuppressWarnings("unused")
311314
PList list = factory().createList(cls);
312315

313316
for (char c : chars) {
314-
list.append(Character.toString(c));
317+
getAppendNode().execute(list, Character.toString(c));
315318
}
316319

317320
return list;
@@ -337,6 +340,14 @@ public PList listObject(@SuppressWarnings("unused") Object cls, Object value, @S
337340
throw new RuntimeException("list does not support iterable object " + value);
338341
}
339342

343+
private ListAppendNode getAppendNode() {
344+
if (appendNode == null) {
345+
CompilerDirectives.transferToInterpreterAndInvalidate();
346+
appendNode = insert(ListAppendNode.create());
347+
}
348+
return appendNode;
349+
}
350+
340351
public static ConstructListNode create() {
341352
return ConstructListNodeGen.create();
342353
}

0 commit comments

Comments
 (0)