|
40 | 40 | */
|
41 | 41 | package com.oracle.graal.python.builtins.objects.common;
|
42 | 42 |
|
| 43 | +import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A; |
| 44 | +import static com.oracle.graal.python.nodes.ErrorMessages.OBJ_DOES_NOT_SUPPORT_INDEXING; |
| 45 | +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; |
| 46 | + |
| 47 | +import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; |
43 | 48 | import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
|
| 49 | +import com.oracle.graal.python.builtins.objects.range.PRange; |
| 50 | +import com.oracle.graal.python.builtins.objects.set.PFrozenSet; |
| 51 | +import com.oracle.graal.python.builtins.objects.set.PSet; |
44 | 52 | import com.oracle.graal.python.builtins.objects.str.PString;
|
45 | 53 | import com.oracle.graal.python.nodes.PGuards;
|
| 54 | +import com.oracle.graal.python.nodes.PNodeWithRaise; |
46 | 55 | import com.oracle.graal.python.runtime.sequence.PSequence;
|
47 | 56 | import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
|
48 | 57 | import com.oracle.truffle.api.CompilerDirectives;
|
49 | 58 | import com.oracle.truffle.api.dsl.Cached;
|
| 59 | +import com.oracle.truffle.api.dsl.Fallback; |
50 | 60 | import com.oracle.truffle.api.dsl.GenerateUncached;
|
51 | 61 | import com.oracle.truffle.api.dsl.ImportStatic;
|
52 | 62 | import com.oracle.truffle.api.dsl.Specialization;
|
@@ -144,4 +154,51 @@ static void doGeneric(PSequence s, SequenceStorage storage) {
|
144 | 154 | s.setSequenceStorage(storage);
|
145 | 155 | }
|
146 | 156 | }
|
| 157 | + |
| 158 | + /* |
| 159 | + * The current implementation of PythonObjectLibrary.isSequences consider any object that has |
| 160 | + * __LEN__ and __GETITEM__ method a sequence which unintendedly includes dict. The CPython way |
| 161 | + * of checking sequences is by checking if the tp_as_sequence is set within the type spec. |
| 162 | + * |
| 163 | + * @see cpython/Objects/abstract.c:PySequence_GetItem |
| 164 | + */ |
| 165 | + public abstract static class CheckIsSequenceNode extends PNodeWithRaise { |
| 166 | + |
| 167 | + @Child private PythonObjectLibrary lib = PythonObjectLibrary.getFactory().createDispatched(2); |
| 168 | + |
| 169 | + public abstract boolean execute(Object seq); |
| 170 | + |
| 171 | + @Specialization |
| 172 | + static boolean sequence(@SuppressWarnings("unused") PSequence seq) { |
| 173 | + return true; |
| 174 | + } |
| 175 | + |
| 176 | + @Specialization |
| 177 | + static boolean mem(@SuppressWarnings("unused") PMemoryView mv) { |
| 178 | + return true; |
| 179 | + } |
| 180 | + |
| 181 | + @Specialization |
| 182 | + static boolean range(@SuppressWarnings("unused") PRange range) { |
| 183 | + return true; |
| 184 | + } |
| 185 | + |
| 186 | + @Specialization |
| 187 | + static boolean set(@SuppressWarnings("unused") PSet set) { |
| 188 | + return true; |
| 189 | + } |
| 190 | + |
| 191 | + @Specialization |
| 192 | + static boolean fset(@SuppressWarnings("unused") PFrozenSet fset) { |
| 193 | + return true; |
| 194 | + } |
| 195 | + |
| 196 | + @Fallback |
| 197 | + boolean notSeqence(Object obj) { |
| 198 | + if (lib.isMapping(obj)) { |
| 199 | + throw raise(TypeError, IS_NOT_A, lib.getLazyPythonClass(obj), "sequence"); |
| 200 | + } |
| 201 | + throw raise(TypeError, OBJ_DOES_NOT_SUPPORT_INDEXING, lib.getLazyPythonClass(obj)); |
| 202 | + } |
| 203 | + } |
147 | 204 | }
|
0 commit comments