Skip to content

Commit 16152ac

Browse files
committed
fix tuple.__getitem__ to be closer to the cpython implementation
1 parent 7118f9e commit 16152ac

File tree

1 file changed

+17
-8
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple

1 file changed

+17
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@
7878
import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
7979
import com.oracle.graal.python.builtins.objects.slice.PSlice;
8080
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltinsClinicProviders.IndexNodeClinicProviderGen;
81+
import com.oracle.graal.python.lib.PyIndexCheckNode;
8182
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
8283
import com.oracle.graal.python.lib.PyObjectHashNode;
8384
import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
8485
import com.oracle.graal.python.lib.PyObjectRichCompareBool;
8586
import com.oracle.graal.python.lib.PyTupleSizeNode;
8687
import com.oracle.graal.python.nodes.ErrorMessages;
8788
import com.oracle.graal.python.nodes.PGuards;
89+
import com.oracle.graal.python.nodes.PRaiseNode;
8890
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
8991
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
9092
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
@@ -257,41 +259,48 @@ public static TruffleString repr(VirtualFrame frame, PTuple self,
257259
@GenerateNodeFactory
258260
public abstract static class GetItemNode extends PythonBinaryBuiltinNode {
259261

260-
private static final TruffleString TYPE_ERROR_MESSAGE = cat(T_TUPLE, T_SPACE, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES);
261-
262262
public abstract Object execute(VirtualFrame frame, PTuple tuple, Object index);
263263

264264
@Specialization(guards = {"index >= 0", "index < tuple.getSequenceStorage().length()"})
265-
protected Object doInBounds(PTuple tuple, int index,
265+
static Object doInBounds(PTuple tuple, int index,
266266
@Cached SequenceStorageNodes.GetItemScalarNode getItemNode) {
267267
return getItemNode.execute(tuple.getSequenceStorage(), index);
268268
}
269269

270270
@InliningCutoff
271-
@Specialization(guards = "!isPSlice(key)")
272-
Object doPTuple(VirtualFrame frame, PTuple tuple, Object key,
271+
@Specialization(guards = "indexCheck.execute(key)", limit = "1")
272+
static Object doIndex(VirtualFrame frame, PTuple tuple, Object key,
273+
@SuppressWarnings("unused") @Cached PyIndexCheckNode indexCheck,
273274
@Cached("createGetItemNode()") SequenceStorageNodes.GetItemNode getItemNode) {
274275
return getItemNode.execute(frame, tuple.getSequenceStorage(), key);
275276
}
276277

277278
@InliningCutoff
278279
@Specialization
279-
Object doPTuple(VirtualFrame frame, PTuple tuple, PSlice key,
280+
static Object doSlice(VirtualFrame frame, PTuple tuple, PSlice key,
280281
@Cached("createGetItemNode()") SequenceStorageNodes.GetItemNode getItemNode) {
281282
return getItemNode.execute(frame, tuple.getSequenceStorage(), key);
282283
}
283284

284285
@InliningCutoff
285286
@Specialization
286-
Object doNative(PythonNativeObject tuple, long key,
287+
static Object doNative(PythonNativeObject tuple, long key,
287288
@Cached PCallCapiFunction callSetItem,
288289
@Cached CExtNodes.ToSulongNode toSulongNode,
289290
@Cached CExtNodes.AsPythonObjectNode asPythonObjectNode) {
290291
return asPythonObjectNode.execute(callSetItem.call(NativeCAPISymbol.FUN_PY_TRUFFLE_TUPLE_GET_ITEM, toSulongNode.execute(tuple), key));
291292
}
292293

294+
@SuppressWarnings("unused")
295+
@InliningCutoff
296+
@Fallback
297+
static Object doError(VirtualFrame frame, Object tuple, Object key,
298+
@Cached PRaiseNode raiseNode) {
299+
throw raiseNode.raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "tuple", key);
300+
}
301+
293302
protected static SequenceStorageNodes.GetItemNode createGetItemNode() {
294-
return SequenceStorageNodes.GetItemNode.create(NormalizeIndexNode.forTuple(), TYPE_ERROR_MESSAGE, (s, f) -> f.createTuple(s));
303+
return SequenceStorageNodes.GetItemNode.create(NormalizeIndexNode.forTuple(), (s, f) -> f.createTuple(s));
295304
}
296305
}
297306

0 commit comments

Comments
 (0)