Skip to content

Commit 5d3c2ad

Browse files
committed
Add specialization for slices of longs
1 parent 8063d48 commit 5d3c2ad

File tree

4 files changed

+21
-75
lines changed

4 files changed

+21
-75
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
6565
import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
6666
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
67-
import com.oracle.graal.python.builtins.objects.ints.PInt;
6867
import com.oracle.graal.python.builtins.objects.list.ListBuiltins;
6968
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListExtendNode;
7069
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListInsertNode;
@@ -93,7 +92,6 @@
9392
import com.oracle.truffle.api.dsl.Specialization;
9493
import com.oracle.truffle.api.dsl.TypeSystemReference;
9594
import com.oracle.truffle.api.frame.VirtualFrame;
96-
import com.oracle.truffle.api.profiles.BranchProfile;
9795

9896
@CoreFunctions(extendsModule = PythonCextBuiltins.PYTHON_CEXT)
9997
@GenerateNodeFactory
@@ -265,25 +263,6 @@ protected boolean isListSubtype(VirtualFrame frame, Object obj, GetClassNode get
265263
@TypeSystemReference(PythonTypes.class)
266264
@GenerateNodeFactory
267265
abstract static class PyListGetSliceNode extends PythonTernaryBuiltinNode {
268-
269-
@Specialization
270-
Object getSlice(VirtualFrame frame, PList list, long iLow, long iHigh,
271-
@Cached com.oracle.graal.python.builtins.objects.list.ListBuiltins.GetItemNode getItemNode,
272-
@Cached PySliceNew sliceNode,
273-
@Cached BranchProfile isIntRangeProfile,
274-
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
275-
try {
276-
if (PInt.isIntRange(iLow) && PInt.isIntRange(iHigh)) {
277-
isIntRangeProfile.enter();
278-
return getItemNode.execute(frame, list, sliceNode.execute((int) iLow, (int) iHigh, PNone.NONE));
279-
}
280-
return getItemNode.execute(frame, list, sliceNode.execute(iLow, iHigh, PNone.NONE));
281-
} catch (PException e) {
282-
transformExceptionToNativeNode.execute(e);
283-
return getContext().getNativeNull();
284-
}
285-
}
286-
287266
@Specialization
288267
Object getSlice(VirtualFrame frame, PList list, Object iLow, Object iHigh,
289268
@Cached com.oracle.graal.python.builtins.objects.list.ListBuiltins.GetItemNode getItemNode,
@@ -324,25 +303,6 @@ protected boolean isListSubtype(VirtualFrame frame, Object obj, GetClassNode get
324303
@GenerateNodeFactory
325304
abstract static class PyListSetSliceNode extends PythonQuaternaryBuiltinNode {
326305

327-
@Specialization
328-
static Object getSlice(VirtualFrame frame, PList list, long iLow, long iHigh, Object s,
329-
@Cached com.oracle.graal.python.builtins.objects.list.ListBuiltins.SetItemNode setItemNode,
330-
@Cached PySliceNew sliceNode,
331-
@Cached BranchProfile isIntRangeProfile,
332-
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
333-
try {
334-
if (PInt.isIntRange(iLow) && PInt.isIntRange(iHigh)) {
335-
isIntRangeProfile.enter();
336-
setItemNode.execute(frame, list, sliceNode.execute((int) iLow, (int) iHigh, PNone.NONE), s);
337-
}
338-
setItemNode.execute(frame, list, sliceNode.execute(iLow, iHigh, PNone.NONE), s);
339-
return 0;
340-
} catch (PException e) {
341-
transformExceptionToNativeNode.execute(e);
342-
return -1;
343-
}
344-
}
345-
346306
@Specialization
347307
static Object getSlice(VirtualFrame frame, PList list, Object iLow, Object iHigh, Object s,
348308
@Cached com.oracle.graal.python.builtins.objects.list.ListBuiltins.SetItemNode setItemNode,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSliceBuiltins.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
import com.oracle.graal.python.builtins.CoreFunctions;
4747
import com.oracle.graal.python.builtins.Python3Core;
4848
import com.oracle.graal.python.builtins.PythonBuiltins;
49+
import com.oracle.graal.python.builtins.objects.PNone;
4950
import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis;
50-
import com.oracle.graal.python.builtins.objects.ints.PInt;
5151
import com.oracle.graal.python.lib.PySliceNew;
5252
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5353
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
@@ -58,7 +58,6 @@
5858
import com.oracle.truffle.api.dsl.NodeFactory;
5959
import com.oracle.truffle.api.dsl.Specialization;
6060
import com.oracle.truffle.api.dsl.TypeSystemReference;
61-
import com.oracle.truffle.api.profiles.BranchProfile;
6261

6362
@CoreFunctions(extendsModule = PythonCextBuiltins.PYTHON_CEXT)
6463
@GenerateNodeFactory
@@ -79,20 +78,16 @@ public void initialize(Python3Core core) {
7978
@GenerateNodeFactory
8079
public abstract static class PySliceNewNode extends PythonTernaryBuiltinNode {
8180
@Specialization
82-
public static Object slice(long start, long stop, Object step,
83-
@Cached PySliceNew sliceNode,
84-
@Cached BranchProfile isIntRangeProfile) {
85-
if (PInt.isIntRange(start) && PInt.isIntRange(stop)) {
86-
isIntRangeProfile.enter();
87-
return sliceNode.execute((int) start, (int) stop, step);
88-
}
89-
return sliceNode.execute(start, stop, step);
90-
}
91-
92-
@Specialization(guards = {"!isInteger(start) || !isInteger(stop)"})
9381
public static Object slice(Object start, Object stop, Object step,
9482
@Cached PySliceNew sliceNode) {
95-
return sliceNode.execute(start, stop, step);
83+
return sliceNode.execute(prepare(start), prepare(stop), prepare(step));
84+
}
85+
86+
private static Object prepare(Object obj) {
87+
if (obj == PNone.NO_VALUE) {
88+
return PNone.NONE;
89+
}
90+
return obj;
9691
}
9792
}
9893

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
6565
import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
6666
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
67-
import com.oracle.graal.python.builtins.objects.ints.PInt;
6867
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6968
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.GetItemNode;
7069
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
@@ -89,7 +88,6 @@
8988
import com.oracle.truffle.api.dsl.Specialization;
9089
import com.oracle.truffle.api.dsl.TypeSystemReference;
9190
import com.oracle.truffle.api.frame.VirtualFrame;
92-
import com.oracle.truffle.api.profiles.BranchProfile;
9391

9492
@CoreFunctions(extendsModule = PythonCextBuiltins.PYTHON_CEXT)
9593
@GenerateNodeFactory
@@ -198,25 +196,6 @@ public static int size(VirtualFrame frame, Object tuple,
198196
@TypeSystemReference(PythonTypes.class)
199197
@GenerateNodeFactory
200198
abstract static class PyTupleGetSliceNode extends PythonTernaryBuiltinNode {
201-
202-
@Specialization
203-
Object getSlice(VirtualFrame frame, PTuple tuple, long iLow, long iHigh,
204-
@Cached GetItemNode getItemNode,
205-
@Cached PySliceNew sliceNode,
206-
@Cached BranchProfile isIntRangeProfile,
207-
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
208-
try {
209-
if (PInt.isIntRange(iLow) && PInt.isIntRange(iHigh)) {
210-
isIntRangeProfile.enter();
211-
return getItemNode.execute(frame, tuple, sliceNode.execute((int) iLow, (int) iHigh, PNone.NONE));
212-
}
213-
return getItemNode.execute(frame, tuple, sliceNode.execute(iLow, iHigh, PNone.NONE));
214-
} catch (PException e) {
215-
transformExceptionToNativeNode.execute(e);
216-
return getContext().getNativeNull();
217-
}
218-
}
219-
220199
@Specialization
221200
Object getSlice(VirtualFrame frame, PTuple tuple, Object iLow, Object iHigh,
222201
@Cached GetItemNode getItemNode,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySliceNew.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,21 @@
4141
package com.oracle.graal.python.lib;
4242

4343
import com.oracle.graal.python.builtins.objects.PNone;
44+
import com.oracle.graal.python.builtins.objects.ints.PInt;
4445
import com.oracle.graal.python.builtins.objects.slice.PSlice;
4546
import com.oracle.graal.python.nodes.PNodeWithContext;
4647
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4748
import com.oracle.truffle.api.dsl.Cached;
4849
import com.oracle.truffle.api.dsl.Fallback;
4950
import com.oracle.truffle.api.dsl.GenerateUncached;
51+
import com.oracle.truffle.api.dsl.ImportStatic;
5052
import com.oracle.truffle.api.dsl.Specialization;
5153

5254
/**
5355
* Creates a new slice object with given parameters. Equivalent of CPython's {@code PySlice_New}.
5456
*/
5557
@GenerateUncached
58+
@ImportStatic(PInt.class)
5659
public abstract class PySliceNew extends PNodeWithContext {
5760
public abstract PSlice execute(Object start, Object stop, Object step);
5861

@@ -82,9 +85,18 @@ static PSlice doInt(PNone start, int stop, int step,
8285
return factory.createIntSlice(0, stop, step, true, false);
8386
}
8487

88+
// This specialization is often used when called from C builtins
89+
@Specialization(guards = {"isIntRange(start)", "isIntRange(stop)"})
90+
@SuppressWarnings("unused")
91+
static PSlice doLong(long start, long stop, PNone step,
92+
@Cached.Shared("factory") @Cached PythonObjectFactory factory) {
93+
return factory.createIntSlice((int) start, (int) stop, 1, false, true);
94+
}
95+
8596
@Fallback
8697
static PSlice doGeneric(Object start, Object stop, Object step,
8798
@Cached.Shared("factory") @Cached PythonObjectFactory factory) {
99+
assert start != PNone.NO_VALUE && stop != PNone.NO_VALUE && step != PNone.NO_VALUE;
88100
return factory.createObjectSlice(start, stop, step);
89101
}
90102

0 commit comments

Comments
 (0)