Skip to content

Commit d13090d

Browse files
committed
Check isSequence
1 parent 2a89f1b commit d13090d

File tree

1 file changed

+57
-0
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common

1 file changed

+57
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceNodes.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,23 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.common;
4242

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;
4348
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;
4452
import com.oracle.graal.python.builtins.objects.str.PString;
4553
import com.oracle.graal.python.nodes.PGuards;
54+
import com.oracle.graal.python.nodes.PNodeWithRaise;
4655
import com.oracle.graal.python.runtime.sequence.PSequence;
4756
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
4857
import com.oracle.truffle.api.CompilerDirectives;
4958
import com.oracle.truffle.api.dsl.Cached;
59+
import com.oracle.truffle.api.dsl.Fallback;
5060
import com.oracle.truffle.api.dsl.GenerateUncached;
5161
import com.oracle.truffle.api.dsl.ImportStatic;
5262
import com.oracle.truffle.api.dsl.Specialization;
@@ -144,4 +154,51 @@ static void doGeneric(PSequence s, SequenceStorage storage) {
144154
s.setSequenceStorage(storage);
145155
}
146156
}
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+
}
147204
}

0 commit comments

Comments
 (0)