|
26 | 26 | package com.oracle.graal.python.builtins.objects.list;
|
27 | 27 |
|
28 | 28 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
|
29 |
| -import static com.oracle.graal.python.nodes.SpecialMethodNames.__IADD__; |
30 | 29 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__BOOL__;
|
31 | 30 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__CONTAINS__;
|
32 | 31 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELITEM__;
|
33 | 32 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
|
34 | 33 | 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__; |
35 | 36 | 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__; |
36 | 39 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
|
37 | 40 | 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__; |
40 | 41 | 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__; |
42 | 43 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__MUL__;
|
43 |
| -import static com.oracle.graal.python.nodes.SpecialMethodNames.__IMUL__; |
44 | 44 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
|
45 | 45 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
|
46 | 46 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
|
|
51 | 51 |
|
52 | 52 | import java.math.BigInteger;
|
53 | 53 | import java.util.List;
|
| 54 | +import java.util.function.Supplier; |
54 | 55 |
|
55 | 56 | import com.oracle.graal.python.builtins.Builtin;
|
56 | 57 | import com.oracle.graal.python.builtins.CoreFunctions;
|
|
72 | 73 | import com.oracle.graal.python.nodes.builtins.ListNodes;
|
73 | 74 | import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
|
74 | 75 | import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
|
| 76 | +import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.NoAttributeHandler; |
75 | 77 | import com.oracle.graal.python.nodes.control.GetIteratorNode;
|
76 | 78 | import com.oracle.graal.python.nodes.control.GetNextNode;
|
77 | 79 | import com.oracle.graal.python.nodes.expression.BinaryComparisonNode;
|
@@ -327,13 +329,29 @@ protected Object doPListSlice(PList self, PSlice slice) {
|
327 | 329 | return self.getSlice(factory(), slice);
|
328 | 330 | }
|
329 | 331 |
|
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 { |
334 | 347 | throw raise(TypeError, "list indices must be integers or slices, not %p", idx);
|
335 | 348 | }
|
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); |
337 | 355 | }
|
338 | 356 |
|
339 | 357 | protected boolean isValidIndexType(Object idx) {
|
|
0 commit comments