Skip to content

Commit 8715ff5

Browse files
committed
call __index__ on objects used to subscript
1 parent 029d980 commit 8715ff5

File tree

1 file changed

+28
-10
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list

1 file changed

+28
-10
lines changed

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

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,21 @@
2626
package com.oracle.graal.python.builtins.objects.list;
2727

2828
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
29-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__IADD__;
3029
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BOOL__;
3130
import static com.oracle.graal.python.nodes.SpecialMethodNames.__CONTAINS__;
3231
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELITEM__;
3332
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
3433
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETITEM__;
34+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GE__;
35+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GT__;
3536
import static com.oracle.graal.python.nodes.SpecialMethodNames.__HASH__;
37+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__IADD__;
38+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__IMUL__;
3639
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
3740
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LEN__;
38-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LT__;
39-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GT__;
4041
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LE__;
41-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GE__;
42+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__LT__;
4243
import static com.oracle.graal.python.nodes.SpecialMethodNames.__MUL__;
43-
import static com.oracle.graal.python.nodes.SpecialMethodNames.__IMUL__;
4444
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
4545
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
4646
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
@@ -51,6 +51,7 @@
5151

5252
import java.math.BigInteger;
5353
import java.util.List;
54+
import java.util.function.Supplier;
5455

5556
import com.oracle.graal.python.builtins.Builtin;
5657
import com.oracle.graal.python.builtins.CoreFunctions;
@@ -72,6 +73,7 @@
7273
import com.oracle.graal.python.nodes.builtins.ListNodes;
7374
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
7475
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
76+
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.NoAttributeHandler;
7577
import com.oracle.graal.python.nodes.control.GetIteratorNode;
7678
import com.oracle.graal.python.nodes.control.GetNextNode;
7779
import com.oracle.graal.python.nodes.expression.BinaryComparisonNode;
@@ -327,13 +329,29 @@ protected Object doPListSlice(PList self, PSlice slice) {
327329
return self.getSlice(factory(), slice);
328330
}
329331

330-
@SuppressWarnings("unused")
331-
@Fallback
332-
protected Object doGeneric(Object self, Object idx) {
333-
if (!isValidIndexType(idx)) {
332+
protected static final Supplier<NoAttributeHandler> NO_INDEX = () -> new NoAttributeHandler() {
333+
@Override
334+
public Object execute(Object receiver) {
335+
throw raise(TypeError, "list indices must be integers or slices, not %p", receiver);
336+
}
337+
};
338+
339+
@Specialization
340+
protected Object doObjectIndex(PList self, Object objectIdx,
341+
@Cached("create(__INDEX__, NO_INDEX)") LookupAndCallUnaryNode getIndexNode,
342+
@Cached("create(__GETITEM__)") LookupAndCallBinaryNode getRecursiveNode) {
343+
Object idx = getIndexNode.executeObject(objectIdx);
344+
if (isValidIndexType(idx)) {
345+
return getRecursiveNode.executeObject(self, idx);
346+
} else {
334347
throw raise(TypeError, "list indices must be integers or slices, not %p", idx);
335348
}
336-
throw raise(TypeError, "descriptor '__getitem__' requires a 'list' object but received a '%p'", idx);
349+
}
350+
351+
@SuppressWarnings("unused")
352+
@Fallback
353+
protected Object doGeneric(Object self, Object objectIdx) {
354+
throw raise(TypeError, "descriptor '__getitem__' requires a 'list' object but received a '%p'", self);
337355
}
338356

339357
protected boolean isValidIndexType(Object idx) {

0 commit comments

Comments
 (0)